From 8bb4757a59a1202d987a39e088b2dd9ba78449e5 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 25 Feb 2023 10:51:54 +0800 Subject: [PATCH 001/149] =?UTF-8?q?iconfont=20=E7=B1=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icon_font_gen/icon_font_class_parser.dart | 4 ---- .../icon_font_gen/icon_font_gen_page.dart | 20 ------------------- 2 files changed, 24 deletions(-) diff --git a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart b/lib/code_gen/icon_font_gen/icon_font_class_parser.dart index 9faa67ae..de7447f3 100644 --- a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart +++ b/lib/code_gen/icon_font_gen/icon_font_class_parser.dart @@ -62,12 +62,9 @@ class $fontFamily { String familyName = config.fontFamily; String fontAssetsDist = config.yamlAssetDist; final String filePath = path.join(config.projectPath,'pubspec.yaml'); - // final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; - File pubspecFile = File(filePath); List lines = pubspecFile.readAsLinesSync(); - RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); @@ -108,7 +105,6 @@ class $fontFamily { ]; lines.insertAll(index+1, fonts); pubspecFile.writeAsStringSync(lines.join('\n')); - return; } } diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart index e1d7ea2b..17ea4cc3 100644 --- a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart +++ b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart @@ -133,27 +133,7 @@ class _IconFontGenPageState extends State projectPath: _projectCtrl.text, srcZip: _iconFontCtrl.text, ); - parser.gen(config); - // // 将压缩包有用资源解压到目标文件 - // final archive = ZipDecoder().decodeBuffer(inputStream); - // for (var file in archive.files) { - // if (file.isFile) { - // if (file.name.endsWith('.ttf')) { - // String filePath = path.join(assetsDirPath, path.basename(file.name)); - // final outputStream = OutputFileStream(filePath); - // file.writeContent(outputStream); - // outputStream.close(); - // } - // - // if (file.name.endsWith('.json')) { - // dynamic data = file.content; - // String jsonContent = utf8.decode(data); - // - // Toast.success(context, '生成代码成功!'); - // } - // } - // } Toast.success(context, '生成代码成功!'); sp.setString(SpKey.iconFontGenConfig,json.encode(config)); From 50a63bc1e93753f687f75d793bb1958ef1c9acfe Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 25 Feb 2023 10:59:42 +0800 Subject: [PATCH 002/149] . --- lib/widget_ui/desk/widget_detail/widget_detail_bar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/widget_ui/desk/widget_detail/widget_detail_bar.dart b/lib/widget_ui/desk/widget_detail/widget_detail_bar.dart index efba9f51..c72e9187 100644 --- a/lib/widget_ui/desk/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/desk/widget_detail/widget_detail_bar.dart @@ -32,6 +32,7 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { scrolledUnderElevation: 0.5, flexibleSpace: DragToMoveAreaNoDouble( child: DiyFlexibleSpaceBar( + centerTitle: false, expandedTitleScale: 2, titleIconBuilder: (t) => WindmillWidget( rotate: t * 2 * pi * 2, From 85d55ef4f2068ff71a8dce7cd275e60dc75d6f64 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 14 Mar 2023 20:35:07 +0800 Subject: [PATCH 003/149] . --- README.md | 3 +++ doc/ewm/coffee.webp | Bin 0 -> 33130 bytes lib/painter_system/base/windmill.dart | 6 ++++++ .../category_panel/desk_category_page.dart | 2 +- .../widget_detail/category_end_drawer.dart | 7 ++++--- 5 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 doc/ewm/coffee.webp diff --git a/README.md b/README.md index 7fca74a3..f63caaee 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ Tools • Dart 2.19.0 • DevTools 2.20.1 ![](./doc/screens/windows-1.png) +> 开源不易,请我喝咖啡 ~ + +![](./ewm/coffee.webp) ### 一、组件的展示页面 diff --git a/doc/ewm/coffee.webp b/doc/ewm/coffee.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8ba8add432906ea8dd0bda4cc8cef4f2f948e0e GIT binary patch literal 33130 zcmbrkW0WVsv-jEdv~AnAr)_iEw#{kVwr$(CZQJht?cDq9^S`@$_SNp^MP{8-dFo_E zMMiuxE0iR~#0&#~fYg5rE2t@O5~}^Xo+Agz2Bv-kjR4_~7tNL~E-WM}XvSu&Lxwi7 z{gTFtfT1w_{v-V*;8az3(7OQ$`)+w*Z|KecS^U9SF6F}G`y@LXoe_8i40%Zd=m4Q# z@^5;9y^DaMPhj5~Pk(^)C*FCPA_G_eW&l8&-jm;p0N^_ZaQSoXxBV{pvkx$PP2I!+0Dk1{5dc4{0(}C2XTN9A zcff((4Z^E@RSvjM?dR_0>nq?Z_XGg=%6!L|@Adt;{?Yr|eZBqeJ@fnYK{lyv%vR(# zdC9%m-S!&;l>a<_w!d1vG2Hu|01N=#zLTHo4|*TB_kOKHO9dEx{=G4Jl7H%b7gzu^ zeD{1J{n&gL{^Y*hPW0yV0)EbWJ^cWmHNHoF0DRUn;{U%8%8kUtTUe(3k!8VnB#eO* z3CV6X32fGyWH!T3{~uxrZZ>39(Bl>!bX%nHC&zEWH&ahc|2I&im1UZ0I_=QJEG&i= zUnPHy1IM39TL@>SkXvee@IySmI7`Y$+CM9jqOMiS&%L_K&mhBtJ{r}$6I);1{)4Sk z>DRFc`q`jBP!Cm33QIFJqS@DM#Y#|#7WCZee}=i4cSKj)NPN)LN#aV&9akOt7Z zRuLDKJ~sM)yj-s#>>)@bu@hJJE+XrTqK_4#Tms=BRL8WF3st9sTC5}eFW~)+^((r+ z&lgNJgtiuO_1l#& z$t3>&ocn(|#5-tFU^cil*Ej&D`@NnQ36Sz?a&n|UJXvyLJX#mb?z?IFm;5B`-k9Q_ z%h%G*j9T&@wgAr+Adnz9>kY;+6N1`eRDU)bSLFAHom92jRHg~8$K4dn{ln{-;v))! zmjY%ANHrt!$ZvVZVy9U4#F~5?OnFK!%#*o=q+%*5rT;XnCQ8wr)YlH%ad*%nUrG~_ z=du{^tw;GO#|^PgEte2n^s~mcnxl`l@-w$t+1h)JiGBO0FA$(h;>U!UBJd32Gfhk$ zTM{*clzKQS+`O^@xI@b?P4cF+UvV9-No%$a#LI5S%ko3vhL#7N`ZhAf_z8!!Y_8~K z3a6X@;~H*CfvLUP04#-q-}r5GmWI4WECE?D(MfQ%BCtxsGT6ObIkHcHH|*%gv zq9Va@?aMZDh&Cez>p=@Ks4;~myz7-zgM$E_p(rN z^j|B>lKHf~xp}G?a|bJ9`3;YOI>-|H7&i*V(lIlz&F`%wH&M3lU>~)a>a4>EVHWBt z44JrRr9ktJ5@@$_-jn&FF=X*5OZZ|*LEynm!xNom^s!n17*P!?h&2}FCqA}!_0Gc- zzd_`F(6Fwo3mkaZtB!$GG4UcDPIy3uPJqicm-sI)O-EBDJ-#?7p7Wn{1wL29CACMj zSD>hf%9hqi;=h&!b_uB{feSm8okVk+S zq#jZfZy>ry^T3*TPmo*E{^|xZd*AOlMFD~I==#PogX_gmn$Pq;vWKLX`yaZVRvQ{29JG` zJNCEuz$&s=hf?8ufjOj;t0{|$a=7BU`!&2GH!~6M*@T`3&Zv8=zQB02+cJh@G(Do+Xj{ZZL7)JP z%ce#pSt`Ps1C_IUC=yN*4hsu4^8nZ1oIBIgO2uN^?`L=Cq!ved}N2@Z&R_QnxhnXpSamB}y%~@S7)3n#f6||&Y+ef|P#&uk&WPD_Bce2_;*4&)sp?9?^vW8nRL4ih#>zey{??OiC=LOL{U3R24n0NIH$4PLL)s2N z3b!>UT%XS}FuwMeYaIp(VbIpx*|-Hd^!-Pex#3XGQd~%O*qIl`iJ5do8S;gk;;r0% z>hvIKrZi7}gKGPSbKoy5-EohAXWmhZHEc09bx2nRu>X)*3fwU#>kD(5a1b$Io|tM(fkC|g-4C;(>~ zMg5Xm>&R&HD2FmewfcNRL)0qd+*b&9rxnbV&cS_=9I6XPZmf%8iZdK&4J!Zx0*z48 zH6$I8PDsXN`i~=2-7Sbvs-6W9lx<`^mf)5;LY*1Z6Ao;Cka$v?`NWw|*B5Y2qqp;w znS;-;KjO8Tr2;K|mduwsaF{*Af9w~x(+%+A5$`_n+fRa-5$R+*D zkWZw0xzPuS9*pqq;QV*PD!~IWTWsAcPih5$vC=-`Uv?UFgoyj+@!p6phMBZ-a&KVn zs~I1iFgmspSA82d=4A~NCT-A!d*pEh-RGk6RIL5BGj30NV5&M~MEHh&`>iMv-=ip- z+raWAhWFs_44zPUSGk<<2yy2lyD|e(0yb_D{-3s2?KfR{Ri0m{{PO0n_#R-`tKxC? z1h{3faNe%(m@cJnX+FC<&sX4@(X%{G4hVzsPn;(5w-nSBmA}TYMeuThUv_9aMPpet zUtY286j8g)NgFhkchVIX@FHX?()dh7a1lj@;IS9&KEFuoGq4*+XbVVGztr_1`g$g{ z=2BU&mXqphTSGA}nOTVFdOyPThj>AhU=RMSIegQH-+YGtu3pwIutU@O7zqJ~-*S+< z0A!SUA|s8OT#My)ol0tHg7zBH|1NF4wEi$*4i(iR9UKu_QCe$R@O$C? z&Navt%-<*bOx-4Pv^D<~&%?Kv0a!*_-)Sm)j!dd|eXDHMW}EFX(3j!fzpC^g78PR| zs?Fw_EC}R7-bx(LJw}8L8p>aPNqyZVqd!%p8RmRVY&1Y;bnO4jE?(1=0h2(A!}I(9 zD>aQ(lv6OMBbWcy2@rTA`ZZ&P#0gmqKmwxY*rg;k*cF~%dmkXcNdC^EJBK4QS+x_L zHVYzF#)E^zGbj)R95wI<&ocjP)~GGV$tb|G%1%N@HMW*yIJ zNJ~#=;}qyz|Lj1eM8Dek%vF^N3$OE_KzYUn_wnZ2ix8W~z}40H0gN77<+tzMH{P$u zOV&@Z4W`OOT8fpKUM}(>a}wS(VgIv-=j8I)yvbj>seM97h#U#;I$&~6p~-o%8tzfL z&P96fT*phkQ5dh-!kN7LxtNk7Jt?RfG63)wLOz)iuj*72GYT!9It00NiI-f{M?%slj6VeV)C-r9B?VMww zd`>p6^iUKvk^gA&Fn@@+-;ofzMmtU>Eav@>=nRinRg(Kt!}ZTS|BHY3TdD$0Yuf&| z!vEKMwrm&b^oNh($koR9+$l+KXUlapoe{$gr@l@2R7(v|@=wxZ{YUVmQO-wf?donB z%d6x5n>l%02C&6f+spR9XZ*`0q{xcRziz?(0||9yYd3rnY}(kOox{=M$S+o;a6>*X zM3E#d6-2A|iF!e^pVY<2%RdN6fGzk3?vXZ**ZB)GF`_g$`aIWKOjOjpG;(8q=s9-& zTT1VqI(H*r5Yn>oh>%j_pZk&?Z?I#@OwAU?|H&4^=Ue{xqpAwxf~NxQJoSiO>=5hl zNgo84pBjR9z6syqVaBEE3>OU-&GV3&ESM_I2CC(Z_)7vJth<}PIM-Zr4%aB(%>!2| zQAazwH?cW3l!Gm>X>*sL#~YW<>+ssO8D?JX$;ayUet|5G-P=apsE-W4qaO?84se-J zqt@Di>?izG3_#9Xp`4fJntRlg5s&<4&J-vP2-KkWX8@C-pSDkSyyuQxyM?2F*N7n} zQvzF6;4YHiB)bP{a=FlpNBnNyGPb>_D6a)|v0pq8P>)H8L?0xYR)Etx>8hx9E_R~g zgQ^~vUYzl*UKJrAMR?Vm%n?=mTZJo;{m<|=ssBFf7-*Xt+Bpnm^pV+S%R3`jF`d3N zIoa?zGM{Z1p4ZdM6-?#X+QzWDfiQ)edS_=;_beTPMlr_ zX(%i9|J`Jh|8&R^j{R`!pz|;As{TJw)V=q$t$5J6+Hgi9IUe|b8KEHEd(3WiT->du z+;rF`g}jlElzx|%^=%a;OU>8%-wWnHjVln)55S)g=pSfa)TPh)(u?<;bU09D4Lxbd zH+Ov5h5Znp$o_E70VtzKiC)6q7}C?mE@K3L9Uz2sZv|&@uYFv&aIjR^8j%snmiaQ# z1Kp!A_icH^aAlCGz#Icf7x!&T5meRzPgo;z;fwnepRpW58nh1)REg=D9o$pI&#@SH zb)!aQ?J33wr`ItGa^756HtM|449xq}H>Xhl_H}~9=FtyAQ&OM2vALBrTj{goXrn9? zI}ZJDg^{i@*lCx6&z_>Bz;v1_r;@###c2J|mielSkq%o@6TZMg5CYAjI>)0FhakSh zeU*z}Ngy{Tn6n)kr@j+eAqk3gnCzMdsEs=ge4N>+T=Qa6zzIVy3Onu5nrDo|^6tyO zk^09_6zP&IknQ!#pSOQ9D*7ugOIe*)%zUz|BSVzVrdMrKPn89NMJI!&c5ax$VyxU* zj#KgtwDoR#s6VVj8Ki?|1O_OOWbJTzGGeH>!)kJeN3stGjepk6K`e%j2t(c$b>XSq zZ4X4U&m;@@Wi4?&et1AGCZU+Snqm%T4CCimbCFm$tv!F>=0Z)k`(5mq1J4NT55ldGSQNtj*}4 z#PJ{zaC!BEe+zZ%3UekRZu2}42=9th{r-BohUnq{en2+yI5vm#(B6#P$kWoX+`}s{ z_^MI9!1l=1Xq}J_s=+kS-pa8uO%~5O@NyQnPC+T5LRCKDwt{yK7;usPy!z_G8~Gs6 zNrLQkr4@%*2y}vHKS7rvk6Y z>#=)U=P-`zIp%;;g52q}ieu59&K7>*5@u@)&yde|gF4rFT}1fViUFULPPtt_xZ5o^ zT$VqjjG92$5G`g~u{P0gTzxlN-7~+|*g$D)2j9__w63i!vLf2334-*ocLd;;a9h8qel;qP^b(YA<7##KlS#gt+Qp@4$0^a~@A7p9j@qFh4 z^h}FOl%XdZ5$No*3ZC-t!b)3k*!$~rCbi0ZUHU$*=8g0U2;&At{vddxH6RJ4c8Js9 z%|j;bc|t&@00}1QP-{t6IxQZ$jOOEhCcRgZ?uX=abJXtzDeF{Nj+z+Sumg){`2 z4*5yi#JXwq3(4iwi_|=)DED|pvVM4rk>stc{-Q3doag|bn7U�^!^~DH!Ksn>WGU z`iN;=gJSQsa}mt`ei+_KYNA+8TBibZxf?|2Rsmrx)j8e>1RT@3ahZua)?_*+8As11 zGQl>Lw=qZv{Cen(3{xC!{e|R#9*W2$TFv_ScACJ@oN!fkV--g?V&5#agD5piF5&cG zs2s;STRQN4U&8FO$%B(nfbYdpn;N*1>AqDw&#DO-?ap3?*~C%ZDKX@8vT#sp^JH=P zNG6f4r9Ndw0rSl-#>NevExJQ73BGMR6E^bd4*G;{aQ0gdF>I%N8XoK8)P z$WqJ8)zm~?(4x`pw!lTBOQWgHy)VFb&&$Zto6@y7p~j&NOm>GLvo8)DyJiyjQVe=W z{wq(;ubNn9kA=_BYbx_Kel?sAk^P&=YIwG$?;>Fq?2Oi)GT~g=Vj?ybomoMYz!D27 z+6LXee-<*T?V7;ra|MMN2ikPSYs4FQ=)Rss{g^sQ&k(YXK!PLB4uFQLGtkz?g@tmM zVs~cgQw`w#PYXOFm&}vn&EMl;72qXOEfMz4yBw&M-#|CiInOA0DMqjyp=dBeL~UE_ z6iT(Ss0*E42NQnYZbCc@VTq^X4^uloZp*^QI}yb?KIY_{9)^^=4##`g3eM!I=9Nw< z(e$CebysLi)l0_iKxd(H%%GKz?X*PXvim%T7BWpH$zCTwZyM8@MX`f6xyJLlAXOI5 z8Q}u(PKtEXU|Sq7txE#pH+C}t!1er(idLoZc(flIG_OTMNlJQ{{V9-V1TA|?LbbgN?-dH|5GaO{AHeoU z+N;YwY8Qo(*P_{3T!zV`+f5b@l z;$WW1y1;~<7&}hI?+cR9l3)<&46D5I-d8Tj9pD|aXvMDu!z|wdmGw6ub3@o-76*%h zzy;y3s7|!dxYTm1>Tn$)E15-G=$;wxoG{(fdyZ09gh%)2P(*o22uRVcbM-iG_nbuwMR#C`YwUjyI*~DP=*LW0j+6fY=CvR9T#$W7(i#IW z*}-+rrqI6v8IcS!5V<#jJy@K|tp;tF5D8jUGtio(cppeGW0>hHZcQ-ai=pbEGAuXa zL6;1*svV@^8SI(@8U$JHk^A(P3%u}#FQ@X<)5iLPyNr|F|45u~+G!0sD^qPwOYaO* zq&tx|e3si7IrD!R(pBu)X|th4CI*b?QbFQ9u4?1z^x0c(=Xcnz_MEOj7RPx5sx`*( z+efTNk>o8R7CH#MzMPTLm0N&%*<>rLN}Tqn)FlPF-2;mSO{es!Pv)_FOE$N5nce{wN91j zJ-C}Dn2|jhx4r-qbz_~Qq#_@R9GA}eM`arD<_Lc|CC7Ds>m-%kvmF_#s<2RZ-4e}A z$l#`|KkHT5q6Cn?4-$0a9 zfkXm(PL|oPIr1B6!!l2kDa6^q! z33sBZTN4A%$$O8yCe!HD7@C%#jXo>UXOLNAh#&k!Fa?FvLk!P=f9JYYHDF`RZgn)l z6fA0N;7_Tq=E1Nx1b>$#4YkwS)hozFvGTL8Y(kix$sDYePE+` zZ{vsrd=|D$SM(?rFdLq$?O5!*SvnXZ>lPww_5Vp5)*zCd&O(gk#?fOl`!37S5hlBy zX^>eCi0;Y>*F;D=pW;&z*CoNkbMB&vsR|Yc73_|#m`aRf-y+dcB_gI_qJu6Wt$c4T zP)f~cT4Z^qus4q?NobOzoM(el{>2M~kwlVaKrJR`TvbUsWq)X!kM9WeJsx{+BrzvO zCW8713J6Nv69b$BsXOir$S<+J5j`&b4mzi%*G;tbL%*Ra!2A3aehfkYx9>XtC{bv3 zhApaF-i3(w15toSF0ccAgHC(B{@k{GmC<0n3v9?|8gRwQqF9D?D5@jOlfTzj)a>Q~ zzZQj~6EFZ1dqA|jzRtM%E`|C+N7}A-kBOfStPs zo5=kK=kTyd>v}_jL5_Yp`dr{$P>&a+U>Ey{B9?sB8X?Q;q9^1=$N_SaPGn($+6Pwq z%9x$7Gwne@&SRuMz~AVx=s8C@khvNOs-DsuS73>?7Y5<)oYJ4wLG&1Rk+l`M?=wPI zN-i?oHS|o-yKs@BFBrql>TyFxoG17bNtw0F&0{aH2<>=1WGBP~MARg%PeG>7YmDpB z@V>gP61TzND7;$w;60P$51b0#r_mL1Veqdjt#fLmvH)crqUJR!8WesGV!bAdru!%+|1EraXn?JDZ%Ay2nrou>1Q3pcY!lZuwCfJMwF*l`lf^Jf;9fFeV-b4uA8umZF zmwCu@yQys^8z-LiSa6Qf->C-%3#O}BQze%scLz_%wP!T>*%P1jyX%eupkWK? zg?wZzc)JebdbxI&-m#;=>uoQSB0_^eekQD&h#U(8qAOn5$@iy7{Wn{Atwm~d&~LXF zrQFH0u*lyR@hd&o9wa_+z!ateJHOhf6WM_O8W^x zh<=eLRy|GCo|%Zp?5-+Dst`&!fuFqG9Rs$uv^;~|KTn^mXYR_7AZcX`;&;r%p+xkL zZn)mM9zQI*)32a`hK!w!dV3#|4{=5I522;!yBG79pPuoH0C-ymjqQ=O<|ES;o8u$%$t%_k*m zs?PgQl+4I3)NagQ+IAdrr&S14M;p(SNxiW?Pd8H2CDeF{+g>3Nx;iHilSVGUpuXjA zF>i~>p{ypM-x0}x#YfV40joH0&LF$*hA`q+B8;y^I+kxa@wHrH@RFxYdmvJp$Clr` z0^M~bX;QM$Tb8mUatHtZw%-gS4=+fEEM6?qnsX$xh2)J&kuf1hYY*_DX5$HTy3Jk&wR(qErPO@iB6fUgj{CmY0mo5Si(P`v>NSM%X!?cD_+1wpbEf) z8cR#^hy_sU-XMeu^kKt0$PwZW0|}Ka)&u;up%E%q^-tKL$ zg7ABP-*Le$ah81oDKnFRh%WfSj0-T{9KhF-m)F<9H7C<>tI8PSlIo){U}TQyvnfP} z%STl zilGZ-m)-^DDO8+g>?q7fFNWU~qM`Y^vB;jz73C&uz6@L|bCtg43ToZon{;5=o-0Ab z)F_uC@bqw8Z9>cKMw{=CCSy;=kR2J6>-aAZOolPe7x#h2y*-#~WNzqEbDCv=GN~n_ z7R>()p$r6mIoR6|_9!7(-8cJ*iuc<81U`U)HR$%b^_mvn(nC-kSd*1{)~~x+#ES0lkmpMk zFrPaxVi|h51Ztt`WRi+pJ~g|JDo>mWL?^4eNd%N{Ma+DHru%Y6iSqLrO9LAo>2l}`)8rqd?|8eOBthS+qH z6U5M&iwfw-BjG@N#%{4JJF#oy6<3Ok#2| zg;0G8zbxdZ4-O9&JaPR%RO1h&))Hp5ui$gumzgOUUp0` zcp06w`pB@R7+lm2_73L%)!|*KIABiOlRX;|eCnl?au8$ZK3Bv9^1-e&T2;`B zZs7z*4~@};YpyQUmE12ijBkHQg=yMZ(_|NLBW;?a4$50cRs6ZL?Y=_QYWPCY$W`p; zMcf$Z3fuQt{u`UdbLxVH-HvhT(RPjH_iIrsszbfL3*|*g+Lmj;YwO9O9Qf|ySD-&1 zi6XfXhW#bgHp3ieX^wqBqplQP{Rl=`7Fd?=`f(Z-^Eo$x4;qPboTA`0?QegP8MG7; z(a%E8*y6Nqgq#HcM-AsFtjPup_E3}H9u^VIf`{^)+pB$}=N3J#CPc2$nsc_7TY8bf ziB`NfI6*EKPkVig>5Pabr@y;$lTCZ4hOK4x-?|y02>lq}_@V`F?`7mMxHT{>NTcUy zKk(=tP6T@XpO?g|AI@puL4Msm-{Huc%&0=3)YT26uhg)G@do+_;vw7VdoN)y@5>)g za+C{k3RFd~pbn^n!PdSSPCKIT0oM*#!+Fw#Y@%~m%cEwGD^hW~I=rDPS3~CVt)4FC zko=}}Yp6+FdAP%b#`k7itF*~xjo~-+^fKQPg}|IeDh%u;PLhW8xx#fSCGHhqg1=xP z%=LoU)J$_#0^Sd1eHuoh3n}nq!8R7LU0!i#BCAVtG?@EWKna=`5Yn3=ixPjK;t8&M zB@IWWF)R(lpH{*zqPTn|0`TpPfr?%6An|nAmQ3P$VFnT@!jOb7LphqV?g~OU3G+Q^ zPyuw^7ts?KMdByWJSx>8O);q6?c$f_cRj93ycEuGS==HS6q<^$8EQ}+NOmA`x{7e1$|MtD^yMtS7(Gd4}6Q**?u41G(j z`&%^)_B)%`A)Qeo3=sFC0@z!e8h=I0mTGB5>4{fy6Ppt0E$5Qs2wHtlDuqRWTYj%5 zG`-IFAWRdqd{DWzHH9CZSms$N`3L0sdbjZS-2R{xQ{p^6EmM%BPt|hcsuF1i)a9)H z4H}}CekBN1%E@oh#lEzs+8Y(nu$ z3Bblg;{*=}h0)U}FuWrAVPS9~w>AJ#Dh;symELMH4kD$Ce%a#-N)v`}IxaPHMz^Oid*sGd}g1`d%+2Q(Yeqt#pnJ4xvbj+tFR<4T1Mn2H& zN*e~%^pv>u1Q^feGj4aj0s`+suV*AlBAAX;C?=^bkYST;q?B8v`uqOx%MTzhw)Mq* z`HKDijcp{uMTy!s1h@MByk*nmomj!>eI(ysU(E}xN6HM^6z&LgA5Y9c_JL{(2p3b| z2v+8d-i99U^jGf(Sl++N5Flk5;ikNJEi8J6M8YpU@lqT}fz{s774;78Rz`N;Tp8k& zJ>IrYKvXj=vFk+{yx7;ORl)KeRunyM!l|G|>EBGlrix(czSCahL;jDSG9?3Aa-$2V zJt_bY&9D6(O407KKtE(zZs`Q=;=tM&XZh+HxMFa`8}&OQhq%+a`8selxbo)UiXY7W zJbjQ~Y_Y|@D8F_q)%Tf~;~I`kTgkPp?sWZ2Jw<;}LC)T`_jmJD>(`!Q7c|0Rc=E}&i8&5$+-|D$AP*0Jr}O+Ql?I@Dw~@D`yW%iG+u zhU=0f)03r}pUd}@@Mrgwu)Olo{YdPfyLwCBpt6?hSN2Z;|5~MrsD)XY6;D6^>A0l+ zkwqCV)QdQUpUFkG-uE%tXq_v|w&vE92Q96Y(F&{sw(Td9rb3PLD3CirQgak*vR&%E zb;YN!=BSuPKqB$>_JX5Zigd4d4DLFeQq>H8rR4D+fu8~TJvcm1Ck70i4KPshho>Kb zcB970Ur79hP5?MNgp9Y6khS~Xrkk}sXArruTtg~|RP<46(1ZhW1WNLur1fD**)!9o zc`O|O5^rEt&Gb|8t9J;`1+T$^_86CFz3Pe|RA}+M_jO&nK9Wb4K0$S@f(m$^)pY;Y zcbvAYmnLjzZ=iZVK1EH^r(`u+QsXrJ*i{cS5-$$yHR3y-J%*s1xDD7Vp(GBPzl9kJ zenTaTE+(iBdR}jl`mM)pdnk}RvM!RQi6vbNwf0p-5}w8<;k==J4nqimk_@^$k7xqv z7!*&&n+x1Ug`o{dKL>ta63uaB@P|BlIq9&Hco%pW76jYF8};TNwC3w23YIkiI1NiO zdCVI^m;qk2>^oOcPAn)JLlbca!7b{W){Ln_%ohpJ#nJY6U;2QHbxf)4J1d7_@Hy&z zNRJJ@soCkJKU;d~M@kAC_p+ncFC9+2sujU^wPw`Rg3amfBJx;Pann0y@4akwWg9Oa zSlmC%R|6$XcJ!gkCkHXdCrb!Ma%@YBxJUgfqgcS_V-xNz5Hij^GNd|^E@G{!xlj`n zokq6pyc6!{rxB@>g`yHjZ9p9|n+Xai=3;dg+e-mLQJB{%_wawftI(zwVxc#oV?qSz zq>C-6w^cInok&1IBsRVgY|W49=*44A7eXRlGm%?rW^X#};uZj#vAH zFUa+RRmKw8z;oC?wFY)utm|O%5n%|N0d#-R$lCS0utgzb$?7>cBE&8te()BLfKj7) z-Ss{L3_~w)eR;njn7!uZBI-XxNV@4MGW||sFkXk5pr8J5M~71`gX^aYi&-2;qgnS=-m>-#2f`0JoWxQhBOvV{>98r+^|ZY|xY9)7!z# zb`CxzIO~K-BoZw(zt!Q7=NO>nxEFTm#jzMl@YEa@0vPq-jE=GqfxYraeD_VzWOzeC zBJ7rQJ7e{ITW+jXAF=&i-JT{LTg2NTgGMX#A)`pqmKg#Osuu%OsyShBSHFow0#fu4 zy;J#Cvxhxa)r2kOof~tziOY!y-pP4ywtF{bh8X#(WQ_>wA+DN7Dd&VeYj6_VW&)@X z$o>w`r3xn#R25~t5i+LW?n~KAj7YA;bj)b`AXxNKp z&(a}9Vz90ABZW1`5P!60Loz-bJ0MX3@GqI(I{Fq8p0hiF?Y4et6c8ATb-Dc1JfN$w3Dn~oEN^O zo@>b*Is2uDszhKR#8LQ?K|%<%=l;g06y^Nf8kqG0 z0^(ytP03yxT0t>XgDm>J%boK0RK-ze*_xyUm^dys?`w>}E@8FZT zn)~Z_I0GJ}Q`;U(2fy;r&dRS7+VkDSb^o1kWCTCTWCNgjoF-^7y7kY7!(FBm5+BSb z0=x->_EQQH*y$1u<60xg2Apy#^*1inAam9c#-OR7`@&!9*$CyhCV8i|=-`ZwkFg4U5F60j+pZV4ap8 zorn;1e3_MbvEI&mvtoT#A6!8vOoa?rHcrB79;zLsMOl*=u^7<$OosfGUO(`5T?C2! z%$_XGe*Q&oN3{q1fx0$R#ixmwn@l_E(&f6MrKlkWJ|X%<@q9sr!wD$!#`?swZX!W!OC< z;jcFpf4pwCF21Shj-$EW)18Et<1l1i9{lhxs-fk}=>BF4cOuX?)iA+69U0@>dLt0& z%t7$uFZBmlvu>w+G(Pa>Mxjk1vZ5h`SxG3LlPv{j68=gGIOR)T(GWZ8euQ1Od{i9y zEp@Wz_6u1Uz=FjR`*4%Ljlz?pJKOJ~eQde1zdOzu5IjVRdrjh@x#ocrkrp+6X#Sn5 znD;Cn6wKjZhWAL7(?qF)Awf-b3QY#U=M?}rkXSaY96b9Zp=V<3+gWQ`F{THB8PkG& z&;nUkoRpzO8iX~4++h@eo2TTeiRl;F#~-N$k+1x1pxhKUFL{{)%A@by6?JapuV zX}Pg7Pu2B-KwES+F(}b$Yf{UF5tcxerP!~tKJ`P3Da7-P<6W^?ZU4XoDA1?-5Kkza zsA|iKSohEDc005fq|lu{0(&H4Ka^7DyS42^15;O2IXIPBGIR^1P&+iSkJ&Hh2j9yFI(1+@RB0-MmrSG-FK&kjjxWC+VC6@S% zQPj<)V~F^M9PBIe($xT2>Fzoj^~ofTBP9XzTKq}*Wg|Y95vwTI^DpJ61==wieR{-g zzHvd07Cv9(_kLzU8x>sl`;eV_NgdQ`yMG$Os=UdzG84MOMD*05QTI$W$rmo`8Y_ov zr6{m=4fTkh*7-!^Wt0M%j{Has3yVHpwg8)-@l{lRy{dm3eglOR28zOVVLc{qbvcdM zd>6;9amCgf?LaOsRmIOCpkKpVtmKYe@oIp~N>&C2X>^$=`0D6V?FM~)H%mtEGad^~ zRe&loyW~`{C#nv+1nd%r?}bA?cBbZm{h7gSLORysWETzue=J1e_&W5Zm5-5hc|SaU;8I9Rtg0b4WiAiG_`?h_Mrer z?#TRY(%h$%3+zc2wvKYhv6OF;m9=p{qZosXef}wV-7soHz?(dDv;{YT4mcPY;>YPn zRGhDN$G+*osL+BOO&>p770R+v_u0!MJC+q4{7~cY3>-FGqcF)}cW#h!J#IjN(Da5} z?rHDlRHV3Sg$$Y#snd74s`Nf8c{F}$087~|$4o)gC_FQ6kO>4?$C$EkAQz}j!J5℘xlJ+Q92^`wtOF}q$Qz`k855L_e( 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 literal 0 HcmV?d00001 diff --git a/lib/painter_system/base/windmill.dart b/lib/painter_system/base/windmill.dart index 0bbd456b..75de225f 100644 --- a/lib/painter_system/base/windmill.dart +++ b/lib/painter_system/base/windmill.dart @@ -25,6 +25,12 @@ class _WindmillWidgetState extends State super.initState(); } + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return GestureDetector( diff --git a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart b/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart index 38ddb395..089927d9 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart +++ b/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart @@ -31,7 +31,7 @@ class _DeskCategoryPageState extends State { children: [ DeskTabTopBar(onTabPressed: (int value) { _ctrl.jumpToPage(value); - }, tabs: ['收藏记录','珍藏组件', + }, tabs: ['组件酒肆','珍藏组件', // '添加收藏集' ],), Expanded(child: PageView( diff --git a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart b/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart index 59cdaafc..e3352110 100644 --- a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart +++ b/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart @@ -103,10 +103,11 @@ class _CategoryInfoState extends State { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), + padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Wrap( alignment: WrapAlignment.spaceBetween, spacing: 4, + runSpacing: 8, children: categories.map((e) => _buildItem(e)).toList(), ), ); @@ -119,9 +120,9 @@ class _CategoryInfoState extends State { selectedColor: Colors.orange.withAlpha(120), shadowColor: Theme.of(context).primaryColor, elevation: 1, - labelPadding: const EdgeInsets.only(right: 4,left: 4), + // labelPadding: const EdgeInsets.only(right: 4,left: 4), avatar: Circle( - radius: 13, + radius: 10, color: category.color, ), selected: inHere, From 89e5c73a28e982158324905ebc9912a74c142633 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 14 Mar 2023 20:36:05 +0800 Subject: [PATCH 004/149] . --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f63caaee..9e21dc5e 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Tools • Dart 2.19.0 • DevTools 2.20.1 > 开源不易,请我喝咖啡 ~ -![](./ewm/coffee.webp) +![](./doc/ewm/coffee.webp) ### 一、组件的展示页面 From 9e1731133f612b77cc14f8a9e76ef4bf21167b6c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 4 Apr 2023 10:04:49 +0800 Subject: [PATCH 005/149] add_star_history --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9e21dc5e..acddc2bd 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,11 @@ Tools • Dart 2.19.0 • DevTools 2.20.1 ![](./doc/ewm/coffee.webp) + +#### Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=toly1994328/FlutterUnit&type=Date)](https://star-history.com/#toly1994328/FlutterUnit&Date) + ### 一、组件的展示页面 #### 1. `300+组件收录` From acfdd06f672a7108b1e4d190fd0bde736253c208 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 5 Apr 2023 14:09:39 +0800 Subject: [PATCH 006/149] =?UTF-8?q?=E5=AF=BC=E8=88=AA=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desk_ui/unit_desk_navigation.dart | 8 - .../desk_ui/unit_rail_navigation.dart | 256 +++++++++--------- .../window/windows_adapter.dart | 4 +- pubspec.lock | 2 +- 4 files changed, 127 insertions(+), 143 deletions(-) diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart index 0b9b82c3..0770d45d 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_desk_navigation.dart @@ -1,19 +1,11 @@ import 'package:app_config/app_config.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; -import 'package:flutter_unit/app/views/unit_todo/layout_unit_page.dart'; -import 'package:flutter_unit/app/views/unit_todo/point_unit_page.dart'; -import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter_unit/code_gen/code_gen_page.dart'; import 'package:flutter_unit/painter_system/gallery_unit.dart'; import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/widget_panel.dart'; import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; -import 'package:url_launcher/url_launcher.dart'; - import '../../../point_system/views/desk_ui/desk_point_page.dart'; import '../home_drawer.dart'; import 'unit_rail_navigation.dart'; diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/app/navigation/desk_ui/unit_rail_navigation.dart index ca4dc363..bfe495cc 100644 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_rail_navigation.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; import 'package:url_launcher/url_launcher.dart'; -class UnitRailNavigation extends StatelessWidget { +class UnitRailNavigation extends StatefulWidget { final ValueChanged onItemClick; final int selectedIndex; final Map itemData; @@ -16,12 +16,76 @@ class UnitRailNavigation extends StatelessWidget { required this.itemData}) : super(key: key); - List get info => itemData.keys.toList(); - List get icons => itemData.values.toList(); + @override + State createState() => _UnitRailNavigationState(); +} + +class _UnitRailNavigationState extends State + with TickerProviderStateMixin { + late List _destinationControllers; + late List> _destinationAnimations; + + List get info => widget.itemData.keys.toList(); + + List get icons => widget.itemData.values.toList(); + + @override + void initState() { + super.initState(); + _initControllers(); + } + + void _initControllers() { + _destinationControllers = + List.generate(widget.itemData.length, (int index) { + return AnimationController( + duration: kThemeAnimationDuration, + vsync: this, + )..addListener(_rebuild); + }); + + _destinationAnimations = _destinationControllers + .map((AnimationController controller) => controller.view) + .toList(); + _destinationControllers[widget.selectedIndex].value = 1.0; + } + + void _rebuild() { + setState(() { + // Rebuilding when any of the controllers tick, i.e. when the items are + // animating. + }); + } + + @override + void didUpdateWidget(UnitRailNavigation oldWidget) { + super.didUpdateWidget(oldWidget); + // No animated segue if the length of the items list changes. + if (widget.itemData.length != oldWidget.itemData.length) { + _resetState(); + return; + } + + if (widget.selectedIndex != oldWidget.selectedIndex) { + _destinationControllers[oldWidget.selectedIndex].reverse(); + _destinationControllers[widget.selectedIndex].forward(); + return; + } + } + + void _resetState() { + _disposeControllers(); + _initControllers(); + } + + void _disposeControllers() { + for (final AnimationController controller in _destinationControllers) { + controller.dispose(); + } + } @override Widget build(BuildContext context) { - // NavigationRail return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.only(top: 20), @@ -65,21 +129,20 @@ class UnitRailNavigation extends StatelessWidget { .asMap() .keys .map((int index) => _UnitRailMenu( - onTap: () {onItemClick.call(index);}, - selected: selectedIndex == index, + animation: _destinationControllers[index], + onTap: () { + widget.onItemClick.call(index); + }, + selected: widget.selectedIndex == index, width: 120, - height: 35, activeColor: Theme.of(context).primaryColor, inactiveColor: - Colors.white.withAlpha(33), icon: icons[index],label: info[index], + height: 35, + activeColor: Theme.of(context).primaryColor, + inactiveColor: Colors.white.withAlpha(33), + icon: icons[index], + label: info[index], )) .toList(), - ) - - // RightNavBar( - // itemData: Cons.iconMap, - // onItemClick: onItemClick, - // color: Theme.of(context).primaryColor, - // ), - ), + )), ), Expanded( child: Container(), @@ -152,91 +215,6 @@ class UnitRailNavigation extends StatelessWidget { } } -class RightNavBar extends StatefulWidget { - final Color color; - final Map itemData; - final ValueChanged onItemClick; - final Size itemSize; - - RightNavBar({ - this.color = Colors.blue, - required this.itemData, - required this.onItemClick, - this.itemSize = const Size(120, 35), - }); - - @override - _RightNavBarState createState() => _RightNavBarState(); -} - -class _RightNavBarState extends State { - int _position = 0; - - List get info => widget.itemData.keys.toList(); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: info - .map((e) => _buildChild(context, info.indexOf(e), widget.color)) - .toList(), - ); - } - - Widget _buildChild(BuildContext context, int i, Color color) { - var active = i == _position; - - return GestureDetector( - onTap: () => _tapTab(i), - child: Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - width: widget.itemSize.width, - child: UnconstrainedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - color: active ? widget.color : Colors.white.withAlpha(33), - borderRadius: const BorderRadius.only( - topRight: Radius.circular(20), - bottomRight: Radius.circular(20))), - width: active - ? widget.itemSize.width * 0.95 - : widget.itemSize.width * 0.85, - height: widget.itemSize.height, - child: Wrap( - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - widget.itemData[info[i]], - size: active ? 24 : 20, - color: active ? Colors.white : Colors.white70, - ), - Text( - info[i], - style: TextStyle( - color: active ? Colors.white : Colors.white70, - ), - ), - ], - ), - ), - ), - )); - } - - _tapTab(int i) { - setState(() { - _position = i; - if (widget.onItemClick != null) { - widget.onItemClick(_position); - } - }); - } -} - class _UnitRailMenu extends StatelessWidget { final VoidCallback onTap; final bool selected; @@ -246,8 +224,9 @@ class _UnitRailMenu extends StatelessWidget { final double height; final IconData icon; final String label; + final Animation animation; - const _UnitRailMenu({ + _UnitRailMenu({ Key? key, required this.onTap, required this.selected, @@ -255,6 +234,7 @@ class _UnitRailMenu extends StatelessWidget { required this.activeColor, required this.inactiveColor, required this.height, + required this.animation, required this.icon, required this.label, }) : super(key: key); @@ -266,37 +246,49 @@ class _UnitRailMenu extends StatelessWidget { child: Container( alignment: Alignment.topLeft, margin: const EdgeInsets.only(top: 10), - width: width, - child: UnconstrainedBox( - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - color: selected ? activeColor : inactiveColor, - borderRadius: const BorderRadius.only( - topRight: Radius.circular(20), - bottomRight: Radius.circular(20))), - width: selected ? width * 0.95 : width * 0.85, - height: height, - child: Wrap( - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - icon, - size: selected ? 24 : 20, - color: selected ? Colors.white : Colors.white70, - ), - Text( - label, - style: TextStyle( - fontSize: 12, - color: selected ? Colors.white : Colors.white70, - ), - ), - ], - ), - ), + child: AnimatedBuilder( + animation: animation, + builder: (BuildContext context, Widget? child) => _buildItem(), ), )); } + + late ColorTween colorTween = ColorTween(begin: inactiveColor, end: activeColor); + + + Widget _buildItem() { + double iconSize = _sizeTween.transform(animation.value); + Color? color = colorTween.transform(animation.value); + return Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.only( + topRight: Radius.circular(height / 2), + bottomRight: Radius.circular(height / 2))), + width: _widthTween.transform(animation.value) * width, + height: height, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + icon, + size: iconSize, + color: selected ? Colors.white : Colors.white70, + ), + Text( + label, + style: TextStyle( + fontSize: 12, + color: selected ? Colors.white : Colors.white70, + ), + ), + ], + ), + ); + } } + +final Tween _widthTween = Tween(begin: 0.82, end: 0.95); +final Tween _sizeTween = Tween(begin: 18.0, end: 20.0); diff --git a/lib/app/plateform_adapter/window/windows_adapter.dart b/lib/app/plateform_adapter/window/windows_adapter.dart index 59e8a27e..b6dca59a 100644 --- a/lib/app/plateform_adapter/window/windows_adapter.dart +++ b/lib/app/plateform_adapter/window/windows_adapter.dart @@ -10,8 +10,8 @@ class WindowsAdapter { //仅对桌面端进行尺寸设置 await windowManager.ensureInitialized(); WindowOptions windowOptions = const WindowOptions( - size: Size(900,600), - minimumSize: Size(900,600), + size: Size(900,680), + minimumSize: Size(900,680), center: true, backgroundColor: Colors.transparent, skipTaskbar: false, diff --git a/pubspec.lock b/pubspec.lock index fda2f9b7..37c2e6e5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -945,5 +945,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=2.19.0-0 <=3.0.0" + dart: ">=2.19.0-0 <3.0.0" flutter: ">=3.7.0-0" From 6cdf29df366336cf7b3ed75d50d4ba69f65c2ff5 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 17 Apr 2023 17:13:15 +0800 Subject: [PATCH 007/149] =?UTF-8?q?iconfont=20=E7=B1=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 36ad4901..9213b335 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ *.ipr *.iws .idea/ - +/lib/temp # 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. From eefca8378517ecdfe7d93b764fadb2ff983bf713 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 25 Apr 2023 20:29:28 +0800 Subject: [PATCH 008/149] =?UTF-8?q?=E6=9B=B4=E6=96=B0flutter=E7=89=88?= =?UTF-8?q?=E6=9C=AC3.7.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index acddc2bd..3b87cc60 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,10 @@ > 当前Flutter 版本 ``` -Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision b06b8b2710 (10 days ago) • 2023-01-23 16:55:55 -0800 -Engine • revision b24591ed32 -Tools • Dart 2.19.0 • DevTools 2.20.1 +Flutter 3.7.12 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 4d9e56e694 (7 days ago) • 2023-04-17 21:47:46 -0400 +Engine • revision 1a65d409c7 +Tools • Dart 2.19.6 • DevTools 2.20.1 ``` --- From 8dfad2a9e29abe29f085be6272f3868fd2d3dc4c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 16 May 2023 18:34:31 +0800 Subject: [PATCH 009/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/fonts/BalooBhai2-Regular.ttf | Bin 0 -> 698016 bytes assets/fonts/CHOPS.TTF | Bin 0 -> 37552 bytes assets/fonts/ComicNeue-Regular.ttf | Bin 0 -> 54808 bytes assets/fonts/Inconsolata-Regular.ttf | Bin 0 -> 92600 bytes assets/fonts/IndieFlower-Regular.ttf | Bin 0 -> 55300 bytes assets/fonts/Neucha-Regular.ttf | Bin 0 -> 115128 bytes lib/app/bloc_wrapper.dart | 4 +- lib/app/utils/convert.dart | 1 - .../views/data_manage/data_manage_page.dart | 7 +- lib/app/views/setting/font_setting.dart | 111 +++++++++++------- lib/app/views/setting/setting_page.dart | 9 +- .../views/splash/standard_unit_splash.dart | 2 +- .../desk_ui/widget_panel/desk_search_bar.dart | 2 +- .../category_page/sync/async_button.dart | 4 +- .../category_page/sync/upload_button.dart | 4 +- .../search_page/standard_search_bar.dart | 2 +- .../app_config/lib/app/cons/global_value.dart | 8 ++ .../app_config/lib/app/theme/app_theme.dart | 35 +++--- packages/app_config/lib/app_config.dart | 1 + packages/app_config/lib/bloc/global_bloc.dart | 40 ++++--- .../app_config/lib/model/global_state.dart | 37 +++++- .../lib/repository/app_state_repository.dart | 65 ++-------- packages/app_config/pubspec.yaml | 2 + .../lib/views/mobile/user/user_page.dart | 1 + packages/db_storage/lib/db_storage.dart | 13 -- .../lib/home_page/unit_bottom_bar.dart | 1 + .../lib/widget_item/home_item_support.dart | 1 - packages/{db_storage => storage}/.gitignore | 0 packages/{db_storage => storage}/.metadata | 0 packages/{db_storage => storage}/CHANGELOG.md | 0 packages/{db_storage => storage}/LICENSE | 0 packages/{db_storage => storage}/README.md | 0 .../analysis_options.yaml | 0 .../lib/src/db_storage}/bean/category_po.dart | 0 .../lib/src/db_storage}/bean/node_po.dart | 0 .../lib/src/db_storage}/bean/widget_po.dart | 0 .../lib/src/db_storage}/dao/category_dao.dart | 0 .../lib/src/db_storage}/dao/like_dao.dart | 0 .../lib/src/db_storage}/dao/node_dao.dart | 0 .../lib/src/db_storage}/dao/widget_dao.dart | 0 .../lib/src/db_storage/db_storage.dart | 10 ++ .../src/db_storage/flutter_db_storage.dart} | 12 +- .../db_storage/helper}/db_open_helper.dart | 0 .../src/sp_storage/models/app_config_po.dart | 47 ++++++++ .../storage/lib/src/sp_storage/sp_keys.dart | 3 + .../lib/src/sp_storage/sp_storage.dart | 37 ++++++ packages/storage/lib/storage.dart | 8 ++ packages/{db_storage => storage}/pubspec.yaml | 3 +- .../test/db_storage_test.dart | 1 - .../blocs/category_bloc/category_bloc.dart | 2 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 1 - packages/widget_module/pubspec.yaml | 4 +- .../lib/src/category_repository.dart | 2 +- .../src/db_impl/catagory_db_repository.dart | 7 +- .../lib/src/db_impl/node_db_repository.dart | 5 +- .../lib/src/db_impl/widget_db_repository.dart | 7 +- .../lib/src/model/category_model.dart | 2 +- .../lib/src/model/widget_model.dart | 2 +- packages/widget_repository/pubspec.yaml | 4 +- pubspec.lock | 14 +-- pubspec.yaml | 4 +- 61 files changed, 325 insertions(+), 200 deletions(-) create mode 100644 packages/app_config/lib/app/cons/global_value.dart delete mode 100644 packages/db_storage/lib/db_storage.dart rename packages/{db_storage => storage}/.gitignore (100%) rename packages/{db_storage => storage}/.metadata (100%) rename packages/{db_storage => storage}/CHANGELOG.md (100%) rename packages/{db_storage => storage}/LICENSE (100%) rename packages/{db_storage => storage}/README.md (100%) rename packages/{db_storage => storage}/analysis_options.yaml (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/bean/category_po.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/bean/node_po.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/bean/widget_po.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/dao/category_dao.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/dao/like_dao.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/dao/node_dao.dart (100%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage}/dao/widget_dao.dart (100%) create mode 100644 packages/storage/lib/src/db_storage/db_storage.dart rename packages/{db_storage/lib/src/local_db.dart => storage/lib/src/db_storage/flutter_db_storage.dart} (88%) rename packages/{db_storage/lib/src => storage/lib/src/db_storage/helper}/db_open_helper.dart (100%) create mode 100644 packages/storage/lib/src/sp_storage/models/app_config_po.dart create mode 100644 packages/storage/lib/src/sp_storage/sp_keys.dart create mode 100644 packages/storage/lib/src/sp_storage/sp_storage.dart create mode 100644 packages/storage/lib/storage.dart rename packages/{db_storage => storage}/pubspec.yaml (96%) rename packages/{db_storage => storage}/test/db_storage_test.dart (86%) diff --git a/assets/fonts/BalooBhai2-Regular.ttf b/assets/fonts/BalooBhai2-Regular.ttf index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..21a943098c177be0e4df22a8f0e074ec9838d2e2 100644 GIT binary patch literal 698016 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⁣#F8VI}uErX%zS#KK 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/CHOPS.TTF b/assets/fonts/CHOPS.TTF index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..137e1db1b1121635397a3e66e0902382a2b2ae9b 100644 GIT binary patch literal 37552 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Inconsolata-Regular.ttf b/assets/fonts/Inconsolata-Regular.ttf index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..18a07080f9539edcd10192ea7bd23fb81617c356 100644 GIT binary patch literal 92600 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/IndieFlower-Regular.ttf b/assets/fonts/IndieFlower-Regular.ttf index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1070aacda9489240308493094defb23ce0d1bedc 100644 GIT binary patch literal 55300 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 { @override void dispose() { categoryBloc.close(); - LocalDb.instance.closeDb(); + FlutterDbStorage.instance.closeDb(); super.dispose(); } } diff --git a/lib/app/utils/convert.dart b/lib/app/utils/convert.dart index 711d1dad..9c3c2ec9 100644 --- a/lib/app/utils/convert.dart +++ b/lib/app/utils/convert.dart @@ -1,5 +1,4 @@ -import 'package:db_storage/db_storage.dart'; import 'package:flutter_unit/painter_system/gallery_factory.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index 95662317..46b9fe09 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -2,12 +2,11 @@ import 'dart:convert'; import 'dart:io'; import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/Toast.dart'; import 'package:flutter_unit/point_system/api/category_api.dart'; import 'package:authentication/views/authentic_widget.dart'; @@ -88,7 +87,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); + List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); @@ -122,7 +121,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); + List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart index cea5e08f..327f63d7 100644 --- a/lib/app/views/setting/font_setting.dart +++ b/lib/app/views/setting/font_setting.dart @@ -4,7 +4,6 @@ import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - /// create by 张风捷特烈 on 2020-04-10 /// contact me by email 1981462002@qq.com /// 说明: @@ -27,53 +26,77 @@ class FontSettingPage extends StatelessWidget { BuildContext context, List fontFamilySupport, String fontFamily) { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), - shrinkWrap: true, crossAxisCount: 2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1.5, - children: fontFamilySupport - .map((e) => FeedbackWidget( - a: 0.95, - duration: const Duration(milliseconds: 200), - onPressed: () { - BlocProvider.of(context).switchFontFamily(e); - }, - child: Card( - child: GridTile( - header: Container( - padding: const EdgeInsets.only(left: 10, right: 5), - height: 30, - color: fontFamily == e - ? Colors.blue.withAlpha(88) - : Colors.grey.withAlpha(88), - child: Row( - children: [ - Text(e, - style: TextStyle( - color: Colors.black, - fontFamily: e, - )), - const Spacer(), - if (fontFamily == e) Circle(color: Theme.of(context).primaryColor,) - ], - ), - ), - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Colors.blueAccent.withAlpha(22), - Colors.blueAccent.withAlpha(22), - Theme.of(context).primaryColor.withAlpha(88) - ])), - alignment: const Alignment(0, 0.4), - child: Text( - '张风捷特烈\n@toly1994', - style: TextStyle(fontFamily: e, fontSize: 16), - )), - ), - ))) - .toList(), + children: fontFamilySupport.map((e) { + return FontCell( + active: fontFamily == e, + fontFamily: e, + onSelect: (font) { + BlocProvider.of(context).switchFontFamily(font); + }, + ); + }).toList(), ); } } + +class FontCell extends StatelessWidget { + final bool active; + final ValueChanged onSelect; + final String fontFamily; + + const FontCell( + {Key? key, + required this.active, + required this.onSelect, + required this.fontFamily}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return FeedbackWidget( + a: 0.95, + duration: const Duration(milliseconds: 200), + onPressed: () => onSelect(fontFamily), + child: GridTile( + header: Container( + padding: const EdgeInsets.only(left: 10, right: 5), + height: 30, + color: active + ? Colors.blue.withAlpha(88) + : Colors.grey.withAlpha(88), + child: Row( + children: [ + Text(fontFamily, + style: TextStyle( + color: Colors.black, + fontFamily: fontFamily, + )), + const Spacer(), + if (active) + Circle(color: Theme.of(context).primaryColor) + ], + ), + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + gradient: LinearGradient(colors: [ + Colors.blueAccent.withAlpha(22), + Colors.blueAccent.withAlpha(22), + Theme.of(context).primaryColor.withAlpha(88) + ])), + alignment: const Alignment(0, 0.4), + child: Text( + '张风捷特烈\n@toly1994', + style: TextStyle(fontFamily: fontFamily, fontSize: 16), + )), + )); + } +} diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index 0190342c..572ca4df 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -119,6 +119,9 @@ class SettingPage extends StatelessWidget { Widget _buildShowBg(BuildContext context) => BlocBuilder( builder: (_, state) => SwitchListTile( + inactiveTrackColor: Colors.grey.withOpacity(0.3), + // inactiveThumbColor: Colors.white, + activeColor: Theme.of(context).primaryColor, value: state.showBackGround, secondary: Icon( TolyIcon.icon_background, @@ -134,6 +137,9 @@ class SettingPage extends StatelessWidget { BlocBuilder( builder: (_, state) => SwitchListTile( value: state.showPerformanceOverlay, + inactiveTrackColor: Colors.grey.withOpacity(0.3), + // inactiveThumbColor: Colors.white, + activeColor: Theme.of(context).primaryColor, secondary: Icon( TolyIcon.icon_show, color: Theme.of(context).primaryColor, @@ -164,6 +170,5 @@ class SettingPage extends StatelessWidget { )); - Widget _nextIcon(BuildContext context) => - Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); + Widget _nextIcon(BuildContext context) => Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); } diff --git a/lib/app/views/splash/standard_unit_splash.dart b/lib/app/views/splash/standard_unit_splash.dart index 44308f8a..0b4d7841 100644 --- a/lib/app/views/splash/standard_unit_splash.dart +++ b/lib/app/views/splash/standard_unit_splash.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart index b4df155e..fcb8241c 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/widget_ui/mobile/category_page/sync/async_button.dart b/lib/widget_ui/mobile/category_page/sync/async_button.dart index e8594422..0fcc48ce 100644 --- a/lib/widget_ui/mobile/category_page/sync/async_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/async_button.dart @@ -9,7 +9,7 @@ import 'package:flutter_unit/point_system/api/category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:components/toly_ui/toly_ui.dart'; @@ -88,7 +88,7 @@ class _SyncCategoryButtonState extends State { // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); + List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/lib/widget_ui/mobile/category_page/sync/upload_button.dart b/lib/widget_ui/mobile/category_page/sync/upload_button.dart index b26fe618..5022dc07 100644 --- a/lib/widget_ui/mobile/category_page/sync/upload_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/upload_button.dart @@ -4,7 +4,7 @@ import 'package:app_config/app_config.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:flutter_unit/point_system/api/category_api.dart'; import 'package:utils/utils.dart'; @@ -75,7 +75,7 @@ class _UploadCategoryButtonState extends State { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await LocalDb.instance.likeDao.likeWidgetIds(); + List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); String json = jsonEncode(loadCategories); diff --git a/lib/widget_ui/mobile/search_page/standard_search_bar.dart b/lib/widget_ui/mobile/search_page/standard_search_bar.dart index c8685d75..31a0ee9b 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_bar.dart +++ b/lib/widget_ui/mobile/search_page/standard_search_bar.dart @@ -1,5 +1,5 @@ import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/packages/app_config/lib/app/cons/global_value.dart b/packages/app_config/lib/app/cons/global_value.dart new file mode 100644 index 00000000..c3ef5731 --- /dev/null +++ b/packages/app_config/lib/app/cons/global_value.dart @@ -0,0 +1,8 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; + +double px1 = 1/window.devicePixelRatio; + +bool isDesk = kIsWeb || Platform.isMacOS||Platform.isWindows||Platform.isLinux; \ No newline at end of file diff --git a/packages/app_config/lib/app/theme/app_theme.dart b/packages/app_config/lib/app/theme/app_theme.dart index d354ac39..fe1b5a2e 100644 --- a/packages/app_config/lib/app/theme/app_theme.dart +++ b/packages/app_config/lib/app/theme/app_theme.dart @@ -11,13 +11,8 @@ class AppTheme { primaryColor: const Color(0xff4699FB), appBarTheme: const AppBarTheme(backgroundColor: Color(0xff222222)), floatingActionButtonTheme: const FloatingActionButtonThemeData( - foregroundColor: Colors.white, - backgroundColor: Color(0xff4699FB) - ), + foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), dividerColor: Colors.white, - // switchTheme: SwitchThemeData( - // // trackColor: '', - // ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Color(0xff181818), selectedItemColor: Color(0xff4699FB)), @@ -27,21 +22,25 @@ class AppTheme { SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark - ); + statusBarIconBrightness: Brightness.dark); + + bool useMaterial3 = (Platform.isAndroid || Platform.isIOS)&&state.appStyle!=AppStyle.fancy; return ThemeData( fontFamily: state.fontFamily, - primarySwatch: state.themeColor, - useMaterial3: Platform.isAndroid, // Android 使用 Material3 - chipTheme: ChipThemeData( - padding: EdgeInsets.symmetric(horizontal: 10) - // labelPadding: EdgeInsets.symmetric(horizontal: 6,vertical: 5) - ), - appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, - - ), + primaryColor: state.themeColor, + useMaterial3: useMaterial3 , + // Android 使用 Material3 + chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10) + ), + dividerTheme: DividerThemeData( + color: const Color(0xffDEE0E2), + space: px1, + thickness: px1, + ), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + ), ); } } diff --git a/packages/app_config/lib/app_config.dart b/packages/app_config/lib/app_config.dart index 7afe3ef7..ceb479ef 100644 --- a/packages/app_config/lib/app_config.dart +++ b/packages/app_config/lib/app_config.dart @@ -5,6 +5,7 @@ export 'model/global_state.dart'; export 'model/app_style.dart'; export 'repository/app_state_repository.dart'; export 'app/cons/cons.dart'; +export 'app/cons/global_value.dart'; export 'app/cons/path_unit.dart'; export 'app/cons/sp.dart'; export 'app/cons/str_unit.dart'; diff --git a/packages/app_config/lib/bloc/global_bloc.dart b/packages/app_config/lib/bloc/global_bloc.dart index d72ad307..4dd78557 100644 --- a/packages/app_config/lib/bloc/global_bloc.dart +++ b/packages/app_config/lib/bloc/global_bloc.dart @@ -24,47 +24,55 @@ class AppBloc extends Cubit< AppState> { // 切换字体事件处理 : 固化索引 + 产出新状态 void switchFontFamily(String family) async { - storage.saveFontFamily(family); - emit(state.copyWith(fontFamily: family)); + AppState newState = state.copyWith(fontFamily: family); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } // 切换主题色事件处理 : 固化索引 + 产出新状态 void switchThemeColor(MaterialColor color) async { - storage.saveThemeColor(color); - emit(state.copyWith(themeColor: color)); + AppState newState = state.copyWith(themeColor: color); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } // 切换背景显示事件处理 : 固化数据 + 产出新状态 void switchShowBg(bool show) async { - storage.saveShowBg(show); - emit(state.copyWith(showBackGround: show)); + AppState newState = state.copyWith(showBackGround: show); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } // 切换背景显示事件处理 : 产出新状态 void switchShowOver(bool show) async { - emit(state.copyWith(showPerformanceOverlay: show)); + AppState newState = state.copyWith(showPerformanceOverlay: show); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } // 切换code样式事件处理 : 固化索引 + 产出新状态 void switchCoderTheme(int codeStyleIndex) async { - storage.saveCoderTheme(codeStyleIndex); - emit(state.copyWith(codeStyleIndex: codeStyleIndex)); + AppState newState = state.copyWith(codeStyleIndex: codeStyleIndex); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } // 切换item样式事件处理 : 固化索引 + 产出新状态 void changeItemStyle(int index) async { - storage.saveItemStyle(index); - emit(state.copyWith(itemStyleIndex: index)); + AppState newState = state.copyWith(itemStyleIndex: index); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } void changeAppStyle(AppStyle style) async{ - storage.saveChangeAppStyle(style); - emit(state.copyWith(appStyle:style)); - + AppState newState = state.copyWith(appStyle: style); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } void switchShowTool(bool show) async{ - storage.saveShowTool(show); - emit(state.copyWith(showOverlayTool: show)); + AppState newState = state.copyWith(showOverlayTool: show); + storage.sp.saveAppConfig(newState.toAppConfigPo()); + emit(newState); } } diff --git a/packages/app_config/lib/model/global_state.dart b/packages/app_config/lib/model/global_state.dart index 47bb21ef..c5859e1a 100644 --- a/packages/app_config/lib/model/global_state.dart +++ b/packages/app_config/lib/model/global_state.dart @@ -1,5 +1,7 @@ +import 'package:app_config/app/cons/cons.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; +import 'package:storage/storage.dart'; import 'app_style.dart'; @@ -45,8 +47,7 @@ class AppState extends Equatable { }); @override - List get props => - [ + List get props => [ fontFamily, themeColor, showBackGround, @@ -58,14 +59,12 @@ class AppState extends Equatable { ]; AppState copyWith({ - double? height, String? fontFamily, MaterialColor? themeColor, bool? showBackGround, int? codeStyleIndex, int? itemStyleIndex, bool? showPerformanceOverlay, - bool? initialized, bool? showOverlayTool, AppStyle? appStyle, }) => @@ -77,10 +76,36 @@ class AppState extends Equatable { showOverlayTool: showOverlayTool ?? this.showOverlayTool, itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex, appStyle: appStyle ?? this.appStyle, - showPerformanceOverlay: - showPerformanceOverlay ?? this.showPerformanceOverlay, + showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay, ); + + // 将 AppState 状态数据转换为配置对象,以便存储 + AppConfigPo toAppConfigPo() => AppConfigPo( + showBackGround : showBackGround, + showOverlayTool : showOverlayTool, + showPerformanceOverlay : showPerformanceOverlay, + fontFamilyIndex : Cons.kFontFamilySupport.indexOf(fontFamily), + themeColorIndex : Cons.kThemeColorSupport.keys.toList().indexOf(themeColor), + codeStyleIndex : codeStyleIndex, + appStyleIndex : appStyle.index, + itemStyleIndex : itemStyleIndex, + ); + + // 根据存储的配置信息对象,形成 AppState 状态数据 + factory AppState.fromPo(AppConfigPo po) { + return AppState( + fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], + themeColor: Cons.kThemeColorSupport.keys.toList()[po.themeColorIndex], + showBackGround: po.showBackGround, + codeStyleIndex: po.codeStyleIndex, + itemStyleIndex: po.itemStyleIndex, + showPerformanceOverlay: po.showPerformanceOverlay, + showOverlayTool: po.showOverlayTool, + appStyle: AppStyle.values[po.appStyleIndex], + ); + } + @override String toString() { return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; diff --git a/packages/app_config/lib/repository/app_state_repository.dart b/packages/app_config/lib/repository/app_state_repository.dart index 666be853..9b1da04f 100644 --- a/packages/app_config/lib/repository/app_state_repository.dart +++ b/packages/app_config/lib/repository/app_state_repository.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:app_config/model/global_state.dart'; import 'package:app_config/model/app_style.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -13,16 +13,20 @@ import '../app/cons/cons.dart'; import '../app/cons/sp.dart'; class AppStateRepository{ - late SharedPreferences prefs; + + + SpStorage get sp => SpStorage.instance; Future initApp() async{ - prefs = await SharedPreferences.getInstance(); DbOpenHelper.setupDatabase(); //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, "flutter.db"); - bool shouldCopy = await _checkShouldCopy(dbPath,prefs); + // 读取配置文件,初始化应用状态 + AppConfigPo po = await sp.readAppConfig(); + + bool shouldCopy = await _checkShouldCopy(dbPath,sp.spf); if (shouldCopy) { await _doCopyAssetsDb(dbPath); @@ -30,24 +34,10 @@ class AppStateRepository{ print("=====flutter.db 已存在===="); } - await LocalDb.instance.initDb(); - - bool showBg = prefs.getBool(SpKey.showBackground) ?? true; - bool showTool = prefs.getBool(SpKey.showTool) ?? true; - int themeIndex = prefs.getInt(SpKey.themeColorIndex) ?? 4; - int fontIndex = prefs.getInt(SpKey.fontFamily) ?? 1; - int codeIndex = prefs.getInt(SpKey.codeStyleIndex) ?? 0; - int itemStyleIndex = prefs.getInt(SpKey.itemStyleIndex) ?? 0; - int appStyleIndex = prefs.getInt(SpKey.appStyleIndex) ?? 0; - - return AppState( - showBackGround: showBg, - themeColor: Cons.kThemeColorSupport.keys.toList()[themeIndex], - fontFamily: Cons.kFontFamilySupport[fontIndex], - itemStyleIndex: itemStyleIndex, - appStyle: Cons.kAppStyleStringMap.keys.toList()[appStyleIndex], - showOverlayTool: showTool, - codeStyleIndex: codeIndex); + await FlutterDbStorage.instance.initDb(); + + + return AppState.fromPo(po); } Future _doCopyAssetsDb(String dbPath) async { @@ -88,35 +78,4 @@ class AppStateRepository{ return shouldCopy; } - - - Future saveFontFamily(String family) async { - int familyIndex = Cons.kFontFamilySupport.indexOf(family); - await prefs.setInt(SpKey.fontFamily, familyIndex); - } - - Future saveThemeColor(MaterialColor color) async { - int themeIndex = Cons.kThemeColorSupport.keys.toList().indexOf(color); - await prefs.setInt(SpKey.themeColorIndex, themeIndex); - } - - Future saveShowBg(bool show) async { - await prefs.setBool(SpKey.showBackground, show); - } - - Future saveCoderTheme(int index) async { - await prefs.setInt(SpKey.codeStyleIndex, index); - } - - Future saveItemStyle(int index) async { - await prefs.setInt(SpKey.itemStyleIndex, index); - } - - Future saveChangeAppStyle(AppStyle style) async { - await prefs.setInt(SpKey.appStyleIndex, style.index); - } - - Future saveShowTool(bool show) async { - await prefs.setBool(SpKey.showTool, show); - } } \ No newline at end of file diff --git a/packages/app_config/pubspec.yaml b/packages/app_config/pubspec.yaml index f97920f4..cdbcced9 100644 --- a/packages/app_config/pubspec.yaml +++ b/packages/app_config/pubspec.yaml @@ -13,6 +13,8 @@ dependencies: flutter_bloc: ^8.0.1 # 状态管理 equatable: ^2.0.3 # 相等辅助 shared_preferences: ^2.0.13 # xml 固化 + storage: + path: ../storage widget_repository: path: ../widget_repository components: diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/packages/authentication/lib/views/mobile/user/user_page.dart index a6223b4a..f2dfcc4c 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/packages/authentication/lib/views/mobile/user/user_page.dart @@ -21,6 +21,7 @@ class UserPage extends StatelessWidget { Widget build(BuildContext context) { AppStyle style = context.read().state.appStyle; return Scaffold( + backgroundColor: Colors.white, body: AnnotatedRegion( value:const SystemUiOverlayStyle( statusBarIconBrightness: Brightness.dark diff --git a/packages/db_storage/lib/db_storage.dart b/packages/db_storage/lib/db_storage.dart deleted file mode 100644 index c8507f3a..00000000 --- a/packages/db_storage/lib/db_storage.dart +++ /dev/null @@ -1,13 +0,0 @@ -library db_storage; - - -export 'src/dao/category_dao.dart'; -export 'src/dao/like_dao.dart'; -export 'src/dao/node_dao.dart'; -export 'src/dao/widget_dao.dart'; - -export 'src/bean/category_po.dart'; -export 'src/bean/node_po.dart'; -export 'src/bean/widget_po.dart'; -export 'src/local_db.dart'; -export 'src/db_open_helper.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart index acc0ecbe..a1d16177 100644 --- a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart +++ b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart @@ -64,6 +64,7 @@ class _UnitBottomBarState extends State { @override Widget build(BuildContext context) { return BottomAppBar( + elevation: 0, shape: shape, notchMargin: 5, diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart index ac5667cb..1247a6b4 100644 --- a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart +++ b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart @@ -1,7 +1,6 @@ import 'dart:math'; import 'package:app_config/app_config.dart'; -import 'package:db_storage/db_storage.dart'; import 'package:flutter/material.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/db_storage/.gitignore b/packages/storage/.gitignore similarity index 100% rename from packages/db_storage/.gitignore rename to packages/storage/.gitignore diff --git a/packages/db_storage/.metadata b/packages/storage/.metadata similarity index 100% rename from packages/db_storage/.metadata rename to packages/storage/.metadata diff --git a/packages/db_storage/CHANGELOG.md b/packages/storage/CHANGELOG.md similarity index 100% rename from packages/db_storage/CHANGELOG.md rename to packages/storage/CHANGELOG.md diff --git a/packages/db_storage/LICENSE b/packages/storage/LICENSE similarity index 100% rename from packages/db_storage/LICENSE rename to packages/storage/LICENSE diff --git a/packages/db_storage/README.md b/packages/storage/README.md similarity index 100% rename from packages/db_storage/README.md rename to packages/storage/README.md diff --git a/packages/db_storage/analysis_options.yaml b/packages/storage/analysis_options.yaml similarity index 100% rename from packages/db_storage/analysis_options.yaml rename to packages/storage/analysis_options.yaml diff --git a/packages/db_storage/lib/src/bean/category_po.dart b/packages/storage/lib/src/db_storage/bean/category_po.dart similarity index 100% rename from packages/db_storage/lib/src/bean/category_po.dart rename to packages/storage/lib/src/db_storage/bean/category_po.dart diff --git a/packages/db_storage/lib/src/bean/node_po.dart b/packages/storage/lib/src/db_storage/bean/node_po.dart similarity index 100% rename from packages/db_storage/lib/src/bean/node_po.dart rename to packages/storage/lib/src/db_storage/bean/node_po.dart diff --git a/packages/db_storage/lib/src/bean/widget_po.dart b/packages/storage/lib/src/db_storage/bean/widget_po.dart similarity index 100% rename from packages/db_storage/lib/src/bean/widget_po.dart rename to packages/storage/lib/src/db_storage/bean/widget_po.dart diff --git a/packages/db_storage/lib/src/dao/category_dao.dart b/packages/storage/lib/src/db_storage/dao/category_dao.dart similarity index 100% rename from packages/db_storage/lib/src/dao/category_dao.dart rename to packages/storage/lib/src/db_storage/dao/category_dao.dart diff --git a/packages/db_storage/lib/src/dao/like_dao.dart b/packages/storage/lib/src/db_storage/dao/like_dao.dart similarity index 100% rename from packages/db_storage/lib/src/dao/like_dao.dart rename to packages/storage/lib/src/db_storage/dao/like_dao.dart diff --git a/packages/db_storage/lib/src/dao/node_dao.dart b/packages/storage/lib/src/db_storage/dao/node_dao.dart similarity index 100% rename from packages/db_storage/lib/src/dao/node_dao.dart rename to packages/storage/lib/src/db_storage/dao/node_dao.dart diff --git a/packages/db_storage/lib/src/dao/widget_dao.dart b/packages/storage/lib/src/db_storage/dao/widget_dao.dart similarity index 100% rename from packages/db_storage/lib/src/dao/widget_dao.dart rename to packages/storage/lib/src/db_storage/dao/widget_dao.dart diff --git a/packages/storage/lib/src/db_storage/db_storage.dart b/packages/storage/lib/src/db_storage/db_storage.dart new file mode 100644 index 00000000..957b558b --- /dev/null +++ b/packages/storage/lib/src/db_storage/db_storage.dart @@ -0,0 +1,10 @@ +export 'dao/category_dao.dart'; +export 'dao/like_dao.dart'; +export 'dao/node_dao.dart'; +export 'dao/widget_dao.dart'; + +export 'bean/category_po.dart'; +export 'bean/node_po.dart'; +export 'bean/widget_po.dart'; +export 'flutter_db_storage.dart'; +export 'helper/db_open_helper.dart'; \ No newline at end of file diff --git a/packages/db_storage/lib/src/local_db.dart b/packages/storage/lib/src/db_storage/flutter_db_storage.dart similarity index 88% rename from packages/db_storage/lib/src/local_db.dart rename to packages/storage/lib/src/db_storage/flutter_db_storage.dart index fe66d9da..8d3e70e4 100644 --- a/packages/db_storage/lib/src/local_db.dart +++ b/packages/storage/lib/src/db_storage/flutter_db_storage.dart @@ -1,20 +1,22 @@ import 'dart:io'; -import 'package:db_storage/db_storage.dart'; -import 'db_open_helper.dart'; + +import 'package:storage/storage.dart'; + +import 'helper/db_open_helper.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:path/path.dart' as path; import 'package:sqflite/sqflite.dart'; -class LocalDb { +class FlutterDbStorage { Database? _database; - LocalDb._(); + FlutterDbStorage._(); - static LocalDb instance = LocalDb._(); + static FlutterDbStorage instance = FlutterDbStorage._(); late WidgetDao _widgetDao; late CategoryDao _categoryDao; diff --git a/packages/db_storage/lib/src/db_open_helper.dart b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart similarity index 100% rename from packages/db_storage/lib/src/db_open_helper.dart rename to packages/storage/lib/src/db_storage/helper/db_open_helper.dart diff --git a/packages/storage/lib/src/sp_storage/models/app_config_po.dart b/packages/storage/lib/src/sp_storage/models/app_config_po.dart new file mode 100644 index 00000000..3597a064 --- /dev/null +++ b/packages/storage/lib/src/sp_storage/models/app_config_po.dart @@ -0,0 +1,47 @@ +// 用于维护 App 配置信息的存储类 +// 配置信息将通过 sp 存储在 xml 中 +class AppConfigPo { + final bool showBackGround; + final bool showOverlayTool; + final bool showPerformanceOverlay; + final int fontFamilyIndex; + final int codeStyleIndex; + final int appStyleIndex; + final int itemStyleIndex; + final int themeColorIndex; + + AppConfigPo({ + this.showBackGround = false, + this.showOverlayTool = false, + this.showPerformanceOverlay = false, + this.fontFamilyIndex = 1, + this.themeColorIndex = 4, + this.codeStyleIndex = 0, + this.appStyleIndex = 0, + this.itemStyleIndex = 0, + }); + + factory AppConfigPo.fromPo(dynamic map) { + return AppConfigPo( + showBackGround: map['showBackGround'] ?? false, + showOverlayTool: map['showOverlayTool'] ?? false, + showPerformanceOverlay: map['showPerformanceOverlay'] ?? false, + fontFamilyIndex: map['fontFamilyIndex'] ?? 1, + themeColorIndex: map['themeColorIndex'] ?? 4, + codeStyleIndex: map['codeStyleIndex'] ?? 0, + appStyleIndex: map['appStyleIndex'] ?? 0, + itemStyleIndex: map['itemStyleIndex'] ?? 0, + ); + } + + Map toJson() => { + 'showBackGround': showBackGround, + 'showOverlayTool': showOverlayTool, + 'showPerformanceOverlay': showPerformanceOverlay, + 'fontFamilyIndex': fontFamilyIndex, + 'themeColorIndex': themeColorIndex, + 'codeStyleIndex': codeStyleIndex, + 'appStyleIndex': appStyleIndex, + 'itemStyleIndex': itemStyleIndex, + }; +} diff --git a/packages/storage/lib/src/sp_storage/sp_keys.dart b/packages/storage/lib/src/sp_storage/sp_keys.dart new file mode 100644 index 00000000..3908369f --- /dev/null +++ b/packages/storage/lib/src/sp_storage/sp_keys.dart @@ -0,0 +1,3 @@ +const String kAppSpKey = 'app-config'; + +const String kUserSpKey = 'user-config'; \ No newline at end of file diff --git a/packages/storage/lib/src/sp_storage/sp_storage.dart b/packages/storage/lib/src/sp_storage/sp_storage.dart new file mode 100644 index 00000000..ca2279c2 --- /dev/null +++ b/packages/storage/lib/src/sp_storage/sp_storage.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; + +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:storage/src/sp_storage/sp_keys.dart'; + +import 'models/app_config_po.dart'; + +class SpStorage { + SpStorage._(); + + static SpStorage? _storage; + + static SpStorage get instance { + _storage = _storage ?? SpStorage._(); + return _storage!; + } + + SharedPreferences? _sp; + SharedPreferences get spf => _sp!; + + Future initSpWhenNull() async { + if (_sp != null) return; + _sp = _sp ?? await SharedPreferences.getInstance(); + } + + Future saveAppConfig(AppConfigPo appConfigPo) async { + await initSpWhenNull(); + String config = json.encode(appConfigPo); + return _sp!.setString(kAppSpKey, config); + } + + Future readAppConfig() async { + await initSpWhenNull(); + String content = _sp!.getString(kAppSpKey) ?? "{}"; + return AppConfigPo.fromPo(json.decode(content)); + } +} diff --git a/packages/storage/lib/storage.dart b/packages/storage/lib/storage.dart new file mode 100644 index 00000000..81a8e3df --- /dev/null +++ b/packages/storage/lib/storage.dart @@ -0,0 +1,8 @@ +library storage; + + +export 'src/db_storage/db_storage.dart'; + +export 'src/sp_storage/sp_storage.dart'; +export 'src/sp_storage/models/app_config_po.dart'; + diff --git a/packages/db_storage/pubspec.yaml b/packages/storage/pubspec.yaml similarity index 96% rename from packages/db_storage/pubspec.yaml rename to packages/storage/pubspec.yaml index c36ecb8f..bb62d48d 100644 --- a/packages/db_storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -1,4 +1,4 @@ -name: db_storage +name: storage description: A new Flutter project. version: 0.0.1 homepage: @@ -13,6 +13,7 @@ dependencies: sqflite: ^2.0.2+1 # 数据库 sqflite_common_ffi: ^2.1.1 # 数据库 path_provider: ^2.0.11 # 路径 + shared_preferences: ^2.0.13 # xml 固化 widget_repository: path: ../widget_repository diff --git a/packages/db_storage/test/db_storage_test.dart b/packages/storage/test/db_storage_test.dart similarity index 86% rename from packages/db_storage/test/db_storage_test.dart rename to packages/storage/test/db_storage_test.dart index ded4a7d8..47a0629b 100644 --- a/packages/db_storage/test/db_storage_test.dart +++ b/packages/storage/test/db_storage_test.dart @@ -1,6 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:db_storage/db_storage.dart'; void main() { // test('adds one to input values', () { diff --git a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart index 41c66d31..cc892dbf 100644 --- a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart +++ b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart @@ -1,4 +1,4 @@ -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 73bd1451..b23a384c 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -1,5 +1,4 @@ -import 'package:db_storage/db_storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index 33740d6e..1d3558b7 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -15,8 +15,8 @@ dependencies: equatable: ^2.0.3 # 相等辅助 widget_repository: path: ../widget_repository - db_storage: - path: ../db_storage + storage: + path: ../storage dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/widget_repository/lib/src/category_repository.dart b/packages/widget_repository/lib/src/category_repository.dart index c4811b1a..71f01bd9 100644 --- a/packages/widget_repository/lib/src/category_repository.dart +++ b/packages/widget_repository/lib/src/category_repository.dart @@ -1,6 +1,6 @@ import 'model/model.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart b/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart index dbf512fe..f0081958 100644 --- a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart +++ b/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart @@ -1,7 +1,8 @@ import 'dart:async'; import 'dart:convert'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; + import 'package:widget_repository/widget_repository.dart'; @@ -11,8 +12,8 @@ import 'package:widget_repository/widget_repository.dart'; class CategoryDbRepository implements CategoryRepository { - CategoryDao get categoryDao => LocalDb.instance.categoryDao; - LikeDao get likeDao => LocalDb.instance.likeDao; + CategoryDao get categoryDao => FlutterDbStorage.instance.categoryDao; + LikeDao get likeDao => FlutterDbStorage.instance.likeDao; // CategoryDbRepository({required this.categoryDao,required this.likeDao}); diff --git a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart b/packages/widget_repository/lib/src/db_impl/node_db_repository.dart index e15b6fa5..f9f6f861 100644 --- a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart +++ b/packages/widget_repository/lib/src/db_impl/node_db_repository.dart @@ -1,5 +1,6 @@ -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; + import 'package:widget_repository/src/model/node_model.dart'; import '../node_repository.dart'; @@ -8,7 +9,7 @@ class NodeDbRepository implements NodeRepository{ const NodeDbRepository(); - NodeDao get nodeDao => LocalDb.instance.nodeDao; + NodeDao get nodeDao => FlutterDbStorage.instance.nodeDao; @override Future> loadNode(int widgetId) async{ diff --git a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart b/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart index 083e95af..e4b41993 100644 --- a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart +++ b/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart @@ -1,6 +1,7 @@ import 'package:widget_repository/src/model/model.dart'; import 'package:widget_repository/src/widget_repository.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; + /// create by 张风捷特烈 on 2020-03-03 @@ -11,8 +12,8 @@ class WidgetDbRepository implements WidgetRepository { const WidgetDbRepository(); - WidgetDao get widgetDao => LocalDb.instance.widgetDao; - LikeDao get likeDao => LocalDb.instance.likeDao; + WidgetDao get widgetDao => FlutterDbStorage.instance.widgetDao; + LikeDao get likeDao => FlutterDbStorage.instance.likeDao; @override Future> loadLikeWidgets() async { diff --git a/packages/widget_repository/lib/src/model/category_model.dart b/packages/widget_repository/lib/src/model/category_model.dart index 87d1e40b..01373929 100644 --- a/packages/widget_repository/lib/src/model/category_model.dart +++ b/packages/widget_repository/lib/src/model/category_model.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:utils/utils.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; /// create by 张风捷特烈 on 2020-04-21 diff --git a/packages/widget_repository/lib/src/model/widget_model.dart b/packages/widget_repository/lib/src/model/widget_model.dart index 3934afca..a35dac94 100644 --- a/packages/widget_repository/lib/src/model/widget_model.dart +++ b/packages/widget_repository/lib/src/model/widget_model.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; -import 'package:db_storage/db_storage.dart'; +import 'package:storage/storage.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/widget_repository/pubspec.yaml b/packages/widget_repository/pubspec.yaml index 2e2b33fc..adc8d7b4 100644 --- a/packages/widget_repository/pubspec.yaml +++ b/packages/widget_repository/pubspec.yaml @@ -15,8 +15,8 @@ dependencies: intl: ^0.17.0 utils: path: ../utils - db_storage: - path: ../db_storage + storage: + path: ../storage dev_dependencies: flutter_test: diff --git a/pubspec.lock b/pubspec.lock index 37c2e6e5..6d93f127 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -133,13 +133,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" - db_storage: - dependency: "direct main" - description: - path: "packages/db_storage" - relative: true - source: path - version: "0.0.1" dio: dependency: "direct main" description: @@ -692,6 +685,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.11.0" + storage: + dependency: "direct main" + description: + path: "packages/storage" + relative: true + source: path + version: "0.0.1" stream_channel: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ddc348d0..157b9ee0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,8 +51,8 @@ dependencies: path: packages/widget_repository utils: path: packages/utils - db_storage: - path: packages/db_storage + storage: + path: packages/storage widgets: path: packages/widgets authentication: From 7664c5fafe2456c5d1cb9a4eb351e33b0e706765 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 18 May 2023 08:51:21 +0800 Subject: [PATCH 010/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget_detail/link_widget_buttons.dart | 50 ++++---- .../widget_detail/widget_detail_page.dart | 72 ++++------- .../category_page/like_widget_page.dart | 2 +- .../mobile/search_page/search_page.dart | 2 +- .../widget_detail/widget_detail_page.dart | 113 ++++-------------- .../app_config/lib/model/global_state.dart | 4 + .../widget_detail_bloc.dart | 46 ++++--- .../widget_detail_event.dart | 6 +- .../widget_detail_state.dart | 15 ++- 9 files changed, 123 insertions(+), 187 deletions(-) diff --git a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart b/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart index b40b69b7..585fa782 100644 --- a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart +++ b/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart @@ -12,7 +12,11 @@ class LinkWidgetButtons extends StatelessWidget { @override Widget build(BuildContext context) { - Color chipColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + + Color? chipColor = isDark + ? Theme.of(context).floatingActionButtonTheme.backgroundColor + : Theme.of(context).primaryColor; if (links.isEmpty) { return Padding( @@ -22,28 +26,28 @@ class LinkWidgetButtons extends StatelessWidget { labelStyle: const TextStyle(fontSize: 12, color: Colors.white), label: const Text('暂无链接组件'), )); + } else { + return Padding( + padding: const EdgeInsets.only(left: 10.0, top: 10), + child: Wrap( + spacing: 5, + runSpacing: 5, + children: links + .map((WidgetModel model) => ActionChip( + labelPadding: EdgeInsets.zero, + side: BorderSide.none, + onPressed: () => onSelect(model), + elevation: 1, + // shadowColor: chipColor, + backgroundColor: chipColor, + labelStyle: model.deprecated + ? UnitTextStyle.deprecatedChip + : UnitTextStyle.commonChip, + label: Text(model.name), + )) + .toList(), + ), + ); } - - return Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), - child: Wrap( - spacing: 5, - runSpacing: 5, - children: links - .map((WidgetModel model) => ActionChip( - labelPadding: EdgeInsets.zero, - side: BorderSide.none, - onPressed: () => onSelect(model), - elevation: 1, - // shadowColor: chipColor, - backgroundColor: chipColor, - labelStyle: model.deprecated - ? UnitTextStyle.deprecatedChip - : UnitTextStyle.commonChip, - label: Text(model.name), - )) - .toList(), - ), - ); } } diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart index a69c618e..c01efc4f 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart @@ -26,7 +26,7 @@ class DeskWidgetDetailPageScope extends StatelessWidget { create: (_) => WidgetDetailBloc( widgetRepository: const WidgetDbRepository(), nodeRepository: const NodeDbRepository()) - ..add(FetchWidgetDetail(model)), + ..push(model), child: DeskWidgetDetailPage( model: model, ), @@ -34,36 +34,20 @@ class DeskWidgetDetailPageScope extends StatelessWidget { } } -class DeskWidgetDetailPage extends StatefulWidget { +class DeskWidgetDetailPage extends StatelessWidget { final WidgetModel model; const DeskWidgetDetailPage({Key? key, required this.model}) : super(key: key); - @override - _DeskWidgetDetailPageState createState() => _DeskWidgetDetailPageState(); -} - -class _DeskWidgetDetailPageState extends State { - final List _modelStack = []; - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - @override - void initState() { - _modelStack.add(widget.model); - super.initState(); - } - - // 获取当前的 组件数据模型 - WidgetModel get currentWidgetModel => _modelStack.last; - @override Widget build(BuildContext context) { + WidgetDetailBloc bloc = context.watch(); + return BlocBuilder( builder: (_, state) => Scaffold( - endDrawer: CategoryEndDrawer(widget: currentWidgetModel), + endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), body: Builder(builder: (ctx) { - return _buildContent(ctx, state); + return _buildContent(ctx, bloc); }), ), ); @@ -79,12 +63,13 @@ class _DeskWidgetDetailPageState extends State { ], ); - Widget _buildContent(BuildContext context, DetailState state) { + Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { + DetailState state = bloc.state; return WillPopScope( onWillPop: () => _whenPop(context), child: CustomScrollView( slivers: [ - DeskSliverWidgetDetailBar(model: _modelStack.last), + DeskSliverWidgetDetailBar(model: bloc.currentWidget), SliverToBoxAdapter( child: Column( children: [ @@ -92,9 +77,11 @@ class _DeskWidgetDetailPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: DeskWidgetDetailPanel(model: _modelStack.last), + child: DeskWidgetDetailPanel(model: bloc.currentWidget), + ), + const SizedBox( + width: 20, ), - const SizedBox(width: 20,), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -103,7 +90,7 @@ class _DeskWidgetDetailPageState extends State { if (state is DetailWithData) LinkWidgetButtons( links: state.links, - onSelect: _toLinkWidget, + onSelect: bloc.push, ) ], )) @@ -114,45 +101,32 @@ class _DeskWidgetDetailPageState extends State { ), ), if (state is DetailWithData) - _buildSliverNodeList(state.nodes, state.widgetModel.name) + _buildSliverNodeList(context, state.nodes, state.widgetModel) ], )); } Future _whenPop(BuildContext context) async { - if (Scaffold.of(context).isEndDrawerOpen || _modelStack.isEmpty) { - return true; - } - _modelStack.removeLast(); - if (_modelStack.isNotEmpty) { - BlocProvider.of(context).add( - FetchWidgetDetail(currentWidgetModel), - ); - return false; - } else { + WidgetDetailBloc detailBloc = context.read(); + if (Scaffold.of(context).isEndDrawerOpen) { return true; } + return detailBloc.pop(); } - void _toLinkWidget(WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); - _modelStack.add(model); - } - - Widget _buildSliverNodeList(List nodes, String name) { + Widget _buildSliverNodeList( + BuildContext context, List nodes, WidgetModel model) { AppState globalState = BlocProvider.of(context).state; - HighlighterStyle codeStyle = - Cons.codeThemeSupport.keys.toList()[globalState.codeStyleIndex]; return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => DeskWidgetNodePanel( - codeStyle: codeStyle, + codeStyle: globalState.codeStyle, codeFamily: 'Inconsolata', text: nodes[i].name, subText: nodes[i].subtitle, code: nodes[i].code, - death: _modelStack.last.death, - show: WidgetsMap.map(name)[i], + death: model.death, + show: WidgetsMap.map(model.name)[i], ), childCount: nodes.length, )); diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/lib/widget_ui/mobile/category_page/like_widget_page.dart index 5e2044a5..016f3afb 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/lib/widget_ui/mobile/category_page/like_widget_page.dart @@ -81,7 +81,7 @@ class LikeWidgetPage extends StatelessWidget { .add(ToggleLikeWidgetEvent(id: model.id)); _toDetailPage(BuildContext context, WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); + BlocProvider.of(context).queryDetail(model); Navigator.push(context, Right2LeftRouter(child: WidgetDetailPage(model: model))); } } diff --git a/lib/widget_ui/mobile/search_page/search_page.dart b/lib/widget_ui/mobile/search_page/search_page.dart index 28d97999..d5cbb20a 100644 --- a/lib/widget_ui/mobile/search_page/search_page.dart +++ b/lib/widget_ui/mobile/search_page/search_page.dart @@ -162,7 +162,7 @@ class _SearchPageState extends State { if (focusScope.hasFocus) { focusScope.unfocus(); } - BlocProvider.of(context).add(FetchWidgetDetail(model)); + BlocProvider.of(context).queryDetail(model); Navigator.pushNamed(context, UnitRouter.widget_detail,arguments: model); } } diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart index f9ac02fe..04c80e5a 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart @@ -3,6 +3,7 @@ import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../desk_ui/widget_detail/link_widget_buttons.dart'; import 'widget_node_panel.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -27,7 +28,7 @@ class WidgetDetailPageScope extends StatelessWidget { create: (_) => WidgetDetailBloc( widgetRepository: const WidgetDbRepository(), nodeRepository: const NodeDbRepository()) - ..add(FetchWidgetDetail(model)), + ..push(model), child: WidgetDetailPage( model: model, ), @@ -35,38 +36,18 @@ class WidgetDetailPageScope extends StatelessWidget { } } -class WidgetDetailPage extends StatefulWidget { +class WidgetDetailPage extends StatelessWidget { final WidgetModel model; const WidgetDetailPage({Key? key, required this.model}) : super(key: key); - @override - _WidgetDetailPageState createState() => _WidgetDetailPageState(); -} - -class _WidgetDetailPageState extends State { - final List _modelStack = []; - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - @override - void initState() { - _modelStack.add(widget.model); - super.initState(); - } - - // 获取当前的 组件数据模型 - WidgetModel get currentWidgetModel => _modelStack.last; - @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => Scaffold( - endDrawer: CategoryEndDrawer(widget: currentWidgetModel), - body: Builder(builder: (ctx) { - return _buildContent(ctx, state); - }), - ), + WidgetDetailBloc bloc = context.watch(); + + return Scaffold( + endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), + body: Builder(builder: (ctx) => _buildContent(ctx, bloc)), ); } @@ -80,107 +61,57 @@ class _WidgetDetailPageState extends State { ], ); - Widget _buildContent(BuildContext context, DetailState state) { + Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { + DetailState state = bloc.state; return WillPopScope( onWillPop: () => _whenPop(context), child: CustomScrollView( slivers: [ SliverWidgetDetailBar( - model: _modelStack.last + model: bloc.currentWidget ), SliverToBoxAdapter( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - WidgetDetailPanel(model: _modelStack.last), + WidgetDetailPanel(model: bloc.currentWidget), linkText, if (state is DetailWithData) - _buildLinkTo(context, state.links), + LinkWidgetButtons(links: state.links, onSelect: bloc.push,), const Divider(), ], ), ), if (state is DetailWithData) - _buildSliverNodeList(state.nodes, state.widgetModel.name) + _buildSliverNodeList(context,state.nodes, state.widgetModel) ], )); } - - Future _whenPop(BuildContext context) async { - if (Scaffold.of(context).isEndDrawerOpen || _modelStack.isEmpty) { - return true; - } - _modelStack.removeLast(); - if (_modelStack.isNotEmpty) { - BlocProvider.of(context).add( - FetchWidgetDetail(currentWidgetModel), - ); - return false; - } else { + WidgetDetailBloc detailBloc = context.read(); + if (Scaffold.of(context).isEndDrawerOpen) { return true; } + return detailBloc.pop(); } - Color? get chipColor => isDark - ? Theme.of(context).floatingActionButtonTheme.backgroundColor - : Theme.of(context).primaryColor; - - Widget _buildLinkTo(BuildContext context, List links) { - if (links.isEmpty) { - return Padding( - padding: const EdgeInsets.only(left: 10), - child: Chip( - backgroundColor: Colors.grey.withAlpha(120), - labelStyle: const TextStyle(fontSize: 12, color: Colors.white), - label: const Text('暂无链接组件'), - )); - } else { - return Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), - child: Wrap( - spacing: 5, - children: links - .map((WidgetModel model) => ActionChip( - labelPadding: EdgeInsets.zero, - side: BorderSide.none, - onPressed: () => _toLinkWidget(model), - elevation: 1, - // shadowColor: chipColor, - backgroundColor: chipColor, - labelStyle: model.deprecated - ? UnitTextStyle.deprecatedChip - : UnitTextStyle.commonChip, - label: Text(model.name), - )) - .toList(), - ), - ); - } - } - void _toLinkWidget(WidgetModel model) { - BlocProvider.of(context).add(FetchWidgetDetail(model)); - _modelStack.add(model); - } - - Widget _buildSliverNodeList(List nodes, String name) { + Widget _buildSliverNodeList(BuildContext context,List nodes, WidgetModel model) { AppState globalState = BlocProvider.of(context).state; - HighlighterStyle codeStyle = - Cons.codeThemeSupport.keys.toList()[globalState.codeStyleIndex]; return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => WidgetNodePanel( - codeStyle: codeStyle, + codeStyle: globalState.codeStyle, codeFamily: 'Inconsolata', text: nodes[i].name, subText: nodes[i].subtitle, code: nodes[i].code, - death: _modelStack.last.death, - show: WidgetsMap.map(name)[i], + death: model.death, + show: WidgetsMap.map(model.name)[i], ), childCount: nodes.length, )); } } + diff --git a/packages/app_config/lib/model/global_state.dart b/packages/app_config/lib/model/global_state.dart index c5859e1a..04911e1d 100644 --- a/packages/app_config/lib/model/global_state.dart +++ b/packages/app_config/lib/model/global_state.dart @@ -1,4 +1,5 @@ import 'package:app_config/app/cons/cons.dart'; +import 'package:components/toly_ui/toly_ui.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:storage/storage.dart'; @@ -106,6 +107,9 @@ class AppState extends Equatable { ); } + HighlighterStyle get codeStyle => Cons.codeThemeSupport.keys.toList()[codeStyleIndex]; + + @override String toString() { return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 5624fb13..981c84a3 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -1,4 +1,5 @@ import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; @@ -7,29 +8,45 @@ part 'widget_detail_state.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: 组件详情页状态数据维护核心类 +/// [_modelStack] 组件详情页支持管理跳转,栈数据交由 Bloc 维护 -class WidgetDetailBloc extends Bloc { +class WidgetDetailBloc extends Cubit { final WidgetRepository widgetRepository; final NodeRepository nodeRepository; WidgetDetailBloc({ required this.widgetRepository, required this.nodeRepository, - }) : super(DetailLoading()) { - on(_onFetchWidgetDetail); - on(_onResetDetailState); + }) : super(DetailLoading()); + + final List _modelStack = []; + + WidgetModel get currentWidget => _modelStack.last; + + void push(WidgetModel model){ + _modelStack.add(model); + queryDetail(model); + } + + Future pop() async{ + if(_modelStack.isEmpty){ + return true; + } + _modelStack.removeLast(); + if (_modelStack.isNotEmpty) { + queryDetail(currentWidget); + return false; + } else { + return true; + } } - void _onFetchWidgetDetail( - FetchWidgetDetail event, Emitter emit) async { + void queryDetail(WidgetModel widget) async { emit(DetailLoading()); try { - final WidgetModel widget = event.widgetModel; - final List nodes = - await nodeRepository.loadNode(widget.id); - final List links = - await widgetRepository.loadWidget(widget.links); + final List nodes = await nodeRepository.loadNode(widget.id); + final List links = await widgetRepository.loadWidget(widget.links); if (nodes.isEmpty) { emit(DetailEmpty()); } else { @@ -43,9 +60,4 @@ class WidgetDetailBloc extends Bloc { emit(DetailFailed()); } } - - void _onResetDetailState( - ResetDetailState event, Emitter emit) async { - emit(DetailLoading()); - } } diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart index 743a8ff8..b1bcb07a 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart @@ -26,6 +26,6 @@ class FetchWidgetDetail extends DetailEvent { } -class ResetDetailState extends DetailEvent { - -} \ No newline at end of file +// class ResetDetailState extends DetailEvent { +// +// } \ No newline at end of file diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart index dd8771ee..d54e9663 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart @@ -23,17 +23,28 @@ class DetailWithData extends DetailState { }); @override - List get props => [widgetModel,nodes]; + List get props => [widgetModel, nodes]; @override String toString() { return 'DetailWithData{widget: $widgetModel, nodes: $nodes}'; } + DetailWithData copyWith({ + WidgetModel? widgetModel, + List? links, + List? nodes, + }) { + return DetailWithData( + widgetModel: widgetModel ?? this.widgetModel, + nodes: this.nodes, + links: this.links, + ); + } } class DetailLoading extends DetailState {} class DetailEmpty extends DetailState {} -class DetailFailed extends DetailState {} \ No newline at end of file +class DetailFailed extends DetailState {} From 3a09c180a2ea3e2d99e0e6b0385dc964dcec63db Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 18 May 2023 08:56:49 +0800 Subject: [PATCH 011/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widget_detail_bloc.dart | 1 - .../widget_detail_event.dart | 31 ------------------- 2 files changed, 32 deletions(-) delete mode 100644 packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 981c84a3..25e42e71 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; -part 'widget_detail_event.dart'; part 'widget_detail_state.dart'; /// create by 张风捷特烈 on 2020-03-03 diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart deleted file mode 100644 index b1bcb07a..00000000 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_event.dart +++ /dev/null @@ -1,31 +0,0 @@ -part of 'widget_detail_bloc.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 详情事件 - -abstract class DetailEvent extends Equatable { - const DetailEvent(); - @override - List get props => []; -} - - -class FetchWidgetDetail extends DetailEvent { - final WidgetModel widgetModel; - - const FetchWidgetDetail(this.widgetModel); - - @override - List get props => [widgetModel]; - - @override - String toString() { - return 'FetchWidgetDetail{widgetModel: $widgetModel}'; - } -} - - -// class ResetDetailState extends DetailEvent { -// -// } \ No newline at end of file From 14c02eb0fc40bb7c9d46e669d8208f2f36f57ebb Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 19 May 2023 16:41:51 +0800 Subject: [PATCH 012/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desk_ui/widget_panel/widget_panel.dart | 12 +++++++-- packages/app_config/lib/bloc/global_bloc.dart | 19 ++++++++------ .../lib/repository/app_state_repository.dart | 4 +-- .../lib/src/db_storage/dao/category_dao.dart | 2 +- .../lib/src/db_storage/dao/node_dao.dart | 2 +- .../lib/src/db_storage/dao/widget_dao.dart | 2 +- .../db_storage/{db_storage.dart => exp.dart} | 6 ++--- .../{bean => models}/category_po.dart | 0 .../db_storage/{bean => models}/node_po.dart | 0 .../{bean => models}/widget_po.dart | 0 .../src/sp_storage/cao/app_config_cao.dart | 20 +++++++++++++++ packages/storage/lib/src/sp_storage/exp.dart | 3 +++ .../storage/lib/src/sp_storage/sp_keys.dart | 3 --- .../lib/src/sp_storage/sp_storage.dart | 25 ++++++------------- packages/storage/lib/storage.dart | 7 ++---- 15 files changed, 62 insertions(+), 43 deletions(-) rename packages/storage/lib/src/db_storage/{db_storage.dart => exp.dart} (66%) rename packages/storage/lib/src/db_storage/{bean => models}/category_po.dart (100%) rename packages/storage/lib/src/db_storage/{bean => models}/node_po.dart (100%) rename packages/storage/lib/src/db_storage/{bean => models}/widget_po.dart (100%) create mode 100644 packages/storage/lib/src/sp_storage/cao/app_config_cao.dart create mode 100644 packages/storage/lib/src/sp_storage/exp.dart delete mode 100644 packages/storage/lib/src/sp_storage/sp_keys.dart diff --git a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart b/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart index d23a4988..10b75d4a 100644 --- a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart +++ b/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart @@ -1,5 +1,6 @@ import 'package:app_config/app_config.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/utils/convert.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -24,8 +25,15 @@ class _DeskWidgetPanelState extends State{ return Scaffold( body: Column( children: [ - DeskWidgetTopBar( - onTabPressed: _switchTab, + Shortcuts( + shortcuts: { + const SingleActivator(LogicalKeyboardKey.keyQ): VoidCallbackIntent(() { + print("hello"); + }), + }, + child: DeskWidgetTopBar( + onTabPressed: _switchTab, + ), ), const Divider(height: 1), Expanded( diff --git a/packages/app_config/lib/bloc/global_bloc.dart b/packages/app_config/lib/bloc/global_bloc.dart index 4dd78557..486c7fc0 100644 --- a/packages/app_config/lib/bloc/global_bloc.dart +++ b/packages/app_config/lib/bloc/global_bloc.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; import '../model/app_style.dart'; import '../repository/app_state_repository.dart'; @@ -22,57 +23,59 @@ class AppBloc extends Cubit< AppState> { emit(await storage.initApp()); } + AppConfigCao get cao => storage.sp.appConfig; + // 切换字体事件处理 : 固化索引 + 产出新状态 void switchFontFamily(String family) async { AppState newState = state.copyWith(fontFamily: family); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } // 切换主题色事件处理 : 固化索引 + 产出新状态 void switchThemeColor(MaterialColor color) async { AppState newState = state.copyWith(themeColor: color); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 固化数据 + 产出新状态 void switchShowBg(bool show) async { AppState newState = state.copyWith(showBackGround: show); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 产出新状态 void switchShowOver(bool show) async { AppState newState = state.copyWith(showPerformanceOverlay: show); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } // 切换code样式事件处理 : 固化索引 + 产出新状态 void switchCoderTheme(int codeStyleIndex) async { AppState newState = state.copyWith(codeStyleIndex: codeStyleIndex); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } // 切换item样式事件处理 : 固化索引 + 产出新状态 void changeItemStyle(int index) async { AppState newState = state.copyWith(itemStyleIndex: index); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } void changeAppStyle(AppStyle style) async{ AppState newState = state.copyWith(appStyle: style); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } void switchShowTool(bool show) async{ AppState newState = state.copyWith(showOverlayTool: show); - storage.sp.saveAppConfig(newState.toAppConfigPo()); + cao.write(newState.toAppConfigPo()); emit(newState); } } diff --git a/packages/app_config/lib/repository/app_state_repository.dart b/packages/app_config/lib/repository/app_state_repository.dart index 9b1da04f..8be0675e 100644 --- a/packages/app_config/lib/repository/app_state_repository.dart +++ b/packages/app_config/lib/repository/app_state_repository.dart @@ -22,9 +22,9 @@ class AppStateRepository{ //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, "flutter.db"); - + SpStorage.instance.initSp(); // 读取配置文件,初始化应用状态 - AppConfigPo po = await sp.readAppConfig(); + AppConfigPo po = await sp.appConfig.read(); bool shouldCopy = await _checkShouldCopy(dbPath,sp.spf); diff --git a/packages/storage/lib/src/db_storage/dao/category_dao.dart b/packages/storage/lib/src/db_storage/dao/category_dao.dart index 8d0bd4e0..669b9d2f 100644 --- a/packages/storage/lib/src/db_storage/dao/category_dao.dart +++ b/packages/storage/lib/src/db_storage/dao/category_dao.dart @@ -1,6 +1,6 @@ import 'package:sqflite/sqflite.dart'; -import '../bean/category_po.dart'; +import '../models/category_po.dart'; //""" // CREATE TABLE IF NOT EXISTS category_widget( diff --git a/packages/storage/lib/src/db_storage/dao/node_dao.dart b/packages/storage/lib/src/db_storage/dao/node_dao.dart index 4dc55288..3e425869 100644 --- a/packages/storage/lib/src/db_storage/dao/node_dao.dart +++ b/packages/storage/lib/src/db_storage/dao/node_dao.dart @@ -1,4 +1,4 @@ -import '../bean/node_po.dart'; +import '../models/node_po.dart'; import 'package:sqflite/sqflite.dart'; class NodeDao { diff --git a/packages/storage/lib/src/db_storage/dao/widget_dao.dart b/packages/storage/lib/src/db_storage/dao/widget_dao.dart index 99c806a5..c29d5e4d 100644 --- a/packages/storage/lib/src/db_storage/dao/widget_dao.dart +++ b/packages/storage/lib/src/db_storage/dao/widget_dao.dart @@ -2,7 +2,7 @@ import 'package:sqflite/sqflite.dart'; import 'package:widget_repository/widget_repository.dart'; -import '../bean/widget_po.dart'; +import '../models/widget_po.dart'; class WidgetDao { diff --git a/packages/storage/lib/src/db_storage/db_storage.dart b/packages/storage/lib/src/db_storage/exp.dart similarity index 66% rename from packages/storage/lib/src/db_storage/db_storage.dart rename to packages/storage/lib/src/db_storage/exp.dart index 957b558b..85d563dd 100644 --- a/packages/storage/lib/src/db_storage/db_storage.dart +++ b/packages/storage/lib/src/db_storage/exp.dart @@ -3,8 +3,8 @@ export 'dao/like_dao.dart'; export 'dao/node_dao.dart'; export 'dao/widget_dao.dart'; -export 'bean/category_po.dart'; -export 'bean/node_po.dart'; -export 'bean/widget_po.dart'; +export 'models/category_po.dart'; +export 'models/node_po.dart'; +export 'models/widget_po.dart'; export 'flutter_db_storage.dart'; export 'helper/db_open_helper.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/bean/category_po.dart b/packages/storage/lib/src/db_storage/models/category_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/bean/category_po.dart rename to packages/storage/lib/src/db_storage/models/category_po.dart diff --git a/packages/storage/lib/src/db_storage/bean/node_po.dart b/packages/storage/lib/src/db_storage/models/node_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/bean/node_po.dart rename to packages/storage/lib/src/db_storage/models/node_po.dart diff --git a/packages/storage/lib/src/db_storage/bean/widget_po.dart b/packages/storage/lib/src/db_storage/models/widget_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/bean/widget_po.dart rename to packages/storage/lib/src/db_storage/models/widget_po.dart diff --git a/packages/storage/lib/src/sp_storage/cao/app_config_cao.dart b/packages/storage/lib/src/sp_storage/cao/app_config_cao.dart new file mode 100644 index 00000000..c0cf9c38 --- /dev/null +++ b/packages/storage/lib/src/sp_storage/cao/app_config_cao.dart @@ -0,0 +1,20 @@ +import 'dart:convert'; + +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:storage/storage.dart'; +const String kAppSpKey = 'app-config'; + +class AppConfigCao{ + final SharedPreferences sp; + AppConfigCao(this.sp); + + Future write(AppConfigPo appConfigPo) async { + String config = json.encode(appConfigPo); + return sp.setString(kAppSpKey, config); + } + + Future read() async { + String content = sp.getString(kAppSpKey) ?? "{}"; + return AppConfigPo.fromPo(json.decode(content)); + } +} \ No newline at end of file diff --git a/packages/storage/lib/src/sp_storage/exp.dart b/packages/storage/lib/src/sp_storage/exp.dart new file mode 100644 index 00000000..c07a1662 --- /dev/null +++ b/packages/storage/lib/src/sp_storage/exp.dart @@ -0,0 +1,3 @@ +export 'cao/app_config_cao.dart'; +export 'models/app_config_po.dart'; +export 'sp_storage.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/sp_storage/sp_keys.dart b/packages/storage/lib/src/sp_storage/sp_keys.dart deleted file mode 100644 index 3908369f..00000000 --- a/packages/storage/lib/src/sp_storage/sp_keys.dart +++ /dev/null @@ -1,3 +0,0 @@ -const String kAppSpKey = 'app-config'; - -const String kUserSpKey = 'user-config'; \ No newline at end of file diff --git a/packages/storage/lib/src/sp_storage/sp_storage.dart b/packages/storage/lib/src/sp_storage/sp_storage.dart index ca2279c2..a02d4337 100644 --- a/packages/storage/lib/src/sp_storage/sp_storage.dart +++ b/packages/storage/lib/src/sp_storage/sp_storage.dart @@ -1,9 +1,6 @@ -import 'dart:convert'; - import 'package:shared_preferences/shared_preferences.dart'; -import 'package:storage/src/sp_storage/sp_keys.dart'; -import 'models/app_config_po.dart'; +import 'cao/app_config_cao.dart'; class SpStorage { SpStorage._(); @@ -16,22 +13,16 @@ class SpStorage { } SharedPreferences? _sp; + SharedPreferences get spf => _sp!; - Future initSpWhenNull() async { - if (_sp != null) return; - _sp = _sp ?? await SharedPreferences.getInstance(); - } + late AppConfigCao _appConfig; - Future saveAppConfig(AppConfigPo appConfigPo) async { - await initSpWhenNull(); - String config = json.encode(appConfigPo); - return _sp!.setString(kAppSpKey, config); - } + AppConfigCao get appConfig => _appConfig; - Future readAppConfig() async { - await initSpWhenNull(); - String content = _sp!.getString(kAppSpKey) ?? "{}"; - return AppConfigPo.fromPo(json.decode(content)); + Future initSp() async { + if (_sp != null) return; + _sp = _sp ?? await SharedPreferences.getInstance(); + _appConfig = AppConfigCao(_sp!); } } diff --git a/packages/storage/lib/storage.dart b/packages/storage/lib/storage.dart index 81a8e3df..798c6946 100644 --- a/packages/storage/lib/storage.dart +++ b/packages/storage/lib/storage.dart @@ -1,8 +1,5 @@ library storage; -export 'src/db_storage/db_storage.dart'; - -export 'src/sp_storage/sp_storage.dart'; -export 'src/sp_storage/models/app_config_po.dart'; - +export 'src/db_storage/exp.dart'; +export 'src/sp_storage/exp.dart'; From 0c99a5a369d7cd0e9730bba4b1e99a3949395f82 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 19 May 2023 17:31:51 +0800 Subject: [PATCH 013/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app_config/lib/repository/app_state_repository.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app_config/lib/repository/app_state_repository.dart b/packages/app_config/lib/repository/app_state_repository.dart index 8be0675e..1e095842 100644 --- a/packages/app_config/lib/repository/app_state_repository.dart +++ b/packages/app_config/lib/repository/app_state_repository.dart @@ -22,7 +22,7 @@ class AppStateRepository{ //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, "flutter.db"); - SpStorage.instance.initSp(); + await SpStorage.instance.initSp(); // 读取配置文件,初始化应用状态 AppConfigPo po = await sp.appConfig.read(); From f2191756e16afad6a74e2d16a344480cae0252c6 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 20 May 2023 20:03:06 +0800 Subject: [PATCH 014/149] =?UTF-8?q?=E5=8D=87=E7=BA=A7=20Flutter=203.10.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- android/app/build.gradle | 6 +- android/build.gradle | 2 +- lib/app/utils/color_utils.dart | 4 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 +- packages/app_update/pubspec.yaml | 2 +- .../lib/flutter_ui/no_div_expansion_tile.dart | 10 +- packages/widget_repository/pubspec.yaml | 2 +- .../ProxyWidget/SliderTheme/node2_diy.dart | 3 +- .../AnimatedSize/node1_base.dart | 1 - packages/widgets/pubspec.yaml | 2 +- pubspec.lock | 130 +++++++----------- pubspec.yaml | 8 +- windows/runner/CMakeLists.txt | 7 + windows/runner/Runner.rc | 10 +- 15 files changed, 87 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index 3b87cc60..aa4a5878 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,10 @@ > 当前Flutter 版本 ``` -Flutter 3.7.12 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 4d9e56e694 (7 days ago) • 2023-04-17 21:47:46 -0400 -Engine • revision 1a65d409c7 -Tools • Dart 2.19.6 • DevTools 2.20.1 +Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git +Framework • revision d3d8effc68 (3 days ago) • 2023-05-16 17:59:05 -0700 +Engine • revision b4fb11214d +Tools • Dart 3.0.1 • DevTools 2.23.1 ``` --- diff --git a/android/app/build.gradle b/android/app/build.gradle index b3a3b1d7..28483e94 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,12 +44,16 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.toly1994.flutter_unit" - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true archivesBaseName = "FlutterUnit.apk" + ndk { + abiFilters 'arm64-v8a' +// abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' + } } buildTypes { diff --git a/android/build.gradle b/android/build.gradle index ba6fe4a4..e66d1745 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -24,6 +24,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/lib/app/utils/color_utils.dart b/lib/app/utils/color_utils.dart index 3e245dd4..75170c73 100644 --- a/lib/app/utils/color_utils.dart +++ b/lib/app/utils/color_utils.dart @@ -38,10 +38,10 @@ class ColorUtils { print(e); } switch (code.length) { - case 1 + 6://6位 + case 7://6位 result = Color(value + 0xFF000000); break; - case 1 + 8://8位 + case 9://8位 result = Color(value); break; default: diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 7426e610..85b0d641 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,7 +5,7 @@ import FlutterMacOS import Foundation -import package_info_plus_macos +import package_info_plus import path_provider_macos import screen_retriever import share_plus diff --git a/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml index bb0f35ea..4da42e73 100644 --- a/packages/app_update/pubspec.yaml +++ b/packages/app_update/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: flutter_bloc: ^8.0.1 # 状态管理 shared_preferences: ^2.0.13 # xml 固化 r_upgrade: ^0.3.8+2 # 应用升级 - package_info_plus: ^1.3.0 # 应用包信息 + package_info_plus: ^4.0.1 utils: path: ../utils app_config: diff --git a/packages/components/lib/flutter_ui/no_div_expansion_tile.dart b/packages/components/lib/flutter_ui/no_div_expansion_tile.dart index 029ab797..a43a0a8f 100644 --- a/packages/components/lib/flutter_ui/no_div_expansion_tile.dart +++ b/packages/components/lib/flutter_ui/no_div_expansion_tile.dart @@ -107,7 +107,7 @@ class _NoBorderExpansionTileState extends State with Sing _iconColor = _controller.drive(_iconColorTween.chain(_easeInTween)); _backgroundColor = _controller.drive(_backgroundColorTween.chain(_easeOutTween)); - _isExpanded = PageStorage.of(context)?.readState(context) ?? widget.initiallyExpanded; + _isExpanded = PageStorage.of(context).readState(context) ?? widget.initiallyExpanded; if (_isExpanded) { _controller.value = 1.0; } @@ -135,7 +135,7 @@ class _NoBorderExpansionTileState extends State with Sing }); }); } - PageStorage.of(context)?.writeState(context, _isExpanded); + PageStorage.of(context).writeState(context, _isExpanded); }); widget.onExpansionChanged?.call(_isExpanded); } @@ -179,11 +179,11 @@ class _NoBorderExpansionTileState extends State with Sing _borderColorTween .end = theme.dividerColor; _headerColorTween - ..begin = theme.textTheme.subtitle1!.color - ..end = theme.accentColor; + ..begin = theme.textTheme.bodyMedium?.color + ..end = theme.primaryColor; _iconColorTween ..begin = theme.unselectedWidgetColor - ..end = theme.accentColor; + ..end = theme.primaryColor; _backgroundColorTween .end = widget.backgroundColor; super.didChangeDependencies(); diff --git a/packages/widget_repository/pubspec.yaml b/packages/widget_repository/pubspec.yaml index adc8d7b4..16ad71a1 100644 --- a/packages/widget_repository/pubspec.yaml +++ b/packages/widget_repository/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter: sdk: flutter equatable: ^2.0.5 - intl: ^0.17.0 + intl: ^0.18.0 utils: path: ../utils storage: diff --git a/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart b/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart index b46e66ec..68c0104d 100644 --- a/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart +++ b/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart @@ -38,8 +38,7 @@ class _DIYSliderThemeState extends State { valueIndicatorColor: Colors.deepPurpleAccent, thumbShape: _CustomThumbShape(), valueIndicatorShape: _CustomValueIndicatorShape(), - valueIndicatorTextStyle: theme.accentTextTheme.bodyText2! - .copyWith(color: theme.colorScheme.onSurface), + valueIndicatorTextStyle: theme.primaryTextTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurface), ), child: Slider( min: 0.0, diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart index 2e86f942..721d122f 100644 --- a/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart +++ b/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart @@ -47,7 +47,6 @@ class _CustomAnimatedSizeState extends State height: 100, alignment: Alignment.center, child: AnimatedSize( - vsync: this, duration: const Duration(seconds: 1), curve: Curves.fastOutSlowIn, alignment: const Alignment(0, 0), diff --git a/packages/widgets/pubspec.yaml b/packages/widgets/pubspec.yaml index 6884d14b..361b49e0 100644 --- a/packages/widgets/pubspec.yaml +++ b/packages/widgets/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter path_provider: ^2.0.11 # 路径 - intl: ^0.17.0 + intl: ^0.18.0 app_config: path: ../app_config components: diff --git a/pubspec.lock b/pubspec.lock index 6d93f127..001a9f81 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -35,10 +35,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.10.0" + version: "2.11.0" authentication: dependency: "direct main" description: @@ -66,10 +66,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.1" + version: "1.3.0" clock: dependency: transitive description: @@ -82,10 +82,10 @@ packages: dependency: transitive description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.17.0" + version: "1.17.1" components: dependency: "direct main" description: @@ -105,10 +105,10 @@ packages: dependency: transitive description: name: cross_file - sha256: f71079978789bc2fe78d79227f1f8cfe195b31bbd8db2399b0d15a4b96fb843b + sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.3+2" + version: "0.3.3+4" crypto: dependency: transitive description: @@ -177,10 +177,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 + sha256: c7a8e25ca60e7f331b153b0cb3d405828f18d3e72a6fa1d9440c86556fffc877 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.2.5" + version: "5.3.0" flutter: dependency: "direct main" description: flutter @@ -219,10 +219,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.8" + version: "2.0.15" flutter_spinkit: dependency: "direct main" description: @@ -285,18 +285,18 @@ packages: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.17.0" + version: "0.18.0" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.5" + version: "0.6.7" jwt_decoder: dependency: "direct main" description: @@ -325,10 +325,10 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.12.13" + version: "0.12.15" material_color_utilities: dependency: transitive description: @@ -341,18 +341,18 @@ packages: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: name: mime - sha256: dab22e92b41aa1255ea90ddc4bc2feaf35544fd0728e209638cad041a6e3928a + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.2" + version: "1.0.4" nested: dependency: transitive description: @@ -372,58 +372,26 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: f62d7253edc197fe3c88d7c2ddab82d68f555e778d55390ccc3537eca8e8d637 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.4.3+1" - package_info_plus_linux: - dependency: transitive - description: - name: package_info_plus_linux - sha256: "04b575f44233d30edbb80a94e57cad9107aada334fc02aabb42b6becd13c43fc" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.0.5" - package_info_plus_macos: - dependency: transitive - description: - name: package_info_plus_macos - sha256: a2ad8b4acf4cd479d4a0afa5a74ea3f5b1c7563b77e52cc32b3ee6956d5482a6 + sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.3.0" + version: "4.0.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: f7a0c8f1e7e981bc65f8b64137a53fd3c195b18d429fba960babc59a5a1c7ae8 + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.2" - package_info_plus_web: - dependency: transitive - description: - name: package_info_plus_web - sha256: f0829327eb534789e0a16ccac8936a80beed4e2401c4d3a74f3f39094a822d3b - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.0.6" - package_info_plus_windows: - dependency: transitive - description: - name: package_info_plus_windows - sha256: "79524f11c42dd9078b96d797b3cf79c0a2883a50c4920dc43da8562c115089bc" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.0" + version: "2.0.1" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.8.2" + version: "1.8.3" path_parsing: dependency: transitive description: @@ -484,10 +452,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" + version: "2.1.6" petitparser: dependency: transitive description: @@ -508,10 +476,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" + version: "2.1.4" pointycastle: dependency: transitive description: @@ -556,18 +524,18 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "8c6892037b1824e2d7e8f59d54b3105932899008642e6372e5079c6939b4b625" + sha256: "44fc0bc2d35a8fafa1b564e1c6888bdc4fbb2d0197e4a4c21bac0e66123be9cd" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.3.1" + version: "7.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" + sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.2.0" + version: "3.2.1" shared_preferences: dependency: "direct main" description: @@ -736,10 +704,10 @@ packages: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb url: "https://pub.flutter-io.cn/" source: hosted - version: "0.4.16" + version: "0.5.1" toggle_rotate: dependency: "direct main" description: @@ -784,10 +752,10 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: "360fa359ab06bcb4f7c5cd3123a2a9a4d3364d4575d27c4b33468bd4497dd094" + sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" + version: "3.0.5" url_launcher_macos: dependency: transitive description: @@ -800,26 +768,26 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "5669882643b96bb6d5786637cac727c6e918a790053b09245fd4513b8a07df2a" + sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.13" + version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: e3c3b16d3104260c10eea3b0e34272aaa57921f83148b0619f74c2eced9b7ef1 + sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" + version: "3.0.6" utils: dependency: "direct main" description: @@ -892,10 +860,10 @@ packages: dependency: transitive description: name: win32 - sha256: ca121dbbadb3e43b449053feab0cdf3f2bff93b107cacf0290e3d29f717374b6 + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.1.2" + version: "4.1.4" window_manager: dependency: "direct main" description: @@ -945,5 +913,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=2.19.0-0 <3.0.0" + dart: ">=3.0.0 <4.0.0" flutter: ">=3.7.0-0" diff --git a/pubspec.yaml b/pubspec.yaml index 157b9ee0..660a53ce 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ homepage: https://juejin.cn/user/149189281194766/posts environment: - sdk: ">=2.17.1 <=3.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: @@ -20,7 +20,7 @@ dependencies: stream_transform: ^2.0.0 equatable: ^2.0.3 # 相等辅助 archive: ^3.3.6 # 解压 - package_info_plus: ^1.3.0 # 应用包信息 + package_info_plus: ^4.0.1 # 应用包信息 r_upgrade: ^0.3.8+2 # 应用升级 sqflite: ^2.0.2+1 # 数据库 @@ -37,9 +37,9 @@ dependencies: wrapper: ^1.0.2 yaml_modify: ^1.0.1 url_launcher: ^6.1.9 # url - share_plus: ^6.3.1 # 文字分享 + share_plus: ^7.0.1 # 文字分享 flutter_svg: ^2.0.1 - intl: ^0.17.0 + intl: ^0.18.0 platform: ^3.1.0 image: ^3.1.0 flutter_spinkit: ^5.1.0 # loading diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index b9e550fb..17411a8a 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -20,6 +20,13 @@ add_executable(${BINARY_NAME} WIN32 # that need different build settings. apply_standard_settings(${BINARY_NAME}) +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + # Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 4dfd8f4c..adc0b5bc 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -60,14 +60,14 @@ IDI_APP_ICON ICON "resources\\app_icon.ico" // Version // -#ifdef FLUTTER_BUILD_NUMBER -#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD #else -#define VERSION_AS_NUMBER 1,0,0 +#define VERSION_AS_NUMBER 1,0,0,0 #endif -#ifdef FLUTTER_BUILD_NAME -#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION #else #define VERSION_AS_STRING "1.0.0" #endif From d03e7153eaa67c2480d76069470bf48524456a03 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 24 May 2023 08:54:56 +0800 Subject: [PATCH 015/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/bloc_wrapper.dart | 2 +- lib/app/flutter_unit.dart | 2 +- lib/app/navigation/desk_ui/unit_desk_navigation.dart | 2 +- lib/app/navigation/desk_ui/unit_rail_navigation.dart | 2 +- lib/app/navigation/home_drawer.dart | 2 +- lib/app/navigation/overlay_tool_wrapper.dart | 2 +- lib/app/navigation/pure_bottom_bar.dart | 2 +- lib/app/navigation/unit_navigation.dart | 2 +- lib/app/router/unit_router.dart | 2 +- lib/app/views/about/about_app_page.dart | 2 +- lib/app/views/about/about_me_page.dart | 2 +- lib/app/views/about/version_info.dart | 2 +- lib/app/views/data_manage/data_manage_page.dart | 3 +-- lib/app/views/setting/app_style_setting.dart | 2 +- lib/app/views/setting/code_style_setting.dart | 2 +- lib/app/views/setting/font_setting.dart | 2 +- lib/app/views/setting/item_style_setting.dart | 3 +-- lib/app/views/setting/setting_page.dart | 2 +- lib/app/views/setting/theme_color_setting.dart | 2 +- lib/app/views/splash/standard_unit_splash.dart | 3 +-- lib/app/views/time_line/flutter_unit_time_line.dart | 2 +- lib/app/views/unit_todo/point_unit_page.dart | 2 +- lib/code_gen/icon_font_gen/gen_message_action.dart | 3 +-- lib/code_gen/icon_font_gen/icon_font_gen_page.dart | 2 +- lib/painter_system/desk_ui/desk_gallery_unit.dart | 2 +- lib/point_system/api/app_info.dart | 2 +- lib/point_system/api/category_api.dart | 2 +- lib/point_system/views/desk_ui/github_repo_panel.dart | 2 +- lib/point_system/views/issues_point/issue_item.dart | 2 +- lib/point_system/views/issues_point/issues_point_page.dart | 3 +-- lib/point_system/views/issues_point/repo_widget.dart | 2 +- lib/widget_ui/desk_ui/category_panel/desk_category_page.dart | 3 +-- lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart | 2 +- lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart | 2 +- lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart | 3 +-- lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart | 3 +-- lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart | 2 +- lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart | 2 +- .../desk_ui/widget_panel/desk_widget_model_item.dart | 2 +- lib/widget_ui/desk_ui/widget_panel/widget_panel.dart | 2 +- lib/widget_ui/mobile/category_page/category_detail.dart | 2 +- lib/widget_ui/mobile/category_page/category_page.dart | 2 +- lib/widget_ui/mobile/category_page/edit_category_panel.dart | 2 +- lib/widget_ui/mobile/category_page/empty_category.dart | 2 +- lib/widget_ui/mobile/category_page/like_widget_page.dart | 2 +- lib/widget_ui/mobile/category_page/sync/async_button.dart | 2 +- lib/widget_ui/mobile/category_page/sync/upload_button.dart | 2 +- lib/widget_ui/mobile/search_page/search_page.dart | 2 +- lib/widget_ui/mobile/search_page/standard_search_bar.dart | 3 +-- lib/widget_ui/mobile/search_page/standard_search_page.dart | 2 +- lib/widget_ui/mobile/widget_detail/category_end_drawer.dart | 2 +- .../mobile/widget_detail/collect_widget_list_item.dart | 2 +- lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart | 2 +- lib/widget_ui/mobile/widget_detail/widget_detail_page.dart | 3 +-- lib/widget_ui/mobile/widget_detail/widget_node_panel.dart | 2 +- lib/widget_ui/mobile/widget_panel/phone_widget_content.dart | 2 +- lib/widget_ui/mobile/widget_panel/standard_home_page.dart | 2 +- lib/widget_ui/mobile/widget_panel/standard_home_search.dart | 2 +- lib/widget_ui/mobile/widget_panel/widget_model_item.dart | 2 +- packages/{app_config => app}/.gitignore | 0 packages/{app_config => app}/.metadata | 0 packages/{app_config => app}/CHANGELOG.md | 0 packages/{app_config => app}/LICENSE | 0 packages/{app_config => app}/README.md | 0 packages/{app_config => app}/analysis_options.yaml | 0 packages/{app_config/lib/app_config.dart => app/lib/app.dart} | 2 +- packages/{app_config => app}/lib/app/cons/cons.dart | 0 packages/{app_config => app}/lib/app/cons/global_value.dart | 0 packages/{app_config => app}/lib/app/cons/path_unit.dart | 0 packages/{app_config => app}/lib/app/cons/sp.dart | 0 packages/{app_config => app}/lib/app/cons/str_unit.dart | 0 packages/{app_config => app}/lib/app/res/toly_icon.dart | 0 packages/{app_config => app}/lib/app/router/router_utils.dart | 0 packages/{app_config => app}/lib/app/router/unit_router.dart | 0 .../lib/app/style/behavior/no_scroll_behavior.dart | 0 packages/{app_config => app}/lib/app/style/gap.dart | 0 .../lib/app/style/shape/coupon_shape_border.dart | 0 .../{app_config => app}/lib/app/style/shape/techno_shape.dart | 0 packages/{app_config => app}/lib/app/style/unit_color.dart | 0 .../{app_config => app}/lib/app/style/unit_text_style.dart | 0 packages/{app_config => app}/lib/app/theme/app_theme.dart | 2 +- packages/{app_config => app}/lib/app/theme/size_unit.dart | 0 packages/{app_config => app}/lib/bloc/global_bloc.dart | 0 packages/{app_config => app}/lib/bloc/update/bloc.dart | 0 packages/{app_config => app}/lib/bloc/update/event.dart | 0 packages/{app_config => app}/lib/bloc/update/state.dart | 0 packages/{app_config => app}/lib/model/app_style.dart | 0 packages/{app_config => app}/lib/model/global_state.dart | 2 +- .../lib/repository/app_state_repository.dart | 4 ++-- packages/{app_config => app}/pubspec.yaml | 2 +- packages/{app_config => app}/test/app_config_test.dart | 0 packages/app_update/lib/model/app_info.dart | 2 +- packages/app_update/pubspec.yaml | 4 ++-- packages/authentication/lib/blocs/authentic/bloc.dart | 2 +- .../authentication/lib/views/mobile/login/login_form.dart | 2 +- packages/authentication/lib/views/mobile/user/page_item.dart | 2 +- packages/authentication/lib/views/mobile/user/user_page.dart | 2 +- packages/authentication/pubspec.yaml | 4 ++-- packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart | 3 ++- .../lib/home_page/desk_widget_content.dart | 3 ++- .../old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart | 3 ++- .../lib/home_page/phone_widget_content.dart | 3 ++- .../old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart | 3 ++- .../old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart | 3 ++- packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart | 3 ++- packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart | 2 +- .../lib/widget_item/coupon_widget_list_item.dart | 3 ++- .../lib/widget_item/home_item_support.dart | 2 +- .../lib/widget_item/simple_widget_list_item.dart | 3 ++- .../lib/widget_item/techno_widget_list_item.dart | 2 +- packages/old_fancy_mobile_ui/pubspec.yaml | 4 ++-- packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart | 2 +- packages/widgets/lib/utils/dialog_about.dart | 2 +- packages/widgets/pubspec.yaml | 4 ++-- pubspec.lock | 4 ++-- pubspec.yaml | 4 ++-- 116 files changed, 105 insertions(+), 106 deletions(-) rename packages/{app_config => app}/.gitignore (100%) rename packages/{app_config => app}/.metadata (100%) rename packages/{app_config => app}/CHANGELOG.md (100%) rename packages/{app_config => app}/LICENSE (100%) rename packages/{app_config => app}/README.md (100%) rename packages/{app_config => app}/analysis_options.yaml (100%) rename packages/{app_config/lib/app_config.dart => app/lib/app.dart} (97%) rename packages/{app_config => app}/lib/app/cons/cons.dart (100%) rename packages/{app_config => app}/lib/app/cons/global_value.dart (100%) rename packages/{app_config => app}/lib/app/cons/path_unit.dart (100%) rename packages/{app_config => app}/lib/app/cons/sp.dart (100%) rename packages/{app_config => app}/lib/app/cons/str_unit.dart (100%) rename packages/{app_config => app}/lib/app/res/toly_icon.dart (100%) rename packages/{app_config => app}/lib/app/router/router_utils.dart (100%) rename packages/{app_config => app}/lib/app/router/unit_router.dart (100%) rename packages/{app_config => app}/lib/app/style/behavior/no_scroll_behavior.dart (100%) rename packages/{app_config => app}/lib/app/style/gap.dart (100%) rename packages/{app_config => app}/lib/app/style/shape/coupon_shape_border.dart (100%) rename packages/{app_config => app}/lib/app/style/shape/techno_shape.dart (100%) rename packages/{app_config => app}/lib/app/style/unit_color.dart (100%) rename packages/{app_config => app}/lib/app/style/unit_text_style.dart (100%) rename packages/{app_config => app}/lib/app/theme/app_theme.dart (97%) rename packages/{app_config => app}/lib/app/theme/size_unit.dart (100%) rename packages/{app_config => app}/lib/bloc/global_bloc.dart (100%) rename packages/{app_config => app}/lib/bloc/update/bloc.dart (100%) rename packages/{app_config => app}/lib/bloc/update/event.dart (100%) rename packages/{app_config => app}/lib/bloc/update/state.dart (100%) rename packages/{app_config => app}/lib/model/app_style.dart (100%) rename packages/{app_config => app}/lib/model/global_state.dart (98%) rename packages/{app_config => app}/lib/repository/app_state_repository.dart (95%) rename packages/{app_config => app}/pubspec.yaml (99%) rename packages/{app_config => app}/test/app_config_test.dart (100%) diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index 944643b2..7a0af6a9 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:storage/storage.dart'; diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 9b03759c..ee28fbc9 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart index 0770d45d..038ceb85 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_desk_navigation.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/code_gen/code_gen_page.dart'; diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/app/navigation/desk_ui/unit_rail_navigation.dart index bfe495cc..794b18fe 100644 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_rail_navigation.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; diff --git a/lib/app/navigation/home_drawer.dart b/lib/app/navigation/home_drawer.dart index c62be23b..76d68677 100644 --- a/lib/app/navigation/home_drawer.dart +++ b/lib/app/navigation/home_drawer.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/navigation/overlay_tool_wrapper.dart b/lib/app/navigation/overlay_tool_wrapper.dart index 027e0554..554519f5 100644 --- a/lib/app/navigation/overlay_tool_wrapper.dart +++ b/lib/app/navigation/overlay_tool_wrapper.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/navigation/pure_bottom_bar.dart b/lib/app/navigation/pure_bottom_bar.dart index b799b3e0..1b961591 100644 --- a/lib/app/navigation/pure_bottom_bar.dart +++ b/lib/app/navigation/pure_bottom_bar.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart index c10be2ca..bd1d7b4f 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/app/navigation/unit_navigation.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 4d3f505a..15f1e4be 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -2,7 +2,7 @@ import 'dart:io'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:authentication/authentication.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/navigation/unit_navigation.dart'; diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index 737f26c2..8a689014 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -1,7 +1,7 @@ /// create by 张风捷特烈 on 2020-04-13 /// contact me by email 1981462002@qq.com /// 说明: ... -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/views/time_line/flutter_unit_time_line.dart'; import 'package:components/toly_ui/toly_ui.dart'; diff --git a/lib/app/views/about/about_me_page.dart b/lib/app/views/about/about_me_page.dart index dcbd4b8e..721a9ea3 100644 --- a/lib/app/views/about/about_me_page.dart +++ b/lib/app/views/about/about_me_page.dart @@ -1,7 +1,7 @@ /// create by 张风捷特烈 on 2020-04-13 /// contact me by email 1981462002@qq.com /// 说明: ... -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:components/toly_ui/toly_ui.dart'; diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index 135df912..9be396b8 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -1,5 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index 46b9fe09..51bca2ca 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; - -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/app/views/setting/app_style_setting.dart b/lib/app/views/setting/app_style_setting.dart index bd2e9445..42c711b2 100644 --- a/lib/app/views/setting/app_style_setting.dart +++ b/lib/app/views/setting/app_style_setting.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/setting/code_style_setting.dart b/lib/app/views/setting/code_style_setting.dart index bd834719..5a9e7698 100644 --- a/lib/app/views/setting/code_style_setting.dart +++ b/lib/app/views/setting/code_style_setting.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart index 327f63d7..6baa7ab5 100644 --- a/lib/app/views/setting/font_setting.dart +++ b/lib/app/views/setting/font_setting.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/setting/item_style_setting.dart b/lib/app/views/setting/item_style_setting.dart index f543aadb..b2df855e 100644 --- a/lib/app/views/setting/item_style_setting.dart +++ b/lib/app/views/setting/item_style_setting.dart @@ -1,8 +1,7 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; /// create by 张风捷特烈 on 2020-04-10 diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index 572ca4df..7f7837cc 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/setting/theme_color_setting.dart b/lib/app/views/setting/theme_color_setting.dart index a917d743..9ed91dc5 100644 --- a/lib/app/views/setting/theme_color_setting.dart +++ b/lib/app/views/setting/theme_color_setting.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/splash/standard_unit_splash.dart b/lib/app/views/splash/standard_unit_splash.dart index 0b4d7841..14479cdb 100644 --- a/lib/app/views/splash/standard_unit_splash.dart +++ b/lib/app/views/splash/standard_unit_splash.dart @@ -1,7 +1,6 @@ import 'dart:math'; -import 'package:app_config/app_config.dart'; -import 'package:storage/storage.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/time_line/flutter_unit_time_line.dart b/lib/app/views/time_line/flutter_unit_time_line.dart index 5ec96824..3d85af34 100644 --- a/lib/app/views/time_line/flutter_unit_time_line.dart +++ b/lib/app/views/time_line/flutter_unit_time_line.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:dash_painter/dash_painter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/unit_todo/point_unit_page.dart b/lib/app/views/unit_todo/point_unit_page.dart index b0d5f5de..e0df03fd 100644 --- a/lib/app/views/unit_todo/point_unit_page.dart +++ b/lib/app/views/unit_todo/point_unit_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:components/toly_ui/toly_ui.dart'; diff --git a/lib/code_gen/icon_font_gen/gen_message_action.dart b/lib/code_gen/icon_font_gen/gen_message_action.dart index 8059423e..23070b67 100644 --- a/lib/code_gen/icon_font_gen/gen_message_action.dart +++ b/lib/code_gen/icon_font_gen/gen_message_action.dart @@ -1,5 +1,4 @@ - -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart index b6e2072e..6d87dc42 100644 --- a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart +++ b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as path; diff --git a/lib/painter_system/desk_ui/desk_gallery_unit.dart b/lib/painter_system/desk_ui/desk_gallery_unit.dart index 62b582bb..cceb5579 100644 --- a/lib/painter_system/desk_ui/desk_gallery_unit.dart +++ b/lib/painter_system/desk_ui/desk_gallery_unit.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:components/toly_ui/toly_ui.dart'; diff --git a/lib/point_system/api/app_info.dart b/lib/point_system/api/app_info.dart index b43de5e5..73201835 100644 --- a/lib/point_system/api/app_info.dart +++ b/lib/point_system/api/app_info.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:utils/utils.dart'; diff --git a/lib/point_system/api/category_api.dart b/lib/point_system/api/category_api.dart index 888f5c3a..9c6b34d2 100644 --- a/lib/point_system/api/category_api.dart +++ b/lib/point_system/api/category_api.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:utils/utils.dart'; diff --git a/lib/point_system/views/desk_ui/github_repo_panel.dart b/lib/point_system/views/desk_ui/github_repo_panel.dart index d36e9a81..654ac2a3 100644 --- a/lib/point_system/views/desk_ui/github_repo_panel.dart +++ b/lib/point_system/views/desk_ui/github_repo_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; diff --git a/lib/point_system/views/issues_point/issue_item.dart b/lib/point_system/views/issues_point/issue_item.dart index 0cb8f276..c32d3ad0 100644 --- a/lib/point_system/views/issues_point/issue_item.dart +++ b/lib/point_system/views/issues_point/issue_item.dart @@ -1,6 +1,6 @@ import 'dart:ui'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/utils/convert_man.dart'; diff --git a/lib/point_system/views/issues_point/issues_point_page.dart b/lib/point_system/views/issues_point/issues_point_page.dart index 0cd07104..34f2f569 100644 --- a/lib/point_system/views/issues_point/issues_point_page.dart +++ b/lib/point_system/views/issues_point/issues_point_page.dart @@ -1,9 +1,8 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:flutter_unit/app/router/unit_router.dart'; import 'package:flutter_unit/point_system/api/issues_api.dart'; import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; import 'package:flutter_unit/point_system/github_model/github_model.dart'; diff --git a/lib/point_system/views/issues_point/repo_widget.dart b/lib/point_system/views/issues_point/repo_widget.dart index 16c81151..57a45820 100644 --- a/lib/point_system/views/issues_point/repo_widget.dart +++ b/lib/point_system/views/issues_point/repo_widget.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/utils/convert_man.dart'; diff --git a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart b/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart index 089927d9..a2986f1d 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart +++ b/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart @@ -1,5 +1,4 @@ -import 'package:app_config/app/style/gap.dart'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart b/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart index 96688c40..5d2ff51d 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart +++ b/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/widget_ui/mobile/widget_detail/widget_detail_page.dart'; diff --git a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart b/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart index 585fa782..b52e2d09 100644 --- a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart +++ b/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart index b2ca5b4b..9bea765b 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart @@ -1,11 +1,10 @@ import 'dart:math'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; -import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/window_buttons.dart'; import 'package:utils/utils.dart'; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart index c01efc4f..6980a189 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart @@ -1,5 +1,4 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/widget_ui/mobile/widget_detail/category_end_drawer.dart'; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart b/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart index 6416e160..ab11b1a9 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart index fcb8241c..2a27f6c0 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart index c45a39fc..a116d2ed 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart b/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart index 10b75d4a..d3e10a54 100644 --- a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart +++ b/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/category_page/category_detail.dart b/lib/widget_ui/mobile/category_page/category_detail.dart index 4303eb77..7ce2dbc7 100644 --- a/lib/widget_ui/mobile/category_page/category_detail.dart +++ b/lib/widget_ui/mobile/category_page/category_detail.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widget_ui/mobile/category_page/category_page.dart b/lib/widget_ui/mobile/category_page/category_page.dart index 0c42fe78..52d6ebc9 100644 --- a/lib/widget_ui/mobile/category_page/category_page.dart +++ b/lib/widget_ui/mobile/category_page/category_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widget_ui/mobile/category_page/edit_category_panel.dart b/lib/widget_ui/mobile/category_page/edit_category_panel.dart index 53ef249f..93f71683 100644 --- a/lib/widget_ui/mobile/category_page/edit_category_panel.dart +++ b/lib/widget_ui/mobile/category_page/edit_category_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/category_page/empty_category.dart b/lib/widget_ui/mobile/category_page/empty_category.dart index 8ea1e14f..1be2de19 100644 --- a/lib/widget_ui/mobile/category_page/empty_category.dart +++ b/lib/widget_ui/mobile/category_page/empty_category.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/lib/widget_ui/mobile/category_page/like_widget_page.dart index 016f3afb..181c77da 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/lib/widget_ui/mobile/category_page/like_widget_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widget_ui/mobile/category_page/sync/async_button.dart b/lib/widget_ui/mobile/category_page/sync/async_button.dart index 0fcc48ce..dfb92cab 100644 --- a/lib/widget_ui/mobile/category_page/sync/async_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/async_button.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/category_page/sync/upload_button.dart b/lib/widget_ui/mobile/category_page/sync/upload_button.dart index 5022dc07..9bc701f0 100644 --- a/lib/widget_ui/mobile/category_page/sync/upload_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/upload_button.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/search_page/search_page.dart b/lib/widget_ui/mobile/search_page/search_page.dart index d5cbb20a..e7a4deb2 100644 --- a/lib/widget_ui/mobile/search_page/search_page.dart +++ b/lib/widget_ui/mobile/search_page/search_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/search_page/standard_search_bar.dart b/lib/widget_ui/mobile/search_page/standard_search_bar.dart index 31a0ee9b..591b401b 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_bar.dart +++ b/lib/widget_ui/mobile/search_page/standard_search_bar.dart @@ -1,5 +1,4 @@ -import 'package:app_config/app_config.dart'; -import 'package:storage/storage.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/widget_ui/mobile/search_page/standard_search_page.dart b/lib/widget_ui/mobile/search_page/standard_search_page.dart index 63b66d7a..60c28bf2 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_page.dart +++ b/lib/widget_ui/mobile/search_page/standard_search_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart b/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart index e3352110..1cb45181 100644 --- a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart +++ b/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart b/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart index e31b2e68..89febf5b 100644 --- a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart +++ b/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart index 7239fd61..f044834d 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart index 04c80e5a..c30a2885 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart @@ -1,5 +1,4 @@ -import 'package:app_config/app_config.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart b/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart index ee087c43..ed07ff19 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:share_plus/share_plus.dart'; diff --git a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart b/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart index 85fc149d..7d1f7a1d 100644 --- a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart +++ b/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index d74da9d9..ea3408db 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart index 47739ba5..336c70ce 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:components/toly_ui/toly_ui.dart'; diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart index 42c0c66c..26acf3a7 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; diff --git a/packages/app_config/.gitignore b/packages/app/.gitignore similarity index 100% rename from packages/app_config/.gitignore rename to packages/app/.gitignore diff --git a/packages/app_config/.metadata b/packages/app/.metadata similarity index 100% rename from packages/app_config/.metadata rename to packages/app/.metadata diff --git a/packages/app_config/CHANGELOG.md b/packages/app/CHANGELOG.md similarity index 100% rename from packages/app_config/CHANGELOG.md rename to packages/app/CHANGELOG.md diff --git a/packages/app_config/LICENSE b/packages/app/LICENSE similarity index 100% rename from packages/app_config/LICENSE rename to packages/app/LICENSE diff --git a/packages/app_config/README.md b/packages/app/README.md similarity index 100% rename from packages/app_config/README.md rename to packages/app/README.md diff --git a/packages/app_config/analysis_options.yaml b/packages/app/analysis_options.yaml similarity index 100% rename from packages/app_config/analysis_options.yaml rename to packages/app/analysis_options.yaml diff --git a/packages/app_config/lib/app_config.dart b/packages/app/lib/app.dart similarity index 97% rename from packages/app_config/lib/app_config.dart rename to packages/app/lib/app.dart index ceb479ef..24662f95 100644 --- a/packages/app_config/lib/app_config.dart +++ b/packages/app/lib/app.dart @@ -1,4 +1,4 @@ -library app_config; +library app; export 'bloc/global_bloc.dart'; export 'model/global_state.dart'; diff --git a/packages/app_config/lib/app/cons/cons.dart b/packages/app/lib/app/cons/cons.dart similarity index 100% rename from packages/app_config/lib/app/cons/cons.dart rename to packages/app/lib/app/cons/cons.dart diff --git a/packages/app_config/lib/app/cons/global_value.dart b/packages/app/lib/app/cons/global_value.dart similarity index 100% rename from packages/app_config/lib/app/cons/global_value.dart rename to packages/app/lib/app/cons/global_value.dart diff --git a/packages/app_config/lib/app/cons/path_unit.dart b/packages/app/lib/app/cons/path_unit.dart similarity index 100% rename from packages/app_config/lib/app/cons/path_unit.dart rename to packages/app/lib/app/cons/path_unit.dart diff --git a/packages/app_config/lib/app/cons/sp.dart b/packages/app/lib/app/cons/sp.dart similarity index 100% rename from packages/app_config/lib/app/cons/sp.dart rename to packages/app/lib/app/cons/sp.dart diff --git a/packages/app_config/lib/app/cons/str_unit.dart b/packages/app/lib/app/cons/str_unit.dart similarity index 100% rename from packages/app_config/lib/app/cons/str_unit.dart rename to packages/app/lib/app/cons/str_unit.dart diff --git a/packages/app_config/lib/app/res/toly_icon.dart b/packages/app/lib/app/res/toly_icon.dart similarity index 100% rename from packages/app_config/lib/app/res/toly_icon.dart rename to packages/app/lib/app/res/toly_icon.dart diff --git a/packages/app_config/lib/app/router/router_utils.dart b/packages/app/lib/app/router/router_utils.dart similarity index 100% rename from packages/app_config/lib/app/router/router_utils.dart rename to packages/app/lib/app/router/router_utils.dart diff --git a/packages/app_config/lib/app/router/unit_router.dart b/packages/app/lib/app/router/unit_router.dart similarity index 100% rename from packages/app_config/lib/app/router/unit_router.dart rename to packages/app/lib/app/router/unit_router.dart diff --git a/packages/app_config/lib/app/style/behavior/no_scroll_behavior.dart b/packages/app/lib/app/style/behavior/no_scroll_behavior.dart similarity index 100% rename from packages/app_config/lib/app/style/behavior/no_scroll_behavior.dart rename to packages/app/lib/app/style/behavior/no_scroll_behavior.dart diff --git a/packages/app_config/lib/app/style/gap.dart b/packages/app/lib/app/style/gap.dart similarity index 100% rename from packages/app_config/lib/app/style/gap.dart rename to packages/app/lib/app/style/gap.dart diff --git a/packages/app_config/lib/app/style/shape/coupon_shape_border.dart b/packages/app/lib/app/style/shape/coupon_shape_border.dart similarity index 100% rename from packages/app_config/lib/app/style/shape/coupon_shape_border.dart rename to packages/app/lib/app/style/shape/coupon_shape_border.dart diff --git a/packages/app_config/lib/app/style/shape/techno_shape.dart b/packages/app/lib/app/style/shape/techno_shape.dart similarity index 100% rename from packages/app_config/lib/app/style/shape/techno_shape.dart rename to packages/app/lib/app/style/shape/techno_shape.dart diff --git a/packages/app_config/lib/app/style/unit_color.dart b/packages/app/lib/app/style/unit_color.dart similarity index 100% rename from packages/app_config/lib/app/style/unit_color.dart rename to packages/app/lib/app/style/unit_color.dart diff --git a/packages/app_config/lib/app/style/unit_text_style.dart b/packages/app/lib/app/style/unit_text_style.dart similarity index 100% rename from packages/app_config/lib/app/style/unit_text_style.dart rename to packages/app/lib/app/style/unit_text_style.dart diff --git a/packages/app_config/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart similarity index 97% rename from packages/app_config/lib/app/theme/app_theme.dart rename to packages/app/lib/app/theme/app_theme.dart index fe1b5a2e..5128f317 100644 --- a/packages/app_config/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/app_config/lib/app/theme/size_unit.dart b/packages/app/lib/app/theme/size_unit.dart similarity index 100% rename from packages/app_config/lib/app/theme/size_unit.dart rename to packages/app/lib/app/theme/size_unit.dart diff --git a/packages/app_config/lib/bloc/global_bloc.dart b/packages/app/lib/bloc/global_bloc.dart similarity index 100% rename from packages/app_config/lib/bloc/global_bloc.dart rename to packages/app/lib/bloc/global_bloc.dart diff --git a/packages/app_config/lib/bloc/update/bloc.dart b/packages/app/lib/bloc/update/bloc.dart similarity index 100% rename from packages/app_config/lib/bloc/update/bloc.dart rename to packages/app/lib/bloc/update/bloc.dart diff --git a/packages/app_config/lib/bloc/update/event.dart b/packages/app/lib/bloc/update/event.dart similarity index 100% rename from packages/app_config/lib/bloc/update/event.dart rename to packages/app/lib/bloc/update/event.dart diff --git a/packages/app_config/lib/bloc/update/state.dart b/packages/app/lib/bloc/update/state.dart similarity index 100% rename from packages/app_config/lib/bloc/update/state.dart rename to packages/app/lib/bloc/update/state.dart diff --git a/packages/app_config/lib/model/app_style.dart b/packages/app/lib/model/app_style.dart similarity index 100% rename from packages/app_config/lib/model/app_style.dart rename to packages/app/lib/model/app_style.dart diff --git a/packages/app_config/lib/model/global_state.dart b/packages/app/lib/model/global_state.dart similarity index 98% rename from packages/app_config/lib/model/global_state.dart rename to packages/app/lib/model/global_state.dart index 04911e1d..17f0e07d 100644 --- a/packages/app_config/lib/model/global_state.dart +++ b/packages/app/lib/model/global_state.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app/cons/cons.dart'; +import 'package:app/app/cons/cons.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; diff --git a/packages/app_config/lib/repository/app_state_repository.dart b/packages/app/lib/repository/app_state_repository.dart similarity index 95% rename from packages/app_config/lib/repository/app_state_repository.dart rename to packages/app/lib/repository/app_state_repository.dart index 1e095842..fa96dd19 100644 --- a/packages/app_config/lib/repository/app_state_repository.dart +++ b/packages/app/lib/repository/app_state_repository.dart @@ -1,8 +1,8 @@ import 'dart:convert'; import 'dart:io'; -import 'package:app_config/model/global_state.dart'; -import 'package:app_config/model/app_style.dart'; +import 'package:app/model/global_state.dart'; +import 'package:app/model/app_style.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/app_config/pubspec.yaml b/packages/app/pubspec.yaml similarity index 99% rename from packages/app_config/pubspec.yaml rename to packages/app/pubspec.yaml index cdbcced9..d1450046 100644 --- a/packages/app_config/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -1,4 +1,4 @@ -name: app_config +name: app description: A new Flutter package project. version: 0.0.1 homepage: diff --git a/packages/app_config/test/app_config_test.dart b/packages/app/test/app_config_test.dart similarity index 100% rename from packages/app_config/test/app_config_test.dart rename to packages/app/test/app_config_test.dart diff --git a/packages/app_update/lib/model/app_info.dart b/packages/app_update/lib/model/app_info.dart index 6856a271..0d077240 100644 --- a/packages/app_update/lib/model/app_info.dart +++ b/packages/app_update/lib/model/app_info.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:utils/utils.dart'; diff --git a/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml index 4da42e73..2b6f4573 100644 --- a/packages/app_update/pubspec.yaml +++ b/packages/app_update/pubspec.yaml @@ -17,8 +17,8 @@ dependencies: package_info_plus: ^4.0.1 utils: path: ../utils - app_config: - path: ../app_config + app: + path: ../app dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/authentication/lib/blocs/authentic/bloc.dart b/packages/authentication/lib/blocs/authentic/bloc.dart index bee1f551..771b671e 100644 --- a/packages/authentication/lib/blocs/authentic/bloc.dart +++ b/packages/authentication/lib/blocs/authentic/bloc.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:authentication/authentication.dart'; import 'package:authentication/models/user.dart'; import 'package:bloc/bloc.dart'; diff --git a/packages/authentication/lib/views/mobile/login/login_form.dart b/packages/authentication/lib/views/mobile/login/login_form.dart index 91aa2b2e..cb67d380 100644 --- a/packages/authentication/lib/views/mobile/login/login_form.dart +++ b/packages/authentication/lib/views/mobile/login/login_form.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 5c269e9b..366cbecd 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:app_update/views/update_red_point.dart'; import 'package:flutter/material.dart'; diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/packages/authentication/lib/views/mobile/user/user_page.dart index f2dfcc4c..b4204958 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/packages/authentication/lib/views/mobile/user/user_page.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index 22d2ed09..858418b5 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -17,8 +17,8 @@ dependencies: path: ../utils app_update: path: ../app_update - app_config: - path: ../app_config + app: + path: ../app dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart b/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart index 46055f45..456bf57b 100644 --- a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart +++ b/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart @@ -1,6 +1,7 @@ import 'dart:ui'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:bloc/bloc.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart index 6200a0df..ecef73c9 100644 --- a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart +++ b/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart b/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart index 95cc2313..a0410819 100644 --- a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart +++ b/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart @@ -1,6 +1,7 @@ import 'dart:math'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart index 727901ed..22d99285 100644 --- a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart +++ b/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart index a1d16177..5a02ffdb 100644 --- a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart +++ b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart index f42e54f1..86d62ef6 100644 --- a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart +++ b/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart b/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart index 489d9342..d054127c 100644 --- a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart +++ b/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart @@ -1,5 +1,6 @@ import 'dart:async'; -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:flutter/material.dart'; class SplashBottom extends StatefulWidget { diff --git a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart index 158ecdb1..92acb25c 100644 --- a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart +++ b/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart index c63fa659..9262f24b 100644 --- a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart +++ b/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart index 1247a6b4..002ea459 100644 --- a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart +++ b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart @@ -1,6 +1,6 @@ import 'dart:math'; +import 'package:app/app.dart'; -import 'package:app_config/app_config.dart'; import 'package:flutter/material.dart'; import 'package:widget_repository/widget_repository.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart index b45cbe5d..016645ab 100644 --- a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart +++ b/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart @@ -1,4 +1,5 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; + import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart index 9b28f14e..4ecaa119 100644 --- a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart +++ b/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/old_fancy_mobile_ui/pubspec.yaml b/packages/old_fancy_mobile_ui/pubspec.yaml index 98b5fb68..f691a2ca 100644 --- a/packages/old_fancy_mobile_ui/pubspec.yaml +++ b/packages/old_fancy_mobile_ui/pubspec.yaml @@ -14,8 +14,8 @@ dependencies: flutter_bloc: ^8.0.1 # 状态管理 url_launcher: ^6.0.20 # url flutter_star: ^1.0.2 # 星星组件 - app_config: - path: ../app_config + app: + path: ../app components: path: ../components widget_module: diff --git a/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart b/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart index 42b415b1..30d3bf96 100644 --- a/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart +++ b/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 diff --git a/packages/widgets/lib/utils/dialog_about.dart b/packages/widgets/lib/utils/dialog_about.dart index 3cd5bd5e..c20a42a1 100644 --- a/packages/widgets/lib/utils/dialog_about.dart +++ b/packages/widgets/lib/utils/dialog_about.dart @@ -1,4 +1,4 @@ -import 'package:app_config/app_config.dart'; +import 'package:app/app.dart'; import 'package:flutter/material.dart'; class DialogAbout extends StatelessWidget { diff --git a/packages/widgets/pubspec.yaml b/packages/widgets/pubspec.yaml index 361b49e0..765207f8 100644 --- a/packages/widgets/pubspec.yaml +++ b/packages/widgets/pubspec.yaml @@ -12,8 +12,8 @@ dependencies: sdk: flutter path_provider: ^2.0.11 # 路径 intl: ^0.18.0 - app_config: - path: ../app_config + app: + path: ../app components: path: ../components diff --git a/pubspec.lock b/pubspec.lock index 001a9f81..3dd921b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,10 +1,10 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - app_config: + app: dependency: "direct main" description: - path: "packages/app_config" + path: "packages/app" relative: true source: path version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 660a53ce..fdc44ec1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,8 +57,8 @@ dependencies: path: packages/widgets authentication: path: packages/authentication - app_config: - path: packages/app_config + app: + path: packages/app app_update: path: packages/app_update components: From 23ab4d532465da4bc7dc0206c15d2cbe1d5a3241 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 20 Jun 2023 08:13:49 +0800 Subject: [PATCH 016/149] =?UTF-8?q?=E6=94=B6=E5=BD=95=20RawMagnifier=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 1138688 -> 1146880 bytes .../RawMagnifier/node1_base.dart | 87 ++++++++++++ .../RawMagnifier/node2_shape.dart | 124 ++++++++++++++++++ packages/widgets/lib/exp/stateless_unit.dart | 2 + packages/widgets/lib/widgets_map.dart | 54 +++++--- 5 files changed, 248 insertions(+), 19 deletions(-) create mode 100644 packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart diff --git a/assets/flutter.db b/assets/flutter.db index b1545c3d9f3dd2999f4ff2cdb2348b32595b39cd..fc8b0c9c253de30c1e0a13f7fb07e5d42823461c 100644 GIT binary patch delta 4709 zcmeHLdr(u^8PB=*CV`s=_wo?d7ndp!B!nbjBG`zcxNfT}79ESaU?dlkHIQr)L}V?2 zfK*pRjCxkx)p6Y|b+>|w^{A|`-Rbs^PPe)-{W__^PMj@c<)qry{iw;5ib{sKt?}T29{siexz*nXEH#(M6}o}4ZH_f z#UhdDZ}bqBAY)j*{7XR5zodtTvnm%#hvl!F0~;}r?yJCZmaiPkG@sxu)wc}G6yH)T zlYL9DWPQb0GCn<)Nj@!>N?!q%3g03u<-S}jWxi}IY2U(O@`vjc8bg6zyHUHORI4r3 z8#F~l#fBwDy;fgTppA$4y+8hGjEUY*QWW1rK>UX4_81eLq2xJH1jIjDy=$h4zQm}F zA0>?Vd$zn8V`4Pwv~h{)1;nr08nYL@!Kf>aZz3T6(AMslD8)v-F20F?_)l(oE5<}` z#J};9tQQb})oZa)w8o<6Y+pe9lA52)jG`+s78&A32_yc?HSQP_qp>*t_H_c{uc~b? zm{AtGV&mfY!~|scKegg}03bh0aI^YG(? z5#{m0TcMkS=TwnFJ9fG&IC5jcJ2HN&KXCJQ=;+V6>HLNGgQr7>E@D!_ zclM1B90{E{kK;!uOfvmJczZbDbgGlwyd4v7UkTp4B(OdEQLwvveE((PIqWOgdmwnL zYdYnghg|><0zK>^(`AxJBDs`$gp(YkzPA3%OcUXERu5`E3E1^xYNvYLYP z8l_g)`h-mG866|>pzsjmA;Ck6M*<#+c+hyr(CCDk5j|I85nc9YRlbh~?AU-4 zX|_n3jV^%GvN zXtF$2!H@AYHaRV35C2ptGK;6T(%e+X+XX#Z2p*Y2-4;3>Zl5EW4bKcql#1NEyeV5~ zo~=v=YPh0}$%M`kAclWABd3!DhPHZDt=sBo$y3lU>vLHu9F#Kbd^=z7!2v8TbHmHL z+tcjgD;;i|P>dSOZZ*tWt4w+6d3Y;4yOWqNiyne14{nf))j87^!bibzE*^VsdZyK> zAa|ag1(|$>Br$4md{~kWP3I{oeDfTohIdjF$+Vio?@AtPDW``WQt@nfZ!SgGxbfMQ zK6|jyBor2MGw(+!$3?Dysz8U&TRWAp$=aB9|4O+cc>fegt&Ld3%?)Ro^rzXwyBte} zBG}<@*tu|mF<5W5yLr4U0J|JE%e0D7t-`4m$_SqI(;4mYGLIctc#qj;cWdmCiyk?V zg2_Eha^_t^1#80DDb%Zpr@AaLKPg4;4>iSV0;L^ABX zpp+|dmEoEVbHsnc6ycqJ({jeNEb1b>IrxU3P7~B4)f={ecU$QB=KuMQ;D$_Gy;06| z^k%5w-63(>!kJVfDcGx^_bPR2x?y5#>+m!zjYTBkasDve5pzax~1@E7s~`HPMi{uc3~BjPST zvm?efZ$!x~B{nOAAXua%rLEKOW^rpnW3+@4lDZ-P!Y zmAXKqsdLyJF4Iaux-~oO&Ag!Ca_rYp&b5`(2kO|St8C`D`{`z{Ge z(2$&!OTjYqaSFSa0wz?N!R8R)`^Y?-{g(_ZN857PY6_I0tBY8#1e7DAj{QaoR-gqX lY$XjUkY^?Pni#A?U#wvtl3*qJWG%Z#0ahc^7WPx|e*tU{OpX8m delta 1445 zcmZ{ieQXnT7{~AF_3qkhZ@pg`LzL*s+!*UN?%Lk9Wfrl^tX_J?J#7fZ*B2qR24 z@P)D)%$Gpi&g4Y1Wcr7RF^tHjPa+x>)Pz4Y!$iU~y2SAknMtG3Xb47sUHrqW?IquD z?(UQC^L_5}%Vb(JpKg5R4z7V=plq}}4h`>hkHv5Q+y(4P+rX~vJJS8o%P|b|i+Gkg zlufytFT<2CQ7xeRB%Fr(>C5HD2I{3oGxcRg6LqhV8%T^Ob=lCVdyD|}5<{Ub8THiN zhM&62sHQF&l~e44o27cSE)Z^4)mSJL3+VOHU`W$~0VNQuQwk9?^Vkb{k)WpOg(Ep) z>dC`-5mnQRwB(36pL{wmqG)=!a7&JuBU_$b8VN+SaN(9kVyYc^-xAQZh*Gd+k(k#z zj^?$5v`FE_0y$#7zV+q2NKlIwX~_|@ZCieeszr;m_Vc$<#kx+zfk)O;~~go2*9_=*DRUp0Sxqq7oB9n0|=$ z*t3?9fxGA#zhEE94g-}9v%~BP7k`y;3-+s&%-Y?PE7m(1TN?~cVzw=OJ%3xsCX)Y%0cC%5~*A`f6ZO-vtyDG zSMlA!?~>QE=wM(W{%pz*Ln6M4jst}&+iwJ%gAv%_;BN}d`p7W*fJ(}%20uCz9k>=LM2wbFW2yJ zH$Hq;KF2{dlF#G=Hdup4&&zHes&MRrTqb}Y-O1S>obA z#c>Dmh@j&sFS%j^4ab&~cUcHw(@L_2g&_8>B42P2#oE>63J(z^YsokZVLV+++yXS< zM?vzO9oAzkLaJ;K!=4zq>4GNQ+DejkXv7a5AQ>K-G5iQw5Fm~fNs=^kz1Vn&oag=pmR^rN diff --git a/packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart b/packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart new file mode 100644 index 00000000..a03e40fb --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 360, +// "priority": 1, +// "name": "RawMagnifier 的简单使用", +// "subtitle": "【size】 : 尺寸 【Size】\n" +// "【magnificationScale】 : 放大倍率 【double】\n" +// "【focalPointOffset】: 放大内容偏移量 【Offset】\n" +// "【decoration】: 发现装饰 【MagnifierDecoration】\n" +// "【child】: 子组件 【Widget?】\n", +// } +class MagnifierCircleShape extends StatefulWidget{ + + const MagnifierCircleShape({super.key}); + + @override + State createState() => _MagnifierCircleShapeState(); +} + +class _MagnifierCircleShapeState extends State { + final Size magnifierSize = const Size(150, 150); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + GestureDetector( + onPanDown: _onPanDown, + onPanEnd: _onPanEnd, + onPanUpdate: _onPanUpdate, + onPanCancel: _onPanCancel, + child: Image.asset('assets/images/sabar_bar.webp')), + Text("张风捷特烈",style: TextStyle(color: Colors.white),), + if(_show) + Positioned( + left: _dragGesturePosition.dx, + top: _dragGesturePosition.dy, + child: _buildMagnifier()), + ], + ); + } + + Widget _buildMagnifier(){ + return RawMagnifier( + decoration: const MagnifierDecoration( + shape: CircleBorder( + side: BorderSide(color: Colors.blue, width: 2), + ), + ), + size: magnifierSize, + // focalPointOffset: Offset(-10, 0), + magnificationScale: 3, + ); + } + + Offset _dragGesturePosition = Offset.zero; + bool _show = false; + + void _onPanDown(DragDownDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + _show = true; + setState(() { + + }); + } + + void _onPanEnd(DragEndDetails details) { + setState(() => _show = false); + } + + void _onPanUpdate(DragUpdateDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + setState(() { + + }); + } + + void _onPanCancel() { + setState(() => _show = false); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart b/packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart new file mode 100644 index 00000000..b3ce9b23 --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart @@ -0,0 +1,124 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-22 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 360, +// "priority": 2, +// "name": "RawMagnifier 自定义装饰形状", +// "subtitle": "这里自定义五角星装饰形状", +// } +class MagnifierStarShape extends StatefulWidget{ + + const MagnifierStarShape({super.key}); + + @override + State createState() => _MagnifierStarShapeState(); +} + +class _MagnifierStarShapeState extends State { + final Size magnifierSize = const Size(150, 150); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + GestureDetector( + onPanDown: _onPanDown, + onPanEnd: _onPanEnd, + onPanUpdate: _onPanUpdate, + onPanCancel: _onPanCancel, + child: Image.asset('assets/images/sabar_bar.webp')), + Text("张风捷特烈",style: TextStyle(color: Colors.white),), + if(_show) + Positioned( + left: _dragGesturePosition.dx, + top: _dragGesturePosition.dy, + child: _buildMagnifier()), + ], + ); + } + + Widget _buildMagnifier(){ + return RawMagnifier( + decoration: MagnifierDecoration( + shape: _StarShapeBorder(), + ), + size: magnifierSize, + // focalPointOffset: Offset(-10, 0), + magnificationScale: 3, + ); + } + + Offset _dragGesturePosition = Offset.zero; + bool _show = false; + + void _onPanDown(DragDownDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + _show = true; + setState(() { + + }); + } + + void _onPanEnd(DragEndDetails details) { + setState(() => _show = false); + } + + void _onPanUpdate(DragUpdateDetails details) { + _dragGesturePosition = details.localPosition-Offset(magnifierSize.width/2,magnifierSize.height/2); + setState(() { + + }); + } + + void _onPanCancel() { + setState(() => _show = false); + } +} + +class _StarShapeBorder extends ShapeBorder { + final Path _path = Path(); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.zero; + + @override + Path getInnerPath(Rect rect, {TextDirection? textDirection}) { + return Path(); + } + + @override + Path getOuterPath(Rect rect, {TextDirection? textDirection}) => + nStarPath(5, rect.height / 2, rect.height / 2 * 0.5, + dx: rect.width / 2, dy: rect.height / 2); + + @override + void paint(Canvas canvas, Rect rect, {TextDirection? textDirection}) { + Paint paint = Paint()..style=PaintingStyle.stroke..color=Colors.blue..strokeWidth =2; + canvas.drawPath(getOuterPath(rect), paint); + } + + Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) { + double perRad = 2 * pi / num; + double radA = perRad / 2 / 2; + double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA; + _path.moveTo(cos(radA) * R + dx, -sin(radA) * R + dy); + for (int i = 0; i < num; i++) { + _path.lineTo( + cos(radA + perRad * i) * R + dx, -sin(radA + perRad * i) * R + dy); + _path.lineTo( + cos(radB + perRad * i) * r + dx, -sin(radB + perRad * i) * r + dy); + } + _path.close(); + return _path; + } + + @override + ShapeBorder scale(double t) => this; +} \ No newline at end of file diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/packages/widgets/lib/exp/stateless_unit.dart index 0b1d2344..a3e79f60 100644 --- a/packages/widgets/lib/exp/stateless_unit.dart +++ b/packages/widgets/lib/exp/stateless_unit.dart @@ -197,5 +197,7 @@ export '../StatelessWidget/NotificationListener/node2_update.dart'; export '../StatelessWidget/Autocomplete/node1_base.dart'; export '../StatelessWidget/Autocomplete/node2_type.dart'; +export '../StatelessWidget/RawMagnifier/node1_base.dart'; +export '../StatelessWidget/RawMagnifier/node2_shape.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index 77afdf1c..e7868270 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -33,16 +33,13 @@ class WidgetsMap { const ImageFilteredMatrix() ]; case "Autocomplete": - return [ - const AutocompleteDemo(), - const AutocompleteType() - ]; - case "Badge": + return [const AutocompleteDemo(), const AutocompleteType()]; + case "Badge": return [ const BadgeDemo(), const BadgeVisibleDemo(), ]; - case "DateRangePickerDialog": + case "DateRangePickerDialog": return [ const DateRangePickerDialogDemo(), const DiyDateRangePickerDialogDemo() @@ -116,7 +113,8 @@ class WidgetsMap { case "ShrinkWrappingViewport": return [ const ShrinkWrappingViewportDemo(), - ]; case "NestedScrollViewViewport": + ]; + case "NestedScrollViewViewport": return [ const NestedScrollViewViewportDemo(), ]; @@ -268,7 +266,10 @@ class WidgetsMap { const PageStorageDemo(), ]; case "NotificationListener": - return [const NotificationListenerDemo(), const NotificationListenerUpdate()]; + return [ + const NotificationListenerDemo(), + const NotificationListenerUpdate() + ]; case "Scrollable": return [ @@ -443,7 +444,11 @@ class WidgetsMap { case "ChipTheme": return [const ChipThemeDemo()]; case "ListTile": - return [const CustomListTile(), const SelectListTile(), const DenseListTile()]; + return [ + const CustomListTile(), + const SelectListTile(), + const DenseListTile() + ]; case "CheckboxListTile": return [ const CustomCheckBoxListTile(), @@ -1382,13 +1387,19 @@ class WidgetsMap { const CustomSingleChildLayoutDemo(), const OffSetWidgetDemo(), ]; - case "NavigationRail": + case "NavigationRail": + return [ + const AnotherPage(child: CustomNavigationRail()), + const AnotherPage(child: ExtendableNavigationRail()), + const AnotherPage(child: DarkNavigationRail()), + ]; + case "RawMagnifier": return [ - const AnotherPage(child: CustomNavigationRail()), - const AnotherPage(child: ExtendableNavigationRail()), - const AnotherPage(child: DarkNavigationRail()), + const MagnifierCircleShape(), + const MagnifierStarShape(), ]; - default: return []; + default: + return []; } } } @@ -1399,10 +1410,15 @@ class AnotherPage extends StatelessWidget { @override Widget build(BuildContext context) { - return ElevatedButton(onPressed: (){ - Navigator.of(context).push(MaterialPageRoute(builder: (_)=>Scaffold( - appBar: AppBar(leading: const BackButton(),), - body: child))); - }, child: Text('跳转到新界面查看效果')); + return ElevatedButton( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + appBar: AppBar( + leading: const BackButton(), + ), + body: child))); + }, + child: Text('跳转到新界面查看效果')); } } From 1fd27093aa15cedbbe6afa80d4211ba937998284 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 22 Jun 2023 20:36:04 +0800 Subject: [PATCH 017/149] =?UTF-8?q?=E6=9A=97=E9=BB=91=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 241968 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 1271 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 2013 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 3012 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 1553 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 2869 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 4223 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 2013 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 3808 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 5667 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 5667 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 8306 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 3666 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 6901 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 7859 bytes lib/app/flutter_unit.dart | 44 +- lib/app/navigation/home_drawer.dart | 4 +- lib/app/navigation/pure_bottom_bar.dart | 7 +- lib/app/navigation/unit_navigation.dart | 67 +-- lib/app/router/unit_router.dart | 10 +- lib/app/views/setting/app_style_setting.dart | 30 +- lib/app/views/setting/code_style_setting.dart | 3 +- lib/app/views/setting/font_setting.dart | 9 +- lib/app/views/setting/item_style_setting.dart | 117 +++--- lib/app/views/setting/setting_page.dart | 100 +++-- .../views/setting/theme_model_setting.dart | 66 +++ .../app/views}/splash/flutter_unit_text.dart | 0 .../views/splash/standard_unit_splash.dart | 3 +- .../desk_ui/desk_gallery_unit.dart | 6 +- lib/painter_system/gallery_unit.dart | 6 +- .../mobile/category_page/category_detail.dart | 50 ++- .../category_page/category_list_item.dart | 75 ++-- .../mobile/category_page/category_page.dart | 17 +- .../mobile/category_page/collect_page.dart | 16 +- .../category_page/edit_category_panel.dart | 4 +- .../category_page/home_right_drawer.dart | 5 +- .../category_page/like_widget_page.dart | 4 +- .../mobile/search_page/search_page.dart | 338 ++++++++-------- .../search_page/standard_search_bar.dart | 9 +- .../search_page/standard_search_page.dart | 4 +- .../collect_widget_list_item.dart | 94 +++-- .../widget_detail/widget_detail_bar.dart | 16 +- .../widget_detail/widget_detail_page.dart | 2 + .../widget_detail/widget_detail_panel.dart | 2 +- .../widget_detail/widget_node_panel.dart | 2 +- .../widget_panel/standard_home_page.dart | 22 +- .../widget_panel/standard_home_search.dart | 8 +- .../widget_panel/widget_model_item.dart | 46 ++- packages/app/lib/app/cons/cons.dart | 4 - packages/app/lib/app/style/gap.dart | 2 +- packages/app/lib/app/theme/app_theme.dart | 65 ++- packages/app/lib/bloc/global_bloc.dart | 6 +- packages/app/lib/model/app_style.dart | 4 - packages/app/lib/model/global_state.dart | 24 +- .../lib/views/mobile/user/page_item.dart | 9 +- .../lib/views/mobile/user/user_page.dart | 12 +- .../lib/toly_ui/input/input_button.dart | 4 +- .../lib/toly_ui/ti/toly_switch_list_tile.dart | 383 ++++++++++++++++++ packages/components/lib/toly_ui/toly_ui.dart | 1 + packages/old_fancy_mobile_ui/.gitignore | 30 -- packages/old_fancy_mobile_ui/.metadata | 10 - packages/old_fancy_mobile_ui/CHANGELOG.md | 3 - packages/old_fancy_mobile_ui/LICENSE | 1 - packages/old_fancy_mobile_ui/README.md | 39 -- .../old_fancy_mobile_ui/analysis_options.yaml | 4 - .../lib/bloc/color_change_bloc.dart | 31 -- .../lib/home_page/background.dart | 22 - .../lib/home_page/desk_widget_content.dart | 78 ---- .../lib/home_page/fancy_home_page.dart | 147 ------- .../lib/home_page/phone_widget_content.dart | 51 --- .../lib/home_page/toly_app_bar.dart | 215 ---------- .../lib/home_page/unit_bottom_bar.dart | 202 --------- .../lib/old_fancy_mobile_ui.dart | 18 - .../lib/splash/flutter_unit_splash.dart | 47 --- .../lib/splash/splash_bottom.dart | 50 --- .../lib/splash/unit_paint.dart | 116 ------ .../lib/splash/unit_splash.dart | 174 -------- .../widget_item/coupon_widget_list_item.dart | 149 ------- .../lib/widget_item/home_item_support.dart | 83 ---- .../widget_item/simple_widget_list_item.dart | 146 ------- .../widget_item/techno_widget_list_item.dart | 147 ------- packages/old_fancy_mobile_ui/pubspec.yaml | 65 --- .../test/old_fancy_mobile_ui_test.dart | 12 - .../src/sp_storage/models/app_config_po.dart | 8 +- .../lib/src/model/category_model.dart | 2 +- pubspec.lock | 7 - pubspec.yaml | 4 +- 87 files changed, 1088 insertions(+), 2473 deletions(-) create mode 100644 lib/app/views/setting/theme_model_setting.dart rename {packages/old_fancy_mobile_ui/lib => lib/app/views}/splash/flutter_unit_text.dart (100%) create mode 100644 packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart delete mode 100644 packages/old_fancy_mobile_ui/.gitignore delete mode 100644 packages/old_fancy_mobile_ui/.metadata delete mode 100644 packages/old_fancy_mobile_ui/CHANGELOG.md delete mode 100644 packages/old_fancy_mobile_ui/LICENSE delete mode 100644 packages/old_fancy_mobile_ui/README.md delete mode 100644 packages/old_fancy_mobile_ui/analysis_options.yaml delete mode 100644 packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/background.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart delete mode 100644 packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart delete mode 100644 packages/old_fancy_mobile_ui/pubspec.yaml delete mode 100644 packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada4725e9b0ddb1deab583e5b5102493aa332..eba2268a942c8a3b6275e0656e0f8bad212c6ffb 100644 GIT binary patch literal 241968 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ʚcWne)06oFnH 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 literal 10932 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b0bca859a3f474b03065bef75ba58a9e4c..aa08c6dd9aabe4c61f0e40e165702316582ca1f8 100644 GIT binary patch literal 3012 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 I*4X;+FG(BE)Bpeg 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>0000{qDKBBVhA@F5g3Kn)8K^9C;v!BR^f1OZMVK}H;bN~e-w(&;oh zi^*oQm@F3C+RmD7WoyM^*$_6ib{r1DVOw+Uxg2}MIiv|j?!>7~w2@=QvO?Ma2}?5& zOmGEP9CHH-f#C#Z`5Bzhb5rntZ%VFAIs>RIRPy8i1*4MZ;80TY^FU= zj`BhRFbWOX{NsWCFNHuhvqeDX1}N>rD|v1L@6DDw zV2z_z2%G?a*f>!-<{s52y>QKIUrm_>JSnkt7qd+b?15p-r^?+q$M+sj@A1=R+vlFg z7n?HHjjK!UF1+Bk^5m#Td2qpZ55gmkN_5)rPuKy@Bi)V{*Hx@v(t6e@r%80o<4DCh zh4c1@IRkT5Apyb-a{l5vUy(xQH%7TU9=4+9$6t1ss+L{pNQmvL;2E;-RO$~&b%zvA z$>rj;(9ADlN#?2Q1l@fl>$BE4B@2IDb#7H2F4(iEXI4|X+tSIX)U-$PdE0Q#N6-Ai zY9nJ?GCMS$CqyM{8oYK*X89YIj8tC|PDbu2jXXXWaelQ#ki^y(hSI%u4TVJ1ccs6i zb@r_o?0r?azw3UZ@~P)*U2RRWLx1_!SHG+L>t{e|Lb}c4Guss1U8-J>^2dU)vKHB8 znWDb1IxpncWYIfdoy0$y(BgKkeu$mHf(E|dl};kqPeY|TXz-P z(8~I)%WJ5)hV|UP-CPv-Ct1&iWp92!bro0NXSuxkSjUSn$ z^EcEb4rJtYHMn&i3n=YpAjCS=tZt@>~SoNs;dSh$*_M<7*`Fhzv zY1hqjHnaSVcF%8=r7CX;&9}m&^GD>>o}z>~#glP@kD)WI-h8YnnyI^^i|; z_U2Ks>4{@|;4=qWk5A3XzZ%9wBjSU5HP=qnVeF`U0|jn)w7u3AytvZawxrMQbjx{{ zUHNB@-S>@4SWKxa+vR_zG(Lz~+pl{}i+4+U+Tv&| z3>%_`3>NrK5XSw7{!kl3^HWl`FVEJy^NX1L;38p_to8tXPwh;AB+RV(YSFT}oc0>G kVp|BmG#y3q_s2g)Xx5nvzFe!0c`!*p#T5? literal 1025 zcmV+c1pfPpP)U6E9hRK9^#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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..9fae1fda828940ac395f1f91d8d3b2fa9b5cd670 100644 GIT binary patch literal 2869 zcmb7Cc{r478-HeDW;7UsLQ{qr*`f>zC+k=m$})C^#=c~mA;pm;vQ%PhZJa1V$Z+Ct zIvt86LI{zp5uu?_obtVMy1uLP&-t$F`#sllKfm{0e)s)6*Sj^eH4bp*rZiIkg8=}8 z7TB7E4biAncWb(pDeZ{K_rOyC0l6Q5px|&O-OPySfk54}C)jDFQ%i z6#zuW51+?X0P2$fkQn~qBi{r-I1zxl?jOD%ZxYI2GX9oBLKg1h1Hj5100f-@5bXg# z;Mm_W$o$J}L?}dn<_dw9FE|Oj0TIwZFz^Jb5Tk(oKn)z&8Ua**fb+n!2na}iBoAnQ zem;H-T0j7U#$W`n!dQWALfbGHK@mYAVH{2bCxFF^;&Gx7$MHm9yh;QT4He?HVYWfu z{}WqHKm-kRfDQsC3*aI!ga~Y_1-bx$rsDmG{{;%oj{!(NI4`P!18`nr7#|A3_jdve zjzIE>0De45R7MRgYiJWDCQeaj#B)5Dh4h5X<_V}u5(Xf}e@Fs;6q*l%ghCV%0D~iu z2o!Xe?+sya5lB%6QdEP~P@-at_`+sNSf==P64!|HVrv*+5in?8gb2_F_jNHF?Tb5W zHjFDzW^2CrW=%P!I4$6b^wQ`~AR$l0C$tflo4aa<)hq7ys^rSm9r6uz?XVpY$=-i4 zPP@yHYXsjf#O%D8pnh9mOx)+gXn3`&D!twQ%)NB&`58}AUaoyvXj9g#L|eYWXo8IA4Omuu*3I_PTDjP+8mlqkVU0_2l&Mdj zG3KXg3=X{a-S>Mw*M1}>e14$kPGPj$7HG8UQYTkCwy)i$dl8BFl}FjeB#Acl1WNeR z@Vw!r=Eiv$&MJRyL2FocVtUO1eUF?}uCVM8`OQ@K~i%V z%NiGHhOOG6)(5I8qRt+^(^}X;>wN52c0R*yZ{?9)8>0*Egtkt}Z&9kg`DL`q@s_lj zZ0S3uw{F8alB#xYzjv?EF@_yA;u!8d=QCgBUy>#};6JVHV=NiKjIk0Y^vDhgzZd0PWoGL2cn*iqJR`g|kuIVi&|zj1X=V3*DLKH^ zw{~R0TnFPnxB0I6W=HLn2ENWqG6e3>BwFH0oFeJ5g5N0n@D-flV`bs-`PM)SO>gSK zvYgb7+2er&LnF}_VZR;tTKBevanx1mh~uUO+-$Lovd=Gn`ZZM@_1C55kMCla6tD50 z6>CtSt9dsY;qh}S)uR_0e!6~Pg77-JJ1m$ZJ@#_BQ8%8y(dJ6fL|$#Up9<`=N=qWDEw@Ie7TSEGFq+fR=+CpjfKEODDcEn!H`$|u|6 zO=iQv;y;5OOmx$asG*0g~@-&I0Y1DN=_#eqthJ@Dzr>oQ97-X z**fZQVKwOdAgj{Q-bQnH%Fwv_;~BSfiPBDnCy{bbTZtf#Hw(|zGpbOvV`IEZu1aZp z1XD~OV=GsP8@pWkpXDt@xp;Q8EKTlul}h8Q(%D|Sq8kRYBirQ8-_5(2zKW@ihNF@0 zrLj-vQUxD9Sm-Kx`T7(`Y>fHFn?07*Nlfz`LFuP34768wKWwat7N5)u9a{E~giwV3OT>qqr^IDLKHT4~Bb6e4meCDmXHNHukfx$ok4r8(k{ zYtKmhe3_L%xa`7JE5YC9DqavW>26+=P#>FfVJ|z1?8YVyzCFL9pYJVeErpribK94_ zTX}|#V9Jl{83b58IJxL(Sue4J(pN>Y@`+*ut}?;&XF^oq4auS#4~nml zQZgPDR_wh+r{C;A(WK&qlGHy=ybC${%tVwu=h33R5%NW1=Zr4bXE6-dha`IM{vRt!I2i*N?=Y+DmIBt4h z=5=R`b4}COHYQTqf7Rj>GlYAdl0()5U%k5hdg0fF;7OSyx`(KlJxfBByH(H!&}w z*6pxa7qNl{pT=FLI!r&nQ(P}382%Qs5So46*sfJ~IYKe@&60G1Zi@eV>6)O-c8xCJ zhaeYNO_;ccigMS5zXr4(sCvv9s%tH1)2)*v*IV26{#5_K`PL;ncBndAH&pMOd3Vj2 z`Rr(PjqV~VKB=f#fsHqWM>W3{lTNV`igiOgmA5>5+220u!9uBM?KT&~2>~0GnVD~Y zReNUp?;n4Bd^m&u_icj7`nKOV*V5ci#YViT>J?Kz<7XBB%bdP&NpaM3pTU*4`jn2- z&Y!e)ig=S(QIq2zQK;UJYI2TMl1&L8bcV{5?p9^CW9_W}FmBFHAeroKlQsy?cxi9t zYO5J^JZZKxvpDC^{sm^+I(hzi;5&uj@S2|2r8n=E3! zzK||;MQtCX0jbTQu#fRRdehUq-RsxI4tq^@o1yqFL4t?YiHi*TST?Pl{DsVBTGrpc V_FOa$FLC0PA_k_2<=5YO^&c6NUx@$! literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..4d796b3e8f2d2c84590bb769bbfbe42a96568159 100644 GIT binary patch literal 3808 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 a|Kp?Q&xv?2L~F+6XrkUCMp=IE!~X&CnpFJ& 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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..bb2b3e762c26089737a2c465b2a44240426c169c 100644 GIT binary patch literal 5667 zcmb7IXH=6*w|vBYi6F=d(VFM%$gtXdM_s~7XVrf6?GMWhzJ0P2o1Pg zBAQTFQZjpj&{0u;to)Co4yFWBJ`ON5=yr4&yFjfxuv_y)%;&T$ouo_ zRdxUv6ZkJN|CgD<%G%wM5b%T0VQvI*La`76huHqZd9Jv{KV0UDdwaNe5MrKOaW{R0 z5`kM0IFIdraEt%omM(5r@sWfW8I+^vmDUxmDyFh_GSDN;~vm;ewd=nCYdq$H#iN*vel7^Ckf|`z+<~l7c9W9uOo`Ig0fxv06 zk`P_(BnFWaHqug3P!g>FPh9>9(2)Z^fDbXzZQvRm5iuRnWf#CkxNj070{-`~S8Gx- zau6}aHG*4_79a>;Bh*YruwKOw5f%V})6sL@CudO5h1?c4ca3Ab!KH`@%7evYYde@k zMD^+xl`JgXJl`Z-Nf4emi1GNpZ0a z7$_`>7Wl4Sbaza=r-qW@lwHrwiB(KSM-*2L;*{0TUm!8Ru-sNp-QcgDa-?astcge5 zvVJ9V<~Q@~5>Q*++tf+|mqS+0(d918m%z&u$ENP_rqYqaWlAN3EHcineKxfytrGtt zk#-&Z74fQ~br;op%5Up~IpF-098x1`wy3R*rN+kaXQ-da*I~F5VYca!4(M-{dNdyb zlc>&}#@&PYV;BWm={TVw8r&os5Vt;LwoveA+drw+4!`9)ch|W3Wu?P=iNgMImJAa! zFW$#4@~1&s945%d?%t!c#NA6EIq=jKrOV7)si#LNj_BX8u$rYw9dLOkIKdhlw;#bg zGR0s5RkM!p%AJ|>T%#YeOZWg~ED4VK^{1a&c`}D%MOANLh7*2bVfKY`Y{|N7<)lxr zZ<+2!Ld%=56-nmd6U~=Tb(k!}m+YrPodmB74S-)?>@a@^BQ88kN;PCOxVy58V%Vae zq*vY-f1pe9l7vUAzi%RmE?ZTkTkfKmKWy^!%rAtK*RC@OSC?2oPeJie(nc_8lS9FU zW|Y}BhZh$)OI`IU6VK!|9PbxjZFRme2I9FEPtN6{>{mjf{sf^8atHYsd@hhJ+TWJ- zj4(L;=KK_@sHt7;ovM>zFW*$xDnf>w{Dg}~~XFxnw3VmTb4IAtaUF*Qw zFQTX*y2^HJ&?4692eo#;MIZ3?6_Rp(&|ceVC9;El1-uD4~Y6zk*~c;o0oC zNx#oUk**je3&uJ&VWaJbw7}TfitL9uySnlxT9T20VJl?vx#3>jTlELUT%&$H) z#A%;ArLnilTUz7ozpJ%2PJVen60b)JHrP;AJ<{D1CBfn?K(`#p{NF73w6PrI)kjwz zCE=VN8>1y9eI4tp3!l&jQv&j4-=%IFIUN+&JA|X+xB6MUAH(x|@Mp9#%IF!?SS3St zlgW}av%Y7d)L{4`0wP0R{>yCFy;ks(nDKBEPvkH@EIX{SZMe%xF>JbI(m23?W!spP z)%2N{iOQ=+6R1k^&soS)!m!c`uSXZ=nNl#{DwsI0E#Nb2A&RT<#wwzy^T{vej;ua} zT8oY{O|!D3nw=fBSXT?|=7v90M?iB{hsS*<$5Y1gD6`Jj@={C1;(CAiM5W*9;&ZPP zsSwpoaHmxaFj0~KaKkJ&`@rAdVS{3x-F&B@3%|8>q?M3 z*l^mL;XMf(AC(Gkfd!k2AzR#Gk0&$?OU~r6p+VKTsW#@8Blr8za&#z9*Lj~Xsxy&&(DApa5-_Vm+uH(_> z{$p-u=Z4wDZCdo38lR+7Zr{_dJ{U}*H*7~;w7S(|2^p6@FF<8+viwccpiVfs_SW~o ztg|m8UITBU`_(3*F7l0p*X>#-=I)vaFjRgdu6>N#bjWE9qrL?ASPgCUBqa*O%7d-r z@X@~x+H_yO;!8+Oz!s_@HLKza0R=8Mg&Vj*nUmDjLJf>QBs+J9e;;yPsl795J)L6D z-}J~?LzEdFzgx-_F>tR*CAR+%4%gDu5aWu8*rOX+vM(E#`RbIrTJMIgJXTa7H;=_C z-7RnozW$m+c0(M8O=_3g8gOiNA2hbQN98e_9bYIpr#TN*RDcCvb5c}U(87ZlPoJ+! z!{~LOWTqSHVe8+`vhF;J449hFRa_HZy?@vf0tp;P`@K7+9%-qRv8>x(AB@6&|Cwho zdTTc=*|K4#y3vt`KUhF3Xav<9^tCCaX!s*wq`(!utH)|TZKQ(bc_%HDSV6gn|FUZC zcCY0p=9_?84El_h>`SAH1zBr2Ijik)Vwp|p)7%%5J&YdctC zHW8O?9CeZ8=>LVOd{xcf6!Yrt01s~ioEOCMh8`G4tM(&jhQ_xwESx;yg1AP3hY>6# zNvtuMkRy4jepKpeyFiA$XREFFbs zTf$Jd2cz5``2X%XG%)wRP=|v&CpcUMq;rRpUyX?ri93 zUoPtuQG#?$C5{&vrRL8!Zs7np-$`uQ(9t$2wydJAh_OgC=sY)8Hh#c5q8nd8e6le3Ik5`N^|KVrI{=f?eNbEYxd zPtfK3kMU_v>LIJ%)G;@ttg$~)*Lfm&)%3?pKy!Hh{8)b6A-XN#>m626qtFgc`9Pn^U={dF}8y^1P%yq1|^elVSOl}U>=56{D(Wx2^)nB#|!%r1zg;Vs5*+Ph*aa+!-C82B5 znq`9nl2H_hnhd@!T2$QlTg$A9dpE0_sMlotx4a)6dNF)*tesTa2q%v%tAALnlz*yIg+7x~9Bc;N@;!}Dg>%J3uaNebv|FO3o8r<1H0 zmaoR1J^nkByf@yhwF{c0Itnz1Bt|p&GwT9y&iKS12VjK0%9mOH(GQX4$J0z?j!K4( z3o1>I@%^~+QR$k|gsw&bxPrZ+geuu>gO<=Jqibvw8mTu_HjTAr&Ww40vQoi=K?X|M z)qc2Pv-r@wtk1mk4#q*}!MB=B=2i5d0AKUct-If>1m_Tlkfy`vZ5r`*kqS78ove3} zfa#*@~gJ^B`OuIZAd-eL4l1viX~z_y*3riON^x8|tTw@T{{in}RN9-I{k#jo8ux zG$#z}Y||)ioMRFn^JlIWjtALWGMH@w^`8=X%K$ml;o5}-x#I5}v(fm~FEbiQsSVt# ztL;loI7lql=cP>S3ZSbqc{Y)Cc6vT65(3+wL42-7664P8%G*n4Up|~jT}YFy&gc8`$WH00?+sO>mGKm39ijDx zj0?|I7Fy4O4x>KAi5TGr)!9szPNOb?N^$)J@i61;@fuk}-Od26izt=NwL24PWf`U! zDNoMrx%yRUf8M?eNyyr2VI16#8D(+(Q2!DUcFyH{Y(Fb`nAFJFO|(-OHMy6D$egF8X2C2QKQTDAYK@nR;|#ryQNWL36q%L z%-z#2%7j|gXk$;-C4oV*7T&t}EgGpIUCIM$b!#1lJidw5D`k%D*GxAQTd*WDW|O8b z!jo4;$R>{MbO5A3Lh7j0di00{$DyW!s|iM?9VV-L!et(naDKG4kkFuo_&xQS8J}Yf zr<-GsKFe5!@}t7IdR@@WLn*UM)MhRH(I|bak9`NUNa$w;Gz}eZKWPl%$WTZLjCs#~;5} zD<{3t%=rm3Nn|(C`Rn%tI@xiuz3m=@W*&~Q!O^xB>QiMy8KQWrQ-fZ9la$3)$xj8s zV+HW!_}JuW;=Dyggp}u8^Zw)NJ43dV(RzMKZvN6gybC~L*Wb{_(#QRPe9^Qm zbfV8Z7|-VZWk<_Aj54^LJf+PvmV26=u4=!tt9A*{hl0I+k7k>5+Fk-4TMk{dk^R&7 zcY|;0kMm_%6$8l4ENYHL<7p`lelgv(U=Y{>qZ)y*`eedeL;gQKsqjM1I1 z&ZRjcvA*I0jY8GKCZlqmAAjGA6PolxX2teh0#US~pAQtc539A_tvDPG%tSBvN>>Rl z`3f{bO8m&b^S#pAE^8F9`q&Vvs?R@e68ISE6~ouw>T$}7-#zWhuRm%u)UxZ&{SmwT zAUG*c$r>h-Bss)xIf<>(?yJ3LI8(Rm-#p}|uc`lh9eajoB+Hal3U=Ms&=I_cSLUxo zy_otUF7-#mi#uQMoX*V5eGrV*nea86JUn8VXAU2o1jrcP-yBO5#mxvffv9I3w&_j- z8x3t;yhKr`Csaj4*M??hns1*QGiB-;FvHyECRxc3ii zykoY0a{A&!fRb2KfrQ@{q2NG+r$Q)cDDf)NtifRZlhB=QyC=&n!>Bs(jcLnpv#KxY z%_q7a%&lca*#y~45J_V@G3WCY#L|y4cQ^80yP=?-k~t1aRq~h>w0=leuj6PHO;a}f z58Zb11Mb{vlMJc>p>L@%36pd0n&EI1d^GE8T+>>doJDqn*QRUJ20RL9$m`0SBwAEJ zzRTNoMDl!~iOaP;s4B}nVC8%9{PM>*cu)SYD_!itfU7{0_Ajomeb(a%H*9yZhkq3m7P!olK*2B=b-y$qV`smxHCwQ=)@*SvMWSo+ z?nn4HjnJ}#{B&dX0NWYaqdC)%p%!M9BFKP7v&8;0N1H&yDEQ^$zw=@bbrx<6Dk=^ zr&Mfvaf*36=W3U{RBZX?7n@ILL)mq3~LA#yvav;;+4ngGesO$;>P zATl1j-c^Be{V8Xv^-Av|)dGYh9qr?|H-R(Ll8hh90e8`qk z)uFLjt@XsNzT0b}Svq|Rf>FxK0ymQ~LiP4JDi*L9-me@`EQX&8TEG>cLYO(rmLsQj zSSq!=wK>}6?~Ue*n+WbQKiEaG+H3aN*;|8UNVGxOMD02b_B`dYx_vaj)&TYYaB6T@PaE!|dO+HBQbPt{S_FBgSg{XY8y<|+RA3>Ca+2PIFay*pGUBpe$z Tz=Ywcs+|M#VC#hCFDL&8wLIW= 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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..bb2b3e762c26089737a2c465b2a44240426c169c 100644 GIT binary patch literal 5667 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 Tz=Ywcs+|M#VC#hCFDL&8wLIW= 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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..bef42b2f2a700a7abf7b9527cb4f0b09528fea88 100644 GIT binary patch literal 8306 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..d719dd7697cbc9075dff71a71acd919d4e545fee 100644 GIT binary patch literal 3666 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 iW8(builder: (_, state) { - return BlocProvider( - create: (_) => ColorChangeCubit(Cons.tabColors[0]), - child: DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp( - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - onGenerateRoute: UnitRouters.generateRoute, - localizationsDelegates: GlobalMaterialLocalizations.delegates, - supportedLocales: const [ - Locale('zh', 'CN'), - ], - themeMode: ThemeMode.light, - // themeMode: ThemeMode.dark, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), - // theme: ThemeData( - // primarySwatch: state.themeColor, - // fontFamily: state.fontFamily, - // ), - home: const StandardUnitSplash(), - ), + return DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: MaterialApp( + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + onGenerateRoute: UnitRouters.generateRoute, + localizationsDelegates: GlobalMaterialLocalizations.delegates, + supportedLocales: const [ + Locale('zh', 'CN'), + ], + // themeMode: ThemeMode.light, + themeMode: state.themeMode, + darkTheme: AppTheme.darkTheme(state), + theme: AppTheme.lightTheme(state), + // theme: ThemeData( + // primarySwatch: state.themeColor, + // fontFamily: state.fontFamily, + // ), + home: const StandardUnitSplash(), ), ); }); diff --git a/lib/app/navigation/home_drawer.dart b/lib/app/navigation/home_drawer.dart index 76d68677..36e7bab1 100644 --- a/lib/app/navigation/home_drawer.dart +++ b/lib/app/navigation/home_drawer.dart @@ -3,8 +3,6 @@ import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - import 'unit_drawer_header.dart'; /// create by 张风捷特烈 on 2020-03-26 @@ -25,7 +23,7 @@ class HomeDrawer extends StatelessWidget { Widget _buildChild(BuildContext context) { - final Color color = BlocProvider.of(context).state.color; + final Color color = Theme.of(context).primaryColor; return Container( color: color.withAlpha(33), diff --git a/lib/app/navigation/pure_bottom_bar.dart b/lib/app/navigation/pure_bottom_bar.dart index 1b961591..56221a10 100644 --- a/lib/app/navigation/pure_bottom_bar.dart +++ b/lib/app/navigation/pure_bottom_bar.dart @@ -1,9 +1,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; - - +typedef IndexTapCallback = void Function(int); +typedef IndexLongTapCallback = void Function(BuildContext, int); class PureBottomBar extends StatefulWidget { final int initPosition; @@ -43,7 +42,7 @@ class _PureBottomBarState extends State { children: [ // Divider(height: 1,), BottomNavigationBar( - backgroundColor: Colors.white, + // backgroundColor: Colors.white, onTap: (position) { // checkTokenExpires(); _position = position; diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart index bd1d7b4f..383fa07e 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/app/navigation/unit_navigation.dart @@ -8,10 +8,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/painter_system/gallery_unit.dart'; import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - -import 'package:old_fancy_mobile_ui/home_page/fancy_home_page.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:flutter_unit/widget_ui/mobile/widget_panel/standard_home_page.dart'; @@ -71,73 +67,39 @@ class _UnitPhoneNavigationState extends State { /// extendBody = true 凹嵌透明,需要处理底部 边距 @override Widget build(BuildContext context) { - AppStyle style = context.read().state.appStyle; - bool isStandard = style == AppStyle.standard; return Scaffold( extendBody: true, endDrawer: const HomeRightDrawer(), - floatingActionButtonLocation: - isStandard ? null : FloatingActionButtonLocation.centerDocked, - floatingActionButton: isStandard ? null : _buildSearchButton(context), body: PageView( physics: _neverScroll, controller: _controller, children: [ - if (style == AppStyle.fancy) const FancyHomePage(), - if (style == AppStyle.standard) const StandardHomePage(), + StandardHomePage(), GalleryUnit(), CollectPageAdapter(), UserPage(), ], ), - bottomNavigationBar: _buildBottomNav(context, style), + bottomNavigationBar: _buildBottomNav(context), ); } bool get isDark => Theme.of(context).brightness == Brightness.dark; - // 主页搜索按钮 - // 由于 按钮 颜色需要随 点击头部栏 状态而改变, - // 使用 BlocBuilder 构建 - Widget _buildSearchButton(BuildContext context) { - return BlocBuilder(builder: (_, state) { - return FloatingActionButton( - shape: const StadiumBorder(), - elevation: 2, - backgroundColor: isDark ? state.color : state.color, - child: const Icon(Icons.search), - onPressed: () => Navigator.of(context).pushNamed(UnitRouter.search), - ); - }); - } // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, // 使用 BlocBuilder 构建 - Widget _buildBottomNav(BuildContext context, AppStyle style) { - switch (style) { - case AppStyle.standard: - return Stack( - children: [ - PureBottomBar( - initPosition: position, - onItemTap: _onTapBottomNav, - onItemLongTap: _onItemLongTap, - ), - const Positioned(right: 26, top: 8, child: UpdateRedPoint()) - ], - ); - case AppStyle.fancy: - return BlocBuilder( - builder: (context, state) { - return UnitBottomBar( - initPosition: position, - color: state.color, - onItemTap: _onTapBottomNav, - onItemLongTap: _onItemLongTap, - ); - }, - ); - } + Widget _buildBottomNav(BuildContext context) { + return Stack( + children: [ + PureBottomBar( + initPosition: position, + onItemTap: _onTapBottomNav, + onItemLongTap: _onItemLongTap, + ), + const Positioned(right: 26, top: 8, child: UpdateRedPoint()) + ], + ); } // 点击底部按钮事件,切换页面 @@ -149,10 +111,7 @@ class _UnitPhoneNavigationState extends State { if (index != 0) { color = Theme.of(context).primaryColor; } else { - color = - Cons.tabColors[context.read().state.family.index]; } - context.read().change(color); } if (index == 2) { diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 15f1e4be..fd227625 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -32,7 +32,7 @@ class UnitRouters { static const String widget_detail = '/widget_detail'; static const String detail = 'detail'; - static const String search = 'search_bloc'; + // static const String search = 'search_bloc'; static const String collect = 'CollectPage'; @@ -83,8 +83,8 @@ class UnitRouters { return Right2LeftRouter( child: child); - case search: - return Right2LeftRouter(child: const SearchPageProvider()); + // case search: + // return Right2LeftRouter(child: const SearchPageProvider()); case collect: return Right2LeftRouter(child: const CollectPageAdapter()); @@ -98,8 +98,8 @@ class UnitRouters { return Right2LeftRouter(child: const ThemeColorSettingPage()); case code_style_setting: return Right2LeftRouter(child: const CodeStyleSettingPage()); - case item_style_setting: - return Right2LeftRouter(child: const ItemStyleSettingPage()); + // case item_style_setting: + // return Right2LeftRouter(child: const ItemStyleSettingPage()); case version_info: return Right2LeftRouter(child: const VersionInfo()); diff --git a/lib/app/views/setting/app_style_setting.dart b/lib/app/views/setting/app_style_setting.dart index 42c711b2..56d99b51 100644 --- a/lib/app/views/setting/app_style_setting.dart +++ b/lib/app/views/setting/app_style_setting.dart @@ -9,11 +9,11 @@ import 'package:flutter_bloc/flutter_bloc.dart'; void showAppStyleSelectDialog(BuildContext context) { - List data = Cons.kAppStyleStringMap.values.toList(); + // List data = Cons.kAppStyleStringMap.values.toList(); showCupertinoModalPopup( context: context, builder: (context) => AppThemeSettingDialog( - data: data, + data: [], )); } @@ -54,20 +54,20 @@ class AppThemeSettingDialog extends StatelessWidget { ); } - Widget _buildItem(BuildContext context, int index) { - AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; - AppStyle style = BlocProvider.of(context).state.appStyle; - bool checked = style == locale; - Color color = Theme.of(context).primaryColor; - return ListTile( - title: Text(data[index]), - onTap: () => _onSelect(context, index), - trailing: checked ? Icon(Icons.check, size: 20, color: color) : null, - ); + Widget? _buildItem(BuildContext context, int index) { + // AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; + // AppStyle style = BlocProvider.of(context).state.appStyle; + // bool checked = style == locale; + // Color color = Theme.of(context).primaryColor; + // return ListTile( + // title: Text(data[index]), + // onTap: () => _onSelect(context, index), + // trailing: checked ? Icon(Icons.check, size: 20, color: color) : null, + // ); } void _onSelect(BuildContext context, int index) { - AppStyle appStyle = Cons.kAppStyleStringMap.keys.toList()[index]; - BlocProvider.of(context).changeAppStyle(appStyle); - Navigator.of(context).pop(); + // AppStyle appStyle = Cons.kAppStyleStringMap.keys.toList()[index]; + // BlocProvider.of(context).changeThemeMode(appStyle); + // Navigator.of(context).pop(); } } diff --git a/lib/app/views/setting/code_style_setting.dart b/lib/app/views/setting/code_style_setting.dart index 5a9e7698..9f3567cc 100644 --- a/lib/app/views/setting/code_style_setting.dart +++ b/lib/app/views/setting/code_style_setting.dart @@ -31,8 +31,7 @@ class Hello { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: '代码高亮样式'), + appBar: AppBar(title: Text('代码高亮样式')), body: BlocBuilder( builder: (_, state) => _buildFontCell(context, Cons.codeThemeSupport.keys.toList(), state.codeStyleIndex)), diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart index 6baa7ab5..b3b4938d 100644 --- a/lib/app/views/setting/font_setting.dart +++ b/lib/app/views/setting/font_setting.dart @@ -13,11 +13,10 @@ class FontSettingPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: '字体设置 - font setting'), - body: BlocBuilder( - builder: (_, state) => _buildFontCell( + return BlocBuilder( + builder: (_, state) =>Scaffold( + appBar: AppBar(title: Text('字体设置 - font setting',style: TextStyle(fontFamily:state.fontFamily ),)), + body: _buildFontCell( context, Cons.kFontFamilySupport, state.fontFamily)), ); } diff --git a/lib/app/views/setting/item_style_setting.dart b/lib/app/views/setting/item_style_setting.dart index b2df855e..6037a588 100644 --- a/lib/app/views/setting/item_style_setting.dart +++ b/lib/app/views/setting/item_style_setting.dart @@ -1,59 +1,58 @@ -import 'package:app/app.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; - -/// create by 张风捷特烈 on 2020-04-10 -/// contact me by email 1981462002@qq.com -/// 说明: item样式切换支持 - -class ItemStyleSettingPage extends StatelessWidget { - const ItemStyleSettingPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: UnitColor.scaffoldBgLight, - appBar: const UnitAppbar(title: 'item样式设置'), - body: BlocBuilder(builder: (_, state) { - return _buildCell(context, state.itemStyleIndex); - }), - ); - } - - List get items=> HomeItemSupport.itemSimples(); - - Widget _buildCell(BuildContext context, int index) { - return ListView.builder( - itemCount: items.length, - itemBuilder: (_, i) => Padding( - padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), - child: FeedbackWidget( - a: 0.95, - duration: const Duration(milliseconds: 200), - onPressed: () { - BlocProvider.of(context).changeItemStyle(i); - }, - child: Stack( - children: [ - items[i], - if (index == i) - Positioned( - left: 25, - top: 15, - child: Circle( - color: Theme.of(context).primaryColor, - radius: 10, - child: const Icon( - Icons.check, - color: Colors.white, - size: 15, - ), - ), - ) - ], - )), - )); - } -} +// import 'package:app/app.dart'; +// import 'package:components/components.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_bloc/flutter_bloc.dart'; +// +// /// create by 张风捷特烈 on 2020-04-10 +// /// contact me by email 1981462002@qq.com +// /// 说明: item样式切换支持 +// +// class ItemStyleSettingPage extends StatelessWidget { +// const ItemStyleSettingPage({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// backgroundColor: UnitColor.scaffoldBgLight, +// appBar: const UnitAppbar(title: 'item样式设置'), +// body: BlocBuilder(builder: (_, state) { +// return _buildCell(context, state.itemStyleIndex); +// }), +// ); +// } +// +// List get items=> HomeItemSupport.itemSimples(); +// +// Widget _buildCell(BuildContext context, int index) { +// return ListView.builder( +// itemCount: items.length, +// itemBuilder: (_, i) => Padding( +// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8), +// child: FeedbackWidget( +// a: 0.95, +// duration: const Duration(milliseconds: 200), +// onPressed: () { +// BlocProvider.of(context).changeItemStyle(i); +// }, +// child: Stack( +// children: [ +// items[i], +// if (index == i) +// Positioned( +// left: 25, +// top: 15, +// child: Circle( +// color: Theme.of(context).primaryColor, +// radius: 10, +// child: const Icon( +// Icons.check, +// color: Colors.white, +// size: 15, +// ), +// ), +// ) +// ], +// )), +// )); +// } +// } diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index 7f7837cc..3e056db8 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -6,6 +6,7 @@ import 'package:flutter_unit/app/navigation/overlay_tool_wrapper.dart'; import 'app_style_setting.dart'; +import 'theme_model_setting.dart'; class SettingPage extends StatelessWidget { @@ -16,26 +17,25 @@ class SettingPage extends StatelessWidget { const Widget divider = Divider(height: 1); return Scaffold( - backgroundColor: Colors.white, - appBar: const UnitAppbar(title:'应用设置'), + appBar: AppBar(title:Text('应用设置')), body: ListView( children: [ - Container( height: 15,color: UnitColor.scaffoldBgLight), - + Container( height: 15), ListTile( leading: Icon( Icons.style, color: Theme.of(context).primaryColor, ), - title: const Text('应用整体风格', style: TextStyle(fontSize: 16)), + title: const Text('深色模式', style: TextStyle(fontSize: 16)), subtitle: BlocBuilder( builder: (_,state)=>Text( - Cons.kAppStyleStringMap[state.appStyle]! - , style: const TextStyle(fontSize: 14) + themeMode2Str[state.themeMode]! + , style: const TextStyle(fontSize: 12,color: Colors.grey) ), ), + trailing: _nextIcon(context), onTap: (){ - showAppStyleSelectDialog(context); + Navigator.of(context).push(Right2LeftRouter(child: ThemeModelSetting())); }, ), divider, @@ -48,13 +48,14 @@ class SettingPage extends StatelessWidget { subtitle: BlocBuilder( builder: (_,state)=>Text( Cons.kThemeColorSupport[state.themeColor]!, - style: TextStyle(color: state.themeColor,fontSize: 14), + style: TextStyle(color: state.themeColor,fontSize: 12), ), ), trailing: _nextIcon(context), onTap: () => Navigator.of(context).pushNamed(UnitRouter.theme_color_setting), ), - divider, + // divider, + Container( height: 10), ListTile( leading: Icon( Icons.translate, @@ -63,25 +64,13 @@ class SettingPage extends StatelessWidget { title: const Text('字体设置', style: TextStyle(fontSize: 16)), subtitle: BlocBuilder( builder: (_,state)=>Text( - state.fontFamily + state.fontFamily,style: TextStyle(fontSize: 12), ), ), trailing: _nextIcon(context), onTap: () => Navigator.of(context).pushNamed(UnitRouter.font_setting), ), divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), - ListTile( - leading: Icon( - TolyIcon.icon_item, - color: Theme.of(context).primaryColor, - ), - title: const Text('条目样式设置', style: TextStyle(fontSize: 16),), - subtitle: const Text('仅华丽样式下可用',style:TextStyle(fontSize: 14),), - trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.item_style_setting), - ), - divider, ListTile( leading: Icon( TolyIcon.icon_code, @@ -91,15 +80,15 @@ class SettingPage extends StatelessWidget { trailing: _nextIcon(context), onTap: () => Navigator.of(context).pushNamed(UnitRouter.code_style_setting), ), - divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), + // divider, + Container( height: 10,), _buildShowBg(context), divider, _buildShowOver(context), - divider, + // divider, // _buildShowTool(context), // divider, - Container( height: 10,color: UnitColor.scaffoldBgLight), + Container( height: 10), ListTile( leading: Icon( Icons.info, @@ -114,40 +103,45 @@ class SettingPage extends StatelessWidget { ); } - +//SwitchListTile( +// inactiveTrackColor: Colors.grey.withOpacity(0.3), +// // inactiveThumbColor: Colors.white, +// activeColor: Theme.of(context).primaryColor, +// value: state.showBackGround, +// secondary: Icon( +// TolyIcon.icon_background, +// color: Theme.of(context).primaryColor, +// ), +// title: const Text('显示背景', style: TextStyle(fontSize: 16)), +// onChanged: (show) { +// BlocProvider.of(context).switchShowBg(show); +// }, +// ) Widget _buildShowBg(BuildContext context) => BlocBuilder( - builder: (_, state) => SwitchListTile( - inactiveTrackColor: Colors.grey.withOpacity(0.3), - // inactiveThumbColor: Colors.white, - activeColor: Theme.of(context).primaryColor, - value: state.showBackGround, - secondary: Icon( - TolyIcon.icon_background, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示背景', style: TextStyle(fontSize: 16)), - onChanged: (show) { - BlocProvider.of(context).switchShowBg(show); - }, - )); + builder: (_, state) => TolySwitchListTile( + secondary:Icon( + TolyIcon.icon_background, + color: Theme.of(context).primaryColor, + ), + title: const Text('显示背景', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) + , value: state.showBackGround, onChanged: (bool value) { + BlocProvider.of(context).switchShowBg(value); + }, + ),); Widget _buildShowOver(BuildContext context) => BlocBuilder( - builder: (_, state) => SwitchListTile( - value: state.showPerformanceOverlay, - inactiveTrackColor: Colors.grey.withOpacity(0.3), - // inactiveThumbColor: Colors.white, - activeColor: Theme.of(context).primaryColor, - secondary: Icon( - TolyIcon.icon_show, + builder: (_, state) => TolySwitchListTile( + secondary:Icon( + TolyIcon.icon_background, color: Theme.of(context).primaryColor, ), - title: const Text('显示性能浮层', style: TextStyle(fontSize: 16)), - onChanged: (show) { - BlocProvider.of(context).switchShowOver(show); - }, + title: const Text('显示性能浮层', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) + , value: state.showPerformanceOverlay, onChanged: (bool value) { + BlocProvider.of(context).switchShowOver(value); + }, )); Widget _buildShowTool(BuildContext context) => diff --git a/lib/app/views/setting/theme_model_setting.dart b/lib/app/views/setting/theme_model_setting.dart new file mode 100644 index 00000000..40979d37 --- /dev/null +++ b/lib/app/views/setting/theme_model_setting.dart @@ -0,0 +1,66 @@ +import 'package:app/app.dart'; +import 'package:app/app/style/unit_color.dart'; +import 'package:components/project_ui/unit_app_bar.dart'; +import 'package:components/toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class ThemeModelSetting extends StatelessWidget { + const ThemeModelSetting({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + + ThemeMode mode = context.select((bloc) => bloc.state.themeMode); + Color iconColor = Theme.of(context).primaryColor; + return Scaffold( + appBar: AppBar(title: Text('深色模式')), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( height: 15,), + TolySwitchListTile( + title: const Text('跟随系统', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)), + subtitle: Text( + '开启后,将跟随系统打开或关闭深色模式',style: TextStyle(fontSize: 12,color: Colors.grey), + ), value: mode == ThemeMode.system, onChanged: (bool value) { + print("========value:$value=========="); + ThemeMode newModel; + if(value){ + newModel = ThemeMode.system; + }else{ + newModel = ThemeMode.light; + } + context.read().changeThemeMode(newModel); + }, + // trailing: _nextIcon(context), + // : () => Navigator.of(context).pushNamed(UnitRouter.font_setting), + ), + // AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; + // AppStyle style = BlocProvider.of(context).state.appStyle; + // bool checked = style == locale; + // Color color = Theme.of(context).primaryColor; + Padding( + padding: const EdgeInsets.only(left: 10,top: 16,bottom: 6), + child: Text("手动设置"), + ), + ListTile( + title: Text('浅色模式'), + onTap: (){ + context.read().changeThemeMode(ThemeMode.light); + }, + trailing: mode == ThemeMode.light ? Icon(Icons.check, size: 20, color: iconColor) : null, + ), + Divider(), + ListTile( + title: Text('深色模式'), + onTap: (){ + context.read().changeThemeMode(ThemeMode.dark); + }, + trailing: mode == ThemeMode.dark ? Icon(Icons.check, size: 20, color: iconColor) : null, + ) + ], + ), + );; + } +} diff --git a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_text.dart b/lib/app/views/splash/flutter_unit_text.dart similarity index 100% rename from packages/old_fancy_mobile_ui/lib/splash/flutter_unit_text.dart rename to lib/app/views/splash/flutter_unit_text.dart diff --git a/lib/app/views/splash/standard_unit_splash.dart b/lib/app/views/splash/standard_unit_splash.dart index 14479cdb..06a8793c 100644 --- a/lib/app/views/splash/standard_unit_splash.dart +++ b/lib/app/views/splash/standard_unit_splash.dart @@ -4,7 +4,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -13,6 +12,8 @@ import 'dart:ui' as ui; import 'package:widget_repository/widget_repository.dart'; +import 'flutter_unit_text.dart'; + /// create by 张风捷特烈 on 2020-03-07 /// contact me by email 1981462002@qq.com /// 说明: app 闪屏页 diff --git a/lib/painter_system/desk_ui/desk_gallery_unit.dart b/lib/painter_system/desk_ui/desk_gallery_unit.dart index cceb5579..441f92b7 100644 --- a/lib/painter_system/desk_ui/desk_gallery_unit.dart +++ b/lib/painter_system/desk_ui/desk_gallery_unit.dart @@ -7,7 +7,6 @@ import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter_unit/painter_system/gallery_card_item.dart'; import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; import '../../point_system/views/desk_ui/desk_point_page.dart'; import '../gallery_detail_page.dart'; @@ -34,10 +33,9 @@ class _DeskGalleryUnitState extends State { final ScrollController controller = ScrollController(); - Color get color => BlocProvider.of(context).state.tabColor; + Color get color => Colors.blue; - Color get nextColor => - BlocProvider.of(context).state.nextTabColor; + Color get nextColor =>Colors.orangeAccent; BoxDecoration get boxDecoration => const BoxDecoration( color: Colors.white, diff --git a/lib/painter_system/gallery_unit.dart b/lib/painter_system/gallery_unit.dart index b57c62aa..c734f15a 100644 --- a/lib/painter_system/gallery_unit.dart +++ b/lib/painter_system/gallery_unit.dart @@ -9,7 +9,6 @@ import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter_unit/painter_system/gallery_card_item.dart'; import 'package:flutter_unit/painter_system/bloc/gallery_unit/bloc.dart'; import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; import 'desk_ui/desk_gallery_unit.dart'; import 'gallery_detail_page.dart'; @@ -72,9 +71,10 @@ class _PhoneGalleryUnitState extends State { super.dispose(); } - Color get color => BlocProvider.of(context).state.tabColor; - Color get nextColor => BlocProvider.of(context).state.nextTabColor; + Color get color => Colors.blue; + + Color get nextColor =>Colors.orangeAccent; bool get isDark => Theme.of(context).brightness == Brightness.dark; BoxDecoration get boxDecoration => BoxDecoration( diff --git a/lib/widget_ui/mobile/category_page/category_detail.dart b/lib/widget_ui/mobile/category_page/category_detail.dart index 7ce2dbc7..1042918a 100644 --- a/lib/widget_ui/mobile/category_page/category_detail.dart +++ b/lib/widget_ui/mobile/category_page/category_detail.dart @@ -20,6 +20,7 @@ class CategoryShow extends StatelessWidget { @override Widget build(BuildContext context) { + return Scaffold( appBar: AppBar(title: Text(model.name)), body: BlocBuilder( @@ -79,20 +80,21 @@ class SimpleWidgetItem extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; +Color shadowColor = isDark?Colors.black:Colors.white; return Container( - color: Colors.transparent, - height: 75, + height: 64, child: Row( children: [ - _buildLeading(), + _buildLeading(shadowColor), const SizedBox( - width: 20, + width: 8, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [_buildTitle(), _buildSummary()], + children: [_buildTitle(shadowColor), _buildSummary(shadowColor)], ), ) ], @@ -100,52 +102,56 @@ class SimpleWidgetItem extends StatelessWidget { ); } - Widget _buildTitle() { + Widget _buildTitle(Color shadowColor) { return Row( children: [ - Text(data.name, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - shadows: [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), + Expanded( + child: Text(data.name, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + shadows: [ + Shadow(color: shadowColor, offset: Offset(.3, .3)) + ])), + ), const SizedBox(width: 15), StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: data.color), + star: Star(emptyColor: shadowColor, size: 12, fillColor: data.color), score: data.lever, ) ], ); } - Widget _buildLeading() => Padding( + Widget _buildLeading(Color shadowColor) => Padding( padding: const EdgeInsets.only(left: 5, right: 5), child: data.image == null ? Material( color: Colors.transparent, child: CircleText( + text: data.name, - size: 60, + size: 50, color: data.color, ), ) : CircleImage( image: data.image!, - size: 60, + size: 50, ), ); - Widget _buildSummary() { + Widget _buildSummary(Color shadowColor) { return Text( data.info, maxLines: 2, overflow: TextOverflow.ellipsis, - style: const TextStyle( + style: TextStyle( color: Color(0xFF757575), - fontSize: 14, - shadows: [Shadow(color: Colors.white, offset: Offset(.5, .5))]), + fontSize: 12, + shadows: [Shadow(color: shadowColor, offset: Offset(.5, .5))]), ); } } diff --git a/lib/widget_ui/mobile/category_page/category_list_item.dart b/lib/widget_ui/mobile/category_page/category_list_item.dart index 1d43ceb4..2b98b44f 100644 --- a/lib/widget_ui/mobile/category_page/category_list_item.dart +++ b/lib/widget_ui/mobile/category_page/category_list_item.dart @@ -19,14 +19,14 @@ class CategoryListItem extends StatelessWidget { Widget build(BuildContext context) { return Container( child: _buildChild(context), - padding: const EdgeInsets.all(10), + padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: Colors.white, + color: Theme.of(context).listTileTheme.tileColor, boxShadow: [ - BoxShadow(color: Colors.black.withOpacity(0.1),blurRadius: 2) + BoxShadow(color: Colors.black.withOpacity(0.01),blurRadius: 6,offset: Offset(0,2)) ], - borderRadius: BorderRadius.all(Radius.circular(10)), + borderRadius: BorderRadius.all(Radius.circular(8)), ), ); @@ -37,44 +37,25 @@ class CategoryListItem extends StatelessWidget { return Column( children: [ _buildTitle(themeColor), + const SizedBox(height: 8,), const Divider(), Expanded( - child: Stack( - fit: StackFit.expand, - children: [ - Container( - padding: const EdgeInsets.only(top: 10, left: 10, right: 10), - child: Text(data.info, - style: TextStyle( - color: Colors.grey, - shadows: [ - Shadow(color: themeColor.withOpacity(0.4), offset:const Offset(.2,.2),blurRadius: .5) - ])), - ), - Positioned( - bottom: 5, - right: 5, - child: - FeedbackWidget( - onPressed: () { - onEditItemClick?.call(data); - }, - child: Icon( - Icons.edit, - size: 20, - color: themeColor, - ), - ) - ) - ], - )), + child: Container( + padding: const EdgeInsets.only(top: 10, left: 10, right: 10), + child: Text(data.info, + maxLines: 4, + style: TextStyle( + color: Colors.grey, + fontSize: 12, + shadows: [ + Shadow(color: themeColor.withOpacity(0.4), offset:const Offset(.2,.2),blurRadius: .5) + ])), + ),), const Divider(), - Padding( - padding: const EdgeInsets.all(5.0), - child: Text( - '创建于 ${data.createDate}', - style: const TextStyle(color: Colors.grey, fontSize: 12), - ), + const SizedBox(height: 8,), + Text( + '创建于: ${data.createDate}', + style: const TextStyle(color: Colors.grey, fontSize: 12), ), ], ); @@ -97,6 +78,17 @@ class CategoryListItem extends StatelessWidget { data.name, style: const TextStyle(fontWeight: FontWeight.bold), )), + FeedbackWidget( + onPressed: () { + onEditItemClick?.call(data); + }, + child: Icon( + Icons.edit, + size: 20, + color: themeColor, + ), + ), + const SizedBox(width: 4,), FeedbackWidget( onPressed: () { onDeleteItemClick?.call(data); @@ -104,8 +96,11 @@ class CategoryListItem extends StatelessWidget { child: const Icon( CupertinoIcons.delete_solid, color: Colors.red, + size: 20, ), - ) + ), + + ], ); } diff --git a/lib/widget_ui/mobile/category_page/category_page.dart b/lib/widget_ui/mobile/category_page/category_page.dart index 52d6ebc9..15b30be2 100644 --- a/lib/widget_ui/mobile/category_page/category_page.dart +++ b/lib/widget_ui/mobile/category_page/category_page.dart @@ -15,12 +15,15 @@ import 'edit_category_panel.dart'; import 'empty_category.dart'; class CategoryPage extends StatelessWidget { - final SliverGridDelegateWithFixedCrossAxisCount gridDelegate = - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: 0.8, + final SliverGridDelegateWithMaxCrossAxisExtent gridDelegate = + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 200, + mainAxisExtent: 200, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + // crossAxisCount: 2, + + // childAspectRatio: 0.8, ); final SliverGridDelegateWithFixedCrossAxisCount deskGridDelegate = const SliverGridDelegateWithFixedCrossAxisCount( @@ -55,7 +58,7 @@ class CategoryPage extends StatelessWidget { _buildContent(BuildContext context, CategoryLoadedState state) { return SliverPadding( - padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 0), + padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 10), sliver: SliverLayoutBuilder( builder: (_,c){ SliverGridDelegate delegate = gridDelegate; diff --git a/lib/widget_ui/mobile/category_page/collect_page.dart b/lib/widget_ui/mobile/category_page/collect_page.dart index d81b6a2c..6bbd6a7b 100644 --- a/lib/widget_ui/mobile/category_page/collect_page.dart +++ b/lib/widget_ui/mobile/category_page/collect_page.dart @@ -6,8 +6,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:authentication/views/authentic_widget.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; - import '../../desk_ui/category_panel/desk_category_page.dart'; import 'category_page.dart'; import 'like_widget_page.dart'; @@ -49,10 +47,10 @@ class _CollectPageState extends State Widget build(BuildContext context) { super.build(context); BuildContext _topContext = context; - final Color color = BlocProvider.of(context).state.tabColor.withAlpha(11); + final Color color = Colors.blue.withAlpha(11); return Scaffold( - backgroundColor: Colors.white, + // backgroundColor: Colors.white, body: Container( color: color, child: DefaultTabController( @@ -76,8 +74,10 @@ class _CollectPageState extends State } Widget _buildAppBar(BuildContext context, bool index) { - final Color color = BlocProvider.of(context).state.color; + // final Color color = Colors.blue; + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'draw_bg3.webp':'caver.webp'; return SliverAppBar( systemOverlayStyle: const SystemUiOverlayStyle( statusBarIconBrightness: Brightness.light @@ -93,7 +93,7 @@ class _CollectPageState extends State borderSize: 1.5, ), )), - backgroundColor: color, + // backgroundColor: color, actions: [ SizedBox( width: 32, @@ -105,7 +105,7 @@ class _CollectPageState extends State _buildAddAction(context) ], title: const Text( - '收藏集 CollectUnit', + '收藏集录', style: TextStyle( color: Colors.white, //标题 fontSize: 18, @@ -118,7 +118,7 @@ class _CollectPageState extends State flexibleSpace: FlexibleSpaceBar( collapseMode: CollapseMode.parallax, //视差效果 background: Image.asset( - "assets/images/caver.webp", + "assets/images/$image", fit: BoxFit.cover, ), ), diff --git a/lib/widget_ui/mobile/category_page/edit_category_panel.dart b/lib/widget_ui/mobile/category_page/edit_category_panel.dart index 93f71683..9798bd34 100644 --- a/lib/widget_ui/mobile/category_page/edit_category_panel.dart +++ b/lib/widget_ui/mobile/category_page/edit_category_panel.dart @@ -50,7 +50,7 @@ class _EditCategoryPanelState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), child: InputButton( - defaultText: '${widget.model?.name}', + defaultText: '${widget.model?.name??''}', config: const InputButtonConfig(hint: '收藏集名称', iconData: Icons.check), onSubmit: _doEdit, ), @@ -58,7 +58,7 @@ class _EditCategoryPanelState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), child: EditPanel( - defaultText: '${widget.model?.info}', + defaultText: '${widget.model?.info??''}', submitClear: false, hint: '收藏集简介...', onChange: (v) => info = v, diff --git a/lib/widget_ui/mobile/category_page/home_right_drawer.dart b/lib/widget_ui/mobile/category_page/home_right_drawer.dart index 2c021177..4a99a312 100644 --- a/lib/widget_ui/mobile/category_page/home_right_drawer.dart +++ b/lib/widget_ui/mobile/category_page/home_right_drawer.dart @@ -2,7 +2,6 @@ import 'package:components/toly_ui/ti/circle.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/navigation/unit_drawer_header.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; import 'edit_category_panel.dart'; @@ -28,10 +27,10 @@ class _HomeRightDrawerState extends State { Widget _buildChild(BuildContext context) { // final Color color = BlocProvider.of(context).state.color; - final Color color = BlocProvider.of(context).state.color; + final Color color = Theme.of(context).scaffoldBackgroundColor; return Container( - color: color.withAlpha(33), + color: color, child: ListView(padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color:color), _buildTitle(context), diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/lib/widget_ui/mobile/category_page/like_widget_page.dart index 181c77da..05414e39 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/lib/widget_ui/mobile/category_page/like_widget_page.dart @@ -22,8 +22,8 @@ class LikeWidgetPage extends StatelessWidget { final SliverGridDelegate gridDelegate = const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + mainAxisSpacing: 8, + crossAxisSpacing: 8, childAspectRatio: 1 / 0.5, ); diff --git a/lib/widget_ui/mobile/search_page/search_page.dart b/lib/widget_ui/mobile/search_page/search_page.dart index e7a4deb2..bcf16ae5 100644 --- a/lib/widget_ui/mobile/search_page/search_page.dart +++ b/lib/widget_ui/mobile/search_page/search_page.dart @@ -1,169 +1,169 @@ -import 'package:app/app.dart'; -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import 'app_search_bar.dart'; - - -// SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc -// 不必单独提供 SearchBloc 增加复杂性 -class SearchPageProvider extends StatelessWidget { - const SearchPageProvider({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocProvider( - lazy: false, - create: (BuildContext context) => WidgetsBloc( - repository: BlocProvider.of(context).repository, - ), - child: const SearchPage(), - ); - } -} - -class SearchPage extends StatefulWidget { - const SearchPage({Key? key}) : super(key: key); - - @override - _SearchPageState createState() => _SearchPageState(); -} - -class _SearchPageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - body: CustomScrollView( - slivers: [ - _buildSliverAppBar(), - SliverToBoxAdapter(child: _buildStarFilter()), - BlocBuilder(builder: _buildBodyByState) - ], - ), - ); - } - - Widget _buildSliverAppBar() { - return const SliverAppBar( - pinned: true, - title: AppSearchBar(), - actions: [ - Padding( - padding: EdgeInsets.only(right: 15.0), - child: Icon(TolyIcon.icon_sound), - ) - ], - ); - } - - Widget _buildStarFilter() => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(top: 10.0, left: 20, bottom: 5), - child: Wrap( - spacing: 5, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Circle( - radius: 5, - color: Colors.orange, - ), - Text( - '星级查询', - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold), - ), - ], - ), - ), - MultiChipFilter( - data: const [1, 2, 3, 4, 5], - avatarBuilder: (_, index) => - CircleAvatar(child: Text((index + 1).toString())), - labelBuilder: (_, selected) => Icon( - Icons.star, - color: selected ? Colors.blue : Colors.grey, - size: 18, - ), - onChange: _doSelectStart, - ), - const Divider(), - const SizedBox( - height: 10, - ) - ], - ); - - Widget _buildBodyByState(BuildContext context, WidgetsState state) { - Widget noSearchArg = const SliverToBoxAdapter(child: NotSearchPage()); - if (state.filter.name.isEmpty) { - return noSearchArg; - } - - if (state is WidgetsLoading) { - return const SliverToBoxAdapter(child: LoadingShower()); - } - - if (state is WidgetsLoadFailed) { - return const SliverToBoxAdapter(child: ErrorPage()); - } - - if (state is WidgetsLoaded) { - if (state.widgets.isEmpty) { - return const SliverToBoxAdapter( - child: EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", - ), - ); - } - return _buildSliverList(state.widgets); - } - return const SliverToBoxAdapter(child: NotSearchPage()); - } - - Widget _buildSliverList(List models) => SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => Padding( - padding: const EdgeInsets.only( - bottom: 10, top: 2, left: 10, right: 10), - child: InkWell( - customBorder: HomeItemSupport.shapeBorderMap[index], - onTap: () => _toDetailPage(models[index]), - child: TechnoWidgetListItem( - data: models[index], - ))), - childCount: models.length), - ); - - void _doSelectStart(List select) { - List temp = select.map((e) => e + 1).toList(); - if (temp.length < 5) { - temp.addAll(List.generate(5 - temp.length, (e) => -1)); - } - WidgetsBloc widgetsBloc = BlocProvider.of(context); - final WidgetFilter filter = widgetsBloc.state.filter.copyWith( - stars: temp, - ); - widgetsBloc.add( - EventSearchWidget(filter: filter), - ); - } - - void _toDetailPage(WidgetModel model) { - //收起键盘 - final FocusScopeNode focusScope = FocusScope.of(context); - if (focusScope.hasFocus) { - focusScope.unfocus(); - } - BlocProvider.of(context).queryDetail(model); - Navigator.pushNamed(context, UnitRouter.widget_detail,arguments: model); - } -} - +// import 'package:app/app.dart'; +// import 'package:components/components.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_bloc/flutter_bloc.dart'; +// +// // import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; +// import 'package:widget_module/blocs/blocs.dart'; +// +// import 'package:widget_repository/widget_repository.dart'; +// import 'app_search_bar.dart'; +// +// +// // SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc +// // 不必单独提供 SearchBloc 增加复杂性 +// class SearchPageProvider extends StatelessWidget { +// const SearchPageProvider({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return BlocProvider( +// lazy: false, +// create: (BuildContext context) => WidgetsBloc( +// repository: BlocProvider.of(context).repository, +// ), +// child: const SearchPage(), +// ); +// } +// } +// +// class SearchPage extends StatefulWidget { +// const SearchPage({Key? key}) : super(key: key); +// +// @override +// _SearchPageState createState() => _SearchPageState(); +// } +// +// class _SearchPageState extends State { +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: CustomScrollView( +// slivers: [ +// _buildSliverAppBar(), +// SliverToBoxAdapter(child: _buildStarFilter()), +// BlocBuilder(builder: _buildBodyByState) +// ], +// ), +// ); +// } +// +// Widget _buildSliverAppBar() { +// return const SliverAppBar( +// pinned: true, +// title: AppSearchBar(), +// actions: [ +// Padding( +// padding: EdgeInsets.only(right: 15.0), +// child: Icon(TolyIcon.icon_sound), +// ) +// ], +// ); +// } +// +// Widget _buildStarFilter() => Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Padding( +// padding: const EdgeInsets.only(top: 10.0, left: 20, bottom: 5), +// child: Wrap( +// spacing: 5, +// crossAxisAlignment: WrapCrossAlignment.center, +// children: [ +// const Circle( +// radius: 5, +// color: Colors.orange, +// ), +// Text( +// '星级查询', +// style: TextStyle( +// color: Theme.of(context).primaryColor, +// fontWeight: FontWeight.bold), +// ), +// ], +// ), +// ), +// MultiChipFilter( +// data: const [1, 2, 3, 4, 5], +// avatarBuilder: (_, index) => +// CircleAvatar(child: Text((index + 1).toString())), +// labelBuilder: (_, selected) => Icon( +// Icons.star, +// color: selected ? Colors.blue : Colors.grey, +// size: 18, +// ), +// onChange: _doSelectStart, +// ), +// const Divider(), +// const SizedBox( +// height: 10, +// ) +// ], +// ); +// +// Widget _buildBodyByState(BuildContext context, WidgetsState state) { +// Widget noSearchArg = const SliverToBoxAdapter(child: NotSearchPage()); +// if (state.filter.name.isEmpty) { +// return noSearchArg; +// } +// +// if (state is WidgetsLoading) { +// return const SliverToBoxAdapter(child: LoadingShower()); +// } +// +// if (state is WidgetsLoadFailed) { +// return const SliverToBoxAdapter(child: ErrorPage()); +// } +// +// if (state is WidgetsLoaded) { +// if (state.widgets.isEmpty) { +// return const SliverToBoxAdapter( +// child: EmptyShower( +// message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", +// ), +// ); +// } +// return _buildSliverList(state.widgets); +// } +// return const SliverToBoxAdapter(child: NotSearchPage()); +// } +// +// Widget _buildSliverList(List models) => SliverList( +// delegate: SliverChildBuilderDelegate( +// (_, int index) => Padding( +// padding: const EdgeInsets.only( +// bottom: 10, top: 2, left: 10, right: 10), +// child: InkWell( +// customBorder: HomeItemSupport.shapeBorderMap[index], +// onTap: () => _toDetailPage(models[index]), +// child: TechnoWidgetListItem( +// data: models[index], +// ))), +// childCount: models.length), +// ); +// +// void _doSelectStart(List select) { +// List temp = select.map((e) => e + 1).toList(); +// if (temp.length < 5) { +// temp.addAll(List.generate(5 - temp.length, (e) => -1)); +// } +// WidgetsBloc widgetsBloc = BlocProvider.of(context); +// final WidgetFilter filter = widgetsBloc.state.filter.copyWith( +// stars: temp, +// ); +// widgetsBloc.add( +// EventSearchWidget(filter: filter), +// ); +// } +// +// void _toDetailPage(WidgetModel model) { +// //收起键盘 +// final FocusScopeNode focusScope = FocusScope.of(context); +// if (focusScope.hasFocus) { +// focusScope.unfocus(); +// } +// BlocProvider.of(context).queryDetail(model); +// Navigator.pushNamed(context, UnitRouter.widget_detail,arguments: model); +// } +// } +// diff --git a/lib/widget_ui/mobile/search_page/standard_search_bar.dart b/lib/widget_ui/mobile/search_page/standard_search_bar.dart index 591b401b..5761a2c8 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_bar.dart +++ b/lib/widget_ui/mobile/search_page/standard_search_bar.dart @@ -15,8 +15,10 @@ class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWid @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? color = Theme.of(context).appBarTheme.backgroundColor; return Container( - color: Colors.white, + color: isDark?color:Colors.white, padding: const EdgeInsets.symmetric(vertical: 8.0), child: Row( children: [ @@ -53,9 +55,10 @@ Icons.arrow_back //提交后,收起键盘 FocusScope.of(context).requestFocus(FocusNode()); }, - decoration: const InputDecoration( + decoration: InputDecoration( filled: true, - fillColor: Color(0xffF3F6F9), + fillColor: isDark?Color(0xff292929):Color(0xffF3F6F9), + prefixIcon: Icon( Icons.search, color: Colors.grey, diff --git a/lib/widget_ui/mobile/search_page/standard_search_page.dart b/lib/widget_ui/mobile/search_page/standard_search_page.dart index 60c28bf2..161206e3 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_page.dart +++ b/lib/widget_ui/mobile/search_page/standard_search_page.dart @@ -31,13 +31,15 @@ class StandardSearchPage extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Scaffold( body: Column( children: [ SizedBox( height: MediaQuery.of(context).padding.top, width: MediaQuery.of(context).size.width, - child: const ColoredBox(color: Colors.white), + child: ColoredBox(color: isDark?Theme.of(context).appBarTheme.backgroundColor??Colors.black:Colors.white), ), const StandardSearchBarInner(), Expanded( diff --git a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart b/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart index 89febf5b..e0160057 100644 --- a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart +++ b/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart @@ -16,61 +16,75 @@ class CollectWidgetListItem extends StatelessWidget { return Stack( children: [ Material( - color: itemColor.withAlpha(66), - shape: TechnoShapeBorder(color: itemColor), - child: Row( - children: [ - _buildLeading(), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTitle(), - _buildSummary(), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], + color: Theme.of(context).listTileTheme.tileColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0,vertical: 6), + child: Row( + children: [ + _buildLeading(), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTitle(), + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + _buildSummary(), + StarScore( + star: Star( + emptyColor: Colors.white, + size: 12, + fillColor: itemColor), + score: data.lever, + ) + ], + ), + const Spacer(), + FeedbackWidget( + onPressed: () { + onDeleteItemClick?.call(data); + }, + child: const Icon( + CupertinoIcons.delete_solid, + color: Colors.red, + size: 20, + ), + ) + ], + ) + + ], + ), ), - ), - ], + ], + ), ), ), - Positioned( - bottom: 5, - right: 5, - child: FeedbackWidget( - onPressed: () { - onDeleteItemClick?.call(data); - }, - child: const Icon( - CupertinoIcons.delete_solid, - color: Colors.red, - ), - )) ], ); } Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), + padding: const EdgeInsets.only(right: 8), child: data.image == null ? Material( color: Colors.transparent, child: CircleText( text: data.name, - size: 50, + size: 40, + fontSize: 18, color: itemColor, ), ) : CircleImage( image: data.image!, - size: 50, + size: 40, ), ); @@ -82,7 +96,7 @@ class CollectWidgetListItem extends StatelessWidget { child: Text(data.name, overflow: TextOverflow.ellipsis, style: const TextStyle( - fontSize: 17, + fontSize: 14, fontWeight: FontWeight.bold, shadows: [ Shadow( @@ -93,14 +107,14 @@ class CollectWidgetListItem extends StatelessWidget { ); Widget _buildSummary() => Padding( - padding: const EdgeInsets.only(left: 5, bottom: 5, top: 5), + padding: const EdgeInsets.only(bottom: 5, top: 5), child: Text( data.nameCN, maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle( color: Colors.grey[600], - fontSize: 14, + fontSize: 12, shadows: const [Shadow(color: Colors.white, offset: Offset(.5, .5))]), ), ); diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart index f044834d..8b88ecd0 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart @@ -20,11 +20,17 @@ class SliverWidgetDetailBar extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? appBarColor = Theme.of(context).appBarTheme.backgroundColor; + Color? appBarTextColor = Theme.of(context).appBarTheme.titleTextStyle?.color; + print(appBarTextColor); + return SliverAppBar( pinned: true, - backgroundColor: backgroundColor, - titleTextStyle: const TextStyle(color: textColor), - iconTheme: const IconThemeData(color: textColor), + backgroundColor: isDark? appBarColor:backgroundColor, + titleTextStyle: TextStyle(color:isDark?appBarTextColor: textColor), + iconTheme: isDark? null:const IconThemeData(color: textColor), + centerTitle: false, expandedHeight: 120.0, scrolledUnderElevation: 0.5, flexibleSpace: DiyFlexibleSpaceBar( @@ -35,13 +41,13 @@ class SliverWidgetDetailBar extends StatelessWidget { ), fixedSubtitle: Text( model.name, - style: const TextStyle(color: Color(0xff696969), fontSize: 12), + style: TextStyle(color: isDark?appBarTextColor:Color(0xff696969), fontSize: 12), ), title: Padding( padding: const EdgeInsets.only(bottom: 3), child: Text( model.nameCN, - style: const TextStyle(color: textColor, fontSize: 16), + style: TextStyle( fontSize: 16,color:isDark?appBarTextColor: textColor), ), ), //伸展处布局 diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart index c30a2885..c56b9552 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart @@ -43,8 +43,10 @@ class WidgetDetailPage extends StatelessWidget { @override Widget build(BuildContext context) { WidgetDetailBloc bloc = context.watch(); + bool isDark = Theme.of(context).brightness == Brightness.dark; return Scaffold( + backgroundColor: isDark?Colors.black:Colors.white, endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), body: Builder(builder: (ctx) => _buildContent(ctx, bloc)), ); diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart index 1b7f1050..f149fbd5 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart @@ -28,7 +28,7 @@ class WidgetDetailPanel extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, + color: Theme.of(context).scaffoldBackgroundColor, child: Text(model.info)), ), ); diff --git a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart b/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart index ed07ff19..cf46fd0a 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart @@ -85,7 +85,7 @@ class _WidgetNodePanelState extends State { Widget _buildNodeInfo() => SizedBox( width: double.infinity, child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, + color: Theme.of(context).scaffoldBackgroundColor, child: Text( widget.subText, style: const TextStyle(fontSize: 12), diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index ea3408db..a99f9126 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/navigation/home_drawer.dart'; import 'package:flutter_unit/app/utils/convert.dart'; -import 'package:old_fancy_mobile_ui/bloc/color_change_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; @@ -38,9 +37,8 @@ class _StandardHomePageState extends State void _switchTab(int index) { WidgetFamily widgetFamily = Convert.toFamily(index); - context - .read() - .change(Cons.tabColors[index], family: widgetFamily); + WidgetsBloc bloc = BlocProvider.of(context); + if(bloc.state.filter.family==widgetFamily) return; BlocProvider.of(context).add(EventTabTap(widgetFamily)); } @@ -48,16 +46,17 @@ class _StandardHomePageState extends State Widget build(BuildContext context) { super.build(context); final AppBarTheme appBarTheme = AppBarTheme.of(context); + bool isDark = Theme.of(context).brightness == Brightness.dark; return Scaffold( - backgroundColor: const Color(0xffF3F4F6), + // backgroundColor: const Color(0xffF3F4F6), drawer: const HomeDrawer(), body: Column( children: [ AnnotatedRegion( value: appBarTheme.systemOverlayStyle!, child: Container( - color: Colors.white, + color: isDark?Colors.black:Colors.white, height: MediaQuery.of(context).padding.top, ), ), @@ -79,11 +78,13 @@ class _StandardHomePageState extends State List _buildHeader(BuildContext context, bool innerBoxIsScrolled) { Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; return [ const SliverSnapHeader(child: StandardHomeSearch()), SliverOverlapAbsorber( sliver: SliverPinnedHeader( + color: isDark?Colors.black:Colors.white, child: TabBar( onTap: _switchTab, indicatorSize: TabBarIndicatorSize.label, @@ -131,12 +132,3 @@ class _StandardHomePageState extends State @override bool get wantKeepAlive => true; } - -class _UnitSliverTopBar extends StatelessWidget { - const _UnitSliverTopBar({super.key}); - - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart index 336c70ce..9a081c8f 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart @@ -12,8 +12,10 @@ class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Container( - color: Colors.white, + color: isDark?null:Colors.white, padding: const EdgeInsets.symmetric(vertical: 8.0), child: Row( children: [ @@ -34,7 +36,7 @@ class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget child: Container( height: 35, padding: const EdgeInsets.only(left: 10, right: 10), - child: const Material( + child: Material( color: Colors.transparent, child: TextField( autofocus: false, @@ -43,7 +45,7 @@ class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget maxLines: 1, decoration: InputDecoration( filled: true, - fillColor: Color(0xffF3F6F9), + fillColor: isDark?Color(0xff292929):Color(0xffF3F6F9), prefixIcon: Icon( Icons.search, color: Colors.grey, diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart index 26acf3a7..a55d7f54 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart @@ -18,21 +18,26 @@ class StandardWidgetItem extends StatelessWidget { @override Widget build(BuildContext context) { + Color? tileColor = Theme.of(context).listTileTheme.tileColor; + Color? textColor = Theme.of(context).listTileTheme.textColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + textColor = isDark?textColor: Color(0xff2F3032); + return Padding( padding: const EdgeInsets.only(top: 10), child: InkWell( onTap: onTap, child: Ink( - color: Colors.white, - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + color: tileColor, + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), // margin: child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _buildTitle(Theme.of(context).primaryColor), - _buildContent(), - _buildFoot() + _buildTitle(Theme.of(context).primaryColor,textColor,isDark), + _buildContent(textColor), + _buildFoot(isDark) ], ), ), @@ -40,15 +45,15 @@ class StandardWidgetItem extends StatelessWidget { ); } - Widget _buildTitle(Color color) { + Widget _buildTitle(Color color,Color? textColor,bool isDark) { return Row( children: [ if (searchArg == null) Text( model.name, - style: const TextStyle( + style: TextStyle( fontSize: 16, - color: Color(0xff2F3032), + color: textColor, fontWeight: FontWeight.bold, ), ), @@ -62,7 +67,7 @@ class StandardWidgetItem extends StatelessWidget { opacity: show ? 1.0 : 0.0, child: Wrapper.just( radius: 10, - color: const Color(0xffF3F3F5), + color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( '已收藏', @@ -70,9 +75,9 @@ class StandardWidgetItem extends StatelessWidget { color: color, height: 1, fontSize: 10, - shadows: const [ + shadows: [ Shadow( - color: Colors.white, + color:isDark? Colors.black: Colors.white, blurRadius: 2, offset: Offset(1, 1)) ]), @@ -89,17 +94,20 @@ class StandardWidgetItem extends StatelessWidget { ); } - Widget _buildContent() { + Widget _buildContent(Color? textColor) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(vertical: 6), child: Text( model.info, - style: const TextStyle(fontSize: 14, color: Color(0xff2F3032)), + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 14, color: textColor), ), ); } - Widget _buildFoot() { + Widget _buildFoot(bool isDark) { + return Row( children: [ Container( @@ -117,17 +125,17 @@ class StandardWidgetItem extends StatelessWidget { const Spacer(), Wrapper.just( radius: 2, - color: const Color(0xffF3F3F5), + color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( Cons.kWidgetFamilyLabelMap[model.family]!, - style: const TextStyle( - color: Color(0xff878D96), + style: TextStyle( + color: isDark?Color(0xffCCCCCC):Color(0xff878D96), height: 1, fontSize: 12, shadows: [ Shadow( - color: Colors.white, blurRadius: 2, offset: Offset(1, 1)) + color: isDark? Colors.black:Colors.white, blurRadius: 2, offset: Offset(1, 1)) ]), ), ), diff --git a/packages/app/lib/app/cons/cons.dart b/packages/app/lib/app/cons/cons.dart index f4d19b89..43b8257f 100644 --- a/packages/app/lib/app/cons/cons.dart +++ b/packages/app/lib/app/cons/cons.dart @@ -65,10 +65,6 @@ class Cons { HighlighterStyle.fromColors(HighlighterStyle.solarized):"cst - Power By cst", }; - static const Map kAppStyleStringMap = { - AppStyle.standard: "标准样式", - AppStyle.fancy: "华丽样式", - }; static final kThemeColorSupport = { Colors.red: "毁灭之红", diff --git a/packages/app/lib/app/style/gap.dart b/packages/app/lib/app/style/gap.dart index 654cf477..2eed71fb 100644 --- a/packages/app/lib/app/style/gap.dart +++ b/packages/app/lib/app/style/gap.dart @@ -11,7 +11,7 @@ class Gap{ static const Widget W5 = SizedBox(width: 5); static const Widget W10 = SizedBox(width: 10); - static const Widget sfl10 = SizedBox(height: 10,child: ColoredBox(color:UnitColor.scaffoldBgLight),); + static const Widget sfl10 = SizedBox(height: 10,); } \ No newline at end of file diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index 5128f317..43a6e28d 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -5,41 +5,84 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class AppTheme { - static ThemeData darkTheme(AppState state) => ThemeData( + static ThemeData darkTheme(AppState state) { + + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.dark, + statusBarIconBrightness: Brightness.light, + ); + bool useMaterial3 = (Platform.isAndroid || Platform.isIOS); + + return ThemeData( + tabBarTheme: TabBarTheme( + dividerColor: Colors.transparent, + ), fontFamily: state.fontFamily, + useMaterial3:useMaterial3, brightness: Brightness.dark, primaryColor: const Color(0xff4699FB), - appBarTheme: const AppBarTheme(backgroundColor: Color(0xff222222)), + listTileTheme: ListTileThemeData( + tileColor: Color(0xff181818), + textColor: Color(0xffD6D6D6), + ), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: Color(0xff181818), + + iconTheme: IconThemeData(color: Color(0xffCCCCCC)), + + titleTextStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold,color: Color(0xffCCCCCC))), floatingActionButtonTheme: const FloatingActionButtonThemeData( foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), - dividerColor: Colors.white, + dividerTheme: DividerThemeData( + color: const Color(0xff2F2F2F), + space: px1, + thickness: px1, + ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Color(0xff181818), selectedItemColor: Color(0xff4699FB)), scaffoldBackgroundColor: const Color(0xff010201)); + } static ThemeData lightTheme(AppState state) { SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark); + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.light, + statusBarIconBrightness: Brightness.dark, + ); - bool useMaterial3 = (Platform.isAndroid || Platform.isIOS)&&state.appStyle!=AppStyle.fancy; + bool useMaterial3 = (Platform.isAndroid || Platform.isIOS); return ThemeData( fontFamily: state.fontFamily, primaryColor: state.themeColor, - useMaterial3: useMaterial3 , + scaffoldBackgroundColor: Color(0xffF3F4F6), + useMaterial3: useMaterial3, + tabBarTheme: TabBarTheme( + dividerColor: Colors.transparent, + ), // Android 使用 Material3 - chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10) - ), + chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), + listTileTheme: ListTileThemeData( + tileColor: Colors.white, + ), dividerTheme: DividerThemeData( color: const Color(0xffDEE0E2), space: px1, thickness: px1, ), + bottomNavigationBarTheme: const BottomNavigationBarThemeData( + backgroundColor: Colors.white), appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: Colors.white, + titleTextStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold,color: Colors.black), ), ); } diff --git a/packages/app/lib/bloc/global_bloc.dart b/packages/app/lib/bloc/global_bloc.dart index 486c7fc0..77355c7b 100644 --- a/packages/app/lib/bloc/global_bloc.dart +++ b/packages/app/lib/bloc/global_bloc.dart @@ -12,7 +12,7 @@ import '../model/global_state.dart'; /// contact me by email 1981462002@qq.com /// 说明: 全局信息的bloc -class AppBloc extends Cubit< AppState> { +class AppBloc extends Cubit { final AppStateRepository storage; @@ -67,8 +67,8 @@ class AppBloc extends Cubit< AppState> { emit(newState); } - void changeAppStyle(AppStyle style) async{ - AppState newState = state.copyWith(appStyle: style); + void changeThemeMode(ThemeMode style) async{ + AppState newState = state.copyWith(themeMode: style); cao.write(newState.toAppConfigPo()); emit(newState); } diff --git a/packages/app/lib/model/app_style.dart b/packages/app/lib/model/app_style.dart index 07ed452b..8b137891 100644 --- a/packages/app/lib/model/app_style.dart +++ b/packages/app/lib/model/app_style.dart @@ -1,5 +1 @@ -enum AppStyle{ - standard, // 标准样式 - fancy, // 华丽样式 -} diff --git a/packages/app/lib/model/global_state.dart b/packages/app/lib/model/global_state.dart index 17f0e07d..9fec9a91 100644 --- a/packages/app/lib/model/global_state.dart +++ b/packages/app/lib/model/global_state.dart @@ -9,7 +9,13 @@ import 'app_style.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com /// 说明: 全局状态类 -/// + +Map themeMode2Str = const { + ThemeMode.system: "跟随系统", + ThemeMode.light: "浅色模式", + ThemeMode.dark: "深色模式", +}; + class AppState extends Equatable { /// [fontFamily] 文字字体 @@ -33,13 +39,13 @@ class AppState extends Equatable { /// [showOverlayTool] 是否显示浮动工具 final bool showOverlayTool; - /// [appStyle] app 样式; - final AppStyle appStyle; + /// [appStyle] app 深色样式; + final ThemeMode themeMode; const AppState({ this.fontFamily = 'ComicNeue', this.themeColor = Colors.blue, - this.appStyle = AppStyle.standard, + this.themeMode = ThemeMode.system, this.showBackGround = true, this.codeStyleIndex = 0, this.itemStyleIndex = 0, @@ -54,7 +60,7 @@ class AppState extends Equatable { showBackGround, codeStyleIndex, itemStyleIndex, - appStyle, + themeMode, showOverlayTool, showPerformanceOverlay ]; @@ -67,7 +73,7 @@ class AppState extends Equatable { int? itemStyleIndex, bool? showPerformanceOverlay, bool? showOverlayTool, - AppStyle? appStyle, + ThemeMode? themeMode, }) => AppState( fontFamily: fontFamily ?? this.fontFamily, @@ -76,7 +82,7 @@ class AppState extends Equatable { codeStyleIndex: codeStyleIndex ?? this.codeStyleIndex, showOverlayTool: showOverlayTool ?? this.showOverlayTool, itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex, - appStyle: appStyle ?? this.appStyle, + themeMode: themeMode ?? this.themeMode, showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay, ); @@ -89,7 +95,7 @@ class AppState extends Equatable { fontFamilyIndex : Cons.kFontFamilySupport.indexOf(fontFamily), themeColorIndex : Cons.kThemeColorSupport.keys.toList().indexOf(themeColor), codeStyleIndex : codeStyleIndex, - appStyleIndex : appStyle.index, + themeModeIndex : themeMode.index, itemStyleIndex : itemStyleIndex, ); @@ -103,7 +109,7 @@ class AppState extends Equatable { itemStyleIndex: po.itemStyleIndex, showPerformanceOverlay: po.showPerformanceOverlay, showOverlayTool: po.showOverlayTool, - appStyle: AppStyle.values[po.appStyleIndex], + themeMode: ThemeMode.values[po.themeModeIndex], ); } diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 366cbecd..9d53ce01 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -27,12 +27,14 @@ class MePageItem extends StatelessWidget { ), Gap.sfl10, _buildItem(context, TolyIcon.icon_them, '应用设置', UnitRouter.setting), + const Divider(), _buildItem( context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), + const Divider(), _buildItem( context, TolyIcon.icon_collect, '我的收藏', UnitRouter.collect), Gap.sfl10, - const Divider(height: 1), + Stack( children: [ _buildItem( @@ -44,10 +46,9 @@ class MePageItem extends StatelessWidget { const Positioned(left: 40, top: 10, child: UpdateRedPoint()) ], ), + const Divider(), _buildItem(context, Icons.info, '关于应用', UnitRouter.about_app), - const Divider( - height: 1, - ), + Gap.sfl10, _buildItem(context, TolyIcon.icon_kafei, '联系本王', UnitRouter.about_me), ], diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/packages/authentication/lib/views/mobile/user/user_page.dart index b4204958..4c6ea20c 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/packages/authentication/lib/views/mobile/user/user_page.dart @@ -19,13 +19,11 @@ class UserPage extends StatelessWidget { @override Widget build(BuildContext context) { - AppStyle style = context.read().state.appStyle; + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'anim_draw.webp':'base_draw.webp'; return Scaffold( - backgroundColor: Colors.white, body: AnnotatedRegion( - value:const SystemUiOverlayStyle( - statusBarIconBrightness: Brightness.dark - ), + value:Theme.of(context).appBarTheme.systemOverlayStyle!, child: Column( children: [ Stack( @@ -35,9 +33,7 @@ class UserPage extends StatelessWidget { width: MediaQuery.of(context).size.width, margin: const EdgeInsets.only(bottom: 40), child: Image.asset( - style == AppStyle.standard - ? 'assets/images/base_draw.webp' - : 'assets/images/sabar_bar.webp', + 'assets/images/$image', fit: BoxFit.cover, ), ), diff --git a/packages/components/lib/toly_ui/input/input_button.dart b/packages/components/lib/toly_ui/input/input_button.dart index 98eb494c..4a90f436 100644 --- a/packages/components/lib/toly_ui/input/input_button.dart +++ b/packages/components/lib/toly_ui/input/input_button.dart @@ -52,7 +52,7 @@ class _InputButtonState extends State { super.initState(); _height = widget.config.height; _fontSize = widget.config.fontSize; - _radius = Radius.circular(_height / 3.6); + _radius = Radius.circular(6); _controller = TextEditingController(text: widget.defaultText); } @@ -98,7 +98,7 @@ class _InputButtonState extends State { elevation: 0, padding: EdgeInsets.zero, shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20))), + borderRadius: BorderRadius.only(topRight: Radius.circular(6),bottomRight: Radius.circular(6))), backgroundColor: const Color(0x99E0E0E0), ), child: Icon(widget.config.iconData,color: Theme.of(context).primaryColor,), diff --git a/packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart b/packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart new file mode 100644 index 00000000..ad38db69 --- /dev/null +++ b/packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart @@ -0,0 +1,383 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +// Examples can assume: +// void setState(VoidCallback fn) { } +// bool _isSelected = true; + +enum _SwitchListTileType { material, adaptive } + +/// A [ListTile] with a [Switch]. In other words, a switch with a label. +/// +/// {@youtube 560 315 https://www.youtube.com/watch?v=0igIjvtEWNU} +/// +/// The entire list tile is interactive: tapping anywhere in the tile toggles +/// the switch. Tapping and dragging the [Switch] also triggers the [onChanged] +/// callback. +/// +/// To ensure that [onChanged] correctly triggers, the state passed +/// into [value] must be properly managed. This is typically done by invoking +/// [State.setState] in [onChanged] to toggle the state value. +/// +/// The [value], [onChanged], [activeColor], [activeThumbImage], and +/// [inactiveThumbImage] properties of this widget are identical to the +/// similarly-named properties on the [Switch] widget. +/// +/// The [title], [subtitle], [isThreeLine], and [dense] properties are like +/// those of the same name on [ListTile]. +/// +/// The [selected] property on this widget is similar to the [ListTile.selected] +/// property. This tile's [activeColor] is used for the selected item's text color, or +/// the theme's [SwitchThemeData.overlayColor] if [activeColor] is null. +/// +/// This widget does not coordinate the [selected] state and the +/// [value]; to have the list tile appear selected when the +/// switch button is on, use the same value for both. +/// +/// The switch is shown on the right by default in left-to-right languages (i.e. +/// in the [ListTile.trailing] slot) which can be changed using [controlAffinity]. +/// The [secondary] widget is placed in the [ListTile.leading] slot. +/// +/// This widget requires a [Material] widget ancestor in the tree to paint +/// itself on, which is typically provided by the app's [Scaffold]. +/// The [tileColor], and [selectedTileColor] are not painted by the +/// [TolySwitchListTile] itself but by the [Material] widget ancestor. In this +/// case, one can wrap a [Material] widget around the [TolySwitchListTile], e.g.: +/// +/// {@tool snippet} +/// ```dart +/// Container( +/// color: Colors.green, +/// child: Material( +/// child: SwitchListTile( +/// tileColor: Colors.red, +/// title: const Text('SwitchListTile with red background'), +/// value: true, +/// onChanged:(bool? value) { }, +/// ), +/// ), +/// ) +/// ``` +/// {@end-tool} +/// +/// ## Performance considerations when wrapping [TolySwitchListTile] with [Material] +/// +/// Wrapping a large number of [TolySwitchListTile]s individually with [Material]s +/// is expensive. Consider only wrapping the [TolySwitchListTile]s that require it +/// or include a common [Material] ancestor where possible. +/// +/// To show the [TolySwitchListTile] as disabled, pass null as the [onChanged] +/// callback. +/// +/// {@tool dartpad} +/// ![SwitchListTile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile.png) +/// +/// This widget shows a switch that, when toggled, changes the state of a [bool] +/// member field called `_lights`. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.0.dart ** +/// {@end-tool} +/// +/// ## Semantics in SwitchListTile +/// +/// Since the entirety of the SwitchListTile is interactive, it should represent +/// itself as a single interactive entity. +/// +/// To do so, a SwitchListTile widget wraps its children with a [MergeSemantics] +/// widget. [MergeSemantics] will attempt to merge its descendant [Semantics] +/// nodes into one node in the semantics tree. Therefore, SwitchListTile will +/// throw an error if any of its children requires its own [Semantics] node. +/// +/// For example, you cannot nest a [RichText] widget as a descendant of +/// SwitchListTile. [RichText] has an embedded gesture recognizer that +/// requires its own [Semantics] node, which directly conflicts with +/// SwitchListTile's desire to merge all its descendants' semantic nodes +/// into one. Therefore, it may be necessary to create a custom radio tile +/// widget to accommodate similar use cases. +/// +/// {@tool dartpad} +/// ![Switch list tile semantics sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_semantics.png) +/// +/// Here is an example of a custom labeled radio widget, called +/// LinkedLabelRadio, that includes an interactive [RichText] widget that +/// handles tap gestures. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.1.dart ** +/// {@end-tool} +/// +/// ## SwitchListTile isn't exactly what I want +/// +/// If the way SwitchListTile pads and positions its elements isn't quite what +/// you're looking for, you can create custom labeled switch widgets by +/// combining [Switch] with other widgets, such as [Text], [Padding] and +/// [InkWell]. +/// +/// {@tool dartpad} +/// ![Custom switch list tile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_custom.png) +/// +/// Here is an example of a custom LabeledSwitch widget, but you can easily +/// make your own configurable widget. +/// +/// ** See code in examples/api/lib/material/switch_list_tile/switch_list_tile.2.dart ** +/// {@end-tool} +/// +/// See also: +/// +/// * [ListTileTheme], which can be used to affect the style of list tiles, +/// including switch list tiles. +/// * [CheckboxListTile], a similar widget for checkboxes. +/// * [RadioListTile], a similar widget for radio buttons. +/// * [ListTile] and [Switch], the widgets from which this widget is made. +class TolySwitchListTile extends StatelessWidget { + /// Creates a combination of a list tile and a switch. + /// + /// The switch tile itself does not maintain any state. Instead, when the + /// state of the switch changes, the widget calls the [onChanged] callback. + /// Most widgets that use a switch will listen for the [onChanged] callback + /// and rebuild the switch tile with a new [value] to update the visual + /// appearance of the switch. + /// + /// The following arguments are required: + /// + /// * [value] determines whether this switch is on or off. + /// * [onChanged] is called when the user toggles the switch on or off. + const TolySwitchListTile({ + super.key, + required this.value, + required this.onChanged, + this.tileColor, + this.activeColor, + this.activeTrackColor, + this.inactiveThumbColor, + this.inactiveTrackColor, + this.activeThumbImage, + this.inactiveThumbImage, + this.title, + this.subtitle, + this.isThreeLine = false, + this.dense, + this.contentPadding, + this.secondary, + this.selected = false, + this.autofocus = false, + this.controlAffinity = ListTileControlAffinity.platform, + this.shape, + this.selectedTileColor, + this.visualDensity, + this.focusNode, + this.onFocusChange, + this.enableFeedback, + this.hoverColor, + }); + + /// Whether this switch is checked. + /// + /// This property must not be null. + final bool value; + + /// Called when the user toggles the switch on or off. + /// + /// The switch passes the new value to the callback but does not actually + /// change state until the parent widget rebuilds the switch tile with the + /// new value. + /// + /// If null, the switch will be displayed as disabled. + /// + /// The callback provided to [onChanged] should update the state of the parent + /// [StatefulWidget] using the [State.setState] method, so that the parent + /// gets rebuilt; for example: + /// + /// {@tool snippet} + /// ```dart + /// SwitchListTile( + /// value: _isSelected, + /// onChanged: (bool newValue) { + /// setState(() { + /// _isSelected = newValue; + /// }); + /// }, + /// title: const Text('Selection'), + /// ) + /// ``` + /// {@end-tool} + final ValueChanged? onChanged; + + /// The color to use when this switch is on. + /// + /// Defaults to accent color of the current [Theme]. + final Color? activeColor; + + /// The color to use on the track when this switch is on. + /// + /// Defaults to [ThemeData.toggleableActiveColor] with the opacity set at 50%. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? activeTrackColor; + + /// The color to use on the thumb when this switch is off. + /// + /// Defaults to the colors described in the Material design specification. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? inactiveThumbColor; + + /// The color to use on the track when this switch is off. + /// + /// Defaults to the colors described in the Material design specification. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final Color? inactiveTrackColor; + + /// {@macro flutter.material.ListTile.tileColor} + final Color? tileColor; + + /// An image to use on the thumb of this switch when the switch is on. + final ImageProvider? activeThumbImage; + + /// An image to use on the thumb of this switch when the switch is off. + /// + /// Ignored if created with [SwitchListTile.adaptive]. + final ImageProvider? inactiveThumbImage; + + /// The primary content of the list tile. + /// + /// Typically a [Text] widget. + final Widget? title; + + /// Additional content displayed below the title. + /// + /// Typically a [Text] widget. + final Widget? subtitle; + + /// A widget to display on the opposite side of the tile from the switch. + /// + /// Typically an [Icon] widget. + final Widget? secondary; + + /// Whether this list tile is intended to display three lines of text. + /// + /// If false, the list tile is treated as having one line if the subtitle is + /// null and treated as having two lines if the subtitle is non-null. + final bool isThreeLine; + + /// Whether this list tile is part of a vertically dense list. + /// + /// If this property is null then its value is based on [ListTileThemeData.dense]. + final bool? dense; + + /// The tile's internal padding. + /// + /// Insets a [TolySwitchListTile]'s contents: its [title], [subtitle], + /// [secondary], and [Switch] widgets. + /// + /// If null, [ListTile]'s default of `EdgeInsets.symmetric(horizontal: 16.0)` + /// is used. + final EdgeInsetsGeometry? contentPadding; + + /// Whether to render icons and text in the [activeColor]. + /// + /// No effort is made to automatically coordinate the [selected] state and the + /// [value] state. To have the list tile appear selected when the switch is + /// on, pass the same value to both. + /// + /// Normally, this property is left to its default value, false. + final bool selected; + + /// {@macro flutter.widgets.Focus.autofocus} + final bool autofocus; + + + /// Defines the position of control and [secondary], relative to text. + /// + /// By default, the value of [controlAffinity] is [ListTileControlAffinity.platform]. + final ListTileControlAffinity controlAffinity; + + /// {@macro flutter.material.ListTile.shape} + final ShapeBorder? shape; + + /// If non-null, defines the background color when [TolySwitchListTile.selected] is true. + final Color? selectedTileColor; + + /// Defines how compact the list tile's layout will be. + /// + /// {@macro flutter.material.themedata.visualDensity} + final VisualDensity? visualDensity; + + /// {@macro flutter.widgets.Focus.focusNode} + final FocusNode? focusNode; + + /// {@macro flutter.material.inkwell.onFocusChange} + final ValueChanged? onFocusChange; + + /// {@macro flutter.material.ListTile.enableFeedback} + /// + /// See also: + /// + /// * [Feedback] for providing platform-specific feedback to certain actions. + final bool? enableFeedback; + + /// The color for the tile's [Material] when a pointer is hovering over it. + final Color? hoverColor; + + @override + Widget build(BuildContext context) { + final Widget control = Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: value, + activeColor: activeColor, + // thumbColor: activet, + trackColor: activeTrackColor, + onChanged:onChanged + )); + + Widget? leading, trailing; + switch (controlAffinity) { + case ListTileControlAffinity.leading: + leading = control; + trailing = secondary; + break; + case ListTileControlAffinity.trailing: + case ListTileControlAffinity.platform: + leading = secondary; + trailing = control; + break; + } + + final ThemeData theme = Theme.of(context); + final SwitchThemeData switchTheme = SwitchTheme.of(context); + final Set states = { + if (selected) MaterialState.selected, + }; + final Color effectiveActiveColor = activeColor + ?? switchTheme.thumbColor?.resolve(states) + ?? theme.colorScheme.secondary; + return MergeSemantics( + child: ListTile( + selectedColor: effectiveActiveColor, + leading: leading, + title: title, + subtitle: subtitle, + trailing: trailing, + isThreeLine: isThreeLine, + dense: dense, + contentPadding: contentPadding, + enabled: onChanged != null, + onTap: onChanged != null ? () { onChanged!(!value); } : null, + selected: selected, + selectedTileColor: selectedTileColor, + autofocus: autofocus, + shape: shape, + tileColor: tileColor, + visualDensity: visualDensity, + focusNode: focusNode, + onFocusChange: onFocusChange, + enableFeedback: enableFeedback, + hoverColor: hoverColor, + ), + ); + } +} diff --git a/packages/components/lib/toly_ui/toly_ui.dart b/packages/components/lib/toly_ui/toly_ui.dart index c4437171..829c9007 100644 --- a/packages/components/lib/toly_ui/toly_ui.dart +++ b/packages/components/lib/toly_ui/toly_ui.dart @@ -20,4 +20,5 @@ export 'decorations/round_rect_rab_indicator.dart'; export 'object/windmill.dart'; export 'sliver_header/sliver_pinned_header.dart'; export 'sliver_header/sliver_snap_header.dart'; +export 'ti/toly_switch_list_tile.dart'; export 'markdown/markdown_widget.dart' hide Highlighter; \ No newline at end of file diff --git a/packages/old_fancy_mobile_ui/.gitignore b/packages/old_fancy_mobile_ui/.gitignore deleted file mode 100644 index 96486fd9..00000000 --- a/packages/old_fancy_mobile_ui/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# 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 -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -.packages -build/ diff --git a/packages/old_fancy_mobile_ui/.metadata b/packages/old_fancy_mobile_ui/.metadata deleted file mode 100644 index fbfa6dfb..00000000 --- a/packages/old_fancy_mobile_ui/.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: b8f7f1f9869bb2d116aa6a70dbeac61000b52849 - channel: stable - -project_type: package diff --git a/packages/old_fancy_mobile_ui/CHANGELOG.md b/packages/old_fancy_mobile_ui/CHANGELOG.md deleted file mode 100644 index 41cc7d81..00000000 --- a/packages/old_fancy_mobile_ui/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/packages/old_fancy_mobile_ui/LICENSE b/packages/old_fancy_mobile_ui/LICENSE deleted file mode 100644 index ba75c69f..00000000 --- a/packages/old_fancy_mobile_ui/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/packages/old_fancy_mobile_ui/README.md b/packages/old_fancy_mobile_ui/README.md deleted file mode 100644 index 02fe8eca..00000000 --- a/packages/old_fancy_mobile_ui/README.md +++ /dev/null @@ -1,39 +0,0 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/packages/old_fancy_mobile_ui/analysis_options.yaml b/packages/old_fancy_mobile_ui/analysis_options.yaml deleted file mode 100644 index a5744c1c..00000000 --- a/packages/old_fancy_mobile_ui/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart b/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart deleted file mode 100644 index 456bf57b..00000000 --- a/packages/old_fancy_mobile_ui/lib/bloc/color_change_bloc.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'dart:ui'; - -import 'package:app/app.dart'; - -import 'package:bloc/bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class SelectTab { - final WidgetFamily family; - final Color color; - - const SelectTab({required this.family, required this.color}); - - Color get tabColor => Cons.tabColors[family.index]; - - Color get nextTabColor => Cons.tabColors[(family.index+1)%Cons.tabColors.length]; - -} - -class ColorChangeCubit extends Cubit { - ColorChangeCubit(Color initColor) - : super(SelectTab( - family: WidgetFamily.statelessWidget, - color: initColor, - )); - - void change(Color color, {WidgetFamily? family}) => emit(SelectTab( - color: color, - family: family ?? state.family, - )); -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/background.dart b/packages/old_fancy_mobile_ui/lib/home_page/background.dart deleted file mode 100644 index 4d65a12b..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/background.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; - -class BackgroundShower extends StatelessWidget { - const BackgroundShower({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Opacity( - opacity: 0.05, - child: DecoratedBox( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/sabar.webp'), - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(400), - topLeft: Radius.circular(400))), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart deleted file mode 100644 index ecef73c9..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/desk_widget_content.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../widget_item/home_item_support.dart'; - -class DeskWidgetContent extends StatelessWidget { - final List items; - final double width; - - const DeskWidgetContent({Key? key,required this.items,required this.width}) : super(key: key); - - @override - Widget build(BuildContext context) { - // - // final SliverGridDelegateWithFixedCrossAxisCount gridDelegate = SliverGridDelegateWithFixedCrossAxisCount( - // crossAxisCount: 2, - // mainAxisSpacing: 10, - // crossAxisSpacing: 20, - // childAspectRatio: 3.2, - // ); - - SliverGridDelegate gridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 400, - mainAxisSpacing: 10, - mainAxisExtent: 100, - crossAxisSpacing: 20, - ); - - return SliverPadding( - padding: const EdgeInsets.all(15), - sliver: SliverGrid( - gridDelegate: gridDelegate, - delegate: SliverChildBuilderDelegate( - (_, int index) => _buildHomeItem(items[index]), - childCount: items.length), - ), - ); - } - - Widget _buildHomeItem(WidgetModel model) { - return BlocBuilder( - buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - builder: (context, state) { - int index = state.itemStyleIndex; - ShapeBorder? shapeBorder = HomeItemSupport.shapeBorderMap[index]; - return InkWell( - customBorder: shapeBorder, - onTap: ()=> _toDetail(context,model), - child: HomeItemSupport.get(model, index)); - }, - ); - } - - // Widget _buildHomeItem(WidgetModel model) => - // BlocBuilder( - // buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - // builder: (_, state) { - // return FeedbackWidget( - // a: 0.95, - // duration: const Duration(milliseconds: 200), - // onEnd: () => _toDetailPage(model), - // child: HomeItemSupport.get(model, state.itemStyleIndex)); - // }, - // ); - - void _toDetail(BuildContext context,WidgetModel model){ - // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart b/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart deleted file mode 100644 index a0410819..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/fancy_home_page.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'dart:math'; - -import 'package:app/app.dart'; - -import 'package:components/project_ui/project_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import '../bloc/color_change_bloc.dart'; -import 'phone_widget_content.dart'; - -class FancyHomePage extends StatefulWidget { - - const FancyHomePage({Key? key}) : super(key: key); - - @override - _FancyHomePageState createState() => _FancyHomePageState(); -} - -class _FancyHomePageState extends State with AutomaticKeepAliveClientMixin { - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - body: Stack( - children: [ - BlocBuilder(builder: _buildBackground), - BlocBuilder( - builder: (_, state) => CustomScrollView( - slivers: [ - _buildPersistentHeader(), - _buildContent(state), - const SliverToBoxAdapter( - child: NoMoreWidget(), - ) - ], - )) - ], - )); - } - - Widget _buildPersistentHeader() => SliverPersistentHeader( - pinned: true, - delegate: FlexHeaderDelegate( - minHeight: 35 + 56.0, - maxHeight: 120.0, - childBuilder: (offset, max, min) { - double dy = max - 25 - offset; - if (dy < min - 25) { - dy = min - 25; - } - return TolyAppBar( - maxHeight: dy, - onItemClick: _switchTab, - ); - })); - - Widget _buildBackground(BuildContext context, AppState state) { - if (state.showBackGround) { - return const BackgroundShower(); - } - return const SizedBox.shrink(); - } - - Widget _buildContent(WidgetsState state) { - if (state is WidgetsLoading) { - return const SliverFillRemaining( - child: LoadingShower(), - ); - } - - if (state is WidgetsLoaded) { - List items = state.widgets; - if (items.isEmpty) { - return const SliverFillRemaining( - child: EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", - ), - ); - } - return SliverLayoutBuilder(builder: (_,c){ - if(c.crossAxisExtent>500){ - return DeskWidgetContent( - items: items, - width: c.crossAxisExtent, - ); - } - return FancyWidgetContent( - items: items, - ); - }); - } - - if (state is WidgetsLoadFailed) { - return SliverFillRemaining( - child: ErrorShower( - error: "数据加载异常:\n${state.error}", - )); - } - return Container(); - } - - void _switchTab(int index) { - WidgetFamily widgetFamily = WidgetFamily.values[index]; - context.read().change(Cons.tabColors[index],family: widgetFamily); - BlocProvider.of(context).add(EventTabTap(widgetFamily)); - } - - @override - bool get wantKeepAlive => true; -} - -class FlexHeaderDelegate extends SliverPersistentHeaderDelegate { - FlexHeaderDelegate({ - required this.minHeight, - required this.maxHeight, - required this.childBuilder, - }); - - final double minHeight; //最小高度 - final double maxHeight; //最大高度 - final Widget Function(double offset, double max, double min) - childBuilder; //最大高度 - - @override - double get minExtent => minHeight; - - @override - double get maxExtent => max(maxHeight, minHeight); - - @override - Widget build( - BuildContext context, double shrinkOffset, bool overlapsContent) { - return childBuilder(shrinkOffset, maxHeight, minHeight); - } - - @override //是否需要重建 - bool shouldRebuild(FlexHeaderDelegate oldDelegate) { - return maxHeight != oldDelegate.maxHeight || - minHeight != oldDelegate.minHeight; - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart b/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart deleted file mode 100644 index 22d99285..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/phone_widget_content.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -class FancyWidgetContent extends StatelessWidget { - final List items; - - const FancyWidgetContent({Key? key,required this.items}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => _buildHomeItem(context, items[index]), - childCount: items.length, - ), - ); - } - - Widget _buildHomeItem(BuildContext context, WidgetModel model) { - return BlocBuilder( - buildWhen: (p, c) => (p.itemStyleIndex != c.itemStyleIndex), - builder: (context, state) { - int index = state.itemStyleIndex; - ShapeBorder? shapeBorder = HomeItemSupport.shapeBorderMap[index]; - return Padding( - padding: const EdgeInsets.only( - bottom: 10, top: 2, left: 10, right: 10), - child: InkWell( - customBorder: shapeBorder, - onTap: () => _toDetail(context, model), - child: HomeItemSupport.get(model, index)), - ); - }, - ); - - } - - void _toDetail(BuildContext context, WidgetModel model) { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart deleted file mode 100644 index 1afe60b7..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/toly_app_bar.dart +++ /dev/null @@ -1,215 +0,0 @@ -import 'package:flutter/material.dart'; - - -class TolyAppBar extends StatefulWidget { - final double maxHeight; - final Function(int)? onItemClick; - final int defaultIndex; - - const TolyAppBar({Key? key, required this.maxHeight, this.onItemClick, this.defaultIndex = 0}) : super(key: key); - - @override - _TolyAppBarState createState() => _TolyAppBarState(); - -} - -const BorderRadius _kBorderRadius = BorderRadius.only( - bottomLeft: Radius.circular(15), - bottomRight: Radius.circular(15), -); - -const TextStyle _kTabTextStyle = TextStyle(color: Colors.white, shadows: [ - Shadow(color: Colors.black, offset: Offset(0.5, 0.5), blurRadius: 0.5) -]); - -class _TolyAppBarState extends State - with SingleTickerProviderStateMixin { - // double? _width; - int _selectIndex = 0; - int _prevSelectIndex = 0; - - static const List colors = [ - 0xff44D1FD, - 0xffFD4F43, - 0xffB375FF, - 0xFF4CAF50, - 0xFFFF9800, - 0xFF00F1F1, - 0xFFDBD83F - ]; - - static const List info = [ - 'Stles', - 'Stful', - 'Scrow', - 'Mcrow', - 'Sliver', - 'Proxy', - 'Other' - ]; - - static const List semantics = [ - '无状态组件', - '有状态组件', - '单子组件', - '多子组件', - '滑动组件', - '代理组件', - '其他组件' - ]; - - late AnimationController _controller; - late Animation circleAnim; - late Animation heightAnim; - late Animation backCircleAnim; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - value: 1, - duration: const Duration(milliseconds: 300), - vsync: this, - ); - circleAnim = circleTween.animate(_controller); - heightAnim = CurveTween(curve: Curves.ease).animate(_controller); - backCircleAnim = ReverseAnimation(circleAnim); - - _selectIndex = widget.defaultIndex; - } - - int get nextIndex => (_selectIndex + 1) % colors.length; - - Tween circleTween = Tween(begin: 1, end: 0); - - @override - Widget build(BuildContext context) { - // _width = MediaQuery.of(context).size.width / colors.length; - return LayoutBuilder( - builder:(_,c)=> Center( - child:Flow( - delegate: TolyAppBarDelegate( - _selectIndex, - _prevSelectIndex, - widget.maxHeight, - repaint: heightAnim, - ), - children: [ - ...colors - .map((e) => GestureDetector( - onTap: () => _onTap(e), - child: _buildChild(e,c.maxWidth/ colors.length), - )) - .toList(), - ...colors.map((e) { - Widget child = CircleAvatar( - backgroundColor: Color(e), - radius: 6, - ); - if (e == colors[_selectIndex]) { - return ScaleTransition(scale: circleAnim, child: child); - } - if (e == colors[_prevSelectIndex]) { - return ScaleTransition(scale: backCircleAnim, child: child); - } - return child; - }) - ]), - ), - ); - } - - Widget _buildChild(int color,double width) { - ThemeData themeData = Theme.of(context); - bool isDark = themeData.brightness == Brightness.dark; - int index = colors.indexOf(color); - return Container( - alignment: const Alignment(0, 0.4), - decoration: BoxDecoration(boxShadow: [ - if(!isDark) - BoxShadow( - color: _selectIndex == colors.indexOf(color) - ? Colors.transparent - : Color(colors[_selectIndex]), - offset: const Offset(1, 1), - blurRadius: 2) - ], color: Color(color), borderRadius: _kBorderRadius), - height: widget.maxHeight + 20, - width: width, - child: Text( - info[index], - style: _kTabTextStyle, - semanticsLabel: '您当前点击了:${semantics[index]}', - ), - ); - } - - void _onTap(int color) { - if (_selectIndex == colors.indexOf(color)) return; - setState(() { - _controller.reset(); - _controller.forward(); - _prevSelectIndex = _selectIndex; - _selectIndex = colors.indexOf(color); - widget.onItemClick?.call(_selectIndex); - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } -} - -class TolyAppBarDelegate extends FlowDelegate { - final int selectIndex; - final int prevSelectIndex; - final double height; - final Animation repaint; - - TolyAppBarDelegate(this.selectIndex, this.prevSelectIndex, this.height, - {required this.repaint}) - : super(repaint: repaint); - - double get factor => repaint.value; - - @override - void paintChildren(FlowPaintingContext context) { - double ox = 0; - double obx = 0; - - for (int i = 0; i < context.childCount / 2; i++) { - Size cSize = context.getChildSize(i)??Size.zero; - if (i == selectIndex) { - context.paintChild(i, - transform: Matrix4.translationValues(ox, 20.0 * factor - 20, 0.0)); - ox += cSize.width; - } else if (i == prevSelectIndex) { - context.paintChild(i, - transform: - Matrix4.translationValues(ox, 20.0 * (1 - factor) - 20, 0.0)); - ox += cSize.width; - } else { - context.paintChild(i, - transform: Matrix4.translationValues(ox, -20, 0.0)); - ox += cSize.width; - } - } - - // 绘制小点 - for (int i = (context.childCount / 2).floor(); i < context.childCount; i++) { - Size size = context.getChildSize(0)??Size.zero; - context.paintChild(i, - transform: Matrix4.translationValues( - obx + size.width / 2 - 5, height + 5, 0)); - obx += size.width; - } - } - - @override - bool shouldRepaint(TolyAppBarDelegate oldDelegate) => - oldDelegate.selectIndex != selectIndex || - oldDelegate.height != height || - oldDelegate.repaint != repaint; -} diff --git a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart b/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart deleted file mode 100644 index 5a02ffdb..00000000 --- a/packages/old_fancy_mobile_ui/lib/home_page/unit_bottom_bar.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; - - -/// create by 张风捷特烈 on 2020-04-11 -/// contact me by email 1981462002@qq.com -/// 说明: 自定义底部导航栏 - -typedef IndexTapCallback = void Function(int); -typedef IndexLongTapCallback = void Function(BuildContext, int); - -class UnitBottomBar extends StatefulWidget { - final Color color; - final int initPosition; - // item 点击事件 - final IndexTapCallback? onItemTap; - - // item 长按事件 - final IndexLongTapCallback? onItemLongTap; - - const UnitBottomBar({Key? key, - this.color = Colors.blue, - this.initPosition = 0, - required this.onItemTap, - this.onItemLongTap, - }) : super(key: key); - - @override - _UnitBottomBarState createState() => _UnitBottomBarState(); -} - -class _UnitBottomBarState extends State { - int _position = 0; - - @override - void initState() { - super.initState(); - _position = widget.initPosition; - } - - final NotchedShape shape = const CircularNotchedRectangle(); - - final borderTR = const BorderRadius.only( - topRight: Radius.circular(10), - ); - - final borderTL = const BorderRadius.only(topLeft: Radius.circular(10)); - final paddingTR = const EdgeInsets.only(top: 2, right: 2); - final paddingTL = const EdgeInsets.only(top: 2, left: 2); - final paddingL = const EdgeInsets.only(left: 8); - final paddingR = const EdgeInsets.only(right: 8); - - bool get isDark => Theme.of(context).brightness == Brightness.dark; - - Color get color { - if(isDark){ - return Theme.of(context).bottomNavigationBarTheme.backgroundColor??const Color(0xff181818); - }else{ - return widget.color; - } - } - - @override - Widget build(BuildContext context) { - return BottomAppBar( - - elevation: 0, - shape: shape, - notchMargin: 5, - color: color, - child: IconTheme( - data: IconTheme.of(context).copyWith(color: isDark?null:Colors.white, size: 25), - child: Stack( - children: [ - _buildLeftBtn(context), - Positioned( - right: 0, - child: _buildRightBtn(context), - ), - ], - ), - )); - } - - Widget _buildLeftBtn(BuildContext context) => Material( - shape: RoundedRectangleBorder(borderRadius: borderTR), - child: Container( - margin: paddingTR, - alignment: Alignment.center, - decoration: BoxDecoration( - color: color.withAlpha(88), borderRadius: borderTR), - height: SizeUnit.bottom_nav_height, - width: SizeUnit.bottom_nav_right_width, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(0), - onLongPressed: () => _onLongPress(context, 0), - child: Container( - padding: paddingL, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.icon_layout, - size: getIconSizeByPosition(0), - color: getIconColorByPosition(0), - )), - ), - ), - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(1), - child: Container( - height: SizeUnit.bottom_nav_height, - padding: paddingR, - child: Icon( - TolyIcon.dingzhi1, - size: getIconSizeByPosition(1), - color: getIconColorByPosition(1), - )), - ), - ), - ], - ), - ), - ); - - Widget _buildRightBtn(BuildContext context) => Material( - shape: RoundedRectangleBorder(borderRadius: borderTL), - child: Container( - margin: paddingTL, - alignment: Alignment.center, - decoration: BoxDecoration( - color: color.withAlpha(88), borderRadius: borderTL), - height: SizeUnit.bottom_nav_height, - width: SizeUnit.bottom_nav_right_width, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(2), - child: Container( - padding: paddingL, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.icon_collect, - size: getIconSizeByPosition(2), - color: getIconColorByPosition(2), - )), - ), - ), - Expanded( - child: FeedbackWidget( - onPressed: () => _updateIndex(3), - onLongPressed: () => _onLongPress(context, 3), - child: Stack( - children: [ - Container( - padding: paddingR, - height: SizeUnit.bottom_nav_height, - child: Icon( - TolyIcon.yonghu, - size: getIconSizeByPosition(3), - color: getIconColorByPosition(3), - )), - // const Positioned( - // left: 20, - // top: 5, - // child: UpdateRedPoint()) - ], - ), - ), - ), - ], - ), - ), - ); - - double getIconSizeByPosition(int position) => _position == position - ? SizeUnit.active_bottom_nav_icon - : SizeUnit.default_bottom_nav_icon; - - Color getIconColorByPosition(int position) => - _position == position ? isDark? Colors.blue: widget.color : Colors.white; - - void _updateIndex(int index) { - setState(() { - _position = index; - widget.onItemTap?.call(_position); - }); - } - - void _onLongPress(BuildContext context, int index) { - widget.onItemLongTap?.call(context, index); - } - - -} diff --git a/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart b/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart deleted file mode 100644 index 7e1a7393..00000000 --- a/packages/old_fancy_mobile_ui/lib/old_fancy_mobile_ui.dart +++ /dev/null @@ -1,18 +0,0 @@ -library old_fancy_mobile_ui; - -export 'widget_item/coupon_widget_list_item.dart'; -export 'widget_item/home_item_support.dart'; -export 'widget_item/simple_widget_list_item.dart'; -export 'widget_item/techno_widget_list_item.dart'; - -export 'splash/flutter_unit_splash.dart'; -export 'splash/flutter_unit_text.dart'; -export 'splash/splash_bottom.dart'; -export 'splash/unit_paint.dart'; -export 'splash/unit_splash.dart'; - -export 'home_page/background.dart'; -export 'home_page/desk_widget_content.dart'; -export 'home_page/toly_app_bar.dart'; -export 'home_page/unit_bottom_bar.dart'; -export 'home_page/unit_bottom_bar.dart'; \ No newline at end of file diff --git a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart deleted file mode 100644 index 86d62ef6..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/flutter_unit_splash.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - - - -class FlutterUnitSplash extends StatefulWidget { - const FlutterUnitSplash({Key? key}) : super(key: key); - - @override - State createState() => _FlutterUnitSplashState(); -} - -class _FlutterUnitSplashState extends State { - - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return BlocListener( - listener: _listenStart, - child: Material( - child: Center( - child: Text('捷特', textDirection: TextDirection.ltr,), - ), - ), - ); - } - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - print('======_listenStart========'); - BlocProvider.of(context).add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - // _loaded = true; - // if(_splashDone){ - // Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - // } - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart b/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart deleted file mode 100644 index d054127c..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/splash_bottom.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'dart:async'; -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; - -class SplashBottom extends StatefulWidget { - const SplashBottom({Key? key}) : super(key: key); - - - - @override - _SplashBottomState createState() => _SplashBottomState(); -} - -class _SplashBottomState extends State { - bool _animStart = false; - - final Duration delayTime = const Duration(milliseconds: 600); - final Duration animTime = const Duration(milliseconds: 800); - final String logoPath = 'assets/images/icon_head.webp'; - - @override - void initState() { - super.initState(); - // 延迟 600 ms 后开启动画 - Future.delayed(delayTime).then(startAnim); - } - - void startAnim(value){ - setState(() { - _animStart = true; - }); - } - - @override - Widget build(BuildContext context) { - return AnimatedOpacity( - duration: animTime, - opacity: _animStart ? 1.0 : 0.0, - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - Text("Power By 张风捷特烈", style: UnitTextStyle.splashShadows), - Text("· 2021 · @编程之王 ", style: UnitTextStyle.splashShadows), - ], - )); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart b/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart deleted file mode 100644 index 6bf790a6..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/unit_paint.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页画板 - -class UnitPainter extends CustomPainter { - late Paint _paint; - final double width; - late Animation _curveAnim; - final Color color; - - final Path _path1 = Path(); - final Path _path2 = Path(); - final Path _path3 = Path(); - final Path _path4 = Path(); - - UnitPainter( - {this.width = 200.0, - this.color = Colors.blue, - required Animation repaint}) - : super(repaint: repaint) { - _paint = Paint(); - _curveAnim = CurvedAnimation(parent: repaint, curve: Curves.fastOutSlowIn); - } - - @override - void paint(Canvas canvas, Size size) { - _path1.reset(); - _path2.reset(); - _path3.reset(); - _path4.reset(); - var factor = _curveAnim.value; - canvas.translate( - size.width / 2 - width * 0.5, size.height / 2 - width * 0.5); - - canvas.save(); - canvas.translate( - -size.width / 2 * (1 - factor), -size.width / 2 * (1 - factor)); - drawColor1(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - size.width / 2 * (1 - factor), -size.width / 2 * (1 - factor)); - drawColor2(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - size.width / 2 * (1 - factor), size.width / 2 * (1 - factor)); - drawColor3(canvas); - canvas.restore(); - - canvas.save(); - canvas.translate( - -size.width / 2 * (1 - factor), size.width / 2 * (1 - factor)); - drawColor4(canvas); - canvas.restore(); - } - - @override - bool shouldRepaint(UnitPainter oldDelegate) { - return - oldDelegate.color!=color|| - oldDelegate.width!=width|| - oldDelegate._curveAnim!=_curveAnim; - } - - void drawColor1(Canvas canvas) { - double factor = _curveAnim.value; - _path1.moveTo(0, 0); - _path1.lineTo(width * 0.618 * factor - 1, 0); - _path1.lineTo(width * 0.5 - 1, width * 0.5 - 1); - _path1.lineTo(0, width * (1 - 0.618) * factor - 1); - - canvas.drawPath(_clipAngle(_path1), _paint..color = Colors.red); - } - - void drawColor2(Canvas canvas) { - double factor = _curveAnim.value; - _path2.moveTo(width * 0.618 * factor, 0); - _path2.lineTo(width, 0); - _path2.lineTo(width, width * 0.618 * factor); - _path2.lineTo(width * 0.5, width * 0.5); - - canvas.drawPath(_clipAngle(_path2), _paint..color = Colors.blue); - } - - void drawColor3(Canvas canvas) { - double factor = _curveAnim.value; - _path3.moveTo(width * 0.5 + 1, width * 0.5 + 1); - _path3.lineTo(width, width * 0.618 * factor + 1); - _path3.lineTo(width, width); - _path3.lineTo(width * (1 - 0.618) * factor + 1, width); - canvas.drawPath(_clipAngle(_path3), _paint..color = Colors.green); - } - - void drawColor4(Canvas canvas) { - double factor = _curveAnim.value; - _path4.moveTo(0, width * (1 - 0.618) * factor); - _path4.lineTo(width * 0.5, width * 0.5); - _path4.lineTo(width * (1 - 0.618) * factor, width); - _path4.lineTo(0, width); - canvas.drawPath(_clipAngle(_path4), _paint..color = Colors.yellow); - } - - Path _clipAngle(Path path) { - return Path.combine( - PathOperation.difference, - path, - Path() - ..addOval(Rect.fromCircle( - center: Offset(width * 0.5, width * 0.5), radius: 25.0))); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart b/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart deleted file mode 100644 index 92acb25c..00000000 --- a/packages/old_fancy_mobile_ui/lib/splash/unit_splash.dart +++ /dev/null @@ -1,174 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'flutter_unit_text.dart'; -import 'splash_bottom.dart'; -import 'unit_paint.dart'; -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页 - -class UnitSplash extends StatefulWidget { - const UnitSplash({Key? key}) : super(key: key); - - @override - _UnitSplashState createState() => _UnitSplashState(); -} - -class _UnitSplashState extends State with TickerProviderStateMixin { - late AnimationController _controller; - - final ValueNotifier _animEnd = ValueNotifier(false); - - final Duration animTime = const Duration(milliseconds: 1000); - final Duration delayTime = const Duration(milliseconds: 500); - final Duration fadeInTime = const Duration(milliseconds: 600); - - late Animation logoOffsetAnim; - late Animation headOffsetAnim; - late Animation logoScaleAnim; - - late UnitPainter unitPainter = UnitPainter(repaint: _controller); - - @override - void initState() { - super.initState(); - - SystemChrome.setSystemUIOverlayStyle( - const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - ), - ); - - _controller = AnimationController(duration: animTime, vsync: this) - ..addStatusListener(_listenStatus) - ..forward(); - - initAnimation(); - - Future.delayed(delayTime).then((e) => _animEnd.value = true); - } - - void initAnimation() { - logoOffsetAnim = Tween( - begin: const Offset(0, 0), - end: const Offset(0, -1.5), - ).animate(_controller); - - headOffsetAnim = Tween( - end: const Offset(0, 0), - begin: const Offset(0, -5), - ).animate(_controller); - - logoScaleAnim = Tween(begin: 2.0, end: 1.0).animate(_controller); - } - - @override - void dispose() { - _controller.dispose(); - _animEnd.dispose(); - super.dispose(); - } - - - bool _loaded = false; - bool _splashDone = false; - - - - void _listenStatus(AnimationStatus status) { - if (status == AnimationStatus.completed) { - Future.delayed(delayTime).then((e) { - _splashDone = true; - if(_loaded){ - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - } - }); - } - } - - - @override - Widget build(BuildContext context) { - final Size winSize = MediaQuery.of(context).size; - return Material( - child: BlocListener( - listener: _listenStart, - child: Stack( - alignment: Alignment.center, - children: [ - _buildFlutterLogo(), - CustomPaint( - painter: unitPainter, - size: winSize, - ), - _buildFlutterUnitText(winSize.height, winSize.width), - _buildHead(), - const Positioned(bottom: 15, child: SplashBottom()) - ], - ), - ), - ); - } - - Widget _buildFlutterUnitText(double winH, double winW) { - return Positioned( - top: winH / 1.4, - child: ValueListenableBuilder( - child: FlutterUnitText( - text: StrUnit.appName, - color: Theme.of(context).primaryColor, - ), - valueListenable: _animEnd, - builder: (_, bool value, Widget? child) => value - ? child! : const SizedBox(), - ), - ); - } - - Widget _buildFlutterLogo() { - return SlideTransition( - position: logoOffsetAnim, - child: RotationTransition( - turns: _controller, - child: ScaleTransition( - scale: logoScaleAnim, - child: FadeTransition( - opacity: _controller, - child: const SizedBox( - height: 120, - child: FlutterLogo( - size: 60, - ), - )), - )), - ); - } - - Widget _buildHead() => SlideTransition( - position: headOffsetAnim, - child: Image.asset( - 'assets/images/icon_head.webp', - width: 45, - height: 45, - ), - ); - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - BlocProvider.of(context).add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - _loaded = true; - if(_splashDone){ - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - } - } - -} - diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart deleted file mode 100644 index 9262f24b..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/coupon_widget_list_item.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - -class CouponWidgetListItem extends StatelessWidget { - final WidgetModel data; - final bool hasTopHole; - final bool hasBottomHole; - final bool isClip; - - const CouponWidgetListItem( - {Key? key, - required this.data, - this.hasTopHole = true, - this.hasBottomHole = false, - this.isClip = true}) - : super(key: key); - - final List colors = Cons.tabColors; - - @override - Widget build(BuildContext context) { - final CouponShapeBorder couponShapeBorder = CouponShapeBorder( - hasTopHole: hasTopHole, - hasBottomHole: hasBottomHole, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20); - - return Stack( - children: [ - isClip - ? ClipPath( - clipper: ShapeBorderClipper(shape: couponShapeBorder), - child: buildContent(), - ) - : buildContent(), - _buildCollectTag(Theme.of(context).primaryColor) - ], - ); - } - - Widget buildContent() => Container( - color: - data.death ? Colors.grey : colors[data.family.index].withAlpha(66), - height: 95, - padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - buildLeading(), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary()], - ), - ), - ], - ), - ); - - Widget buildLeading() => Padding( - padding: const EdgeInsets.all(5.0), - child: Hero( - tag: "hero_widget_image_${data.id}", - child: Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 60, - color: invColor, - ), - ), - ), - ); - - Color get invColor { - return colors[data.family.index]; - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 20 - 6.0), - child: Tag( - color: color, - shadowHeight: 6.0, - size: const Size(15, 20), - ), - ), - ); - })); - } - - Widget _buildTitle() { - return Expanded( - child: Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated - ? TextDecoration.lineThrough - : TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - StarScore( - star: Star(emptyColor: Colors.white, size: 15, fillColor: invColor), - score: data.lever, - ), - ], - ), - ); - } - - Widget _buildSummary() { - return Padding( - padding: const EdgeInsets.only(left: 10, bottom: 10, top: 5), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.grey[600], fontSize: 14, shadows: const [ - Shadow(color: Colors.white, offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart b/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart deleted file mode 100644 index 002ea459..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/home_item_support.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'dart:math'; -import 'package:app/app.dart'; - -import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; - -import 'coupon_widget_list_item.dart'; -import 'simple_widget_list_item.dart'; -import 'techno_widget_list_item.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -class HomeItemSupport { - - static Map shapeBorderMap={ - 1: TechnoShapeBorder(), - 2: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), - 3: const CouponShapeBorder( - hasTopHole: true, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - 4: const CouponShapeBorder( - hasTopHole: false, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - 5: const CouponShapeBorder( - hasTopHole: true, - hasBottomHole: false, - hasLine: false, - edgeRadius: 25, - lineRate: 0.20), - }; - - static Widget get( - WidgetModel model, - int index, - ) { - switch (index) { - case 1: - return TechnoWidgetListItem(data: model); - case 2: - return SimpleWidgetListItem(data: model); - case 3: - return CouponWidgetListItem(data: model); - case 4: - return CouponWidgetListItem(hasTopHole: false, data: model); - case 5: - return CouponWidgetListItem( - hasTopHole: true, hasBottomHole: true, data: model); - case 6: - return CouponWidgetListItem(isClip: false, data: model); - } - return TechnoWidgetListItem(data: model); - } - - static List itemSimples() => [ - Container( - height: 10, - ), - TechnoWidgetListItem(data: getContainer()), - SimpleWidgetListItem(data: getContainer()), - CouponWidgetListItem(data: getContainer()), - CouponWidgetListItem(hasTopHole: false, data: getContainer()), - CouponWidgetListItem( - hasTopHole: true, hasBottomHole: true, data: getContainer()), - CouponWidgetListItem(isClip: false, data: getContainer()), - ]; - - static WidgetModel getContainer() => WidgetModel( - id: Random().nextInt(10000), - name: 'Container', - nameCN: "", - links: const [], - lever: 5, - family: WidgetFamily.statelessWidget, - info: '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...'); -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart deleted file mode 100644 index 016645ab..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/simple_widget_list_item.dart +++ /dev/null @@ -1,146 +0,0 @@ -import 'package:app/app.dart'; - -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2020/11/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -class SimpleWidgetListItem extends StatelessWidget { - final WidgetModel data; - - const SimpleWidgetListItem({Key? key, - required this.data, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: itemColor.withAlpha(66), - borderRadius: BorderRadius.circular(6) - ), - // margin: const EdgeInsets.only(bottom: 10,top:2,left: 10,right: 10), - child: Stack( - children: [ - Container( - height: 95, - padding: - const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - Wrap( - spacing: 5, - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Hero( - tag: "hero_widget_image_${data.id}", - child: _buildLeading()), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary()], - ), - ), - ], - ), - ), - _buildCollectTag(Theme.of(context).primaryColor) - ], - ), - ); - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 30 - 8.0), - child: Tag( - color: color, - shadowHeight: 8.0, - size: const Size(20, 30), - ), - ), - ); - })); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - text: data.name, - size: 60, - color: itemColor, - ), - ) - : CircleImage( - image: data.image!, - size: 55, - ), - ); - - Color get itemColor => Cons.tabColors[data.family.index]; - - Widget _buildTitle() { - return Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated?TextDecoration.lineThrough:TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - ], - ); - } - - Widget _buildSummary() { - return Container( - padding: const EdgeInsets.only(left: 10), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Colors.grey[600], fontSize: 14, shadows: const [ - Shadow(color: Colors.white, offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart b/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart deleted file mode 100644 index 4ecaa119..00000000 --- a/packages/old_fancy_mobile_ui/lib/widget_item/techno_widget_list_item.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:widget_repository/widget_repository.dart'; - -class TechnoWidgetListItem extends StatelessWidget { - final WidgetModel data; - - const TechnoWidgetListItem({Key? key, required this.data}) : super(key: key); - - @override - Widget build(BuildContext context) { - ThemeData themeData = Theme.of(context); - bool isDark = themeData.brightness == Brightness.dark; - Color tagColor = isDark?themeData.floatingActionButtonTheme.backgroundColor!: themeData.primaryColor; - return Stack( - children: [ - Material( - // color: Colors.transparent, - color: isDark ? itemColor.withAlpha(22) : itemColor.withAlpha(66), - shape: TechnoShapeBorder(color: itemColor), - child: Container( - height: 95, - padding: - const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 5), - child: Row( - children: [ - Wrap( - spacing: 5, - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Hero( - tag: "hero_widget_image_${data.id}", - child: _buildLeading()), - StarScore( - star: Star( - emptyColor: Colors.white, - size: 12, - fillColor: itemColor), - score: data.lever, - ) - ], - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [_buildTitle(), _buildSummary(isDark)], - ), - ), - ], - ), - ), - ), - _buildCollectTag(tagColor) - ], - ); - } - - Widget _buildCollectTag(Color color) { - return Positioned( - top: 0, - right: 40, - child: BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(data); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: SizedOverflowBox( - alignment: Alignment.bottomCenter, - size: const Size(0, 30 - 8.0), - child: Tag( - color: color, - shadowHeight: 8.0, - size: const Size(20, 30), - ), - ), - ); - })); - } - - Widget _buildLeading() => Padding( - padding: const EdgeInsets.only(left: 5, right: 5), - child: data.image == null - ? Material( - color: Colors.transparent, - child: CircleText( - // backgroundColor: Colors.bla, - text: data.name, - size: 60, - color: itemColor, - ), - ) - : CircleImage( - image: data.image!, - size: 55, - ), - ); - - Color get itemColor => data.death?Colors.grey:Cons.tabColors[data.family.index]; - - - Widget _buildTitle() { - return Row( - children: [ - const SizedBox(width: 10), - Expanded( - child: Text(data.name, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.bold, - decoration: data.deprecated?TextDecoration.lineThrough:TextDecoration.none, - decorationThickness: 2, - shadows: const [ - Shadow(color: Colors.white, offset: Offset(.3, .3)) - ])), - ), - ], - ); - } - - Widget _buildSummary(bool isDark) { - return Container( - padding: const EdgeInsets.only(left: 10), - child: Text( - //尾部摘要 - data.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: isDark ? Colors.white : Colors.grey[600], - fontSize: 14, - shadows: [ - Shadow( - color: isDark ? Colors.grey[600]! : Colors.white, - offset: Offset(.5, .5)) - ]), - ), - ); - } -} diff --git a/packages/old_fancy_mobile_ui/pubspec.yaml b/packages/old_fancy_mobile_ui/pubspec.yaml deleted file mode 100644 index f691a2ca..00000000 --- a/packages/old_fancy_mobile_ui/pubspec.yaml +++ /dev/null @@ -1,65 +0,0 @@ -name: old_fancy_mobile_ui -description: A new Flutter package project. -version: 0.0.1 -homepage: -publish_to: none - -environment: - sdk: '>=2.18.5 <3.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - url_launcher: ^6.0.20 # url - flutter_star: ^1.0.2 # 星星组件 - app: - path: ../app - components: - path: ../components - widget_module: - path: ../widget_module - widget_repository: - path: ../widget_repository -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.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 packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, 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 in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart b/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart deleted file mode 100644 index 82b74e03..00000000 --- a/packages/old_fancy_mobile_ui/test/old_fancy_mobile_ui_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -// import 'package:flutter_test/flutter_test.dart'; -// -// import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -// -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } diff --git a/packages/storage/lib/src/sp_storage/models/app_config_po.dart b/packages/storage/lib/src/sp_storage/models/app_config_po.dart index 3597a064..c3eaeb23 100644 --- a/packages/storage/lib/src/sp_storage/models/app_config_po.dart +++ b/packages/storage/lib/src/sp_storage/models/app_config_po.dart @@ -6,7 +6,7 @@ class AppConfigPo { final bool showPerformanceOverlay; final int fontFamilyIndex; final int codeStyleIndex; - final int appStyleIndex; + final int themeModeIndex; final int itemStyleIndex; final int themeColorIndex; @@ -17,7 +17,7 @@ class AppConfigPo { this.fontFamilyIndex = 1, this.themeColorIndex = 4, this.codeStyleIndex = 0, - this.appStyleIndex = 0, + this.themeModeIndex = 0, this.itemStyleIndex = 0, }); @@ -29,7 +29,7 @@ class AppConfigPo { fontFamilyIndex: map['fontFamilyIndex'] ?? 1, themeColorIndex: map['themeColorIndex'] ?? 4, codeStyleIndex: map['codeStyleIndex'] ?? 0, - appStyleIndex: map['appStyleIndex'] ?? 0, + themeModeIndex: map['themeModeIndex'] ?? 0, itemStyleIndex: map['itemStyleIndex'] ?? 0, ); } @@ -41,7 +41,7 @@ class AppConfigPo { 'fontFamilyIndex': fontFamilyIndex, 'themeColorIndex': themeColorIndex, 'codeStyleIndex': codeStyleIndex, - 'appStyleIndex': appStyleIndex, + 'themeModeIndex': themeModeIndex, 'itemStyleIndex': itemStyleIndex, }; } diff --git a/packages/widget_repository/lib/src/model/category_model.dart b/packages/widget_repository/lib/src/model/category_model.dart index 01373929..47ff5096 100644 --- a/packages/widget_repository/lib/src/model/category_model.dart +++ b/packages/widget_repository/lib/src/model/category_model.dart @@ -37,7 +37,7 @@ class CategoryModel extends Equatable { id: po.id, name: po.name, info: po.info, - createDate:po.created!=null? DateFormat('yyyy-MM-dd HH:mm').format(po.created!):null, + createDate:po.created!=null? DateFormat('yyyy/MM/dd').format(po.created!):null, imageCover: po.image, count: po.count, color: ColorUtils.parse(po.color), diff --git a/pubspec.lock b/pubspec.lock index 3dd921b0..45860e3a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -361,13 +361,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" - old_fancy_mobile_ui: - dependency: "direct main" - description: - path: "packages/old_fancy_mobile_ui" - relative: true - source: path - version: "0.0.1" package_info_plus: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index fdc44ec1..97829ec7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,8 +65,8 @@ dependencies: path: packages/components widget_module: path: packages/widget_module - old_fancy_mobile_ui: - path: packages/old_fancy_mobile_ui +# old_fancy_mobile_ui: +# path: packages/old_fancy_mobile_ui dev_dependencies: flutter_test: From 0b2bc27ca109a148c455930c4400ece3c055fb6e Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 24 Jun 2023 08:59:58 +0800 Subject: [PATCH 018/149] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa4a5878..29266bcc 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ | 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | |------|------------|------|------------| | Android版 | http://toly1994.com/file/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | 暂未提供,可自己下载项目运行 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 | https://apps.apple.com/cn/app/flutter-unit/id6450545123 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| | MacOS版 | http://toly1994.com/file/flutter_unit_mac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| | Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| | Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| From 8a8d81b550760d60f75f10cc2c791a1b94e95ddc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 25 Jun 2023 07:38:00 +0800 Subject: [PATCH 019/149] =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E7=AB=AF=E6=9A=97?= =?UTF-8?q?=E9=BB=91=E6=A8=A1=E5=BC=8F=EF=BC=8Cfix=E5=B7=B2=E7=9F=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iconfont/{iconfont.ttf => toly_icon.ttf} | Bin 10852 -> 11412 bytes .../desk_ui/theme_model_switch_icon.dart | 29 +++++ .../desk_ui/unit_rail_navigation.dart | 77 +++++++------ lib/app/navigation/unit_navigation.dart | 2 +- lib/app/router/unit_router.dart | 7 +- lib/app/views/about/about_app_page.dart | 81 ++++++------- lib/app/views/about/about_me_page.dart | 8 +- lib/app/views/about/version_info.dart | 7 +- lib/code_gen/desk_widget_top_bar.dart | 3 +- .../icon_font_gen/icon_font_gen_page.dart | 13 ++- lib/components/top_bar/desk_tab_top_bar.dart | 4 +- lib/painter_system/gallery_detail_page.dart | 4 +- lib/painter_system/picture_frame.dart | 2 +- .../views/desk_ui/desk_point_page.dart | 9 +- .../views/desk_ui/github_repo_panel.dart | 3 +- .../views/issues_point/issue_item.dart | 6 +- .../views/issues_point/issues_detail.dart | 61 ++++++---- .../widget_detail/widget_detail_bar.dart | 53 +++++---- .../desk_ui/widget_panel/desk_search_bar.dart | 11 +- .../widget_panel/desk_widget_model_item.dart | 40 ++++--- .../widget_panel/desk_widget_top_bar.dart | 7 +- .../desk_ui/widget_panel/window_buttons.dart | 106 +++++++++--------- .../mobile/category_page/category_page.dart | 2 +- .../mobile/category_page/collect_page.dart | 13 ++- .../widget_detail/widget_detail_bar.dart | 3 +- .../widget_panel/standard_home_page.dart | 2 +- packages/app/lib/app/res/toly_icon.dart | 66 +++++------ packages/app/lib/app/theme/app_theme.dart | 8 +- .../lib/views/app_update_panel.dart | 8 ++ .../lib/views/mobile/user/page_item.dart | 8 +- .../lib/toly_ui/code/code_widget.dart | 2 +- .../lib/toly_ui/code/high_light_code.dart | 11 +- pubspec.yaml | 2 +- 33 files changed, 394 insertions(+), 264 deletions(-) rename assets/iconfont/{iconfont.ttf => toly_icon.ttf} (80%) create mode 100644 lib/app/navigation/desk_ui/theme_model_switch_icon.dart diff --git a/assets/iconfont/iconfont.ttf b/assets/iconfont/toly_icon.ttf similarity index 80% rename from assets/iconfont/iconfont.ttf rename to assets/iconfont/toly_icon.ttf index 5860038f01048fb59f48a1b6a7cfbca2c9928ff6..91afc37828a23fb3976581f4f5aca81c8de636f6 100644 GIT binary patch delta 1467 zcmaiyU1(fI6vzK_@9y2ZAK6`ZH=8s~(qy;!YJ+Juo4aD`y2LcZ$CS{r~Fb~>?Jctk<%G?qvNI(#w-Tr4MDe=iW{ATWa zoH_q<&O92u`qt%rrJsu*>;Q~Kz+;_0yEMI$`E?br9ssQuXHHF>Z2Nq69>5>Onc;#h zJ%955F4;X(ys&ubT4fy&PdLALcJ9Q~CFj$_v|r|YxHz>qFC2W&{d&$@W~Yj$qF)^N z2Iw56&(rgB=W8w$u8o`n_V7ZndgX5VjWh($l6?Kx_+;e3-w1lRKndT~zPdG5HYy)_ zYt4^1w_&JNe#$P5+whlD;-B&}VV4_>w>u`P>kwlwtAE`b1N1%tkLad_gBEy@EZ;Ob z%pP~B{EN{a;pkp>Z@FuaC)P(QmGTc}e@XD9Y6Z4|%{GYtYd|e_p_x8w(26>E;YX61 zgNPu6mk`4as!1S)I2x#=5j#;&od&{aLX^rZ_!yc+4gZ!~On)g<4fTfV`K18KxE1sS z$y6!m6VlSqJ0$N=PzR)~p(04XhT0&R6$Mp71~t?R8P-raWW1z09!hddXc!J8ACZEA zL8dhf5i+Y`u#m$Vh7I|qh6#Y2(=Zi~d4E%2gOZB)s)jj(ys2UKAivfy zkC68@%qXO*VQ%44pn_S3+oMtM!X476*W_N;um*5%X;=-oYd}eLEDRn`Xjmewk7!sd ztRK>-vQ@t1HK3LL;te>t3Wm|5ljTfgSSK3 znncZKHS6KS;nm2#$irwp`jZk^`OCawMp0sAMcAlKG>g7WUgVOs37_S&QXTCb?b)1@ zbNVvIh;yWOaN*$o>EW=Q>pyzzw_`{9bLywqW!mB4>HP;6278Yj%cm+ck#RHTss-BdWo4qyIvnxGQ^LYF6noLB9+h=h(`aWR%PI=Ub7{6X}bsD&Sk4N kCDP^loda=^7Q5j&Id$$G`@Q3n=ND#Ym+pAGCI#Q;bFFh1MgRZ+ delta 909 zcmaKq&r4KM9L3Ll@6F7c-)31_rp_oCm5@J(7K4PjC=tqNlM8Jue-xTh64RoFprRIu zF>Zsvg&~rmyO4c7F0`zPDj+ z8nDIydwFp9)IK)J|k4_fa6!xgc>*~Ei72|g-=#XbjF+aR@Qqqx{Ad@%5KanH2FP) z3|hDQ3H+}EJFy>?REwe-Wz-8{7lH^QPUR#@u!j|wQg;W+QH8yzz;48_4+;8k5TK2q z?}o$TM_Z{puflINfY73bA`qscp&W!qG!%w}4BD``1{MPe8(0>EA!t}2M86{}6_PNp zXo%JzdDaivhE5B~}mjTW> zPPWmvr5eCjbBd diff --git a/lib/app/navigation/desk_ui/theme_model_switch_icon.dart b/lib/app/navigation/desk_ui/theme_model_switch_icon.dart new file mode 100644 index 00000000..e8237b66 --- /dev/null +++ b/lib/app/navigation/desk_ui/theme_model_switch_icon.dart @@ -0,0 +1,29 @@ +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +class ThemeModelSwitchIcon extends StatelessWidget { + const ThemeModelSwitchIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + ThemeMode model = context.select((bloc)=>bloc.state.themeMode); + bool isDark = Theme.of(context).brightness == Brightness.dark; + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: (){ + context.read().changeThemeMode(isDark?ThemeMode.light:ThemeMode.dark); + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + !isDark?TolyIcon.dark:TolyIcon.wb_sunny, + color: Colors.white, + ), + ), + ), + ); + } +} diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/app/navigation/desk_ui/unit_rail_navigation.dart index 794b18fe..c645c08c 100644 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_rail_navigation.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/navigation/desk_ui/theme_model_switch_icon.dart'; import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -86,14 +87,15 @@ class _UnitRailNavigationState extends State @override Widget build(BuildContext context) { + Color? divColor = Theme.of(context).dividerTheme.color; return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.only(top: 20), alignment: Alignment.topCenter, margin: const EdgeInsets.only(right: 1), - width: 120, - decoration: const BoxDecoration(color: Color(0xff2C3036), boxShadow: [ - BoxShadow(color: Colors.grey, offset: Offset(1, 0), blurRadius: 2) + width: 130, + decoration: BoxDecoration(color: Color(0xff2C3036), boxShadow: [ + BoxShadow(color: divColor!, offset: Offset(1, 0), blurRadius: 2) ]), child: Column( children: [ @@ -134,8 +136,8 @@ class _UnitRailNavigationState extends State widget.onItemClick.call(index); }, selected: widget.selectedIndex == index, - width: 120, - height: 35, + width: 130, + height: 46, activeColor: Theme.of(context).primaryColor, inactiveColor: Colors.white.withAlpha(33), icon: icons[index], @@ -153,17 +155,24 @@ class _UnitRailNavigationState extends State color: Colors.white, height: 1, ), - Builder( - builder: (ctx) => FeedbackWidget( - onPressed: () => Scaffold.of(ctx).openDrawer(), - child: const Padding( - padding: EdgeInsets.only(bottom: 20, top: 20), - child: Icon( - Icons.settings, - color: Colors.white, + + Wrap( + spacing: 12, + children: [ + const ThemeModelSwitchIcon(), + Builder( + builder: (ctx) => FeedbackWidget( + onPressed: () => Scaffold.of(ctx).openDrawer(), + child: const Padding( + padding: EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + Icons.settings, + color: Colors.white, + ), + ), ), ), - ), + ], ), ], ), @@ -174,9 +183,9 @@ class _UnitRailNavigationState extends State Widget buildIcons() { return Padding( - padding: const EdgeInsets.only(bottom: 20, top: 20), + padding: const EdgeInsets.only(bottom: 16, top: 16), child: Wrap( - spacing: 5, + spacing: 8, children: [ FeedbackWidget( onPressed: () => _launchURL("http://blog.toly1994.com/"), @@ -215,7 +224,7 @@ class _UnitRailNavigationState extends State } } -class _UnitRailMenu extends StatelessWidget { +class _UnitRailMenu extends StatefulWidget { final VoidCallback onTap; final bool selected; final Color activeColor; @@ -239,49 +248,53 @@ class _UnitRailMenu extends StatelessWidget { required this.label, }) : super(key: key); + @override + State<_UnitRailMenu> createState() => _UnitRailMenuState(); +} + +class _UnitRailMenuState extends State<_UnitRailMenu> { @override Widget build(BuildContext context) { return GestureDetector( - onTap: onTap, + onTap: widget.onTap, child: Container( alignment: Alignment.topLeft, margin: const EdgeInsets.only(top: 10), child: AnimatedBuilder( - animation: animation, + animation: widget.animation, builder: (BuildContext context, Widget? child) => _buildItem(), ), )); } - late ColorTween colorTween = ColorTween(begin: inactiveColor, end: activeColor); - + late ColorTween colorTween = ColorTween(begin: widget.inactiveColor, end: widget.activeColor); Widget _buildItem() { - double iconSize = _sizeTween.transform(animation.value); - Color? color = colorTween.transform(animation.value); + double iconSize = _sizeTween.transform(widget.animation.value); + Color? color = colorTween.transform(widget.animation.value); return Container( alignment: Alignment.center, decoration: BoxDecoration( color: color, borderRadius: BorderRadius.only( - topRight: Radius.circular(height / 2), - bottomRight: Radius.circular(height / 2))), - width: _widthTween.transform(animation.value) * width, - height: height, + topRight: Radius.circular(widget.height / 2), + bottomRight: Radius.circular(widget.height / 2))), + width: _widthTween.transform(widget.animation.value) * widget.width, + height: widget.height, child: Wrap( spacing: 6, crossAxisAlignment: WrapCrossAlignment.center, children: [ Icon( - icon, + widget.icon, size: iconSize, - color: selected ? Colors.white : Colors.white70, + color: widget.selected ? Colors.white : Colors.white70, ), Text( - label, + widget.label, style: TextStyle( - fontSize: 12, - color: selected ? Colors.white : Colors.white70, + fontSize: 14, + color: widget.selected ? Colors.white : Colors.white70, ), ), ], diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart index 383fa07e..a2f54ead 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/app/navigation/unit_navigation.dart @@ -52,7 +52,7 @@ class _UnitPhoneNavigationState extends State { @override void initState() { super.initState(); - if (Platform.isAndroid) { + if (Platform.isAndroid||Platform.isIOS) { BlocProvider.of(context) .add(const CheckUpdate(appName: 'FlutterUnit')); } diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index fd227625..286ee370 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -72,7 +72,8 @@ class UnitRouters { case widget_detail: Widget child; if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - child = DeskWidgetDetailPageScope( model: settings.arguments as WidgetModel, + child = DeskWidgetDetailPageScope( + model: settings.arguments as WidgetModel, ); }else{ child = WidgetDetailPageScope( @@ -86,7 +87,9 @@ class UnitRouters { // case search: // return Right2LeftRouter(child: const SearchPageProvider()); case collect: - return Right2LeftRouter(child: const CollectPageAdapter()); + return Right2LeftRouter(child: CollectPageAdapter( + canPop: settings.arguments as bool, + )); case setting: return Right2LeftRouter(child: const SettingPage()); diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index 8a689014..03ec7bea 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -13,47 +13,52 @@ class AboutAppPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - height: 150, - width: MediaQuery.of(context).size.width, - margin: const EdgeInsets.only(bottom: 50), - child: Image.asset( - 'assets/images/sabar.webp', - fit: BoxFit.cover, + return Theme( + data: ThemeData( + brightness: Brightness.light + ), + child: Scaffold( + backgroundColor: Colors.white, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: 150, + width: MediaQuery.of(context).size.width, + margin: const EdgeInsets.only(bottom: 50), + child: Image.asset( + 'assets/images/sabar.webp', + fit: BoxFit.cover, + ), + ), + _buildBar(context), + Positioned( + bottom: 0, + left: 50, + child: FeedbackWidget( + onEnd : (){ + Navigator.push(context, Right2LeftRouter(child: const FlutterUnitTimeLine())); + }, + child: CircleImage( + size: 100, + shadowColor: Theme.of(context).primaryColor, + image: const AssetImage('assets/images/icon_head.webp'), + ), + )), + ], + ), + Expanded( + child: SingleChildScrollView( + child: Container( + margin: const EdgeInsets.all(24), + child: _buildInfo(), ), - ), - _buildBar(context), - Positioned( - bottom: 0, - left: 50, - child: FeedbackWidget( - onEnd : (){ - Navigator.push(context, Right2LeftRouter(child: const FlutterUnitTimeLine())); - }, - child: CircleImage( - size: 100, - shadowColor: Theme.of(context).primaryColor, - image: const AssetImage('assets/images/icon_head.webp'), - ), - )), - ], - ), - Expanded( - child: SingleChildScrollView( - child: Container( - margin: const EdgeInsets.all(24), - child: _buildInfo(), ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/app/views/about/about_me_page.dart b/lib/app/views/about/about_me_page.dart index 721a9ea3..81c0f743 100644 --- a/lib/app/views/about/about_me_page.dart +++ b/lib/app/views/about/about_me_page.dart @@ -12,7 +12,11 @@ class AboutMePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( + return Theme( + data: ThemeData( + brightness: Brightness.light + ), + child:Scaffold( backgroundColor: Colors.white, body: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -54,7 +58,7 @@ class AboutMePage extends StatelessWidget { ), ], ), - ); + )); } Widget _buildBar(BuildContext context) { diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index 9be396b8..a19586a8 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -18,10 +18,13 @@ class VersionInfo extends StatelessWidget { @override Widget build(BuildContext context) { + + Color? bgColor = Theme.of(context).listTileTheme.tileColor; + return Scaffold( - backgroundColor: Colors.white, + backgroundColor: bgColor, appBar: AppBar( - backgroundColor: Colors.white, + backgroundColor: bgColor, elevation: 0, iconTheme: const IconThemeData( color: Colors.grey diff --git a/lib/code_gen/desk_widget_top_bar.dart b/lib/code_gen/desk_widget_top_bar.dart index ae4e3de4..6375d520 100644 --- a/lib/code_gen/desk_widget_top_bar.dart +++ b/lib/code_gen/desk_widget_top_bar.dart @@ -31,11 +31,12 @@ class _DeskCodeGenTopBarState extends State with SingleTicke Widget build(BuildContext context) { Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, - color: Colors.white, + color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ SizedBox( diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart index 6d87dc42..24e61039 100644 --- a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart +++ b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart @@ -52,6 +52,7 @@ class _IconFontGenPageState extends State @override Widget build(BuildContext context) { + super.build(context); return Center( child: SizedBox( width: 600, @@ -149,6 +150,8 @@ class LabelInputInput extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -171,14 +174,14 @@ class LabelInputInput extends StatelessWidget { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0, left: 15), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(6)), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xffE2E7EE)), + borderSide: BorderSide(color: isDark?Color(0xff2C3036):Color(0xffE2E7EE)), borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: hintText, @@ -207,6 +210,8 @@ class FileSelectorInput extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, @@ -251,13 +256,13 @@ class FileSelectorInput extends StatelessWidget { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0, left: 15), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(6)), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xffE2E7EE)), + borderSide: BorderSide(color: isDark?Color(0xff2C3036):Color(0xffE2E7EE)), borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: hintText, diff --git a/lib/components/top_bar/desk_tab_top_bar.dart b/lib/components/top_bar/desk_tab_top_bar.dart index 99506111..9b50c84f 100644 --- a/lib/components/top_bar/desk_tab_top_bar.dart +++ b/lib/components/top_bar/desk_tab_top_bar.dart @@ -38,11 +38,13 @@ class _DeskTabTopBarState extends State with TickerProviderState Widget build(BuildContext context) { Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, - color: Colors.white, + color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ SizedBox( diff --git a/lib/painter_system/gallery_detail_page.dart b/lib/painter_system/gallery_detail_page.dart index 72fcfe07..56ab945b 100644 --- a/lib/painter_system/gallery_detail_page.dart +++ b/lib/painter_system/gallery_detail_page.dart @@ -186,10 +186,10 @@ class _GalleryDetailPageState extends State { Widget buildTitle(BuildContext context) { return Container( - padding: EdgeInsets.only(top: isDesk?26:46, bottom: 10, left: 20, right: 10), + padding: EdgeInsets.only(top: isDesk?26:46, bottom: 10, left: isDesk?20:0, right: 10), child: Row( children: [ - if(isDesk) + // if(isDesk) const BackButton(color: Colors.white,), Text( diff --git a/lib/painter_system/picture_frame.dart b/lib/painter_system/picture_frame.dart index 2b25ec30..7cb425ca 100644 --- a/lib/painter_system/picture_frame.dart +++ b/lib/painter_system/picture_frame.dart @@ -143,7 +143,7 @@ class FrameShower extends StatelessWidget { title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), - PictureFrame(child: content), + PictureFrame(child: content,color: Colors.white,), Container( padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( diff --git a/lib/point_system/views/desk_ui/desk_point_page.dart b/lib/point_system/views/desk_ui/desk_point_page.dart index 904495ea..de454b66 100644 --- a/lib/point_system/views/desk_ui/desk_point_page.dart +++ b/lib/point_system/views/desk_ui/desk_point_page.dart @@ -26,8 +26,8 @@ class _DeskPointPageState extends State { 'license': {"spdx_id": 'GPL-3.0'}, 'description': '【Flutter 集录指南 App】The unity of flutter, The unity of coder.', - 'stargazers_count': 5840, - 'forks_count': 956, + 'stargazers_count': 6261, + 'forks_count': 1039, 'subscribers_count': 126, 'open_issues_count': 40, }); @@ -120,11 +120,14 @@ class SimpleDeskTopBar extends StatelessWidget { @override Widget build(BuildContext context) { + + bool isDark = Theme.of(context).brightness == Brightness.dark; + return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, - color: Colors.white, + color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ if (leading != null) leading!, diff --git a/lib/point_system/views/desk_ui/github_repo_panel.dart b/lib/point_system/views/desk_ui/github_repo_panel.dart index 654ac2a3..c6597c9f 100644 --- a/lib/point_system/views/desk_ui/github_repo_panel.dart +++ b/lib/point_system/views/desk_ui/github_repo_panel.dart @@ -29,7 +29,7 @@ class _GithubRepoPanelState extends State { boxShadow: [ BoxShadow(color: Colors.black.withOpacity(0.1), offset: Offset(0, .5), blurRadius: 3) ], - color: Colors.white, + color:Theme.of(context).listTileTheme.tileColor, borderRadius: BorderRadius.circular(8)), child: Column( mainAxisSize: MainAxisSize.min, @@ -80,6 +80,7 @@ class _GithubRepoPanelState extends State { ), ), const Divider(), + const SizedBox(height: 8,), DefaultTextStyle( style: TextStyle(fontSize: 12,color: Theme.of(context).primaryColor), child: Row( diff --git a/lib/point_system/views/issues_point/issue_item.dart b/lib/point_system/views/issues_point/issue_item.dart index c32d3ad0..fc097c5e 100644 --- a/lib/point_system/views/issues_point/issue_item.dart +++ b/lib/point_system/views/issues_point/issue_item.dart @@ -19,6 +19,8 @@ class IssueItem extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), decoration: BoxDecoration( @@ -34,8 +36,8 @@ class IssueItem extends StatelessWidget { padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), child: Text( '${issue.title}', - style: const TextStyle(fontSize: 15, color: Colors.grey, shadows: [ - Shadow(color: Colors.white, offset: Offset(1, .5)) + style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ + Shadow(color: isDark?Colors.black:Colors.white, offset: Offset(1, .5)) ]), ), ), diff --git a/lib/point_system/views/issues_point/issues_detail.dart b/lib/point_system/views/issues_point/issues_detail.dart index ef5c78ff..e5b4112f 100644 --- a/lib/point_system/views/issues_point/issues_detail.dart +++ b/lib/point_system/views/issues_point/issues_detail.dart @@ -1,6 +1,7 @@ import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; import 'package:flutter_unit/app/utils/convert_man.dart'; import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; import 'package:flutter_unit/point_system/github_model/github_model.dart'; @@ -15,8 +16,14 @@ class IssuesDetailPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter Point'), + appBar: PreferredSize( + preferredSize: Size(0,kToolbarHeight), + child: DragToMoveAreaNoDouble( + child: AppBar( + centerTitle: false, + title: const Text('Flutter 要点集录'), + ), + ), ), body: BlocBuilder( builder: _buildContent), @@ -60,34 +67,38 @@ class IssueTitle extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return SingleChildScrollView( child: Column( children: [ - Stack( + Row( children: [ - Container( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Panel( - child: Text( - '${issue.title}', - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.bold), - )), - ), - Positioned( - right: 10, - bottom: 10, - child: WrapColor( - child: Text( - '#${issue.number}', - style: const TextStyle(color: Colors.white), - ), + Flexible( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Panel( + color: isDark?Colors.transparent:null, + child: Text( + + '${issue.title}', + maxLines: 1, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold), )), + ), + ), + WrapColor( + child: Text( + '#${issue.number}', + style: const TextStyle(color: Colors.white), + ), + ) ], ), - const Divider(), + Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), + padding: const EdgeInsets.symmetric(horizontal: 8.0,vertical: 8), child: WrapColor( color: Colors.blue.withAlpha(22), child: ListTile( @@ -113,10 +124,12 @@ class IssueTitle extends StatelessWidget { ), ), ), + Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.symmetric(vertical: 8.0,horizontal: 20), child: MarkdownWidget( - markdownData: issueDesHtml, style: MarkdownWidget.kWhite), + markdownData: issueDesHtml, + style: isDark?MarkdownWidget.kDarkLight:MarkdownWidget.kWhite), ), const Divider( thickness: 2, diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart index 9bea765b..039226e5 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart @@ -22,11 +22,15 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? appBarColor = Theme.of(context).appBarTheme.backgroundColor; + Color? appBarTextColor = Theme.of(context).appBarTheme.titleTextStyle?.color; + return SliverAppBar( pinned: true, - backgroundColor: backgroundColor, - titleTextStyle: const TextStyle(color: textColor), - iconTheme: const IconThemeData(color: textColor), + backgroundColor: isDark? appBarColor:backgroundColor, + titleTextStyle: TextStyle(color: isDark?appBarTextColor:Color(0xff696969)), + iconTheme: IconThemeData(color: isDark?appBarTextColor:Color(0xff696969)), expandedHeight: 120.0, scrolledUnderElevation: 0.5, flexibleSpace: DragToMoveAreaNoDouble( @@ -39,13 +43,13 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { ), fixedSubtitle: Text( model.name, - style: const TextStyle(color: Color(0xff696969), fontSize: 12), + style: TextStyle(color:isDark?appBarTextColor:Color(0xff696969), fontSize: 12), ), title: Padding( padding: const EdgeInsets.only(bottom: 3), child: Text( model.nameCN, - style: const TextStyle(color: textColor, fontSize: 16), + style: TextStyle(color:isDark?appBarTextColor: textColor, fontSize: 16), ), ), //伸展处布局 @@ -56,18 +60,19 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { ), elevation: 0, actions: [ - _buildToHome(context), - FeedbackWidget( - onPressed: () => _toggleLikeState(context), - child: BlocConsumer( - listener: _listenLikeStateChange, - builder: _buildByLikeState, - ), - ), - Padding( - padding: const EdgeInsets.only(right: 20), - child: const Center(child: WindowButtons()), - ) + + WindowButtons( + actions: [ + _buildToHome(context), + FeedbackWidget( + onPressed: () => _toggleLikeState(context), + child: BlocConsumer( + listener: _listenLikeStateChange, + builder: _buildByLikeState, + ), + ), + ], + ) ], ); } @@ -99,20 +104,22 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { // 根据 [LikeWidgetState ] 构建图标 Widget _buildByLikeState(BuildContext context, LikeWidgetState state) { bool liked = state.widgets.contains(model); - return Padding( - padding: const EdgeInsets.only(right: 20.0), + return SizedBox( + width: 30, + height: 30, child: Icon( liked ? TolyIcon.icon_star_ok : TolyIcon.icon_star_add, - size: 25, + size: 20, ), ); } Widget _buildToHome(BuildContext context) => GestureDetector( onLongPress: () => Scaffold.of(context).openEndDrawer(), - child: const Padding( - padding: EdgeInsets.all(15.0), - child: Icon(Icons.home), + child:const SizedBox( + width: 30, + height: 30, + child: Icon(Icons.home,size: 20,), ), onTap: () => Navigator.of(context).pop()); } diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart index 2a27f6c0..e7c1e912 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart @@ -60,10 +60,10 @@ class _DeskSearchBarState extends State { } Widget _buildOptionsView(BuildContext context, AutocompleteOnSelected onSelected, Iterable options) { + return Align( alignment: Alignment.topLeft, child: Material( - color: Colors.white, elevation: 6, borderRadius: BorderRadius.circular(8), shadowColor: Colors.black, @@ -96,6 +96,8 @@ class _DeskSearchBarState extends State { Widget _buildFieldView(BuildContext context, TextEditingController textEditingController, FocusNode focusNode, VoidCallback onFieldSubmitted) { _controller = textEditingController; + bool isDark = Theme.of(context).brightness == Brightness.dark; + return TextField( controller: textEditingController, onChanged: widget.onChanged, @@ -109,7 +111,7 @@ class _DeskSearchBarState extends State { filled: true, hoverColor: Colors.transparent, contentPadding: EdgeInsets.only(top: 0), - fillColor: Color(0xffF1F2F3), + fillColor: isDark?null:Color(0xffF1F2F3), prefixIcon: Icon( Icons.search, size: 18, @@ -139,6 +141,9 @@ class _DeskSearchBarState extends State { ); InlineSpan formSpan(String src, String pattern) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? textColor = Theme.of(context).listTileTheme.textColor; + List span = []; RegExp regExp = RegExp(pattern, caseSensitive: false); src.splitMapJoin(regExp, onMatch: (Match match) { @@ -147,7 +152,7 @@ class _DeskSearchBarState extends State { }, onNonMatch: (str) { span.add(TextSpan( text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032),fontSize: 12))); + style: lightTextStyle.copyWith(color: isDark?textColor:const Color(0xff2F3032),fontSize: 12))); return ''; }); return TextSpan(children: span); diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart index a116d2ed..eba629fe 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart @@ -18,12 +18,18 @@ class DeskWidgetItem extends StatelessWidget { @override Widget build(BuildContext context) { + + Color? tileColor = Theme.of(context).listTileTheme.tileColor; + Color? textColor = Theme.of(context).listTileTheme.textColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + textColor = isDark?textColor: Color(0xff2F3032); + return InkWell( borderRadius: BorderRadius.circular(6), onTap: onTap, child: Ink( decoration: BoxDecoration( - color: Colors.white, + color: tileColor, borderRadius: BorderRadius.circular(6), boxShadow: [ BoxShadow( @@ -38,24 +44,24 @@ class DeskWidgetItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _buildTitle(Theme.of(context).primaryColor), - _buildContent(), - _buildFoot() + _buildTitle(Theme.of(context).primaryColor,textColor,isDark), + _buildContent(textColor), + _buildFoot(isDark) ], ), ), ); } - Widget _buildTitle(Color color) { + Widget _buildTitle(Color color,Color? textColor,bool isDark) { return Row( children: [ if (searchArg == null) Text( model.name, - style: const TextStyle( + style: TextStyle( fontSize: 15, - color: Color(0xff2F3032), + color: textColor, fontWeight: FontWeight.bold, ), ), @@ -68,7 +74,7 @@ class DeskWidgetItem extends StatelessWidget { opacity: show ? 1.0 : 0.0, child: Wrapper.just( radius: 10, - color: const Color(0xffF3F3F5), + color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( '已收藏', @@ -76,9 +82,9 @@ class DeskWidgetItem extends StatelessWidget { color: color, height: 1, fontSize: 10, - shadows: const [ + shadows: [ Shadow( - color: Colors.white, + color:isDark? Colors.black: Colors.white, blurRadius: 2, offset: Offset(1, 1)) ]), @@ -95,19 +101,19 @@ class DeskWidgetItem extends StatelessWidget { ); } - Widget _buildContent() { + Widget _buildContent(Color? textColor) { return Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: Text( model.info, maxLines: 2, overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 14, color: Color(0xff2F3032)), + style: TextStyle(fontSize: 14, color: textColor), ), ); } - Widget _buildFoot() { + Widget _buildFoot(bool isDark) { return Row( children: [ Container( @@ -125,17 +131,17 @@ class DeskWidgetItem extends StatelessWidget { const Spacer(), Wrapper.just( radius: 2, - color: const Color(0xffF3F3F5), + color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( Cons.kWidgetFamilyLabelMap[model.family]!, - style: const TextStyle( - color: Color(0xff878D96), + style: TextStyle( + color: isDark?Color(0xffCCCCCC):Color(0xff878D96), height: 1, fontSize: 12, shadows: [ Shadow( - color: Colors.white, blurRadius: 2, offset: Offset(1, 1)) + color: isDark? Colors.black:Colors.white, blurRadius: 2, offset: Offset(1, 1)) ]), ), ), diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart index c9f26468..87425562 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -29,12 +29,13 @@ class _DeskWidgetTopBarState extends State with SingleTickerP @override Widget build(BuildContext context) { Color themeColor = Theme.of(context).primaryColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.only(left: 20), height: 64, - color: Colors.white, + color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ SizedBox( @@ -68,7 +69,7 @@ class _DeskWidgetTopBarState extends State with SingleTickerP )), ), // const SizedBox(width: 20,), - WindowButtons(), + const WindowButtons(), ], ), ), diff --git a/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart b/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart index ed272bb5..714687ac 100644 --- a/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart +++ b/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; class WindowButtons extends StatefulWidget { - const WindowButtons({Key? key}) : super(key: key); + final List? actions; + const WindowButtons({Key? key, this.actions}) : super(key: key); @override State createState() => _WindowButtonsState(); @@ -11,64 +12,69 @@ class WindowButtons extends StatefulWidget { class _WindowButtonsState extends State { @override Widget build(BuildContext context) { - return Wrap( - spacing: 5, - children: [ - SizedBox( - width: 30, - height: 30, - child: WindowCaptionButton.minimize( - brightness: Brightness.light, - onPressed: () async { - bool isMinimized = await windowManager.isMinimized(); - if (isMinimized) { - windowManager.restore(); - } else { - windowManager.minimize(); - } - }, + Brightness brightness = Theme.of(context).brightness; + return Align( + alignment:Alignment.topRight,child: Wrap( + spacing: 5, + children: [ + if(widget.actions!=null) + ...widget.actions!, + SizedBox( + width: 30, + height: 30, + child: WindowCaptionButton.minimize( + brightness:brightness, + onPressed: () async { + bool isMinimized = await windowManager.isMinimized(); + if (isMinimized) { + windowManager.restore(); + } else { + windowManager.minimize(); + } + }, + ), ), - ), - SizedBox( - width: 30, - height: 30, - child: FutureBuilder( - future: windowManager.isMaximized(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.data == true) { - return WindowCaptionButton.unmaximize( - brightness: Brightness.light, + SizedBox( + width: 30, + height: 30, + child: FutureBuilder( + future: windowManager.isMaximized(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.data == true) { + return WindowCaptionButton.unmaximize( + brightness: brightness, + onPressed: () async{ + await windowManager.unmaximize(); + setState(() { + + }); + }, + ); + } + return WindowCaptionButton.maximize( + brightness: brightness, onPressed: () async{ - await windowManager.unmaximize(); + await windowManager.maximize(); setState(() { }); }, ); - } - return WindowCaptionButton.maximize( - brightness: Brightness.light, - onPressed: () async{ - await windowManager.maximize(); - setState(() { - - }); - }, - ); - }, + }, + ), ), - ), - SizedBox( - height: 30, - width: 30, - child: WindowCaptionButton.close( - brightness: Brightness.light, - onPressed: () { - windowManager.close(); - }, + SizedBox( + height: 30, + width: 30, + child: WindowCaptionButton.close( + brightness: brightness, + onPressed: () { + windowManager.close(); + }, + ), ), - ), - ], + ], + ), ); } } diff --git a/lib/widget_ui/mobile/category_page/category_page.dart b/lib/widget_ui/mobile/category_page/category_page.dart index 15b30be2..498a40fe 100644 --- a/lib/widget_ui/mobile/category_page/category_page.dart +++ b/lib/widget_ui/mobile/category_page/category_page.dart @@ -58,7 +58,7 @@ class CategoryPage extends StatelessWidget { _buildContent(BuildContext context, CategoryLoadedState state) { return SliverPadding( - padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 10), + padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 30), sliver: SliverLayoutBuilder( builder: (_,c){ SliverGridDelegate delegate = gridDelegate; diff --git a/lib/widget_ui/mobile/category_page/collect_page.dart b/lib/widget_ui/mobile/category_page/collect_page.dart index 6bbd6a7b..b1f9e90f 100644 --- a/lib/widget_ui/mobile/category_page/collect_page.dart +++ b/lib/widget_ui/mobile/category_page/collect_page.dart @@ -14,7 +14,8 @@ import 'sync/upload_button.dart'; class CollectPageAdapter extends StatelessWidget { - const CollectPageAdapter({Key? key}) : super(key: key); + final bool canPop; + const CollectPageAdapter({Key? key, this.canPop=false}) : super(key: key); @override Widget build(BuildContext context) { @@ -22,7 +23,7 @@ class CollectPageAdapter extends StatelessWidget { if(isDesk){ return DeskCategoryPage(); }else{ - return CollectPage(); + return CollectPage(canPop:canPop); } } } @@ -30,7 +31,8 @@ class CollectPageAdapter extends StatelessWidget { class CollectPage extends StatefulWidget { - const CollectPage({Key? key}) : super(key: key); + final bool canPop; + const CollectPage({Key? key, this.canPop=false}) : super(key: key); @override _CollectPageState createState() => _CollectPageState(); @@ -74,7 +76,6 @@ class _CollectPageState extends State } Widget _buildAppBar(BuildContext context, bool index) { - // final Color color = Colors.blue; bool isDark = Theme.of(context).brightness == Brightness.dark; String image = isDark?'draw_bg3.webp':'caver.webp'; @@ -82,7 +83,7 @@ class _CollectPageState extends State systemOverlayStyle: const SystemUiOverlayStyle( statusBarIconBrightness: Brightness.light ), - leading: Container( + leading: widget.canPop?BackButton(color: Colors.white,):Container( margin: const EdgeInsets.all(10), child: FeedbackWidget( onPressed: () { @@ -99,9 +100,11 @@ class _CollectPageState extends State width: 32, child: AuthenticWidget.just(const UploadCategoryButton())), // SizedBox(width: 5,), + SizedBox( width: 32, child: AuthenticWidget.just(const SyncCategoryButton())), + if(!widget.canPop) _buildAddAction(context) ], title: const Text( diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart index 8b88ecd0..c34992a1 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart @@ -23,7 +23,7 @@ class SliverWidgetDetailBar extends StatelessWidget { bool isDark = Theme.of(context).brightness == Brightness.dark; Color? appBarColor = Theme.of(context).appBarTheme.backgroundColor; Color? appBarTextColor = Theme.of(context).appBarTheme.titleTextStyle?.color; - print(appBarTextColor); + return SliverAppBar( pinned: true, @@ -34,6 +34,7 @@ class SliverWidgetDetailBar extends StatelessWidget { expandedHeight: 120.0, scrolledUnderElevation: 0.5, flexibleSpace: DiyFlexibleSpaceBar( + centerTitle: false, expandedTitleScale: 2, titleIconBuilder: (t) => WindmillWidget( rotate: t * 2 * pi * 2, diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index a99f9126..43f3cbe4 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -119,7 +119,7 @@ class _StandardHomePageState extends State ), const WidgetListPanel(), SliverPadding( - padding: const EdgeInsets.only(bottom: 20), + padding: const EdgeInsets.only(bottom: 30), sliver: SliverOverlapInjector( handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), ), diff --git a/packages/app/lib/app/res/toly_icon.dart b/packages/app/lib/app/res/toly_icon.dart index 2edca70a..b95f7ecb 100644 --- a/packages/app/lib/app/res/toly_icon.dart +++ b/packages/app/lib/app/res/toly_icon.dart @@ -3,37 +3,39 @@ import 'package:flutter/widgets.dart'; // 欢迎支持: https://github.com/toly1994328/FlutterUnit class TolyIcon { TolyIcon._(); - static const IconData icon_fast = IconData( 0xe607, fontFamily: "TolyIcon"); -static const IconData icon_layout = IconData( 0xe85e, fontFamily: "TolyIcon"); -static const IconData upload_success = IconData( 0xe60b, fontFamily: "TolyIcon"); -static const IconData download = IconData( 0xea51, fontFamily: "TolyIcon"); -static const IconData upload = IconData( 0xea52, fontFamily: "TolyIcon"); -static const IconData error = IconData( 0xe614, fontFamily: "TolyIcon"); -static const IconData dingzhi1 = IconData( 0xe60e, fontFamily: "TolyIcon"); -static const IconData icon_collect = IconData( 0xe672, fontFamily: "TolyIcon"); -static const IconData yonghu = IconData( 0xe619, fontFamily: "TolyIcon"); -static const IconData icon_common = IconData( 0xe634, fontFamily: "TolyIcon"); -static const IconData icon_see = IconData( 0xe608, fontFamily: "TolyIcon"); -static const IconData icon_issues = IconData( 0xe7a7, fontFamily: "TolyIcon"); -static const IconData icon_fork = IconData( 0xe623, fontFamily: "TolyIcon"); -static const IconData icon_github_star = IconData( 0xe7df, fontFamily: "TolyIcon"); -static const IconData icon_show = IconData( 0xe648, fontFamily: "TolyIcon"); -static const IconData icon_hide = IconData( 0xe649, fontFamily: "TolyIcon"); -static const IconData icon_email = IconData( 0xe694, fontFamily: "TolyIcon"); -static const IconData icon_github = IconData( 0xe689, fontFamily: "TolyIcon"); -static const IconData icon_juejin = IconData( 0xe601, fontFamily: "TolyIcon"); -static const IconData icon_share = IconData( 0xe613, fontFamily: "TolyIcon"); -static const IconData icon_background = IconData( 0xe60a, fontFamily: "TolyIcon"); -static const IconData icon_code = IconData( 0xe70b, fontFamily: "TolyIcon"); -static const IconData icon_item = IconData( 0xe66f, fontFamily: "TolyIcon"); -static const IconData icon_kafei = IconData( 0xe6aa, fontFamily: "TolyIcon"); -static const IconData icon_tag = IconData( 0xe6e7, fontFamily: "TolyIcon"); -static const IconData icon_them = IconData( 0xe6c2, fontFamily: "TolyIcon"); -static const IconData icon_bug = IconData( 0xe7af, fontFamily: "TolyIcon"); -static const IconData icon_sound = IconData( 0xe606, fontFamily: "TolyIcon"); -static const IconData icon_search = IconData( 0xe604, fontFamily: "TolyIcon"); -static const IconData icon_star_ok = IconData( 0xe6ae, fontFamily: "TolyIcon"); -static const IconData icon_star = IconData( 0xe609, fontFamily: "TolyIcon"); -static const IconData icon_star_add = IconData( 0xe68e, fontFamily: "TolyIcon"); + static const IconData dark = IconData(0xe72f, fontFamily: "TolyIcon"); +static const IconData wb_sunny = IconData(0xe746, fontFamily: "TolyIcon"); +static const IconData icon_fast = IconData(0xe607, fontFamily: "TolyIcon"); +static const IconData icon_layout = IconData(0xe85e, fontFamily: "TolyIcon"); +static const IconData upload_success = IconData(0xe60b, fontFamily: "TolyIcon"); +static const IconData download = IconData(0xea51, fontFamily: "TolyIcon"); +static const IconData upload = IconData(0xea52, fontFamily: "TolyIcon"); +static const IconData error = IconData(0xe614, fontFamily: "TolyIcon"); +static const IconData dingzhi1 = IconData(0xe60e, fontFamily: "TolyIcon"); +static const IconData icon_collect = IconData(0xe672, fontFamily: "TolyIcon"); +static const IconData yonghu = IconData(0xe619, fontFamily: "TolyIcon"); +static const IconData icon_common = IconData(0xe634, fontFamily: "TolyIcon"); +static const IconData icon_see = IconData(0xe608, fontFamily: "TolyIcon"); +static const IconData icon_issues = IconData(0xe7a7, fontFamily: "TolyIcon"); +static const IconData icon_fork = IconData(0xe623, fontFamily: "TolyIcon"); +static const IconData icon_github_star = IconData(0xe7df, fontFamily: "TolyIcon"); +static const IconData icon_show = IconData(0xe648, fontFamily: "TolyIcon"); +static const IconData icon_hide = IconData(0xe649, fontFamily: "TolyIcon"); +static const IconData icon_email = IconData(0xe694, fontFamily: "TolyIcon"); +static const IconData icon_github = IconData(0xe689, fontFamily: "TolyIcon"); +static const IconData icon_juejin = IconData(0xe601, fontFamily: "TolyIcon"); +static const IconData icon_share = IconData(0xe613, fontFamily: "TolyIcon"); +static const IconData icon_background = IconData(0xe60a, fontFamily: "TolyIcon"); +static const IconData icon_code = IconData(0xe70b, fontFamily: "TolyIcon"); +static const IconData icon_item = IconData(0xe66f, fontFamily: "TolyIcon"); +static const IconData icon_kafei = IconData(0xe6aa, fontFamily: "TolyIcon"); +static const IconData icon_tag = IconData(0xe6e7, fontFamily: "TolyIcon"); +static const IconData icon_them = IconData(0xe6c2, fontFamily: "TolyIcon"); +static const IconData icon_bug = IconData(0xe7af, fontFamily: "TolyIcon"); +static const IconData icon_sound = IconData(0xe606, fontFamily: "TolyIcon"); +static const IconData icon_search = IconData(0xe604, fontFamily: "TolyIcon"); +static const IconData icon_star_ok = IconData(0xe6ae, fontFamily: "TolyIcon"); +static const IconData icon_star = IconData(0xe609, fontFamily: "TolyIcon"); +static const IconData icon_star_add = IconData(0xe68e, fontFamily: "TolyIcon"); } diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index 43a6e28d..0db8899c 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -6,6 +6,8 @@ import 'package:flutter/services.dart'; class AppTheme { static ThemeData darkTheme(AppState state) { + Color scaffoldBackgroundColor = const Color(0xff010201); + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( statusBarColor: Colors.transparent, @@ -15,7 +17,9 @@ class AppTheme { bool useMaterial3 = (Platform.isAndroid || Platform.isIOS); return ThemeData( - tabBarTheme: TabBarTheme( + scaffoldBackgroundColor: scaffoldBackgroundColor, + + tabBarTheme: TabBarTheme( dividerColor: Colors.transparent, ), fontFamily: state.fontFamily, @@ -45,7 +49,7 @@ class AppTheme { bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Color(0xff181818), selectedItemColor: Color(0xff4699FB)), - scaffoldBackgroundColor: const Color(0xff010201)); + ); } static ThemeData lightTheme(AppState state) { diff --git a/packages/app_update/lib/views/app_update_panel.dart b/packages/app_update/lib/views/app_update_panel.dart index ad9597f7..9220787c 100644 --- a/packages/app_update/lib/views/app_update_panel.dart +++ b/packages/app_update/lib/views/app_update_panel.dart @@ -1,6 +1,9 @@ +import 'dart:io'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:r_upgrade/r_upgrade.dart'; import 'package:utils/utils.dart'; import '../bloc/bloc.dart'; @@ -94,6 +97,11 @@ class AppUpdatePanel extends StatelessWidget { .add(const CheckUpdate(appName: 'FlutterUnit')); } if (state is ShouldUpdateState) { + if(Platform.isIOS){ + // ios 跳转应用商店 + RUpgrade.upgradeFromAppStore('6450545123', false); + return; + } // 处理下载的事件 BlocProvider.of(context) .add(DownloadEvent(appInfo: state.info)); diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 9d53ce01..5a8100e6 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -32,7 +32,7 @@ class MePageItem extends StatelessWidget { context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), const Divider(), _buildItem( - context, TolyIcon.icon_collect, '我的收藏', UnitRouter.collect), + context, TolyIcon.icon_collect, '我的收藏', UnitRouter.collect,), Gap.sfl10, Stack( @@ -69,7 +69,11 @@ class MePageItem extends StatelessWidget { Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), onTap: () { if (linkTo.isNotEmpty) { - Navigator.of(context).pushNamed(linkTo); + Object? arg ; + if(linkTo==UnitRouter.collect){ + arg = true; + } + Navigator.of(context).pushNamed(linkTo,arguments: arg); if (onTap != null) onTap(); } }, diff --git a/packages/components/lib/toly_ui/code/code_widget.dart b/packages/components/lib/toly_ui/code/code_widget.dart index d98bf0f8..019db6ff 100644 --- a/packages/components/lib/toly_ui/code/code_widget.dart +++ b/packages/components/lib/toly_ui/code/code_widget.dart @@ -9,7 +9,7 @@ import 'highlighter_style.dart'; import 'language/dart_languge.dart'; class CodeWidget extends StatelessWidget { - const CodeWidget({Key? key, required this.code,required this.style, this.fontSize = 13,this.fontFamily}) + CodeWidget({Key? key, required this.code,required this.style, this.fontSize = 13,this.fontFamily}) : super(key: key); final String code; diff --git a/packages/components/lib/toly_ui/code/high_light_code.dart b/packages/components/lib/toly_ui/code/high_light_code.dart index 84e42737..d83a00e8 100644 --- a/packages/components/lib/toly_ui/code/high_light_code.dart +++ b/packages/components/lib/toly_ui/code/high_light_code.dart @@ -91,20 +91,19 @@ class CodeHighlighter extends Highlighter { } // Line comments - if (_scanner.scan('//')) { + if (_scanner.scan(RegExp(r'//'))) { final int startComment = _scanner.lastMatch?.start??0; - bool eof = false; int endComment; - if (_scanner.scan(RegExp(r'.*\n'))) { - endComment = _scanner.lastMatch?.end??0 - 1; + if (_scanner.scan(RegExp(r'(.*\r\n)|(.*\n)'))) { + int? end = _scanner.lastMatch?.end; + endComment = end==null?0:end - 1; } else { eof = true; endComment = _src.length; } - _spans.add( - _HighlightSpan(_HighlightType.comment, startComment, endComment)); + _spans.add(_HighlightSpan(_HighlightType.comment, startComment, endComment)); if (eof) break; continue; diff --git a/pubspec.yaml b/pubspec.yaml index 8b6f6f2b..126c36f1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,7 +86,7 @@ flutter: fonts: # 配置字体,可配置多个,支持ttf和otf,ttc等字体资源 - family: TolyIcon fonts: - - asset: assets/iconfont/iconfont.ttf + - asset: assets/iconfont/toly_icon.ttf - family: IndieFlower #字体名 fonts: - asset: assets/fonts/IndieFlower-Regular.ttf From 7b38aec2f29409f8782c9a62180649187ce1cd2b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 25 Jun 2023 07:50:47 +0800 Subject: [PATCH 020/149] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/views/about/about_app_page.dart | 2 +- lib/app/views/about/about_me_page.dart | 2 +- lib/app/views/about/version_info.dart | 2 +- .../lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart | 2 +- .../widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart | 2 +- pubspec.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index 03ec7bea..376baf11 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -117,7 +117,7 @@ class AboutAppPage extends StatelessWidget { children: [ FeedbackWidget( onPressed: () => - _launchURL("https://github_model.com/toly1994328/FlutterUnit"), + _launchURL("https://github.com/toly1994328/FlutterUnit"), child: Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, diff --git a/lib/app/views/about/about_me_page.dart b/lib/app/views/about/about_me_page.dart index 81c0f743..ae86b7f4 100644 --- a/lib/app/views/about/about_me_page.dart +++ b/lib/app/views/about/about_me_page.dart @@ -160,7 +160,7 @@ class AboutMePage extends StatelessWidget { )), FeedbackWidget( onPressed: () => - _launchURL("https://github_model.com/toly1994328"), + _launchURL("https://github.com/toly1994328"), child: Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index a19586a8..1f26fcb6 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -109,7 +109,7 @@ class VersionInfo extends StatelessWidget { children: [ FeedbackWidget( onPressed: (){ - _launchURL("https://github_model.com/toly1994328/FlutterUnit"); + _launchURL("https://github.com/toly1994328/FlutterUnit"); }, child: const Text('《查看本项目Github仓库》',style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), const Text('Power By 张风捷特烈',style: TextStyle(fontSize: 12,color: Colors.grey),), diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart b/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart index 0942ca22..abe81349 100644 --- a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart +++ b/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart @@ -42,7 +42,7 @@ class RichTextWithWidget extends StatelessWidget { style: TextStyle(color: Colors.orange, fontSize: 16), ), const TextSpan( - text: 'https://github_model.com/toly1994328', + text: 'https://github.com/toly1994328', style: TextStyle( color: Colors.blue, fontSize: 18, diff --git a/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart index 565e9870..672494c6 100644 --- a/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart @@ -24,7 +24,7 @@ class CustomSimpleDialog extends StatelessWidget { '性别: 男 未婚', '微信: zdl1994328', "掘金: 张风捷特烈", - "github_model: toly1994328", + "github: toly1994328", "邮箱: 1981462008@qq.com", ]; diff --git a/pubspec.yaml b/pubspec.yaml index 126c36f1..44d759c0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. publish_to: none -version: 2.9.0+3 +version: 2.9.1 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 34f330196c9c94abc71ae0d5bca8c434f823ce43 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 25 Jun 2023 07:54:29 +0800 Subject: [PATCH 021/149] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget_ui/mobile/category_page/like_widget_page.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/lib/widget_ui/mobile/category_page/like_widget_page.dart index 05414e39..695f9441 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/lib/widget_ui/mobile/category_page/like_widget_page.dart @@ -81,7 +81,6 @@ class LikeWidgetPage extends StatelessWidget { .add(ToggleLikeWidgetEvent(id: model.id)); _toDetailPage(BuildContext context, WidgetModel model) { - BlocProvider.of(context).queryDetail(model); - Navigator.push(context, Right2LeftRouter(child: WidgetDetailPage(model: model))); + Navigator.push(context, Right2LeftRouter(child: WidgetDetailPageScope(model: model))); } } From b41dce7755cfaa3555e869116111cd18f722961e Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 7 Jul 2023 17:41:13 +0800 Subject: [PATCH 022/149] =?UTF-8?q?=E5=AE=9D=E5=85=B7=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/iconfont/toly_icon.ttf | Bin 11412 -> 12280 bytes lib/app/navigation/pure_bottom_bar.dart | 30 +- lib/app/navigation/unit_navigation.dart | 7 +- .../icon_font_gen/gen_message_action.dart | 30 +- .../icon_font_gen/icon_font_class_parser.dart | 34 -- .../icon_font_gen/icon_font_gen_page.dart | 1 - .../widget_panel/standard_home_page.dart | 22 +- .../widget_panel/widget_model_item.dart | 17 +- packages/app/lib/app/res/toly_icon.dart | 3 +- packages/app/lib/app/theme/app_theme.dart | 12 +- .../lib/repository/app_state_repository.dart | 1 + packages/app_update/lib/bloc/bloc.dart | 3 +- packages/artifact/.gitignore | 30 ++ packages/artifact/.metadata | 10 + packages/artifact/CHANGELOG.md | 3 + packages/artifact/LICENSE | 1 + packages/artifact/README.md | 39 ++ packages/artifact/analysis_options.yaml | 4 + packages/artifact/lib/artifact.dart | 3 + .../artifact/lib/src/blocs/article/bloc.dart | 104 +++++ .../lib/src/blocs/columnize/bloc.dart | 56 +++ packages/artifact/lib/src/blocs/exp.dart | 2 + .../artifact/lib/src/repositories/exp.dart | 4 + .../lib/src/repositories/model/article.dart | 77 ++++ .../lib/src/repositories/model/columnize.dart | 79 ++++ .../repository/article_repository.dart | 75 ++++ .../repository/columnize_repository.dart | 59 +++ .../views/article/article_detail_page.dart | 80 ++++ .../src/views/article/column_detail_page.dart | 27 ++ .../views/article/columnize_page_view.dart | 222 ++++++++++ .../lib/src/views/article/sliver_article.dart | 172 ++++++++ .../src/views/article/sliver_columnize.dart | 58 +++ .../article/toly_article_scroll_page.dart | 152 +++++++ .../artifact/lib/src/views/artifact_page.dart | 236 +++++++++++ .../lib/src/views/artifact_page_.dart | 146 +++++++ .../src/views/building/building_panel.dart | 19 + .../lib/src/views/toly_refresh_indicator.dart | 94 +++++ packages/artifact/pubspec.yaml | 64 +++ packages/artifact/test/utils_test.dart | 5 + .../lib/blocs/authentic/event.dart | 2 - packages/db_storage/pubspec.lock | 395 ------------------ .../lib/src/db_storage/app_db_storage.dart | 82 ++++ .../lib/src/db_storage/dao/cache_dao.dart | 84 ++++ packages/storage/lib/src/db_storage/exp.dart | 3 + .../src/db_storage/flutter_db_storage.dart | 1 - .../lib/src/db_storage/models/cache_po.dart | 40 ++ .../src/db_storage/update/db_migration.dart | 22 + .../lib/src/db_storage/update/db_updater.dart | 23 + .../utils/lib/src/http_utils/http_util.dart | 1 - .../utils/lib/src/http_utils/task_result.dart | 8 +- pubspec.lock | 47 +++ pubspec.yaml | 6 +- 52 files changed, 2214 insertions(+), 481 deletions(-) create mode 100644 packages/artifact/.gitignore create mode 100644 packages/artifact/.metadata create mode 100644 packages/artifact/CHANGELOG.md create mode 100644 packages/artifact/LICENSE create mode 100644 packages/artifact/README.md create mode 100644 packages/artifact/analysis_options.yaml create mode 100644 packages/artifact/lib/artifact.dart create mode 100644 packages/artifact/lib/src/blocs/article/bloc.dart create mode 100644 packages/artifact/lib/src/blocs/columnize/bloc.dart create mode 100644 packages/artifact/lib/src/blocs/exp.dart create mode 100644 packages/artifact/lib/src/repositories/exp.dart create mode 100644 packages/artifact/lib/src/repositories/model/article.dart create mode 100644 packages/artifact/lib/src/repositories/model/columnize.dart create mode 100644 packages/artifact/lib/src/repositories/repository/article_repository.dart create mode 100644 packages/artifact/lib/src/repositories/repository/columnize_repository.dart create mode 100644 packages/artifact/lib/src/views/article/article_detail_page.dart create mode 100644 packages/artifact/lib/src/views/article/column_detail_page.dart create mode 100644 packages/artifact/lib/src/views/article/columnize_page_view.dart create mode 100644 packages/artifact/lib/src/views/article/sliver_article.dart create mode 100644 packages/artifact/lib/src/views/article/sliver_columnize.dart create mode 100644 packages/artifact/lib/src/views/article/toly_article_scroll_page.dart create mode 100644 packages/artifact/lib/src/views/artifact_page.dart create mode 100644 packages/artifact/lib/src/views/artifact_page_.dart create mode 100644 packages/artifact/lib/src/views/building/building_panel.dart create mode 100644 packages/artifact/lib/src/views/toly_refresh_indicator.dart create mode 100644 packages/artifact/pubspec.yaml create mode 100644 packages/artifact/test/utils_test.dart delete mode 100644 packages/db_storage/pubspec.lock create mode 100644 packages/storage/lib/src/db_storage/app_db_storage.dart create mode 100644 packages/storage/lib/src/db_storage/dao/cache_dao.dart create mode 100644 packages/storage/lib/src/db_storage/models/cache_po.dart create mode 100644 packages/storage/lib/src/db_storage/update/db_migration.dart create mode 100644 packages/storage/lib/src/db_storage/update/db_updater.dart diff --git a/assets/iconfont/toly_icon.ttf b/assets/iconfont/toly_icon.ttf index 91afc37828a23fb3976581f4f5aca81c8de636f6..f112440c21004c742c9370ede823880638da5d10 100644 GIT binary patch delta 1810 zcmaiyO>7ip7{{OIotgKY+4+3j{qciY{DVk_I-ZI!hsVg(a1av%~vYALi^pe?~3 z&=6M-8ca+Bv@ss^WTJ!v66?VO2Q(Zs@z9eoCZZ%}RvSYI!Gv&Vecl~BJMa8v=KXs9 z&-0&m_3-`4^TpO90QeyQygofYb!zgX_pSr5vjA#t_T-y0=Niq^0Q?Vtz8lSBQ%C!+ z+*+o!zZ3N)4d{V-o4&6Rea-o$GZ#MH+MsxUQ~&(Q#p$WF1D7t+{*S5u-2Bv;Q#gtP zH1AV?+rrfRG4Hc%<0`=5B@&%IwfM$T`}XP$fFX|-1sARrpXvjowZwyOPq0b1@ei0P z4NwX<4*c-nd+YAj+geh2m-;#|IZBt@*N3^4ZMcZ$%6YuFl4tYfW@jAm2q>Me9rTWn zcoS5t(~dFN1}gX~U$HWlR(@uW(bH3&X~}qFowf(|z}|;#0{*`Nq$p+&MRlM6K5)`Y zg8>$JU_%VzkOdQxP=o|@K`(Se4l<<1C^HxG5Cshc1AT2>v9a~FERC)rKtL5rC_V&a ziiDIP;31?5fe0aW2=oxj0|Fz2GJ=5Wmr!mHm?4xU1aciA{R!eBElM4NL;feMKXcQ zA>%M)!UU#m#WA6LzUGKE_V{{?3qTyRn3E;^XbV_K9%xl}GXC>-p;(jb<~rO_%q3ZgvDFr9McNV!z2kJfjimP&_> zi<%rQ(`dXv0eM1Bj8J#9UX?RSp*4iE_pnv#BjXe)B{fUM0*TWm*~ugABKdMbbe4|e z5EezDJcRO=8uB%Wq*AC=hp}4PnHt$y86B6=M=Gh23OzgGl^QA6sx(|B1<~T^1Zfnt zRJ}qf$uPr?A|*vTJ4yE-PfHQGF@?XD6;tHcFjp^Hks=jOlmrnB&EK&okM)G~vEWqO9DGF8)zSXZy6W4gx@iSF5_)kGoo#OOdVI^b)n;vG7ZL}m=fvYzm>E^3M= z>(rdAU@?_*l@IK+6jkL)RMpUAxpZWgSJ5m-n4 delta 959 zcmaiyO-NKx7>3_-@AW!A&QCd-+TZ9{Mwo>RLxhNlh%FV731ns?>pCpne2FaDe-WG=NGsh$fW0UB7yh(-oSNqHl3LWKWXZE1DqOW(#c%* z=3LL(;0@q3FBH2g8?lQq2<|1_4aw25P}eW`Ee0szUEPI$&+>lxZdILmk82MM73EOp zVpw;gA}eZ~W%0l{X01l#&nImXHEt;712o9rxnhXSS6k)2c zQB50m@r&sd`RB?LM++cnO~C|^tcHTAAZ-nkLh`7B=^;HD3W4-$C<&6r6%+^Q*H9*8 zP(#6xwVFJ&Lq;@o0m=VFK|hc&4V^*8HS`EMprKpHOB(uy%xYKxNVZ#{x*!)dtP13P zO~vpk@{p_Cq}067uxOC4G%O$F2Mr4e>1tR~xD=>hap9iTsMfpv8ui1t&onGO+}9d5 z0q&j#;XLpyrD11K8q}~yC=F>;w<;r!eKBnWjUnTy=`)ATeQVnKT6Nn_+S}E=)tjCj z?}GQGFYZhEBmPnUdQChK2|Nmvf+NA*(7Dh~xI6q&2`v9KSIn?#tOy##Gd` createState() => _PureBottomBarState(); } class _PureBottomBarState extends State { - List get bottomBar => const['组件','绘制', '收藏','我的']; + List get bottomBar => const ['组件', '绘制', + // '宝具', + '收藏', '我的']; - List get bottomBarIcon => const[ - TolyIcon.icon_layout, - TolyIcon.dingzhi1, + List get bottomBarIcon => const [ + TolyIcon.icon_layout, + TolyIcon.dingzhi1, + // TolyIcon.icon_artifact, TolyIcon.icon_collect, - TolyIcon.yonghu, - ]; + TolyIcon.yonghu, + ]; int _position = 0; @override void initState() { super.initState(); _position = widget.initPosition; - } @override Widget build(BuildContext context) { - return Wrap( children: [ // Divider(height: 1,), @@ -49,7 +53,6 @@ class _PureBottomBarState extends State { widget.onItemTap?.call(_position); setState(() { - // _controller.jumpToPage(_position); }); }, @@ -64,7 +67,12 @@ class _PureBottomBarState extends State { showUnselectedLabels: true, showSelectedLabels: true, // backgroundColor: themeColor.itemColor, - items: bottomBar.asMap().keys.map((index) => BottomNavigationBarItem(label: bottomBar[index], icon: Icon(bottomBarIcon[index]))).toList(), + items: bottomBar + .asMap() + .keys + .map((index) => BottomNavigationBarItem( + label: bottomBar[index], icon: Icon(bottomBarIcon[index]))) + .toList(), ), ], ); diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart index a2f54ead..f18aa7d8 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/app/navigation/unit_navigation.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; +import 'package:artifact/artifact.dart'; import 'package:authentication/authentication.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -11,6 +12,7 @@ import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.da import 'package:widget_module/blocs/blocs.dart'; import 'package:flutter_unit/widget_ui/mobile/widget_panel/standard_home_page.dart'; + import 'pure_bottom_bar.dart'; import 'desk_ui/unit_desk_navigation.dart'; @@ -76,6 +78,7 @@ class _UnitPhoneNavigationState extends State { children: [ StandardHomePage(), GalleryUnit(), + // ArtifactPage(), CollectPageAdapter(), UserPage(), ], @@ -114,7 +117,7 @@ class _UnitPhoneNavigationState extends State { } } - if (index == 2) { + if (index == 3) { BlocProvider.of(context).add(const EventLoadLikeData()); } } @@ -124,7 +127,7 @@ class _UnitPhoneNavigationState extends State { if (index == 0) { Scaffold.of(context).openDrawer(); } - if (index == 3) { + if (index == 4) { Scaffold.of(context).openEndDrawer(); } } diff --git a/lib/code_gen/icon_font_gen/gen_message_action.dart b/lib/code_gen/icon_font_gen/gen_message_action.dart index 23070b67..78095d46 100644 --- a/lib/code_gen/icon_font_gen/gen_message_action.dart +++ b/lib/code_gen/icon_font_gen/gen_message_action.dart @@ -1,8 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; - - class GenMessageAction extends StatelessWidget { final VoidCallback onGen; const GenMessageAction({Key? key, required this.onGen}) : super(key: key); @@ -12,21 +10,29 @@ class GenMessageAction extends StatelessWidget { return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: Text( + Expanded( + child: Text( '使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。', style: TextStyle( - color: Theme.of(context).primaryColor,fontWeight: FontWeight.bold),)), + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold), + )), ElevatedButton( style: ElevatedButton.styleFrom( - elevation: 0, - shape: const StadiumBorder() - ), - onPressed:onGen, child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 4, + elevation: 0, shape: const StadiumBorder()), + onPressed: onGen, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 4, children: [ - Icon(TolyIcon.icon_fast,size: 16,), - const Text('生成代码',style: TextStyle(height: 1,fontSize: 12),), + Icon( + TolyIcon.icon_fast, + size: 16, + ), + const Text( + '生成代码', + style: TextStyle(height: 1.1, fontSize: 12), + ), ], )), ], diff --git a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart b/lib/code_gen/icon_font_gen/icon_font_class_parser.dart index de7447f3..8eb70951 100644 --- a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart +++ b/lib/code_gen/icon_font_gen/icon_font_class_parser.dart @@ -107,38 +107,4 @@ class $fontFamily { pubspecFile.writeAsStringSync(lines.join('\n')); } } - - // // 修改 pubspec.yaml - // void setYaml(IconFontGenConfig config){ - // String fontFamily = config.fontFamily; - // String assets = config.assetsDist.replaceAll('\\', '/'); - // - // final String filePath = path.join(config.projectPath,'pubspec.yaml'); - // File pubspecFile = File(filePath); - // final String pubspec = pubspecFile.readAsStringSync(); - // final doc = loadYaml(pubspec); - // final modifiableDoc = getModifiableNode(doc); - // - // YamlList? fontsList = doc['flutter']['fonts'] as YamlList?; - // if(fontsList == null){ - // // 新文件,没有配置 fonts 节点 - // modifiableDoc['flutter']['fonts'] = YamlMap.wrap({ - // 'family': fontFamily, - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'$assets/iconfont.ttf'})]) - // }); - // }else{ - // final modifiableList = getModifiableNode(fontsList); - // modifiableList.removeWhere((e) => e['family'] == fontFamily); - // modifiableList.add( - // YamlMap.wrap({ - // 'family': fontFamily, - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'$assets/iconfont.ttf'})]) - // }) - // ); - // modifiableDoc['flutter']['fonts'] = modifiableList; - // } - // final targetYaml = toYamlString(modifiableDoc); - // pubspecFile.writeAsStringSync(targetYaml); - // } - } \ No newline at end of file diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart index 24e61039..39b7a0e4 100644 --- a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart +++ b/lib/code_gen/icon_font_gen/icon_font_gen_page.dart @@ -274,7 +274,6 @@ class FileSelectorInput extends StatelessWidget { } void _showSelectFile() async { - print("=======_showSelectFile============="); String? path; if (pickerDir) { path = await FilePicker.platform.getDirectoryPath(); diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index 43f3cbe4..4788195c 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -64,11 +64,23 @@ class _StandardHomePageState extends State child: NestedScrollView( floatHeaderSlivers: true, headerSliverBuilder: _buildHeader, - body: TabBarView( - physics: const NeverScrollableScrollPhysics(), - controller: tabController, - children: _tabs.map(buildScrollPage).toList(), - ), + body: Builder( + builder:(ctx)=> CustomScrollView( + // key: PageStorageKey(name), + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(ctx), + ), + const WidgetListPanel(), + SliverPadding( + padding: const EdgeInsets.only(bottom: 30), + sliver: SliverOverlapInjector( + handle: NestedScrollView.sliverOverlapAbsorberHandleFor(ctx), + ), + ), + ], + ), + ) ), ), ], diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart index a55d7f54..bc8bebe6 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart @@ -49,12 +49,16 @@ class StandardWidgetItem extends StatelessWidget { return Row( children: [ if (searchArg == null) - Text( - model.name, - style: TextStyle( - fontSize: 16, - color: textColor, - fontWeight: FontWeight.bold, + Expanded( + child: Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + color: textColor, + fontWeight: FontWeight.bold, + ), ), ), if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), @@ -85,7 +89,6 @@ class StandardWidgetItem extends StatelessWidget { ), ); }), - const Spacer(), StarScore( star: Star(emptyColor: Colors.white, size: 12, fillColor: color), score: model.lever, diff --git a/packages/app/lib/app/res/toly_icon.dart b/packages/app/lib/app/res/toly_icon.dart index b95f7ecb..012bb0a8 100644 --- a/packages/app/lib/app/res/toly_icon.dart +++ b/packages/app/lib/app/res/toly_icon.dart @@ -3,7 +3,8 @@ import 'package:flutter/widgets.dart'; // 欢迎支持: https://github.com/toly1994328/FlutterUnit class TolyIcon { TolyIcon._(); - static const IconData dark = IconData(0xe72f, fontFamily: "TolyIcon"); + static const IconData icon_artifact = IconData(0xe726, fontFamily: "TolyIcon"); +static const IconData dark = IconData(0xe72f, fontFamily: "TolyIcon"); static const IconData wb_sunny = IconData(0xe746, fontFamily: "TolyIcon"); static const IconData icon_fast = IconData(0xe607, fontFamily: "TolyIcon"); static const IconData icon_layout = IconData(0xe85e, fontFamily: "TolyIcon"); diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index 0db8899c..0013f792 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -66,9 +66,6 @@ class AppTheme { primaryColor: state.themeColor, scaffoldBackgroundColor: Color(0xffF3F4F6), useMaterial3: useMaterial3, - tabBarTheme: TabBarTheme( - dividerColor: Colors.transparent, - ), // Android 使用 Material3 chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), listTileTheme: ListTileThemeData( @@ -79,6 +76,15 @@ class AppTheme { space: px1, thickness: px1, ), + tabBarTheme: TabBarTheme( + dividerColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + overlayColor: MaterialStateProperty.resolveWith( + (Set states) { + return states.contains(MaterialState.focused) ? null : Colors.transparent; + }, + ), + ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Colors.white), appBarTheme: AppBarTheme( diff --git a/packages/app/lib/repository/app_state_repository.dart b/packages/app/lib/repository/app_state_repository.dart index fa96dd19..7d032d77 100644 --- a/packages/app/lib/repository/app_state_repository.dart +++ b/packages/app/lib/repository/app_state_repository.dart @@ -35,6 +35,7 @@ class AppStateRepository{ } await FlutterDbStorage.instance.initDb(); + await AppDbStorage.instance.initDb(); return AppState.fromPo(po); diff --git a/packages/app_update/lib/bloc/bloc.dart b/packages/app_update/lib/bloc/bloc.dart index a87deb22..0da98654 100644 --- a/packages/app_update/lib/bloc/bloc.dart +++ b/packages/app_update/lib/bloc/bloc.dart @@ -22,8 +22,7 @@ class UpdateBloc extends Bloc { emit(const CheckLoadingState()); // await Future.delayed(Duration(seconds: 1)); // 检测更新逻辑 - TaskResult result = - await AppInfoApi.getAppVersion(appName: event.appName); + TaskResult result = await AppInfoApi.getAppVersion(appName: event.appName); PackageInfo packageInfo = await PackageInfo.fromPlatform(); if (result.success && result.data != null) { diff --git a/packages/artifact/.gitignore b/packages/artifact/.gitignore new file mode 100644 index 00000000..96486fd9 --- /dev/null +++ b/packages/artifact/.gitignore @@ -0,0 +1,30 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/artifact/.metadata b/packages/artifact/.metadata new file mode 100644 index 00000000..6c08927e --- /dev/null +++ b/packages/artifact/.metadata @@ -0,0 +1,10 @@ +# 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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: package diff --git a/packages/artifact/CHANGELOG.md b/packages/artifact/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/artifact/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/artifact/LICENSE b/packages/artifact/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/artifact/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/artifact/README.md b/packages/artifact/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/artifact/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/artifact/analysis_options.yaml b/packages/artifact/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/artifact/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/artifact/lib/artifact.dart b/packages/artifact/lib/artifact.dart new file mode 100644 index 00000000..95b4c602 --- /dev/null +++ b/packages/artifact/lib/artifact.dart @@ -0,0 +1,3 @@ +library artifact; + +export 'src/views/artifact_page.dart'; diff --git a/packages/artifact/lib/src/blocs/article/bloc.dart b/packages/artifact/lib/src/blocs/article/bloc.dart new file mode 100644 index 00000000..95bf4e20 --- /dev/null +++ b/packages/artifact/lib/src/blocs/article/bloc.dart @@ -0,0 +1,104 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:utils/utils.dart'; + +import '../../repositories/model/article.dart'; +import '../../repositories/repository/article_repository.dart'; + +class ArticleBloc extends Cubit { + ArticleBloc( + this.repository, { + this.pageSize = 20, + this.groupId, + }) : super(ArticleState.empty()); + + final int pageSize; + final int? groupId; + final ArticleRepository repository; + + /// 初始化时,加载 [pageSize] 条记录 + /// + void init() { + _loadDataFromDbOrNet(1, pageSize, filter: groupId?.toString(),requestNet: true); + } + + Future loadNextPageMore() async { + int curPage = state.data.length ~/ pageSize; + int nextPage = curPage + 1; + TaskResult> result = await repository.queryByHttp( + page: nextPage, + pageSize: pageSize, + groupId: groupId, + ); + if (result.success) { + emit(ArticleWithData( + data: state.data + result.data!, total: result.count)); + repository.cacheResult(result.data!); + } else { + emit(ArticleFailed(result.msg, data: state.data)); + } + } + + Future _loadDataFromDbOrNet( + int page, + int pageSize, { + bool requestNet = false, + String? filter, + }) async { + /// 没有内存缓存时,查看数据库数据 + List

data = await repository.queryByDbCache( + page: page, pageSize: pageSize, filter: filter); + + // 没有内存缓存 并且数据库有数据 + if (data.isNotEmpty) { + emit(ArticleWithData(data: data, total: data.length)); + if (!requestNet) return; + } + await _requestNetAndSaveOrUpdate( + page: page, pageSize: pageSize, groupId: int.tryParse(filter ?? '-')); + } + + Future _requestNetAndSaveOrUpdate({ + int page = 1, + int pageSize = 20, + int? groupId, + }) async { + // 此时表示没有缓存数据,并且需要请求网络 + // print("=====ColumnizeBloc::请求网络加载数据=========="); + TaskResult> result = await repository.queryByHttp( + groupId: groupId, pageSize: pageSize, page: page); + if (result.success) { + emit(ArticleWithData(data: result.data!, total: result.count)); + repository.cacheResult(result.data!); + } else { + emit(ArticleFailed(result.msg, data: state.data)); + } + } + + @override + Future close() async{ + super.close(); + print("=======close:${groupId}=================="); + } +} + +sealed class ArticleState { + final List
data; + + const ArticleState({this.data = const []}); + + factory ArticleState.empty() => const ArticleWithData(); +} + +class ArticleLoading extends ArticleState { + const ArticleLoading({super.data}); +} + +class ArticleWithData extends ArticleState { + final int total; + const ArticleWithData({super.data, this.total = 0}); +} + +class ArticleFailed extends ArticleState { + final String error; + const ArticleFailed(this.error, {super.data}); +} diff --git a/packages/artifact/lib/src/blocs/columnize/bloc.dart b/packages/artifact/lib/src/blocs/columnize/bloc.dart new file mode 100644 index 00000000..56405876 --- /dev/null +++ b/packages/artifact/lib/src/blocs/columnize/bloc.dart @@ -0,0 +1,56 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:utils/utils.dart'; + +import '../../repositories/model/columnize.dart'; +import '../../repositories/repository/columnize_repository.dart'; + +class ColumnizeBloc extends Cubit { + final ColumnizeRepository repository; + + ColumnizeBloc(this.repository) : super(ColumnizeState.initial()); + + void init() { + _loadDataFromNet(requestNet: true); + } + + Future _loadDataFromNet({bool requestNet = false}) async { + /// 没有内存缓存时,查看数据库数据 + List data = await repository.queryByDbCache(); + + // 没有内存缓存 并且数据库有数据 + if (data.isNotEmpty) { + emit(ColumnizeState(data)); + if (!requestNet) return; + } + + await _requestNetAndSaveOrUpdate(); + } + + Future _requestNetAndSaveOrUpdate() async { + // 此时表示没有缓存数据,并且需要请求网络 + print("=====ColumnizeBloc::请求网络加载数据=========="); + TaskResult> result = await repository.queryByHttp(); + if (result.success) { + emit(ColumnizeState(result.data!)); + repository.cacheResult(result.data!); + } else { + // emit(PlanFailureState(result.msg,oldData: _cache[groupId] ?? [])); + } + } +} + +class ColumnizeState { + List data; + + ColumnizeState(this.data); + + factory ColumnizeState.initial() => ColumnizeState([ + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + Columnize(title: '-', url: '-'), + ]); +} diff --git a/packages/artifact/lib/src/blocs/exp.dart b/packages/artifact/lib/src/blocs/exp.dart new file mode 100644 index 00000000..2f17c65f --- /dev/null +++ b/packages/artifact/lib/src/blocs/exp.dart @@ -0,0 +1,2 @@ +export 'article/bloc.dart'; +export 'columnize/bloc.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/repositories/exp.dart b/packages/artifact/lib/src/repositories/exp.dart new file mode 100644 index 00000000..3ce49787 --- /dev/null +++ b/packages/artifact/lib/src/repositories/exp.dart @@ -0,0 +1,4 @@ +export 'repository/article_repository.dart'; +export 'repository/columnize_repository.dart'; +export 'model/columnize.dart'; +export 'model/article.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/repositories/model/article.dart b/packages/artifact/lib/src/repositories/model/article.dart new file mode 100644 index 00000000..db950dfa --- /dev/null +++ b/packages/artifact/lib/src/repositories/model/article.dart @@ -0,0 +1,77 @@ + +import 'dart:convert'; + +import 'package:storage/storage.dart'; + +class Article { + final String? username; + final String title; + final String? subtitle; + final String url; + final String? cover; + final int create; + final int update; + final int id; + final int groupId; + + Article({ + this.username = '', + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + this.id = -1, + required this.groupId, + + }); + + Map toJson() => + { + "username": username, + "title": title, + "create": create, + "subtitle": subtitle, + "url": url, + "cover": cover, + "update": update, + }; + + factory Article.fromMap(dynamic map)=> + Article( + username: map['userName'] ?? '', + title: map['title'] ?? '', + create: DateTime.parse(map['createAt']).millisecondsSinceEpoch, + update: DateTime.parse(map['updateAt']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + groupId: map['groupId'] ?? 1, + cover: map['caver'] ?? '', + ); + + // 通过 Columnize 对象生成 数据库缓存对象 + factory Article.fromCache(CachePo cache) { + dynamic map = json.decode(cache.content); + return Article( + username: map['username'] ?? '', + title: map['title'] ?? '', + create: map['create']??0, + update: map['update']??0, + groupId: int.tryParse(cache.filter)??1, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['caver'] ?? '', + id: map['id'] ?? -1, + ); + } + + CachePo get toCache => CachePo( + id: id, + filter: groupId.toString(), + content: json.encode(this), + update: update, + create: create, + type: 0, + ); +} \ No newline at end of file diff --git a/packages/artifact/lib/src/repositories/model/columnize.dart b/packages/artifact/lib/src/repositories/model/columnize.dart new file mode 100644 index 00000000..81cc9ca0 --- /dev/null +++ b/packages/artifact/lib/src/repositories/model/columnize.dart @@ -0,0 +1,79 @@ +import 'dart:convert'; + +import 'package:storage/storage.dart'; + +class Columnize { + final String? username; + final String title; + final String subtitle; + final String? url; + final String? cover; + final int create; + final int update; + final int count; + final int id; + + Columnize({ + this.username = '', + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + this.count = 0, + this.id = -1, + }); + + Map toJson() => { + "username": username, + "title": title, + "create": create, + "subtitle": subtitle, + "url": url, + "cover": cover, + "update": update, + "count": count, + }; + + factory Columnize.fromMap(dynamic map) => Columnize( + username: map['userName'] ?? '', + title: map['title'] ?? '', + create: DateTime.parse(map['createAt']).millisecondsSinceEpoch, + update: DateTime.parse(map['updateAt']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['caver'] ?? '', + count: map['count'] ?? 0, + id: map['columnizeId'] ?? -1, + ); + + // 通过 Columnize 对象生成 数据库缓存对象 + factory Columnize.fromCache(CachePo cache) { + dynamic map = json.decode(cache.content); + return Columnize( + username: map['username'] ?? '', + title: map['title'] ?? '', + create: map['create']??0, + update: map['update']??0, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['caver'] ?? '', + count: map['count'] ?? 0, + id: map['id'] ?? -1, + ); + } + CachePo get toCache => CachePo( + id: id, + filter: '', + content: json.encode(this), + update: update, + create: create, + type: 0, + ); + + @override + String toString() { + return 'Columnize{username: $username, title: $title, subtitle: $subtitle, url: $url, cover: $cover, create: $create, update: $update, count: $count}'; + } +} diff --git a/packages/artifact/lib/src/repositories/repository/article_repository.dart b/packages/artifact/lib/src/repositories/repository/article_repository.dart new file mode 100644 index 00000000..a9699361 --- /dev/null +++ b/packages/artifact/lib/src/repositories/repository/article_repository.dart @@ -0,0 +1,75 @@ +import 'package:dio/dio.dart'; +import 'package:storage/storage.dart'; +import 'package:utils/utils.dart'; + +import '../exp.dart'; + +// 仓储: 提供数据 +class ArticleRepository { + final String host; + late Dio _dio; + + ArticleRepository(this.host){ + _dio = Dio(BaseOptions(baseUrl: 'http://$host:8080/')); + } + + CacheDao get cacheDao => AppDbStorage.instance.cacheDao; + + Future>> query({ + int page = 1, + int pageSize = 20, + }){ + return queryByHttp(page:page,pageSize:pageSize); + } + + + // 缓存数据 + Future cacheResult(List
data) async{ + for(int i=0;i> queryByDbCache({ + int page = 1, + int pageSize = 20, + String? filter, + }) async { + List caches = await cacheDao.query( + type: 1, + + page: page, + pageSize: pageSize, + ); + return caches.map(Article.fromCache).toList(); + } + + + Future>> queryByHttp({ + int page = 1, + int pageSize = 20, + int? groupId, + }) async { + Map params = { + 'page': page, + 'pageSize': pageSize, + }; + + if(groupId!=null){ + params['groupId'] = groupId; + } + + var rep = await _dio.get('/api/v1/article', queryParameters: params); + if(rep.statusCode == 200){ + if(rep.data['status']){ + // 数据访问成功 + List data = rep.data['data']; + List
result = data.map(Article.fromMap).toList(); + return TaskResult.success(data: result,count: rep.data['total']); + } + } + + return TaskResult.error(msg: '请求失败!'); + } +} diff --git a/packages/artifact/lib/src/repositories/repository/columnize_repository.dart b/packages/artifact/lib/src/repositories/repository/columnize_repository.dart new file mode 100644 index 00000000..eb08b9b0 --- /dev/null +++ b/packages/artifact/lib/src/repositories/repository/columnize_repository.dart @@ -0,0 +1,59 @@ +import 'package:dio/dio.dart'; +import 'package:storage/storage.dart'; +import 'package:utils/utils.dart'; + +import '../model/columnize.dart'; + +// 仓储: 提供数据 +class ColumnizeRepository { + + final String host; + late Dio _dio; + + ColumnizeRepository(this.host){ + _dio = Dio(BaseOptions(baseUrl: 'http://$host:8080/')); + } + + CacheDao get cacheDao => AppDbStorage.instance.cacheDao; + + // 缓存数据 + Future cacheResult(List data) async{ + for(int i=0;i> queryByDbCache({ + int page = 1, + int pageSize = 20, + }) async { + List caches = await AppDbStorage.instance.cacheDao.query( + type: 0, + page: page, + pageSize: pageSize, + ); + return caches.map(Columnize.fromCache).toList(); + } + + Future>> queryByHttp({ + int page = 1, + int pageSize = 20, + }) async { + var rep = await _dio.get('/api/v1/columnize', queryParameters: { + 'page': page, + 'pageSize': pageSize, + }); + if (rep.statusCode == 200) { + if (rep.data['status']) { + // 数据访问成功 + List data = rep.data['data']; + List result = data.map(Columnize.fromMap).toList(); + return TaskResult.success(data: result, count: rep.data['total']); + } + } + + return TaskResult.error(msg: ''); + } + +} diff --git a/packages/artifact/lib/src/views/article/article_detail_page.dart b/packages/artifact/lib/src/views/article/article_detail_page.dart new file mode 100644 index 00000000..9e701d3e --- /dev/null +++ b/packages/artifact/lib/src/views/article/article_detail_page.dart @@ -0,0 +1,80 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../repositories/model/article.dart'; + +class ArticleDetailPage extends StatefulWidget { + final Article article; + + const ArticleDetailPage({Key? key, required this.article}) : super(key: key); + + @override + State createState() => _ArticleDetailPageState(); +} + +class _ArticleDetailPageState extends State { + late WebViewController controller; + + int progress = 0; + + @override + void initState() { + print(widget.article.url); + super.initState(); + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..loadRequest(Uri.parse('https://juejin.cn${widget.article.url}/')) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + print(progress); + this.progress =progress; + setState(() { + + }); + }, + onPageStarted: (String url) { + + }, + onPageFinished: (String url) { + }, + )); + } + + _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + + @override + Widget build(BuildContext context) { + + + return Scaffold( + appBar: AppBar(title: Text(widget.article.title),actions: [ + IconButton(onPressed: (){ + _launchURL('https://juejin.cn${widget.article.url}/'); + }, icon: Icon(TolyIcon.icon_artifact,size: 20,)) + ],), + body: Stack( + alignment: Alignment.center, + children: [ + WebViewWidget(controller: controller), + if(progress!=100) + Center( + child: CupertinoActivityIndicator(), + ) + ], + ), + ); + } +} diff --git a/packages/artifact/lib/src/views/article/column_detail_page.dart b/packages/artifact/lib/src/views/article/column_detail_page.dart new file mode 100644 index 00000000..86cd81dc --- /dev/null +++ b/packages/artifact/lib/src/views/article/column_detail_page.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +import '../../repositories/exp.dart'; +import 'sliver_article.dart'; + +class ColumnDetailPage extends StatelessWidget { + final Columnize columnize; + + const ColumnDetailPage({Key? key, required this.columnize}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(columnize.title), + ), + body: CustomScrollView( + slivers: [ + SliverArticlePanel() + // SliverAppBar( + // title: Text(columnize.title), + // ), + ], + ), + ); + } +} diff --git a/packages/artifact/lib/src/views/article/columnize_page_view.dart b/packages/artifact/lib/src/views/article/columnize_page_view.dart new file mode 100644 index 00000000..43992691 --- /dev/null +++ b/packages/artifact/lib/src/views/article/columnize_page_view.dart @@ -0,0 +1,222 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:intl/intl.dart'; + +import '../../blocs/article/bloc.dart'; +import '../../blocs/exp.dart'; +import '../../repositories/model/columnize.dart'; +import '../../repositories/repository/article_repository.dart'; + +import 'column_detail_page.dart'; + +DateFormat formatLong = DateFormat('yyyy-MM-dd HH:mm:ss'); + +const colors = [ + Color(0xFF0829FB), + Color(0xFFF60C0C), + Color(0xFFE7F716), + Color(0xFFF3B913), + Color(0xFF3DF30B), + Color(0xFFB709F4), + Color(0xFF0DF6EF), +]; + + +class ColumnizePageView extends StatefulWidget { + const ColumnizePageView({Key? key}) : super(key: key); + + @override + _ColumnizePageViewState createState() => _ColumnizePageViewState(); +} + +class _ColumnizePageViewState extends State { + final ValueNotifier factor = ValueNotifier(0); + + late PageController _ctrl; + + final int _firstOffset = 1000; //初始偏移 + int _position = 0; //页面位置 + + @override + void initState() { + super.initState(); + _position = _position + _firstOffset; + + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; + _ctrl = PageController( + viewportFraction: 0.9, + initialPage: _position, + )..addListener(() { + if(_ctrl.page!=null){ + double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; + factor.value = value == 0 ? 1 : value; + } + }); + } + + + + @override + void dispose() { + _ctrl.dispose(); + factor.dispose(); + super.dispose(); + } + + + Color get color => Colors.blue; + + Color get nextColor =>Colors.orangeAccent; + bool get isDark => Theme.of(context).brightness == Brightness.dark; + + BoxDecoration get boxDecoration => BoxDecoration( + color: isDark?Colors.white.withAlpha(33):Colors.white, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(40), topRight: Radius.circular(40)), + ); + + @override + Widget build(BuildContext context) { + + List data = context.watch().state.data; + + return PageView.builder( + controller: _ctrl, + // itemCount: 7, + itemBuilder: (_, index) { + return AnimatedBuilder( + child: _buildByIndex(context,index,data), + animation: _ctrl, + builder: (context, child) => + _buildAnimItemByIndex(context, child, index,), + ); + }, + onPageChanged: (index) { + _position = index; + }, + ); + } + + Widget? _buildByIndex(BuildContext context, int index,List data) { + int realIndex = _fixPosition(index, _firstOffset,data.length); + return ColumnizeItem(columnize: data[realIndex],color: colors[realIndex%colors.length],); + } + + Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { + double value; + if (_ctrl.position.haveDimensions&&_ctrl.page!=null) { + value = _ctrl.page! - index; + } else { + value = (_position - index).toDouble(); + } + value = (1 - ((value.abs()) * .3)).clamp(0, 1).toDouble(); + value = Curves.easeOut.transform(value); + + return Transform( + transform: Matrix4.diagonal3Values(1.0, value, 1.0), + alignment: Alignment.center, + child: Padding( + padding: const EdgeInsets.all(6.0), + child: child, + ), + ); + } + + int _fixPosition(int realPos, int initPos, int length) { + final int offset = realPos - initPos; + int result = offset % length; + return result < 0 ? length + result : result; + } + + + + +} + +class ColumnizeItem extends StatelessWidget { + final Columnize columnize; + final Color color; + const ColumnizeItem({Key? key, required this.columnize, required this.color}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: (){ + ArticleRepository repository = context.read().repository; + Navigator.of(context).push(Right2LeftRouter(child: MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => ArticleBloc(repository,groupId: columnize.id)..init()), + ], + child: ColumnDetailPage(columnize:columnize)))); + }, + child: Container( + alignment: Alignment.topLeft, + padding: EdgeInsets.symmetric(horizontal: 16,vertical: 10), + // margin: EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(columnize.title,style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), + Text('作者: ${columnize.username}',style: TextStyle(fontSize: 12,color: Color(0xff6A6D76,)),), + ], + ), + Spacer(), + Container( + padding: EdgeInsets.symmetric(horizontal: 8,vertical: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + border: Border.all(color:Color(0xff3872E0)) + ), + child: Text( + '${columnize.count} 篇', + style: TextStyle( + color: Color(0xff3872E0), + fontSize: 12, + height: 1.1), + ), + ) + ], + ), + const SizedBox(height: 6,), + Text('专栏简介: ${columnize.subtitle}',style: TextStyle(color: Color(0xffA3A3A3,),fontSize: 12),maxLines: 3,), + Spacer(), + Row( + children: [ + Text('更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(columnize.update,isUtc: true))}',style: TextStyle(color: Color(0xff6A6D76,),fontSize: 12),), + Spacer(), + ], + ), + + ], + ), + decoration: BoxDecoration( + gradient: LinearGradient( + transform: GradientRotation( + 1*pi/4 + ), + colors: [ + color.withOpacity(0.1), + color.withOpacity(0.08), + color.withOpacity(0), + // Theme.of(context).primaryColor.withAlpha(88) + ]), + // color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + + ), + ), + ); + } +} diff --git a/packages/artifact/lib/src/views/article/sliver_article.dart b/packages/artifact/lib/src/views/article/sliver_article.dart new file mode 100644 index 00000000..4e626238 --- /dev/null +++ b/packages/artifact/lib/src/views/article/sliver_article.dart @@ -0,0 +1,172 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../blocs/exp.dart'; +import '../../repositories/exp.dart'; +import 'article_detail_page.dart'; +import 'columnize_page_view.dart'; + +//class ArticleLoading extends ArticleState { +// const ArticleLoading({super.data}); +// } +// +// class ArticleWithData extends ArticleState { +// final int total; +// const ArticleWithData({super.data, this.total = 0}); +// } +// +// class ArticleFailed extends ArticleState { +// final String error; +// const ArticleFailed(this.error, {super.data}); +// } +class SliverArticlePanel extends StatelessWidget { + const SliverArticlePanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + ArticleState state = context.watch().state; + return switch (state) { + ArticleLoading() => SliverToBoxAdapter( + child: const CupertinoActivityIndicator(), + ), + ArticleWithData() => SliverArticle( + data: state.data, + ), + ArticleFailed() => SliverToBoxAdapter( + child: Text('error'), + ), + }; + } +} + +class SliverArticle extends StatelessWidget { + final List
data; + const SliverArticle({Key? key, required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SliverPadding( + padding: EdgeInsets.only(bottom: 0), + sliver: SliverList( + delegate: SliverChildBuilderDelegate(_buildItem, + childCount: data.length))); + } + + Widget? _buildItem(BuildContext context, int index) { + return ArticlePanel( + article: data[index], + ); + // return Column( + // children: [ + // ListTile( + // tileColor: Colors.white, + // title: Text(data[index]), + // ), + // const SizedBox( + // height: 6, + // ) + // ], + // ); + } +} + +class ArticlePanel extends StatelessWidget { + final Article article; + + const ArticlePanel({Key? key, required this.article}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ArticleDetailPage(article: article), + ), + ); + }, + child: Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: EdgeInsets.only(bottom: 6), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/icon_head.webp', + ), + backgroundColor: Colors.transparent, + radius: 10, + ), + const SizedBox( + width: 6, + ), + Expanded( + child: Text('${article.username}', + style: + TextStyle(color: Color(0xff6A6D76), fontSize: 12))), + Text( + '掘金', + style: TextStyle(fontSize: 12, color: Color(0xff6A6D76)), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Text( + article.title, + maxLines: 2, + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + Row( + children: [ + Expanded( + child: Text( + '${article.subtitle}', + maxLines: 4, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + color: Color( + 0xffA3A3A3, + )), + )), + if (article.cover != null&&article.cover!.isNotEmpty) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.network( + article.cover!, + width: 110, + )), + ) + ], + ), + const SizedBox( + height: 4, + ), + Row( + children: [ + Spacer(), + Text( + '更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(article.update, isUtc: true))}', + style: TextStyle( + color: Color( + 0xff6A6D76, + ), + fontSize: 12), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/packages/artifact/lib/src/views/article/sliver_columnize.dart b/packages/artifact/lib/src/views/article/sliver_columnize.dart new file mode 100644 index 00000000..cf1e27f2 --- /dev/null +++ b/packages/artifact/lib/src/views/article/sliver_columnize.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +import 'columnize_page_view.dart'; + +class ColumnizeViewPage extends StatefulWidget { + const ColumnizeViewPage({Key? key}) : super(key: key); + + @override + State createState() => _ColumnizeViewPageState(); +} + +class _ColumnizeViewPageState extends State { + + late PageController _ctrl; + + @override + void initState() { + super.initState(); + _ctrl = PageController(viewportFraction: 0.9); + } + + @override + Widget build(BuildContext context) { + return ColoredBox( + color: Colors.white, + child: const SizedBox( + height: 220, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 16.0,right: 16,top: 12,bottom: 4), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp',), + backgroundColor: Colors.transparent, + radius: 10, + ), + const SizedBox(width: 6,), + Text("捷特文章专栏",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + Spacer(), + Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), + Icon(Icons.navigate_next,size: 12,color: Colors.blue,) + ], + ), + ), + Expanded( + child: ColumnizePageView(), + ), + const SizedBox(height: 10,) + ], + ), + ), + ); + } + +} diff --git a/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart b/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart new file mode 100644 index 00000000..7cb980aa --- /dev/null +++ b/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart @@ -0,0 +1,152 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:refresh/refresh.dart'; + +import '../../blocs/exp.dart'; +import '../toly_refresh_indicator.dart'; +import 'sliver_article.dart'; +import 'sliver_columnize.dart'; + +class TolyArticleScrollPage extends StatefulWidget { + const TolyArticleScrollPage({Key? key}) : super(key: key); + + @override + State createState() => _TolyArticleScrollPageState(); +} + +class _TolyArticleScrollPageState extends State { + + final RefreshController _refreshController = + RefreshController(initialRefresh: false); + + int maxCount = 60; + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + const Color themeColor = Color(0xff007ACB); + + return RefreshConfiguration( + headerTriggerDistance: 60, + topHitBoundary: 20, + child: SmartRefresher( + header: TolyRefreshIndicator(), + // header: BezierCircleHeader(), + // header: WaterDropHeader(), + // header: BezierHeader(), + + // header: const ClassicHeader( + // idleText: '', + // releaseText: '释放刷新', + // refreshingText: '加载数据', + // completeText: '刷新成功!', + // refreshingIcon: CupertinoActivityIndicator(color: themeColor,), + // completeIcon: Icon(Icons.done, color: themeColor), + // releaseIcon: Icon(Icons.refresh, color: themeColor), + // idleIcon: Icon(Icons.arrow_downward, color: Colors.grey), + // textStyle: TextStyle(color: themeColor), + // ), + footer: CustomFooter( + builder: (BuildContext context, LoadStatus? mode) { + Widget body; + if (mode == LoadStatus.idle) { + body = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(Icons.arrow_upward, color: themeColor), + Text("上拉加载", + style: TextStyle(color: themeColor, height: 1)), + ], + ); + } else if (mode == LoadStatus.loading) { + body = CupertinoActivityIndicator(); + } else if (mode == LoadStatus.failed) { + body = Text("加载失败!点击重试!"); + } else if (mode == LoadStatus.canLoading) { + body = Text("松手,加载更多!", + style: TextStyle(color: themeColor, height: 1)); + } else { + body = Text("没有更多数据了!", + style: TextStyle( + color: Colors.grey, + )); + } + return Container( + height: 55.0, + child: Center(child: body), + ); + }, + ), + enablePullUp: true, + onRefresh: _onRefresh, + onLoading: _loadMore, + controller: _refreshController, + child: CustomScrollView( + slivers: [ + // SliverOverlapInjector( + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // ), + SliverPadding( + padding: EdgeInsets.only(top: 10,bottom: 10), + sliver: const SliverToBoxAdapter( + child: ColumnizeViewPage(), + ), + ), + SliverArticlePanel(), + ], + ) + + // ListView.builder( + // padding: EdgeInsets.only(top: 10), + // itemCount: data.length, + // itemBuilder: _buildItem, + // ), + ), + ); + } + + void _onRefresh() async { + // monitor network fetch + await Future.delayed(Duration(milliseconds: 1000)); + // if failed,use refreshFailed() + List newData = []; + for (int i = 0; i < 2; i++) { + newData.add('New: ${i}'); + } + // data.insertAll(0, newData); + setState(() {}); + + _refreshController.refreshCompleted(); + } + + void _loadMore() async { + print('===========_loadMore==============='); + // await Future.delayed(Duration(milliseconds: 1000)); + ArticleBloc bloc = context.read(); + await context.read().loadNextPageMore(); + // int length = data.length; + ArticleState state = bloc.state; + if(state is ArticleWithData){ + if (state.data.length >= state.total) { + _refreshController.loadNoData(); + await Future.delayed(Duration(milliseconds: 2000)); + _refreshController.resetNoData(); + return; + } + + _refreshController.loadComplete(); + } + + } + + +} diff --git a/packages/artifact/lib/src/views/artifact_page.dart b/packages/artifact/lib/src/views/artifact_page.dart new file mode 100644 index 00000000..91a9ed20 --- /dev/null +++ b/packages/artifact/lib/src/views/artifact_page.dart @@ -0,0 +1,236 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../blocs/columnize/bloc.dart'; +import '../blocs/exp.dart'; +import '../repositories/exp.dart'; +import '../repositories/repository/article_repository.dart'; +import 'article/toly_article_scroll_page.dart'; + +import 'dart:ui' as ui; + +import 'building/building_panel.dart'; + +class ArtifactPage extends StatefulWidget { + const ArtifactPage({Key? key}) : super(key: key); + + @override + State createState() => _ArtifactPageState(); +} + +// 任意处下滑可出现 AppBar +// |--- NestedScrollView#floatHeaderSlivers: true +// |--- SliverAppBar#floating: true + +// 任意处下滑可出现 AppBar + 轻滑出现 +// |--- NestedScrollView#floatHeaderSlivers: true +// |--- SliverAppBar#floating: true +// |--- SliverAppBar#snap: true + +const List kArtifactInfo = [ + '分类收录张风捷特烈的博客文章', + 'Flutter 框架探索,七剑合璧', + '收录布局方案,提供界面样板', + '生成代码字符串,辅助书写代码', +]; + +class _ArtifactPageState extends State + with SingleTickerProviderStateMixin { + late TabController controller; + List data = []; + @override + void initState() { + super.initState(); + controller = TabController(length: 4, vsync: this); + controller.addListener(_listen); + data = List.generate(5, (index) => 'Init $index'); + } + + int _curIndex = 0; + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + static const String host = '192.168.0.107'; + + ArticleRepository aRepository = ArticleRepository(host); + ColumnizeRepository cRepository = ColumnizeRepository(host); + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider(create: (_) => ArticleBloc(aRepository)..init()), + ], + child: Scaffold( + backgroundColor: const Color(0xffF2F3F5), + bottomNavigationBar: Container(height: 56), + body: NestedScrollView( + headerSliverBuilder: _buildAppBar, + floatHeaderSlivers: true, + body: TabBarView( + controller: controller, + children: [ + TolyArticleScrollPage(), + BuildingPanel(), + BuildingPanel(), + BuildingPanel(), + ], + ), + ), + ), + ); + } + + List _buildAppBar(BuildContext context, bool innerBoxIsScrolled) { + // print('innerBoxIsScrolled:$innerBoxIsScrolled'); + return [ + // SliverOverlapAbsorber( + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // + // sliver: + SliverAppBar( + floating: true, + snap: true, + pinned: true, + backgroundColor: Colors.white, + + // flexibleSpace: Image.network( + // 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/448d4eb270f44edab0192a1281141954~tplv-k3u1fbpfcp-watermark.image?', + // fit: BoxFit.cover, + // ), + + // expandedHeight: 120, + + flexibleSpace: Container( + // height: 240, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Color(0xffD3D5F5), + Color(0xffC8EBFA), + ], transform: GradientRotation(pi / 4))), + ), + // flexibleSpace: Doodle(), + // leading: Center( + // child: Text( + // '宝具库', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + // )), + // actions: [Icon(Icons.cached_outlined)], + titleSpacing: 0, + // leadingWidth: 40, + + title: Column( + children: [ + Text( + '万象宝具', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + const SizedBox( + height: 4, + ), + Text( + kArtifactInfo[_curIndex], + maxLines: 2, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.normal, + color: Colors.purple), + ), + ], + ), + actions: [ + IconButton(onPressed: () {}, icon: Icon(Icons.search_rounded)) + ], + // title: Padding( + // padding: const EdgeInsets.only(right: 8.0), + // child: CupertinoTextField(), + // ), + bottom: TabBar( + controller: controller, + tabs: [ + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: '捷文宝具', + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: '修源七剑', + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: '布局宝具', + ), + Tab( + // icon: Icon(Icons.account_balance_wallet_outlined), + text: '编程宝具', + ), + ], + ), + ), // ) + ]; + } + + Widget? _buildItem(BuildContext context, int index) { + return ListTile( + tileColor: Colors.white, + title: Text(data[index]), + ); + } + + void _listen() { + print('${controller.index}'); + if (_curIndex != controller.index) { + setState(() { + _curIndex = controller.index; + }); + } + } +} + +class Doodle extends StatelessWidget { + const Doodle({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return RepaintBoundary( + child: CustomPaint( + painter: DoodlePainter(), + child: const Center(), + ), + ); + } +} + +class DoodlePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + Paint pen = Paint(); + pen.shader = ui.Gradient.linear( + Offset.zero, + Offset(size.width, size.height), + [const Color(0xffD3D5F5), const Color(0xffC8EBFA)], + [0, 1], + TileMode.mirror, + Matrix4.rotationZ(pi / 4).storage); + canvas.drawRect(Offset.zero & size, pen); + // print(size); + canvas.drawCircle( + Offset(size.width / 2, size.height / 2), + size.height / 6, + Paint() + ..color = Colors.grey + ..style = PaintingStyle.stroke); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/packages/artifact/lib/src/views/artifact_page_.dart b/packages/artifact/lib/src/views/artifact_page_.dart new file mode 100644 index 00000000..7eb8f7ce --- /dev/null +++ b/packages/artifact/lib/src/views/artifact_page_.dart @@ -0,0 +1,146 @@ +// import 'dart:math'; +// +// import 'package:components/components.dart'; +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/src/rendering/sliver.dart'; +// +// class ArtifactPage extends StatefulWidget { +// const ArtifactPage({Key? key}) : super(key: key); +// +// @override +// State createState() => _ArtifactPageState(); +// } +// +// class _ArtifactPageState extends State { +// +// final ScrollController _controller = ScrollController(); +// ValueNotifier rate = ValueNotifier(0); +// +// @override +// void initState() { +// super.initState(); +// _controller.addListener(_refresh); +// } +// +// +// @override +// void dispose() { +// _controller.dispose(); +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: Stack( +// children: [ +// NestedScrollView( +// // controller: _controller, +// // floatHeaderSlivers: true, +// body: RefreshIndicator( +// onRefresh: _onRefresh, +// child: CustomScrollView( +// controller: _controller, +// slivers: [ +// SliverToBoxAdapter( +// child: Container( +// height: 240, +// decoration: BoxDecoration( +// gradient: LinearGradient( +// colors: [Color(0xffFDF2EC),Color(0xffFCC194)], +// transform:GradientRotation(pi/4) +// ) +// ), +// ), +// ), +// SliverToBoxAdapter( +// child: Container( +// height: 1240, +// decoration: BoxDecoration(color: Colors.redAccent), +// ), +// ), +// SliverToBoxAdapter( +// child: Container( +// height: 1240, +// decoration: BoxDecoration(color: Colors.greenAccent), +// ), +// ), +// ], +// ), +// ), headerSliverBuilder: _headerSliverBuilder, +// +// ), +// _buildTopBar(context), +// ], +// ), +// ); +// } +// +// List _headerSliverBuilder(BuildContext context, bool innerBoxIsScrolled) { +// return [ +// // SliverLayoutBuilder(builder: _buildByLayout) +// // SliverAppBar( +// // pinned: true, +// // title: CupertinoTextField() +// // ) +// ]; +// } +// +// Widget _buildByLayout(BuildContext context, SliverConstraints constraints) { +// double top = MediaQuery.of(context).padding.top; +// double rate = constraints.scrollOffset/(64 + top); +// print("=====${constraints.scrollOffset}===${64 + top}======="); +// return SliverPinnedHeader( +// child: PreferredSize( +// preferredSize: Size.fromHeight(64 + top), +// child: Container( +// height: 64 + top, +// decoration: BoxDecoration(color: Color.lerp(Colors.orangeAccent, Colors.white, rate)), +// ), +// ), +// ); +// } +// +// Widget _buildTopBar(BuildContext context,) { +// double top = MediaQuery.of(context).padding.top; +// // double rate = constraints.scrollOffset/(64 + top); +// // double rate = 0; +// Color color = Colors.white; +// +// return ValueListenableBuilder( +// valueListenable: rate, +// builder:(_,v,__) { +// double _rate = rate.value/(64+top); +// _rate = _rate>=1? 1: _rate; +// int a = (255*_rate).toInt(); +// Color bgColor = Color.fromARGB(a, 255, 255, 255); +// return Container( +// height: 64 + top, +// padding: EdgeInsets.only(top: top,right: 16,left: 16), +// alignment: Alignment.centerLeft, +// decoration: BoxDecoration(color: bgColor), +// child: Wrap( +// spacing: 8, +// children: [ +// Text('捷文宝具'), +// Text('布局宝具'), +// Text('编程宝具'), +// // Expanded(child: CupertinoTextField()) +// ], +// ), +// ); +// }, +// ); +// } +// +// void _refresh() { +// if(_controller.position.pixels<200){ +// rate.value = _controller.position.pixels; +// } +// } +// +// Future _onRefresh() async{ +// await Future.delayed(Duration(seconds: 3)); +// } +// } diff --git a/packages/artifact/lib/src/views/building/building_panel.dart b/packages/artifact/lib/src/views/building/building_panel.dart new file mode 100644 index 00000000..a8998916 --- /dev/null +++ b/packages/artifact/lib/src/views/building/building_panel.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class BuildingPanel extends StatelessWidget { + const BuildingPanel({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.add_chart,size: 36,color: Colors.grey,), + const SizedBox(height: 8,), + Text('正在建设中',style: TextStyle(color: Colors.grey),), + ], + ), + ); + } +} diff --git a/packages/artifact/lib/src/views/toly_refresh_indicator.dart b/packages/artifact/lib/src/views/toly_refresh_indicator.dart new file mode 100644 index 00000000..781122c2 --- /dev/null +++ b/packages/artifact/lib/src/views/toly_refresh_indicator.dart @@ -0,0 +1,94 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart' + hide RefreshIndicator, RefreshIndicatorState; +import 'package:flutter/services.dart'; +import 'package:refresh/refresh.dart'; + +class TolyRefreshIndicator extends RefreshIndicator { + const TolyRefreshIndicator({super.key}); + + @override + State createState() => _TolyRefreshIndicatorState(); +} + +class _TolyRefreshIndicatorState + extends RefreshIndicatorState + with TickerProviderStateMixin { + late AnimationController _iconRotateCtrl; + late Animation rotateAnima; + + @override + void initState() { + super.initState(); + _iconRotateCtrl = + AnimationController(vsync: this, duration: const Duration(milliseconds: 250)); + rotateAnima = Tween(begin: 0.0, end: -0.5).animate(_iconRotateCtrl); + } + + @override + void onModeChange(RefreshStatus? mode) { + if (mode == RefreshStatus.canRefresh) { + HapticFeedback.lightImpact(); + _iconRotateCtrl.forward(); + } + + if (mode == RefreshStatus.idle) { + if (_iconRotateCtrl.isCompleted) { + _iconRotateCtrl.reverse(); + } + } + } + + @override + Future readyToRefresh() { + print("readyToRefresh"); + + // TODO: implement readyToRefresh + // final Simulation simulation = SpringSimulation( + // SpringDescription( + // mass: 3.4, + // stiffness: 10000.5, + // damping: 6, + // ), + // _beizerBounceCtl.value, + // 0, + // 1000); + // _beizerBounceCtl.animateWith(simulation); + // if (widget.readyRefresh != null) { + // return widget.readyRefresh!(); + // } + return super.readyToRefresh(); + } + + @override + Widget buildContent(BuildContext context, RefreshStatus mode) { + Widget child = switch (mode) { + RefreshStatus.refreshing => const CupertinoActivityIndicator(radius: 10,), + RefreshStatus.completed => const Icon(Icons.check,color: Colors.green,), + RefreshStatus.idle || RefreshStatus.canRefresh => RotationTransition( + turns: rotateAnima, + child: Icon( + CupertinoIcons.arrow_down, + color: Color(0xff666668), + ), + ), + _ => SizedBox() + }; + + return Container( + // color: Colors.blue, + child: Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: child, + )), + ); + } + + @override + void onOffsetChange(double offset) { + // print(offset); + } +} diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml new file mode 100644 index 00000000..7f10db0e --- /dev/null +++ b/packages/artifact/pubspec.yaml @@ -0,0 +1,64 @@ +name: artifact +description: artifact +version: 0.0.1 +homepage: + +environment: + sdk: ">=3.0.0 <4.0.0" + flutter: ">=2.17.0" + +dependencies: + flutter: + sdk: flutter + flutter_bloc: ^8.0.1 # 状态管理 + dio: ^4.0.4 # 网络请求 + webview_flutter: ^4.2.2 + url_launcher: ^6.1.9 # url + refresh: ^1.0.1 + storage: + path: ../storage + utils: + path: ../utils + app: + path: ../app +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/artifact/test/utils_test.dart b/packages/artifact/test/utils_test.dart new file mode 100644 index 00000000..ba04b36e --- /dev/null +++ b/packages/artifact/test/utils_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + +} diff --git a/packages/authentication/lib/blocs/authentic/event.dart b/packages/authentication/lib/blocs/authentic/event.dart index 496b0897..5d91bfce 100644 --- a/packages/authentication/lib/blocs/authentic/event.dart +++ b/packages/authentication/lib/blocs/authentic/event.dart @@ -1,7 +1,5 @@ import 'package:equatable/equatable.dart'; - - ///********************************验证行为******************************** abstract class AuthEvent extends Equatable { diff --git a/packages/db_storage/pubspec.lock b/packages/db_storage/pubspec.lock deleted file mode 100644 index 5ea97859..00000000 --- a/packages/db_storage/pubspec.lock +++ /dev/null @@ -1,395 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.10.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.1" - characters: - dependency: transitive - description: - name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.2.1" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.17.0" - dio: - dependency: transitive - description: - name: dio - sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "4.0.6" - equatable: - dependency: transitive - description: - name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.5" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.3.1" - ffi: - dependency: transitive - description: - name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.1" - file: - dependency: transitive - description: - name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "6.1.4" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.1" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "4.0.2" - intl: - dependency: transitive - description: - name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.17.0" - js: - dependency: transitive - description: - name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.6.5" - jwt_decoder: - dependency: transitive - description: - name: jwt_decoder - sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: "5cfd6509652ff5e7fe149b6df4859e687fca9048437857cb2e65c8d780f396e3" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.12.13" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.2.0" - meta: - dependency: transitive - description: - name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.8.0" - path: - dependency: transitive - description: - name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.8.2" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: "050e8e85e4b7fecdf2bb3682c1c64c4887a183720c802d323de8a5fd76d372dd" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.11" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "4d5542667150f5b779ba411dd5dc0b674a85d1355e45bda2877e0e82f4ad08d8" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.20" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - sha256: "03d639406f5343478352433f00d3c4394d52dac8df3d847869c5e2333e0bbce8" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.11" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - sha256: "2a97e7fbb7ae9dcd0dfc1220a78e9ec3e71da691912e617e8715ff2a13086ae8" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.6" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.5" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.3" - platform: - dependency: transitive - description: - name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.3" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "4.2.4" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.9.1" - sqflite: - dependency: "direct main" - description: - name: sqflite - sha256: "0128af224bade0990f4ce55f2ef93a7054aa14d28768f17d4d2b21f6b1185523" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.0" - sqflite_common: - dependency: transitive - description: - name: sqflite_common - sha256: "0c7785befac2b5c40fc66b485be2f35396246a6fd6ccb89bb22614ddfb3d54a7" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.3.0" - sqflite_common_ffi: - dependency: "direct main" - description: - name: sqflite_common_ffi - sha256: "317f82d743c851f2f1aba6e636abdfbe12d296ce89a6f638fad7f37621e68293" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.1+1" - sqlite3: - dependency: transitive - description: - name: sqlite3 - sha256: bb6b7c77eeda79a355b6b464244f2a62ddc6b3da1c46a25ea61c5a0ee1a14324 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.flutter-io.cn/" - source: hosted - 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.1" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.2.0" - synchronized: - dependency: transitive - description: - name: synchronized - sha256: "7b530acd9cb7c71b0019a1e7fa22c4105e675557a4400b6a401c71c5e0ade1ac" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.0.0+3" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.4.16" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.3.1" - utils: - dependency: transitive - description: - path: "../utils" - relative: true - source: path - version: "0.0.1" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.4" - widget_repository: - dependency: "direct main" - description: - path: "../widget_repository" - relative: true - source: path - version: "0.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: "1952a663c0e34fbde55916010d54bbb249bf5f2583113c497602f0ee01c6faa4" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.0.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.2.0+2" -sdks: - dart: ">=2.18.1 <4.0.0" - flutter: ">=3.3.0-0" diff --git a/packages/storage/lib/src/db_storage/app_db_storage.dart b/packages/storage/lib/src/db_storage/app_db_storage.dart new file mode 100644 index 00000000..82df17f9 --- /dev/null +++ b/packages/storage/lib/src/db_storage/app_db_storage.dart @@ -0,0 +1,82 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:storage/storage.dart'; + +import 'dao/cache_dao.dart'; +import 'helper/db_open_helper.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; + +import 'package:path/path.dart' as path; +import 'package:sqflite/sqflite.dart'; + +import 'update/db_updater.dart'; + + +class AppDbStorage { + Database? _database; + + AppDbStorage._(); + + static AppDbStorage instance = AppDbStorage._(); + + late CacheDao _cacheDao; + + CacheDao get cacheDao => _cacheDao; + + Database get db => _database!; + + Future initDb({String name = "flutter_unit.db"}) async { + if (_database != null) return; + String databasesPath = await DbOpenHelper.getDbDirPath(); + String dbPath = path.join(databasesPath, name); + + if (Platform.isWindows||Platform.isLinux) { + DatabaseFactory databaseFactory = databaseFactoryFfi; + _database = await databaseFactory.openDatabase( + dbPath, + options: OpenDatabaseOptions( + version: DbUpdater.version, + onCreate: _onCreate, + onUpgrade: _onUpgrade, + onOpen: _onOpen + ), + ); + }else{ + _database = await openDatabase(dbPath, + version: DbUpdater.version , + onCreate: _onCreate, + onUpgrade: _onUpgrade, + onOpen: _onOpen, + ); + } + + } + + DbUpdater updater = DbUpdater(); + + FutureOr _onCreate(Database db, int version) async { + print('数据库创建:flutter_unit....'); + await Future.wait([ + CacheDao.createDb(db), + updater.update(db, 1, DbUpdater.version) + ]); + } + + FutureOr _onOpen(Database db) { + print('数据库打开:flutter_unit....'); + _database = db; + _cacheDao = CacheDao(db); + } + + Future closeDb() async { + await _database?.close(); + _database = null; + } + + FutureOr _onUpgrade(Database db, int oldVersion, int newVersion) async { + print('数据库更新:flutter_unit....$oldVersion -> $newVersion'); + await updater.update(db, oldVersion, newVersion); + } + +} diff --git a/packages/storage/lib/src/db_storage/dao/cache_dao.dart b/packages/storage/lib/src/db_storage/dao/cache_dao.dart new file mode 100644 index 00000000..c19e8d8f --- /dev/null +++ b/packages/storage/lib/src/db_storage/dao/cache_dao.dart @@ -0,0 +1,84 @@ +import 'package:sqflite/sqflite.dart'; + +import '../models/cache_po.dart'; + +class CacheDao { + final Database database; + + CacheDao(this.database); + + // 表名 + static const String kTableName = 'app_cache'; + + static const String createTable = """ +CREATE TABLE IF NOT EXISTS `$kTableName` ( +`id` INTEGER PRIMARY KEY AUTOINCREMENT, +`filter` TEXT, +`content` TEXT, +`update` INTEGER, +`create` INTEGER, +`type` INTEGER +)"""; + + static Future createDb(Database db) => db.execute(createTable); + + Future insert(CachePo po) => database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(CachePo po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query({ + required int type, + int page = 1, + int pageSize = 20, + String? filter, + }) async { + String queryArgs = ''; + List args = [type]; + queryArgs = "WHERE type = ? "; + if(filter!=null){ + queryArgs+="AND filter = ? "; + args.add(filter); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([pageSize, (page - 1) * pageSize]); + + List> data = await database.rawQuery( + "SELECT * FROM $kTableName $queryArgs", + args, + ); + + List result = data.map((e) => CachePo.fromJson(e)).toList(); + return result; + } +} + +// final String id; +// final String title; +// final String content; +// final int type; +// final int create; +// final int update; diff --git a/packages/storage/lib/src/db_storage/exp.dart b/packages/storage/lib/src/db_storage/exp.dart index 85d563dd..3d3c70a9 100644 --- a/packages/storage/lib/src/db_storage/exp.dart +++ b/packages/storage/lib/src/db_storage/exp.dart @@ -2,9 +2,12 @@ export 'dao/category_dao.dart'; export 'dao/like_dao.dart'; export 'dao/node_dao.dart'; export 'dao/widget_dao.dart'; +export 'dao/cache_dao.dart'; export 'models/category_po.dart'; export 'models/node_po.dart'; export 'models/widget_po.dart'; +export 'models/cache_po.dart'; export 'flutter_db_storage.dart'; +export 'app_db_storage.dart'; export 'helper/db_open_helper.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/flutter_db_storage.dart b/packages/storage/lib/src/db_storage/flutter_db_storage.dart index 8d3e70e4..e33994cc 100644 --- a/packages/storage/lib/src/db_storage/flutter_db_storage.dart +++ b/packages/storage/lib/src/db_storage/flutter_db_storage.dart @@ -32,7 +32,6 @@ class FlutterDbStorage { LikeDao get likeDao => _likeDao; Database get db => _database!; - bool get inited => _database!=null; Future initDb({String name = "flutter.db"}) async { if (_database != null) return; diff --git a/packages/storage/lib/src/db_storage/models/cache_po.dart b/packages/storage/lib/src/db_storage/models/cache_po.dart new file mode 100644 index 00000000..81e3b85e --- /dev/null +++ b/packages/storage/lib/src/db_storage/models/cache_po.dart @@ -0,0 +1,40 @@ +class CachePo { + // 0 专栏数据缓存 + // 1 文章列表数据缓存 + final int id; + final String filter; + final String content; + final int type; + final int create; + final int update; + + CachePo({ + required this.id, + required this.filter, + required this.content, + required this.type, + required this.create, + required this.update, + }); + + Map toJson() => { + "id": id == -1 ? null : id, + "filter": filter, + "content": content, + "type": type, + "create": create, + "update": update, + }; + + factory CachePo.fromJson(Map map) { + return CachePo( + id: map['id'], + filter: map['filter'], + content: map["content"], + create: map["create"], + type: map["type"], + update: map["update"], + ); + } + +} diff --git a/packages/storage/lib/src/db_storage/update/db_migration.dart b/packages/storage/lib/src/db_storage/update/db_migration.dart new file mode 100644 index 00000000..b801ad60 --- /dev/null +++ b/packages/storage/lib/src/db_storage/update/db_migration.dart @@ -0,0 +1,22 @@ + +import 'package:sqflite/sqflite.dart'; + +typedef MigrationOperation = Future Function(Database database); + +class DbMigration{ + final Map _migrationMap={}; + + void addMigration(int version,MigrationOperation operation){ + _migrationMap[version] = operation; + } + + Future migration(Database database,int oldVersion,int newVersion) async{ + for(int i=0;i<_migrationMap.length;i++){ + int version = _migrationMap.keys.toList()[i]; + MigrationOperation operation = _migrationMap.values.toList()[i]; + if(version=oldVersion){ + await operation(database); + } + } + } +} \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/update/db_updater.dart b/packages/storage/lib/src/db_storage/update/db_updater.dart new file mode 100644 index 00000000..c7436584 --- /dev/null +++ b/packages/storage/lib/src/db_storage/update/db_updater.dart @@ -0,0 +1,23 @@ + +import 'package:sqflite/sqflite.dart'; +import 'db_migration.dart'; + +class DbUpdater { + static const version = 1; + + Future update(Database db, int oldVersion, int newVersion) async { + DbMigration dbMigration = DbMigration(); + // dbMigration.addMigration(1, migration_1_2); + // dbMigration.addMigration(2, migration_2_3); + // dbMigration.addMigration(3, migration_3_4); + // dbMigration.addMigration(4, migration_4_5); + // dbMigration.addMigration(5, migration_5_6); + await dbMigration.migration(db, oldVersion, newVersion); + } + + Future migration_1_2(Database database) async { + + } + + +} diff --git a/packages/utils/lib/src/http_utils/http_util.dart b/packages/utils/lib/src/http_utils/http_util.dart index b67dba27..5e6c3579 100644 --- a/packages/utils/lib/src/http_utils/http_util.dart +++ b/packages/utils/lib/src/http_utils/http_util.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; -import 'logs_interceptor.dart'; import 'token_interceptor.dart'; const int _kReceiveTimeout = 5000; diff --git a/packages/utils/lib/src/http_utils/task_result.dart b/packages/utils/lib/src/http_utils/task_result.dart index 50ba5cd1..cd732a56 100644 --- a/packages/utils/lib/src/http_utils/task_result.dart +++ b/packages/utils/lib/src/http_utils/task_result.dart @@ -2,8 +2,9 @@ class TaskResult { final T? data; final bool success; final String msg; + final int count; - TaskResult({this.data, this.success=false, this.msg=''}); + TaskResult({this.data, this.success=false, this.msg='',this.count=0}); @override String toString() { @@ -12,10 +13,13 @@ class TaskResult { const TaskResult.error({required this.msg}) : success = false, - data = null; + data = null, + count = 0 + ; const TaskResult.success({ this.data, this.msg = '', + this.count = 0, }) : success = true; } diff --git a/pubspec.lock b/pubspec.lock index 45860e3a..0b19aa15 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -31,6 +31,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.1" + artifact: + dependency: "direct main" + description: + path: "packages/artifact" + relative: true + source: path + version: "0.0.1" async: dependency: transitive description: @@ -505,6 +512,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.8+2" + refresh: + dependency: "direct main" + description: + name: refresh + sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.1" screen_retriever: dependency: transitive description: @@ -828,6 +843,38 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "4.2.2" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "69787707339e7588aad256386475c18223cc0da87d9812343bc27c33c01eeab4" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.8.1" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "656e2aeaef318900fffd21468b6ddc7958c7092a642f0e7220bac328b70d4a81" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.3.1" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: "7ae75a1a76b9463ae9278de7759ead68aa0eeb70f8d0175e3f9a6c43e911fe76" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.6.1" widget_module: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index b9dc4410..b5c6f7c1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,14 +15,14 @@ dependencies: flutter_localizations: sdk: flutter cupertino_icons: ^1.0.4 - + refresh: ^1.0.1 flutter_bloc: ^8.0.1 # 状态管理 stream_transform: ^2.0.0 equatable: ^2.0.3 # 相等辅助 archive: ^3.3.6 # 解压 package_info_plus: ^4.0.1 # 应用包信息 r_upgrade: ^0.3.8+2 # 应用升级 - + webview_flutter: ^4.2.2 sqflite: ^2.0.2+1 # 数据库 sqflite_common_ffi: ^2.1.1 # 数据库 shared_preferences: ^2.0.13 # xml 固化 @@ -55,6 +55,8 @@ dependencies: path: packages/storage widgets: path: packages/widgets + artifact: + path: packages/artifact authentication: path: packages/authentication app: From cff5f3c381b81f801cd1c48b4e48e4b713730b3b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 7 Jul 2023 22:46:45 +0800 Subject: [PATCH 023/149] =?UTF-8?q?iOS=20=E8=B7=B3=E8=BD=AC=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/lib/app/router/router_utils.dart | 401 ++++++++++++------ 1 file changed, 281 insertions(+), 120 deletions(-) diff --git a/packages/app/lib/app/router/router_utils.dart b/packages/app/lib/app/router/router_utils.dart index 7e842b68..83c1cb60 100644 --- a/packages/app/lib/app/router/router_utils.dart +++ b/packages/app/lib/app/router/router_utils.dart @@ -1,163 +1,324 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; //缩放路由动画 -class ScaleRouter extends PageRouteBuilder { +class ScaleRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - ScaleRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) - : super( - pageBuilder: (context, animation, secondaryAnimation) => child, - transitionDuration: Duration(milliseconds: durationMs), - transitionsBuilder: (context, a1, a2, child) => - ScaleTransition( - scale: Tween(begin: 0.0, end: 1.0).animate( - CurvedAnimation(parent: a1, curve: curve)), - child: child, - ), - ); + + ScaleRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return ScaleTransition( + scale: Tween(begin: 0.0, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: curve)), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; } + + //渐变透明路由动画 -class FadeRouter extends PageRouteBuilder { +class FadeRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - FadeRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) - : super( - pageBuilder: (context, animation, secondaryAnimation) => child, - transitionDuration: Duration(milliseconds: durationMs), - transitionsBuilder: (context, a1, a2, child) => - FadeTransition( - opacity: Tween(begin: 0.1, end: 1.0).animate( - CurvedAnimation(parent: a1, curve:curve,)), - child: child, - )); + + FadeRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return FadeTransition( + opacity: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation( + parent: animation, + curve: curve, + )), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; } //旋转路由动画 -class RotateRouter extends PageRouteBuilder { +class RotateRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - RotateRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn}) - : super( - pageBuilder: (context, animation, secondaryAnimation) => child, - transitionDuration: Duration(milliseconds: durationMs), - transitionsBuilder: (context, a1, a2, child) => - RotationTransition( - turns: Tween(begin: 0.1, end: 1.0).animate( - CurvedAnimation(parent: a1, curve:curve,)), - child: child, - )); + + RotateRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return RotationTransition( + turns: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation( + parent: animation, + curve: curve, + )), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; } //右--->左 -class Right2LeftRouter extends PageRouteBuilder { +class Right2LeftRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - Right2LeftRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) - :super( - transitionDuration:Duration(milliseconds: durationMs), - pageBuilder:(ctx,a1,a2)=>child, - transitionsBuilder:(ctx,a1,a2, child,) => - SlideTransition( - child: child, - position: Tween( - begin: const Offset(1.0, 0.0), end: const Offset(0.0, 0.0),).animate( - CurvedAnimation(parent: a1, curve: curve)), - )); + + Right2LeftRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return SlideTransition( + position: Tween( + begin: const Offset(1.0, 0.0), + end: const Offset(0.0, 0.0), + ).animate(CurvedAnimation(parent: animation, curve: curve)), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; } //左--->右 -class Left2RightRouter extends PageRouteBuilder { +class Left2RightRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - Left2RightRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) - :assert(true),super( - transitionDuration:Duration(milliseconds: durationMs), - pageBuilder:(ctx,a1,a2){return child;}, - transitionsBuilder:(ctx,a1,a2,child,) { - return SlideTransition( - position: Tween( - begin: const Offset(-1.0, 0.0), end: const Offset(0.0, 0.0),).animate( - CurvedAnimation(parent: a1, curve: curve)), - child: child - ); - }); + Left2RightRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return SlideTransition( + position: Tween( + begin: const Offset(-1.0, 0.0), + end: const Offset(0.0, 0.0), + ).animate(CurvedAnimation(parent: animation, curve: curve)), + child: child); + } + + @override + Duration get transitionDuration => duration; } + //上--->下 -class Top2BottomRouter extends PageRouteBuilder { +class Top2BottomRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - Top2BottomRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) - :super( - transitionDuration:Duration(milliseconds: durationMs), - pageBuilder:(ctx,a1,a2){return child;}, - transitionsBuilder:(ctx,a1,a2, child,) { - return SlideTransition( - position: Tween( - begin: const Offset(0.0,-1.0), end: const Offset(0.0, 0.0),).animate( - CurvedAnimation(parent: a1, curve: curve)), - child: child - ); - }); + + Top2BottomRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return SlideTransition( + position: Tween( + begin: const Offset(0.0, -1.0), + end: const Offset(0.0, 0.0), + ).animate(CurvedAnimation(parent: animation, curve: curve)), + child: child); + } + + @override + Duration get transitionDuration => duration; } //下--->上 -class Bottom2TopRouter extends PageRouteBuilder { +class Bottom2TopRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - Bottom2TopRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn}) - :super( - transitionDuration:Duration(milliseconds: durationMs), - pageBuilder:(ctx,a1,a2)=> child, - transitionsBuilder:(ctx,a1,a2, child,) { - return SlideTransition( - position: Tween( - begin: const Offset(0.0, 1.0), end: const Offset(0.0, 0.0),).animate( - CurvedAnimation(parent: a1, curve: curve)), - child: child - ); - }); + + Bottom2TopRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return SlideTransition( + position: Tween( + begin: const Offset(0.0, 1.0), + end: const Offset(0.0, 0.0), + ).animate(CurvedAnimation(parent: animation, curve: curve)), + child: child); + } + + @override + Duration get transitionDuration => duration; } //缩放+透明+旋转路由动画 -class ScaleFadeRotateRouter extends PageRouteBuilder { +class ScaleFadeRouter extends MaterialPageRoute { final Widget child; - final int durationMs; + final Duration duration; final Curve curve; - ScaleFadeRotateRouter({required this.child, this.durationMs = 1000,this.curve=Curves.fastOutSlowIn}) : super( - transitionDuration: Duration(milliseconds: durationMs), - pageBuilder: (ctx, a1, a2)=>child,//页面 - transitionsBuilder: (ctx, a1, a2, Widget child,) => - RotationTransition(//旋转动画 - turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( - parent: a1, - curve: curve, - )), - child: ScaleTransition(//缩放动画 - scale: Tween(begin: 0.0, end: 1.0).animate( - CurvedAnimation(parent: a1, curve: curve)), - child: FadeTransition(opacity://透明度动画 - Tween(begin: 0.5, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)), - child: child,), - ), - )); + + ScaleFadeRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return ScaleTransition( + //缩放动画 + scale: Tween(begin: 0.6, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: curve)), + child: FadeTransition( + opacity: //透明度动画 + Tween(begin: 0.5, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: curve)), + child: child, + ), + ); + } + + @override + Duration get transitionDuration => duration; } -//无动画 -class NoAnimRouter extends PageRouteBuilder { + + +//缩放+透明+旋转路由动画 +class ScaleFadeRotateRouter extends MaterialPageRoute { final Widget child; - NoAnimRouter({required this.child}) - : super( - opaque: false, - pageBuilder: (context, animation, secondaryAnimation) => child, - transitionDuration: const Duration(milliseconds: 0), - transitionsBuilder: - (context, animation, secondaryAnimation, child) => child); + final Duration duration; + final Curve curve; + + ScaleFadeRotateRouter({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve = Curves.fastOutSlowIn, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return RotationTransition( + //旋转动画 + turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( + parent: animation, + curve: curve, + )), + child: ScaleTransition( + //缩放动画 + scale: Tween(begin: 0.0, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: curve)), + child: FadeTransition( + opacity: //透明度动画 + Tween(begin: 0.5, end: 1.0) + .animate(CurvedAnimation(parent: animation, curve: curve)), + child: child, + ), + ), + ); + } + + @override + Duration get transitionDuration => duration; } + + +//无动画 +class NoAnimRouter extends MaterialPageRoute { + final Widget page; + NoAnimRouter(this.page) : super(builder: (_) => page); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return child; + } + + @override + Duration get transitionDuration => const Duration(milliseconds: 0); +} + From dd57f960d7714406f9e71c9b440b5683c4131dba Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 8 Jul 2023 06:35:50 +0800 Subject: [PATCH 024/149] =?UTF-8?q?iOS=20=E8=B7=B3=E8=BD=AC=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/router/unit_router.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 286ee370..17c256bc 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -64,7 +64,7 @@ class UnitRouters { // case UnitRouter.nav: if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - return NoAnimRouter(child: UnitNavigation()); + return NoAnimRouter(UnitNavigation()); } return Left2RightRouter(child: UnitNavigation()); From 96ad4ec87ccfa4544dea2f57a07dbc6d3418c27d Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 9 Jul 2023 12:10:35 +0800 Subject: [PATCH 025/149] =?UTF-8?q?iOS=20=E8=B7=B3=E8=BD=AC=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/router/unit_router.dart | 36 +++--- lib/app/views/about/about_app_page.dart | 2 +- lib/app/views/setting/setting_page.dart | 2 +- .../views/issues_point/issues_point_page.dart | 2 +- .../category_panel/desk_top_like_panel.dart | 2 +- .../category_page/like_widget_page.dart | 2 +- .../widget_detail/widget_detail_page.dart | 2 +- .../widget_panel/standard_home_search.dart | 2 +- packages/app/lib/app.dart | 3 +- .../cupertino_back_gesture_detector.dart | 84 +++++++++++-- .../app/lib/app/router/fade_page_route.dart | 55 +++++++++ .../lib/app/router/ios_slide_transition.dart | 0 packages/app/lib/app/router/router_utils.dart | 32 ----- .../app/lib/app/router/slide_page_route.dart | 49 ++++++++ .../app/lib/app/router/slide_page_router.dart | 115 ------------------ .../views/article/columnize_page_view.dart | 2 +- 16 files changed, 206 insertions(+), 184 deletions(-) create mode 100644 packages/app/lib/app/router/fade_page_route.dart delete mode 100644 packages/app/lib/app/router/ios_slide_transition.dart create mode 100644 packages/app/lib/app/router/slide_page_route.dart delete mode 100644 packages/app/lib/app/router/slide_page_router.dart diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 5011724d..2467eb42 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -81,58 +81,58 @@ class UnitRouters { ); } - return SlidePageRouter( + return SlidePageRoute( child: child); // case search: // return Right2LeftRouter(child: const SearchPageProvider()); case collect: - return SlidePageRouter(child: CollectPageAdapter( + return SlidePageRoute(child: CollectPageAdapter( canPop: settings.arguments as bool, )); case setting: - return SlidePageRouter(child: const SettingPage()); + return SlidePageRoute(child: const SettingPage()); // return Right2LeftRouter(builder:(_)=> const SettingPage()); // return MaterialPageRoute(builder:(_)=> const SettingPage()); case data_manage: - return SlidePageRouter(child: const DataManagePage()); + return SlidePageRoute(child: const DataManagePage()); case font_setting: - return SlidePageRouter(child: const FontSettingPage()); + return SlidePageRoute(child: const FontSettingPage()); case theme_color_setting: - return SlidePageRouter(child: const ThemeColorSettingPage()); + return SlidePageRoute(child: const ThemeColorSettingPage()); case code_style_setting: - return SlidePageRouter(child: const CodeStyleSettingPage()); + return SlidePageRoute(child: const CodeStyleSettingPage()); // case item_style_setting: // return Right2LeftRouter(child: const ItemStyleSettingPage()); case version_info: - return SlidePageRouter(child: const VersionInfo()); + return SlidePageRoute(child: const VersionInfo()); case issues_point: - return SlidePageRouter(child: const IssuesPointScope()); + return SlidePageRoute(child: const IssuesPointScope()); case login: - return SlidePageRouter(child: const LoginPage()); + return SlidePageRoute(child: const LoginPage()); case register: - return SlidePageRouter(child: const RegisterPage()); + return SlidePageRoute(child: const RegisterPage()); case attr: - return SlidePageRouter(child: const AttrUnitPage()); + return SlidePageRoute(child: const AttrUnitPage()); case bug: - return SlidePageRouter(child: const BugUnitPage()); + return SlidePageRoute(child: const BugUnitPage()); case layout: - return SlidePageRouter(child: const LayoutUnitPage()); + return SlidePageRoute(child: const LayoutUnitPage()); case about_app: - return SlidePageRouter(child: const AboutAppPage()); + return SlidePageRoute(child: const AboutAppPage()); case about_me: - return SlidePageRouter(child: const AboutMePage()); + return SlidePageRoute(child: const AboutMePage()); case point_detail: - return SlidePageRouter(child: const IssuesDetailPage()); + return SlidePageRoute(child: const IssuesDetailPage()); case category_show: - return SlidePageRouter( + return SlidePageRoute( child: CategoryShow( model: settings.arguments as CategoryModel, )); diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index 45beaa54..77286057 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -39,7 +39,7 @@ class AboutAppPage extends StatelessWidget { left: 50, child: FeedbackWidget( onEnd : (){ - Navigator.push(context, SlidePageRouter(child: const FlutterUnitTimeLine())); + Navigator.push(context, SlidePageRoute(child: const FlutterUnitTimeLine())); }, child: CircleImage( size: 100, diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index 2bc4e32b..efc22e20 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -35,7 +35,7 @@ class SettingPage extends StatelessWidget { ), trailing: _nextIcon(context), onTap: (){ - Navigator.of(context).push(SlidePageRouter(child: ThemeModelSetting())); + Navigator.of(context).push(SlidePageRoute(child: ThemeModelSetting())); }, ), divider, diff --git a/lib/point_system/views/issues_point/issues_point_page.dart b/lib/point_system/views/issues_point/issues_point_page.dart index 374fbf5f..44b9ad03 100644 --- a/lib/point_system/views/issues_point/issues_point_page.dart +++ b/lib/point_system/views/issues_point/issues_point_page.dart @@ -83,7 +83,7 @@ class _IssuesPointContentState extends State { delegate: SliverChildBuilderDelegate( (ctx, int index) => GestureDetector( onTap: () { - Navigator.of(context).push(SlidePageRouter( + Navigator.of(context).push(SlidePageRoute( child: BlocProvider( create: (_) => PointCommentBloc() ..add(EventLoadPointComment(issues[index])), diff --git a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart b/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart index ac9c8cc9..7e5cd8af 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart +++ b/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart @@ -48,7 +48,7 @@ class DeskLikePage extends StatelessWidget { _toDetailPage(BuildContext context, WidgetModel model) { // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.push(context, SlidePageRouter(child: WidgetDetailPageScope(model: model))); + Navigator.push(context, SlidePageRoute(child: WidgetDetailPageScope(model: model))); } diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/lib/widget_ui/mobile/category_page/like_widget_page.dart index e6b4e0b3..4a29dc31 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/lib/widget_ui/mobile/category_page/like_widget_page.dart @@ -81,6 +81,6 @@ class LikeWidgetPage extends StatelessWidget { .add(ToggleLikeWidgetEvent(id: model.id)); _toDetailPage(BuildContext context, WidgetModel model) { - Navigator.push(context, SlidePageRouter(child: WidgetDetailPageScope(model: model))); + Navigator.push(context, SlidePageRoute(child: WidgetDetailPageScope(model: model))); } } diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart index afe992c3..fc229a03 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ b/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart @@ -92,7 +92,7 @@ class WidgetDetailPage extends StatelessWidget { } Future _whenPop(BuildContext context) async { - print("======_whenPop============"); + // print("======_whenPop============"); WidgetDetailBloc detailBloc = context.read(); if (Scaffold.of(context).isEndDrawerOpen) { return true; diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart index 9a081c8f..272c04a2 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_search.dart @@ -31,7 +31,7 @@ class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget child: GestureDetector( onTap: () { Navigator.of(context).push( - FadeRouter(child: const StandardSearchPageProvider())); + FadePageRoute(child: const StandardSearchPageProvider())); }, child: Container( height: 35, diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index a7ed3543..83032fa9 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -11,7 +11,8 @@ export 'app/cons/sp.dart'; export 'app/cons/str_unit.dart'; export 'app/router/router_utils.dart'; export 'app/router/unit_router.dart'; -export 'app/router/slide_page_router.dart'; +export 'app/router/slide_page_route.dart'; +export 'app/router/fade_page_route.dart'; export 'app/res/toly_icon.dart'; export 'app/theme/size_unit.dart'; export 'app/theme/app_theme.dart'; diff --git a/packages/app/lib/app/router/cupertino_back_gesture_detector.dart b/packages/app/lib/app/router/cupertino_back_gesture_detector.dart index 3c40d94a..53bec7e3 100644 --- a/packages/app/lib/app/router/cupertino_back_gesture_detector.dart +++ b/packages/app/lib/app/router/cupertino_back_gesture_detector.dart @@ -4,6 +4,16 @@ import 'dart:ui'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +// The maximum time for a page to get reset to it's original position if the +// user releases a page mid swipe. +const int _kMaxPageBackAnimationTime = 300; // Milliseconds. +const double _kBackGestureWidth = 20.0; +const double _kMinFlingVelocity = 1.0; // Screen widths per second. + +// An eyeballed value for the maximum time it takes for a page to animate forward +// if the user releases a page mid swipe. +const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. + /// This is the widget side of [CupertinoBackGestureController]. /// /// This widget provides a gesture recognizer which, when it determines the @@ -124,15 +134,6 @@ class _CupertinoBackGestureDetectorState extends State { /// Creates a controller for an iOS-style back gesture. @@ -210,4 +211,67 @@ class CupertinoBackGestureController { navigator.didStopUserGesture(); } } -} \ No newline at end of file +} + +// Called by _CupertinoBackGestureDetector when a pop ("back") drag start +// gesture is detected. The returned controller handles all of the subsequent +// drag events. +CupertinoBackGestureController startPopGesture(PageRoute route) { + return CupertinoBackGestureController( + navigator: route.navigator!, + controller: route.controller!, // protected access + ); +} + +bool isPopGestureEnabled(PageRoute route) { + print( + "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); +// If there's nothing to go back to, then obviously we don't support +// the back gesture. + if (route.isFirst) { + return false; + } +// If the route wouldn't actually pop if we popped it, then the gesture +// would be really confusing (or would skip internal routes), so disallow it. + if (route.willHandlePopInternally) { + return false; + } +// If attempts to dismiss this route might be vetoed such as in a page +// with forms, then do not allow the user to dismiss the route with a swipe. + if (route.hasScopedWillPopCallback) { + return false; + } +// Fullscreen dialogs aren't dismissible by back swipe. + if (route.fullscreenDialog) { + return false; + } +// If we're in an animation already, we cannot be manually swiped. + if (route.animation!.status != AnimationStatus.completed) { + return false; + } +// If we're being popped into, we also cannot be swiped until the pop above +// it completes. This translates to our secondary animation being +// dismissed. + if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { + return false; + } +// If we're in a gesture already, we cannot start another. + if (isPopGestureInProgress(route)) { + return false; + } + +// Looks like a back gesture would be welcome! + return true; +} + +/// True if an iOS-style back swipe pop gesture is currently underway for [route]. +/// +/// This just check the route's [NavigatorState.userGestureInProgress]. +/// +/// See also: +/// +/// * [popGestureEnabled], which returns true if a user-triggered pop gesture +/// would be allowed. +bool isPopGestureInProgress(PageRoute route) { + return route.navigator!.userGestureInProgress; +} diff --git a/packages/app/lib/app/router/fade_page_route.dart b/packages/app/lib/app/router/fade_page_route.dart new file mode 100644 index 00000000..515618ad --- /dev/null +++ b/packages/app/lib/app/router/fade_page_route.dart @@ -0,0 +1,55 @@ +//渐变透明路由动画 +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + +class FadePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + final Curve? curve; + + FadePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + + if (curve != null) { + animation = CurvedAnimation( + parent: animation, + curve: curve!, + ); + } + + return FadeTransition( + opacity: Tween(begin: 0.1, end: 1.0).animate(animation), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/packages/app/lib/app/router/ios_slide_transition.dart b/packages/app/lib/app/router/ios_slide_transition.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/app/lib/app/router/router_utils.dart b/packages/app/lib/app/router/router_utils.dart index 54f7c999..adc3e124 100644 --- a/packages/app/lib/app/router/router_utils.dart +++ b/packages/app/lib/app/router/router_utils.dart @@ -34,38 +34,6 @@ class ScaleRouter extends MaterialPageRoute { } -//渐变透明路由动画 -class FadeRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - FadeRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return FadeTransition( - opacity: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation( - parent: animation, - curve: curve, - )), - child: child, - ); - } - - @override - Duration get transitionDuration => duration; -} - //旋转路由动画 class RotateRouter extends MaterialPageRoute { final Widget child; diff --git a/packages/app/lib/app/router/slide_page_route.dart b/packages/app/lib/app/router/slide_page_route.dart new file mode 100644 index 00000000..45386e7c --- /dev/null +++ b/packages/app/lib/app/router/slide_page_route.dart @@ -0,0 +1,49 @@ +//右--->左 +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + + +class SlidePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + + SlidePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child); + } + final bool linearTransition = isPopGestureInProgress(this); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/packages/app/lib/app/router/slide_page_router.dart b/packages/app/lib/app/router/slide_page_router.dart deleted file mode 100644 index dda6f252..00000000 --- a/packages/app/lib/app/router/slide_page_router.dart +++ /dev/null @@ -1,115 +0,0 @@ -//右--->左 -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'cupertino_back_gesture_detector.dart'; - -class SlidePageRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve? curve; - - SlidePageRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child); - } - final bool linearTransition = isPopGestureInProgress(this); - return CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: linearTransition, - child: child, - ); - } - - @override - Duration get transitionDuration => duration; - - @override - @protected - bool get hasScopedWillPopCallback { - return false; - } - - - // Called by _CupertinoBackGestureDetector when a pop ("back") drag start - // gesture is detected. The returned controller handles all of the subsequent - // drag events. - static CupertinoBackGestureController _startPopGesture( - PageRoute route) { - return CupertinoBackGestureController( - navigator: route.navigator!, - controller: route.controller!, // protected access - ); - } - - static bool _isPopGestureEnabled(PageRoute route) { - print( - "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); - // If there's nothing to go back to, then obviously we don't support - // the back gesture. - if (route.isFirst) { - return false; - } - // If the route wouldn't actually pop if we popped it, then the gesture - // would be really confusing (or would skip internal routes), so disallow it. - if (route.willHandlePopInternally) { - return false; - } - // If attempts to dismiss this route might be vetoed such as in a page - // with forms, then do not allow the user to dismiss the route with a swipe. - if (route.hasScopedWillPopCallback) { - return false; - } - // Fullscreen dialogs aren't dismissible by back swipe. - if (route.fullscreenDialog) { - return false; - } - // If we're in an animation already, we cannot be manually swiped. - if (route.animation!.status != AnimationStatus.completed) { - return false; - } - // If we're being popped into, we also cannot be swiped until the pop above - // it completes. This translates to our secondary animation being - // dismissed. - if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { - return false; - } - // If we're in a gesture already, we cannot start another. - if (isPopGestureInProgress(route)) { - return false; - } - - // Looks like a back gesture would be welcome! - return true; - } - - /// True if an iOS-style back swipe pop gesture is currently underway for [route]. - /// - /// This just check the route's [NavigatorState.userGestureInProgress]. - /// - /// See also: - /// - /// * [popGestureEnabled], which returns true if a user-triggered pop gesture - /// would be allowed. - static bool isPopGestureInProgress(PageRoute route) { - return route.navigator!.userGestureInProgress; - } -} diff --git a/packages/artifact/lib/src/views/article/columnize_page_view.dart b/packages/artifact/lib/src/views/article/columnize_page_view.dart index c05fb359..f21815c4 100644 --- a/packages/artifact/lib/src/views/article/columnize_page_view.dart +++ b/packages/artifact/lib/src/views/article/columnize_page_view.dart @@ -150,7 +150,7 @@ class ColumnizeItem extends StatelessWidget { return GestureDetector( onTap: (){ ArticleRepository repository = context.read().repository; - Navigator.of(context).push(SlidePageRouter(child: MultiBlocProvider( + Navigator.of(context).push(SlidePageRoute(child: MultiBlocProvider( providers: [ BlocProvider(create: (_) => ArticleBloc(repository,groupId: columnize.id)..init()), ], From a3031161086ec8ca218cc83767bf10ff5819de7c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 9 Jul 2023 12:37:48 +0800 Subject: [PATCH 026/149] =?UTF-8?q?iOS=20=E8=B7=B3=E8=BD=AC=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/router/unit_router.dart | 4 +- packages/app/lib/app.dart | 4 +- packages/app/lib/app/router/router_utils.dart | 260 ------------------ .../app/lib/app/router/zero_page_route.dart | 36 +++ 4 files changed, 41 insertions(+), 263 deletions(-) create mode 100644 packages/app/lib/app/router/zero_page_route.dart diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 2467eb42..0ccc3951 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -64,9 +64,9 @@ class UnitRouters { // case UnitRouter.nav: if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - return NoAnimRouter(UnitNavigation()); + return ZeroPageRoute( child: UnitNavigation()); } - return Left2RightRouter(child: UnitNavigation()); + return SlidePageRoute(child: UnitNavigation()); // 组件详情页 case widget_detail: diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index 83032fa9..f5239670 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -9,10 +9,12 @@ export 'app/cons/global_value.dart'; export 'app/cons/path_unit.dart'; export 'app/cons/sp.dart'; export 'app/cons/str_unit.dart'; -export 'app/router/router_utils.dart'; export 'app/router/unit_router.dart'; + export 'app/router/slide_page_route.dart'; export 'app/router/fade_page_route.dart'; +export 'app/router/zero_page_route.dart'; + export 'app/res/toly_icon.dart'; export 'app/theme/size_unit.dart'; export 'app/theme/app_theme.dart'; diff --git a/packages/app/lib/app/router/router_utils.dart b/packages/app/lib/app/router/router_utils.dart index adc3e124..f5516417 100644 --- a/packages/app/lib/app/router/router_utils.dart +++ b/packages/app/lib/app/router/router_utils.dart @@ -2,264 +2,4 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'cupertino_back_gesture_detector.dart'; -//缩放路由动画 -class ScaleRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - ScaleRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return ScaleTransition( - scale: Tween(begin: 0.0, end: 1.0) - .animate(CurvedAnimation(parent: animation, curve: curve)), - child: child, - ); - } - - @override - Duration get transitionDuration => duration; -} - - -//旋转路由动画 -class RotateRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - RotateRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return RotationTransition( - turns: Tween(begin: 0.1, end: 1.0).animate(CurvedAnimation( - parent: animation, - curve: curve, - )), - child: child, - ); - } - - @override - Duration get transitionDuration => duration; -} - - - - -//左--->右 -class Left2RightRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - Left2RightRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return SlideTransition( - position: Tween( - begin: const Offset(-1.0, 0.0), - end: const Offset(0.0, 0.0), - ).animate(CurvedAnimation(parent: animation, curve: curve)), - child: child); - } - - @override - Duration get transitionDuration => duration; -} - - -//上--->下 -class Top2BottomRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - Top2BottomRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return SlideTransition( - position: Tween( - begin: const Offset(0.0, -1.0), - end: const Offset(0.0, 0.0), - ).animate(CurvedAnimation(parent: animation, curve: curve)), - child: child); - } - - @override - Duration get transitionDuration => duration; -} - -//下--->上 -class Bottom2TopRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - Bottom2TopRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return SlideTransition( - position: Tween( - begin: const Offset(0.0, 1.0), - end: const Offset(0.0, 0.0), - ).animate(CurvedAnimation(parent: animation, curve: curve)), - child: child); - } - - @override - Duration get transitionDuration => duration; -} - -//缩放+透明+旋转路由动画 -class ScaleFadeRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - ScaleFadeRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return ScaleTransition( - //缩放动画 - scale: Tween(begin: 0.6, end: 1.0) - .animate(CurvedAnimation(parent: animation, curve: curve)), - child: FadeTransition( - opacity: //透明度动画 - Tween(begin: 0.5, end: 1.0) - .animate(CurvedAnimation(parent: animation, curve: curve)), - child: child, - ), - ); - } - - @override - Duration get transitionDuration => duration; -} - - -//缩放+透明+旋转路由动画 -class ScaleFadeRotateRouter extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve curve; - - ScaleFadeRotateRouter({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve = Curves.fastOutSlowIn, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return RotationTransition( - //旋转动画 - turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation( - parent: animation, - curve: curve, - )), - child: ScaleTransition( - //缩放动画 - scale: Tween(begin: 0.0, end: 1.0) - .animate(CurvedAnimation(parent: animation, curve: curve)), - child: FadeTransition( - opacity: //透明度动画 - Tween(begin: 0.5, end: 1.0) - .animate(CurvedAnimation(parent: animation, curve: curve)), - child: child, - ), - ), - ); - } - - @override - Duration get transitionDuration => duration; -} - - -//无动画 -class NoAnimRouter extends MaterialPageRoute { - final Widget page; - NoAnimRouter(this.page) : super(builder: (_) => page); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return child; - } - - @override - Duration get transitionDuration => const Duration(milliseconds: 0); -} diff --git a/packages/app/lib/app/router/zero_page_route.dart b/packages/app/lib/app/router/zero_page_route.dart new file mode 100644 index 00000000..5636c95a --- /dev/null +++ b/packages/app/lib/app/router/zero_page_route.dart @@ -0,0 +1,36 @@ +//渐变透明路由动画 +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + +class ZeroPageRoute extends MaterialPageRoute { + final Widget child; + + + ZeroPageRoute({ + required this.child, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + + return child; + } + + @override + Duration get transitionDuration => Duration.zero; +} From be120aa8df6c7aa26b244070cd97353cb89d82fe Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 9 Jul 2023 18:32:07 +0800 Subject: [PATCH 027/149] login --- lib/app/bloc_wrapper.dart | 4 +- lib/point_system/api/category_api.dart | 19 +- .../mobile/category_page/collect_page.dart | 20 +- .../category_page/sync/async_button.dart | 4 +- .../category_page/sync/upload_button.dart | 8 +- packages/app/lib/app/cons/path_unit.dart | 2 +- .../authentication/lib/authentication.dart | 2 + .../lib/blocs/authentic/bloc.dart | 28 +- .../lib/blocs/authentic/event.dart | 11 +- .../lib/blocs/authentic/state.dart | 13 +- .../lib/blocs/register/bloc.dart | 74 ++-- .../lib/blocs/register/event.dart | 40 +- .../lib/blocs/register/state.dart | 92 ++-- .../authentication/lib/blocs/user/bloc.dart | 10 + .../authentication/lib/blocs/user/state.dart | 82 ++++ .../lib/repository/auth_repository.dart | 1 + .../repository/impl/http_auth_repository.dart | 74 ++-- .../lib/views/mobile/login/login_form.dart | 58 +-- .../lib/views/mobile/login/login_page.dart | 28 +- .../views/mobile/register/register_page.dart | 38 +- .../lib/views/mobile/user/user_account.dart | 415 ++++++++++++++++++ .../lib/views/mobile/user/user_page.dart | 3 +- packages/authentication/pubspec.yaml | 2 + .../toly_ui/dialog/alert_conform_dialog.dart | 132 ++++++ .../toly_ui/dialog/delete_message_panel.dart | 255 +++++++++++ packages/components/lib/toly_ui/toly_ui.dart | 3 +- 26 files changed, 1193 insertions(+), 225 deletions(-) create mode 100644 packages/authentication/lib/blocs/user/bloc.dart create mode 100644 packages/authentication/lib/blocs/user/state.dart create mode 100644 packages/authentication/lib/views/mobile/user/user_account.dart create mode 100644 packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart create mode 100644 packages/components/lib/toly_ui/dialog/delete_message_panel.dart diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index 7a0af6a9..e81f72b7 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -36,9 +36,11 @@ class _BlocWrapperState extends State { return MultiBlocProvider( providers: [ // 全局 bloc : 维护应用存储状态、更新、认证 + BlocProvider(create: (_) => AuthBloc(repository: authRepository)..add(const AppStarted())), BlocProvider(create: (_) => AppBloc(AppStateRepository())..initApp()), BlocProvider(create: (_) => UpdateBloc()), - BlocProvider(create: (_) => AuthBloc(repository: authRepository)..add(const AppStarted())), + BlocProvider(create: (_) => UserBloc()), + BlocProvider(create: (_) => WidgetsBloc(repository: repository)), BlocProvider(create: (_) => categoryBloc), diff --git a/lib/point_system/api/category_api.dart b/lib/point_system/api/category_api.dart index 9c6b34d2..df6be8fb 100644 --- a/lib/point_system/api/category_api.dart +++ b/lib/point_system/api/category_api.dart @@ -11,14 +11,17 @@ class CategoryApi { {required String data, required String likeData}) async { String errorMsg = ""; - var result = await HttpUtil.instance.client.post( - PathUnit.categoryDataSync, - data: {"data": data, "likeData": likeData}).catchError((err) { - errorMsg = err.toString(); - }); - - if (result.data != null) { - return TaskResult.success(data:result.data); + try { + var result = await HttpUtil.instance.client.post( + PathUnit.categoryDataSync, + data: {"data": data, "likeData": likeData}); + print(result.data); + if (result.data != null) { + return TaskResult.success(data:result.data['status']); + } + } catch (e) { + print(e); + errorMsg = e.toString(); } return TaskResult.error(msg: '请求错误: $errorMsg'); diff --git a/lib/widget_ui/mobile/category_page/collect_page.dart b/lib/widget_ui/mobile/category_page/collect_page.dart index b1f9e90f..d63ff173 100644 --- a/lib/widget_ui/mobile/category_page/collect_page.dart +++ b/lib/widget_ui/mobile/category_page/collect_page.dart @@ -94,7 +94,8 @@ class _CollectPageState extends State borderSize: 1.5, ), )), - // backgroundColor: color, + backgroundColor: Theme.of(context).primaryColor, + actionsIconTheme: IconThemeData(color: Colors.white), actions: [ SizedBox( width: 32, @@ -105,7 +106,7 @@ class _CollectPageState extends State width: 32, child: AuthenticWidget.just(const SyncCategoryButton())), if(!widget.canPop) - _buildAddAction(context) + SizedBox(child: _buildAddAction(context)) ], title: const Text( '收藏集录', @@ -144,12 +145,17 @@ class _CollectPageState extends State ); } - Widget _buildAddAction(BuildContext context) => IconButton( - icon: const Icon( - Icons.add, - size: 30, + Widget _buildAddAction(BuildContext context) => GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => Scaffold.of(context).openEndDrawer(), + child: SizedBox( + width: 32, + child: const Icon( + Icons.add, + size: 24, + ), ), - onPressed: () => Scaffold.of(context).openEndDrawer()); + ); List _buildTabs() => _tabs .map( diff --git a/lib/widget_ui/mobile/category_page/sync/async_button.dart b/lib/widget_ui/mobile/category_page/sync/async_button.dart index dfb92cab..d933c488 100644 --- a/lib/widget_ui/mobile/category_page/sync/async_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/async_button.dart @@ -66,7 +66,7 @@ class _SyncCategoryButtonState extends State { return FeedbackWidget( child: const Icon( TolyIcon.download, - size: 28, + size: 24, ), onPressed: _doSync); } @@ -104,7 +104,7 @@ class _SyncCategoryButtonState extends State { Widget _buildSuccess() => const Icon( TolyIcon.upload_success, - size: 25, + size: 22, color: Colors.green, ); diff --git a/lib/widget_ui/mobile/category_page/sync/upload_button.dart b/lib/widget_ui/mobile/category_page/sync/upload_button.dart index 9bc701f0..c9a37b30 100644 --- a/lib/widget_ui/mobile/category_page/sync/upload_button.dart +++ b/lib/widget_ui/mobile/category_page/sync/upload_button.dart @@ -56,8 +56,8 @@ class _UploadCategoryButtonState extends State { Widget _buildError() { return const Icon( TolyIcon.error, - size: 28, - color: Colors.green, + size: 22, + color: Colors.redAccent, ); } @@ -65,7 +65,7 @@ class _UploadCategoryButtonState extends State { return FeedbackWidget( child: const Icon( TolyIcon.upload, - size: 28, + size: 24, ), onPressed: _doUploadCategoryData); } @@ -95,7 +95,7 @@ class _UploadCategoryButtonState extends State { Widget _buildSuccess() { return const Icon( TolyIcon.upload_success, - size: 25, + size: 22, color: Colors.green, ); } diff --git a/packages/app/lib/app/cons/path_unit.dart b/packages/app/lib/app/cons/path_unit.dart index 72237c13..e8d45cb3 100644 --- a/packages/app/lib/app/cons/path_unit.dart +++ b/packages/app/lib/app/cons/path_unit.dart @@ -4,7 +4,7 @@ class PathUnit{ - static const baseUrl='http://119.45.173.197:8080/api/v1'; + static const baseUrl='http://82.157.176.209:8080/api/v1'; // static const baseUrl='http://192.168.0.100:8080/api/v1'; static const sendEmail = '/sendEmail/'; diff --git a/packages/authentication/lib/authentication.dart b/packages/authentication/lib/authentication.dart index c763807f..3fc9d479 100644 --- a/packages/authentication/lib/authentication.dart +++ b/packages/authentication/lib/authentication.dart @@ -8,6 +8,8 @@ export 'blocs/authentic/event.dart'; export 'blocs/register/event.dart'; export 'blocs/register/state.dart'; export 'blocs/register/bloc.dart'; +export 'blocs/user/bloc.dart'; +export 'blocs/user/state.dart'; export 'views/mobile/user/page_item.dart'; export 'views/mobile/user/unit_drawer_header.dart'; export 'views/mobile/user/user_page.dart'; diff --git a/packages/authentication/lib/blocs/authentic/bloc.dart b/packages/authentication/lib/blocs/authentic/bloc.dart index 771b671e..5ce6c466 100644 --- a/packages/authentication/lib/blocs/authentic/bloc.dart +++ b/packages/authentication/lib/blocs/authentic/bloc.dart @@ -17,9 +17,11 @@ class AuthBloc extends Bloc { final AuthRepository repository; - AuthBloc({required this.repository}) : super(AuthInitial()){ + AuthBloc({required this.repository}) : super(const AuthInitial()){ on(_onAppStarted); on(_onAuthByPassword); + on(_onAuthByRegister); + on(_onLoggedOut); } void _onAppStarted(AuthEvent event, Emitter emit) async{ @@ -41,7 +43,7 @@ class AuthBloc extends Bloc { } } - if (event is LoggedOut) { + if (event is Logout) { } } @@ -85,4 +87,26 @@ class AuthBloc extends Bloc { emit (const AuthFailure('用户名和密码不匹配')); } } + + FutureOr _onAuthByRegister(AuthByRegister event, Emitter emit) async{ + emit(AuthLoading()); + TaskResult result = await repository.register(email: event.email, code: event.code); + + // if(result.data == null){ + // emit(const RegisterError('注册失败')); + // }else{ + // if (result.data!=null&&result.data!) { + // // 注册成功 + // emit( RegisterSuccess(event.email)); + // }else{ + // emit( RegisterError(result.msg)); + // } + // } + } + + FutureOr _onLoggedOut(Logout event, Emitter emit) async{ + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.remove(SpKey.tokenKey); + emit(const AuthInitial()); + } } diff --git a/packages/authentication/lib/blocs/authentic/event.dart b/packages/authentication/lib/blocs/authentic/event.dart index 5d91bfce..1bfd237d 100644 --- a/packages/authentication/lib/blocs/authentic/event.dart +++ b/packages/authentication/lib/blocs/authentic/event.dart @@ -24,13 +24,20 @@ class AuthByPassword extends AuthEvent { List get props => [username,password]; } +// 用户注册也是认证的一部分 +class AuthByRegister extends AuthEvent{ + final String email; + final String code; -class LoggedOut extends AuthEvent { + const AuthByRegister(this.email, this.code); +} + +class Logout extends AuthEvent { final bool clearUser; final bool tokenDisable; - const LoggedOut({this.clearUser=true,this.tokenDisable=false}); + const Logout({this.clearUser=true,this.tokenDisable=false}); } class TokenDisabled extends AuthEvent { diff --git a/packages/authentication/lib/blocs/authentic/state.dart b/packages/authentication/lib/blocs/authentic/state.dart index 44d18ba1..13a074b7 100644 --- a/packages/authentication/lib/blocs/authentic/state.dart +++ b/packages/authentication/lib/blocs/authentic/state.dart @@ -2,8 +2,13 @@ import 'package:authentication/models/user.dart'; import 'package:equatable/equatable.dart'; +enum AuthType{ + login, + register, + visitor +} + ///********************************校验状态******************************** -// abstract class AuthState extends Equatable { const AuthState(); @override @@ -11,7 +16,7 @@ abstract class AuthState extends Equatable { } class AuthInitial extends AuthState { - +const AuthInitial(); } @@ -43,4 +48,6 @@ class AuthSuccess extends AuthState { } } -class AuthLoading extends AuthState {} \ No newline at end of file +class AuthLoading extends AuthState { + +} \ No newline at end of file diff --git a/packages/authentication/lib/blocs/register/bloc.dart b/packages/authentication/lib/blocs/register/bloc.dart index 46f2b4fa..04b27614 100644 --- a/packages/authentication/lib/blocs/register/bloc.dart +++ b/packages/authentication/lib/blocs/register/bloc.dart @@ -1,37 +1,37 @@ -import 'package:authentication/authentication.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; - -import 'event.dart'; -import 'state.dart'; - -/// create by 张风捷特烈 on 2021/1/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -class RegisterBloc extends Bloc { - final AuthRepository repository; - - RegisterBloc({required this.repository}) : super(RegisterNone()){ - on(_onRegisterEvent); - } - - void _onRegisterEvent(RegisterEvent event,Emitter emit) async { - if (event is DoRegister) { - emit( RegisterLoading()); - TaskResult result = - await repository.register(email: event.email, code: event.code); - - if(result.data == null){ - emit(const RegisterError('注册失败')); - }else{ - if (result.data!=null&&result.data!) { - // 注册成功 - emit( RegisterSuccess(event.email)); - }else{ - emit( RegisterError(result.msg)); - } - } - } - } -} +// import 'package:authentication/authentication.dart'; +// import 'package:flutter_bloc/flutter_bloc.dart'; +// import 'package:utils/utils.dart'; +// +// import 'event.dart'; +// import 'state.dart'; +// +// /// create by 张风捷特烈 on 2021/1/17 +// /// contact me by email 1981462002@qq.com +// /// 说明: +// +// class RegisterBloc extends Bloc { +// final AuthRepository repository; +// +// RegisterBloc({required this.repository}) : super(RegisterNone()){ +// on(_onRegisterEvent); +// } +// +// void _onRegisterEvent(RegisterEvent event,Emitter emit) async { +// if (event is DoRegister) { +// emit(RegisterLoading()); +// TaskResult result = +// await repository.register(email: event.email, code: event.code); +// +// if(result.data == null){ +// emit(const RegisterError('注册失败')); +// }else{ +// if (result.data!=null&&result.data!) { +// // 注册成功 +// emit( RegisterSuccess(event.email)); +// }else{ +// emit( RegisterError(result.msg)); +// } +// } +// } +// } +// } diff --git a/packages/authentication/lib/blocs/register/event.dart b/packages/authentication/lib/blocs/register/event.dart index 00ce8826..fbbd19bb 100644 --- a/packages/authentication/lib/blocs/register/event.dart +++ b/packages/authentication/lib/blocs/register/event.dart @@ -1,20 +1,20 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class RegisterEvent extends Equatable { - const RegisterEvent(); - - @override - List get props => []; -} - -// 发送 邮箱验证 -class DoRegister extends RegisterEvent { - final String email; - final String code; - - const DoRegister(this.email, this.code); -} +// import 'package:equatable/equatable.dart'; +// +// /// create by 张风捷特烈 on 2020-03-03 +// /// contact me by email 1981462002@qq.com +// /// 说明: +// +// abstract class RegisterEvent extends Equatable { +// const RegisterEvent(); +// +// @override +// List get props => []; +// } +// +// // 发送 邮箱验证 +// class DoRegister extends RegisterEvent { +// final String email; +// final String code; +// +// const DoRegister(this.email, this.code); +// } diff --git a/packages/authentication/lib/blocs/register/state.dart b/packages/authentication/lib/blocs/register/state.dart index bd1342c4..1389c43e 100644 --- a/packages/authentication/lib/blocs/register/state.dart +++ b/packages/authentication/lib/blocs/register/state.dart @@ -1,46 +1,46 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020-03-03 -/// contact me by email 1981462002@qq.com -/// 说明: 主页 Widget 列表 状态类 - -abstract class RegisterState extends Equatable { - const RegisterState(); - - @override - List get props => []; -} - -class RegisterLoading extends RegisterState { - @override - List get props => []; -} - -class RegisterNone extends RegisterState { - @override - List get props => []; -} - - -class RegisterError extends RegisterState { - final String message; - - const RegisterError(this.message); - - @override - List get props => [message]; - - @override - String toString() { - return 'RegisterError{message: $message}'; - } -} - -class RegisterSuccess extends RegisterState { - final String username; - - const RegisterSuccess(this.username); - - @override - List get props => [username]; -} +// import 'package:equatable/equatable.dart'; +// +// /// create by 张风捷特烈 on 2020-03-03 +// /// contact me by email 1981462002@qq.com +// /// 说明: 主页 Widget 列表 状态类 +// +// abstract class RegisterState extends Equatable { +// const RegisterState(); +// +// @override +// List get props => []; +// } +// +// class RegisterLoading extends RegisterState { +// @override +// List get props => []; +// } +// +// class RegisterNone extends RegisterState { +// @override +// List get props => []; +// } +// +// +// class RegisterError extends RegisterState { +// final String message; +// +// const RegisterError(this.message); +// +// @override +// List get props => [message]; +// +// @override +// String toString() { +// return 'RegisterError{message: $message}'; +// } +// } +// +// class RegisterSuccess extends RegisterState { +// final String username; +// +// const RegisterSuccess(this.username); +// +// @override +// List get props => [username]; +// } diff --git a/packages/authentication/lib/blocs/user/bloc.dart b/packages/authentication/lib/blocs/user/bloc.dart new file mode 100644 index 00000000..eb82c52c --- /dev/null +++ b/packages/authentication/lib/blocs/user/bloc.dart @@ -0,0 +1,10 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'state.dart'; + +class UserBloc extends Cubit { + UserBloc():super(UserPerformance.fromJson({})); + + + +} \ No newline at end of file diff --git a/packages/authentication/lib/blocs/user/state.dart b/packages/authentication/lib/blocs/user/state.dart new file mode 100644 index 00000000..a21bd989 --- /dev/null +++ b/packages/authentication/lib/blocs/user/state.dart @@ -0,0 +1,82 @@ + + +class UserPerformance { + final String username; + final int userId; + final String phone; + final String email; + final int emailVerified; + final String weiChat; + final String avatar; + + + String get showEmail { + String prefix = email.split('@')[0]; + String tail = email.split('@')[1]; + String result = ''; + if (prefix.length > 8) { + result = + "${prefix.substring(0, 3)}***${prefix.substring(prefix.length - 2)}"; + } else { + result = prefix; + } + return '$result@$tail'; + } + + String get showPhone => + "${phone.substring(0, 3)}***${phone.substring(phone.length - 4)}"; + + UserPerformance({ + required this.username, + required this.userId, + required this.email, + required this.emailVerified, + required this.weiChat, + required this.phone, + required this.avatar, + }); + + UserPerformance copyWith({ + String? username, + int? userId, + String? phone, + String? avatar, + String? email, + int? emailVerified, + String? weiChat, + bool? hasPwd, + int? pollenCoin, + int? honeyCoin, + }) => + UserPerformance( + weiChat: weiChat ?? this.weiChat, + username: username ?? this.username, + userId: userId ?? this.userId, + phone: phone ?? this.phone, + avatar: avatar ?? this.avatar, + email: email ?? this.email, + emailVerified: emailVerified ?? this.emailVerified, + ); + + static UserPerformance fromJson(Map map) => UserPerformance( + username: map["username"] ?? '', + userId: map["userId"] ?? 0, + phone: map["phone"] ?? '', + avatar: map["avatar"] ?? '', + email: map["email"] ?? '', + weiChat: map["weiChat"] ?? '', + emailVerified: map["emailVerified"] ?? 0, + ); + + Map toJson() => { + "username": username, + "userId": userId, + "phone": phone, + "avatar": avatar, + "weiChat": weiChat, + "email": email, + "emailVerified": emailVerified, + }; + + +} \ No newline at end of file diff --git a/packages/authentication/lib/repository/auth_repository.dart b/packages/authentication/lib/repository/auth_repository.dart index 16d579f1..adcd817e 100644 --- a/packages/authentication/lib/repository/auth_repository.dart +++ b/packages/authentication/lib/repository/auth_repository.dart @@ -3,6 +3,7 @@ import 'package:utils/utils.dart'; import '../models/user.dart'; abstract class AuthRepository { + // 用户登录接口 Future> login({ required String username, diff --git a/packages/authentication/lib/repository/impl/http_auth_repository.dart b/packages/authentication/lib/repository/impl/http_auth_repository.dart index af86eae9..ccb37ac1 100644 --- a/packages/authentication/lib/repository/impl/http_auth_repository.dart +++ b/packages/authentication/lib/repository/impl/http_auth_repository.dart @@ -17,30 +17,32 @@ class HttpAuthRepository implements AuthRepository { }) async { String errorMsg = ""; - var result = await HttpUtil.instance.client.post( - kLogin, - data: { - "username": username, - "password": password, - }, - ).catchError((err) { - errorMsg = err.toString(); - }); + try { + var result = await HttpUtil.instance.client.post( + kLogin, + data: { + "username": username, + "password": password, + }, + ); - if (result.data != null) { - if (result.data['status']) { - return TaskResult( - msg: result.data['msg'], - data: User.fromJson(result.data['data']), - success: result.data['status'], - ); - } else { - return TaskResult( - msg: result.data['msg'], - data: null, - success: false, - ); + if (result.data != null) { + if (result.data['status']) { + return TaskResult( + msg: result.data['msg'], + data: User.fromJson(result.data['data']), + success: result.data['status'], + ); + } else { + return TaskResult( + msg: result.data['msg'], + data: null, + success: false, + ); + } } + } catch (e) { + errorMsg = e.toString(); } return TaskResult.error(msg: '请求错误: $errorMsg'); @@ -53,13 +55,15 @@ class HttpAuthRepository implements AuthRepository { }) async { String errorMsg = ""; - var result = await HttpUtil.instance.client.post(kRegister, - data: {"email": email, "activeCode": code}).catchError((err) { - errorMsg = err.toString(); - }); + try { + var result = await HttpUtil.instance.client + .post(kRegister, data: {"email": email, "activeCode": code}); - if (result.data != null) { - return TaskResult.success(data: result.data); + if (result.data != null) { + return TaskResult.success(data: result.data); + } + } catch (e) { + errorMsg = e.toString(); } return TaskResult.error(msg: '请求错误: $errorMsg'); @@ -67,9 +71,17 @@ class HttpAuthRepository implements AuthRepository { @override Future> sendEmail({required String email}) async { - var result = await HttpUtil.instance.client.post(kSendEmail + email); - if (result.data != null) { - return TaskResult.success(data: result.data); + try { + var result = await HttpUtil.instance.client.post(kSendEmail + email); + if (result.data != null) { + if(result.data['status']){ + return TaskResult.success(data: result.data); + }else{ + return TaskResult.error(msg: result.data['msg']); + } + } + } catch (e) { + print(e); } return const TaskResult.error(msg: '请求错误'); } diff --git a/packages/authentication/lib/views/mobile/login/login_form.dart b/packages/authentication/lib/views/mobile/login/login_form.dart index cb67d380..cb562d70 100644 --- a/packages/authentication/lib/views/mobile/login/login_form.dart +++ b/packages/authentication/lib/views/mobile/login/login_form.dart @@ -27,14 +27,14 @@ class _LoginFromState extends State { mainAxisSize: MainAxisSize.min, children: [ const Text( - "FlutterUnit 登录", + "Flutter Unit 登录", style: TextStyle(fontSize: 25), ), const SizedBox( height: 5, ), const Text( - "更多精彩,更多体验 ~", + "登录账号,更多精彩,更多体验 ~", style: TextStyle(color: Colors.grey), ), const SizedBox( @@ -50,33 +50,37 @@ class _LoginFromState extends State { child: Icon(_showPwd ? TolyIcon.icon_show : TolyIcon.icon_hide)) ], ), - Row( - children: [ - Checkbox(value: true, onChanged: (e) => {}), - const Text( - "自动登录", - style: TextStyle(color: Color(0xff444444), fontSize: 14), - ), - const Spacer(), - FeedbackWidget( - onEnd: () { - Navigator.of(context).pushReplacementNamed(UnitRouter.register); - }, - child: const Text( - "用户注册", - style: TextStyle( - color: Colors.blue, - fontSize: 14, - decoration: TextDecoration.underline), - ), - ) - ], - ), + // Row( + // children: [ + // Checkbox(value: true, onChanged: (e) => {}), + // const Text( + // "自动登录", + // style: TextStyle(color: Color(0xff444444), fontSize: 14), + // ), + // const Spacer(), + // + // ], + // ), BlocConsumer( listener: _listenLoginState, builder: _buildBtnByState, ), - buildOtherLogin(), + GestureDetector( + onTap: () { + Navigator.of(context).pushReplacementNamed(UnitRouter.register); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: const Text( + "没有账号,立即注册", + style: TextStyle( + color: Colors.blue, + fontSize: 14, + decoration: TextDecoration.underline,decorationColor: Colors.blue), + ), + ), + ), + // buildOtherLogin(), const Spacer(flex: 4), ], ); @@ -242,11 +246,11 @@ class _LoginFromState extends State { elevation: 0, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(20))), - backgroundColor: Colors.blue.withOpacity(0.4), + backgroundColor: Colors.blue, ), onPressed: _doLogIn, child: const Text("进入 Unit 世界", - style: TextStyle(color: Colors.white, fontSize: 18)), + style: TextStyle(color: Colors.white, fontSize: 14,fontWeight: FontWeight.bold)), )); } diff --git a/packages/authentication/lib/views/mobile/login/login_page.dart b/packages/authentication/lib/views/mobile/login/login_page.dart index 39bc3c40..ef87276c 100644 --- a/packages/authentication/lib/views/mobile/login/login_page.dart +++ b/packages/authentication/lib/views/mobile/login/login_page.dart @@ -9,17 +9,17 @@ import 'login_form.dart'; /// contact me by email 1981462002@qq.com /// 说明: -class AuthenticScope extends StatelessWidget { - const AuthenticScope({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final AuthRepository repository = context.read().repository; - return MultiBlocProvider(providers: [ - BlocProvider(create: (_) => RegisterBloc(repository: repository)), - ], child: const LoginPage()); - } -} +// class AuthenticScope extends StatelessWidget { +// const AuthenticScope({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// final AuthRepository repository = context.read().repository; +// return MultiBlocProvider(providers: [ +// BlocProvider(create: (_) => RegisterBloc(repository: repository)), +// ], child: const LoginPage()); +// } +// } class LoginPage extends StatelessWidget { const LoginPage({Key? key}) : super(key: key); @@ -32,14 +32,14 @@ class LoginPage extends StatelessWidget { body: SingleChildScrollView( child: Wrap(children: [ Stack(children: [ - UnitArcBackground(height: winSize.height * 0.32), - const Positioned(top: 20, child: BackButton(color: Colors.white)), + UnitArcBackground(height: winSize.height * 0.3), + const Positioned(top: 24, child: BackButton(color: Colors.white)), ]), Container( // color: Colors.green, height: winSize.height * 0.68, width: MediaQuery.of(context).size.width, - padding: const EdgeInsets.only(left: 20.0, right: 20, top: 20), + padding: const EdgeInsets.only(left: 20.0, right: 20, top: 10), child: Stack( alignment: Alignment.center, children: const [ diff --git a/packages/authentication/lib/views/mobile/register/register_page.dart b/packages/authentication/lib/views/mobile/register/register_page.dart index 5c937678..a88e93aa 100644 --- a/packages/authentication/lib/views/mobile/register/register_page.dart +++ b/packages/authentication/lib/views/mobile/register/register_page.dart @@ -46,24 +46,24 @@ class _RegisterPageState extends State { body: SingleChildScrollView( child: Wrap(children: [ Stack(children: [ - UnitArcBackground(height: winSize.height * 0.32), + UnitArcBackground(height: winSize.height * 0.30), const Positioned(top: 20, child: BackButton(color: Colors.white)), ]), Container( width: winSize.width, height: winSize.height * 0.68, - padding: const EdgeInsets.only(left: 20.0, right: 20, top: 20), + padding: const EdgeInsets.only(left: 20.0, right: 20, top: 10), child: Column( children: [ const Text( - "FlutterUnit 注册", + "Flutter Unit 注册", style: TextStyle(fontSize: 25), ), const SizedBox( height: 5, ), const Text( - "更多精彩,更多体验 ~", + "登录账号,更多精彩,更多体验 ~", style: TextStyle(color: Colors.grey), ), const Spacer( @@ -84,7 +84,7 @@ class _RegisterPageState extends State { buildInputWithSend(), const Spacer(flex: 1), _buildBtn(), - const Spacer(flex: 4), + const Spacer(flex: 6), ], )) ]), @@ -141,19 +141,19 @@ class _RegisterPageState extends State { margin: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 0), height: 40, width: MediaQuery.of(context).size.width, - child: BlocConsumer( + child: BlocConsumer( builder: _build, listener: _listener, ), ); void _doRegister() { - BlocProvider.of(context) - .add(DoRegister(_emailCtrl.text, _codeCtrl.text)); + BlocProvider.of(context) + .add(AuthByRegister(_emailCtrl.text, _codeCtrl.text)); } Widget _build(BuildContext context, state) { - bool enable = state is RegisterLoading || state is RegisterSuccess; + bool enable = state is AuthLoading || state is AuthSuccess; String info = enable ? '注册中...' : '开启 Unit 新世界'; return BlocListener( listener: _listenerLogin, @@ -170,22 +170,24 @@ class _RegisterPageState extends State { ), onPressed: (enable || !value) ? null : _doRegister, child: Text(info, - style: const TextStyle(color: Colors.white, fontSize: 18))); + style: TextStyle(color: Colors.white, fontSize: 14,fontWeight: FontWeight.bold)), + + ); }, )); } - void _listener(BuildContext context, RegisterState state) { - if (state is RegisterError) { - Toast.toast(context, '注册失败 : ${state.message}!', + void _listener(BuildContext context, AuthState state) { + if (state is AuthFailure) { + Toast.toast(context, '注册失败 : ${state.error}!', color: Colors.red, duration: const Duration(seconds: 2)); } - if (state is RegisterSuccess) { - BlocProvider.of(context).add(AuthByPassword( - username: _emailCtrl.text, - password: _codeCtrl.text, - )); + if (state is AuthSuccess) { + // BlocProvider.of(context).add(AuthByPassword( + // username: _emailCtrl.text, + // password: _codeCtrl.text, + // )); } } diff --git a/packages/authentication/lib/views/mobile/user/user_account.dart b/packages/authentication/lib/views/mobile/user/user_account.dart new file mode 100644 index 00000000..1ec02176 --- /dev/null +++ b/packages/authentication/lib/views/mobile/user/user_account.dart @@ -0,0 +1,415 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:authentication/blocs/authentic/bloc.dart'; +import 'package:authentication/blocs/user/bloc.dart'; +import 'package:components/components.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../../blocs/authentic/event.dart'; +import '../../../blocs/user/state.dart'; + +class UserAccountPage extends StatelessWidget { + const UserAccountPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Icon trailing = const Icon( + Icons.navigate_next, + color: Color(0xffD9D9D9), + ); + Color? color = Theme.of(context).listTileTheme.tileColor; + Color? sbgColor = Theme.of(context).appBarTheme.backgroundColor; + Color? bgColor = Theme.of(context).scaffoldBackgroundColor; + bool isDark = Theme.of(context).brightness == Brightness.dark; + + UserPerformance performance = context.select( + (bloc) => bloc.state, + ); + return Scaffold( + backgroundColor: isDark ? null : bgColor, + appBar: AppBar( + backgroundColor: isDark ? null : sbgColor, + title: Text( + '账号资料', + ), + ), + body: Column( + children: [ + const SizedBox( + height: 10, + ), + GestureDetector( + onTap: () => _showPicker(context), + child: Container( + color: color, + height: 64, + child: Row( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + width: 120, + child: Text('头像')), + Spacer(), + // AuthUserAvatar( + // size: 50, + // borderSize: 2, + // ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: trailing, + ) + ], + ), + ), + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + GestureDetector( + onTap: () { + // LoggingUploader.onEvent(kSetNameAction, kMyInfoPageName); + // Navigator.push( + // context, + // Right2LeftRouter( + // duration: Duration(milliseconds: 200), + // child: UserChangeNamePage( + // name: performance.username, + // ))); + }, + child: Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + width: 120, + child: Text('昵称')), + Spacer(), + Text( + performance.username ?? '', + style: TextStyle(color: Colors.grey), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: trailing, + ) + ], + ), + ), + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + width: 120, + child: const Text('箴言')), + Spacer(), + Text( + // '${performance.userId}', + '海的彼岸,有我未曾见证的风采。', style: TextStyle(color: Colors.grey,fontSize: 12), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ), + + // const SizedBox( + // height: 10, + // ), + + // Container( + // color: color, + // height: 54, + // child: Row( + // children: [ + // Container( + // padding: EdgeInsets.only(left: 15), + // width: 120, + // child: Text('免费蜂蜜/日')), + // Spacer(), + // Text( + // '${ 0}', + // style: TextStyle(color: Colors.grey), + // ), + // Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12), + // child: Icon( + // Icons.arrow_forward_ios_sharp, + // size: 20, + // color: Colors.transparent, + // ), + // ) + // ], + // ), + // ), + // Divider( + // height: 1 / window.devicePixelRatio, + // thickness: 1 / window.devicePixelRatio, + // ), + // Container( + // color: color, + // height: 54, + // child: Row( + // children: [ + // Container( + // padding: EdgeInsets.only(left: 15), + // width: 120, + // child: Text('蜂蜜')), + // Spacer(), + // Text( + // '${0}', + // style: TextStyle(color: Colors.grey), + // ), + // Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12), + // child: Icon( + // Icons.arrow_forward_ios_sharp, + // size: 20, + // color: Colors.transparent, + // ), + // ) + // ], + // ), + // ), + + const SizedBox( + height: 10, + ), + Container( + color: color, + height: 54, + child: Row( + children: [ + Container( + padding: EdgeInsets.only(left: 15), + width: 120, + child: const Text('账号')), + Spacer(), + Text( + // '${performance.userId}', + '******', style: TextStyle(color: Colors.grey,fontSize: 12), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ), + const SizedBox( + height: 10, + ), + ListTile( + title: const Center( + child: Text( + '退出登录', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + )), + + // trailing: _nextIcon(context), + onTap: () { + showDialog( + context: context, + builder: (ctx) => AlertConformDialog( + title: "登出提示", + content: "退出后将无法使用用户相关的功能,确定退出登录吗?", + conformText: '确定', + onConform: () async { + context.read().add(const Logout()); + // Navigator.of(context).pushAndRemoveUntil( + // NoAnimRouter(AuthRelation( + // pushLogin: false, + // child: MoAILoginPage( + // model: LoginModel( + // appName: "蜜蜂AI智能助手", + // appNameEn: + // "Bee Chat AI Intelligence Assistant", + // appIcon: Icons.widgets_outlined, + // loginBgAssets: "assets/images/login_bg.png"), + // ), + // )), + // ModalRoute.withName('/'), + // ); + return true; + })); + }, + ), + Divider( + height: 1 / window.devicePixelRatio, + thickness: 1 / window.devicePixelRatio, + ), + // const SizedBox( + // height: 10, + // ), + // if(false) + ListTile( + title: Center( + child: const Text( + '删除账号', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: Colors.redAccent), + )), + + // trailing: _nextIcon(context), + onTap: () { + String msg = + "确定删除账号吗?删除后你将无法再访问蜜蜂 ai 提供的智能服务,并清空你的所有账号资料,点击确定删除。"; + showDialog( + context: context, + builder: (ctx) => Dialog( + child: MobileMessagePanel( + title: '清空提示', + conformText: '确定', + msg: msg, + task: (_) async { + // await Future.delayed(Duration(seconds: 3)); + // await context.read().repo.unregister(); + // + context.read().add(Logout()); + + // Navigator.of(context).pushAndRemoveUntil( + // NoAnimRouter(AuthRelation( + // pushLogin: false, + // child: MoAILoginPage( + // model: LoginModel( + // appName: "蜜蜂AI智能助手", + // appNameEn: + // "Bee Chat AI Intelligence Assistant", + // appIcon: Icons.widgets_outlined, + // loginBgAssets: + // "assets/images/login_bg.png"), + // ), + // )), + // ModalRoute.withName('/'), + // ); + }, + ), + )); + }, + ), + ], + ), + ); + } + + void _showPicker(BuildContext context) async { + // FilePickerResult? result = + // await FilePicker.platform.pickFiles(type: FileType.image); + // if (result != null) { + // String? p = result.files.single.path; + // if (p != null) { + // // File file = File(p); + // // Share.shareXFiles([XFile(file.path)], text: 'Great picture'); + // Navigator.push( + // context, + // NoAnimRouter(ClipImagePage( + // image: FileImage(File(p)), + // ))); + // } + // } + // // showCupertinoModalPopup( + // // context: context, + // // builder: (ctx) => ClipRRect( + // // borderRadius: BorderRadius.only( + // // topLeft: Radius.circular(10), + // // topRight: Radius.circular(10), + // // ), + // // child: SizedBox( + // // width: 500, + // // child: AsyncPopPicker( + // // title: Text( + // // '更换头像', + // // style: TextStyle(color: Colors.grey), + // // ), + // // tasks: [ + // // AsyncPopItem( + // // task: () async { + // // try { + // // FilePickerResult? result = await FilePicker.platform + // // .pickFiles(type: FileType.image); + // // if (result != null) { + // // String? p = result.files.single.path; + // // if (p != null) { + // // // File file = File(p); + // // // Share.shareXFiles([XFile(file.path)], text: 'Great picture'); + // // Navigator.push( + // // context, + // // NoAnimRouter(ClipImagePage( + // // image: FileImage(File(p)), + // // ))); + // // } + // // } + // // } catch (e) { + // // Toast.warning("当前应用没有文件读写权限,请先在权限管理中允许!"); + // // } + // // }, + // // info: '从相册选取', + // // ), + // // ], + // // ), + // // ), + // // )); + } +} + +class UserItemPanel extends StatelessWidget { + final String label; + final String value; + final Color? color; + const UserItemPanel( + {Key? key, required this.label, required this.value, required this.color}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: color, + height: 54, + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only(left: 15), child: Text(label)), + ), + Text( + value, + style: TextStyle(color: Colors.grey), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.arrow_forward_ios_sharp, + size: 20, + color: Colors.transparent, + ), + ) + ], + ), + ); + } +} diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/packages/authentication/lib/views/mobile/user/user_page.dart index 4c6ea20c..66fde923 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/packages/authentication/lib/views/mobile/user/user_page.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:authentication/views/mobile/user/user_account.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -96,7 +97,7 @@ class UserPage extends StatelessWidget { if (state is AuthSuccess) { return FeedbackWidget( onEnd: () { - // Navigator.of(context).pushNamed(UnitRouter.login); + Navigator.of(context).push(SlidePageRoute(child: UserAccountPage())); }, child: CircleImage( size: 80, diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index 858418b5..b996eb33 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: path: ../app_update app: path: ../app + components: + path: ../components dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart b/packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart new file mode 100644 index 00000000..a3346bac --- /dev/null +++ b/packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart @@ -0,0 +1,132 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class AlertConformDialog extends StatelessWidget { + final String title; + final String content; + final String conformText; + final String cancelText; + final bool titleDivider; + + final Function()? onConform; + final VoidCallback? onCancel; + final Color? conformTextColor; + + const AlertConformDialog( + {this.title = "title", + this.content = "content", + this.conformText = "确定", + this.cancelText = "取消", + this.onConform, + this.titleDivider = false, + this.onCancel, + this.conformTextColor, + Key? key}) + : super(key: key); + + final TextStyle noticeStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = const TextStyle( + color: Colors.grey, fontSize: 18, fontWeight: FontWeight.bold); + + final TextStyle subTextStyle = const TextStyle( + color: Color(0xff929292), fontSize: 16, fontWeight: FontWeight.bold); + + @override + Widget build(BuildContext context) { + return Dialog( + backgroundColor: Colors.white, + elevation: 0, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(15))), + child: SizedBox( + // height: 120, + width: 320, + // color: Colors.green, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: titleDivider?10:15,bottom: titleDivider?10:0), + child: Center( + child: Text( + title, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + )), + ), + if(titleDivider) + const Divider(height: 1,), + Center( + child: Padding( + padding: + const EdgeInsets.symmetric(vertical: 30, horizontal: 20), + child: Text( + content, + style: noticeStyle, + ), + ), + ), + Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + onCancel?.call(); + Navigator.of(context).pop(false); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '取消', + style: cancelTextStyle, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async { + Navigator.of(context).pop(); + onConform?.call(); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + conformText, + style: TextStyle( + color: conformTextColor, + fontSize: 18, + fontWeight: FontWeight.bold), + ), + ), + )), + ], + ), + ], + ), + ), + ); + } +} diff --git a/packages/components/lib/toly_ui/dialog/delete_message_panel.dart b/packages/components/lib/toly_ui/dialog/delete_message_panel.dart new file mode 100644 index 00000000..e4ad1294 --- /dev/null +++ b/packages/components/lib/toly_ui/dialog/delete_message_panel.dart @@ -0,0 +1,255 @@ + +import 'package:components/toly_ui/toly_ui.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +typedef AsyncTask = Future Function(BuildContext context); + +/// create by 张风捷特烈 on 2020-04-23 +/// contact me by email 1981462002@qq.com +/// 说明: +class DeleteMessagePanel extends StatelessWidget { + final String title; + final String msg; + final String? conformText; + final String? cancelText; + final AsyncTask task; + final Widget? icon; + + const DeleteMessagePanel({ + Key? key, + required this.title, + required this.msg, + required this.task, + this.conformText, + this.icon, + this.cancelText, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + ButtonStyle style = ElevatedButton.styleFrom( + backgroundColor: Colors.redAccent, + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder(), + ); + Color? cancelTextColor = isDark?Colors.white:Theme.of(context).textTheme.displayMedium?.color; + return SizedBox( + width: 350, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + icon?? const Icon( + Icons.warning_amber_rounded, + color: Colors.orange, + ), + const SizedBox( + width: 20, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + Padding( + padding: const EdgeInsets.only( + top: 15, + bottom: 15, + ), + child: Text( + msg, + style: const TextStyle(fontSize: 14), + ), + ), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + style: OutlinedButton.styleFrom( + // backgroundColor: Color(value), + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder(), + ), + child: Text( + cancelText?? '取消', + style: + TextStyle(fontSize: 12, color: cancelTextColor,height: 1), + )), + const SizedBox( + width: 10, + ), + AsyncButton( + conformText: conformText??'删除', + task: task, + style: style, + ), + ], + ) + ], + ), + ), + ], + ), + ), + ); + } +} + + +class MobileMessagePanel extends StatelessWidget { + final String title; + final String msg; + final String? conformText; + final String? cancelText; + final Widget? icon; + final Color? conformColor; + final AsyncTask task; + + const MobileMessagePanel({ + Key? key, + required this.title, + required this.msg, + required this.task, + this.conformText, + this.conformColor, + this.icon, + this.cancelText, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + ButtonStyle style = ElevatedButton.styleFrom( + backgroundColor: conformColor??Colors.redAccent, + elevation: 0, + padding: EdgeInsets.zero, + minimumSize: Size(70, 35), + shape: const StadiumBorder(), + ); + Color? cancelTextColor =isDark?Colors.white: Theme.of(context).textTheme.displayMedium?.color; + return SizedBox( + width: 350, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ icon?? const Icon( + Icons.warning_amber_rounded, + color: Colors.orange, + ), + const SizedBox( + width: 6, + ), Text( + title, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + )], + ), + Padding( + padding: const EdgeInsets.only( + top: 15, + bottom: 15, + ), + child: Text( + msg, + style: const TextStyle(fontSize: 14), + ), + ), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + style: OutlinedButton.styleFrom( + // backgroundColor: Color(value), + elevation: 0, + padding: EdgeInsets.zero, + minimumSize: Size(70, 35), + shape: const StadiumBorder(), + ), + child: Text( + cancelText?? '取消', + style: + TextStyle(fontSize: 12, color: cancelTextColor,height: 1), + )), + const SizedBox( + width: 10, + ), + AsyncButton( + conformText: conformText??'删除', + task: task, + style: style, + ), + ], + ) + ], + ), + ), + ); + } +} + +class AsyncButton extends StatefulWidget { + final ButtonStyle? style; + final AsyncTask task; + final String conformText; + + const AsyncButton({ + super.key, + required this.task, + this.style, + required this.conformText, + }); + + @override + State createState() => _AsyncButtonState(); +} + +class _AsyncButtonState extends State { + bool _loading = false; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: _loading ? null : _doTask, + style: widget.style??ElevatedButton.styleFrom( + elevation: 0, + padding: EdgeInsets.zero, + shape: const StadiumBorder()), + child: _loading + ? const CupertinoActivityIndicator(radius: 8) + :Text( + widget.conformText, + style: const TextStyle(fontSize: 12,height: 1), + )); + } + + void _doTask() async { + setState(() { + _loading = true; + }); + await widget.task(context); + setState(() { + _loading = false; + }); + } +} diff --git a/packages/components/lib/toly_ui/toly_ui.dart b/packages/components/lib/toly_ui/toly_ui.dart index 829c9007..78d42e24 100644 --- a/packages/components/lib/toly_ui/toly_ui.dart +++ b/packages/components/lib/toly_ui/toly_ui.dart @@ -16,7 +16,8 @@ export 'selector/color_chooser.dart'; export 'selector/multi_chip_filter.dart'; export 'selector/burst_menu.dart'; export 'decorations/round_rect_rab_indicator.dart'; - +export 'dialog/alert_conform_dialog.dart'; +export 'dialog/delete_message_panel.dart'; export 'object/windmill.dart'; export 'sliver_header/sliver_pinned_header.dart'; export 'sliver_header/sliver_snap_header.dart'; From 6289db0fe413548453ca981da08b72fbce098ae1 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 16 Jul 2023 11:34:08 +0800 Subject: [PATCH 028/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E9=9B=86=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 1146880 -> 1335296 bytes lib/app/navigation/pure_bottom_bar.dart | 4 +- lib/app/navigation/unit_navigation.dart | 2 +- .../widget_panel/standard_home_page.dart | 63 +++------ .../widget_panel/widget_list_panel.dart | 4 +- .../widget_panel/widget_model_item.dart | 89 ++++++------ .../mobile/widget_panel/widget_page.dart | 81 +++++++++++ packages/artifact/lib/artifact.dart | 4 + .../artifact/lib/src/blocs/article/bloc.dart | 50 +++---- .../lib/src/blocs/columnize/bloc.dart | 25 +--- .../lib/src/repositories/db/article_dao.dart | 82 +++++++++++ .../src/repositories/db/columnize_dao.dart | 64 +++++++++ .../lib/src/repositories/model/article.dart | 80 +++++++---- .../lib/src/repositories/model/columnize.dart | 45 +++--- .../repository/article_repository.dart | 68 +-------- .../repository/columnize_repository.dart | 42 +----- .../src/views/article/column_detail_page.dart | 4 +- .../views/article/columnize_page_view.dart | 132 ++++++++++-------- .../lib/src/views/article/sliver_article.dart | 38 +---- .../src/views/article/sliver_columnize.dart | 29 +++- .../article/toly_article_scroll_page.dart | 111 ++++----------- .../artifact/lib/src/views/artifact_page.dart | 18 ++- .../lib/src/views/toly_refresh_indicator.dart | 2 - .../lib/src/views/wrapper/refresh.dart | 53 +++++++ .../lib/src/db_storage/dao/widget_dao.dart | 20 ++- .../src/db_storage/flutter_db_storage.dart | 7 + packages/storage/pubspec.yaml | 2 + .../lib/blocs/widgets_bloc/widgets_bloc.dart | 101 ++++++++++++-- .../lib/blocs/widgets_bloc/widgets_event.dart | 13 ++ .../lib/blocs/widgets_bloc/widgets_state.dart | 55 +++++++- .../lib/src/db_impl/widget_db_repository.dart | 3 + .../lib/src/model/widget_filter.dart | 14 +- .../lib/src/widget_repository.dart | 2 + 33 files changed, 799 insertions(+), 508 deletions(-) create mode 100644 lib/widget_ui/mobile/widget_panel/widget_page.dart create mode 100644 packages/artifact/lib/src/repositories/db/article_dao.dart create mode 100644 packages/artifact/lib/src/repositories/db/columnize_dao.dart create mode 100644 packages/artifact/lib/src/views/wrapper/refresh.dart diff --git a/assets/flutter.db b/assets/flutter.db index fc8b0c9c253de30c1e0a13f7fb07e5d42823461c..43e5235d58725f45a56ed62a73f971dcd60ad774 100644 GIT binary patch delta 181672 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 diff --git a/lib/app/navigation/pure_bottom_bar.dart b/lib/app/navigation/pure_bottom_bar.dart index ae92302a..71757e3c 100644 --- a/lib/app/navigation/pure_bottom_bar.dart +++ b/lib/app/navigation/pure_bottom_bar.dart @@ -22,13 +22,13 @@ class PureBottomBar extends StatefulWidget { class _PureBottomBarState extends State { List get bottomBar => const ['组件', '绘制', - // '宝具', + '知识', '收藏', '我的']; List get bottomBarIcon => const [ TolyIcon.icon_layout, TolyIcon.dingzhi1, - // TolyIcon.icon_artifact, + TolyIcon.icon_artifact, TolyIcon.icon_collect, TolyIcon.yonghu, ]; diff --git a/lib/app/navigation/unit_navigation.dart b/lib/app/navigation/unit_navigation.dart index d57d61b7..b0dd3b76 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/app/navigation/unit_navigation.dart @@ -77,7 +77,7 @@ class _UnitPhoneNavigationState extends State { children: [ StandardHomePage(), GalleryUnit(), - // ArtifactPage(), + ArtifactPage(), CollectPageAdapter(), UserPage(), ], diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index 4788195c..5630453a 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -1,15 +1,18 @@ import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/navigation/home_drawer.dart'; import 'package:flutter_unit/app/utils/convert.dart'; +import 'package:refresh/refresh.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; import 'standard_home_search.dart'; import 'widget_list_panel.dart'; +import 'widget_page.dart'; class StandardHomePage extends StatefulWidget { const StandardHomePage({Key? key}) : super(key: key); @@ -29,6 +32,11 @@ class _StandardHomePageState extends State tabController = TabController(length: _tabs.length, vsync: this); } + + int maxCount = 60; + + + @override void dispose() { tabController.dispose(); @@ -39,6 +47,7 @@ class _StandardHomePageState extends State WidgetFamily widgetFamily = Convert.toFamily(index); WidgetsBloc bloc = BlocProvider.of(context); if(bloc.state.filter.family==widgetFamily) return; + PrimaryScrollController.of(context).jumpTo(0); BlocProvider.of(context).add(EventTabTap(widgetFamily)); } @@ -47,8 +56,10 @@ class _StandardHomePageState extends State super.build(context); final AppBarTheme appBarTheme = AppBarTheme.of(context); bool isDark = Theme.of(context).brightness == Brightness.dark; + const Color themeColor = Color(0xff007ACB); return Scaffold( + extendBody: true, // backgroundColor: const Color(0xffF3F4F6), drawer: const HomeDrawer(), body: Column( @@ -64,25 +75,13 @@ class _StandardHomePageState extends State child: NestedScrollView( floatHeaderSlivers: true, headerSliverBuilder: _buildHeader, - body: Builder( - builder:(ctx)=> CustomScrollView( - // key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(ctx), - ), - const WidgetListPanel(), - SliverPadding( - padding: const EdgeInsets.only(bottom: 30), - sliver: SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(ctx), - ), - ), - ], - ), - ) + body:WidgetPage() ), ), + Container( + color: Colors.transparent, + height: 54, + ) ], ), ); @@ -94,8 +93,9 @@ class _StandardHomePageState extends State return [ const SliverSnapHeader(child: StandardHomeSearch()), - SliverOverlapAbsorber( - sliver: SliverPinnedHeader( + // SliverOverlapAbsorber( + // sliver: + SliverPinnedHeader( color: isDark?Colors.black:Colors.white, child: TabBar( onTap: _switchTab, @@ -116,31 +116,12 @@ class _StandardHomePageState extends State tabs: _tabs.map((String name) => Tab(text: name)).toList(), ), ), - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // ), ]; } - Widget buildScrollPage(String name) { - return Builder( - builder: (BuildContext context) => CustomScrollView( - key: PageStorageKey(name), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - const WidgetListPanel(), - SliverPadding( - padding: const EdgeInsets.only(bottom: 30), - sliver: SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - ), - ), - ], - ), - ); - } - @override bool get wantKeepAlive => true; + } diff --git a/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart b/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart index 666336af..f955afe8 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart +++ b/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart @@ -13,9 +13,7 @@ class WidgetListPanel extends StatelessWidget { WidgetsState state = context.watch().state; if (state is WidgetsLoaded) { - return PhoneWidgetContent( - items: state.widgets, - ); + return PhoneWidgetContent(items: state.widgets); } if (state is WidgetsLoading) { diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart index bc8bebe6..c701ee29 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ b/lib/widget_ui/mobile/widget_panel/widget_model_item.dart @@ -46,49 +46,58 @@ class StandardWidgetItem extends StatelessWidget { } Widget _buildTitle(Color color,Color? textColor,bool isDark) { + Widget text ; + if(searchArg==null){ + text = Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + color: textColor, + fontWeight: FontWeight.bold, + ), + ); + }else{ + text = Text.rich(formSpan(model.name, searchArg!)); + } + + return Row( children: [ - if (searchArg == null) - Expanded( - child: Text( - model.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 16, - color: textColor, - fontWeight: FontWeight.bold, - ), + Expanded(child: Wrap( + children: [ + text, + const SizedBox( + width: 8, ), - ), - if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), - const SizedBox( - width: 8, - ), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: Wrapper.just( - radius: 10, - color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - '已收藏', - style: TextStyle( - color: color, - height: 1, - fontSize: 10, - shadows: [ - Shadow( - color:isDark? Colors.black: Colors.white, - blurRadius: 2, - offset: Offset(1, 1)) - ]), - ), - ), - ); - }), + BlocBuilder(builder: (_, s) { + bool show = s.widgets.contains(model); + return Opacity( + opacity: show ? 1.0 : 0.0, + child: Wrapper.just( + radius: 10, + color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text( + '已收藏', + style: TextStyle( + color: color, + height: 1, + fontSize: 10, + shadows: [ + Shadow( + color:isDark? Colors.black: Colors.white, + blurRadius: 2, + offset: Offset(1, 1)) + ]), + ), + ), + ); + }), + ], + )), + StarScore( star: Star(emptyColor: Colors.white, size: 12, fillColor: color), score: model.lever, diff --git a/lib/widget_ui/mobile/widget_panel/widget_page.dart b/lib/widget_ui/mobile/widget_panel/widget_page.dart new file mode 100644 index 00000000..b8a4561b --- /dev/null +++ b/lib/widget_ui/mobile/widget_panel/widget_page.dart @@ -0,0 +1,81 @@ +import 'package:artifact/artifact.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:refresh/refresh.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import 'widget_list_panel.dart'; + +class WidgetPage extends StatefulWidget { + const WidgetPage({Key? key}) : super(key: key); + + @override + State createState() => _WidgetPageState(); +} + +class _WidgetPageState extends State { + + final RefreshController _refreshController = + RefreshController(initialRefresh: false); + + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + const Color themeColor = Color(0xff007ACB); + + return BlocListener( + listener: _listenStateChange, + child: RefreshConfigWrapper( + child: SmartRefresher( + controller: _refreshController, + onRefresh: _onRefresh, + enablePullUp: true, + onLoading: _onLoadMore, + child: CustomScrollView( + + // key: PageStorageKey(name), + slivers: [ + + const WidgetListPanel(), + + ], + ), + ), + ), + ); + } + + void _onRefresh() async{ + context.read().add(EventRefresh()); + } + + void _onLoadMore() { + context.read().add(EventLoadMore()); + } + + void _listenStateChange(BuildContext context, WidgetsState state) async{ + if (state is WidgetsLoaded) { + print('===_listenStateChange:${state.full}======'); + + if (state.operate == LoadOperate.refresh) { + _refreshController.refreshCompleted(); + } + if (state.operate == LoadOperate.more) { + if (state.full) { + _refreshController.loadNoData(); + await Future.delayed(const Duration(milliseconds: 2000)); + _refreshController.resetNoData(); + } else { + _refreshController.loadComplete(); + } + } + } + } +} diff --git a/packages/artifact/lib/artifact.dart b/packages/artifact/lib/artifact.dart index 95b4c602..fd14d461 100644 --- a/packages/artifact/lib/artifact.dart +++ b/packages/artifact/lib/artifact.dart @@ -1,3 +1,7 @@ library artifact; export 'src/views/artifact_page.dart'; +export 'src/views/wrapper/refresh.dart'; + +export 'src/repositories/db/article_dao.dart'; +export 'src/repositories/db/columnize_dao.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/blocs/article/bloc.dart b/packages/artifact/lib/src/blocs/article/bloc.dart index 95bf4e20..eefd759b 100644 --- a/packages/artifact/lib/src/blocs/article/bloc.dart +++ b/packages/artifact/lib/src/blocs/article/bloc.dart @@ -18,64 +18,46 @@ class ArticleBloc extends Cubit { /// 初始化时,加载 [pageSize] 条记录 /// void init() { - _loadDataFromDbOrNet(1, pageSize, filter: groupId?.toString(),requestNet: true); + _loadDataFromDb(1, pageSize, filter: groupId?.toString(), requestNet: true); } Future loadNextPageMore() async { int curPage = state.data.length ~/ pageSize; int nextPage = curPage + 1; - TaskResult> result = await repository.queryByHttp( + ArticleFilter filter = ArticleFilter( page: nextPage, pageSize: pageSize, groupId: groupId, ); - if (result.success) { - emit(ArticleWithData( - data: state.data + result.data!, total: result.count)); - repository.cacheResult(result.data!); - } else { - emit(ArticleFailed(result.msg, data: state.data)); - } + List
result = await repository.queryByDb(filter); + int count = await repository.total(filter); + emit(ArticleWithData( + data: state.data + result, + total: count, + )); } - Future _loadDataFromDbOrNet( + Future _loadDataFromDb( int page, int pageSize, { bool requestNet = false, String? filter, }) async { - /// 没有内存缓存时,查看数据库数据 - List
data = await repository.queryByDbCache( - page: page, pageSize: pageSize, filter: filter); + ArticleFilter filter = ArticleFilter( + page: page, + pageSize: pageSize, + groupId: groupId, + ); + List
data = await repository.queryByDb(filter); // 没有内存缓存 并且数据库有数据 if (data.isNotEmpty) { emit(ArticleWithData(data: data, total: data.length)); - if (!requestNet) return; - } - await _requestNetAndSaveOrUpdate( - page: page, pageSize: pageSize, groupId: int.tryParse(filter ?? '-')); - } - - Future _requestNetAndSaveOrUpdate({ - int page = 1, - int pageSize = 20, - int? groupId, - }) async { - // 此时表示没有缓存数据,并且需要请求网络 - // print("=====ColumnizeBloc::请求网络加载数据=========="); - TaskResult> result = await repository.queryByHttp( - groupId: groupId, pageSize: pageSize, page: page); - if (result.success) { - emit(ArticleWithData(data: result.data!, total: result.count)); - repository.cacheResult(result.data!); - } else { - emit(ArticleFailed(result.msg, data: state.data)); } } @override - Future close() async{ + Future close() async { super.close(); print("=======close:${groupId}=================="); } diff --git a/packages/artifact/lib/src/blocs/columnize/bloc.dart b/packages/artifact/lib/src/blocs/columnize/bloc.dart index 56405876..ce931571 100644 --- a/packages/artifact/lib/src/blocs/columnize/bloc.dart +++ b/packages/artifact/lib/src/blocs/columnize/bloc.dart @@ -10,31 +10,16 @@ class ColumnizeBloc extends Cubit { ColumnizeBloc(this.repository) : super(ColumnizeState.initial()); void init() { - _loadDataFromNet(requestNet: true); + _loadDataFromDb(requestNet: true); } - Future _loadDataFromNet({bool requestNet = false}) async { - /// 没有内存缓存时,查看数据库数据 - List data = await repository.queryByDbCache(); + Future _loadDataFromDb({bool requestNet = false}) async { + /// + List data = await repository.queryByDb(); - // 没有内存缓存 并且数据库有数据 + // if (data.isNotEmpty) { emit(ColumnizeState(data)); - if (!requestNet) return; - } - - await _requestNetAndSaveOrUpdate(); - } - - Future _requestNetAndSaveOrUpdate() async { - // 此时表示没有缓存数据,并且需要请求网络 - print("=====ColumnizeBloc::请求网络加载数据=========="); - TaskResult> result = await repository.queryByHttp(); - if (result.success) { - emit(ColumnizeState(result.data!)); - repository.cacheResult(result.data!); - } else { - // emit(PlanFailureState(result.msg,oldData: _cache[groupId] ?? [])); } } } diff --git a/packages/artifact/lib/src/repositories/db/article_dao.dart b/packages/artifact/lib/src/repositories/db/article_dao.dart new file mode 100644 index 00000000..10bf5132 --- /dev/null +++ b/packages/artifact/lib/src/repositories/db/article_dao.dart @@ -0,0 +1,82 @@ +import 'package:artifact/src/repositories/exp.dart'; +import 'package:sqflite/sqflite.dart'; + + + +class ArticleDao { + final Database database; + + ArticleDao(this.database); + + // 表名 + static const String kTableName = 'article'; + + Future insert(Article po) => database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(Article po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query(ArticleFilter filter) async { + String queryArgs = ''; + List args = []; + if(filter.filter !=null){ + queryArgs+="AND filter = ? "; + args.add(filter.filter); + } + if(filter.groupId !=null){ + if(queryArgs.isEmpty){ + queryArgs +='WHERE groupId = ? '; + }else{ + queryArgs+="AND groupId = ? "; + } + args.add(filter.groupId); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([filter.pageSize,filter.offset]); + + List> data = await database.rawQuery( + "SELECT * FROM $kTableName $queryArgs", + args, + ); + + List
result = data.map(Article.fromDb).toList(); + return result; + } + + Future total(ArticleFilter filter) async{ + bool hasGroupId = filter.groupId != null; + String familySql = hasGroupId ? 'WHERE groupId = ?' : ''; + List familyArg = hasGroupId ? [filter.groupId!] : []; + + String sql = "SELECT count(id) as `count` FROM article $familySql"; + + List> result = await database.rawQuery(sql,familyArg); + if(result.isNotEmpty){ + return result.first['count'] as int ??0; + } + return 0; + } +} diff --git a/packages/artifact/lib/src/repositories/db/columnize_dao.dart b/packages/artifact/lib/src/repositories/db/columnize_dao.dart new file mode 100644 index 00000000..96d1a282 --- /dev/null +++ b/packages/artifact/lib/src/repositories/db/columnize_dao.dart @@ -0,0 +1,64 @@ +import 'package:artifact/src/repositories/exp.dart'; +import 'package:sqflite/sqflite.dart'; + + + +class ColumnizeDao { + final Database database; + + ColumnizeDao(this.database); + + // 表名 + static const String kTableName = 'columnize'; + + Future insert(Columnize po) => database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + + Future insertOrUpdate(Columnize po) async { + bool canUpdate = await shouldUpdate(po.id, po.update); + return database.insert( + kTableName, + po.toJson(), + conflictAlgorithm: + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + ); + } + + /// 当前数据是否需要更新 + Future shouldUpdate(int id, int updateAt) async { + List> data = await database + .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + // 没有数据,可以更新 + if (data.isEmpty) { + return true; + } + // 服务器中数据更新时间,大于本地数据库内容,可以更新 + return updateAt > data.first['update']; + } + + Future> query({ + int page = 1, + int pageSize = 20, + String? filter, + }) async { + String queryArgs = ''; + List args = []; + if(filter!=null){ + queryArgs+="AND filter = ? "; + args.add(filter); + } + queryArgs += 'LIMIT ? OFFSET ?'; + args.addAll([pageSize, (page - 1) * pageSize]); + + List> data = await database.rawQuery( + "SELECT * FROM $kTableName $queryArgs", + args, + ); + + List result = data.map(Columnize.fromDb).toList(); + return result; + } +} diff --git a/packages/artifact/lib/src/repositories/model/article.dart b/packages/artifact/lib/src/repositories/model/article.dart index db950dfa..99b0b2be 100644 --- a/packages/artifact/lib/src/repositories/model/article.dart +++ b/packages/artifact/lib/src/repositories/model/article.dart @@ -1,8 +1,4 @@ -import 'dart:convert'; - -import 'package:storage/storage.dart'; - class Article { final String? username; final String title; @@ -12,6 +8,7 @@ class Article { final int create; final int update; final int id; + final int userId; final int groupId; Article({ @@ -22,6 +19,7 @@ class Article { this.cover = '', this.update = 0, this.create = 0, + required this.userId, this.id = -1, required this.groupId, @@ -29,18 +27,23 @@ class Article { Map toJson() => { + "id": id, + "userId": userId, + "groupId": groupId, "username": username, "title": title, - "create": create, + "createAt": create, "subtitle": subtitle, "url": url, "cover": cover, - "update": update, + "updateAt": update, }; factory Article.fromMap(dynamic map)=> Article( + id: map['articleId'] ?? '', username: map['userName'] ?? '', + userId: map['userId'] ?? '', title: map['title'] ?? '', create: DateTime.parse(map['createAt']).millisecondsSinceEpoch, update: DateTime.parse(map['updateAt']).millisecondsSinceEpoch, @@ -50,28 +53,51 @@ class Article { cover: map['caver'] ?? '', ); - // 通过 Columnize 对象生成 数据库缓存对象 - factory Article.fromCache(CachePo cache) { - dynamic map = json.decode(cache.content); - return Article( - username: map['username'] ?? '', - title: map['title'] ?? '', - create: map['create']??0, - update: map['update']??0, - groupId: int.tryParse(cache.filter)??1, - subtitle: map['subtitle'] ?? '', - url: map['url'] ?? '', - cover: map['caver'] ?? '', - id: map['id'] ?? -1, + factory Article.fromDb(dynamic map)=> + Article( + id: map['id'] ?? '', + username: map['username'] ?? '', + userId: map['userId'] ?? '', + title: map['title'] ?? '', + create: map['createAt'] ?? 0 , + update: map['updateAt'] ?? 0, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + groupId: map['groupId'] ?? 1, + cover: map['cover'] ?? '', + ); +} + +class ArticleFilter{ + final String? filter; + final int? groupId; + final int page; + final int pageSize; + + const ArticleFilter({ + this.filter, + this.groupId, + this.page = 1, + this.pageSize = 20, + }); + + int get offset =>pageSize*(page-1); + + ArticleFilter copyWith({ + String? filter, + int? groupId, + int? page, + }) { + return ArticleFilter( + filter: filter ?? this.filter, + groupId: groupId ?? this.groupId, + page: page ?? this.page, + pageSize: pageSize ); } - CachePo get toCache => CachePo( - id: id, - filter: groupId.toString(), - content: json.encode(this), - update: update, - create: create, - type: 0, - ); + @override + String toString() { + return 'ArticleFilter{filter: $filter, groupId: $groupId, page: $page, pageSize: $pageSize}'; + } } \ No newline at end of file diff --git a/packages/artifact/lib/src/repositories/model/columnize.dart b/packages/artifact/lib/src/repositories/model/columnize.dart index 81cc9ca0..564593ca 100644 --- a/packages/artifact/lib/src/repositories/model/columnize.dart +++ b/packages/artifact/lib/src/repositories/model/columnize.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'package:storage/storage.dart'; - class Columnize { final String? username; final String title; @@ -11,6 +9,7 @@ class Columnize { final int create; final int update; final int count; + final int userId; final int id; Columnize({ @@ -23,16 +22,19 @@ class Columnize { this.create = 0, this.count = 0, this.id = -1, + this.userId = -1, }); Map toJson() => { "username": username, + "id": id, "title": title, - "create": create, + "createAt": create, "subtitle": subtitle, + "userId": userId, "url": url, "cover": cover, - "update": update, + "updateAt": update, "count": count, }; @@ -45,31 +47,22 @@ class Columnize { url: map['url'] ?? '', cover: map['caver'] ?? '', count: map['count'] ?? 0, + userId: map['userId'] ?? 0, id: map['columnizeId'] ?? -1, ); - // 通过 Columnize 对象生成 数据库缓存对象 - factory Columnize.fromCache(CachePo cache) { - dynamic map = json.decode(cache.content); - return Columnize( - username: map['username'] ?? '', - title: map['title'] ?? '', - create: map['create']??0, - update: map['update']??0, - subtitle: map['subtitle'] ?? '', - url: map['url'] ?? '', - cover: map['caver'] ?? '', - count: map['count'] ?? 0, - id: map['id'] ?? -1, - ); - } - CachePo get toCache => CachePo( - id: id, - filter: '', - content: json.encode(this), - update: update, - create: create, - type: 0, + factory Columnize.fromDb(dynamic map)=> + Columnize( + id: map['id'] ?? '', + username: map['username'] ?? '', + userId: map['userId'] ?? '', + title: map['title'] ?? '', + create: map['createAt'] ?? 0 , + count: map['count'] ?? 0 , + update: map['updateAt'] ?? 0, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', ); @override diff --git a/packages/artifact/lib/src/repositories/repository/article_repository.dart b/packages/artifact/lib/src/repositories/repository/article_repository.dart index a9699361..67cc2d83 100644 --- a/packages/artifact/lib/src/repositories/repository/article_repository.dart +++ b/packages/artifact/lib/src/repositories/repository/article_repository.dart @@ -2,74 +2,20 @@ import 'package:dio/dio.dart'; import 'package:storage/storage.dart'; import 'package:utils/utils.dart'; +import '../../../artifact.dart'; import '../exp.dart'; // 仓储: 提供数据 class ArticleRepository { - final String host; - late Dio _dio; + const ArticleRepository(); - ArticleRepository(this.host){ - _dio = Dio(BaseOptions(baseUrl: 'http://$host:8080/')); - } - - CacheDao get cacheDao => AppDbStorage.instance.cacheDao; - - Future>> query({ - int page = 1, - int pageSize = 20, - }){ - return queryByHttp(page:page,pageSize:pageSize); - } - - - // 缓存数据 - Future cacheResult(List
data) async{ - for(int i=0;i FlutterDbStorage.instance.articleDao; // 从数据库加载资源 - Future> queryByDbCache({ - int page = 1, - int pageSize = 20, - String? filter, - }) async { - List caches = await cacheDao.query( - type: 1, - - page: page, - pageSize: pageSize, - ); - return caches.map(Article.fromCache).toList(); + Future> queryByDb(ArticleFilter filter) async { + List
caches = await dao.query(filter); + return caches; } - - Future>> queryByHttp({ - int page = 1, - int pageSize = 20, - int? groupId, - }) async { - Map params = { - 'page': page, - 'pageSize': pageSize, - }; - - if(groupId!=null){ - params['groupId'] = groupId; - } - - var rep = await _dio.get('/api/v1/article', queryParameters: params); - if(rep.statusCode == 200){ - if(rep.data['status']){ - // 数据访问成功 - List data = rep.data['data']; - List
result = data.map(Article.fromMap).toList(); - return TaskResult.success(data: result,count: rep.data['total']); - } - } - - return TaskResult.error(msg: '请求失败!'); - } + Future total(ArticleFilter filter) => dao.total(filter); } diff --git a/packages/artifact/lib/src/repositories/repository/columnize_repository.dart b/packages/artifact/lib/src/repositories/repository/columnize_repository.dart index eb08b9b0..266d6ad5 100644 --- a/packages/artifact/lib/src/repositories/repository/columnize_repository.dart +++ b/packages/artifact/lib/src/repositories/repository/columnize_repository.dart @@ -2,58 +2,28 @@ import 'package:dio/dio.dart'; import 'package:storage/storage.dart'; import 'package:utils/utils.dart'; +import '../../../artifact.dart'; import '../model/columnize.dart'; // 仓储: 提供数据 class ColumnizeRepository { - final String host; - late Dio _dio; + const ColumnizeRepository(); - ColumnizeRepository(this.host){ - _dio = Dio(BaseOptions(baseUrl: 'http://$host:8080/')); - } - - CacheDao get cacheDao => AppDbStorage.instance.cacheDao; + ColumnizeDao get dao => FlutterDbStorage.instance.columnizeDao; - // 缓存数据 - Future cacheResult(List data) async{ - for(int i=0;i> queryByDbCache({ + Future> queryByDb({ int page = 1, int pageSize = 20, }) async { - List caches = await AppDbStorage.instance.cacheDao.query( - type: 0, + List caches = await dao.query( page: page, pageSize: pageSize, ); - return caches.map(Columnize.fromCache).toList(); + return caches; } - Future>> queryByHttp({ - int page = 1, - int pageSize = 20, - }) async { - var rep = await _dio.get('/api/v1/columnize', queryParameters: { - 'page': page, - 'pageSize': pageSize, - }); - if (rep.statusCode == 200) { - if (rep.data['status']) { - // 数据访问成功 - List data = rep.data['data']; - List result = data.map(Columnize.fromMap).toList(); - return TaskResult.success(data: result, count: rep.data['total']); - } - } - - return TaskResult.error(msg: ''); - } } diff --git a/packages/artifact/lib/src/views/article/column_detail_page.dart b/packages/artifact/lib/src/views/article/column_detail_page.dart index 86cd81dc..74f6510c 100644 --- a/packages/artifact/lib/src/views/article/column_detail_page.dart +++ b/packages/artifact/lib/src/views/article/column_detail_page.dart @@ -16,7 +16,9 @@ class ColumnDetailPage extends StatelessWidget { ), body: CustomScrollView( slivers: [ - SliverArticlePanel() + SliverPadding( + padding: EdgeInsets.only(top: 8), + sliver: SliverArticlePanel()) // SliverAppBar( // title: Text(columnize.title), // ), diff --git a/packages/artifact/lib/src/views/article/columnize_page_view.dart b/packages/artifact/lib/src/views/article/columnize_page_view.dart index f21815c4..e68479ea 100644 --- a/packages/artifact/lib/src/views/article/columnize_page_view.dart +++ b/packages/artifact/lib/src/views/article/columnize_page_view.dart @@ -17,7 +17,7 @@ import 'column_detail_page.dart'; DateFormat formatLong = DateFormat('yyyy-MM-dd HH:mm:ss'); -const colors = [ +const colors = [ Color(0xFF0829FB), Color(0xFFF60C0C), Color(0xFFE7F716), @@ -27,7 +27,6 @@ const colors = [ Color(0xFF0DF6EF), ]; - class ColumnizePageView extends StatefulWidget { const ColumnizePageView({Key? key}) : super(key: key); @@ -38,7 +37,7 @@ class ColumnizePageView extends StatefulWidget { class _ColumnizePageViewState extends State { final ValueNotifier factor = ValueNotifier(0); - late PageController _ctrl; + late PageController _ctrl; final int _firstOffset = 1000; //初始偏移 int _position = 0; //页面位置 @@ -54,15 +53,13 @@ class _ColumnizePageViewState extends State { viewportFraction: 0.9, initialPage: _position, )..addListener(() { - if(_ctrl.page!=null){ - double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; - factor.value = value == 0 ? 1 : value; - } + if (_ctrl.page != null) { + double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; + factor.value = value == 0 ? 1 : value; + } }); } - - @override void dispose() { _ctrl.dispose(); @@ -70,32 +67,32 @@ class _ColumnizePageViewState extends State { super.dispose(); } - Color get color => Colors.blue; - Color get nextColor =>Colors.orangeAccent; + Color get nextColor => Colors.orangeAccent; bool get isDark => Theme.of(context).brightness == Brightness.dark; - BoxDecoration get boxDecoration => BoxDecoration( - color: isDark?Colors.white.withAlpha(33):Colors.white, + BoxDecoration get boxDecoration => BoxDecoration( + color: isDark ? Colors.white.withAlpha(33) : Colors.white, borderRadius: const BorderRadius.only( topLeft: Radius.circular(40), topRight: Radius.circular(40)), ); @override Widget build(BuildContext context) { - List data = context.watch().state.data; return PageView.builder( - controller: _ctrl, - // itemCount: 7, + controller: _ctrl, // itemCount: 7, itemBuilder: (_, index) { return AnimatedBuilder( - child: _buildByIndex(context,index,data), + child: _buildByIndex(context, index, data), animation: _ctrl, - builder: (context, child) => - _buildAnimItemByIndex(context, child, index,), + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), ); }, onPageChanged: (index) { @@ -104,14 +101,17 @@ class _ColumnizePageViewState extends State { ); } - Widget? _buildByIndex(BuildContext context, int index,List data) { - int realIndex = _fixPosition(index, _firstOffset,data.length); - return ColumnizeItem(columnize: data[realIndex],color: colors[realIndex%colors.length],); + Widget? _buildByIndex(BuildContext context, int index, List data) { + int realIndex = _fixPosition(index, _firstOffset, data.length); + return ColumnizeItem( + columnize: data[realIndex], + color: colors[realIndex % colors.length], + ); } Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { double value; - if (_ctrl.position.haveDimensions&&_ctrl.page!=null) { + if (_ctrl.position.haveDimensions && _ctrl.page != null) { value = _ctrl.page! - index; } else { value = (_position - index).toDouble(); @@ -134,31 +134,30 @@ class _ColumnizePageViewState extends State { int result = offset % length; return result < 0 ? length + result : result; } - - - - } class ColumnizeItem extends StatelessWidget { final Columnize columnize; final Color color; - const ColumnizeItem({Key? key, required this.columnize, required this.color}) : super(key: key); + const ColumnizeItem({Key? key, required this.columnize, required this.color}) + : super(key: key); @override Widget build(BuildContext context) { return GestureDetector( - onTap: (){ + onTap: () { ArticleRepository repository = context.read().repository; - Navigator.of(context).push(SlidePageRoute(child: MultiBlocProvider( - providers: [ - BlocProvider(create: (_) => ArticleBloc(repository,groupId: columnize.id)..init()), - ], - child: ColumnDetailPage(columnize:columnize)))); + Navigator.of(context).push(SlidePageRoute( + child: MultiBlocProvider(providers: [ + BlocProvider( + create: (_) => + ArticleBloc(repository, groupId: columnize.id,pageSize: 100)..init(), + ), + ], child: ColumnDetailPage(columnize: columnize)))); }, child: Container( alignment: Alignment.topLeft, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 10), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10), // margin: EdgeInsets.only(left: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -168,53 +167,72 @@ class ColumnizeItem extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(columnize.title,style: TextStyle(fontWeight: FontWeight.bold,fontSize: 15),), - Text('作者: ${columnize.username}',style: TextStyle(fontSize: 12,color: Color(0xff6A6D76,)),), + Text( + columnize.title, + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + Text( + '作者: ${columnize.username}', + style: TextStyle( + fontSize: 12, + color: Color( + 0xff6A6D76, + )), + ), ], ), Spacer(), Container( - padding: EdgeInsets.symmetric(horizontal: 8,vertical: 4), + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6), - border: Border.all(color:Color(0xff3872E0)) - ), + borderRadius: BorderRadius.circular(6), + border: Border.all(color: Color(0xff3872E0))), child: Text( '${columnize.count} 篇', style: TextStyle( - color: Color(0xff3872E0), - fontSize: 12, - height: 1.1), + color: Color(0xff3872E0), fontSize: 12, height: 1.1), ), ) ], ), - const SizedBox(height: 6,), - Text('专栏简介: ${columnize.subtitle}',style: TextStyle(color: Color(0xffA3A3A3,),fontSize: 12),maxLines: 3,), + const SizedBox( + height: 6, + ), + Text( + '专栏简介: ${columnize.subtitle}', + style: TextStyle( + color: Color( + 0xffA3A3A3, + ), + fontSize: 12), + maxLines: 3, + ), Spacer(), Row( children: [ - Text('更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(columnize.update,isUtc: true))}',style: TextStyle(color: Color(0xff6A6D76,),fontSize: 12),), + Text( + '更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(columnize.update, isUtc: true))}', + style: TextStyle( + color: Color( + 0xff6A6D76, + ), + fontSize: 12), + ), Spacer(), ], ), - ], ), decoration: BoxDecoration( - gradient: LinearGradient( - transform: GradientRotation( - 1*pi/4 - ), - colors: [ + gradient: + LinearGradient(transform: GradientRotation(3 * pi / 4), colors: [ color.withOpacity(0.1), color.withOpacity(0.08), color.withOpacity(0), - // Theme.of(context).primaryColor.withAlpha(88) - ]), - // color: color.withOpacity(0.1), + // Theme.of(context).primaryColor.withAlpha(88) + ]), // color: color.withOpacity(0.1), borderRadius: BorderRadius.circular(8), - ), ), ); diff --git a/packages/artifact/lib/src/views/article/sliver_article.dart b/packages/artifact/lib/src/views/article/sliver_article.dart index 4e626238..a76262a1 100644 --- a/packages/artifact/lib/src/views/article/sliver_article.dart +++ b/packages/artifact/lib/src/views/article/sliver_article.dart @@ -7,19 +7,6 @@ import '../../repositories/exp.dart'; import 'article_detail_page.dart'; import 'columnize_page_view.dart'; -//class ArticleLoading extends ArticleState { -// const ArticleLoading({super.data}); -// } -// -// class ArticleWithData extends ArticleState { -// final int total; -// const ArticleWithData({super.data, this.total = 0}); -// } -// -// class ArticleFailed extends ArticleState { -// final String error; -// const ArticleFailed(this.error, {super.data}); -// } class SliverArticlePanel extends StatelessWidget { const SliverArticlePanel({Key? key}) : super(key: key); @@ -47,27 +34,16 @@ class SliverArticle extends StatelessWidget { @override Widget build(BuildContext context) { return SliverPadding( - padding: EdgeInsets.only(bottom: 0), + padding: const EdgeInsets.only(bottom: 0), sliver: SliverList( - delegate: SliverChildBuilderDelegate(_buildItem, - childCount: data.length))); + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + ))); } Widget? _buildItem(BuildContext context, int index) { - return ArticlePanel( - article: data[index], - ); - // return Column( - // children: [ - // ListTile( - // tileColor: Colors.white, - // title: Text(data[index]), - // ), - // const SizedBox( - // height: 6, - // ) - // ], - // ); + return ArticlePanel(article: data[index]); } } @@ -136,7 +112,7 @@ class ArticlePanel extends StatelessWidget { 0xffA3A3A3, )), )), - if (article.cover != null&&article.cover!.isNotEmpty) + if (article.cover != null && article.cover!.isNotEmpty) Padding( padding: const EdgeInsets.only(left: 8.0), child: ClipRRect( diff --git a/packages/artifact/lib/src/views/article/sliver_columnize.dart b/packages/artifact/lib/src/views/article/sliver_columnize.dart index cf1e27f2..6f4ad2ea 100644 --- a/packages/artifact/lib/src/views/article/sliver_columnize.dart +++ b/packages/artifact/lib/src/views/article/sliver_columnize.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'columnize_page_view.dart'; @@ -21,9 +22,9 @@ class _ColumnizeViewPageState extends State { @override Widget build(BuildContext context) { - return ColoredBox( + return ColoredBox( color: Colors.white, - child: const SizedBox( + child: SizedBox( height: 220, child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -37,18 +38,34 @@ class _ColumnizeViewPageState extends State { backgroundColor: Colors.transparent, radius: 10, ), - const SizedBox(width: 6,), + SizedBox(width: 6,), Text("捷特文章专栏",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), Spacer(), - Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), - Icon(Icons.navigate_next,size: 12,color: Colors.blue,) + GestureDetector( + onTap: () async{ + Uri uri = Uri.parse('https://juejin.im/user/5b42c0656fb9a04fe727eb37'); + if (await canLaunchUrl(uri)) { + await launchUrl(uri,mode:LaunchMode.externalNonBrowserApplication ); + } else { + debugPrint('Could not launch ${uri.path}'); + } + }, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), + Icon(Icons.navigate_next,size: 12,color: Colors.blue,) + ], + ), + ), + ], ), ), Expanded( child: ColumnizePageView(), ), - const SizedBox(height: 10,) + SizedBox(height: 10,) ], ), ), diff --git a/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart b/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart index 7cb980aa..cde1e800 100644 --- a/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart +++ b/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart @@ -34,103 +34,42 @@ class _TolyArticleScrollPageState extends State { Widget build(BuildContext context) { const Color themeColor = Color(0xff007ACB); - return RefreshConfiguration( - headerTriggerDistance: 60, - topHitBoundary: 20, - child: SmartRefresher( - header: TolyRefreshIndicator(), - // header: BezierCircleHeader(), - // header: WaterDropHeader(), - // header: BezierHeader(), - - // header: const ClassicHeader( - // idleText: '', - // releaseText: '释放刷新', - // refreshingText: '加载数据', - // completeText: '刷新成功!', - // refreshingIcon: CupertinoActivityIndicator(color: themeColor,), - // completeIcon: Icon(Icons.done, color: themeColor), - // releaseIcon: Icon(Icons.refresh, color: themeColor), - // idleIcon: Icon(Icons.arrow_downward, color: Colors.grey), - // textStyle: TextStyle(color: themeColor), - // ), - footer: CustomFooter( - builder: (BuildContext context, LoadStatus? mode) { - Widget body; - if (mode == LoadStatus.idle) { - body = Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(Icons.arrow_upward, color: themeColor), - Text("上拉加载", - style: TextStyle(color: themeColor, height: 1)), - ], - ); - } else if (mode == LoadStatus.loading) { - body = CupertinoActivityIndicator(); - } else if (mode == LoadStatus.failed) { - body = Text("加载失败!点击重试!"); - } else if (mode == LoadStatus.canLoading) { - body = Text("松手,加载更多!", - style: TextStyle(color: themeColor, height: 1)); - } else { - body = Text("没有更多数据了!", - style: TextStyle( - color: Colors.grey, - )); - } - return Container( - height: 55.0, - child: Center(child: body), - ); - }, - ), - enablePullUp: true, - onRefresh: _onRefresh, - onLoading: _loadMore, - controller: _refreshController, - child: CustomScrollView( - slivers: [ - // SliverOverlapInjector( - // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), - // ), - SliverPadding( - padding: EdgeInsets.only(top: 10,bottom: 10), - sliver: const SliverToBoxAdapter( - child: ColumnizeViewPage(), - ), + return SmartRefresher( + enablePullUp: true, + onRefresh: _onRefresh, + onLoading: _loadMore, + controller: _refreshController, + child: CustomScrollView( + slivers: [ + // SliverOverlapInjector( + // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), + // ), + SliverPadding( + padding: EdgeInsets.only(top: 10,bottom: 10), + sliver: const SliverToBoxAdapter( + child: ColumnizeViewPage(), ), - SliverArticlePanel(), - ], - ) - - // ListView.builder( - // padding: EdgeInsets.only(top: 10), - // itemCount: data.length, - // itemBuilder: _buildItem, - // ), - ), - ); + ), + SliverArticlePanel(), + ], + ) + + // ListView.builder( + // padding: EdgeInsets.only(top: 10), + // itemCount: data.length, + // itemBuilder: _buildItem, + // ), + ); } void _onRefresh() async { // monitor network fetch await Future.delayed(Duration(milliseconds: 1000)); - // if failed,use refreshFailed() - List newData = []; - for (int i = 0; i < 2; i++) { - newData.add('New: ${i}'); - } - // data.insertAll(0, newData); - setState(() {}); _refreshController.refreshCompleted(); } void _loadMore() async { - print('===========_loadMore==============='); - // await Future.delayed(Duration(milliseconds: 1000)); ArticleBloc bloc = context.read(); await context.read().loadNextPageMore(); // int length = data.length; diff --git a/packages/artifact/lib/src/views/artifact_page.dart b/packages/artifact/lib/src/views/artifact_page.dart index 91a9ed20..360b092a 100644 --- a/packages/artifact/lib/src/views/artifact_page.dart +++ b/packages/artifact/lib/src/views/artifact_page.dart @@ -33,7 +33,7 @@ const List kArtifactInfo = [ '分类收录张风捷特烈的博客文章', 'Flutter 框架探索,七剑合璧', '收录布局方案,提供界面样板', - '生成代码字符串,辅助书写代码', + 'Flutter 知识小要点,一网打尽', ]; class _ArtifactPageState extends State @@ -56,10 +56,8 @@ class _ArtifactPageState extends State super.dispose(); } - static const String host = '192.168.0.107'; - - ArticleRepository aRepository = ArticleRepository(host); - ColumnizeRepository cRepository = ColumnizeRepository(host); + ArticleRepository aRepository = const ArticleRepository(); + ColumnizeRepository cRepository = const ColumnizeRepository(); @override Widget build(BuildContext context) { @@ -129,7 +127,7 @@ class _ArtifactPageState extends State title: Column( children: [ Text( - '万象宝具', + 'Flutter 知识宝库', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), const SizedBox( @@ -157,19 +155,19 @@ class _ArtifactPageState extends State tabs: [ Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '捷文宝具', + text: '捷特文库', ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '修源七剑', + text: '七剑合璧', ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '布局宝具', + text: '布局宝库', ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '编程宝具', + text: '要点宝库', ), ], ), diff --git a/packages/artifact/lib/src/views/toly_refresh_indicator.dart b/packages/artifact/lib/src/views/toly_refresh_indicator.dart index 781122c2..d44ac625 100644 --- a/packages/artifact/lib/src/views/toly_refresh_indicator.dart +++ b/packages/artifact/lib/src/views/toly_refresh_indicator.dart @@ -43,8 +43,6 @@ class _TolyRefreshIndicatorState @override Future readyToRefresh() { - print("readyToRefresh"); - // TODO: implement readyToRefresh // final Simulation simulation = SpringSimulation( // SpringDescription( diff --git a/packages/artifact/lib/src/views/wrapper/refresh.dart b/packages/artifact/lib/src/views/wrapper/refresh.dart new file mode 100644 index 00000000..64a6c2da --- /dev/null +++ b/packages/artifact/lib/src/views/wrapper/refresh.dart @@ -0,0 +1,53 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:refresh/refresh.dart'; + +import '../toly_refresh_indicator.dart'; + +class RefreshConfigWrapper extends StatelessWidget { + final Widget child; + const RefreshConfigWrapper({Key? key, required this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + return RefreshConfiguration( + headerTriggerDistance: 60, + topHitBoundary: 20, + child: child, + headerBuilder: () => const TolyRefreshIndicator(), + footerBuilder: () => CustomFooter( + builder: (BuildContext context, LoadStatus? mode) { + Widget body; + if (mode == LoadStatus.idle) { + body = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(Icons.arrow_upward, color: themeColor), + Text("上拉加载", + style: TextStyle(color: themeColor, height: 1)), + ], + ); + } else if (mode == LoadStatus.loading) { + body = CupertinoActivityIndicator(); + } else if (mode == LoadStatus.failed) { + body = Text("加载失败!点击重试!"); + } else if (mode == LoadStatus.canLoading) { + body = Text("松手,加载更多!", + style: TextStyle(color: themeColor, height: 1)); + } else { + body = Text("没有更多数据了!", + style: TextStyle( + color: Colors.grey, + )); + } + return Container( + height: 55.0, + child: Center(child: body), + ); + }, + ), + ); + } +} diff --git a/packages/storage/lib/src/db_storage/dao/widget_dao.dart b/packages/storage/lib/src/db_storage/dao/widget_dao.dart index c29d5e4d..30064c5f 100644 --- a/packages/storage/lib/src/db_storage/dao/widget_dao.dart +++ b/packages/storage/lib/src/db_storage/dao/widget_dao.dart @@ -55,6 +55,7 @@ class WidgetDao { if (arguments.name.isEmpty) { return []; } + // _表示 name 任意 String name = arguments.name == '*' ? '' : arguments.name; bool hasFamily = arguments.family != null; @@ -67,8 +68,23 @@ class WidgetDao { } return db.rawQuery( "SELECT * " - "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC", - ["%$name%", ...familyArg, ...starArg]); + "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", + ["%$name%", ...familyArg, ...starArg, arguments.pageSize, arguments.offset]); + } + + Future total(WidgetFilter args) async{ + bool hasFamily = args.family != null; + String familySql = hasFamily ? 'family = ?' : ''; + List familyArg = hasFamily ? [args.family!.index] : []; + + String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; + + List> result = await db.rawQuery(sql,familyArg); + if(result.isNotEmpty){ + return result.first['count'] as int ??0; + } + return 0; + } } diff --git a/packages/storage/lib/src/db_storage/flutter_db_storage.dart b/packages/storage/lib/src/db_storage/flutter_db_storage.dart index e33994cc..ef0a6db4 100644 --- a/packages/storage/lib/src/db_storage/flutter_db_storage.dart +++ b/packages/storage/lib/src/db_storage/flutter_db_storage.dart @@ -2,6 +2,7 @@ import 'dart:io'; +import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; import 'helper/db_open_helper.dart'; @@ -22,6 +23,8 @@ class FlutterDbStorage { late CategoryDao _categoryDao; late NodeDao _nodeDao; late LikeDao _likeDao; + late ArticleDao _articleDao; + late ColumnizeDao _columnizeDao; WidgetDao get widgetDao => _widgetDao; @@ -30,6 +33,8 @@ class FlutterDbStorage { NodeDao get nodeDao => _nodeDao; LikeDao get likeDao => _likeDao; + ArticleDao get articleDao => _articleDao; + ColumnizeDao get columnizeDao => _columnizeDao; Database get db => _database!; @@ -57,6 +62,8 @@ class FlutterDbStorage { _categoryDao = CategoryDao(_database!); _nodeDao = NodeDao(_database!); _likeDao = LikeDao(_database!); + _articleDao = ArticleDao(_database!); + _columnizeDao = ColumnizeDao(_database!); print('初始化数据库....'); } diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index bb62d48d..1e9ae9cc 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: shared_preferences: ^2.0.13 # xml 固化 widget_repository: path: ../widget_repository + artifact: + path: ../artifact dev_dependencies: flutter_test: diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index b23a384c..de35a77e 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -1,9 +1,11 @@ +import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; part 'widgets_event.dart'; + part 'widgets_state.dart'; /// create by 张风捷特烈 on 2020-03-03 @@ -13,35 +15,104 @@ part 'widgets_state.dart'; class WidgetsBloc extends Bloc { final WidgetRepository repository; - WidgetsBloc({required this.repository}):super(const WidgetsLoading()){ + WidgetsBloc({required this.repository}) : super(const WidgetsLoading()) { on(_onEventTabTap); + on(_onEventLoadMore); + on(_onEventRefresh); on(_onEventSearchWidget); } - void _onEventTabTap(EventTabTap event, Emitter emit) async{ - emit( const WidgetsLoading()); + /// 切换页签,以 [family] 为过滤项 + void _onEventTabTap(EventTabTap event, Emitter emit) async { + emit(const WidgetsLoading(operate: LoadOperate.load)); WidgetFilter filter = WidgetFilter.family(event.family); try { - final List widgets = await repository.searchWidgets( - filter - ); - emit( WidgetsLoaded(widgets: widgets,filter: filter)); + final List widgets = await repository.searchWidgets(filter); + emit(WidgetsLoaded( + widgets: widgets, + filter: filter, + operate: LoadOperate.load, + )); } catch (err) { print(err); - emit(WidgetsLoadFailed(err.toString(),filter: filter)); + emit(WidgetsLoadFailed( + err.toString(), + filter: filter, + operate: LoadOperate.load, + )); + } + } + + FutureOr _onEventRefresh( + EventRefresh event, Emitter emit) async { + // emit(const WidgetsLoading(operate: LoadOperate.refresh)); + try { + await Future.delayed(const Duration(milliseconds: 500)); + final List widgets = + await repository.searchWidgets(state.filter.copyWith( + page: 1, + )); + emit(WidgetsLoaded( + widgets: widgets, + filter: state.filter, + operate: LoadOperate.refresh, + fetchTime: DateTime.now().millisecondsSinceEpoch)); + } catch (err) { + print(err); + emit(WidgetsLoadFailed( + err.toString(), + filter: state.filter, + operate: LoadOperate.refresh, + )); + } + } + + FutureOr _onEventLoadMore( + EventLoadMore event, Emitter emit) async { + if (state is WidgetsLoaded) { + WidgetsLoaded old = (state as WidgetsLoaded); + int total = await repository.total(old.filter); + if (old.widgets.length < old.filter.pageSize) { + // 不满一页 + emit(old.copyWith(full: true, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch,)); + return; + } + + if (total <= old.widgets.length) { + // 已满 + emit(old.copyWith(full: true, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch,)); + return; + } + // 未满,继续加载下一页 + int pageIndex = old.widgets.length ~/ old.filter.pageSize + 1; + WidgetFilter filter = old.filter.copyWith(page: pageIndex); + final List newData = await repository.searchWidgets(filter); + List newWidget = old.widgets + newData; + emit(old.copyWith( + widgets: newWidget, + full: newWidget.length == total, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch, + filter: filter)); } } - void _onEventSearchWidget(EventSearchWidget event, Emitter emit) async{ - emit( const WidgetsLoading()); + void _onEventSearchWidget( + EventSearchWidget event, Emitter emit) async { + emit(const WidgetsLoading(operate: LoadOperate.load)); try { - final List widgets = await repository.searchWidgets( - event.filter - ); - emit( WidgetsLoaded(widgets: widgets,filter: event.filter)); + final List widgets = + await repository.searchWidgets(event.filter); + emit(WidgetsLoaded( + widgets: widgets, filter: event.filter, operate: LoadOperate.load)); } catch (err) { print(err); - emit(WidgetsLoadFailed(err.toString(),filter: event.filter)); + emit(WidgetsLoadFailed(err.toString(), + filter: event.filter, operate: LoadOperate.load)); } } } diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart index fbebca6b..99a0e601 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart @@ -19,6 +19,19 @@ class EventTabTap extends WidgetsEvent { List get props => [family]; } +class EventLoadMore extends WidgetsEvent { + + @override + List get props => []; +} + +class EventRefresh extends WidgetsEvent { + + @override + List get props => []; +} + + class EventSearchWidget extends WidgetsEvent { final WidgetFilter filter;//参数 const EventSearchWidget({required this.filter}); diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart index 8e5c707f..2add619c 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart @@ -4,38 +4,81 @@ part of 'widgets_bloc.dart'; /// contact me by email 1981462002@qq.com /// 说明: 主页 Widget 列表 状态类 +/// 对于一个可查询、可分页的数据集 +/// 状态类持有过滤数据 Filter, 任何衍生状态都需要感知过滤的信息,比如加载异常,点击重试,可以基于最后的过滤状态。 +/// 分页加载 信息需要 了解 总数据、页数、每页含量 abstract class WidgetsState extends Equatable { final WidgetFilter filter; - const WidgetsState({required this.filter}); + final LoadOperate operate; + const WidgetsState({required this.filter, required this.operate}); @override - List get props => []; + List get props => [filter]; } class WidgetsLoading extends WidgetsState { - const WidgetsLoading({ WidgetFilter filter=const WidgetFilter()}) : super(filter:filter) ; + const WidgetsLoading( + {super.filter = const WidgetFilter(), super.operate = LoadOperate.load}); } +/// [full] 是否已满,用于加载更多到底的标识 +/// [widgets] 加载的数据 class WidgetsLoaded extends WidgetsState { final List widgets; + final bool full; + final int fetchTime; - const WidgetsLoaded( {this.widgets = const [],required WidgetFilter filter}): super(filter:filter); + const WidgetsLoaded({ + this.widgets = const [], + required super.filter, + required super.operate, + this.full = false, + this.fetchTime = 0, + }); @override - List get props => [widgets]; + List get props => [widgets,full,filter,operate,fetchTime]; @override String toString() { return 'WidgetsLoaded{widgets: $widgets}'; } + + WidgetsLoaded copyWith({ + List? widgets, + bool? full, + LoadOperate? operate, + WidgetFilter? filter, + int? fetchTime, +}){ + return WidgetsLoaded( + widgets:widgets??this.widgets, + full:full??this.full, + operate:operate??this.operate, + filter:filter??this.filter, + fetchTime:fetchTime??this.fetchTime, + ); + } + } class WidgetsLoadFailed extends WidgetsState { final String error; const WidgetsLoadFailed(this.error, - {required WidgetFilter filter}): super(filter:filter); + {required super.filter, required super.operate}); @override List get props => [error]; } + +/// 加载类型 +/// [load] 加载第一页数据, 用于首次加载, +/// [refresh] 下拉刷新状态标识。之前加载的更多数据将会被移除 +/// [more] 加载更多状态标识。 +/// +enum LoadOperate { + load, + refresh, + more, +} diff --git a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart b/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart index e4b41993..613734ba 100644 --- a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart +++ b/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart @@ -49,4 +49,7 @@ class WidgetDbRepository implements WidgetRepository { Future collected(int id) async { return await likeDao.like(id); } + + @override + Future total(WidgetFilter args) => widgetDao.total(args); } diff --git a/packages/widget_repository/lib/src/model/widget_filter.dart b/packages/widget_repository/lib/src/model/widget_filter.dart index 59aab45a..71f36d13 100644 --- a/packages/widget_repository/lib/src/model/widget_filter.dart +++ b/packages/widget_repository/lib/src/model/widget_filter.dart @@ -1,19 +1,29 @@ import 'enums.dart'; + + class WidgetFilter { final String name; final WidgetFamily? family; final List stars; + final int page; + final int pageSize; const WidgetFilter({ this.name = '', this.family, this.stars = const [-1, -1, -1, -1, -1], + this.page = 1, + this.pageSize = 20, }); + int get offset =>pageSize*(page-1); + WidgetFilter.family( this.family, { this.name = '*', + this.page = 1, + this.pageSize = 20, this.stars = const [1, 2, 3, 4, 5], }); @@ -21,16 +31,18 @@ class WidgetFilter { String? name, WidgetFamily? family, List? stars, + int? page, }) { return WidgetFilter( name: name ?? this.name, family: family ?? this.family, stars: stars ?? this.stars, + page: page ?? this.page, ); } @override String toString() { - return 'WidgetFilter{name: $name, family: $family, stars: $stars}'; + return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; } } diff --git a/packages/widget_repository/lib/src/widget_repository.dart b/packages/widget_repository/lib/src/widget_repository.dart index d476a341..e17aa160 100644 --- a/packages/widget_repository/lib/src/widget_repository.dart +++ b/packages/widget_repository/lib/src/widget_repository.dart @@ -14,6 +14,8 @@ abstract class WidgetRepository { Future toggleLike(int id); + Future total(WidgetFilter args); + Future> loadLikeWidgets(); Future collected(int id); From dcbadce1c422143dd1fbb30ff8e9d43ba4590f39 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 27 Jul 2023 05:59:01 +0800 Subject: [PATCH 029/149] readme --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 29266bcc..b5501dee 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,15 @@ +### FlutterUnit 下载体验: 复制链接,在浏览器下载~ + +| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | +|------|------------|------|------------| +| Android版 | http://toly1994.com/file/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 | https://apps.apple.com/cn/app/flutter-unit/id6450545123 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| MacOS版 | http://toly1994.com/file/flutter_unit_mac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| + + #### Flutter Unit 周边 - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) @@ -14,25 +25,16 @@ - [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41) - [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point) -### FlutterUnit 下载体验: 复制链接,在浏览器下载~ - -| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | -|------|------------|------|------------| -| Android版 | http://toly1994.com/file/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | https://apps.apple.com/cn/app/flutter-unit/id6450545123 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | http://toly1994.com/file/flutter_unit_mac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| -| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| --- > 当前Flutter 版本 ``` -Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git -Framework • revision d3d8effc68 (3 days ago) • 2023-05-16 17:59:05 -0700 -Engine • revision b4fb11214d -Tools • Dart 3.0.1 • DevTools 2.23.1 +Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git +Framework • revision f468f3366c (2 weeks ago) • 2023-07-12 15:19:05 -0700 +Engine • revision cdbeda788a +Tools • Dart 3.0.6 • DevTools 2.23.1 ``` --- From 13d5842f4f7fdca2baa4385377f0e44b3a3bfb4c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 22 Aug 2023 08:35:40 +0800 Subject: [PATCH 030/149] readme --- ios/Runner.xcodeproj/project.pbxproj | 12 ++++---- lib/app/flutter_unit.dart | 1 + lib/app/navigation/route/route.dart | 41 ++++++++++++++++++++++++++++ lib/app/router/unit_router.dart | 3 +- 4 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 lib/app/navigation/route/route.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index cd740ef8..4d990781 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -357,7 +357,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = XQPP7CHG9D; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D; ENABLE_BITCODE = NO; @@ -372,7 +372,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.9.1; + MARKETING_VERSION = 2.9.2; PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit"; PRODUCT_NAME = "$(TARGET_NAME)"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = flutter_unit_profile; @@ -498,7 +498,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D; ENABLE_BITCODE = NO; @@ -513,7 +513,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.9.1; + MARKETING_VERSION = 2.9.2; PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -534,7 +534,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D; ENABLE_BITCODE = NO; @@ -549,7 +549,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.9.1; + MARKETING_VERSION = 2.9.2; PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index aae8048a..3594ca75 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -20,6 +20,7 @@ class FlutterUnit extends StatelessWidget { return DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: MaterialApp( + // routes: , showPerformanceOverlay: state.showPerformanceOverlay, title: StrUnit.appName, debugShowCheckedModeBanner: false, diff --git a/lib/app/navigation/route/route.dart b/lib/app/navigation/route/route.dart new file mode 100644 index 00000000..70f18eb0 --- /dev/null +++ b/lib/app/navigation/route/route.dart @@ -0,0 +1,41 @@ +import 'dart:io'; + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +import '../../views/setting/code_style_setting.dart'; +import '../../views/setting/font_setting.dart'; +import '../../views/setting/setting_page.dart'; +import '../../views/setting/theme_color_setting.dart'; +import '../unit_navigation.dart'; + +class RoutePath { + + static const String nav = 'nav'; + + static const String themeColorSetting = 'ThemeColorSettingPage'; + static const String codeStyleSetting = 'CodeStyleSettingPage'; + static const String itemStyleSetting = 'ItemStyleSettingPage'; + static const String fontSetting = 'FountSettingPage'; + + Map get routes => + { + themeColorSetting: (ctx) => const ThemeColorSettingPage(), + codeStyleSetting: (ctx) => const CodeStyleSettingPage(), + fontSetting: (ctx) => const FontSettingPage(), + }; + + + static Route? generateRoute(RouteSettings settings) { + switch (settings.name) { + case nav: + if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) { + return ZeroPageRoute(child: UnitNavigation()); + } + return SlidePageRoute(child: UnitNavigation()); + } + + return null; + } + +} \ No newline at end of file diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart index 0ccc3951..687a8dfe 100644 --- a/lib/app/router/unit_router.dart +++ b/lib/app/router/unit_router.dart @@ -81,8 +81,7 @@ class UnitRouters { ); } - return SlidePageRoute( - child: child); + return SlidePageRoute(child: child); // case search: // return Right2LeftRouter(child: const SearchPageProvider()); From 21c17c502775a8574db3d5ddb045e6ceaa2baa81 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 24 Aug 2023 11:48:06 +0800 Subject: [PATCH 031/149] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++--- pubspec.lock | 34 +++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b5501dee..465cdedc 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,15 @@ | 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | |------|------------|------|------------| -| Android版 | http://toly1994.com/file/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| Android版 | https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| | iOS版 | https://apps.apple.com/cn/app/flutter-unit/id6450545123 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | http://toly1994.com/file/flutter_unit_mac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| MacOS版 | https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitMac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 |https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| | Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| + + #### Flutter Unit 周边 - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) diff --git a/pubspec.lock b/pubspec.lock index b18e598e..6ba6a182 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -89,10 +89,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.17.1" + version: "1.17.2" components: dependency: "direct main" description: @@ -316,10 +316,10 @@ packages: dependency: "direct main" description: name: intl - sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.18.0" + version: "0.18.1" js: dependency: transitive description: @@ -356,18 +356,18 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: @@ -649,10 +649,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.9.1" + version: "1.10.0" sqflite: dependency: "direct main" description: @@ -744,10 +744,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.5.1" + version: "0.6.0" toggle_rotate: dependency: "direct main" description: @@ -875,6 +875,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.1.4-beta" webview_flutter: dependency: "direct main" description: @@ -985,5 +993,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=3.7.0-0" From 71f90630820c83a54fb0d464cc531a44dea32fe4 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 10 Sep 2023 15:49:09 +0800 Subject: [PATCH 032/149] =?UTF-8?q?=E6=9B=B4=E6=96=B05=E4=B8=AA=E6=96=B0Sl?= =?UTF-8?q?iver=E7=BB=84=E4=BB=B6=E3=80=81=E5=8D=87=E7=BA=A7Flutter3.13.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++-- assets/flutter.db | Bin 1335296 -> 1175552 bytes .../lib/Sliver/DecoratedSliver/node1.dart | 61 +++++++++++ .../SliverConstrainedCrossAxis/node1.dart | 94 ++++++++++++++++ .../Sliver/SliverCrossAxisExpanded/node1.dart | 84 ++++++++++++++ .../Sliver/SliverCrossAxisGroup/node1.dart | 86 +++++++++++++++ .../lib/Sliver/SliverMainAxisGroup/node1.dart | 103 ++++++++++++++++++ packages/widgets/lib/exp/sliver_unit.dart | 5 + packages/widgets/lib/widgets_map.dart | 20 ++++ 9 files changed, 462 insertions(+), 11 deletions(-) create mode 100644 packages/widgets/lib/Sliver/DecoratedSliver/node1.dart create mode 100644 packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart create mode 100644 packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart create mode 100644 packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart create mode 100644 packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart diff --git a/README.md b/README.md index 465cdedc..35810892 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ -### FlutterUnit 下载体验: 复制链接,在浏览器下载~ +### FlutterUnit 全平台下载体验: | 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | |------|------------|------|------------| -| Android版 | https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | https://apps.apple.com/cn/app/flutter-unit/id6450545123 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitMac.zip |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitWin.zip | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 |[FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 |[FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| | Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| - - #### Flutter Unit 周边 - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) @@ -33,10 +31,10 @@ > 当前Flutter 版本 ``` -Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git -Framework • revision f468f3366c (2 weeks ago) • 2023-07-12 15:19:05 -0700 -Engine • revision cdbeda788a -Tools • Dart 3.0.6 • DevTools 2.23.1 +Flutter 3.13.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 2524052335 (3 days ago) • 2023-09-06 14:32:31 -0700 +Engine • revision b8d35810e9 +Tools • Dart 3.1.1 • DevTools 2.25.0 ``` --- diff --git a/assets/flutter.db b/assets/flutter.db index 43e5235d58725f45a56ed62a73f971dcd60ad774..d586a95d150c5ec438844e596c365884bdceb421 100644 GIT binary patch delta 13029 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 z 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 ZlvTDBMZqMVfr~=@XY84&_4$+U{D1He?l=Gd diff --git a/packages/widgets/lib/Sliver/DecoratedSliver/node1.dart b/packages/widgets/lib/Sliver/DecoratedSliver/node1.dart new file mode 100644 index 00000000..cbeb023a --- /dev/null +++ b/packages/widgets/lib/Sliver/DecoratedSliver/node1.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 209, +// "name": 'DecoratedSliver 基本使用', +// "priority": 1, +// "subtitle": +// "【sliver】 : 孩子组件 【Widget?】\n" +// "【decoration】 : 装饰对象 【Decoration】\n" +// "【position】 : 装饰位置 【DecorationPosition】", +// } +class DecorationSliverDemo extends StatelessWidget { + const DecorationSliverDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverPadding( + padding: const EdgeInsets.all(8), + sliver: DecoratedSliver( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + boxShadow: const [ + BoxShadow( + color: Color(0xFF111133), + blurRadius: 2, + offset: Offset(-2, -1)) + ], + gradient: LinearGradient( + colors: const [ + Color(0xFFEEEEEE), + Color(0xFF111133), + ], + stops: const [0.1, 1.0], + ), + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) => Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Text( + '张风捷特烈-$index', + style: TextStyle(fontSize: 24, color: Colors.white), + )), + ), + childCount: 128), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart b/packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart new file mode 100644 index 00000000..e49d2c39 --- /dev/null +++ b/packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 270, +// "name": 'SliverConstrainedCrossAxis 基本使用', +// "priority": 1, +// "subtitle": +// "【maxExtent】 : 大小 【double】\n" +// "【sliver】 : 子组件 【Widget?】", +// } +class SliverConstrainedCrossAxisDemo extends StatelessWidget { + const SliverConstrainedCrossAxisDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverConstrainedCrossAxis( + maxExtent: 100, + sliver: _SliverColorList( + height: 100.0, + fontSize: 24, + count: 8, + color1: Colors.amber[300], + color2: Colors.blue[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 50.0, + fontSize: 20, + count: 6, + color1: Colors.purple[300], + color2: Colors.orange[300], + )), + ], + ), + ], + ), + ); + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart b/packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart new file mode 100644 index 00000000..2ff5359e --- /dev/null +++ b/packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 271, +// "name": 'SliverCrossAxisExpanded 基本使用', +// "priority": 1, +// "subtitle": +// "【flex】 : 占比 【int】\n" +// "【sliver】 : 子组件 【Widget?】", +// } +class SliverCrossAxisExpandedDemo extends StatelessWidget { + const SliverCrossAxisExpandedDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + SliverCrossAxisExpanded( + flex: 1, + sliver: _SliverColorList( + height: 50.0, + fontSize: 20, + count: 6, + color1: Colors.purple[300], + color2: Colors.orange[300], + )), + ], + ), + ], + ), + ); + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart b/packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart new file mode 100644 index 00000000..954accbc --- /dev/null +++ b/packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 269, +// "name": 'SliverCrossAxisGroup 基本使用', +// "priority": 1, +// "subtitle": +// "【slivers】 : 子组件列表 【List】", +// } +class SliverCrossAxisGroupDemo extends StatelessWidget { + const SliverCrossAxisGroupDemo({super.key}); + + @override + Widget build(BuildContext context) { + double width = MediaQuery.of(context).size.width; + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: [ + SliverCrossAxisGroup( + slivers: [ + SliverConstrainedCrossAxis( + maxExtent: 100, + sliver: _SliverColorList( + height: 100.0, + fontSize: 24, + count: 8, + color1: Colors.amber[300], + color2: Colors.blue[300], + ), + ), + SliverConstrainedCrossAxis( + maxExtent: width - 100, + sliver: _SliverColorList( + height: 80.0, + fontSize: 18, + count: 15, + color1: Colors.green[300], + color2: Colors.red[300], + ), + ), + ], + ), + ], + ), + ); + + } +} + +class _SliverColorList extends StatelessWidget { + final double height; + final double fontSize; + final Color? color1; + final Color? color2; + final int count; + const _SliverColorList( + {super.key, + required this.height, + required this.fontSize, + required this.count, + this.color1, + this.color2}); + + @override + Widget build(BuildContext context) { + return SliverList.builder( + itemBuilder: (BuildContext context, int index) { + return Container( + color: index.isEven ? color1 : color2, + height: height, + child: Center( + child: Text( + 'Item ${index}', + style: TextStyle(fontSize: fontSize), + ), + ), + ); + }, + itemCount: count, + ); + } +} \ No newline at end of file diff --git a/packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart b/packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart new file mode 100644 index 00000000..0126e889 --- /dev/null +++ b/packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/8/18 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 268, +// "name": 'SliverMainAxisGroup 基本使用', +// "priority": 1, +// "subtitle": +// "【slivers】 : 子组件列表 【List】\n" +// "可结合 SliverPersistentHeader 实现分组,标题吸顶效果。", +// } +class ItemData { + final String groupName; + final List users; + + ItemData({required this.groupName, this.users = const []}); + + static List get testData => [ + ItemData(groupName: '幻将术士', users: ['梦小梦', '梦千']), + ItemData( + groupName: '幻将剑客', users: ['捷特', '龙少', '莫向阳', '何解连', '浪封', '梦飞烟']), + ItemData(groupName: '幻将弓者', users: ['巫缨', '巫妻孋', '摄王', '裔王', '梦童']), + ItemData( + groupName: '其他', users: List.generate(20, (index) => '小兵$index')), + ]; +} + +class SliverMainAxisGroupDemo extends StatelessWidget{ + const SliverMainAxisGroupDemo({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 300, + child: CustomScrollView( + slivers: ItemData.testData.map(_buildGroup).toList(), + ), + ); + } + + Widget _buildGroup(ItemData itemData) { + return SliverMainAxisGroup(slivers: [ + SliverPersistentHeader( + pinned: true, + delegate: _HeaderDelegate(itemData.groupName), + ), + SliverList( + // tag2 + delegate: SliverChildBuilderDelegate( + (_, index) => _buildItemByUser(itemData.users[index]), + childCount: itemData.users.length, + ), + ), + ]); + } + + Widget _buildItemByUser(String user) { + return Container( + alignment: Alignment.center, + height: 56, + child: Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 20, right: 10.0), + child: FlutterLogo(size: 30), + ), + Text( + user, + style: const TextStyle(fontSize: 16), + ), + ], + ), + ); + } +} + +class _HeaderDelegate extends SliverPersistentHeaderDelegate { + const _HeaderDelegate(this.title); + + final String title; + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + return Container( + alignment: Alignment.centerLeft, + color: const Color(0xffF6F6F6), + padding: const EdgeInsets.only(left: 20), + height: 40, + child: Text(title)); + } + + @override + double get maxExtent => minExtent; + + @override + double get minExtent => 40; + + @override + bool shouldRebuild(covariant _HeaderDelegate oldDelegate) => title!=oldDelegate.title; +} \ No newline at end of file diff --git a/packages/widgets/lib/exp/sliver_unit.dart b/packages/widgets/lib/exp/sliver_unit.dart index 290cb253..5e235960 100644 --- a/packages/widgets/lib/exp/sliver_unit.dart +++ b/packages/widgets/lib/exp/sliver_unit.dart @@ -25,3 +25,8 @@ export '../Sliver/SliverIgnorePointer/node1_base.dart'; export '../Sliver/SliverAnimatedList/node1_base.dart'; export '../Sliver/SliverLayoutBuilder/node1_base.dart'; export '../Sliver/SliverWithKeepAliveWidget/node1_base.dart'; +export '../Sliver/DecoratedSliver/node1.dart'; +export '../Sliver/SliverConstrainedCrossAxis/node1.dart'; +export '../Sliver/SliverCrossAxisExpanded/node1.dart'; +export '../Sliver/SliverCrossAxisGroup/node1.dart'; +export '../Sliver/SliverMainAxisGroup/node1.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index e7868270..b5576b3c 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -1398,6 +1398,26 @@ class WidgetsMap { const MagnifierCircleShape(), const MagnifierStarShape(), ]; + case "DecoratedSliver": + return [ + const DecorationSliverDemo(), + ]; + case "SliverConstrainedCrossAxis": + return [ + const SliverConstrainedCrossAxisDemo(), + ]; + case "SliverCrossAxisExpanded": + return [ + const SliverCrossAxisExpandedDemo(), + ]; + case "SliverCrossAxisGroup": + return [ + const SliverCrossAxisGroupDemo(), + ]; + case "SliverMainAxisGroup": + return [ + const SliverMainAxisGroupDemo(), + ]; default: return []; } From f9acaf31c5d7ea90c8f64dad5cb5aa6c0e8e4601 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 10 Sep 2023 15:51:39 +0800 Subject: [PATCH 033/149] =?UTF-8?q?=E6=9B=B4=E6=96=B0db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 1175552 -> 1359872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flutter.db b/assets/flutter.db index d586a95d150c5ec438844e596c365884bdceb421..78acb9ce2cf9d7d122820cdd48fe58790546f8fa 100644 GIT binary patch delta 170063 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 delta 680 zcmZ{ize@u#6vwY;dj4!vH*rx1-Ky_h?#^5XI|`kII#{cK+d3i5MlGKye&ECAnYL1gzIA7dwS?#`kyH?Ee%;BH> zgTL@+o@Gndl|lwvhi;Zt@8(tlQSo6F0THARz9>UnM%c!%^4F+jr}q zqhq2H(OMN^ZPZ)i*hC}rLwi+iRA=|pL<1CPk7}c^`P-{NF`}wA>b==r9?S``k77ix zWYpE(g*hKE7;ypGsQP|)7?l!3d#in;yw;hCu48DgDz#A$ts@f+k?zFuSRl1g^#k() zQeb4Cs&8)E;1wKNrQyGLaxYWH-2WRVEbXu~N4Ufo!H7KJ5#z)JF-c4j)5Hu>Ac_Ph LN{=j^{i=QgK~ku` From 259d4c10a06c3a8761dc92dd2ecd96d69b5032cb Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 21 Sep 2023 09:04:27 +0800 Subject: [PATCH 034/149] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- android/app/build.gradle | 2 +- android/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../particle/split_img/split_image.dart | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- packages/app/pubspec.yaml | 8 +- packages/app_update/lib/bloc/bloc.dart | 2 +- packages/app_update/pubspec.yaml | 10 +- packages/artifact/pubspec.yaml | 8 +- packages/authentication/pubspec.yaml | 6 +- packages/components/pubspec.yaml | 2 +- packages/storage/pubspec.yaml | 9 +- .../utils/lib/src/http_utils/http_util.dart | 6 +- packages/utils/pubspec.yaml | 2 +- packages/widget_module/pubspec.yaml | 4 +- pubspec.lock | 186 ++++++++---------- pubspec.yaml | 52 +++-- 18 files changed, 162 insertions(+), 158 deletions(-) diff --git a/README.md b/README.md index 35810892..7efb337e 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ --- -> 当前Flutter 版本 +#### 当前Flutter 版本 ``` Flutter 3.13.3 • channel stable • https://github.com/flutter/flutter.git @@ -37,6 +37,15 @@ Engine • revision b8d35810e9 Tools • Dart 3.1.1 • DevTools 2.25.0 ``` +#### 构建命令,产出应用 + +> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi +> iOS 打包应用: flutter build ios +> Windows 打包应用: flutter build windows +> Macos 打包应用: flutter build macos +> Linux 打包应用: flutter build linux +> web 打包应用: flutter build web + --- #### MacOS 桌面版本组件界面 diff --git a/android/app/build.gradle b/android/app/build.gradle index 28483e94..a3efbb85 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -51,7 +51,7 @@ android { multiDexEnabled true archivesBaseName = "FlutterUnit.apk" ndk { - abiFilters 'arm64-v8a' +// abiFilters 'arm64-v8a' // abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } } diff --git a/android/build.gradle b/android/build.gradle index e66d1745..c3fc3e20 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.8.10' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:7.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 55be9291..0bc3d49c 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,5 @@ 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-all.zip diff --git a/lib/painter_system/particle/split_img/split_image.dart b/lib/painter_system/particle/split_img/split_image.dart index ca9f1219..efd4fefb 100644 --- a/lib/painter_system/particle/split_img/split_image.dart +++ b/lib/painter_system/particle/split_img/split_image.dart @@ -75,7 +75,7 @@ class _SplitImageState extends State with SingleTickerProviderStateM pm.particles.clear(); ByteData data = await rootBundle.load("assets/images/flutter.png"); List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - image.Image? imageSrc = image.decodeImage(bytes); + image.Image? imageSrc = image.decodeImage(Uint8List.fromList(bytes)); if(imageSrc==null) return; diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index d5c75ea7..56911c68 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,10 +7,10 @@ import Foundation import connectivity_plus import package_info_plus -import path_provider_macos +import path_provider_foundation import screen_retriever import share_plus -import shared_preferences_macos +import shared_preferences_foundation import sqflite import url_launcher_macos import window_manager diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index d788b846..b002e1a1 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -10,10 +10,10 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - equatable: ^2.0.3 # 相等辅助 - shared_preferences: ^2.0.13 # xml 固化 - connectivity_plus: ^4.0.1 + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + shared_preferences: ^2.2.1 # xml 固化 + connectivity_plus: ^4.0.2 storage: path: ../storage widget_repository: diff --git a/packages/app_update/lib/bloc/bloc.dart b/packages/app_update/lib/bloc/bloc.dart index 0da98654..bb31221a 100644 --- a/packages/app_update/lib/bloc/bloc.dart +++ b/packages/app_update/lib/bloc/bloc.dart @@ -51,7 +51,7 @@ class UpdateBloc extends Bloc { void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ id = await RUpgrade.upgrade(event.appInfo.appUrl, - fileName: '${event.appInfo.appName}.apk', isAutoRequestInstall: true); + fileName: '${event.appInfo.appName}.apk',); subscription = RUpgrade.stream.listen((DownloadInfo info) { double progress = (info.percent ?? 0) / 100; if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { diff --git a/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml index 2b6f4573..cc10eafe 100644 --- a/packages/app_update/pubspec.yaml +++ b/packages/app_update/pubspec.yaml @@ -10,11 +10,11 @@ environment: dependencies: flutter: sdk: flutter - equatable: ^2.0.3 # 相等辅助 - flutter_bloc: ^8.0.1 # 状态管理 - shared_preferences: ^2.0.13 # xml 固化 - r_upgrade: ^0.3.8+2 # 应用升级 - package_info_plus: ^4.0.1 + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + shared_preferences: ^2.2.1 # xml 固化 + r_upgrade: ^0.4.2 # 应用升级 + package_info_plus: ^4.0.2 utils: path: ../utils app: diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 7f10db0e..542de1d3 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -10,10 +10,10 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - dio: ^4.0.4 # 网络请求 - webview_flutter: ^4.2.2 - url_launcher: ^6.1.9 # url + flutter_bloc: ^8.1.3 # 状态管理 + dio: ^5.3.2 # 网络请求 + webview_flutter: ^4.2.4 + url_launcher: ^6.1.14 # url refresh: ^1.0.1 storage: path: ../storage diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index b996eb33..c5541982 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -10,9 +10,9 @@ environment: dependencies: flutter: sdk: flutter - equatable: ^2.0.3 # 相等辅助 - flutter_bloc: ^8.0.1 # 状态管理 - shared_preferences: ^2.0.13 # xml 固化 + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + shared_preferences: ^2.2.1 # xml 固化 utils: path: ../utils app_update: diff --git a/packages/components/pubspec.yaml b/packages/components/pubspec.yaml index d5fd45b7..e6a0f611 100644 --- a/packages/components/pubspec.yaml +++ b/packages/components/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_spinkit: ^5.1.0 # loading + flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.6.4 # markdown dev_dependencies: flutter_test: diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 1e9ae9cc..13814716 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -10,10 +10,11 @@ environment: dependencies: flutter: sdk: flutter - sqflite: ^2.0.2+1 # 数据库 - sqflite_common_ffi: ^2.1.1 # 数据库 - path_provider: ^2.0.11 # 路径 - shared_preferences: ^2.0.13 # xml 固化 + sqflite: ^2.3.0 # 数据库 + sqflite_common_ffi: ^2.3.0+2 # 数据库 + shared_preferences: ^2.2.1 # xml 固化 + path_provider: ^2.1.1 # 路径 + widget_repository: path: ../widget_repository artifact: diff --git a/packages/utils/lib/src/http_utils/http_util.dart b/packages/utils/lib/src/http_utils/http_util.dart index 5e6c3579..e0b734e5 100644 --- a/packages/utils/lib/src/http_utils/http_util.dart +++ b/packages/utils/lib/src/http_utils/http_util.dart @@ -2,9 +2,9 @@ import 'package:dio/dio.dart'; import 'token_interceptor.dart'; -const int _kReceiveTimeout = 5000; -const int _kSendTimeout = 5000; -const int _kConnectTimeout = 5000; +const Duration _kReceiveTimeout = Duration(milliseconds: 5000); +const Duration _kSendTimeout = Duration(milliseconds: 5000); +const Duration _kConnectTimeout = Duration(milliseconds: 5000); class HttpUtil { TokenInterceptors? tokenInterceptors; diff --git a/packages/utils/pubspec.yaml b/packages/utils/pubspec.yaml index fc01dec4..9e3d7896 100644 --- a/packages/utils/pubspec.yaml +++ b/packages/utils/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - dio: ^4.0.4 # 网络请求 + dio: ^5.3.2 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 dev_dependencies: flutter_test: diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index 1d3558b7..00b635fc 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -11,8 +11,8 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.0.1 # 状态管理 - equatable: ^2.0.3 # 相等辅助 + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 widget_repository: path: ../widget_repository storage: diff --git a/pubspec.lock b/pubspec.lock index 6ba6a182..10e1f028 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -19,10 +19,10 @@ packages: dependency: "direct main" description: name: archive - sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.6" + version: "3.3.9" args: dependency: transitive description: @@ -57,10 +57,10 @@ packages: dependency: transitive description: name: bloc - sha256: bd4f8027bfa60d96c8046dec5ce74c463b2c918dce1b0d36593575995344534a + sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.0" + version: "8.1.2" boolean_selector: dependency: transitive description: @@ -104,10 +104,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "8599ae9edca5ff96163fca3e36f8e481ea917d1e71cdad912c084b5579913f34" + sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.1" + version: "4.0.2" connectivity_plus_platform_interface: dependency: transitive description: @@ -168,10 +168,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8" + sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197 url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.6" + version: "5.3.2" equatable: dependency: "direct main" description: @@ -208,10 +208,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c7a8e25ca60e7f331b153b0cb3d405828f18d3e72a6fa1d9440c86556fffc877 + sha256: be325344c1f3070354a1d84a231a1ba75ea85d413774ec4bdf444c023342e030 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.3.0" + version: "5.5.0" flutter: dependency: "direct main" description: flutter @@ -221,10 +221,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "890c51c8007f0182360e523518a0c732efb89876cb4669307af7efada5b55557" + sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.1" + version: "8.1.3" flutter_lints: dependency: "direct dev" description: @@ -258,10 +258,10 @@ packages: dependency: "direct main" description: name: flutter_spinkit - sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8" + sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e url: "https://pub.flutter-io.cn/" source: hosted - version: "5.1.0" + version: "5.2.0" flutter_star: dependency: "direct main" description: @@ -274,10 +274,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: b9be7260c1fdbe0090a11d9d356fc2c88e14cf33407fc0c1829d76ab13808035 + sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "2.0.7" flutter_test: dependency: "direct dev" description: flutter @@ -308,10 +308,10 @@ packages: dependency: "direct main" description: name: image - sha256: f6ffe2895e3c86c6ad5a27e6302cf807403463e397cb2f0c580f619ac2fa588b + sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf url: "https://pub.flutter-io.cn/" source: hosted - version: "3.2.2" + version: "4.0.17" intl: dependency: "direct main" description: @@ -404,10 +404,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" + sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.1" + version: "4.1.0" package_info_plus_platform_interface: dependency: transitive description: @@ -436,66 +436,58 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "050e8e85e4b7fecdf2bb3682c1c64c4887a183720c802d323de8a5fd76d372dd" + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.22" - path_provider_ios: + version: "2.2.0" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - sha256: "03d639406f5343478352433f00d3c4394d52dac8df3d847869c5e2333e0bbce8" + name: path_provider_foundation + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.11" + version: "2.3.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - sha256: "2a97e7fbb7ae9dcd0dfc1220a78e9ec3e71da691912e617e8715ff2a13086ae8" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.6" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.5" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6 + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.6" + version: "2.2.1" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.1.0" + version: "5.4.0" platform: dependency: "direct main" description: @@ -540,10 +532,10 @@ packages: dependency: "direct main" description: name: r_upgrade - sha256: be460ed1d2bf3b444a731aa2eeb38751faaef91097fed4bf9d138d3214b98999 + sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.8+2" + version: "0.4.2" refresh: dependency: "direct main" description: @@ -556,90 +548,82 @@ packages: dependency: transitive description: name: screen_retriever - sha256: "9c3839c4eb80807cd8210afa3c84a177ba00aef9f9b7b74ad92d3a0ab1d7e7ed" + sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.1.5" + version: "0.1.9" share_plus: dependency: "direct main" description: name: share_plus - sha256: "44fc0bc2d35a8fafa1b564e1c6888bdc4fbb2d0197e4a4c21bac0e66123be9cd" + sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11" url: "https://pub.flutter-io.cn/" source: hosted - version: "7.0.1" + version: "7.1.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" + sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.2.1" + version: "3.3.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "76917b7d4b9526b2ba416808a7eb9fb2863c1a09cf63ec85f1453da240fa818a" + sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.15" + version: "2.2.1" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8e251f3c986002b65fed6396bce81f379fb63c27317d49743cf289fd0fd1ab97" + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.14" - shared_preferences_ios: + version: "2.2.1" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - sha256: "585a14cefec7da8c9c2fb8cd283a3bb726b4155c0952afe6a0caaa7b2272de34" + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.3.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "28aefc1261746e7bad3d09799496054beb84e8c4ffcdfed7734e17b4ada459a5" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.1" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - sha256: fbb94bf296576f49be37a1496d5951796211a8db0aa22cc0d68c46440dad808c + sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.4" + version: "2.3.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.0" + version: "2.3.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.4" + version: "2.2.1" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "97f7ab9a7da96d9cf19581f5de520ceb529548498bd6b5e0ccd02d68a0d15eba" + sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.3.1" sky_engine: dependency: transitive description: flutter @@ -657,34 +641,34 @@ packages: dependency: "direct main" description: name: sqflite - sha256: d21c022832f139b89922738e200c07387a49c549bf36c35654418e19ff76d161 + sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0+3" + version: "2.3.0" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "0c21a187d645aa65da5be6997c0c713eed61e049158870ae2de157e6897067ab" + sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.0+2" + version: "2.5.0" sqflite_common_ffi: dependency: "direct main" description: name: sqflite_common_ffi - sha256: "9c922744759dc8364ae724af2620acf25aba2e7756aae7844b98649e6fd29f11" + sha256: "0d5cc1be2eb18400ac6701c31211d44164393aa75886093002ecdd947be04f93" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0+1" + version: "2.3.0+2" sqlite3: dependency: transitive description: name: sqlite3 - sha256: db6350456720a4088a364bbe02052d43056a5ffbd4816fe9d28310dcfbe0dc05 + sha256: db65233e6b99e99b2548932f55a987961bc06d82a31a0665451fa0b4fff4c3fb url: "https://pub.flutter-io.cn/" source: hosted - version: "1.9.1" + version: "2.1.0" stack_trace: dependency: transitive description: @@ -768,10 +752,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e8f2efc804810c0f2f5b485f49e7942179f56eabcfe81dce3387fec4bb55876b + sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.9" + version: "6.1.14" url_launcher_android: dependency: transitive description: @@ -847,26 +831,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "09562ef5f47aa84f6567495adb6b9cb2a3192b82c352623b8bd00b300d62603b" + sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.7" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "886e57742644ebed024dc3ade29712e37eea1b03d294fb314c0a3386243fe5a6" + sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.7" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "5d9010c4a292766c55395b2288532579a85673f8148460d1e233d98ffe10d24e" + sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "1.1.7" vector_math: dependency: transitive description: @@ -887,10 +871,10 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00" + sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.2.2" + version: "4.2.4" webview_flutter_android: dependency: transitive description: @@ -940,18 +924,18 @@ packages: dependency: transitive description: name: win32 - sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" + sha256: "7dacfda1edcca378031db9905ad7d7bd56b29fd1a90b0908b71a52a12c41e36b" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.1.4" + version: "5.0.3" window_manager: dependency: "direct main" description: name: window_manager - sha256: d812d3189d23465d2e94baa2505a4462b46dde4939012ff370711c6897d747ae + sha256: "6ee795be9124f90660ea9d05e581a466de19e1c89ee74fc4bf528f60c8600edd" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.9" + version: "0.3.6" wrapper: dependency: "direct main" description: @@ -972,10 +956,10 @@ packages: dependency: transitive description: name: xml - sha256: ac0e3f4bf00ba2708c33fbabbbe766300e509f8c82dbd4ab6525039813f7e2fb + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.0" + version: "6.3.0" yaml: dependency: transitive description: @@ -994,4 +978,4 @@ packages: version: "1.0.1" sdks: dart: ">=3.1.0-185.0.dev <4.0.0" - flutter: ">=3.7.0-0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 90df4d4a..f1b239fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,38 +15,48 @@ dependencies: flutter_localizations: sdk: flutter cupertino_icons: ^1.0.4 - refresh: ^1.0.1 - flutter_bloc: ^8.0.1 # 状态管理 - stream_transform: ^2.0.0 - equatable: ^2.0.3 # 相等辅助 - archive: ^3.3.6 # 解压 - package_info_plus: ^4.0.1 # 应用包信息 - r_upgrade: ^0.3.8+2 # 应用升级 - webview_flutter: ^4.2.2 - sqflite: ^2.0.2+1 # 数据库 - sqflite_common_ffi: ^2.1.1 # 数据库 - shared_preferences: ^2.0.13 # xml 固化 - path_provider: ^2.0.11 # 路径 - dio: ^4.0.4 # 网络请求 + + + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + stream_transform: ^2.1.0 + + archive: ^3.3.9 # 解压 + package_info_plus: ^4.1.0 # 应用包信息 + r_upgrade: ^0.4.2 # 应用升级 + webview_flutter: ^4.2.4 + + sqflite: ^2.3.0 # 数据库 + sqflite_common_ffi: ^2.3.0+2 # 数据库 + shared_preferences: ^2.2.1 # xml 固化 + path_provider: ^2.1.1 # 路径 + + dio: ^5.3.2 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 + connectivity_plus: ^4.0.2 + refresh: ^1.0.1 toggle_rotate: ^1.0.1 flutter_star: ^1.0.2 # 星星组件 dash_painter: ^1.0.2 wrapper: ^1.0.2 yaml_modify: ^1.0.1 - url_launcher: ^6.1.9 # url - share_plus: ^7.0.1 # 文字分享 - flutter_svg: ^2.0.1 + + url_launcher: ^6.1.14 # url + share_plus: ^7.1.0 # 文字分享 + + flutter_svg: ^2.0.7 intl: ^0.18.0 platform: ^3.1.0 - image: ^3.1.0 - flutter_spinkit: ^5.1.0 # loading + image: ^4.0.17 + flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.6.4 # markdown # file_selector: ^0.9.2+2 - file_picker: ^5.2.5 - window_manager: ^0.2.8 #桌面尺寸 - connectivity_plus: ^4.0.1 + file_picker: ^5.5.0 + window_manager: ^0.3.6 #桌面尺寸 + + + widget_repository: path: packages/widget_repository utils: From dc9cd7e2b5a383694c9a62223d68405d174341bb Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 21 Sep 2023 09:07:12 +0800 Subject: [PATCH 035/149] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7efb337e..ebbce791 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,12 @@ Tools • Dart 3.1.1 • DevTools 2.25.0 #### 构建命令,产出应用 -> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi -> iOS 打包应用: flutter build ios -> Windows 打包应用: flutter build windows -> Macos 打包应用: flutter build macos -> Linux 打包应用: flutter build linux -> web 打包应用: flutter build web +> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi +> iOS 打包应用: flutter build ios +> Windows 打包应用: flutter build windows +> Macos 打包应用: flutter build macos +> Linux 打包应用: flutter build linux +> web 打包应用: flutter build web --- From b6b3f60d8fbd7adb5d3b8693e0a94106e3e5d67e Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 13 Oct 2023 11:34:54 +0800 Subject: [PATCH 036/149] change_notifier_01 --- .../listenable/change_notifier_01/main.dart | 30 ++++++++++ .../notifier/progress_value_notifier.dart | 17 ++++++ .../page/detail/detail_progress_view.dart | 49 ++++++++++++++++ .../page/detail/download_detail.dart | 17 ++++++ .../page/home/home_page.dart | 58 +++++++++++++++++++ .../page/home/home_progress_view.dart | 49 ++++++++++++++++ 6 files changed, 220 insertions(+) create mode 100644 lib/awesome/listenable/change_notifier_01/main.dart create mode 100644 lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart create mode 100644 lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart create mode 100644 lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart create mode 100644 lib/awesome/listenable/change_notifier_01/page/home/home_page.dart create mode 100644 lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart diff --git a/lib/awesome/listenable/change_notifier_01/main.dart b/lib/awesome/listenable/change_notifier_01/main.dart new file mode 100644 index 00000000..23c687f4 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/main.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +import 'page/home/home_page.dart'; + +void main(){ + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const ChangeNotifierHome01(), + ); + } +} + + + + + + + diff --git a/lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart b/lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart new file mode 100644 index 00000000..97f90260 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +ProgressValueNotifier progress = ProgressValueNotifier(); + +class ProgressValueNotifier with ChangeNotifier{ + + double _value = 0; + + double get value =>_value; + + String get valueStr => '${(value*100).toStringAsFixed(1)}%'; + + set value(double value){ + _value = value.clamp(0, 1); + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart b/lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart new file mode 100644 index 00000000..39cd9220 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart @@ -0,0 +1,49 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/progress_value_notifier.dart'; + +class DetailProgressView extends StatefulWidget { + + const DetailProgressView({super.key}); + + @override + State createState() => _DetailProgressViewState(); +} + +class _DetailProgressViewState extends State { + + @override + void initState() { + super.initState(); + progress.addListener(_update); + } + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 200, + height: 50, + child: LinearProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr,style: TextStyle(color: Colors.white),) + ], + ); + } + + void _update() { + setState(() {}); + } + + @override + void dispose() { + progress.removeListener(_update); + super.dispose(); + } +} diff --git a/lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart b/lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart new file mode 100644 index 00000000..212edbc1 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +import 'detail_progress_view.dart'; + +class DownloadDetailPage extends StatelessWidget { + const DownloadDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('下载详情页'), + ), + body: Center(child: DetailProgressView()), + ); + } +} diff --git a/lib/awesome/listenable/change_notifier_01/page/home/home_page.dart b/lib/awesome/listenable/change_notifier_01/page/home/home_page.dart new file mode 100644 index 00000000..e2fc4ab3 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/page/home/home_page.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import '../../notifier/progress_value_notifier.dart'; +import '../detail/download_detail.dart'; +import 'home_progress_view.dart'; + +class ChangeNotifierHome01 extends StatefulWidget { + const ChangeNotifierHome01({super.key}); + + @override + State createState() => _ChangeNotifierHome01State(); +} + +class _ChangeNotifierHome01State extends State { + + TextEditingController c = TextEditingController(); + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: FloatingActionButton( + onPressed: _startTimer, + child: const Icon(Icons.restart_alt), + ), + appBar: AppBar( + title: const Text('下载进度通知模拟'), + actions: [ + IconButton(onPressed: (){ + Navigator.of(context).push(MaterialPageRoute(builder: (_)=>const DownloadDetailPage())); + }, icon: const Icon(Icons.info_outline)) + ], + ), + body: const Center(child: HomeProgressView()), + ); + } + + Timer? _timer; + + void _startTimer(){ + if(_timer!=null) return; + if(progress.value==1.0){ + progress.value=0; + } + print("======${progress.value==1.0}======"); + _timer = Timer.periodic(const Duration(milliseconds: 200),_updateProgress); + } + + + void _updateProgress(Timer timer) { + if(progress.value>=1.0){ + timer.cancel(); + _timer = null; + return; + } + progress.value += 0.01; + } +} + diff --git a/lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart b/lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart new file mode 100644 index 00000000..555ef740 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart @@ -0,0 +1,49 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/progress_value_notifier.dart'; + +class HomeProgressView extends StatefulWidget { + + const HomeProgressView({super.key}); + + @override + State createState() => _HomeProgressViewState(); +} + +class _HomeProgressViewState extends State { + + @override + void initState() { + super.initState(); + progress.addListener(_update); + } + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 100, + height: 100, + child: CircularProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr) + ], + ); + } + + void _update() { + setState(() {}); + } + + @override + void dispose() { + progress.removeListener(_update); + super.dispose(); + } +} From 8fd4103289ee768864d3a1a206991209b18093a6 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Oct 2023 07:48:49 +0800 Subject: [PATCH 037/149] change_notifier_01 --- .../lib/StatelessWidget/AboutListTile/node1_base.dart | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart index 3d057702..72c6e494 100644 --- a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart @@ -1,8 +1,9 @@ +import 'package:flutter/material.dart'; + /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: - +/// 说明: // { // "widgetId": 193, // "name": 'AboutListTile基本使用', @@ -16,8 +17,6 @@ // "【aboutBoxChildren】 : 弹框内容组件 【List】", // } -import 'package:flutter/material.dart'; - class AboutListTileDemo extends StatelessWidget { const AboutListTileDemo({Key? key}) : super(key: key); @@ -34,7 +33,7 @@ class AboutListTileDemo extends StatelessWidget { padding: EdgeInsets.all(10.0), child: Text( ' FlutterUnit是【张风捷特烈】的开源项目,' - '收录Flutter的200+组件,并附加详细介绍以及操作交互,' + '收录Flutter的300+组件,并附加详细介绍以及操作交互,' '希望帮助广大编程爱好者入门Flutter。' '更多知识可以关注掘金账号、公众号【编程之王】。', style: TextStyle(color: Color(0xff999999), fontSize: 16), From ea0a0603e8e3df6eae9f9de5bea8a8605a69f492 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Oct 2023 15:51:13 +0800 Subject: [PATCH 038/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/flutter_unit.dart | 46 ++++---- .../desk_ui/unit_desk_navigation.dart | 46 +++++++- lib/point_system/api/issues_api.dart | 2 +- .../views/desk_ui/desk_point_page.dart | 9 +- packages/algorithm/.gitignore | 30 +++++ packages/algorithm/.metadata | 10 ++ packages/algorithm/CHANGELOG.md | 3 + packages/algorithm/LICENSE | 1 + packages/algorithm/README.md | 39 +++++++ packages/algorithm/analysis_options.yaml | 4 + packages/algorithm/lib/algorithm.dart | 8 ++ .../lib/src/algorithm/sort/functions.dart | 46 ++++++++ .../src/algorithm/sort/functions/bubble.dart | 19 +++ .../algorithm/sort/functions/cocktail.dart | 52 +++++++++ .../src/algorithm/sort/functions/comb.dart | 34 ++++++ .../src/algorithm/sort/functions/cycle.dart | 54 +++++++++ .../src/algorithm/sort/functions/gnome.dart | 22 ++++ .../src/algorithm/sort/functions/heap.dart | 38 ++++++ .../algorithm/sort/functions/insertion.dart | 19 +++ .../src/algorithm/sort/functions/merge.dart | 79 +++++++++++++ .../src/algorithm/sort/functions/oddEven.dart | 37 ++++++ .../algorithm/sort/functions/pigeonHole.dart | 33 ++++++ .../src/algorithm/sort/functions/quick.dart | 65 +++++++++++ .../algorithm/sort/functions/selection.dart | 18 +++ .../src/algorithm/sort/functions/shell.dart | 21 ++++ .../lib/src/data_scope/sort_config.dart | 28 +++++ .../algorithm/lib/src/data_scope/state.dart | 77 +++++++++++++ .../algorithm/lib/src/views/data_painter.dart | 61 ++++++++++ .../algorithm/lib/src/views/sort_bar.dart | 44 +++++++ .../algorithm/lib/src/views/sort_button.dart | 40 +++++++ .../algorithm/lib/src/views/sort_page.dart | 26 +++++ .../algorithm/lib/src/views/sort_setting.dart | 108 ++++++++++++++++++ packages/algorithm/pubspec.yaml | 55 +++++++++ packages/algorithm/test/utils_test.dart | 5 + .../lib/blocs/register/bloc.dart | 2 +- .../popable/drop_selectable_widget.dart | 59 ++++++---- pubspec.lock | 7 ++ pubspec.yaml | 2 + 38 files changed, 1196 insertions(+), 53 deletions(-) create mode 100644 packages/algorithm/.gitignore create mode 100644 packages/algorithm/.metadata create mode 100644 packages/algorithm/CHANGELOG.md create mode 100644 packages/algorithm/LICENSE create mode 100644 packages/algorithm/README.md create mode 100644 packages/algorithm/analysis_options.yaml create mode 100644 packages/algorithm/lib/algorithm.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/comb.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/heap.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/merge.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/quick.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/selection.dart create mode 100644 packages/algorithm/lib/src/algorithm/sort/functions/shell.dart create mode 100644 packages/algorithm/lib/src/data_scope/sort_config.dart create mode 100644 packages/algorithm/lib/src/data_scope/state.dart create mode 100644 packages/algorithm/lib/src/views/data_painter.dart create mode 100644 packages/algorithm/lib/src/views/sort_bar.dart create mode 100644 packages/algorithm/lib/src/views/sort_button.dart create mode 100644 packages/algorithm/lib/src/views/sort_page.dart create mode 100644 packages/algorithm/lib/src/views/sort_setting.dart create mode 100644 packages/algorithm/pubspec.yaml create mode 100644 packages/algorithm/test/utils_test.dart diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 3594ca75..069b544d 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -1,3 +1,4 @@ +import 'package:algorithm/algorithm.dart'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -17,27 +18,30 @@ class FlutterUnit extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder(builder: (_, state) { - return DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp( - // routes: , - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - onGenerateRoute: UnitRouters.generateRoute, - localizationsDelegates: GlobalMaterialLocalizations.delegates, - supportedLocales: const [ - Locale('zh', 'CN'), - ], - // themeMode: ThemeMode.light, - themeMode: state.themeMode, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), - // theme: ThemeData( - // primarySwatch: state.themeColor, - // fontFamily: state.fontFamily, - // ), - home: const StandardUnitSplash(), + return SortStateScope( + notifier: SortState(), + child: DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: MaterialApp( + // routes: , + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + onGenerateRoute: UnitRouters.generateRoute, + localizationsDelegates: GlobalMaterialLocalizations.delegates, + supportedLocales: const [ + Locale('zh', 'CN'), + ], + // themeMode: ThemeMode.light, + themeMode: state.themeMode, + darkTheme: AppTheme.darkTheme(state), + theme: AppTheme.lightTheme(state), + // theme: ThemeData( + // primarySwatch: state.themeColor, + // fontFamily: state.fontFamily, + // ), + home: const StandardUnitSplash(), + ), ), ); }); diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart index 038ceb85..f7996e3e 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_desk_navigation.dart @@ -1,3 +1,4 @@ +import 'package:algorithm/algorithm.dart'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/code_gen/code_gen_page.dart'; @@ -56,8 +57,11 @@ class _UnitDeskNavigationState extends State { selectedIndex: _currentIndex, onItemClick: _onItemClick, itemData: { //底栏图标 - "组件集录": TolyIcon.icon_layout, "收藏集录": TolyIcon.icon_star, - "绘制集录": Icons.palette, "代码生成": TolyIcon.icon_fast, + "组件集录": TolyIcon.icon_layout, + "收藏集录": TolyIcon.icon_star, + "绘制集录": Icons.palette, + "可视排序": Icons.sort, + "代码生成": TolyIcon.icon_fast, "要点集录": TolyIcon.icon_bug, }, ), @@ -71,6 +75,7 @@ class _UnitDeskNavigationState extends State { DeskWidgetPanel(), CollectPageAdapter(), GalleryUnit(), + DeskSortPage(), CodeGenPage(), DeskPointPage(), ], @@ -90,4 +95,41 @@ class _UnitDeskNavigationState extends State { } } +class DeskSortPage extends StatefulWidget { + const DeskSortPage({super.key}); + + @override + State createState() => _DeskSortPageState(); +} + +class _DeskSortPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + endDrawer: Drawer( + child: SortSettings(), + ), + body: Column( + children: [ + SimpleDeskTopBar( + leading: Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + tail: Row( + children: [ + SortBar(), + const Padding( + padding: EdgeInsets.symmetric(vertical: 18.0), + child: VerticalDivider( + width: 32, + ), + ) + ], + ), + ), + + Expanded(child: SortPage()), + ], + ), + ); + } +} diff --git a/lib/point_system/api/issues_api.dart b/lib/point_system/api/issues_api.dart index 6d2040df..86f51578 100644 --- a/lib/point_system/api/issues_api.dart +++ b/lib/point_system/api/issues_api.dart @@ -8,7 +8,7 @@ import 'package:flutter_unit/point_system/github_model/github_model.dart'; /// contact me by email 1981462002@qq.com /// 说明: -const kBaseUrl = 'http://119.45.173.197:8080/api/v1'; +const kBaseUrl = 'http://toly1994.com:8080/api/v1'; class IssuesApi { static Dio dio = Dio(BaseOptions(baseUrl: kBaseUrl)); diff --git a/lib/point_system/views/desk_ui/desk_point_page.dart b/lib/point_system/views/desk_ui/desk_point_page.dart index de454b66..58698a60 100644 --- a/lib/point_system/views/desk_ui/desk_point_page.dart +++ b/lib/point_system/views/desk_ui/desk_point_page.dart @@ -115,8 +115,10 @@ class IssuesTip extends StatelessWidget { class SimpleDeskTopBar extends StatelessWidget { final Widget? leading; + final Widget? tail; + final double height; - const SimpleDeskTopBar({super.key, this.leading}); + const SimpleDeskTopBar({super.key, this.leading,this.tail,this.height=64}); @override Widget build(BuildContext context) { @@ -126,8 +128,8 @@ class SimpleDeskTopBar extends StatelessWidget { return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.symmetric(horizontal: 20), - height: 64, - color: isDark?Color(0xff2C3036):Colors.white, + height: height, + color: isDark? Color(0xff2C3036):Colors.white, child: Row( children: [ if (leading != null) leading!, @@ -135,6 +137,7 @@ class SimpleDeskTopBar extends StatelessWidget { const SizedBox( width: 20, ), + if(tail!=null) tail!, const WindowButtons(), ], ), diff --git a/packages/algorithm/.gitignore b/packages/algorithm/.gitignore new file mode 100644 index 00000000..96486fd9 --- /dev/null +++ b/packages/algorithm/.gitignore @@ -0,0 +1,30 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/algorithm/.metadata b/packages/algorithm/.metadata new file mode 100644 index 00000000..6c08927e --- /dev/null +++ b/packages/algorithm/.metadata @@ -0,0 +1,10 @@ +# 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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: package diff --git a/packages/algorithm/CHANGELOG.md b/packages/algorithm/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/algorithm/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/algorithm/LICENSE b/packages/algorithm/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/algorithm/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/algorithm/README.md b/packages/algorithm/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/algorithm/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/algorithm/analysis_options.yaml b/packages/algorithm/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/algorithm/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/algorithm/lib/algorithm.dart b/packages/algorithm/lib/algorithm.dart new file mode 100644 index 00000000..43b1bd6e --- /dev/null +++ b/packages/algorithm/lib/algorithm.dart @@ -0,0 +1,8 @@ +library algorithm; + +export 'src/views/sort_page.dart'; +export 'src/views/sort_bar.dart'; +export 'src/views/sort_button.dart'; +export 'src/views/sort_setting.dart'; +export 'src/data_scope/sort_config.dart'; +export 'src/data_scope/state.dart'; \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions.dart b/packages/algorithm/lib/src/algorithm/sort/functions.dart new file mode 100644 index 00000000..7b7cef59 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions.dart @@ -0,0 +1,46 @@ +import 'functions/bubble.dart'; +import 'functions/cocktail.dart'; +import 'functions/comb.dart'; +import 'functions/cycle.dart'; +import 'functions/gnome.dart'; +import 'functions/heap.dart'; +import 'functions/insertion.dart'; +import 'functions/merge.dart'; +import 'functions/pigeonHole.dart'; +import 'functions/quick.dart'; +import 'functions/selection.dart'; +import 'functions/shell.dart'; + +typedef SortFunction = Future Function(List src, SortCallback callback); +typedef SortCallback = Future Function(List dist); + +Map sortFunctionMap = { + 'insertion': insertionSort, + 'bubble': bubbleSort, + 'cocktail': cocktailSort, + 'comb': combSort, + 'pigeonHole': pigeonHoleSort, + 'shell': shellSort, + 'selection': selectionSort, + 'gnome': gnomeSort, + 'cycle': cycleSort, + 'heap': heapSort, + 'quick': quickSort, + 'mergeSort': mergeSort, +}; + +Map sortNameMap = { + 'insertion': '插入排序', + 'bubble': '冒泡排序', + 'cocktail': '鸡尾酒排序(双向冒泡排序)', + 'comb': '梳排序', + 'pigeonHole': '鸽巢排序', + 'shell': '希尔排序', + 'selection': '选择排序', + 'gnome': '侏儒排序', + 'cycle': '循环排序', + 'heap': '堆排序', + 'quick': '快速排序', + 'mergeSort': '归并排序', +}; + diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart b/packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart new file mode 100644 index 00000000..3cf3c996 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart @@ -0,0 +1,19 @@ +import '../functions.dart'; + +///冒泡排序 +Future bubbleSort(List src, SortCallback callback ) async{ + //控制需要进行排序的次数。每一轮循环都会确定一个数字的最终位置。 + for (int i = 0; i < src.length; ++i) { + //遍历当前未排序的元素,通过相邻的元素比较并交换位置来完成排序。 + for (int j = 0; j < src.length - i - 1; ++j) { + //如果 _numbers[j] 大于 _numbers[j + 1],则交换它们的位置,确保较大的元素移到右边。 + if (src[j] > src[j + 1]) { + int temp = src[j]; + src[j] = src[j + 1]; + src[j + 1] = temp; + } + //实现一个延迟,以便在ui上展示排序的动画效果 + await callback(src); + } + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart b/packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart new file mode 100644 index 00000000..8c2d18cd --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart @@ -0,0 +1,52 @@ +import '../functions.dart'; + +///鸡尾酒排序(双向冒泡排序) +Future cocktailSort(List src, SortCallback callback ) async { + bool swapped = true; // 表示是否进行了交换 + int start = 0; // 当前未排序部分的起始位置 + int end = src.length; // 当前未排序部分的结束位置 + + // 开始排序循环,只有当没有进行交换时才会退出循环 + while (swapped == true) { + swapped = false; + + // 从左往右遍历需要排序的部分 + for (int i = start; i < end - 1; ++i) { + // 对每两个相邻元素进行比较 + if (src[i] > src[i + 1]) { + // 如果前面的元素大于后面的元素,则交换它们的位置 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + swapped = true; // 进行了交换 + } + + // 实现动画效果,延迟一段时间后更新数组状态 + await callback(src); + } + + // 如果没有进行交换,则说明已经排好序,退出循环 + if (swapped == false) break; + // 重设为false,准备进行下一轮排序 + swapped = false; + // 将end设置为上一轮排序的最后一个元素的位置 + end = end - 1; + + // 从右往左遍历需要排序的部分 + for (int i = end - 1; i >= start; i--) { + // 对每两个相邻元素进行比较 + if (src[i] > src[i + 1]) { + // 如果前面的元素大于后面的元素,则交换它们的位置 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + swapped = true; // 进行了交换 + } + + // 实现动画效果,延迟一段时间后更新数组状态 + await callback(src); + } + // 将start向右移一位,准备下一轮排序 + start = start + 1; + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/comb.dart b/packages/algorithm/lib/src/algorithm/sort/functions/comb.dart new file mode 100644 index 00000000..821f4a97 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/comb.dart @@ -0,0 +1,34 @@ +import '../functions.dart'; + +///梳排序(Comb Sort) +Future combSort(List src, SortCallback callback) async{ + int gap = src.length; + + bool swapped = true; + + // 当间隔不为1或存在交换时执行循环 + while (gap != 1 || swapped == true) { + // 通过缩小间隔来逐步将元素归位 + gap = getNextGap(gap); + swapped = false; + for (int i = 0; i < src.length - gap; i++) { + // 如果当前元素大于间隔位置上的元素,则交换它们的位置 + if (src[i] > src[i + gap]) { + int temp = src[i]; + src[i] = src[i + gap]; + src[i + gap] = temp; + swapped = true; + } + + // 实现一个延迟,以便在 UI 上展示排序的动画效果。 + await callback(src); + } + } +} + +int getNextGap(int gap) { + // 根据当前间隔值计算下一个间隔值 + gap = (gap * 10) ~/ 13; + if (gap < 1) return 1; + return gap; +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart b/packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart new file mode 100644 index 00000000..4bef6eb9 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart @@ -0,0 +1,54 @@ +import '../functions.dart'; + +///循环排序 +Future cycleSort(List src, SortCallback callback) async { + int writes = 0; + for (int cycleStart = 0; cycleStart <= src.length - 2; cycleStart++) { + int item = src[cycleStart]; + int pos = cycleStart; + + // 在未排序部分中寻找比当前元素小的元素个数 + for (int i = cycleStart + 1; i < src.length; i++) { + if (src[i] < item) pos++; + } + + // 如果当前元素已经在正确位置上,则跳过此次迭代 + if (pos == cycleStart) { + continue; + } + + // 将当前元素放置到正确的位置上,并记录写操作次数 + while (item == src[pos]) { + pos += 1; + } + if (pos != cycleStart) { + int temp = item; + item = src[pos]; + src[pos] = temp; + writes++; + } + + // 循环将位于当前位置的元素放置到正确的位置上 + while (pos != cycleStart) { + pos = cycleStart; + // 继续在未排序部分中寻找比当前元素小的元素个数 + for (int i = cycleStart + 1; i < src.length; i++) { + if (src[i] < item) pos += 1; + } + + // 将当前元素放置到正确的位置上,并记录写操作次数 + while (item == src[pos]) { + pos += 1; + } + if (item != src[pos]) { + int temp = item; + item = src[pos]; + src[pos] = temp; + writes++; + } + + // 添加延迟操作以展示排序过程 + await callback(src); + } + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart b/packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart new file mode 100644 index 00000000..5e08fc33 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart @@ -0,0 +1,22 @@ +import '../functions.dart'; + +///地精排序 (侏儒排序) +Future gnomeSort(List src, SortCallback callback) async { + int index = 0; + while (index < src.length) { + // 当 index 小于数组长度时执行循环 + if (index == 0) index++; + if (src[index] >= src[index - 1]) { + // 如果当前元素大于等于前面的元素,则将 index 加1 + index++; + } else { + // 否则,交换这两个元素,并将 index 减1(使得元素可以沉到正确位置) + int temp = src[index]; + src[index] = src[index - 1]; + src[index - 1] = temp; + index--; + } + await callback(src); + } + return; +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/heap.dart b/packages/algorithm/lib/src/algorithm/sort/functions/heap.dart new file mode 100644 index 00000000..9f5410b2 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/heap.dart @@ -0,0 +1,38 @@ +import '../functions.dart'; + +///堆排序 +Future heapSort(List src, SortCallback callback) async { + // 从最后一个非叶子节点开始,构建最大堆 + for (int i = src.length ~/ 2; i >= 0; i--) { + await heapify(src,callback, src.length, i); + } + + // 依次取出最大堆的根节点(最大值),并进行堆化 + for (int i = src.length - 1; i >= 0; i--) { + int temp = src[0]; + src[0] = src[i]; + src[i] = temp; + await heapify(src, callback,i, 0); + } +} + +Future heapify(List src, SortCallback callback, int n, int i) async{ + int largest = i; + int l = 2 * i + 1; // 左子节点索引 + int r = 2 * i + 2; // 右子节点索引 + + // 如果左子节点存在并且大于父节点,则更新最大值索引 + if (l < n && src[l] > src[largest]) largest = l; + + // 如果右子节点存在并且大于父节点或左子节点,则更新最大值索引 + if (r < n && src[r] > src[largest]) largest = r; + + // 如果最大值索引不等于当前节点索引,则交换节点值,并递归进行堆化 + if (largest != i) { + int temp = src[i]; + src[i] = src[largest]; + src[largest] = temp; + heapify(src,callback, n, largest); + } + await callback(src); +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart b/packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart new file mode 100644 index 00000000..b1c78144 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart @@ -0,0 +1,19 @@ +import '../functions.dart'; + +///插入排序 +Future insertionSort(List src, SortCallback callback) async { + for (int i = 1; i < src.length; i++) { + int temp = src[i]; // 将当前元素存储到临时变量 temp 中 + int j = i - 1; // j 表示已排序部分的最后一个元素的索引 + + // 在已排序部分从后往前查找,找到合适位置插入当前元素 + while (j >= 0 && temp < src[j]) { + src[j + 1] = src[j]; // 当前元素比已排序部分的元素小,将元素后移一位 + --j; // 向前遍历 + // 更新排序结果回调 + await callback(src); + } + src[j + 1] = temp; // 插入当前元素到已排序部分的正确位置 + await callback(src); + } +} diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/merge.dart b/packages/algorithm/lib/src/algorithm/sort/functions/merge.dart new file mode 100644 index 00000000..12135b46 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/merge.dart @@ -0,0 +1,79 @@ +import '../functions.dart'; + +//快速排序 +Future mergeSort(List src, SortCallback callback) async { + await _mergeSort(src,callback,0,src.length-1); +} + +///归并排序 +Future _mergeSort(List src, SortCallback callback,int leftIndex, int rightIndex) async { + // 定义一个名为 merge 的异步函数,用于合并两个有序子数组 + Future merge(int leftIndex, int middleIndex, int rightIndex) async { + // 计算左侧子数组和右侧子数组的大小 + int leftSize = middleIndex - leftIndex + 1; + int rightSize = rightIndex - middleIndex; + + // 创建左侧子数组和右侧子数组 + List leftList = List.generate(leftSize, (index) => 0); + List rightList = List.generate(rightSize, (index) => 0); + + // 将原始数组中的元素分别复制到左侧子数组和右侧子数组中 + for (int i = 0; i < leftSize; i++) { + leftList[i] = src[leftIndex + i]; + } + for (int j = 0; j < rightSize; j++) { + rightList[j] = src[middleIndex + j + 1]; + } + + // 初始化游标和索引 + int i = 0, j = 0; + int k = leftIndex; + + // 比较左侧子数组和右侧子数组的元素,并按顺序将较小的元素放入原始数组中 + while (i < leftSize && j < rightSize) { + if (leftList[i] <= rightList[j]) { + src[k] = leftList[i]; + i++; + } else { + src[k] = rightList[j]; + j++; + } + + await callback(src); + + k++; + } + + // 将左侧子数组或右侧子数组中剩余的元素放入原始数组中 + while (i < leftSize) { + src[k] = leftList[i]; + i++; + k++; + + await callback(src); + } + + while (j < rightSize) { + src[k] = rightList[j]; + j++; + k++; + + await callback(src); + } + } + + // 如果左索引小于右索引,则递归地对数组进行归并排序 + if (leftIndex < rightIndex) { + // 计算中间索引位置 + int middleIndex = (rightIndex + leftIndex) ~/ 2; + + // 分别对左侧子数组和右侧子数组进行归并排序 + await _mergeSort(src,callback,leftIndex, middleIndex); + await _mergeSort(src,callback,middleIndex + 1, rightIndex); + + await callback(src); + + // 合并两个有序子数组 + await merge(leftIndex, middleIndex, rightIndex); + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart b/packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart new file mode 100644 index 00000000..bd6f548a --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart @@ -0,0 +1,37 @@ +import '../functions.dart'; + +///奇偶排序(Odd-Even Sort) +Future oddEvenSort(List src, SortCallback callback) async { + bool isSorted = false; + + while (!isSorted) { + // 当 isSorted 为 false 时执行循环 + isSorted = true; // 先假设数组已经排好序 + + for (int i = 1; i <= src.length - 2; i = i + 2) { + // 对奇数索引位置进行比较 + if (src[i] > src[i + 1]) { + // 如果当前元素大于后面的元素,则交换它们的值 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + isSorted = false; // 若发生了交换,则说明数组仍未完全排序,将 isSorted 设为 false + await callback(src); + } + } + + for (int i = 0; i <= src.length - 2; i = i + 2) { + // 对偶数索引位置进行比较 + if (src[i] > src[i + 1]) { + // 如果当前元素大于后面的元素,则交换它们的值 + int temp = src[i]; + src[i] = src[i + 1]; + src[i + 1] = temp; + isSorted = false; + await callback(src); + } + } + } + + return; +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart b/packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart new file mode 100644 index 00000000..83bbce10 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart @@ -0,0 +1,33 @@ +import '../functions.dart'; + +///鸽巢排序 +Future pigeonHoleSort(List src, SortCallback callback ) async{ + int min = src[0]; + int max = src[0]; + int range, i, j, index; + + // 找到数组中的最大值和最小值 + for (int a = 0; a < src.length; a++) { + if (src[a] > max) max = src[a]; + if (src[a] < min) min = src[a]; + } + + // 计算鸽巢的个数 + range = max - min + 1; + List p = List.generate(range, (i) => 0); + + // 将数字分配到各个鸽巢中 + for (i = 0; i < src.length; i++) { + p[src[i] - min]++; + } + + index = 0; + + // 将鸽巢中的数字取出,重新放回到数组中 + for (j = 0; j < range; j++) { + while (p[j]-- > 0) { + src[index++] = j + min; + await callback(src); + } + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/quick.dart b/packages/algorithm/lib/src/algorithm/sort/functions/quick.dart new file mode 100644 index 00000000..25b9685f --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/quick.dart @@ -0,0 +1,65 @@ +import '../functions.dart'; + +//快速排序 +Future quickSort(List src, SortCallback callback) async { + await _quickSort(src,callback,0,src.length-1); +} + +///快速排序 +Future _quickSort(List src, SortCallback callback,int leftIndex,int rightIndex) async { + // 定义一个名为 _partition 的异步函数,用于划分数组,并返回划分后的基准元素的索引位置 + Future _partition(int left, int right) async { + // 选择中间位置的元素作为基准元素 + int p = (left + (right - left) / 2).toInt(); + + // 交换基准元素和最右边的元素 + var temp = src[p]; + src[p] = src[right]; + src[right] = temp; + await callback(src); + + // 初始化游标 cursor + int cursor = left; + + // 遍历数组并根据基准元素将元素交换到左侧或右侧 + for (int i = left; i < right; i++) { + if (cf(src[i], src[right]) <= 0) { + // 如果当前元素小于等于基准元素,则交换它和游标位置的元素 + var temp = src[i]; + src[i] = src[cursor]; + src[cursor] = temp; + cursor++; + await callback(src); + } + } + + // 将基准元素放置在游标位置 + temp = src[right]; + src[right] = src[cursor]; + src[cursor] = temp; + + await callback(src); + + return cursor; // 返回基准元素的索引位置 + } + + // 如果左索引小于右索引,则递归地对数组进行快速排序 + if (leftIndex < rightIndex) { + int p = await _partition(leftIndex, rightIndex); + + await _quickSort(src,callback,leftIndex, p - 1); // 对基准元素左侧的子数组进行快速排序 + + await _quickSort(src,callback, p + 1, rightIndex); // 对基准元素右侧的子数组进行快速排序 + } +} + +// 比较函数,用于判断两个元素的大小关系 +cf(int a, int b) { + if (a < b) { + return -1; // 若 a 小于 b,则返回 -1 + } else if (a > b) { + return 1; // 若 a 大于 b,则返回 1 + } else { + return 0; // 若 a 等于 b,则返回 0 + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/selection.dart b/packages/algorithm/lib/src/algorithm/sort/functions/selection.dart new file mode 100644 index 00000000..185dae21 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/selection.dart @@ -0,0 +1,18 @@ +import '../functions.dart'; + +///选择排序 +Future selectionSort(List src, SortCallback callback ) async { + for (int i = 0; i < src.length; i++) { + for (int j = i + 1; j < src.length; j++) { + // 遍历未排序部分,内层循环控制变量 j + if (src[i] > src[j]) { + // 判断当前元素是否比后续元素小 + int temp = src[j]; + // 交换当前元素和后续较小的元素 + src[j] = src[i]; + src[i] = temp; + } + await callback(src); + } + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/shell.dart b/packages/algorithm/lib/src/algorithm/sort/functions/shell.dart new file mode 100644 index 00000000..232f8724 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/sort/functions/shell.dart @@ -0,0 +1,21 @@ +import '../functions.dart'; + +///希尔排序 +Future shellSort(List src, SortCallback callback) async{ + //定义变量 gap 并初始化为数组长度的一半。每次循环完成后将 gap 减半直到等于 0。 + for (int gap = src.length ~/ 2; gap > 0; gap ~/= 2) { + //遍历每个子序列并进行插入排序。初始时从第一个子序列的第二个元素开始,即 i = gap,以 gap 为步长逐个遍历每个子序列。 + for (int i = gap; i < src.length; i += 1) { + //将当前遍历到的元素赋值给它 + int temp = src[i]; + //内部使用一个 for 循环来实现插入排序。 + //循环开始时定义变量 j 并将其初始化为当前遍历到的元素的下标。通过不断比较前后相隔 gap 的元素大小并交换位置,将当前元素插入到正确的位置。 + int j; + for (j = i; j >= gap && src[j - gap] > temp; j -= gap) { + src[j] = src[j - gap]; + } + src[j] = temp; + await callback(src); + } + } +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/data_scope/sort_config.dart b/packages/algorithm/lib/src/data_scope/sort_config.dart new file mode 100644 index 00000000..4cf0e8f0 --- /dev/null +++ b/packages/algorithm/lib/src/data_scope/sort_config.dart @@ -0,0 +1,28 @@ + +class SortConfig { + final int count; + final int seed; + final Duration duration; + final String name; + + SortConfig({ + this.count = 100, + this.duration = const Duration(microseconds: 1500), + this.seed = -1, + this.name = 'insertion', + }); + + SortConfig copyWith({ + int? count, + int? seed, + Duration? duration, + String? name, + }) => + SortConfig( + count:count??this.count, + seed:seed??this.seed, + duration:duration??this.duration, + name:name??this.name, + ); +} + diff --git a/packages/algorithm/lib/src/data_scope/state.dart b/packages/algorithm/lib/src/data_scope/state.dart new file mode 100644 index 00000000..d9f3b9d4 --- /dev/null +++ b/packages/algorithm/lib/src/data_scope/state.dart @@ -0,0 +1,77 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +import '../algorithm/sort/functions.dart'; +import 'sort_config.dart'; + +enum SortStatus{ + none, // 未操作 + sorting, // 排序中 + sorted, // 排序完成 +} + +class SortState with ChangeNotifier{ + + SortState(){ + reset(); + } + + SortStatus status = SortStatus.none; + + List data = []; + List stepData = []; + + SortConfig _config = SortConfig(); + SortConfig get config => _config; + Random random = Random(); + + set config(SortConfig config){ + _config = config; + reset(); + notifyListeners(); + } + + void reset(){ + data.clear(); + status = SortStatus.none; + notifyListeners(); + int count = config.count; + if(config.seed!=-1){ + random = Random(config.seed); + } + for (int i = 0; i < count; i++) { + //随机往数组中填值 + data.add(random.nextInt(1000)); + } + } + + void sort() async{ + status = SortStatus.sorting; + notifyListeners(); + Stopwatch stopwatch = Stopwatch()..start(); + SortFunction? sortFunction = sortFunctionMap[config.name]; + if(sortFunction!=null){ + await sortFunction(data,(arr) async { + await Future.delayed(config.duration); + notifyListeners(); + }); + } + status = SortStatus.sorted; + notifyListeners(); + stopwatch.stop(); + print("Sorting completed in ${stopwatch.elapsed.inMilliseconds} ms."); + } +} + +/// Provides the current [SortState] to descendant widgets in the tree. +class SortStateScope extends InheritedNotifier { + const SortStateScope({ + required super.notifier, + required super.child, + super.key, + }); + + static SortState of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/views/data_painter.dart b/packages/algorithm/lib/src/views/data_painter.dart new file mode 100644 index 00000000..ab568c72 --- /dev/null +++ b/packages/algorithm/lib/src/views/data_painter.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; + + + +class DataPainter extends CustomPainter{ + + final List data; + + DataPainter({required this.data}); + + @override + void paint(Canvas canvas, Size size) { + canvas.clipRect(Offset.zero&size); + double itemWidth = size.width/data.length; + double height = size.height; + + Paint paint = Paint(); + paint.strokeWidth = itemWidth; + paint.strokeCap = StrokeCap.round; + + for(int i=0;iAlertDialog()); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} diff --git a/packages/algorithm/lib/src/views/sort_button.dart b/packages/algorithm/lib/src/views/sort_button.dart new file mode 100644 index 00000000..7f5041f0 --- /dev/null +++ b/packages/algorithm/lib/src/views/sort_button.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +import '../data_scope/state.dart'; + +class SortButton extends StatelessWidget { + const SortButton({super.key}); + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + VoidCallback? action; + IconData icon; + Color color; + switch (state.status) { + case SortStatus.none: + icon = Icons.not_started_outlined; + color = Colors.green; + action = state.sort; + break; + case SortStatus.sorting: + icon = Icons.stop_circle_outlined; + color = Colors.grey; + action = null; + break; + case SortStatus.sorted: + icon = Icons.refresh; + color = Colors.black; + action = state.reset; + break; + } + + return GestureDetector( + onTap: action, + child: Icon( + icon, + color: color, + ), + ); + } +} diff --git a/packages/algorithm/lib/src/views/sort_page.dart b/packages/algorithm/lib/src/views/sort_page.dart new file mode 100644 index 00000000..ad78a5f4 --- /dev/null +++ b/packages/algorithm/lib/src/views/sort_page.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; + +import '../data_scope/state.dart'; +import 'data_painter.dart'; + +class SortPage extends StatelessWidget{ + const SortPage({super.key}); + + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + List numbers = state.data; + + return Scaffold( + + body: CustomPaint( + painter: DataPainter(data: numbers), + child: ConstrainedBox(constraints: BoxConstraints.expand()), + ), + ); + } +} + + diff --git a/packages/algorithm/lib/src/views/sort_setting.dart b/packages/algorithm/lib/src/views/sort_setting.dart new file mode 100644 index 00000000..ac3b012a --- /dev/null +++ b/packages/algorithm/lib/src/views/sort_setting.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + +import '../../algorithm.dart'; +class SortSettings extends StatefulWidget { + + const SortSettings({super.key,}); + + @override + State createState() => _SortSettingsState(); +} + +class _SortSettingsState extends State { + late TextEditingController _count = + TextEditingController(); + late TextEditingController _duration = TextEditingController(); + late TextEditingController _seed = + TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + SortState state = SortStateScope.of(context); + _count.text = state.config.count.toString(); + _duration.text = state.config.duration.inMicroseconds.toString(); + _seed.text = state.config.seed.toString(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + leading: BackButton(), + iconTheme: IconThemeData(color: Colors.black), + titleTextStyle: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + centerTitle: true, + title: Text('排序算法配置'), + ), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + children: [ + Text('数据数量(个数):'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _count, + )), + ], + ), + Row( + children: [ + Text('时间间隔(微秒):'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _duration, + )), + ], + ), + Row( + children: [ + Text('随机种子:'), + const SizedBox( + width: 20, + ), + Expanded( + child: TextField( + controller: _seed, + )), + ], + ), + Spacer(), + ElevatedButton( + onPressed: () { + SortState state = SortStateScope.of(context); + state.config =state.config.copyWith( + count: int.parse(_count.text), + duration: Duration( + microseconds: int.parse(_duration.text), + ), + seed: int.parse(_seed.text) + ); + Navigator.of(context).pop(); + }, + child: Text('确定设置')) + ], + ), + ), + ); + } +} diff --git a/packages/algorithm/pubspec.yaml b/packages/algorithm/pubspec.yaml new file mode 100644 index 00000000..94ab56a0 --- /dev/null +++ b/packages/algorithm/pubspec.yaml @@ -0,0 +1,55 @@ +name: algorithm +description: algorithm +version: 0.0.1 +homepage: + +environment: + sdk: '>=2.18.1 <3.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + components: + path: ../components +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/algorithm/test/utils_test.dart b/packages/algorithm/test/utils_test.dart new file mode 100644 index 00000000..ba04b36e --- /dev/null +++ b/packages/algorithm/test/utils_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + +} diff --git a/packages/authentication/lib/blocs/register/bloc.dart b/packages/authentication/lib/blocs/register/bloc.dart index 04b27614..51c03b35 100644 --- a/packages/authentication/lib/blocs/register/bloc.dart +++ b/packages/authentication/lib/blocs/register/bloc.dart @@ -1,6 +1,6 @@ // import 'package:authentication/authentication.dart'; // import 'package:flutter_bloc/flutter_bloc.dart'; -// import 'package:utils/utils.dart'; +// import 'package:utils/algorithm.dart'; // // import 'event.dart'; // import 'state.dart'; diff --git a/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart b/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart index 5e30c67f..b0b637c8 100644 --- a/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart +++ b/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart @@ -80,18 +80,24 @@ class _DropSelectableWidgetState extends State @override Widget build(BuildContext context) { _nodeAttachment.reparent(); - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (_focused) { - _node.unfocus(); - } else { - _node.requestFocus(); - } + return TapRegion( + groupId: 'selector', + onTapOutside: (_){ + _node.unfocus(); }, - child: CompositedTransformTarget( - link: layerLink, - child: buildTarget(), + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (_focused) { + _node.unfocus(); + } else { + _node.requestFocus(); + } + }, + child: CompositedTransformTarget( + link: layerLink, + child: buildTarget(), + ), ), ); } @@ -178,20 +184,23 @@ class _DropSelectableWidgetState extends State ); Widget _buildItem(BuildContext context, int index) { - return Material( - child: InkWell( - onTap: () { - if (_selectedIndex != index) widget.onDropSelected?.call(index); - _selectedIndex = index; - _overlayEntry?.markNeedsBuild(); - _node.unfocus(); - }, - child: Container( - padding: const EdgeInsets.all(8), - color: index == _selectedIndex - ? Colors.blue.withOpacity(0.2) - : Colors.transparent, - child: Text(widget.data[index],style: TextStyle(fontSize: widget.fontSize),)), + return TapRegion( + groupId: 'selector', + child: Material( + child: InkWell( + onTap: () { + if (_selectedIndex != index) widget.onDropSelected?.call(index); + _selectedIndex = index; + _overlayEntry?.markNeedsBuild(); + _node.unfocus(); + }, + child: Container( + padding: const EdgeInsets.all(8), + color: index == _selectedIndex + ? Colors.blue.withOpacity(0.2) + : Colors.transparent, + child: Text(widget.data[index],style: TextStyle(fontSize: widget.fontSize),)), + ), ), ); } diff --git a/pubspec.lock b/pubspec.lock index 10e1f028..f521b204 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + algorithm: + dependency: "direct main" + description: + path: "packages/algorithm" + relative: true + source: path + version: "0.0.1" app: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f1b239fb..d46a9247 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,6 +67,8 @@ dependencies: path: packages/widgets artifact: path: packages/artifact + algorithm: + path: packages/algorithm authentication: path: packages/authentication app: From 4b9571be3aaadabeb24e5bfa91f42f1e09608adc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Oct 2023 21:03:55 +0800 Subject: [PATCH 039/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desk_ui/unit_desk_navigation.dart | 38 -------- .../desk_ui/unit_rail_navigation.dart | 1 - lib/code_gen/desk_widget_top_bar.dart | 4 +- .../top_bar/desk_simple_top_bar.dart | 4 +- lib/components/top_bar/desk_tab_top_bar.dart | 4 +- lib/main.dart | 2 +- .../views/desk_ui/desk_point_page.dart | 3 +- .../views/issues_point/issues_detail.dart | 2 +- .../widget_detail/widget_detail_bar.dart | 3 +- .../widget_panel/desk_widget_top_bar.dart | 4 +- packages/algorithm/lib/algorithm.dart | 7 +- .../lib/src/algorithm/sort/functions.dart | 4 +- .../algorithm/lib/src/views/sort_bar.dart | 44 ---------- .../algorithm/lib/src/views/sort_page.dart | 31 +++---- .../algorithm/lib/src/views/sort_parper.dart | 23 +++++ .../algorithm/lib/src/views/sort_setting.dart | 38 +++++--- .../lib/src/views/top_bar/sort_bar.dart | 87 +++++++++++++++++++ .../src/views/{ => top_bar}/sort_button.dart | 5 +- packages/algorithm/pubspec.yaml | 2 + packages/app/lib/app.dart | 5 +- .../views}/window_buttons.dart | 0 .../window/windows_adapter.dart | 0 packages/app/pubspec.yaml | 1 + .../artifact/lib/src/views/artifact_page.dart | 60 +++++++++++-- packages/artifact/pubspec.yaml | 2 + pubspec.lock | 6 +- pubspec.yaml | 3 - 27 files changed, 232 insertions(+), 151 deletions(-) delete mode 100644 packages/algorithm/lib/src/views/sort_bar.dart create mode 100644 packages/algorithm/lib/src/views/sort_parper.dart create mode 100644 packages/algorithm/lib/src/views/top_bar/sort_bar.dart rename packages/algorithm/lib/src/views/{ => top_bar}/sort_button.dart (91%) rename {lib/widget_ui/desk_ui/widget_panel => packages/app/lib/platform_adapter/views}/window_buttons.dart (100%) rename {lib/app/plateform_adapter => packages/app/lib/platform_adapter}/window/windows_adapter.dart (100%) diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart index f7996e3e..92bfec9a 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_desk_navigation.dart @@ -95,41 +95,3 @@ class _UnitDeskNavigationState extends State { } } -class DeskSortPage extends StatefulWidget { - const DeskSortPage({super.key}); - - @override - State createState() => _DeskSortPageState(); -} - -class _DeskSortPageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - endDrawer: Drawer( - child: SortSettings(), - ), - body: Column( - children: [ - SimpleDeskTopBar( - leading: Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), - tail: Row( - children: [ - SortBar(), - const Padding( - padding: EdgeInsets.symmetric(vertical: 18.0), - child: VerticalDivider( - width: 32, - ), - ) - ], - ), - ), - - Expanded(child: SortPage()), - ], - ), - ); - } -} - diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/app/navigation/desk_ui/unit_rail_navigation.dart index c645c08c..c0447677 100644 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_rail_navigation.dart @@ -2,7 +2,6 @@ import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/navigation/desk_ui/theme_model_switch_icon.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; import 'package:url_launcher/url_launcher.dart'; class UnitRailNavigation extends StatefulWidget { diff --git a/lib/code_gen/desk_widget_top_bar.dart b/lib/code_gen/desk_widget_top_bar.dart index 6375d520..8654630c 100644 --- a/lib/code_gen/desk_widget_top_bar.dart +++ b/lib/code_gen/desk_widget_top_bar.dart @@ -1,8 +1,6 @@ +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - -import '../widget_ui/desk_ui/widget_panel/window_buttons.dart'; diff --git a/lib/components/top_bar/desk_simple_top_bar.dart b/lib/components/top_bar/desk_simple_top_bar.dart index f13766b8..0cd3080b 100644 --- a/lib/components/top_bar/desk_simple_top_bar.dart +++ b/lib/components/top_bar/desk_simple_top_bar.dart @@ -1,8 +1,6 @@ +import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import '../../app/plateform_adapter/window/windows_adapter.dart'; -import '../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; - class SimpleDeskTopBar extends StatelessWidget { final Widget? leading; diff --git a/lib/components/top_bar/desk_tab_top_bar.dart b/lib/components/top_bar/desk_tab_top_bar.dart index 9b50c84f..3b798c15 100644 --- a/lib/components/top_bar/desk_tab_top_bar.dart +++ b/lib/components/top_bar/desk_tab_top_bar.dart @@ -1,8 +1,6 @@ +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - -import '../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; class DeskTabTopBar extends StatefulWidget { diff --git a/lib/main.dart b/lib/main.dart index 289530cb..a0544e0e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ +import 'package:app/app.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'app/plateform_adapter/window/windows_adapter.dart'; import 'app/bloc_wrapper.dart'; import 'app/flutter_unit.dart'; diff --git a/lib/point_system/views/desk_ui/desk_point_page.dart b/lib/point_system/views/desk_ui/desk_point_page.dart index 58698a60..18cd6ad6 100644 --- a/lib/point_system/views/desk_ui/desk_point_page.dart +++ b/lib/point_system/views/desk_ui/desk_point_page.dart @@ -1,11 +1,10 @@ +import 'package:app/app.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/point_system/github_model/github_model.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../../app/plateform_adapter/window/windows_adapter.dart'; -import '../../../widget_ui/desk_ui/widget_panel/window_buttons.dart'; import '../../blocs/point_bloc/point_bloc.dart'; import '../../blocs/point_bloc/point_event.dart'; import '../../github_model/repository.dart'; diff --git a/lib/point_system/views/issues_point/issues_detail.dart b/lib/point_system/views/issues_point/issues_detail.dart index e5b4112f..dd5d24c4 100644 --- a/lib/point_system/views/issues_point/issues_detail.dart +++ b/lib/point_system/views/issues_point/issues_detail.dart @@ -1,7 +1,7 @@ +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; import 'package:flutter_unit/app/utils/convert_man.dart'; import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; import 'package:flutter_unit/point_system/github_model/github_model.dart'; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart index 039226e5..660bb1f3 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart +++ b/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart @@ -4,8 +4,7 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; -import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/window_buttons.dart'; + import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart b/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart index 87425562..040d2d83 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart +++ b/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -1,10 +1,8 @@ +import 'package:app/app.dart'; import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/plateform_adapter/window/windows_adapter.dart'; - import 'desk_search_bar.dart'; -import 'window_buttons.dart'; class DeskWidgetTopBar extends StatefulWidget { final ValueChanged onTabPressed; diff --git a/packages/algorithm/lib/algorithm.dart b/packages/algorithm/lib/algorithm.dart index 43b1bd6e..f9639cf2 100644 --- a/packages/algorithm/lib/algorithm.dart +++ b/packages/algorithm/lib/algorithm.dart @@ -1,8 +1,9 @@ library algorithm; -export 'src/views/sort_page.dart'; -export 'src/views/sort_bar.dart'; -export 'src/views/sort_button.dart'; +export 'src/views/sort_parper.dart'; +export 'src/views/top_bar/sort_bar.dart'; +export 'src/views/top_bar/sort_button.dart'; export 'src/views/sort_setting.dart'; +export 'src/views/sort_page.dart'; export 'src/data_scope/sort_config.dart'; export 'src/data_scope/state.dart'; \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/sort/functions.dart b/packages/algorithm/lib/src/algorithm/sort/functions.dart index 7b7cef59..70cceba6 100644 --- a/packages/algorithm/lib/src/algorithm/sort/functions.dart +++ b/packages/algorithm/lib/src/algorithm/sort/functions.dart @@ -26,7 +26,7 @@ Map sortFunctionMap = { 'cycle': cycleSort, 'heap': heapSort, 'quick': quickSort, - 'mergeSort': mergeSort, + 'merge': mergeSort, }; Map sortNameMap = { @@ -41,6 +41,6 @@ Map sortNameMap = { 'cycle': '循环排序', 'heap': '堆排序', 'quick': '快速排序', - 'mergeSort': '归并排序', + 'merge': '归并排序', }; diff --git a/packages/algorithm/lib/src/views/sort_bar.dart b/packages/algorithm/lib/src/views/sort_bar.dart deleted file mode 100644 index 0ba7083a..00000000 --- a/packages/algorithm/lib/src/views/sort_bar.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:components/components.dart'; -import 'package:flutter/material.dart'; - - -import '../data_scope/state.dart'; -import '../algorithm/sort/functions.dart'; -import 'sort_button.dart'; - -class SortBar extends StatelessWidget { - const SortBar({super.key}); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - const SortButton(), - const SizedBox(width: 10,), - DropSelectableWidget( - fontSize: 12, - data: sortNameMap.values.toList(), - iconSize: 20, - height: 28, - width: 200, - disableColor: const Color(0xff1F425F), - onDropSelected: (int index) async { - SortState state = SortStateScope.of(context); - state.config =state.config.copyWith( - name: sortNameMap.keys.toList()[index] - ); - }, - ), - const SizedBox(width: 10,), - GestureDetector( - onTap: (){ - Scaffold.of(context).openEndDrawer(); - // showDialog( - // useRootNavigator: false, - // context: context, builder: (ctx)=>AlertDialog()); - }, - child: const Icon(Icons.settings)) - ], - ); - } -} diff --git a/packages/algorithm/lib/src/views/sort_page.dart b/packages/algorithm/lib/src/views/sort_page.dart index ad78a5f4..efb0f074 100644 --- a/packages/algorithm/lib/src/views/sort_page.dart +++ b/packages/algorithm/lib/src/views/sort_page.dart @@ -1,26 +1,21 @@ - +import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; -import '../data_scope/state.dart'; -import 'data_painter.dart'; - -class SortPage extends StatelessWidget{ - const SortPage({super.key}); - +class DeskSortPage extends StatelessWidget{ + const DeskSortPage({super.key}); @override Widget build(BuildContext context) { - SortState state = SortStateScope.of(context); - List numbers = state.data; - - return Scaffold( - - body: CustomPaint( - painter: DataPainter(data: numbers), - child: ConstrainedBox(constraints: BoxConstraints.expand()), + return const Scaffold( + endDrawer: Drawer( + child: SortSettings(), + ), + body: Column( + children: [ + DeskSortBar(), + Expanded(child: SortPaper()), + ], ), ); } -} - - +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/views/sort_parper.dart b/packages/algorithm/lib/src/views/sort_parper.dart new file mode 100644 index 00000000..bdb752aa --- /dev/null +++ b/packages/algorithm/lib/src/views/sort_parper.dart @@ -0,0 +1,23 @@ + +import 'package:flutter/material.dart'; + +import '../data_scope/state.dart'; +import 'data_painter.dart'; + +class SortPaper extends StatelessWidget{ + const SortPaper({super.key}); + + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + List numbers = state.data; + + return CustomPaint( + painter: DataPainter(data: numbers), + child: ConstrainedBox(constraints: BoxConstraints.expand()), + ); + } +} + + diff --git a/packages/algorithm/lib/src/views/sort_setting.dart b/packages/algorithm/lib/src/views/sort_setting.dart index ac3b012a..71311b8b 100644 --- a/packages/algorithm/lib/src/views/sort_setting.dart +++ b/packages/algorithm/lib/src/views/sort_setting.dart @@ -37,6 +37,18 @@ class _SortSettingsState extends State { appBar: AppBar( backgroundColor: Colors.white, leading: BackButton(), + actions: [ + IconButton(onPressed: (){ + SortState state = SortStateScope.of(context); + state.config =state.config.copyWith( + count: int.parse(_count.text), + duration: Duration( + microseconds: int.parse(_duration.text), + ), + seed: int.parse(_seed.text) + ); + Navigator.of(context).pop(); + }, icon: Icon(Icons.check))], iconTheme: IconThemeData(color: Colors.black), titleTextStyle: TextStyle( color: Colors.black, @@ -87,19 +99,19 @@ class _SortSettingsState extends State { ], ), Spacer(), - ElevatedButton( - onPressed: () { - SortState state = SortStateScope.of(context); - state.config =state.config.copyWith( - count: int.parse(_count.text), - duration: Duration( - microseconds: int.parse(_duration.text), - ), - seed: int.parse(_seed.text) - ); - Navigator.of(context).pop(); - }, - child: Text('确定设置')) + // ElevatedButton( + // onPressed: () { + // SortState state = SortStateScope.of(context); + // state.config =state.config.copyWith( + // count: int.parse(_count.text), + // duration: Duration( + // microseconds: int.parse(_duration.text), + // ), + // seed: int.parse(_seed.text) + // ); + // Navigator.of(context).pop(); + // }, + // child: Text('确定设置')) ], ), ), diff --git a/packages/algorithm/lib/src/views/top_bar/sort_bar.dart b/packages/algorithm/lib/src/views/top_bar/sort_bar.dart new file mode 100644 index 00000000..0a183be8 --- /dev/null +++ b/packages/algorithm/lib/src/views/top_bar/sort_bar.dart @@ -0,0 +1,87 @@ +import 'package:app/app.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; + + +import '../../data_scope/state.dart'; +import '../../algorithm/sort/functions.dart'; +import 'sort_button.dart'; + +class DeskSortBar extends StatelessWidget { + const DeskSortBar({super.key}); + + @override + Widget build(BuildContext context) { + + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveAreaNoDouble( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20), + height: 64, + color: isDark? const Color(0xff2C3036):Colors.white, + child: const Row( + children: [ + Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + Spacer(), + SizedBox( + width: 20, + ), + SortBar(), + Padding( + padding: EdgeInsets.symmetric(vertical: 18.0), + child: VerticalDivider( + width: 32, + ), + ), + WindowButtons(), + ], + ), + ), + ); + } +} + + +class SortBar extends StatelessWidget { + const SortBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const SortButton(), + const SizedBox(width: 10,), + const SortSelector(), + const SizedBox(width: 10,), + GestureDetector( + onTap: (){ + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} + +class SortSelector extends StatelessWidget { + const SortSelector({super.key}); + + @override + Widget build(BuildContext context) { + return DropSelectableWidget( + fontSize: 12, + data: sortNameMap.values.toList(), + iconSize: 20, + height: 28, + width: 200, + disableColor: const Color(0xff1F425F), + onDropSelected: (int index) async { + SortState state = SortStateScope.of(context); + state.config =state.config.copyWith( + name: sortNameMap.keys.toList()[index] + ); + }, + ); + } +} diff --git a/packages/algorithm/lib/src/views/sort_button.dart b/packages/algorithm/lib/src/views/top_bar/sort_button.dart similarity index 91% rename from packages/algorithm/lib/src/views/sort_button.dart rename to packages/algorithm/lib/src/views/top_bar/sort_button.dart index 7f5041f0..cce2959b 100644 --- a/packages/algorithm/lib/src/views/sort_button.dart +++ b/packages/algorithm/lib/src/views/top_bar/sort_button.dart @@ -1,6 +1,9 @@ +import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; -import '../data_scope/state.dart'; +import '../../data_scope/state.dart'; + + class SortButton extends StatelessWidget { const SortButton({super.key}); diff --git a/packages/algorithm/pubspec.yaml b/packages/algorithm/pubspec.yaml index 94ab56a0..7e7ad6ae 100644 --- a/packages/algorithm/pubspec.yaml +++ b/packages/algorithm/pubspec.yaml @@ -12,6 +12,8 @@ dependencies: sdk: flutter components: path: ../components + app: + path: ../app dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index f5239670..555144cf 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -23,4 +23,7 @@ export 'app/style/unit_color.dart'; export 'app/style/gap.dart'; export 'app/style/shape/coupon_shape_border.dart'; export 'app/style/shape/techno_shape.dart'; -export 'app/style/behavior/no_scroll_behavior.dart'; \ No newline at end of file +export 'app/style/behavior/no_scroll_behavior.dart'; + +export 'package:app/platform_adapter/window/windows_adapter.dart'; +export 'package:app/platform_adapter/views/window_buttons.dart'; \ No newline at end of file diff --git a/lib/widget_ui/desk_ui/widget_panel/window_buttons.dart b/packages/app/lib/platform_adapter/views/window_buttons.dart similarity index 100% rename from lib/widget_ui/desk_ui/widget_panel/window_buttons.dart rename to packages/app/lib/platform_adapter/views/window_buttons.dart diff --git a/lib/app/plateform_adapter/window/windows_adapter.dart b/packages/app/lib/platform_adapter/window/windows_adapter.dart similarity index 100% rename from lib/app/plateform_adapter/window/windows_adapter.dart rename to packages/app/lib/platform_adapter/window/windows_adapter.dart diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index b002e1a1..d1bf0465 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.1 # xml 固化 connectivity_plus: ^4.0.2 + window_manager: ^0.3.7 #桌面尺寸 storage: path: ../storage widget_repository: diff --git a/packages/artifact/lib/src/views/artifact_page.dart b/packages/artifact/lib/src/views/artifact_page.dart index b76d331a..ff27fc67 100644 --- a/packages/artifact/lib/src/views/artifact_page.dart +++ b/packages/artifact/lib/src/views/artifact_page.dart @@ -1,8 +1,10 @@ import 'dart:math'; +import 'package:algorithm/algorithm.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../blocs/columnize/bloc.dart'; import '../blocs/exp.dart'; import '../repositories/exp.dart'; @@ -31,7 +33,7 @@ class ArtifactPage extends StatefulWidget { const List kArtifactInfo = [ '分类收录张风捷特烈的博客文章', - 'Flutter 框架探索,七剑合璧', + '可视化排序算法', '收录布局方案,提供界面样板', 'Flutter 知识小要点,一网打尽', ]; @@ -40,6 +42,7 @@ class _ArtifactPageState extends State with SingleTickerProviderStateMixin { late TabController controller; List data = []; + @override void initState() { super.initState(); @@ -62,13 +65,17 @@ class _ArtifactPageState extends State @override Widget build(BuildContext context) { double bottom = MediaQuery.of(context).padding.bottom; + String name = SortStateScope.of(context).config.name; return MultiBlocProvider( providers: [ - BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), - BlocProvider(create: (_) => ArticleBloc(aRepository)..init()), + BlocProvider( + create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider( + create: (_) => ArticleBloc(aRepository)..init()), ], child: Scaffold( + endDrawer: SortSettings(), backgroundColor: const Color(0xffF2F3F5), bottomNavigationBar: Container(height: bottom), body: NestedScrollView( @@ -78,7 +85,31 @@ class _ArtifactPageState extends State controller: controller, children: [ TolyArticleScrollPage(), - BuildingPanel(), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + GestureDetector( + onTap: () { + _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + }, + child: Text( + '查看排序源码', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).primaryColor, + ), + )), + Spacer(), + SortSelector(), + ], + ), + ), + Expanded(child: SortPaper()), + ], + ), BuildingPanel(), BuildingPanel(), ], @@ -88,6 +119,15 @@ class _ArtifactPageState extends State ); } + _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + List _buildAppBar(BuildContext context, bool innerBoxIsScrolled) { // print('innerBoxIsScrolled:$innerBoxIsScrolled'); return [ @@ -100,6 +140,7 @@ class _ArtifactPageState extends State snap: true, pinned: true, backgroundColor: Colors.white, + leading: _curIndex == 1 ? SortButton() : null, // flexibleSpace: Image.network( // 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/448d4eb270f44edab0192a1281141954~tplv-k3u1fbpfcp-watermark.image?', @@ -146,7 +187,14 @@ class _ArtifactPageState extends State ], ), actions: [ - IconButton(onPressed: () {}, icon: Icon(Icons.search_rounded)) + if (_curIndex == 1) + IconButton( + onPressed: () { + Scaffold.of(context).openEndDrawer(); + }, + icon: Icon(Icons.settings)), + if (_curIndex != 1) + IconButton(onPressed: () {}, icon: Icon(Icons.search_rounded)) ], // title: Padding( // padding: const EdgeInsets.only(right: 8.0), @@ -161,7 +209,7 @@ class _ArtifactPageState extends State ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '七剑合璧', + text: '可视排序', ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 542de1d3..8eb6bd8b 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -17,6 +17,8 @@ dependencies: refresh: ^1.0.1 storage: path: ../storage + algorithm: + path: ../algorithm utils: path: ../utils app: diff --git a/pubspec.lock b/pubspec.lock index f521b204..37c3b0ac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -936,13 +936,13 @@ packages: source: hosted version: "5.0.3" window_manager: - dependency: "direct main" + dependency: transitive description: name: window_manager - sha256: "6ee795be9124f90660ea9d05e581a466de19e1c89ee74fc4bf528f60c8600edd" + sha256: dcc865277f26a7dad263a47d0e405d77e21f12cb71f30333a52710a408690bd7 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.6" + version: "0.3.7" wrapper: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index d46a9247..dad678ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,9 +53,6 @@ dependencies: flutter_markdown: ^0.6.4 # markdown # file_selector: ^0.9.2+2 file_picker: ^5.5.0 - window_manager: ^0.3.6 #桌面尺寸 - - widget_repository: path: packages/widget_repository From 1313fd14b9a5458d9e03b9913dd125117a12ffce Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Oct 2023 21:05:12 +0800 Subject: [PATCH 040/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index dad678ab..acec4142 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. publish_to: none -version: 2.9.2+1 +version: 2.9.3+1 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 2ce6fe09ac75f85c9ae84132e8989dac553cc333 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 25 Oct 2023 07:56:27 +0800 Subject: [PATCH 041/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++--- lib/app/flutter_unit.dart | 5 ++-- .../desk_ui/unit_desk_navigation.dart | 3 +-- .../algorithm/lib/src/data_scope/state.dart | 7 ------ .../algorithm/lib/src/views/data_painter.dart | 23 +++++++------------ 5 files changed, 15 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index ebbce791..1feb5993 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,15 @@ | 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | |------|------------|------|------------| -| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| | iOS版 |[FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |[FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/release/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 |[FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| | Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| #### Flutter Unit 周边 +- 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487) - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) - 🔥 [掘金小册 -《Flutter 手势探索 - 执掌天下》](https://juejin.cn/book/6896378716427911181) diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 069b544d..0d0b54e7 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -7,7 +7,6 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_unit/app/router/unit_router.dart'; import 'package:flutter_unit/app/views/splash/standard_unit_splash.dart'; - /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: 主程序 @@ -19,8 +18,8 @@ class FlutterUnit extends StatelessWidget { Widget build(BuildContext context) { return BlocBuilder(builder: (_, state) { return SortStateScope( - notifier: SortState(), - child: DefaultTextStyle( + notifier: SortState(), + child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: MaterialApp( // routes: , diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/app/navigation/desk_ui/unit_desk_navigation.dart index 92bfec9a..b69975fb 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/app/navigation/desk_ui/unit_desk_navigation.dart @@ -55,8 +55,7 @@ class _UnitDeskNavigationState extends State { children: [ UnitRailNavigation( selectedIndex: _currentIndex, - onItemClick: _onItemClick, itemData: { - //底栏图标 + onItemClick: _onItemClick, itemData: const { "组件集录": TolyIcon.icon_layout, "收藏集录": TolyIcon.icon_star, "绘制集录": Icons.palette, diff --git a/packages/algorithm/lib/src/data_scope/state.dart b/packages/algorithm/lib/src/data_scope/state.dart index d9f3b9d4..a9ea9fc7 100644 --- a/packages/algorithm/lib/src/data_scope/state.dart +++ b/packages/algorithm/lib/src/data_scope/state.dart @@ -18,10 +18,7 @@ class SortState with ChangeNotifier{ } SortStatus status = SortStatus.none; - List data = []; - List stepData = []; - SortConfig _config = SortConfig(); SortConfig get config => _config; Random random = Random(); @@ -41,7 +38,6 @@ class SortState with ChangeNotifier{ random = Random(config.seed); } for (int i = 0; i < count; i++) { - //随机往数组中填值 data.add(random.nextInt(1000)); } } @@ -49,7 +45,6 @@ class SortState with ChangeNotifier{ void sort() async{ status = SortStatus.sorting; notifyListeners(); - Stopwatch stopwatch = Stopwatch()..start(); SortFunction? sortFunction = sortFunctionMap[config.name]; if(sortFunction!=null){ await sortFunction(data,(arr) async { @@ -59,8 +54,6 @@ class SortState with ChangeNotifier{ } status = SortStatus.sorted; notifyListeners(); - stopwatch.stop(); - print("Sorting completed in ${stopwatch.elapsed.inMilliseconds} ms."); } } diff --git a/packages/algorithm/lib/src/views/data_painter.dart b/packages/algorithm/lib/src/views/data_painter.dart index ab568c72..e719d6bc 100644 --- a/packages/algorithm/lib/src/views/data_painter.dart +++ b/packages/algorithm/lib/src/views/data_painter.dart @@ -1,24 +1,20 @@ import 'package:flutter/material.dart'; - - -class DataPainter extends CustomPainter{ - +class DataPainter extends CustomPainter { final List data; DataPainter({required this.data}); @override void paint(Canvas canvas, Size size) { - canvas.clipRect(Offset.zero&size); - double itemWidth = size.width/data.length; - double height = size.height; + canvas.clipRect(Offset.zero & size); + double itemWidth = size.width / data.length; Paint paint = Paint(); paint.strokeWidth = itemWidth; paint.strokeCap = StrokeCap.round; - for(int i=0;i Date: Mon, 30 Oct 2023 18:46:35 +0800 Subject: [PATCH 042/149] InheritedNotifier --- .../listenable/change_notifier_02/main.dart | 38 ++++++++++++ .../notifier/download_data_scope.dart | 16 +++++ .../notifier/progress_value_notifier.dart | 15 +++++ .../page/detail/detail_progress_view.dart | 28 +++++++++ .../page/detail/download_detail.dart | 17 ++++++ .../page/home/home_page.dart | 61 +++++++++++++++++++ .../page/home/home_progress_view.dart | 32 ++++++++++ 7 files changed, 207 insertions(+) create mode 100644 lib/awesome/listenable/change_notifier_02/main.dart create mode 100644 lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart create mode 100644 lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart create mode 100644 lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart create mode 100644 lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart create mode 100644 lib/awesome/listenable/change_notifier_02/page/home/home_page.dart create mode 100644 lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart diff --git a/lib/awesome/listenable/change_notifier_02/main.dart b/lib/awesome/listenable/change_notifier_02/main.dart new file mode 100644 index 00000000..3d04b86e --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/main.dart @@ -0,0 +1,38 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +import 'notifier/download_data_scope.dart'; +import 'notifier/progress_value_notifier.dart'; +import 'page/home/home_page.dart'; + +void main(){ + WidgetsFlutterBinding.ensureInitialized(); + runApp(const MyApp()); + WindowsAdapter.setSize(); +} + +class MyApp extends StatelessWidget{ + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return DownloadDataScope( + notifier: ProgressValueNotifier(), + child: MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const ChangeNotifierHome02(), + ), + ); + } +} + + + + + + + diff --git a/lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart b/lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart new file mode 100644 index 00000000..770756cf --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; + +import 'progress_value_notifier.dart'; + +class DownloadDataScope extends InheritedNotifier{ + + const DownloadDataScope({super.key, required super.child,super.notifier}); + + static ProgressValueNotifier of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType()!.notifier!; + } + + static ProgressValueNotifier read(BuildContext context) { + return context.getInheritedWidgetOfExactType()!.notifier!; + } +} \ No newline at end of file diff --git a/lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart b/lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart new file mode 100644 index 00000000..113b6894 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class ProgressValueNotifier with ChangeNotifier{ + + double _value = 0; + + double get value =>_value; + + String get valueStr => '${(value*100).toStringAsFixed(1)}%'; + + set value(double value){ + _value = value.clamp(0, 1); + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart b/lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart new file mode 100644 index 00000000..6395b1ff --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart @@ -0,0 +1,28 @@ + +import 'package:flutter/material.dart'; + +import '../../notifier/download_data_scope.dart'; +import '../../notifier/progress_value_notifier.dart'; + +class DetailProgressView extends StatelessWidget{ + const DetailProgressView({super.key}); + + @override + Widget build(BuildContext context) { + ProgressValueNotifier progress = DownloadDataScope.of(context); + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 200, + height: 50, + child: LinearProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr,style: TextStyle(color: Colors.white),) + ], + ); + } +} diff --git a/lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart b/lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart new file mode 100644 index 00000000..212edbc1 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +import 'detail_progress_view.dart'; + +class DownloadDetailPage extends StatelessWidget { + const DownloadDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('下载详情页'), + ), + body: Center(child: DetailProgressView()), + ); + } +} diff --git a/lib/awesome/listenable/change_notifier_02/page/home/home_page.dart b/lib/awesome/listenable/change_notifier_02/page/home/home_page.dart new file mode 100644 index 00000000..dd17c937 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/page/home/home_page.dart @@ -0,0 +1,61 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import '../../notifier/download_data_scope.dart'; +import '../../notifier/progress_value_notifier.dart'; +import '../detail/download_detail.dart'; +import 'home_progress_view.dart'; + +class ChangeNotifierHome02 extends StatefulWidget { + const ChangeNotifierHome02({super.key}); + + @override + State createState() => _ChangeNotifierHome02State(); +} + +class _ChangeNotifierHome02State extends State { + + TextEditingController c = TextEditingController(); + @override + Widget build(BuildContext context) { + print("=========_ChangeNotifierHome02State#build==========="); + return Scaffold( + floatingActionButton: FloatingActionButton( + onPressed: _startTimer, + child: const Icon(Icons.restart_alt), + ), + appBar: AppBar( + title: const Text('下载进度通知模拟'), + actions: [ + IconButton(onPressed: (){ + Navigator.of(context).push(MaterialPageRoute(builder: (_)=>const DownloadDetailPage())); + }, icon: const Icon(Icons.info_outline)) + ], + ), + body: const Center(child: HomeProgressView()), + ); + } + + Timer? _timer; + + ProgressValueNotifier get progress => DownloadDataScope.read(context); + + void _startTimer(){ + if(_timer!=null) return; + if(progress.value==1.0){ + progress.value=0; + } + _timer = Timer.periodic(const Duration(milliseconds: 200),_updateProgress); + } + + + void _updateProgress(Timer timer) { + if(progress.value>=1.0){ + timer.cancel(); + _timer = null; + return; + } + progress.value += 0.01; + } +} + diff --git a/lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart b/lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart new file mode 100644 index 00000000..b5a3d1d0 --- /dev/null +++ b/lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart @@ -0,0 +1,32 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_unit/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart'; + +import '../../notifier/progress_value_notifier.dart'; + +class HomeProgressView extends StatelessWidget{ + const HomeProgressView({super.key}); + + + @override + Widget build(BuildContext context) { + ProgressValueNotifier progress = DownloadDataScope.of(context); + return Stack( + alignment: Alignment.center, + children:[ + SizedBox( + width: 100, + height: 100, + child: CircularProgressIndicator( + value: progress.value, + backgroundColor: Colors.grey, + ), + ), + Text(progress.valueStr) + ], + ); + } + + + +} From 69b36a12cc3d36d2b520c369ffe1baa5daf0aac7 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 25 Nov 2023 12:24:25 +0800 Subject: [PATCH 043/149] =?UTF-8?q?badge=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 1359872 -> 1175552 bytes .../window/windows_adapter.dart | 1 + .../lib/StatelessWidget/Badge/node_1.dart | 35 +++------- .../lib/StatelessWidget/Badge/node_2.dart | 46 +++++--------- .../lib/StatelessWidget/Badge/node_3.dart | 60 ++++++++++++++++++ packages/widgets/lib/exp/stateless_unit.dart | 4 +- packages/widgets/lib/widgets_map.dart | 3 +- pubspec.lock | 26 ++++---- windows/flutter/CMakeLists.txt | 7 +- 9 files changed, 110 insertions(+), 72 deletions(-) create mode 100644 packages/widgets/lib/StatelessWidget/Badge/node_3.dart diff --git a/assets/flutter.db b/assets/flutter.db index 78acb9ce2cf9d7d122820cdd48fe58790546f8fa..821c26437028a440f471129904987b451ff5dc90 100644 GIT binary patch delta 3715 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 delta 172769 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 wu< createState() => _BadgeVisibleDemoState(); -} - -class _BadgeVisibleDemoState extends State { - - bool _visible = true; +class BadgeLabelDemo extends StatelessWidget { + const BadgeLabelDemo({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return GestureDetector( - onTap: _onTap, - child: Badge( - backgroundColor: Colors.red, - label: Text('99+'), - alignment: AlignmentDirectional(36-16,-2), - largeSize: 14, - smallSize: 6, - isLabelVisible: _visible, - child: Icon(Icons.supervised_user_circle,size: 36,), - ), + return const Badge( + backgroundColor: Colors.red, + label: Text('99'), + textStyle: TextStyle(fontSize: 8,color: Colors.red), + padding: EdgeInsets.symmetric(horizontal: 8,vertical: 2), + largeSize: 14, + child: Icon(Icons.message,size: 36,color: Colors.indigo,), ); } - - void _onTap() { - setState(() { - _visible = false; - }); - } } + diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_3.dart b/packages/widgets/lib/StatelessWidget/Badge/node_3.dart new file mode 100644 index 00000000..4ad90b41 --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/Badge/node_3.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/01/27 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 258, +// "name": 'Badge 的偏移量', +// "priority": 3, +// "subtitle": "【offset】 : 标记偏移量 【Offset?】\n" +// "【alignment】 : 标题偏移 【AlignmentDirectional?】", +// } + +class BadgeAlignOffsetDemo extends StatelessWidget { + const BadgeAlignOffsetDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final List info = ['默认偏移和对齐', '偏移-4,-4', '偏移-2,-2;右下角']; + final List offsets = [ + null, + const Offset(-4, -4), + const Offset(-2, -2) + ]; + final List alignments = [null, null, Alignment.bottomRight]; + + return Wrap( + spacing: 40, + children: info + .asMap() + .keys + .map((int i) => _buildShowItem(info[i], offsets[i], alignments[i])) + .toList(), + ); + } + + Widget _buildShowItem(String info, Offset? offset, Alignment? alignment) { + return Wrap( + spacing: 8, + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Badge( + backgroundColor: Colors.red, + label: const Text('99'), + textStyle: const TextStyle(fontSize: 8, color: Colors.red), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + largeSize: 14, + offset: offset, + alignment: alignment, + child: const Icon(Icons.message, size: 36, color: Colors.indigo), + ), + Text( + info, + style: const TextStyle(fontSize: 10, color: Colors.grey), + ) + ], + ); + } +} diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/packages/widgets/lib/exp/stateless_unit.dart index a3e79f60..a9c6f7c0 100644 --- a/packages/widgets/lib/exp/stateless_unit.dart +++ b/packages/widgets/lib/exp/stateless_unit.dart @@ -32,8 +32,10 @@ export '../StatelessWidget/Container/node6_constraints.dart'; export '../StatelessWidget/MaterialBanner/node1_one_btn.dart'; export '../StatelessWidget/MaterialBanner/node2_two_btn.dart'; export '../StatelessWidget/SafeArea/node1_base.dart'; + export '../StatelessWidget/Badge/node_1.dart'; export '../StatelessWidget/Badge/node_2.dart'; +export '../StatelessWidget/Badge/node_3.dart'; export '../StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart'; export '../StatelessWidget/CupertinoPageTransition/node1_base.dart'; @@ -115,8 +117,6 @@ export '../StatelessWidget/TabBar/node1_base.dart'; export '../StatelessWidget/TabBar/node2_noShadow.dart'; -export '../StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart'; -export '../StatelessWidget/VerticalDivider/node2_height.dart'; export '../StatelessWidget/BackButton/node1_base.dart'; export '../StatelessWidget/ButtonBar/node1_base.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index b5576b3c..6d8fa62b 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -37,7 +37,8 @@ class WidgetsMap { case "Badge": return [ const BadgeDemo(), - const BadgeVisibleDemo(), + const BadgeLabelDemo(), + const BadgeAlignOffsetDemo(), ]; case "DateRangePickerDialog": return [ diff --git a/pubspec.lock b/pubspec.lock index 37c3b0ac..7bcc0ef7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -96,10 +96,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.flutter-io.cn/" source: hosted - version: "1.17.2" + version: "1.18.0" components: dependency: "direct main" description: @@ -379,10 +379,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.flutter-io.cn/" source: hosted - version: "1.9.1" + version: "1.10.0" mime: dependency: transitive description: @@ -680,10 +680,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.11.0" + version: "1.11.1" storage: dependency: "direct main" description: @@ -695,10 +695,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: "direct main" description: @@ -735,10 +735,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.0" + version: "0.6.1" toggle_rotate: dependency: "direct main" description: @@ -870,10 +870,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.1.4-beta" + version: "0.3.0" webview_flutter: dependency: "direct main" description: @@ -984,5 +984,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.10.0" diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 930d2071..903f4899 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -92,7 +97,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS From 6bf9d2d9bfab9a8ae69a96c9d2176d3237ad3538 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 28 Nov 2023 16:54:18 +0800 Subject: [PATCH 044/149] =?UTF-8?q?=E6=96=B0=E5=A2=9EBackButtonIcon=20?= =?UTF-8?q?=E3=80=81DrawerButtonIcon=20=E3=80=81CloseButtonIcon=20EndDrawe?= =?UTF-8?q?rButtonIcon=20=E3=80=81DrawerButton=20=E3=80=81EndDrawerButton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 1175552 -> 1363968 bytes .../widget_panel/standard_home_page.dart | 39 +++++++++--------- .../BackButton/node1_base.dart | 3 +- .../BackButtonIcon/node1_base.dart | 19 +++++++++ .../lib/StatelessWidget/Card/node1_base.dart | 4 +- .../CloseButton/node1_base.dart | 9 ++-- .../CloseButtonIcon/node1_base.dart | 19 +++++++++ .../DrawerButton/node1_base.dart | 27 ++++++++++++ .../DrawerButtonIcon/node1_base.dart | 19 +++++++++ .../EndDrawerButton/node1_base.dart | 27 ++++++++++++ .../EndDrawerButtonIcon/node1_base.dart | 19 +++++++++ packages/widgets/lib/exp/stateless_unit.dart | 14 ++++++- packages/widgets/lib/widgets_map.dart | 24 +++++++++++ 13 files changed, 195 insertions(+), 28 deletions(-) create mode 100644 packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart create mode 100644 packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart diff --git a/assets/flutter.db b/assets/flutter.db index 821c26437028a440f471129904987b451ff5dc90..9cdba0a2c926ea2ef1bf42d38a6e805d14c849b8 100644 GIT binary patch delta 175633 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�(buFc_;D~<@SKB9?E_$>rhr!=2!H4 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 diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart index ed927583..d2cea77f 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/lib/widget_ui/mobile/widget_panel/standard_home_page.dart @@ -87,26 +87,25 @@ class _StandardHomePageState extends State // SliverOverlapAbsorber( // sliver: SliverPinnedHeader( - color: isDark ? Colors.black : Colors.white, - child: TabBar( - onTap: _switchTab, - indicatorSize: TabBarIndicatorSize.label, - isScrollable: true, - indicator: RoundRectTabIndicator( - borderSide: BorderSide(color: themeColor, width: 3), - ), - labelStyle: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - controller: tabController, - labelColor: themeColor, - indicatorWeight: 3, - unselectedLabelColor: Colors.grey, - indicatorColor: themeColor, - tabs: _tabs.map((String name) => Tab(text: name)).toList(), - ), - ), + color: isDark ? Colors.black : Colors.white, + child: TabBar( + onTap: _switchTab, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: _tabs.map((String name) => Tab(text: name)).toList(), + )), // handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), // ), ]; diff --git a/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart index f6a1aaaa..90d65cfc 100644 --- a/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart @@ -8,8 +8,9 @@ import 'package:flutter/material.dart'; // "priority": 1, // "name": "BackButton属性", // "subtitle": "【color】: 颜色 【Color】\n" +// "【style】: 按钮样式 【ButtonStyle?】\n" // "【onPressed】: 点击事件 【Function】\n" -// " onPressed为空会退出当前栈", +// " onPressed为空会退出当前栈", // } class CustomBackButton extends StatelessWidget { CustomBackButton({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart new file mode 100644 index 00000000..db69b2aa --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 272, +// "priority": 1, +// "name": "BackButtonIcon 效果", +// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的返回按钮图标。", +// } +class BackButtonIconDemo extends StatelessWidget { + const BackButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const BackButtonIcon(); + } +} diff --git a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart b/packages/widgets/lib/StatelessWidget/Card/node1_base.dart index f14412a3..36aa99b2 100644 --- a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/Card/node1_base.dart @@ -1,5 +1,7 @@ +import 'package:flutter/material.dart'; + /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com /// 说明: @@ -13,8 +15,6 @@ // "【color】: 颜色 【Color】\n" // "【child】: 孩子 【Widget】", // } -import 'package:flutter/material.dart'; - class CustomCard extends StatelessWidget { const CustomCard({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart index 958b9f3b..c15715bc 100644 --- a/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; + /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com /// 说明: @@ -5,11 +7,12 @@ // "widgetId": 32, // "priority": 1, // "name": "CloseButton点击事件", -// "subtitle": " 点击时会退出当前栈", +// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" +// "【style】: 按钮样式 【ButtonStyle?】\n" +// "【color】: 颜色 【Color】\n" +// "onPressed 为空时,点击时会退出当前界面。", // } -import 'package:flutter/material.dart'; - class CustomCloseButton extends StatelessWidget { const CustomCloseButton({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart new file mode 100644 index 00000000..50c0380f --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 274, +// "priority": 1, +// "name": "CloseButtonIcon 效果", +// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的关闭按钮图标。", +// } +class CloseButtonIconDemo extends StatelessWidget { + const CloseButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const CloseButtonIcon(); + } +} diff --git a/packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart new file mode 100644 index 00000000..45699d5b --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 276, +// "priority": 1, +// "name": "DrawerButton 基本使用", +// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" +// "【style】: 按钮样式 【ButtonStyle?】\n" +// "onPressed 为空时,点击时会打开左抽屉。", +// } + +class DrawerButtonDemo extends StatelessWidget { + const DrawerButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return DrawerButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + iconColor: Colors.white, + ), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart new file mode 100644 index 00000000..3ad0c9da --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 273, +// "priority": 1, +// "name": "DrawerButtonIcon 效果", +// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的抽屉按钮图标。", +// } +class DrawerButtonIconDemo extends StatelessWidget { + const DrawerButtonIconDemo({super.key}); + + @override + Widget build(BuildContext context) { + return const DrawerButtonIcon(); + } +} diff --git a/packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart b/packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart new file mode 100644 index 00000000..e11381e2 --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 361, +// "priority": 1, +// "name": "EndDrawerButton 基本使用", +// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" +// "【style】: 按钮样式 【ButtonStyle?】\n" +// "onPressed 为空时,点击时会打开右抽屉。", +// } + +class EndDrawerButtonDemo extends StatelessWidget { + const EndDrawerButtonDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return EndDrawerButton( + style: TextButton.styleFrom( + backgroundColor: Colors.blue, + iconColor: Colors.white, + ), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart b/packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart new file mode 100644 index 00000000..75c9500f --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2023/11/28 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 275, +// "priority": 1, +// "name": "EndDrawerButtonIcon 效果", +// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的右抽屉按钮图标。", +// } +class EndDrawerButtonIconDemo extends StatelessWidget { + const EndDrawerButtonIconDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const EndDrawerButtonIcon(); + } +} diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/packages/widgets/lib/exp/stateless_unit.dart index a9c6f7c0..bd53f535 100644 --- a/packages/widgets/lib/exp/stateless_unit.dart +++ b/packages/widgets/lib/exp/stateless_unit.dart @@ -37,6 +37,17 @@ export '../StatelessWidget/Badge/node_1.dart'; export '../StatelessWidget/Badge/node_2.dart'; export '../StatelessWidget/Badge/node_3.dart'; +export '../StatelessWidget/BackButtonIcon/node1_base.dart'; +export '../StatelessWidget/DrawerButtonIcon/node1_base.dart'; +export '../StatelessWidget/CloseButtonIcon/node1_base.dart'; +export '../StatelessWidget/EndDrawerButtonIcon/node1_base.dart'; + +export '../StatelessWidget/EndDrawerButton/node1_base.dart'; +export '../StatelessWidget/DrawerButton/node1_base.dart'; +export '../StatelessWidget/CloseButton/node1_base.dart'; +export '../StatelessWidget/BackButton/node1_base.dart'; + + export '../StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart'; export '../StatelessWidget/CupertinoPageTransition/node1_base.dart'; export '../StatelessWidget/HtmlElementView/node1_base.dart'; @@ -118,10 +129,9 @@ export '../StatelessWidget/TabBar/node2_noShadow.dart'; -export '../StatelessWidget/BackButton/node1_base.dart'; export '../StatelessWidget/ButtonBar/node1_base.dart'; export '../StatelessWidget/ButtonBar/node2_padding.dart'; -export '../StatelessWidget/CloseButton/node1_base.dart'; + export '../StatelessWidget/FlatButton/node1_base.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index 6d8fa62b..b5c79626 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -1419,6 +1419,30 @@ class WidgetsMap { return [ const SliverMainAxisGroupDemo(), ]; + case "BackButtonIcon": + return [ + const BackButtonIconDemo(), + ]; + case "DrawerButtonIcon": + return [ + const DrawerButtonIconDemo(), + ]; + case "CloseButtonIcon": + return [ + const CloseButtonIconDemo(), + ]; + case "EndDrawerButtonIcon": + return [ + const EndDrawerButtonIconDemo(), + ]; + case "EndDrawerButton": + return [ + const EndDrawerButtonDemo(), + ]; + case "DrawerButton": + return [ + const DrawerButtonDemo(), + ]; default: return []; } From 0122578773a6e0eff18a81de77326593d988f93f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 20 Dec 2023 21:32:20 +0800 Subject: [PATCH 045/149] update Flutter 3.16.3 --- README.md | 8 ++-- lib/app/router/desk/app.dart | 49 +++++++++++++++++++++ lib/app/router/desk/root.dart | 34 +++++++++++++++ lib/app/router/menu_meta.dart | 23 ++++++++++ packages/app/pubspec.yaml | 4 +- packages/storage/pubspec.yaml | 3 +- packages/utils/pubspec.yaml | 2 +- pubspec.lock | 82 +++++++++++++++++++++-------------- pubspec.yaml | 18 ++++---- 9 files changed, 173 insertions(+), 50 deletions(-) create mode 100644 lib/app/router/desk/app.dart create mode 100644 lib/app/router/desk/root.dart create mode 100644 lib/app/router/menu_meta.dart diff --git a/README.md b/README.md index 1feb5993..b109d0f9 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,10 @@ #### 当前Flutter 版本 ``` -Flutter 3.13.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 2524052335 (3 days ago) • 2023-09-06 14:32:31 -0700 -Engine • revision b8d35810e9 -Tools • Dart 3.1.1 • DevTools 2.25.0 +Flutter 3.16.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision b0366e0a3f (2 weeks ago) • 2023-12-05 19:46:39 -0800 +Engine • revision 54a7145303 +Tools • Dart 3.2.3 • DevTools 2.28.4 ``` #### 构建命令,产出应用 diff --git a/lib/app/router/desk/app.dart b/lib/app/router/desk/app.dart new file mode 100644 index 00000000..d590176a --- /dev/null +++ b/lib/app/router/desk/app.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../menu_meta.dart'; + + +final List deskNavBarMenus = const [ + MenuMeta(label: '组件集录', icon: Icons.color_lens_outlined, path: '/widgets'), + MenuMeta(label: '收藏集录', icon: Icons.add_chart, path: '/collection'), + MenuMeta(label: '绘制集录', icon: Icons.sort, path: '/painter'), + MenuMeta(label: '可视化', icon: Icons.person, path: '/visual'), + MenuMeta(label: '代码生成', icon: Icons.settings, path: '/code_gen'), + MenuMeta(label: '要点集录', icon: Icons.settings, path: '/pointer'), +]; + + +// final RouteBase appRoute = ShellRoute( +// builder: (BuildContext context, GoRouterState state, Widget child) { +// return AppNavigation(navigator: child); +// }, +// routes: [ +// colorRouters, +// GoRoute( +// path: 'counter', +// builder: (BuildContext context, GoRouterState state) { +// return const CounterPage(); +// }), +// sortRouters, +// GoRoute( +// path: 'user', +// builder: (BuildContext context, GoRouterState state) { +// return const UserPage(); +// }, +// ), +// GoRoute( +// path: 'settings', +// builder: (BuildContext context, GoRouterState state) { +// return const SettingPage(); +// }, +// ), +// GoRoute( +// path: '404', +// builder: (BuildContext context, GoRouterState state) { +// String msg = '无法访问: ${state.extra}'; +// return EmptyPanel(msg: msg); +// }, +// ) +// ], +// ); diff --git a/lib/app/router/desk/root.dart b/lib/app/router/desk/root.dart new file mode 100644 index 00000000..4fe06a31 --- /dev/null +++ b/lib/app/router/desk/root.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../views/splash/standard_unit_splash.dart'; +import 'app.dart'; + +final RouteBase rootRoute = GoRoute( + path: '/', + redirect: _redirect, + routes: [ + // appRoute, + // GoRoute( + // path: 'login', + // builder: (BuildContext context, GoRouterState state) { + // return const LoginPage(); + // }, + // ), + GoRoute( + path: 'splash', + builder: (BuildContext context, GoRouterState state) { + return const StandardUnitSplash(); + }, + ), + ], +); + +FutureOr _redirect(BuildContext context, GoRouterState state) { + if(state.fullPath=='/'){ + return '/splash'; + } + return null; +} diff --git a/lib/app/router/menu_meta.dart b/lib/app/router/menu_meta.dart new file mode 100644 index 00000000..34032961 --- /dev/null +++ b/lib/app/router/menu_meta.dart @@ -0,0 +1,23 @@ + + +import 'package:flutter/material.dart'; + +class MenuMeta { + // 标签 + final String label; + + final String? path; + + // 图标数据 + final IconData icon; + + // 图标颜色 + final Color? color; + + const MenuMeta({ + required this.label, + this.path, + required this.icon, + this.color, + }); +} diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index d1bf0465..b13d9d47 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -12,8 +12,8 @@ dependencies: sdk: flutter flutter_bloc: ^8.1.3 # 状态管理 equatable: ^2.0.5 # 相等辅助 - shared_preferences: ^2.2.1 # xml 固化 - connectivity_plus: ^4.0.2 + shared_preferences: ^2.2.2 # xml 固化 + connectivity_plus: ^5.0.2 window_manager: ^0.3.7 #桌面尺寸 storage: path: ../storage diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 13814716..415bc084 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -10,8 +10,9 @@ environment: dependencies: flutter: sdk: flutter + sqflite: ^2.3.0 # 数据库 - sqflite_common_ffi: ^2.3.0+2 # 数据库 + sqflite_common_ffi: ^2.3.1 # 数据库 shared_preferences: ^2.2.1 # xml 固化 path_provider: ^2.1.1 # 路径 diff --git a/packages/utils/pubspec.yaml b/packages/utils/pubspec.yaml index 9e3d7896..e558a7bb 100644 --- a/packages/utils/pubspec.yaml +++ b/packages/utils/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - dio: ^5.3.2 # 网络请求 + dio: ^5.4.0 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 dev_dependencies: flutter_test: diff --git a/pubspec.lock b/pubspec.lock index 7bcc0ef7..6d429c67 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -26,10 +26,10 @@ packages: dependency: "direct main" description: name: archive - sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.9" + version: "3.4.9" args: dependency: transitive description: @@ -111,10 +111,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b" + sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.2" + version: "5.0.2" connectivity_plus_platform_interface: dependency: transitive description: @@ -143,10 +143,10 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.2" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -175,10 +175,10 @@ packages: dependency: "direct main" description: name: dio - sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197 + sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.3.2" + version: "5.4.0" equatable: dependency: "direct main" description: @@ -215,10 +215,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: be325344c1f3070354a1d84a231a1ba75ea85d413774ec4bdf444c023342e030 + sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.5.0" + version: "6.1.1" flutter: dependency: "direct main" description: flutter @@ -295,6 +295,14 @@ packages: description: flutter source: sdk version: "0.0.0" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: c5fa45fa502ee880839e3b2152d987c44abae26d064a2376d4aad434cf0f7b15 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "12.1.3" http: dependency: transitive description: @@ -351,6 +359,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.2.0" markdown: dependency: transitive description: @@ -515,10 +531,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.6.2" + version: "3.7.3" process: dependency: transitive description: @@ -563,26 +579,26 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11" + sha256: f74fc3f1cbd99f39760182e176802f693fa0ec9625c045561cfad54681ea93dd url: "https://pub.flutter-io.cn/" source: hosted - version: "7.1.0" + version: "7.2.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7" + sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.0" + version: "3.3.1" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: @@ -656,26 +672,26 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" + sha256: bb4738f15b23352822f4c42a531677e5c6f522e079461fd240ead29d8d8a54a6 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.5.0" + version: "2.5.0+2" sqflite_common_ffi: dependency: "direct main" description: name: sqflite_common_ffi - sha256: "0d5cc1be2eb18400ac6701c31211d44164393aa75886093002ecdd947be04f93" + sha256: "873677ee78738a723d1ded4ccb23980581998d873d30ee9c331f6a81748663ff" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.0+2" + version: "2.3.1" sqlite3: dependency: transitive description: name: sqlite3 - sha256: db65233e6b99e99b2548932f55a987961bc06d82a31a0665451fa0b4fff4c3fb + sha256: "8922805564b78eb7aa9386c10056d377a541ac7270dc6a1589176277ebb4d15d" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.0" + version: "2.2.0" stack_trace: dependency: transitive description: @@ -878,34 +894,34 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755" + sha256: "42393b4492e629aa3a88618530a4a00de8bb46e50e7b3993fedbfdc5352f0dbf" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.2.4" + version: "4.4.2" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "69787707339e7588aad256386475c18223cc0da87d9812343bc27c33c01eeab4" + sha256: "8326ee235f87605a2bfc444a4abc897f4abc78d83f054ba7d3d1074ce82b4fbf" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.8.1" + version: "3.12.1" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "656e2aeaef318900fffd21468b6ddc7958c7092a642f0e7220bac328b70d4a81" + sha256: "68e86162aa8fc646ae859e1585995c096c95fc2476881fa0c4a8d10f56013a5a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.8.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "7ae75a1a76b9463ae9278de7759ead68aa0eeb70f8d0175e3f9a6c43e911fe76" + sha256: accdaaa49a2aca2dc3c3230907988954cdd23fed0a19525d6c9789d380f4dc76 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.6.1" + version: "3.9.4" widget_module: dependency: "direct main" description: @@ -984,5 +1000,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.2.0 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index acec4142..b59d493b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,19 +21,19 @@ dependencies: equatable: ^2.0.5 # 相等辅助 stream_transform: ^2.1.0 - archive: ^3.3.9 # 解压 + archive: ^3.4.9 # 解压 package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 - webview_flutter: ^4.2.4 - + webview_flutter: ^4.4.2 + go_router: ^12.1.1 sqflite: ^2.3.0 # 数据库 - sqflite_common_ffi: ^2.3.0+2 # 数据库 - shared_preferences: ^2.2.1 # xml 固化 + sqflite_common_ffi: ^2.3.1 # 数据库 + shared_preferences: ^2.2.2 # xml 固化 path_provider: ^2.1.1 # 路径 - dio: ^5.3.2 # 网络请求 + dio: ^5.4.0 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 - connectivity_plus: ^4.0.2 + connectivity_plus: ^5.0.2 refresh: ^1.0.1 toggle_rotate: ^1.0.1 @@ -43,7 +43,7 @@ dependencies: yaml_modify: ^1.0.1 url_launcher: ^6.1.14 # url - share_plus: ^7.1.0 # 文字分享 + share_plus: ^7.2.1 # 文字分享 flutter_svg: ^2.0.7 intl: ^0.18.0 @@ -52,7 +52,7 @@ dependencies: flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.6.4 # markdown # file_selector: ^0.9.2+2 - file_picker: ^5.5.0 + file_picker: ^6.1.1 widget_repository: path: packages/widget_repository From 2beb81c67868ca95f0d09e34105a13ad81d2b2ab Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 28 Dec 2023 19:55:24 +0800 Subject: [PATCH 046/149] InheritedNotifier --- README.md | 1 + doc/ewm/coffee.webp | Bin 33130 -> 39614 bytes 2 files changed, 1 insertion(+) diff --git a/README.md b/README.md index b109d0f9..1b44510d 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ Tools • Dart 3.2.3 • DevTools 2.28.4 ![](./doc/ewm/coffee.webp) + #### Star History [![Star History Chart](https://api.star-history.com/svg?repos=toly1994328/FlutterUnit&type=Date)](https://star-history.com/#toly1994328/FlutterUnit&Date) diff --git a/doc/ewm/coffee.webp b/doc/ewm/coffee.webp index b8ba8add432906ea8dd0bda4cc8cef4f2f948e0e..53ff28e9374e07b367d9b69b458f3bd4ca817d25 100644 GIT binary patch literal 39614 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 G0002cdJ9qj literal 33130 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�^!^~DH!Ksn>WGU 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℘xlJ+Q92^`wtOF}q$Qz`k855L_e( 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 From ecf9545f4eb6029c4833438d7a1c51147487027b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 28 Dec 2023 19:58:33 +0800 Subject: [PATCH 047/149] InheritedNotifier --- README.md | 2 +- doc/ewm/{coffee.webp => coffee1.webp} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename doc/ewm/{coffee.webp => coffee1.webp} (100%) diff --git a/README.md b/README.md index 1b44510d..5d6a56eb 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Tools • Dart 3.2.3 • DevTools 2.28.4 > 开源不易,请我喝咖啡 ~ -![](./doc/ewm/coffee.webp) +![](./doc/ewm/coffee1.webp) diff --git a/doc/ewm/coffee.webp b/doc/ewm/coffee1.webp similarity index 100% rename from doc/ewm/coffee.webp rename to doc/ewm/coffee1.webp From af36130afe1ccd8734a6ab0f9132539521b63faa Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 11 Jan 2024 14:39:22 +0800 Subject: [PATCH 048/149] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E5=8D=87=E7=BA=A7:=E6=A1=8C=E9=9D=A2=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- lib/app/bloc_wrapper.dart | 48 +++--- lib/app/flutter_unit.dart | 33 ++-- lib/app/navigation/route/route.dart | 41 ----- lib/app/router/desk/app.dart | 49 ------ lib/app/router/desk/root.dart | 34 ---- lib/app/router/unit_router.dart | 148 ----------------- lib/app/utils/Toast.dart | 32 ---- lib/app/utils/color_utils.dart | 73 --------- lib/app/utils/convert.dart | 51 ------ lib/app/utils/pather.dart | 25 --- lib/app/utils/random_provider.dart | 7 - lib/app/utils/toly_utils.dart | 3 - lib/app/views/about/about_app_page.dart | 3 +- lib/app/views/about/about_me_page.dart | 2 +- lib/app/views/about/version_info.dart | 5 +- .../views/data_manage/data_manage_page.dart | 6 +- lib/app/views/setting/code_style_setting.dart | 7 +- lib/app/views/setting/font_setting.dart | 7 +- lib/app/views/setting/setting_page.dart | 35 ++-- .../views/setting/theme_color_setting.dart | 7 +- .../views/setting/theme_model_setting.dart | 12 +- .../views/splash/standard_unit_splash.dart | 137 ---------------- .../time_line/flutter_unit_time_line.dart | 2 +- lib/app/views/unit_todo/attr_unit_page.dart | 2 +- lib/app/views/unit_todo/layout_unit_page.dart | 2 +- lib/app/views/unit_todo/paint_unit_page.dart | 2 +- lib/app/views/unit_todo/point_unit_page.dart | 4 +- lib/app_stater/app_starter.dart | 2 + lib/app_stater/bloc/bloc.dart | 49 ++++++ lib/app_stater/bloc/state.dart | 22 +++ .../app_stater/repository/repository.dart | 36 ++--- lib/app_stater/view/app_start_listener.dart | 38 +++++ .../view}/flutter_unit_text.dart | 0 lib/app_stater/view/standard_unit_splash.dart | 152 ++++++++++++++++++ lib/main.dart | 2 +- .../menus}/menu_meta.dart | 0 lib/navigation/routers/app_route.dart | 27 ++++ lib/navigation/routers/desk_route.dart | 127 +++++++++++++++ lib/navigation/routers/mobile_route.dart | 114 +++++++++++++ .../desk/flutter_unit_desk_navigation.dart | 70 ++++++++ .../views/desk}/theme_model_switch_icon.dart | 4 +- .../views/desk}/unit_desk_navigation.dart | 32 ++-- .../views/desk}/unit_rail_navigation.dart | 70 ++++---- .../views}/overlay_tool_wrapper.dart | 10 +- .../views}/pure_bottom_bar.dart | 0 .../views}/unit_navigation.dart | 22 ++- lib/widget_ui/widget_ui.dart | 8 - .../lib/src/views/top_bar/sort_bar.dart | 8 +- packages/algorithm/pubspec.yaml | 2 + packages/app/lib/app.dart | 14 +- packages/app/lib/app/cons/cons.dart | 6 +- .../views/window_buttons.dart | 0 .../window/windows_adapter.dart | 4 +- .../app/lib/app/router/fade_page_route.dart | 2 +- packages/app/lib/app/router/router_utils.dart | 5 - .../app/lib/app/router/slide_page_route.dart | 2 +- packages/app/lib/app/router/unit_router.dart | 33 ---- .../app/lib/app/router/zero_page_route.dart | 2 +- .../fade_page_transitions_builder.dart | 19 +++ .../transition/size_clip_transition.dart | 105 ++++++++++++ .../cupertino_back_gesture_detector.dart | 0 .../slide_page_transition_builder.dart | 32 ++++ packages/app/lib/app/theme/app_theme.dart | 24 ++- packages/app/lib/app_config/app_config.dart | 3 + .../bloc/bloc.dart} | 28 ++-- .../bloc/state.dart} | 58 ++++--- .../lib/app_config/repository/repository.dart | 12 ++ .../update => app_update/bloc}/bloc.dart | 0 .../update => app_update/bloc}/event.dart | 0 .../update => app_update/bloc}/state.dart | 0 packages/app/lib/model/app_style.dart | 1 - packages/app/pubspec.yaml | 8 +- packages/artifact/lib/artifact.dart | 10 +- .../bloc}/article/bloc.dart | 5 +- .../bloc}/columnize/bloc.dart | 5 +- .../lib/src/{blocs => articles/bloc}/exp.dart | 0 .../data}/db/article_dao.dart | 3 +- .../data}/db/columnize_dao.dart | 3 +- .../{repositories => articles/data}/exp.dart | 0 .../data}/model/article.dart | 0 .../data}/model/columnize.dart | 0 .../data}/repository/article_repository.dart | 8 +- .../repository/columnize_repository.dart | 5 +- .../view}/article/article_detail_page.dart | 4 +- .../view}/article/column_detail_page.dart | 2 +- .../view}/article/columnize_page_view.dart | 8 +- .../view}/article/sliver_article.dart | 4 +- .../view}/article/sliver_columnize.dart | 0 .../article/toly_article_scroll_page.dart | 6 +- .../view}/artifact_page.dart | 8 +- .../view}/building/building_panel.dart | 0 .../view}/toly_refresh_indicator.dart | 0 .../view}/wrapper/refresh.dart | 0 .../points/bloc}/point_bloc/point_bloc.dart | 2 +- .../points/bloc}/point_bloc/point_event.dart | 0 .../points/bloc}/point_bloc/point_state.dart | 3 +- .../point_comment_bloc.dart | 4 +- .../point_comment_event.dart | 2 +- .../point_comment_state.dart | 4 +- .../src/points/bloc}/point_system_bloc.dart | 0 .../lib/src/points/data}/api/app_info.dart | 0 .../src/points/data}/api/category_api.dart | 0 .../lib/src/points/data}/api/issues_api.dart | 5 +- .../src/points/data/model}/github_model.dart | 0 .../src/points/data/model}/github_user.dart | 0 .../lib/src/points/data/model}/issue.dart | 0 .../src/points/data/model}/issue_comment.dart | 0 .../lib/src/points/data/model}/license.dart | 0 .../src/points/data/model}/repository.dart | 0 .../data/model}/repository_permissions.dart | 0 packages/artifact/lib/src/points/exp.dart | 8 + .../points/view}/desk_ui/desk_point_page.dart | 19 ++- .../view}/desk_ui/github_repo_panel.dart | 5 +- .../points/view}/issues_point/issue_item.dart | 6 +- .../view}/issues_point/issues_detail.dart | 10 +- .../view}/issues_point/issues_point_page.dart | 15 +- .../view}/issues_point/repo_widget.dart | 9 +- packages/artifact/pubspec.yaml | 2 + .../lib/views/mobile/login/login_form.dart | 4 +- .../views/mobile/register/arc_clipper.dart | 2 +- .../views/mobile/register/register_page.dart | 2 +- .../lib/views/mobile/user/page_item.dart | 19 +-- .../lib/views/mobile/user/user_account.dart | 2 +- .../lib/views/mobile/user/user_page.dart | 2 +- packages/authentication/pubspec.yaml | 3 + .../{widget_repository => awesome}/.gitignore | 1 - .../{widget_repository => awesome}/.metadata | 4 +- .../CHANGELOG.md | 0 .../{widget_repository => awesome}/LICENSE | 0 .../{widget_repository => awesome}/README.md | 0 .../analysis_options.yaml | 0 packages/awesome/lib/awesome.dart | 7 + .../listenable/change_notifier_01/main.dart | 0 .../notifier/progress_value_notifier.dart | 0 .../page/detail/detail_progress_view.dart | 0 .../page/detail/download_detail.dart | 0 .../page/home/home_page.dart | 0 .../page/home/home_progress_view.dart | 0 .../listenable/change_notifier_02/main.dart | 8 +- .../notifier/download_data_scope.dart | 0 .../notifier/progress_value_notifier.dart | 0 .../page/detail/detail_progress_view.dart | 0 .../page/detail/download_detail.dart | 0 .../page/home/home_page.dart | 0 .../page/home/home_progress_view.dart | 2 +- .../pubspec.yaml | 13 +- packages/awesome/test/awesome_test.dart | 12 ++ packages/components/lib/components.dart | 3 +- .../components/lib/project_ui/project_ui.dart | 4 +- .../top_bar/desk_simple_top_bar.dart | 6 +- .../project_ui}/top_bar/desk_tab_top_bar.dart | 3 +- packages/components/pubspec.yaml | 4 + packages/draw_system/.gitignore | 29 ++++ packages/draw_system/.metadata | 10 ++ packages/draw_system/CHANGELOG.md | 3 + packages/draw_system/LICENSE | 1 + packages/draw_system/README.md | 39 +++++ packages/draw_system/analysis_options.yaml | 4 + packages/draw_system/lib/draw_system.dart | 6 + .../anim/bezier3_player/bezier3_palyer.dart | 0 .../src}/anim/bezier3_player/touch_info.dart | 0 .../lib/src}/anim/circle_halo.dart | 0 .../src}/anim/curve_shower/anim_painter.dart | 0 .../anim/curve_shower/curve_anim_shower.dart | 2 +- .../src}/anim/curve_shower/point_data.dart | 0 .../draw_system/lib/src}/anim/draw_path.dart | 0 .../lib/src}/anim/dundun_path.dart | 0 .../anim/rotate_by_point/angle_panter.dart | 0 .../lib/src}/anim/rotate_by_point/line.dart | 0 .../anim/rotate_by_point/rotate_by_point.dart | 0 .../lib/src}/anim/spring_widget.dart | 0 .../lib/src}/art/circle_packing.dart | 0 .../lib/src}/art/cubic_disarray.dart | 0 .../lib/src}/art/hypnotic_squares.dart | 0 .../lib/src}/art/joy_division.dart | 0 .../lib/src}/art/piet_mondrian.dart | 0 .../draw_system/lib/src}/art/tiled_lines.dart | 0 .../lib/src}/art/triangular_mesh.dart | 0 .../lib/src}/art/un_deux_trois.dart | 0 .../lib/src}/base/clock_widget.dart | 0 .../src}/base/digital/digital_painter.dart | 0 .../lib/src}/base/digital/digital_path.dart | 0 .../lib/src}/base/digital/digital_shower.dart | 0 .../lib/src}/base/digital/digital_widget.dart | 0 .../lib/src}/base/draw_grid_axis.dart | 0 .../lib/src}/base/draw_path_fun.dart | 0 .../lib/src}/base/draw_picture.dart | 0 .../lib/src}/base/n_side/n_side_page.dart | 0 .../lib/src}/base/n_side/shape_painter.dart | 0 .../lib/src}/base/polar/angle_painter.dart | 0 .../lib/src}/base/polar/polar.dart | 0 .../src}/base/polar/polar_painter_widget.dart | 0 .../draw_system/lib/src}/base/windmill.dart | 0 .../lib/src}/bloc/gallery_unit/bloc.dart | 0 .../lib/src}/desk_ui/desk_frame.dart | 3 +- .../lib/src}/desk_ui/desk_gallery_unit.dart | 19 ++- .../lib/src}/fun/bufeng/bufeng_panel.dart | 0 .../lib/src}/fun/bufeng/config.dart | 0 .../lib/src}/fun/bufeng/painter.dart | 0 .../draw_system/lib/src}/fun/dundun_view.dart | 0 .../lib/src}/fun/random_portrait.dart | 0 .../lib/src}/fun/stemp/stamp_data.dart | 0 .../lib/src}/fun/stemp/stamp_paper.dart | 0 .../lib/src}/gallery_card_item.dart | 30 ++-- .../lib/src}/gallery_detail_page.dart | 5 +- .../draw_system/lib/src}/gallery_factory.dart | 2 +- .../draw_system/lib/src}/gallery_unit.dart | 8 +- .../lib/src}/particle/out/clock_fx.dart | 0 .../lib/src}/particle/out/clock_widget.dart | 0 .../lib/src}/particle/out/particle.dart | 0 .../lib/src}/particle/out/rnd.dart | 0 .../lib/src}/particle/random/particle.dart | 0 .../src}/particle/random/particle_manage.dart | 0 .../src}/particle/random/random_particle.dart | 0 .../src}/particle/random/world_render.dart | 0 .../lib/src}/particle/split/particle.dart | 0 .../src}/particle/split/particle_manage.dart | 0 .../src}/particle/split/particle_split.dart | 0 .../lib/src}/particle/split/world_render.dart | 0 .../lib/src}/particle/split_img/particle.dart | 0 .../particle/split_img/particle_manage.dart | 0 .../src}/particle/split_img/split_image.dart | 0 .../src}/particle/split_img/world_render.dart | 0 .../draw_system/lib/src}/picture_frame.dart | 0 .../draw_system/lib/src}/utils/colors.dart | 0 .../lib/src}/utils/coordinate.dart | 0 packages/draw_system/pubspec.yaml | 63 ++++++++ .../draw_system/test/draw_system_test.dart | 12 ++ .../lib/src/db_storage/dao/widget_dao.dart | 12 +- packages/storage/pubspec.yaml | 4 +- packages/toly_ui/.gitignore | 29 ++++ packages/toly_ui/.metadata | 10 ++ packages/toly_ui/CHANGELOG.md | 3 + packages/toly_ui/LICENSE | 1 + packages/toly_ui/README.md | 39 +++++ packages/toly_ui/analysis_options.yaml | 4 + .../lib/adapter/platform_view_adapter.dart | 77 +++++++++ .../lib}/button/feedback_widget.dart | 0 .../toly_ui => toly_ui/lib}/code/code.dart | 0 .../lib}/code/code_widget.dart | 0 .../lib}/code/high_light_code.dart | 0 .../lib}/code/highlighter_style.dart | 0 .../lib}/code/language/dart_languge.dart | 0 .../lib}/code/language/language.dart | 0 .../decorations/round_rect_rab_indicator.dart | 0 .../lib}/default/loading/planet_loading.dart | 4 +- .../lib}/dialog/alert_conform_dialog.dart | 0 .../lib}/dialog/delete_message_panel.dart | 2 +- .../lib}/input/edit_panel.dart | 0 .../lib}/input/icon_input.dart | 0 .../lib}/input/input_button.dart | 0 .../lib}/markdown/markdown_widget.dart | 0 .../lib}/markdown/md_text_styles.dart | 0 .../lib}/markdown/syntax_high_lighter.dart | 0 .../lib}/object/windmill.dart | 0 .../lib}/popable/drop_selectable_widget.dart | 0 .../lib}/selector/burst_menu.dart | 0 .../lib}/selector/color_chooser.dart | 3 +- .../lib}/selector/multi_chip_filter.dart | 0 .../sliver_header/sliver_pinned_header.dart | 0 .../sliver_header/sliver_snap_header.dart | 0 .../toly_ui => toly_ui/lib}/ti/circle.dart | 0 .../lib}/ti/circle_image.dart | 0 .../lib}/ti/circle_text.dart | 0 .../lib}/ti/color_wrapper.dart | 0 .../lib}/ti/math_runner.dart | 0 .../lib/toly_ui => toly_ui/lib}/ti/panel.dart | 0 .../lib/toly_ui => toly_ui/lib}/ti/tag.dart | 0 .../lib}/ti/text_typer.dart | 0 .../lib}/ti/toly_switch_list_tile.dart | 0 .../lib/toly_ui => toly_ui/lib}/toly_ui.dart | 4 +- packages/toly_ui/pubspec.yaml | 55 +++++++ packages/toly_ui/test/toly_ui_test.dart | 12 ++ packages/treasure_tools/.gitignore | 29 ++++ packages/treasure_tools/.metadata | 10 ++ packages/treasure_tools/CHANGELOG.md | 3 + packages/treasure_tools/LICENSE | 1 + packages/treasure_tools/README.md | 39 +++++ packages/treasure_tools/analysis_options.yaml | 4 + .../treasure_tools/lib/src}/bloc/state.dart | 8 +- .../lib/src}/class_generator.dart | 0 .../lib/src}/code_gen_page.dart | 2 +- .../lib/src}/data/task_result.dart | 0 .../lib/src}/desk_widget_top_bar.dart | 4 +- .../icon_font_gen/gen_message_action.dart | 0 .../icon_font_gen/icon_font_class_parser.dart | 0 .../icon_font_gen/icon_font_gen_config.dart | 0 .../icon_font_gen/icon_font_gen_page.dart | 0 .../treasure_tools/lib/src}/model/class.dart | 0 .../treasure_tools/lib/src}/model/field.dart | 0 .../lib/src}/popable/class_gen_field.dart | 2 +- .../lib/src}/popable/toly_select.dart | 0 .../treasure_tools/lib/src}/wrapper.dart | 0 .../treasure_tools/lib/treasure_tools.dart | 3 + packages/treasure_tools/pubspec.yaml | 64 ++++++++ .../test}/iconfont_parser_test.dart | 3 +- .../test/treasure_tools_test.dart | 12 ++ .../treasure_tools/test/yaml_parser_test.dart | 51 ++++++ .../test/yaml_parser_test2.dart | 64 ++++++++ .../utils/lib/src}/convert_man.dart | 0 packages/utils/lib/utils.dart | 1 + .../blocs/category_bloc/category_bloc.dart | 3 +- .../category_widget_bloc.dart | 3 +- .../liked_widget_bloc/liked_widget_bloc.dart | 3 +- .../widget_detail_bloc.dart | 4 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 8 +- .../lib/data}/category_repository.dart | 0 .../data}/db_impl/catagory_db_repository.dart | 3 +- .../lib/data}/db_impl/db_impl.dart | 0 .../lib/data}/db_impl/node_db_repository.dart | 2 +- .../data}/db_impl/widget_db_repository.dart | 15 +- packages/widget_module/lib/data/exp.dart | 5 + .../lib/data}/model/category_model.dart | 0 .../lib/data}/model/enums.dart | 0 .../lib/data}/model/model.dart | 0 .../lib/data}/model/node_model.dart | 0 .../lib/data}/model/widget_filter.dart | 0 .../lib/data}/model/widget_model.dart | 3 +- .../lib/data}/node_repository.dart | 0 .../lib/data}/widget_repository.dart | 2 + .../category_panel/desk_category_page.dart | 26 +-- .../category_panel/desk_top_like_panel.dart | 4 +- .../lib/views/desk_ui/desk_ui.dart | 3 + .../widget_detail/link_widget_buttons.dart | 2 +- .../widget_detail/widget_detail_bar.dart | 5 +- .../widget_detail/widget_detail_page.dart | 55 +++++-- .../widget_detail/widget_detail_panel.dart | 5 +- .../widget_detail/widget_node_panel.dart | 2 +- .../desk_ui/widget_panel/desk_search_bar.dart | 11 +- .../widget_panel/desk_widget_model_item.dart | 4 +- .../widget_panel/desk_widget_top_bar.dart | 2 +- .../desk_ui/widget_panel/widget_panel.dart | 12 +- .../mobile/category_page/category_detail.dart | 11 +- .../category_page/category_list_item.dart | 6 +- .../mobile/category_page/category_page.dart | 10 +- .../mobile/category_page/collect_page.dart | 3 +- .../category_page/delete_category_dialog.dart | 2 +- .../category_page/edit_category_panel.dart | 7 +- .../mobile/category_page/empty_category.dart | 2 +- .../category_page/home_right_drawer.dart | 7 +- .../category_page/like_widget_page.dart | 5 +- .../category_page/sync/async_button.dart | 8 +- .../category_page/sync/category_api.dart | 73 +++++++++ .../category_page/sync/upload_button.dart | 7 +- .../lib/views/mobile/mobile_ui.dart | 7 + .../mobile/search_page/app_search_bar.dart | 3 +- .../mobile/search_page/search_page.dart | 0 .../search_page/standard_search_bar.dart | 3 +- .../search_page/standard_search_page.dart | 11 +- .../widget_detail/category_end_drawer.dart | 9 +- .../collect_widget_list_item.dart | 5 +- .../widget_detail/widget_detail_bar.dart | 5 +- .../widget_detail/widget_detail_page.dart | 4 +- .../widget_detail/widget_detail_panel.dart | 5 +- .../widget_detail/widget_node_panel.dart | 2 +- .../mobile/widget_page}/home_drawer.dart | 14 +- .../widget_page}/phone_widget_content.dart | 10 +- .../widget_page}/standard_home_page.dart | 10 +- .../widget_page}/standard_home_search.dart | 2 +- .../widget_page}/unit_drawer_header.dart | 0 .../widget_page}/widget_list_panel.dart | 0 .../widget_page}/widget_model_item.dart | 3 +- .../mobile/widget_page}/widget_page.dart | 0 packages/widget_module/lib/widget_module.dart | 4 +- packages/widget_module/pubspec.yaml | 21 ++- .../lib/widget_repository.dart | 7 - .../test/widget_repository_test.dart | 4 - pubspec.lock | 29 +++- pubspec.yaml | 7 +- test/yaml_parser_test.dart | 52 ------ test/yaml_parser_test2.dart | 65 -------- 372 files changed, 2277 insertions(+), 1325 deletions(-) delete mode 100644 lib/app/navigation/route/route.dart delete mode 100644 lib/app/router/desk/app.dart delete mode 100644 lib/app/router/desk/root.dart delete mode 100644 lib/app/router/unit_router.dart delete mode 100644 lib/app/utils/Toast.dart delete mode 100644 lib/app/utils/color_utils.dart delete mode 100644 lib/app/utils/convert.dart delete mode 100644 lib/app/utils/pather.dart delete mode 100644 lib/app/utils/random_provider.dart delete mode 100644 lib/app/utils/toly_utils.dart delete mode 100644 lib/app/views/splash/standard_unit_splash.dart create mode 100644 lib/app_stater/app_starter.dart create mode 100644 lib/app_stater/bloc/bloc.dart create mode 100644 lib/app_stater/bloc/state.dart rename packages/app/lib/repository/app_state_repository.dart => lib/app_stater/repository/repository.dart (70%) create mode 100644 lib/app_stater/view/app_start_listener.dart rename lib/{app/views/splash => app_stater/view}/flutter_unit_text.dart (100%) create mode 100644 lib/app_stater/view/standard_unit_splash.dart rename lib/{app/router => navigation/menus}/menu_meta.dart (100%) create mode 100644 lib/navigation/routers/app_route.dart create mode 100644 lib/navigation/routers/desk_route.dart create mode 100644 lib/navigation/routers/mobile_route.dart create mode 100644 lib/navigation/views/desk/flutter_unit_desk_navigation.dart rename lib/{app/navigation/desk_ui => navigation/views/desk}/theme_model_switch_icon.dart (80%) rename lib/{app/navigation/desk_ui => navigation/views/desk}/unit_desk_navigation.dart (69%) rename lib/{app/navigation/desk_ui => navigation/views/desk}/unit_rail_navigation.dart (86%) rename lib/{app/navigation => navigation/views}/overlay_tool_wrapper.dart (96%) rename lib/{app/navigation => navigation/views}/pure_bottom_bar.dart (100%) rename lib/{app/navigation => navigation/views}/unit_navigation.dart (83%) delete mode 100644 lib/widget_ui/widget_ui.dart rename packages/app/lib/{ => app}/platform_adapter/views/window_buttons.dart (100%) rename packages/app/lib/{ => app}/platform_adapter/window/windows_adapter.dart (95%) delete mode 100644 packages/app/lib/app/router/router_utils.dart delete mode 100644 packages/app/lib/app/router/unit_router.dart create mode 100644 packages/app/lib/app/style/transition/fade_page_transitions_builder.dart create mode 100644 packages/app/lib/app/style/transition/size_clip_transition.dart rename packages/app/lib/app/{router => style/transition/slide_transition}/cupertino_back_gesture_detector.dart (100%) create mode 100644 packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart create mode 100644 packages/app/lib/app_config/app_config.dart rename packages/app/lib/{bloc/global_bloc.dart => app_config/bloc/bloc.dart} (73%) rename packages/app/lib/{model/global_state.dart => app_config/bloc/state.dart} (78%) create mode 100644 packages/app/lib/app_config/repository/repository.dart rename packages/app/lib/{bloc/update => app_update/bloc}/bloc.dart (100%) rename packages/app/lib/{bloc/update => app_update/bloc}/event.dart (100%) rename packages/app/lib/{bloc/update => app_update/bloc}/state.dart (100%) delete mode 100644 packages/app/lib/model/app_style.dart rename packages/artifact/lib/src/{blocs => articles/bloc}/article/bloc.dart (93%) rename packages/artifact/lib/src/{blocs => articles/bloc}/columnize/bloc.dart (85%) rename packages/artifact/lib/src/{blocs => articles/bloc}/exp.dart (100%) rename packages/artifact/lib/src/{repositories => articles/data}/db/article_dao.dart (97%) rename packages/artifact/lib/src/{repositories => articles/data}/db/columnize_dao.dart (96%) rename packages/artifact/lib/src/{repositories => articles/data}/exp.dart (100%) rename packages/artifact/lib/src/{repositories => articles/data}/model/article.dart (100%) rename packages/artifact/lib/src/{repositories => articles/data}/model/columnize.dart (100%) rename packages/artifact/lib/src/{repositories => articles/data}/repository/article_repository.dart (81%) rename packages/artifact/lib/src/{repositories => articles/data}/repository/columnize_repository.dart (82%) rename packages/artifact/lib/src/{views => articles/view}/article/article_detail_page.dart (97%) rename packages/artifact/lib/src/{views => articles/view}/article/column_detail_page.dart (94%) rename packages/artifact/lib/src/{views => articles/view}/article/columnize_page_view.dart (97%) rename packages/artifact/lib/src/{views => articles/view}/article/sliver_article.dart (98%) rename packages/artifact/lib/src/{views => articles/view}/article/sliver_columnize.dart (100%) rename packages/artifact/lib/src/{views => articles/view}/article/toly_article_scroll_page.dart (95%) rename packages/artifact/lib/src/{views => articles/view}/artifact_page.dart (98%) rename packages/artifact/lib/src/{views => articles/view}/building/building_panel.dart (100%) rename packages/artifact/lib/src/{views => articles/view}/toly_refresh_indicator.dart (100%) rename packages/artifact/lib/src/{views => articles/view}/wrapper/refresh.dart (100%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_bloc/point_bloc.dart (90%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_bloc/point_event.dart (100%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_bloc/point_state.dart (88%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_comment_bloc/point_comment_bloc.dart (87%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_comment_bloc/point_comment_event.dart (82%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_comment_bloc/point_comment_state.dart (91%) rename {lib/point_system/blocs => packages/artifact/lib/src/points/bloc}/point_system_bloc.dart (100%) rename {lib/point_system => packages/artifact/lib/src/points/data}/api/app_info.dart (100%) rename {lib/point_system => packages/artifact/lib/src/points/data}/api/category_api.dart (100%) rename {lib/point_system => packages/artifact/lib/src/points/data}/api/issues_api.dart (91%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/github_model.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/github_user.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/issue.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/issue_comment.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/license.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/repository.dart (100%) rename {lib/point_system/github_model => packages/artifact/lib/src/points/data/model}/repository_permissions.dart (100%) create mode 100644 packages/artifact/lib/src/points/exp.dart rename {lib/point_system/views => packages/artifact/lib/src/points/view}/desk_ui/desk_point_page.dart (90%) rename {lib/point_system/views => packages/artifact/lib/src/points/view}/desk_ui/github_repo_panel.dart (98%) rename {lib/point_system/views => packages/artifact/lib/src/points/view}/issues_point/issue_item.dart (93%) rename {lib/point_system/views => packages/artifact/lib/src/points/view}/issues_point/issues_detail.dart (95%) rename {lib/point_system/views => packages/artifact/lib/src/points/view}/issues_point/issues_point_page.dart (91%) rename {lib/point_system/views => packages/artifact/lib/src/points/view}/issues_point/repo_widget.dart (93%) rename packages/{widget_repository => awesome}/.gitignore (98%) rename packages/{widget_repository => awesome}/.metadata (76%) rename packages/{widget_repository => awesome}/CHANGELOG.md (100%) rename packages/{widget_repository => awesome}/LICENSE (100%) rename packages/{widget_repository => awesome}/README.md (100%) rename packages/{widget_repository => awesome}/analysis_options.yaml (100%) create mode 100644 packages/awesome/lib/awesome.dart rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/main.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/notifier/progress_value_notifier.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/page/detail/detail_progress_view.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/page/detail/download_detail.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/page/home/home_page.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_01/page/home/home_progress_view.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/main.dart (81%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/notifier/download_data_scope.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/notifier/progress_value_notifier.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/page/detail/detail_progress_view.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/page/detail/download_detail.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/page/home/home_page.dart (100%) rename {lib/awesome => packages/awesome/lib}/listenable/change_notifier_02/page/home/home_progress_view.dart (86%) rename packages/{widget_repository => awesome}/pubspec.yaml (88%) create mode 100644 packages/awesome/test/awesome_test.dart rename {lib/components => packages/components/lib/project_ui}/top_bar/desk_simple_top_bar.dart (78%) rename {lib/components => packages/components/lib/project_ui}/top_bar/desk_tab_top_bar.dart (95%) create mode 100644 packages/draw_system/.gitignore create mode 100644 packages/draw_system/.metadata create mode 100644 packages/draw_system/CHANGELOG.md create mode 100644 packages/draw_system/LICENSE create mode 100644 packages/draw_system/README.md create mode 100644 packages/draw_system/analysis_options.yaml create mode 100644 packages/draw_system/lib/draw_system.dart rename {lib/painter_system => packages/draw_system/lib/src}/anim/bezier3_player/bezier3_palyer.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/bezier3_player/touch_info.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/circle_halo.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/curve_shower/anim_painter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/curve_shower/curve_anim_shower.dart (98%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/curve_shower/point_data.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/draw_path.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/dundun_path.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/rotate_by_point/angle_panter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/rotate_by_point/line.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/rotate_by_point/rotate_by_point.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/anim/spring_widget.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/circle_packing.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/cubic_disarray.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/hypnotic_squares.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/joy_division.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/piet_mondrian.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/tiled_lines.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/triangular_mesh.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/art/un_deux_trois.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/clock_widget.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/digital/digital_painter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/digital/digital_path.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/digital/digital_shower.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/digital/digital_widget.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/draw_grid_axis.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/draw_path_fun.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/draw_picture.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/n_side/n_side_page.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/n_side/shape_painter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/polar/angle_painter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/polar/polar.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/polar/polar_painter_widget.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/base/windmill.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/bloc/gallery_unit/bloc.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/desk_ui/desk_frame.dart (94%) rename {lib/painter_system => packages/draw_system/lib/src}/desk_ui/desk_gallery_unit.dart (83%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/bufeng/bufeng_panel.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/bufeng/config.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/bufeng/painter.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/dundun_view.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/random_portrait.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/stemp/stamp_data.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/fun/stemp/stamp_paper.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/gallery_card_item.dart (85%) rename {lib/painter_system => packages/draw_system/lib/src}/gallery_detail_page.dart (98%) rename {lib/painter_system => packages/draw_system/lib/src}/gallery_factory.dart (99%) rename {lib/painter_system => packages/draw_system/lib/src}/gallery_unit.dart (96%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/out/clock_fx.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/out/clock_widget.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/out/particle.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/out/rnd.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/random/particle.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/random/particle_manage.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/random/random_particle.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/random/world_render.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split/particle.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split/particle_manage.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split/particle_split.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split/world_render.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split_img/particle.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split_img/particle_manage.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split_img/split_image.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/particle/split_img/world_render.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/picture_frame.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/utils/colors.dart (100%) rename {lib/painter_system => packages/draw_system/lib/src}/utils/coordinate.dart (100%) create mode 100644 packages/draw_system/pubspec.yaml create mode 100644 packages/draw_system/test/draw_system_test.dart create mode 100644 packages/toly_ui/.gitignore create mode 100644 packages/toly_ui/.metadata create mode 100644 packages/toly_ui/CHANGELOG.md create mode 100644 packages/toly_ui/LICENSE create mode 100644 packages/toly_ui/README.md create mode 100644 packages/toly_ui/analysis_options.yaml create mode 100644 packages/toly_ui/lib/adapter/platform_view_adapter.dart rename packages/{components/lib/toly_ui => toly_ui/lib}/button/feedback_widget.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/code.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/code_widget.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/high_light_code.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/highlighter_style.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/language/dart_languge.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/code/language/language.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/decorations/round_rect_rab_indicator.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/default/loading/planet_loading.dart (95%) rename packages/{components/lib/toly_ui => toly_ui/lib}/dialog/alert_conform_dialog.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/dialog/delete_message_panel.dart (99%) rename packages/{components/lib/toly_ui => toly_ui/lib}/input/edit_panel.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/input/icon_input.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/input/input_button.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/markdown/markdown_widget.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/markdown/md_text_styles.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/markdown/syntax_high_lighter.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/object/windmill.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/popable/drop_selectable_widget.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/selector/burst_menu.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/selector/color_chooser.dart (98%) rename packages/{components/lib/toly_ui => toly_ui/lib}/selector/multi_chip_filter.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/sliver_header/sliver_pinned_header.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/sliver_header/sliver_snap_header.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/circle.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/circle_image.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/circle_text.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/color_wrapper.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/math_runner.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/panel.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/tag.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/text_typer.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/ti/toly_switch_list_tile.dart (100%) rename packages/{components/lib/toly_ui => toly_ui/lib}/toly_ui.dart (89%) create mode 100644 packages/toly_ui/pubspec.yaml create mode 100644 packages/toly_ui/test/toly_ui_test.dart create mode 100644 packages/treasure_tools/.gitignore create mode 100644 packages/treasure_tools/.metadata create mode 100644 packages/treasure_tools/CHANGELOG.md create mode 100644 packages/treasure_tools/LICENSE create mode 100644 packages/treasure_tools/README.md create mode 100644 packages/treasure_tools/analysis_options.yaml rename {lib/code_gen => packages/treasure_tools/lib/src}/bloc/state.dart (71%) rename {lib/code_gen => packages/treasure_tools/lib/src}/class_generator.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/code_gen_page.dart (98%) rename {lib/code_gen => packages/treasure_tools/lib/src}/data/task_result.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/desk_widget_top_bar.dart (95%) rename {lib/code_gen => packages/treasure_tools/lib/src}/icon_font_gen/gen_message_action.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/icon_font_gen/icon_font_class_parser.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/icon_font_gen/icon_font_gen_config.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/icon_font_gen/icon_font_gen_page.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/model/class.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/model/field.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/popable/class_gen_field.dart (98%) rename {lib/code_gen => packages/treasure_tools/lib/src}/popable/toly_select.dart (100%) rename {lib/code_gen => packages/treasure_tools/lib/src}/wrapper.dart (100%) create mode 100644 packages/treasure_tools/lib/treasure_tools.dart create mode 100644 packages/treasure_tools/pubspec.yaml rename {test => packages/treasure_tools/test}/iconfont_parser_test.dart (81%) create mode 100644 packages/treasure_tools/test/treasure_tools_test.dart create mode 100644 packages/treasure_tools/test/yaml_parser_test.dart create mode 100644 packages/treasure_tools/test/yaml_parser_test2.dart rename {lib/app/utils => packages/utils/lib/src}/convert_man.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/category_repository.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/db_impl/catagory_db_repository.dart (98%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/db_impl/db_impl.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/db_impl/node_db_repository.dart (88%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/db_impl/widget_db_repository.dart (83%) create mode 100644 packages/widget_module/lib/data/exp.dart rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/category_model.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/enums.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/model.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/node_model.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/widget_filter.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/model/widget_model.dart (97%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/node_repository.dart (100%) rename packages/{widget_repository/lib/src => widget_module/lib/data}/widget_repository.dart (90%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/category_panel/desk_category_page.dart (87%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/category_panel/desk_top_like_panel.dart (92%) create mode 100644 packages/widget_module/lib/views/desk_ui/desk_ui.dart rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_detail/link_widget_buttons.dart (96%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_detail/widget_detail_bar.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_detail/widget_detail_page.dart (75%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_detail/widget_detail_panel.dart (93%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_detail/widget_node_panel.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_panel/desk_search_bar.dart (96%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_panel/desk_widget_model_item.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_panel/desk_widget_top_bar.dart (97%) rename {lib/widget_ui => packages/widget_module/lib/views}/desk_ui/widget_panel/widget_panel.dart (88%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/category_detail.dart (94%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/category_list_item.dart (95%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/category_page.dart (94%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/collect_page.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/delete_category_dialog.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/edit_category_panel.dart (94%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/empty_category.dart (97%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/home_right_drawer.dart (91%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/like_widget_page.dart (94%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/sync/async_button.dart (94%) create mode 100644 packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/category_page/sync/upload_button.dart (93%) create mode 100644 packages/widget_module/lib/views/mobile/mobile_ui.dart rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/search_page/app_search_bar.dart (97%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/search_page/search_page.dart (100%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/search_page/standard_search_bar.dart (98%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/search_page/standard_search_page.dart (92%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/category_end_drawer.dart (95%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/collect_widget_list_item.dart (97%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/widget_detail_bar.dart (97%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/widget_detail_page.dart (96%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/widget_detail_panel.dart (93%) rename {lib/widget_ui => packages/widget_module/lib/views}/mobile/widget_detail/widget_node_panel.dart (98%) rename {lib/app/navigation => packages/widget_module/lib/views/mobile/widget_page}/home_drawer.dart (86%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/phone_widget_content.dart (80%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/standard_home_page.dart (91%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/standard_home_search.dart (98%) rename {lib/app/navigation => packages/widget_module/lib/views/mobile/widget_page}/unit_drawer_header.dart (100%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/widget_list_panel.dart (100%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/widget_model_item.dart (98%) rename {lib/widget_ui/mobile/widget_panel => packages/widget_module/lib/views/mobile/widget_page}/widget_page.dart (100%) delete mode 100644 packages/widget_repository/lib/widget_repository.dart delete mode 100644 packages/widget_repository/test/widget_repository_test.dart delete mode 100644 test/yaml_parser_test.dart delete mode 100644 test/yaml_parser_test2.dart diff --git a/README.md b/README.md index 5d6a56eb..e9c758d3 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ #### 当前Flutter 版本 ``` -Flutter 3.16.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision b0366e0a3f (2 weeks ago) • 2023-12-05 19:46:39 -0800 -Engine • revision 54a7145303 +Flutter 3.16.5 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 78666c8dc5 (3 weeks ago) • 2023-12-19 16:14:14 -0800 +Engine • revision 3f3e560236 Tools • Dart 3.2.3 • DevTools 2.28.4 ``` diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index e81f72b7..0c9cd782 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -1,14 +1,13 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:flutter_unit/app_stater/app_starter.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/painter_system/bloc/gallery_unit/bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; - - +import 'package:widget_module/widget_module.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com @@ -28,26 +27,37 @@ class BlocWrapper extends StatefulWidget { class _BlocWrapperState extends State { final WidgetRepository repository = const WidgetDbRepository(); - final CategoryBloc categoryBloc= CategoryBloc(repository: CategoryDbRepository()); + final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); final AuthRepository authRepository = HttpAuthRepository(); @override Widget build(BuildContext context) { return MultiBlocProvider( - providers: [ - // 全局 bloc : 维护应用存储状态、更新、认证 - BlocProvider(create: (_) => AuthBloc(repository: authRepository)..add(const AppStarted())), - BlocProvider(create: (_) => AppBloc(AppStateRepository())..initApp()), - BlocProvider(create: (_) => UpdateBloc()), - BlocProvider(create: (_) => UserBloc()), - - - BlocProvider(create: (_) => WidgetsBloc(repository: repository)), - BlocProvider(create: (_) => categoryBloc), - BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), - BlocProvider(create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), - BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), - ], child: widget.child); + providers: [ + /// 应用启动器 + BlocProvider( + create: (_) => AppStartBloc(minStartDurationMs: 600)..startApp()), + + // 全局 bloc : 维护应用存储状态、更新、认证 + BlocProvider( + create: (_) => AuthBloc(repository: authRepository)), + BlocProvider( + create: (_) => AppConfigBloc(AppStateRepository())), + BlocProvider(create: (_) => UpdateBloc()), + BlocProvider(create: (_) => UserBloc()), + + BlocProvider( + create: (_) => WidgetsBloc(repository: repository)), + BlocProvider(create: (_) => categoryBloc), + BlocProvider( + create: (_) => LikeWidgetBloc(repository: repository)), + BlocProvider( + create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), + BlocProvider( + create: (_) => GalleryUnitBloc()..loadGalleryInfo()), + ], + child: widget.child, + ); } @override diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 0d0b54e7..a4211e37 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -3,46 +3,47 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; - -import 'package:flutter_unit/app/router/unit_router.dart'; -import 'package:flutter_unit/app/views/splash/standard_unit_splash.dart'; +import 'package:flutter_unit/navigation/routers/app_route.dart'; +import 'package:go_router/go_router.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: 主程序 -class FlutterUnit extends StatelessWidget { - const FlutterUnit({Key? key}) : super(key: key); +class FlutterUnit3 extends StatelessWidget { + FlutterUnit3({Key? key}) : super(key: key); + + final GoRouter _router = GoRouter( + initialLocation: '/splash', + routes: [deskAppRoute], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go('/404', extra: state.uri.toString()); + }, + ); @override Widget build(BuildContext context) { - return BlocBuilder(builder: (_, state) { + + return BlocBuilder(builder: (_, state) { return SortStateScope( notifier: SortState(), child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp( - // routes: , + child: MaterialApp.router( + routerConfig: _router, showPerformanceOverlay: state.showPerformanceOverlay, title: StrUnit.appName, debugShowCheckedModeBanner: false, - onGenerateRoute: UnitRouters.generateRoute, localizationsDelegates: GlobalMaterialLocalizations.delegates, supportedLocales: const [ Locale('zh', 'CN'), ], - // themeMode: ThemeMode.light, themeMode: state.themeMode, darkTheme: AppTheme.darkTheme(state), theme: AppTheme.lightTheme(state), - // theme: ThemeData( - // primarySwatch: state.themeColor, - // fontFamily: state.fontFamily, - // ), - home: const StandardUnitSplash(), ), ), ); }); } -} +} \ No newline at end of file diff --git a/lib/app/navigation/route/route.dart b/lib/app/navigation/route/route.dart deleted file mode 100644 index 70f18eb0..00000000 --- a/lib/app/navigation/route/route.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'dart:io'; - -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; - -import '../../views/setting/code_style_setting.dart'; -import '../../views/setting/font_setting.dart'; -import '../../views/setting/setting_page.dart'; -import '../../views/setting/theme_color_setting.dart'; -import '../unit_navigation.dart'; - -class RoutePath { - - static const String nav = 'nav'; - - static const String themeColorSetting = 'ThemeColorSettingPage'; - static const String codeStyleSetting = 'CodeStyleSettingPage'; - static const String itemStyleSetting = 'ItemStyleSettingPage'; - static const String fontSetting = 'FountSettingPage'; - - Map get routes => - { - themeColorSetting: (ctx) => const ThemeColorSettingPage(), - codeStyleSetting: (ctx) => const CodeStyleSettingPage(), - fontSetting: (ctx) => const FontSettingPage(), - }; - - - static Route? generateRoute(RouteSettings settings) { - switch (settings.name) { - case nav: - if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) { - return ZeroPageRoute(child: UnitNavigation()); - } - return SlidePageRoute(child: UnitNavigation()); - } - - return null; - } - -} \ No newline at end of file diff --git a/lib/app/router/desk/app.dart b/lib/app/router/desk/app.dart deleted file mode 100644 index d590176a..00000000 --- a/lib/app/router/desk/app.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -import '../menu_meta.dart'; - - -final List deskNavBarMenus = const [ - MenuMeta(label: '组件集录', icon: Icons.color_lens_outlined, path: '/widgets'), - MenuMeta(label: '收藏集录', icon: Icons.add_chart, path: '/collection'), - MenuMeta(label: '绘制集录', icon: Icons.sort, path: '/painter'), - MenuMeta(label: '可视化', icon: Icons.person, path: '/visual'), - MenuMeta(label: '代码生成', icon: Icons.settings, path: '/code_gen'), - MenuMeta(label: '要点集录', icon: Icons.settings, path: '/pointer'), -]; - - -// final RouteBase appRoute = ShellRoute( -// builder: (BuildContext context, GoRouterState state, Widget child) { -// return AppNavigation(navigator: child); -// }, -// routes: [ -// colorRouters, -// GoRoute( -// path: 'counter', -// builder: (BuildContext context, GoRouterState state) { -// return const CounterPage(); -// }), -// sortRouters, -// GoRoute( -// path: 'user', -// builder: (BuildContext context, GoRouterState state) { -// return const UserPage(); -// }, -// ), -// GoRoute( -// path: 'settings', -// builder: (BuildContext context, GoRouterState state) { -// return const SettingPage(); -// }, -// ), -// GoRoute( -// path: '404', -// builder: (BuildContext context, GoRouterState state) { -// String msg = '无法访问: ${state.extra}'; -// return EmptyPanel(msg: msg); -// }, -// ) -// ], -// ); diff --git a/lib/app/router/desk/root.dart b/lib/app/router/desk/root.dart deleted file mode 100644 index 4fe06a31..00000000 --- a/lib/app/router/desk/root.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -import '../../views/splash/standard_unit_splash.dart'; -import 'app.dart'; - -final RouteBase rootRoute = GoRoute( - path: '/', - redirect: _redirect, - routes: [ - // appRoute, - // GoRoute( - // path: 'login', - // builder: (BuildContext context, GoRouterState state) { - // return const LoginPage(); - // }, - // ), - GoRoute( - path: 'splash', - builder: (BuildContext context, GoRouterState state) { - return const StandardUnitSplash(); - }, - ), - ], -); - -FutureOr _redirect(BuildContext context, GoRouterState state) { - if(state.fullPath=='/'){ - return '/splash'; - } - return null; -} diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart deleted file mode 100644 index 687a8dfe..00000000 --- a/lib/app/router/unit_router.dart +++ /dev/null @@ -1,148 +0,0 @@ -// ignore_for_file: constant_identifier_names - -import 'dart:io'; - -import 'package:app/app.dart'; -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/navigation/unit_navigation.dart'; -import 'package:flutter_unit/app/views/about/about_app_page.dart'; -import 'package:flutter_unit/app/views/about/about_me_page.dart'; -import 'package:flutter_unit/app/views/about/version_info.dart'; -import 'package:flutter_unit/app/views/data_manage/data_manage_page.dart'; -import 'package:flutter_unit/app/views/setting/code_style_setting.dart'; -import 'package:flutter_unit/app/views/setting/font_setting.dart'; -import 'package:flutter_unit/app/views/setting/item_style_setting.dart'; -import 'package:flutter_unit/app/views/setting/setting_page.dart'; -import 'package:flutter_unit/app/views/setting/theme_color_setting.dart'; -import 'package:flutter_unit/app/views/unit_todo/attr_unit_page.dart'; -import 'package:flutter_unit/app/views/unit_todo/layout_unit_page.dart'; -import 'package:flutter_unit/app/views/unit_todo/point_unit_page.dart'; -import 'package:flutter_unit/point_system/views/issues_point/issues_detail.dart'; -import 'package:flutter_unit/point_system/views/issues_point/issues_point_page.dart'; -import 'package:flutter_unit/widget_ui/desk_ui/widget_detail/widget_detail_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/category_detail.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/search_page/search_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/widget_detail_page.dart'; -import 'package:widget_repository/widget_repository.dart'; - - -class UnitRouters { - static const String widget_detail = '/widget_detail'; - - static const String detail = 'detail'; - // static const String search = 'search_bloc'; - - - static const String collect = 'CollectPage'; - static const String point = 'IssuesPointPage'; - static const String point_detail = 'IssuesDetailPage'; - - static const String setting = 'SettingPage'; - static const String font_setting = 'FountSettingPage'; - static const String theme_color_setting = 'ThemeColorSettingPage'; - static const String code_style_setting = 'CodeStyleSettingPage'; - static const String item_style_setting = 'ItemStyleSettingPage'; - static const String version_info = 'VersionInfo'; - static const String login = 'login'; - - static const String category_show = 'CategoryShow'; - static const String issues_point = 'IssuesPointPage'; - - static const String attr = 'AttrUnitPage'; - static const String bug = 'BugUnitPage'; - static const String layout = 'LayoutUnitPage'; - static const String about_me = 'AboutMePage'; - static const String about_app = 'AboutAppPage'; - static const String register = 'register'; - - static const String data_manage = 'DataManagePage'; - - static Route generateRoute(RouteSettings settings) { - switch (settings.name) { - // - case UnitRouter.nav: - if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - return ZeroPageRoute( child: UnitNavigation()); - } - return SlidePageRoute(child: UnitNavigation()); - - // 组件详情页 - case widget_detail: - Widget child; - if(Platform.isWindows||Platform.isMacOS||Platform.isLinux){ - child = DeskWidgetDetailPageScope( - model: settings.arguments as WidgetModel, - ); - }else{ - child = WidgetDetailPageScope( - model: settings.arguments as WidgetModel, - ); - } - - return SlidePageRoute(child: child); - - // case search: - // return Right2LeftRouter(child: const SearchPageProvider()); - case collect: - return SlidePageRoute(child: CollectPageAdapter( - canPop: settings.arguments as bool, - )); - - case setting: - return SlidePageRoute(child: const SettingPage()); - // return Right2LeftRouter(builder:(_)=> const SettingPage()); - // return MaterialPageRoute(builder:(_)=> const SettingPage()); - case data_manage: - return SlidePageRoute(child: const DataManagePage()); - case font_setting: - return SlidePageRoute(child: const FontSettingPage()); - case theme_color_setting: - return SlidePageRoute(child: const ThemeColorSettingPage()); - case code_style_setting: - return SlidePageRoute(child: const CodeStyleSettingPage()); - // case item_style_setting: - // return Right2LeftRouter(child: const ItemStyleSettingPage()); - - case version_info: - return SlidePageRoute(child: const VersionInfo()); - - case issues_point: - return SlidePageRoute(child: const IssuesPointScope()); - case login: - return SlidePageRoute(child: const LoginPage()); - - case register: - return SlidePageRoute(child: const RegisterPage()); - - case attr: - return SlidePageRoute(child: const AttrUnitPage()); - case bug: - return SlidePageRoute(child: const BugUnitPage()); - case layout: - return SlidePageRoute(child: const LayoutUnitPage()); - case about_app: - return SlidePageRoute(child: const AboutAppPage()); - case about_me: - return SlidePageRoute(child: const AboutMePage()); - - case point_detail: - return SlidePageRoute(child: const IssuesDetailPage()); - - case category_show: - return SlidePageRoute( - child: CategoryShow( - model: settings.arguments as CategoryModel, - )); - - default: - return MaterialPageRoute( - builder: (_) => Scaffold( - body: Center( - child: Text('No route defined for ${settings.name}'), - ), - )); - } - } -} diff --git a/lib/app/utils/Toast.dart b/lib/app/utils/Toast.dart deleted file mode 100644 index 2f174108..00000000 --- a/lib/app/utils/Toast.dart +++ /dev/null @@ -1,32 +0,0 @@ -// import 'package:flutter/material.dart'; -// -// class Toast { -// static toast(BuildContext context, String msg, -// {duration = const Duration(milliseconds: 600), -// Color? color, -// SnackBarAction? action}) { -// -// ScaffoldMessenger.of(context).showSnackBar(SnackBar( -// content: Text(msg), -// duration: duration, -// action: action, -// backgroundColor: color??Theme.of(context).primaryColor, -// )); -// } -// -// static void error(BuildContext context,String msg){ -// toast(context,msg, color:Colors.red, ); -// } -// -// static void warning(BuildContext context,String msg){ -// toast(context,msg, color:Colors.orange, ); -// } -// -// static void success(BuildContext context,String msg){ -// toast(context,msg, color:Theme.of(context).primaryColor, ); -// } -// -// static void green(BuildContext context,String msg){ -// toast(context,msg, color:Colors.green, ); -// } -// } diff --git a/lib/app/utils/color_utils.dart b/lib/app/utils/color_utils.dart deleted file mode 100644 index 75170c73..00000000 --- a/lib/app/utils/color_utils.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'random_provider.dart'; - - - -class ColorUtils { - static Color randomColor({ - int limitA = 120, - int limitR = 0, - int limitG = 0, - int limitB = 0, - }) { - Random random = RandomProvider.random; - int a = limitA + random.nextInt(256 - limitA); //透明度值 - int r = limitR + random.nextInt(256 - limitR); //红值 - int g = limitG + random.nextInt(256 - limitG); //绿值 - int b = limitB + random.nextInt(256 - limitB); //蓝值 - return Color.fromARGB(a, r, g, b); //生成argb模式的颜色 - } - - - /// 使用方法: - /// var color1=ColorUtils.parse("#33428A43"); - /// var color2=ColorUtils.parse("33428A43"); - /// var color3=ColorUtils.parse("#428A43"); - ///var color4=ColorUtils.parse("428A43"); - /// - static Color parse(String code) { - Color result =Colors.red; - int value = 0 ; - if (code.contains("#")) { - try { - value = int.parse(code.substring(1), radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 7://6位 - result = Color(value + 0xFF000000); - break; - case 9://8位 - result = Color(value); - break; - default: - result =Colors.red; - } - }else { - try { - value = int.parse(code, radix: 16); - } catch (e) { - print(e); - } - switch (code.length) { - case 6: - result = Color(value + 0xFF000000); - break; - case 8: - result = Color(value); - break; - default: - result =Colors.red; - } - } - return result; - } - - static String colorString(Color color) => - "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} - diff --git a/lib/app/utils/convert.dart b/lib/app/utils/convert.dart deleted file mode 100644 index 9c3c2ec9..00000000 --- a/lib/app/utils/convert.dart +++ /dev/null @@ -1,51 +0,0 @@ - -import 'package:flutter_unit/painter_system/gallery_factory.dart'; -import 'package:widget_repository/widget_repository.dart'; - -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: - -class Convert { - static WidgetFamily toFamily(int id) { - switch (id) { - case 0: - return WidgetFamily.statelessWidget; - case 1: - return WidgetFamily.statefulWidget; - case 2: - return WidgetFamily.singleChildRenderObjectWidget; - case 3: - return WidgetFamily.multiChildRenderObjectWidget; - case 4: - return WidgetFamily.sliver; - case 5: - return WidgetFamily.proxyWidget; - case 6: - return WidgetFamily.other; - default: - return WidgetFamily.statelessWidget; - } - } - - static Map galleryTypeMap = { - GalleryType.base: "基础绘制", - GalleryType.fun: "趣味绘制", - GalleryType.particle: "粒子绘制", - GalleryType.anim: "动画手势", - GalleryType.art: "艺术画廊", - }; - - static String convertFileSize(int size){ - double result = size / 1024.0; - if(result<1024){ - return "${result.toStringAsFixed(2)} Kb"; - }else if(result>1024&&result<1024*1024){ - return "${(result/1024).toStringAsFixed(2)} Mb"; - }else{ - return "${(result/1024/1024).toStringAsFixed(2)} Gb"; - } - } - - -} diff --git a/lib/app/utils/pather.dart b/lib/app/utils/pather.dart deleted file mode 100644 index 6953fdf3..00000000 --- a/lib/app/utils/pather.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; - -class Pather { - Pather._(); - - static Pather create = Pather._(); - - final Path _path = Path(); - - Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) { - _path.reset();//重置路径 - double perRad = 2 * pi / num;//每份的角度 - double radA = perRad / 2 / 2;//a角 - double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA;//起始b角 - _path.moveTo(cos(radA) * R + dx, -sin(radA) * R + dy);//移动到起点 - for (int i = 0; i < num; i++) {//循环生成点,路径连至 - _path.lineTo(cos(radA + perRad * i) * R + dx, -sin(radA + perRad * i) * R + dy); - _path.lineTo(cos(radB + perRad * i) * r + dx, -sin(radB + perRad * i) * r + dy); - } - _path.close(); - return _path; - } -} diff --git a/lib/app/utils/random_provider.dart b/lib/app/utils/random_provider.dart deleted file mode 100644 index b34218b1..00000000 --- a/lib/app/utils/random_provider.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'dart:math'; - -class RandomProvider{ - RandomProvider._();//私有化构造 - static final _random= Random(); - static Random get random =>_random; -} \ No newline at end of file diff --git a/lib/app/utils/toly_utils.dart b/lib/app/utils/toly_utils.dart deleted file mode 100644 index ea48a992..00000000 --- a/lib/app/utils/toly_utils.dart +++ /dev/null @@ -1,3 +0,0 @@ -library toly_utils; -export 'color_utils.dart'; -export 'random_provider.dart'; diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index 77286057..d3ddae87 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -4,8 +4,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app/views/time_line/flutter_unit_time_line.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; class AboutAppPage extends StatelessWidget { diff --git a/lib/app/views/about/about_me_page.dart b/lib/app/views/about/about_me_page.dart index ae86b7f4..1c435bac 100644 --- a/lib/app/views/about/about_me_page.dart +++ b/lib/app/views/about/about_me_page.dart @@ -3,7 +3,7 @@ /// 说明: ... import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index 1f26fcb6..2ae3f121 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -2,8 +2,9 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -79,7 +80,7 @@ class VersionInfo extends StatelessWidget { ListTile( title: const Text('应用详情',style: labelStyle,), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.about_app), + onTap: () => context.push('/about_app'), ), const Divider(height: 1,indent: 10), const AppUpdatePanel(), diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index 51bca2ca..50fec821 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -1,12 +1,13 @@ import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; +import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; + import 'package:authentication/views/authentic_widget.dart'; import 'package:utils/utils.dart'; @@ -14,7 +15,8 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:path/path.dart' as path; import 'package:sqflite/sqflite.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:widget_module/widget_module.dart'; + /// create by 张风捷特烈 on 2021/2/26 /// contact me by email 1981462002@qq.com diff --git a/lib/app/views/setting/code_style_setting.dart b/lib/app/views/setting/code_style_setting.dart index 9f3567cc..552906eb 100644 --- a/lib/app/views/setting/code_style_setting.dart +++ b/lib/app/views/setting/code_style_setting.dart @@ -1,6 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -32,7 +31,7 @@ class Hello { Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('代码高亮样式')), - body: BlocBuilder( + body: BlocBuilder( builder: (_, state) => _buildFontCell(context, Cons.codeThemeSupport.keys.toList(), state.codeStyleIndex)), ); @@ -46,7 +45,7 @@ class Hello { a: 0.95, duration: const Duration(milliseconds: 200), onPressed: (){ - BlocProvider.of(context).switchCoderTheme(i); + BlocProvider.of(context).switchCoderTheme(i); }, child: Stack( fit: StackFit.passthrough, diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart index b3b4938d..520c307f 100644 --- a/lib/app/views/setting/font_setting.dart +++ b/lib/app/views/setting/font_setting.dart @@ -1,6 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -13,7 +12,7 @@ class FontSettingPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( builder: (_, state) =>Scaffold( appBar: AppBar(title: Text('字体设置 - font setting',style: TextStyle(fontFamily:state.fontFamily ),)), body: _buildFontCell( @@ -34,7 +33,7 @@ class FontSettingPage extends StatelessWidget { active: fontFamily == e, fontFamily: e, onSelect: (font) { - BlocProvider.of(context).switchFontFamily(font); + BlocProvider.of(context).switchFontFamily(font); }, ); }).toList(), diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index efc22e20..b5541f17 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -1,8 +1,9 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/overlay_tool_wrapper.dart'; +import 'package:flutter_unit/navigation/views/overlay_tool_wrapper.dart'; import 'app_style_setting.dart'; @@ -27,16 +28,14 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: const Text('深色模式', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state)=>Text( themeMode2Str[state.themeMode]! , style: const TextStyle(fontSize: 12,color: Colors.grey) ), ), trailing: _nextIcon(context), - onTap: (){ - Navigator.of(context).push(SlidePageRoute(child: ThemeModelSetting())); - }, + onTap: ()=> context.push('/settings/dark_mode'), ), divider, ListTile( @@ -45,14 +44,14 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: const Text('主题色设置', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state)=>Text( Cons.kThemeColorSupport[state.themeColor]!, style: TextStyle(color: state.themeColor,fontSize: 12), ), ), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.theme_color_setting), + onTap: () => context.push('/settings/theme_color'), ), // divider, Container( height: 10), @@ -62,13 +61,13 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: const Text('字体设置', style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state)=>Text( state.fontFamily,style: TextStyle(fontSize: 12), ), ), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.font_setting), + onTap: () => context.push('/settings/font_setting'), ), divider, ListTile( @@ -78,7 +77,7 @@ class SettingPage extends StatelessWidget { ), title: const Text('代码高亮样式', style: TextStyle(fontSize: 16)), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.code_style_setting), + onTap: () => context.push('/settings/code_style'), ), // divider, Container( height: 10,), @@ -96,7 +95,7 @@ class SettingPage extends StatelessWidget { ), title: const Text('版本信息', style: TextStyle(fontSize: 16)), trailing: _nextIcon(context), - onTap: () => Navigator.of(context).pushNamed(UnitRouter.version_info), + onTap: () => context.push('/settings/version'), ), ], ), @@ -119,7 +118,7 @@ class SettingPage extends StatelessWidget { // ) Widget _buildShowBg(BuildContext context) => - BlocBuilder( + BlocBuilder( builder: (_, state) => TolySwitchListTile( secondary:Icon( TolyIcon.icon_background, @@ -127,12 +126,12 @@ class SettingPage extends StatelessWidget { ), title: const Text('显示背景', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) , value: state.showBackGround, onChanged: (bool value) { - BlocProvider.of(context).switchShowBg(value); + BlocProvider.of(context).switchShowBg(value); }, ),); Widget _buildShowOver(BuildContext context) => - BlocBuilder( + BlocBuilder( builder: (_, state) => TolySwitchListTile( secondary:Icon( TolyIcon.icon_background, @@ -140,12 +139,12 @@ class SettingPage extends StatelessWidget { ), title: const Text('显示性能浮层', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) , value: state.showPerformanceOverlay, onChanged: (bool value) { - BlocProvider.of(context).switchShowOver(value); + BlocProvider.of(context).switchShowOver(value); }, )); Widget _buildShowTool(BuildContext context) => - BlocBuilder( + BlocBuilder( builder: (_, state) => SwitchListTile( value: state.showOverlayTool, secondary: Icon( @@ -159,7 +158,7 @@ class SettingPage extends StatelessWidget { }else{ OverlayToolWrapper.of(context).hideFloating(); } - BlocProvider.of(context).switchShowTool(show); + BlocProvider.of(context).switchShowTool(show); }, )); diff --git a/lib/app/views/setting/theme_color_setting.dart b/lib/app/views/setting/theme_color_setting.dart index 9ed91dc5..19c6b9bd 100644 --- a/lib/app/views/setting/theme_color_setting.dart +++ b/lib/app/views/setting/theme_color_setting.dart @@ -2,8 +2,7 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; - +import 'package:toly_ui/toly_ui.dart'; /// create by 张风捷特烈 on 2020-04-10 /// contact me by email 1981462002@qq.com /// 说明: @@ -17,7 +16,7 @@ class ThemeColorSettingPage extends StatelessWidget { return Scaffold( backgroundColor: UnitColor.scaffoldBgLight, appBar: const UnitAppbar(title:'主题色设置'), - body: BlocBuilder( + body: BlocBuilder( builder: (_, state) => _buildCell( context, Cons.kThemeColorSupport.keys.toList(), state.themeColor)), ); @@ -36,7 +35,7 @@ class ThemeColorSettingPage extends StatelessWidget { .map((MaterialColor c) => FeedbackWidget( a: 0.95, duration: const Duration(milliseconds: 200), - onPressed: () => BlocProvider.of(context).switchThemeColor(c), + onPressed: () => BlocProvider.of(context).switchThemeColor(c), child: GridTile( header: Container( decoration: BoxDecoration( diff --git a/lib/app/views/setting/theme_model_setting.dart b/lib/app/views/setting/theme_model_setting.dart index 40979d37..6bf0ae60 100644 --- a/lib/app/views/setting/theme_model_setting.dart +++ b/lib/app/views/setting/theme_model_setting.dart @@ -1,7 +1,5 @@ import 'package:app/app.dart'; -import 'package:app/app/style/unit_color.dart'; -import 'package:components/project_ui/unit_app_bar.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -11,7 +9,7 @@ class ThemeModelSetting extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeMode mode = context.select((bloc) => bloc.state.themeMode); + ThemeMode mode = context.select((bloc) => bloc.state.themeMode); Color iconColor = Theme.of(context).primaryColor; return Scaffold( appBar: AppBar(title: Text('深色模式')), @@ -31,7 +29,7 @@ class ThemeModelSetting extends StatelessWidget { }else{ newModel = ThemeMode.light; } - context.read().changeThemeMode(newModel); + context.read().changeThemeMode(newModel); }, // trailing: _nextIcon(context), // : () => Navigator.of(context).pushNamed(UnitRouter.font_setting), @@ -47,7 +45,7 @@ class ThemeModelSetting extends StatelessWidget { ListTile( title: Text('浅色模式'), onTap: (){ - context.read().changeThemeMode(ThemeMode.light); + context.read().changeThemeMode(ThemeMode.light); }, trailing: mode == ThemeMode.light ? Icon(Icons.check, size: 20, color: iconColor) : null, ), @@ -55,7 +53,7 @@ class ThemeModelSetting extends StatelessWidget { ListTile( title: Text('深色模式'), onTap: (){ - context.read().changeThemeMode(ThemeMode.dark); + context.read().changeThemeMode(ThemeMode.dark); }, trailing: mode == ThemeMode.dark ? Icon(Icons.check, size: 20, color: iconColor) : null, ) diff --git a/lib/app/views/splash/standard_unit_splash.dart b/lib/app/views/splash/standard_unit_splash.dart deleted file mode 100644 index bb05ecfb..00000000 --- a/lib/app/views/splash/standard_unit_splash.dart +++ /dev/null @@ -1,137 +0,0 @@ -import 'dart:math'; - -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; - -import 'package:widget_module/blocs/blocs.dart'; - -import 'dart:ui' as ui; - -import 'package:widget_repository/widget_repository.dart'; - -import 'flutter_unit_text.dart'; - -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: app 闪屏页 - -class StandardUnitSplash extends StatefulWidget { - const StandardUnitSplash({Key? key}) : super(key: key); - - @override - _StandardUnitSplashState createState() => _StandardUnitSplashState(); -} - -class _StandardUnitSplashState extends State - with TickerProviderStateMixin { - static const int _minCost = 1500; - - int _recorder = 0; - - final Paint paint = Paint() - ..style = PaintingStyle.stroke - ..shader = ui.Gradient.linear( - const Offset(0, 0), - const Offset(22, 0), - [Colors.red, Colors.yellow, Colors.blue, Colors.green], - [1 / 4, 2 / 4, 3 / 4, 1], - TileMode.mirror, - Matrix4.rotationZ(pi / 4).storage, - ); - - @override - void initState() { - super.initState(); - _recorder = DateTime.now().millisecondsSinceEpoch; - } - - @override - Widget build(BuildContext context) { - final Size winSize = MediaQuery.of(context).size; - return AnnotatedRegion( - value: const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarIconBrightness: Brightness.dark), - child: Material( - child: BlocListener( - listener: _listenStart, - listenWhen: (p,n)=>p.dbPath.isEmpty&&n.dbPath.isNotEmpty, - child: Column( - children: [ - const Spacer(), - Expanded( - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Stack( - children: [ - Text( - "U", - style: TextStyle( - fontSize: 26, - height: 1, - fontWeight: FontWeight.bold, - foreground: paint), - ), - const FlutterLogo(size: 60), - ], - ), - const SizedBox( - height: 20, - ), - _buildFlutterUnitText(winSize.height, winSize.width), - ], - )), - Expanded( - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - Positioned( - bottom: 15, - child: Wrap( - direction: Axis.vertical, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - Text("Power By 张风捷特烈", - style: UnitTextStyle.splashShadows), - Text("· 2021 · @编程之王 ", - style: UnitTextStyle.splashShadows), - ], - )), - ], - )) - ], - )), - ), - ); - } - - Widget _buildFlutterUnitText(double winH, double winW) { - return FlutterUnitText( - text: StrUnit.appName, - color: Theme.of(context).primaryColor, - ); - } - - // 监听资源加载完毕,启动,触发事件 - void _listenStart(BuildContext context, AppState state) { - HttpUtil.instance.rebase(PathUnit.baseUrl); - int cost = DateTime.now().millisecondsSinceEpoch - _recorder; - BlocProvider.of(context) - .add(const EventTabTap(WidgetFamily.statelessWidget)); - BlocProvider.of(context).add(const EventLoadLikeData()); - BlocProvider.of(context).add(const EventLoadCategory()); - - // 启动耗时小于 _minCost 时,等待 delay 毫秒 - int delay = cost < _minCost ? _minCost - cost : 0; - Future.delayed(Duration(milliseconds: delay)).then((value) { - Navigator.of(context).pushReplacementNamed(UnitRouter.nav); - }); - } -} diff --git a/lib/app/views/time_line/flutter_unit_time_line.dart b/lib/app/views/time_line/flutter_unit_time_line.dart index 3d85af34..dc7578c3 100644 --- a/lib/app/views/time_line/flutter_unit_time_line.dart +++ b/lib/app/views/time_line/flutter_unit_time_line.dart @@ -174,7 +174,7 @@ class TimeLineNode extends StatelessWidget { @override Widget build(BuildContext context) { - Color themeColor = BlocProvider.of(context).state.themeColor; + Color themeColor = BlocProvider.of(context).state.themeColor; return IntrinsicHeight( child: Row( diff --git a/lib/app/views/unit_todo/attr_unit_page.dart b/lib/app/views/unit_todo/attr_unit_page.dart index b0ffb70b..7b58610a 100644 --- a/lib/app/views/unit_todo/attr_unit_page.dart +++ b/lib/app/views/unit_todo/attr_unit_page.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; class AttrUnitPage extends StatelessWidget { diff --git a/lib/app/views/unit_todo/layout_unit_page.dart b/lib/app/views/unit_todo/layout_unit_page.dart index 1b329a1e..ae7beee7 100644 --- a/lib/app/views/unit_todo/layout_unit_page.dart +++ b/lib/app/views/unit_todo/layout_unit_page.dart @@ -1,6 +1,6 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/unit_todo/paint_unit_page.dart b/lib/app/views/unit_todo/paint_unit_page.dart index b3dece21..bf9ae950 100644 --- a/lib/app/views/unit_todo/paint_unit_page.dart +++ b/lib/app/views/unit_todo/paint_unit_page.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/views/unit_todo/point_unit_page.dart b/lib/app/views/unit_todo/point_unit_page.dart index e0df03fd..92ac9be8 100644 --- a/lib/app/views/unit_todo/point_unit_page.dart +++ b/lib/app/views/unit_todo/point_unit_page.dart @@ -1,6 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; class BugUnitPage extends StatelessWidget { const BugUnitPage({Key? key}) : super(key: key); @@ -26,7 +26,7 @@ class BugUnitPage extends StatelessWidget { children: [ FeedbackWidget( onPressed: (){ - Navigator.of(context).pushNamed(UnitRouter.issues_point); + // Navigator.of(context).pushNamed(UnitRouter.issues_point); }, child: const CircleImage( image: AssetImage('assets/images/icon_head.webp'), diff --git a/lib/app_stater/app_starter.dart b/lib/app_stater/app_starter.dart new file mode 100644 index 00000000..a9e88268 --- /dev/null +++ b/lib/app_stater/app_starter.dart @@ -0,0 +1,2 @@ +export 'bloc/state.dart'; +export 'bloc/bloc.dart'; diff --git a/lib/app_stater/bloc/bloc.dart b/lib/app_stater/bloc/bloc.dart new file mode 100644 index 00000000..0e54f878 --- /dev/null +++ b/lib/app_stater/bloc/bloc.dart @@ -0,0 +1,49 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../repository/repository.dart'; +import 'state.dart'; + +class AppStartBloc extends Cubit { + late SharedPreferences _sp; + + SharedPreferences get sp => _sp; + + final int minStartDurationMs; + + final AppStartRepository repository = const AppStartRepository(); + + AppStartBloc({ + this.minStartDurationMs = 20, + }) : super(const AppStarting()); + + int _timeRecord = 0; + + void startApp() async { + _timeRecord = DateTime.now().millisecondsSinceEpoch; + emit(const AppStarting()); + + try { + /// 处理初始化异步任务 + await repository.initSp(); + await repository.initDb(); + } catch (e) { + emit(AppStartFailed(e.toString())); + return; + } + + /// 计算初始化的耗时时长 + int cost = DateTime.now().millisecondsSinceEpoch - _timeRecord; + int waitTime = minStartDurationMs - cost; + if (waitTime > 0) { + /// 说明启动时间小于 [minStartDurationMs], 等待时间差 + emit(AppLoadDone(cost)); + await Future.delayed(Duration(milliseconds: waitTime)); + } else { + /// 说明启动时间超过 [minStartDurationMs],给一点预加载的时间 + emit(AppLoadDone(cost)); + await Future.delayed(const Duration(milliseconds: 50)); + } + emit(const AppStartSuccess()); + } +} diff --git a/lib/app_stater/bloc/state.dart b/lib/app_stater/bloc/state.dart new file mode 100644 index 00000000..db0b1a4b --- /dev/null +++ b/lib/app_stater/bloc/state.dart @@ -0,0 +1,22 @@ +sealed class AppStatus { + const AppStatus(); +} + +class AppStarting extends AppStatus { + const AppStarting(); +} + +class AppLoadDone extends AppStatus { + final int cost; + const AppLoadDone(this.cost); +} + +class AppStartSuccess extends AppStatus { + const AppStartSuccess(); +} + +class AppStartFailed extends AppStatus { + final String error; + + const AppStartFailed(this.error); +} diff --git a/packages/app/lib/repository/app_state_repository.dart b/lib/app_stater/repository/repository.dart similarity index 70% rename from packages/app/lib/repository/app_state_repository.dart rename to lib/app_stater/repository/repository.dart index f8520697..7b0f3fba 100644 --- a/packages/app/lib/repository/app_state_repository.dart +++ b/lib/app_stater/repository/repository.dart @@ -1,31 +1,28 @@ import 'dart:convert'; import 'dart:io'; -import 'package:app/model/global_state.dart'; -import 'package:app/model/app_style.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:storage/storage.dart'; -import 'package:flutter/material.dart'; +import 'package:app/app.dart'; import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; -import '../app/cons/cons.dart'; -import '../app/cons/sp.dart'; +class AppStartRepository{ -class AppStateRepository { - SpStorage get sp => SpStorage.instance; + const AppStartRepository(); + + Future initSp() async{ + await SpStorage.instance.initSp(); + } - Future initApp() async { + Future initDb() async{ DbOpenHelper.setupDatabase(); //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, "flutter.db"); await SpStorage.instance.initSp(); - // 读取配置文件,初始化应用状态 - AppConfigPo po = await sp.appConfig.read(); - bool shouldCopy = await _checkShouldCopy(dbPath, sp.spf); + bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage.instance.spf); if (shouldCopy) { await _doCopyAssetsDb(dbPath); @@ -35,14 +32,6 @@ class AppStateRepository { await FlutterDbStorage.instance.initDb(); await AppDbStorage.instance.initDb(); - - final ConnectivityResult netConnect = - await (Connectivity().checkConnectivity()); - - return AppState.fromPo(po).copyWith( - netConnect: netConnect, - dbPath: dbPath, - ); } Future _doCopyAssetsDb(String dbPath) async { @@ -52,7 +41,7 @@ class AppStateRepository { } ByteData data = await rootBundle.load("assets/flutter.db"); List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(dbPath).writeAsBytes(bytes, flush: true); print("=====flutter.db==== assets ======拷贝完成===="); @@ -83,4 +72,5 @@ class AppStateRepository { return shouldCopy; } -} + +} \ No newline at end of file diff --git a/lib/app_stater/view/app_start_listener.dart b/lib/app_stater/view/app_start_listener.dart new file mode 100644 index 00000000..3a3c3f42 --- /dev/null +++ b/lib/app_stater/view/app_start_listener.dart @@ -0,0 +1,38 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:utils/utils.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../bloc/bloc.dart'; +import '../bloc/state.dart'; + +class AppStartListener extends StatelessWidget { + final Widget child; + const AppStartListener({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return BlocListener( + listener: _listenAppStart, + child:child); + } + + // 监听资源加载完毕,启动,触发事件 + void _listenAppStart(BuildContext context, AppStatus state) { + if (state is AppLoadDone) { + print('::AppLoadDone::启动耗时${state.cost}'); + HttpUtil.instance.rebase(PathUnit.baseUrl); + context.read().initApp(); + context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); + context.read().add(const EventLoadLikeData()); + context.read().add(const EventLoadCategory()); + } + + if (state is AppStartSuccess) { + context.go('/widget'); + } + } +} diff --git a/lib/app/views/splash/flutter_unit_text.dart b/lib/app_stater/view/flutter_unit_text.dart similarity index 100% rename from lib/app/views/splash/flutter_unit_text.dart rename to lib/app_stater/view/flutter_unit_text.dart diff --git a/lib/app_stater/view/standard_unit_splash.dart b/lib/app_stater/view/standard_unit_splash.dart new file mode 100644 index 00000000..2e67f1fb --- /dev/null +++ b/lib/app_stater/view/standard_unit_splash.dart @@ -0,0 +1,152 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'dart:ui' as ui; + + +import 'flutter_unit_text.dart'; + +/// create by 张风捷特烈 on 2020-03-07 +/// contact me by email 1981462002@qq.com +/// 说明: app 闪屏页 +class FlutterUnitSplash extends StatelessWidget { + const FlutterUnitSplash({super.key}); + + @override + Widget build(BuildContext context) { + return const AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.dark, + ), + child: Material( + child: _SplashBody(), + ), + ); + } +} + +class _SplashBody extends StatelessWidget { + const _SplashBody({super.key}); + + @override + Widget build(BuildContext context) { + final Color color = Theme.of(context).primaryColor; + const TextStyle shadowStyle = UnitTextStyle.splashShadows; + const TextStyle titleStyle = TextStyle(fontWeight: FontWeight.bold); + + return Column( + children: [ + const SplashTopBar( + leading: Text('Flutter Unit',style: titleStyle), + logo: CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp'), + radius: 14, + ), + ), + const Spacer(), + Expanded( + child: Wrap( + direction: Axis.vertical, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Stack(children: [ColorfulText(), FlutterLogo(size: 60)]), + const SizedBox(height: 20), + FlutterUnitText( + text: StrUnit.appName, + color: color, + ), + ], + )), + const Expanded( + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Positioned( + bottom: 15, + child: Wrap( + direction: Axis.vertical, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text("Power By 张风捷特烈", style: shadowStyle), + Text("· 2021 · @编程之王 ", style: shadowStyle), + ], + )), + ], + )) + ], + ); + } +} + +class ColorfulText extends StatelessWidget { + const ColorfulText({super.key}); + + @override + Widget build(BuildContext context) { + final Paint paint = Paint() + ..style = PaintingStyle.stroke + ..shader = ui.Gradient.linear( + const Offset(0, 0), + const Offset(22, 0), + [Colors.red, Colors.yellow, Colors.blue, Colors.green], + [1 / 4, 2 / 4, 3 / 4, 1], + TileMode.mirror, + Matrix4.rotationZ(pi / 4).storage, + ); + return Text( + "U", + style: TextStyle( + fontSize: 26, + height: 1, + fontWeight: FontWeight.bold, + foreground: paint), + ); + } +} + +class SplashTopBar extends StatelessWidget { + final Widget? leading; + final Widget? logo; + + const SplashTopBar({super.key, this.leading,this.logo}); + + @override + Widget build(BuildContext context) { + if(!isDesk) return const SizedBox.shrink(); + return DragToMoveAreaNoDouble( + child: Stack( + children: [ + Container( + alignment: Alignment.topLeft, + padding: const EdgeInsets.symmetric(horizontal: 12.0,vertical: 8), + child: Row( + children: [ + if (leading != null) Row( + children: [ + if(logo!=null)logo!, + const SizedBox(width: 8,), + leading!, + ], + ), + const Spacer(), + const SizedBox( + width: 20, + ), + ], + ), + ), + Positioned( + + right: 0, + child: const WindowButtons()) + ], + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index a0544e0e..97953c5a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,7 +10,7 @@ void main() { WidgetsFlutterBinding.ensureInitialized(); //滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; - runApp(const BlocWrapper(child: FlutterUnit())); + runApp( BlocWrapper(child: FlutterUnit3())); WindowsAdapter.setSize(); } diff --git a/lib/app/router/menu_meta.dart b/lib/navigation/menus/menu_meta.dart similarity index 100% rename from lib/app/router/menu_meta.dart rename to lib/navigation/menus/menu_meta.dart diff --git a/lib/navigation/routers/app_route.dart b/lib/navigation/routers/app_route.dart new file mode 100644 index 00000000..d4207635 --- /dev/null +++ b/lib/navigation/routers/app_route.dart @@ -0,0 +1,27 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import '../../app_stater/view/app_start_listener.dart'; +import '../../app_stater/view/standard_unit_splash.dart'; + +import 'desk_route.dart'; +import 'mobile_route.dart'; + +final RouteBase deskAppRoute = GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + GoRoute( + path: 'splash', + builder: (BuildContext context, GoRouterState state) { + return const AppStartListener(child: FlutterUnitSplash()); + }, + ), + // isDesk ? : + if(isDesk) + appNavRoute, + if(!isDesk) + ...appMobileNavRoute + ], +); diff --git a/lib/navigation/routers/desk_route.dart b/lib/navigation/routers/desk_route.dart new file mode 100644 index 00000000..f14226e9 --- /dev/null +++ b/lib/navigation/routers/desk_route.dart @@ -0,0 +1,127 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:artifact/artifact.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/views/setting/setting_page.dart'; +import 'package:go_router/go_router.dart'; +import 'package:treasure_tools/treasure_tools.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../../app/views/about/version_info.dart'; +import '../../app/views/setting/code_style_setting.dart'; +import '../../app/views/setting/font_setting.dart'; +import '../../app/views/setting/theme_color_setting.dart'; +import '../../app/views/setting/theme_model_setting.dart'; +import '../views/desk/flutter_unit_desk_navigation.dart'; + +final RouteBase appNavRoute = ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return FlutterUnitDeskNavigation(content: child); + }, + routes: [ + GoRoute( + path: 'widget', + builder: (BuildContext context, GoRouterState state) { + return DeskWidgetPanel(); + }, + routes: [ + GoRoute( + path: 'detail/:name', + builder: (BuildContext context, GoRouterState state) { + Object? extra= state.extra; + WidgetModel? model; + if(extra is WidgetModel){ + model = extra; + } + return DeskWidgetDetailPageScope( + model: model, + widgetName: state.pathParameters['name'], + ); + }, + ), + ] + ), + GoRoute( + path: 'gallery', + builder: (BuildContext context, GoRouterState state) { + return GalleryUnit(); + }, + ), + GoRoute( + path: 'knowledge', + builder: (BuildContext context, GoRouterState state) { + return DeskPointPage(); + }, + ), + GoRoute( + path: 'collection', + builder: (BuildContext context, GoRouterState state) { + return CollectPageAdapter(); + }, + routes: [ + GoRoute( + path: 'widgets/:id', + builder: (BuildContext context, GoRouterState state) { + Object? extra= state.extra; + CategoryModel? model; + if(extra is CategoryModel){ + model = extra; + } + return CategoryShow( + model: model!, + ); + }, + ), + ] + ), + GoRoute( + path: 'algorithm', + builder: (BuildContext context, GoRouterState state) { + return DeskSortPage(); + }, + ), + GoRoute( + path: 'tools', + builder: (BuildContext context, GoRouterState state) { + return CodeGenPage(); + }, + ), + GoRoute( + path: 'settings', + builder: (BuildContext context, GoRouterState state) { + return const SettingPage(); + }, + routes: [ + GoRoute( + path: 'dark_mode', + builder: (BuildContext context, GoRouterState state) { + return const ThemeModelSetting(); + }, + ), + GoRoute( + path: 'code_style', + builder: (BuildContext context, GoRouterState state) { + return const CodeStyleSettingPage(); + }, + ), + GoRoute( + path: 'theme_color', + builder: (BuildContext context, GoRouterState state) { + return const ThemeColorSettingPage(); + }, + ), + GoRoute( + path: 'font_setting', + builder: (BuildContext context, GoRouterState state) { + return const FontSettingPage(); + }, + ), + GoRoute( + path: 'version', + builder: (BuildContext context, GoRouterState state) { + return const VersionInfo(); + }, + ), + ]) + ], +); \ No newline at end of file diff --git a/lib/navigation/routers/mobile_route.dart b/lib/navigation/routers/mobile_route.dart new file mode 100644 index 00000000..8a85b654 --- /dev/null +++ b/lib/navigation/routers/mobile_route.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../../app/views/about/about_app_page.dart'; +import '../../app/views/about/about_me_page.dart'; +import '../../app/views/about/version_info.dart'; +import '../../app/views/data_manage/data_manage_page.dart'; +import '../../app/views/setting/code_style_setting.dart'; +import '../../app/views/setting/font_setting.dart'; +import '../../app/views/setting/setting_page.dart'; +import '../../app/views/setting/theme_color_setting.dart'; +import '../../app/views/setting/theme_model_setting.dart'; +import '../views/unit_navigation.dart'; + +final List appMobileNavRoute = [ + GoRoute( + path: 'widget', + builder: (BuildContext context, GoRouterState state) { + return const UnitPhoneNavigation(); + }, + routes: [ + GoRoute( + path: 'detail/:name', + builder: (BuildContext context, GoRouterState state) { + Object? extra = state.extra; + WidgetModel? model; + if (extra is WidgetModel) { + model = extra; + } + return WidgetDetailPageScope( + model: model!, + ); + }, + ), + ]), + GoRoute( + path: 'collection_widgets/:id', + builder: (BuildContext context, GoRouterState state) { + Object? extra= state.extra; + CategoryModel? model; + if(extra is CategoryModel){ + model = extra; + } + return CategoryShow( + model: model!, + ); + }, + ), + GoRoute( + path: 'settings', + builder: (BuildContext context, GoRouterState state) { + return const SettingPage(); + }, + routes: [ + GoRoute( + path: 'dark_mode', + builder: (BuildContext context, GoRouterState state) { + return const ThemeModelSetting(); + }, + ), + GoRoute( + path: 'code_style', + builder: (BuildContext context, GoRouterState state) { + return const CodeStyleSettingPage(); + }, + ), + GoRoute( + path: 'theme_color', + builder: (BuildContext context, GoRouterState state) { + return const ThemeColorSettingPage(); + }, + ), + GoRoute( + path: 'font_setting', + builder: (BuildContext context, GoRouterState state) { + return const FontSettingPage(); + }, + ), + GoRoute( + path: 'version', + builder: (BuildContext context, GoRouterState state) { + return const VersionInfo(); + }, + ), + ]), + GoRoute( + path: 'data_manage', + builder: (BuildContext context, GoRouterState state) { + return const DataManagePage(); + }, + ), + GoRoute( + path: 'collect', + builder: (BuildContext context, GoRouterState state) { + return const CollectPageAdapter( + canPop: true, + ); + }, + ), + + GoRoute( + path: 'about_app', + builder: (BuildContext context, GoRouterState state) { + return const AboutAppPage(); + }, + ), + GoRoute( + path: 'about_me', + builder: (BuildContext context, GoRouterState state) { + return const AboutMePage(); + }, + ), +]; diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart new file mode 100644 index 00000000..ce58c4bc --- /dev/null +++ b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart @@ -0,0 +1,70 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/navigation/menus/menu_meta.dart'; +import 'package:go_router/go_router.dart'; +import 'unit_rail_navigation.dart'; + +class FlutterUnitDeskNavigation extends StatelessWidget { + final Widget content; + const FlutterUnitDeskNavigation({super.key, required this.content}); + + + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + DeskNavigationRail(), + Expanded(child: content), + ], + ), + ); + } + + +} + +class DeskNavigationRail extends StatefulWidget { + const DeskNavigationRail({super.key}); + + @override + State createState() => _DeskNavigationRailState(); +} + +class _DeskNavigationRailState extends State { + @override + Widget build(BuildContext context) { + return UnitRailNavigation( + selectedIndex: activeIndex??0, + onItemClick: _onItemClick, itemData: deskNavBarMenus, + ); + } + + final List deskNavBarMenus = const [ + MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), + MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/gallery'), + MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), + MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), + MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), + MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), + ]; + + final RegExp _segReg = RegExp(r'/\w+'); + + int? get activeIndex { + final String path = GoRouterState.of(context).uri.toString(); + RegExpMatch? match = _segReg.firstMatch(path); + if (match == null) return null; + String? target = match.group(0); + int index = deskNavBarMenus.indexWhere((menu) => menu.path!.contains(target??'')); + if (index == -1) return null; + return index; + } + + void _onItemClick(int index) { + String path = deskNavBarMenus[index].path!; + GoRouter.of(context).go(path); + } + +} diff --git a/lib/app/navigation/desk_ui/theme_model_switch_icon.dart b/lib/navigation/views/desk/theme_model_switch_icon.dart similarity index 80% rename from lib/app/navigation/desk_ui/theme_model_switch_icon.dart rename to lib/navigation/views/desk/theme_model_switch_icon.dart index e8237b66..3cd9fd7a 100644 --- a/lib/app/navigation/desk_ui/theme_model_switch_icon.dart +++ b/lib/navigation/views/desk/theme_model_switch_icon.dart @@ -8,13 +8,13 @@ class ThemeModelSwitchIcon extends StatelessWidget { @override Widget build(BuildContext context) { - ThemeMode model = context.select((bloc)=>bloc.state.themeMode); + ThemeMode model = context.select((bloc)=>bloc.state.themeMode); bool isDark = Theme.of(context).brightness == Brightness.dark; return MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( onTap: (){ - context.read().changeThemeMode(isDark?ThemeMode.light:ThemeMode.dark); + context.read().changeThemeMode(isDark?ThemeMode.light:ThemeMode.dark); }, child: Padding( padding: const EdgeInsets.only(bottom: 16, top: 16), diff --git a/lib/app/navigation/desk_ui/unit_desk_navigation.dart b/lib/navigation/views/desk/unit_desk_navigation.dart similarity index 69% rename from lib/app/navigation/desk_ui/unit_desk_navigation.dart rename to lib/navigation/views/desk/unit_desk_navigation.dart index b69975fb..382e08ff 100644 --- a/lib/app/navigation/desk_ui/unit_desk_navigation.dart +++ b/lib/navigation/views/desk/unit_desk_navigation.dart @@ -1,14 +1,12 @@ import 'package:algorithm/algorithm.dart'; import 'package:app/app.dart'; +import 'package:artifact/artifact.dart'; +import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/code_gen/code_gen_page.dart'; - -import 'package:flutter_unit/painter_system/gallery_unit.dart'; -import 'package:flutter_unit/widget_ui/desk_ui/widget_panel/widget_panel.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; -import '../../../point_system/views/desk_ui/desk_point_page.dart'; -import '../home_drawer.dart'; +import 'package:treasure_tools/treasure_tools.dart'; +import 'package:widget_module/views/mobile/widget_page/home_drawer.dart'; +import 'package:widget_module/widget_module.dart'; +import '../../menus/menu_meta.dart'; import 'unit_rail_navigation.dart'; class UnitDeskNavigation extends StatefulWidget { @@ -45,7 +43,14 @@ class _UnitDeskNavigationState extends State { // builder: (ctx) => OverlayToolWrapper( // child: child, // )); - + final List deskNavBarMenus = const [ + MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), + MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/draw'), + MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), + MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), + MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), + MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), + ]; @override Widget build(BuildContext context) { return Scaffold( @@ -55,14 +60,7 @@ class _UnitDeskNavigationState extends State { children: [ UnitRailNavigation( selectedIndex: _currentIndex, - onItemClick: _onItemClick, itemData: const { - "组件集录": TolyIcon.icon_layout, - "收藏集录": TolyIcon.icon_star, - "绘制集录": Icons.palette, - "可视排序": Icons.sort, - "代码生成": TolyIcon.icon_fast, - "要点集录": TolyIcon.icon_bug, - }, + onItemClick: _onItemClick, itemData: deskNavBarMenus ), // _buildLeftNav(), Expanded( diff --git a/lib/app/navigation/desk_ui/unit_rail_navigation.dart b/lib/navigation/views/desk/unit_rail_navigation.dart similarity index 86% rename from lib/app/navigation/desk_ui/unit_rail_navigation.dart rename to lib/navigation/views/desk/unit_rail_navigation.dart index c0447677..83d79c07 100644 --- a/lib/app/navigation/desk_ui/unit_rail_navigation.dart +++ b/lib/navigation/views/desk/unit_rail_navigation.dart @@ -1,13 +1,18 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/navigation/desk_ui/theme_model_switch_icon.dart'; +import 'package:flutter_unit/navigation/views/desk/theme_model_switch_icon.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../../../navigation/menus/menu_meta.dart'; + class UnitRailNavigation extends StatefulWidget { final ValueChanged onItemClick; final int selectedIndex; - final Map itemData; + // final Map itemData; + final List itemData; + const UnitRailNavigation( {Key? key, @@ -25,9 +30,9 @@ class _UnitRailNavigationState extends State late List _destinationControllers; late List> _destinationAnimations; - List get info => widget.itemData.keys.toList(); + List get info => widget.itemData.map((e) => e.label).toList(); - List get icons => widget.itemData.values.toList(); + List get icons => widget.itemData.map((e) => e.icon).toList(); @override void initState() { @@ -52,8 +57,6 @@ class _UnitRailNavigationState extends State void _rebuild() { setState(() { - // Rebuilding when any of the controllers tick, i.e. when the items are - // animating. }); } @@ -113,19 +116,19 @@ class _UnitRailNavigationState extends State ) ], ), - buildIcons(), + _buildIcons(), const Divider( color: Colors.white, height: 1, endIndent: 20, ), -// SizedBox(height: 60,), Expanded( flex: 5, - child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 24), //const Size(120, 35) child: Column( - mainAxisSize: MainAxisSize.min, + // mainAxisSize: MainAxisSize.min, children: info .asMap() .keys @@ -136,7 +139,7 @@ class _UnitRailNavigationState extends State }, selected: widget.selectedIndex == index, width: 130, - height: 46, + height: 42, activeColor: Theme.of(context).primaryColor, inactiveColor: Colors.white.withAlpha(33), icon: icons[index], @@ -161,7 +164,7 @@ class _UnitRailNavigationState extends State const ThemeModelSwitchIcon(), Builder( builder: (ctx) => FeedbackWidget( - onPressed: () => Scaffold.of(ctx).openDrawer(), + onPressed: () => context.push('/settings'), child: const Padding( padding: EdgeInsets.only(bottom: 16, top: 16), child: Icon( @@ -180,19 +183,12 @@ class _UnitRailNavigationState extends State ; } - Widget buildIcons() { + Widget _buildIcons() { return Padding( padding: const EdgeInsets.only(bottom: 16, top: 16), child: Wrap( spacing: 8, children: [ - FeedbackWidget( - onPressed: () => _launchURL("http://blog.toly1994.com/"), - child: const Icon( - TolyIcon.icon_item, - color: Colors.white, - ), - ), FeedbackWidget( onPressed: () => _launchURL("https://github.com/toly1994328/FlutterUnit"), @@ -209,6 +205,15 @@ class _UnitRailNavigationState extends State color: Colors.white, ), ), + FeedbackWidget( + onPressed: () => _launchURL("http://blog.toly1994.com/"), + child: const Icon( + TolyIcon.icon_item, + color: Colors.white, + ), + ), + + ], ), ); @@ -254,16 +259,19 @@ class _UnitRailMenu extends StatefulWidget { class _UnitRailMenuState extends State<_UnitRailMenu> { @override Widget build(BuildContext context) { - return GestureDetector( - onTap: widget.onTap, - child: Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - child: AnimatedBuilder( - animation: widget.animation, - builder: (BuildContext context, Widget? child) => _buildItem(), - ), - )); + return Container( + alignment: Alignment.topLeft, + margin: const EdgeInsets.only(top: 10), + child:MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: widget.onTap, + child: AnimatedBuilder( + animation: widget.animation, + builder: (BuildContext context, Widget? child) => _buildItem(), + ), + )), + ); } late ColorTween colorTween = ColorTween(begin: widget.inactiveColor, end: widget.activeColor); diff --git a/lib/app/navigation/overlay_tool_wrapper.dart b/lib/navigation/views/overlay_tool_wrapper.dart similarity index 96% rename from lib/app/navigation/overlay_tool_wrapper.dart rename to lib/navigation/views/overlay_tool_wrapper.dart index 554519f5..69a57c7f 100644 --- a/lib/app/navigation/overlay_tool_wrapper.dart +++ b/lib/navigation/views/overlay_tool_wrapper.dart @@ -1,10 +1,8 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:artifact/artifact.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; - - /// create by 张风捷特烈 on 2020/10/21 /// contact me by email 1981462002@qq.com @@ -157,7 +155,7 @@ class OverlayToolWrapperState extends State // 处理 菜单 item 点击事件 void _toSetting() { - Navigator.of(context).pushNamed(UnitRouter.setting); + // Navigator.of(context).pushNamed(UnitRouter.setting); } void _toWidget() {} @@ -168,7 +166,7 @@ class OverlayToolWrapperState extends State void _toPoint() { BlocProvider.of(context).add(EventLoadPoint()); - Navigator.of(context).pushNamed(UnitRouter.point); + // Navigator.of(context).pushNamed(UnitRouter.point); } void _doClose() { diff --git a/lib/app/navigation/pure_bottom_bar.dart b/lib/navigation/views/pure_bottom_bar.dart similarity index 100% rename from lib/app/navigation/pure_bottom_bar.dart rename to lib/navigation/views/pure_bottom_bar.dart diff --git a/lib/app/navigation/unit_navigation.dart b/lib/navigation/views/unit_navigation.dart similarity index 83% rename from lib/app/navigation/unit_navigation.dart rename to lib/navigation/views/unit_navigation.dart index b0dd3b76..0e6cb445 100644 --- a/lib/app/navigation/unit_navigation.dart +++ b/lib/navigation/views/unit_navigation.dart @@ -4,17 +4,17 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:artifact/artifact.dart'; import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/painter_system/gallery_unit.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/collect_page.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/home_right_drawer.dart'; +import 'package:toly_ui/toly_ui.dart'; + import 'package:widget_module/blocs/blocs.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_panel/standard_home_page.dart'; +import 'package:widget_module/widget_module.dart'; -import 'pure_bottom_bar.dart'; -import 'desk_ui/unit_desk_navigation.dart'; +import '../../navigation/views/pure_bottom_bar.dart'; +import '../../navigation/views/desk/unit_desk_navigation.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com @@ -25,13 +25,9 @@ class UnitNavigation extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( - builder: (_, state) => LayoutBuilder(builder: (_, c) { - if (c.maxWidth > 500) { - return UnitDeskNavigation(); - } - return UnitPhoneNavigation(); - }), + return const PlatformViewAdapter( + mobile: UnitPhoneNavigation(), + desk: UnitDeskNavigation(), ); } } diff --git a/lib/widget_ui/widget_ui.dart b/lib/widget_ui/widget_ui.dart deleted file mode 100644 index 3e16562b..00000000 --- a/lib/widget_ui/widget_ui.dart +++ /dev/null @@ -1,8 +0,0 @@ -// export '../widget_system/views/widget_detail_page/widget_detail_page.dart'; -// export '../widget_system/views/category_view/category_page.dart'; -// export '../widget_system/views/category_view/collect_page.dart'; -// export '../widget_system/views/category_view/home_right_drawer.dart'; -// export '../widget_system/views/category_view/category_detail.dart'; -// export '../widget_system/views/search_view/search_page.dart'; - - diff --git a/packages/algorithm/lib/src/views/top_bar/sort_bar.dart b/packages/algorithm/lib/src/views/top_bar/sort_bar.dart index 0a183be8..3bcecd90 100644 --- a/packages/algorithm/lib/src/views/top_bar/sort_bar.dart +++ b/packages/algorithm/lib/src/views/top_bar/sort_bar.dart @@ -1,6 +1,6 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; import '../../data_scope/state.dart'; @@ -17,12 +17,14 @@ class DeskSortBar extends StatelessWidget { return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, color: isDark? const Color(0xff2C3036):Colors.white, child: const Row( children: [ - Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + ), Spacer(), SizedBox( width: 20, diff --git a/packages/algorithm/pubspec.yaml b/packages/algorithm/pubspec.yaml index 7e7ad6ae..7112b5de 100644 --- a/packages/algorithm/pubspec.yaml +++ b/packages/algorithm/pubspec.yaml @@ -12,6 +12,8 @@ dependencies: sdk: flutter components: path: ../components + toly_ui: + path: ../toly_ui app: path: ../app dev_dependencies: diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index 555144cf..866e5e16 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -1,15 +1,13 @@ library app; -export 'bloc/global_bloc.dart'; -export 'model/global_state.dart'; -export 'model/app_style.dart'; -export 'repository/app_state_repository.dart'; +export 'app_config/bloc/bloc.dart'; +export 'app_config/repository/repository.dart'; export 'app/cons/cons.dart'; export 'app/cons/global_value.dart'; export 'app/cons/path_unit.dart'; export 'app/cons/sp.dart'; export 'app/cons/str_unit.dart'; -export 'app/router/unit_router.dart'; + export 'app/router/slide_page_route.dart'; export 'app/router/fade_page_route.dart'; @@ -25,5 +23,7 @@ export 'app/style/shape/coupon_shape_border.dart'; export 'app/style/shape/techno_shape.dart'; export 'app/style/behavior/no_scroll_behavior.dart'; -export 'package:app/platform_adapter/window/windows_adapter.dart'; -export 'package:app/platform_adapter/views/window_buttons.dart'; \ No newline at end of file +export 'app/platform_adapter/window/windows_adapter.dart'; +export 'app/platform_adapter/views/window_buttons.dart'; + +export 'app_config/app_config.dart'; \ No newline at end of file diff --git a/packages/app/lib/app/cons/cons.dart b/packages/app/lib/app/cons/cons.dart index 43b8257f..57ae8e9a 100644 --- a/packages/app/lib/app/cons/cons.dart +++ b/packages/app/lib/app/cons/cons.dart @@ -1,8 +1,8 @@ -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:widget_module/widget_module.dart'; -import '../../model/app_style.dart'; import '../res/toly_icon.dart'; diff --git a/packages/app/lib/platform_adapter/views/window_buttons.dart b/packages/app/lib/app/platform_adapter/views/window_buttons.dart similarity index 100% rename from packages/app/lib/platform_adapter/views/window_buttons.dart rename to packages/app/lib/app/platform_adapter/views/window_buttons.dart diff --git a/packages/app/lib/platform_adapter/window/windows_adapter.dart b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart similarity index 95% rename from packages/app/lib/platform_adapter/window/windows_adapter.dart rename to packages/app/lib/app/platform_adapter/window/windows_adapter.dart index e4f90cb9..aedc4a02 100644 --- a/packages/app/lib/platform_adapter/window/windows_adapter.dart +++ b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart @@ -10,8 +10,8 @@ class WindowsAdapter { //仅对桌面端进行尺寸设置 await windowManager.ensureInitialized(); WindowOptions windowOptions = const WindowOptions( - size: Size(900,680), - minimumSize: Size(900,680), + size: Size(920,680), + minimumSize: Size(920,690), center: true, backgroundColor: Colors.transparent, skipTaskbar: false, diff --git a/packages/app/lib/app/router/fade_page_route.dart b/packages/app/lib/app/router/fade_page_route.dart index 515618ad..1b070dea 100644 --- a/packages/app/lib/app/router/fade_page_route.dart +++ b/packages/app/lib/app/router/fade_page_route.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'cupertino_back_gesture_detector.dart'; +import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; class FadePageRoute extends MaterialPageRoute { final Widget child; diff --git a/packages/app/lib/app/router/router_utils.dart b/packages/app/lib/app/router/router_utils.dart deleted file mode 100644 index f5516417..00000000 --- a/packages/app/lib/app/router/router_utils.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - diff --git a/packages/app/lib/app/router/slide_page_route.dart b/packages/app/lib/app/router/slide_page_route.dart index 45386e7c..f4866869 100644 --- a/packages/app/lib/app/router/slide_page_route.dart +++ b/packages/app/lib/app/router/slide_page_route.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'cupertino_back_gesture_detector.dart'; +import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; class SlidePageRoute extends MaterialPageRoute { diff --git a/packages/app/lib/app/router/unit_router.dart b/packages/app/lib/app/router/unit_router.dart deleted file mode 100644 index 651ecd3b..00000000 --- a/packages/app/lib/app/router/unit_router.dart +++ /dev/null @@ -1,33 +0,0 @@ -// ignore_for_file: constant_identifier_names -class UnitRouter { - static const String widget_detail = '/widget_detail'; - - static const String detail = 'detail'; - static const String search = 'search_bloc'; - static const String nav = 'nav'; - - static const String collect = 'CollectPage'; - static const String point = 'IssuesPointPage'; - static const String point_detail = 'IssuesDetailPage'; - - static const String setting = 'SettingPage'; - static const String font_setting = 'FountSettingPage'; - static const String theme_color_setting = 'ThemeColorSettingPage'; - static const String code_style_setting = 'CodeStyleSettingPage'; - static const String item_style_setting = 'ItemStyleSettingPage'; - static const String version_info = 'VersionInfo'; - static const String login = 'login'; - - static const String category_show = 'CategoryShow'; - static const String issues_point = 'IssuesPointPage'; - - static const String attr = 'AttrUnitPage'; - static const String bug = 'BugUnitPage'; - static const String layout = 'LayoutUnitPage'; - static const String about_me = 'AboutMePage'; - static const String about_app = 'AboutAppPage'; - static const String register = 'register'; - - static const String data_manage = 'DataManagePage'; - -} diff --git a/packages/app/lib/app/router/zero_page_route.dart b/packages/app/lib/app/router/zero_page_route.dart index 5636c95a..75f03fb4 100644 --- a/packages/app/lib/app/router/zero_page_route.dart +++ b/packages/app/lib/app/router/zero_page_route.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'cupertino_back_gesture_detector.dart'; +import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; class ZeroPageRoute extends MaterialPageRoute { final Widget child; diff --git a/packages/app/lib/app/style/transition/fade_page_transitions_builder.dart b/packages/app/lib/app/style/transition/fade_page_transitions_builder.dart new file mode 100644 index 00000000..d0e9e3f0 --- /dev/null +++ b/packages/app/lib/app/style/transition/fade_page_transitions_builder.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FadePageTransitionsBuilder extends PageTransitionsBuilder { + const FadePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return FadeTransition( + opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + child: child, + ); + } +} diff --git a/packages/app/lib/app/style/transition/size_clip_transition.dart b/packages/app/lib/app/style/transition/size_clip_transition.dart new file mode 100644 index 00000000..f3fa0f5c --- /dev/null +++ b/packages/app/lib/app/style/transition/size_clip_transition.dart @@ -0,0 +1,105 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SizeClipTransition extends StatelessWidget { + final Animation animation; + final Animation secondaryAnimation; + final Widget child; + + const SizeClipTransition({ + super.key, + required this.animation, + required this.secondaryAnimation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), + child: child, + ); + } +} + +class SizePathClipper extends CustomClipper { + final double progress; + + SizePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height, + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant SizePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class ScalePathClipper extends CustomClipper { + final double progress; + + ScalePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height* (1 - progress), + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant ScalePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class CirclePathClipper extends CustomClipper { + final double progress; + + CirclePathClipper(this.progress); + + @override + Path getClip(Size size) { + print('progress:$progress'); + if(progress==0){ + return Path(); + } + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCircle( + center: Offset(size.width , 0), + radius: sqrt(size.width*size.width+size.height*size.height) * (progress), + ); + + Path zone = Path()..addRect(box); + Path cliper = Path()..addOval(center); + + return Path.combine(PathOperation.intersect, zone, cliper ); + } + + @override + bool shouldReclip(covariant CirclePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} \ No newline at end of file diff --git a/packages/app/lib/app/router/cupertino_back_gesture_detector.dart b/packages/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart similarity index 100% rename from packages/app/lib/app/router/cupertino_back_gesture_detector.dart rename to packages/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart diff --git a/packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart b/packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart new file mode 100644 index 00000000..4c4270cf --- /dev/null +++ b/packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart @@ -0,0 +1,32 @@ +import 'dart:io'; + +import 'package:app/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class SlidePageTransitionsBuilder extends PageTransitionsBuilder { + const SlidePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(route!), + onStartPopGesture: () => startPopGesture(route!), + child: child); + } + final bool linearTransition = isPopGestureInProgress(route!); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } +} \ No newline at end of file diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index 0013f792..d791c134 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -1,11 +1,16 @@ +import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import '../../app_config/bloc/state.dart'; +import '../style/transition/fade_page_transitions_builder.dart'; +import '../style/transition/slide_transition/slide_page_transition_builder.dart'; + class AppTheme { - static ThemeData darkTheme(AppState state) { + static ThemeData darkTheme(AppConfigState state) { Color scaffoldBackgroundColor = const Color(0xff010201); @@ -18,7 +23,13 @@ class AppTheme { return ThemeData( scaffoldBackgroundColor: scaffoldBackgroundColor, - + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), tabBarTheme: TabBarTheme( dividerColor: Colors.transparent, ), @@ -52,7 +63,7 @@ class AppTheme { ); } - static ThemeData lightTheme(AppState state) { + static ThemeData lightTheme(AppConfigState state) { SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarBrightness: Brightness.light, @@ -76,6 +87,13 @@ class AppTheme { space: px1, thickness: px1, ), + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), tabBarTheme: TabBarTheme( dividerColor: Colors.transparent, splashFactory: NoSplash.splashFactory, diff --git a/packages/app/lib/app_config/app_config.dart b/packages/app/lib/app_config/app_config.dart new file mode 100644 index 00000000..0f31eb5d --- /dev/null +++ b/packages/app/lib/app_config/app_config.dart @@ -0,0 +1,3 @@ +export 'bloc/state.dart'; +export 'bloc/bloc.dart'; +export 'repository/repository.dart'; \ No newline at end of file diff --git a/packages/app/lib/bloc/global_bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart similarity index 73% rename from packages/app/lib/bloc/global_bloc.dart rename to packages/app/lib/app_config/bloc/bloc.dart index 45bf6a04..966a968a 100644 --- a/packages/app/lib/bloc/global_bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -5,23 +5,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:storage/storage.dart'; -import '../model/app_style.dart'; -import '../repository/app_state_repository.dart'; -import '../model/global_state.dart'; +import '../repository/repository.dart'; +import 'state.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com /// 说明: 全局信息的bloc -class AppBloc extends Cubit { +class AppConfigBloc extends Cubit { final Connectivity _connectivity = Connectivity(); - final AppStateRepository storage; late StreamSubscription _subscription; - AppBloc(this.storage) : super(const AppState()){ + AppConfigBloc(this.storage) : super(const AppConfigState()){ _subscription = _connectivity.onConnectivityChanged.listen(_onNetConnectChange); } @@ -42,58 +40,58 @@ class AppBloc extends Cubit { emit(await storage.initApp()); } - AppConfigCao get cao => storage.sp.appConfig; + AppConfigCao get cao => SpStorage.instance.appConfig; // 切换字体事件处理 : 固化索引 + 产出新状态 void switchFontFamily(String family) async { - AppState newState = state.copyWith(fontFamily: family); + AppConfigState newState = state.copyWith(fontFamily: family); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换主题色事件处理 : 固化索引 + 产出新状态 void switchThemeColor(MaterialColor color) async { - AppState newState = state.copyWith(themeColor: color); + AppConfigState newState = state.copyWith(themeColor: color); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 固化数据 + 产出新状态 void switchShowBg(bool show) async { - AppState newState = state.copyWith(showBackGround: show); + AppConfigState newState = state.copyWith(showBackGround: show); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 产出新状态 void switchShowOver(bool show) async { - AppState newState = state.copyWith(showPerformanceOverlay: show); + AppConfigState newState = state.copyWith(showPerformanceOverlay: show); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换code样式事件处理 : 固化索引 + 产出新状态 void switchCoderTheme(int codeStyleIndex) async { - AppState newState = state.copyWith(codeStyleIndex: codeStyleIndex); + AppConfigState newState = state.copyWith(codeStyleIndex: codeStyleIndex); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换item样式事件处理 : 固化索引 + 产出新状态 void changeItemStyle(int index) async { - AppState newState = state.copyWith(itemStyleIndex: index); + AppConfigState newState = state.copyWith(itemStyleIndex: index); cao.write(newState.toAppConfigPo()); emit(newState); } void changeThemeMode(ThemeMode style) async{ - AppState newState = state.copyWith(themeMode: style); + AppConfigState newState = state.copyWith(themeMode: style); cao.write(newState.toAppConfigPo()); emit(newState); } void switchShowTool(bool show) async{ - AppState newState = state.copyWith(showOverlayTool: show); + AppConfigState newState = state.copyWith(showOverlayTool: show); cao.write(newState.toAppConfigPo()); emit(newState); } diff --git a/packages/app/lib/model/global_state.dart b/packages/app/lib/app_config/bloc/state.dart similarity index 78% rename from packages/app/lib/model/global_state.dart rename to packages/app/lib/app_config/bloc/state.dart index 4faada5c..0f53c90d 100644 --- a/packages/app/lib/model/global_state.dart +++ b/packages/app/lib/app_config/bloc/state.dart @@ -1,11 +1,10 @@ import 'package:app/app/cons/cons.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:storage/storage.dart'; -import 'app_style.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com @@ -17,7 +16,7 @@ Map themeMode2Str = const { ThemeMode.dark: "深色模式", }; -class AppState extends Equatable { +class AppConfigState extends Equatable { /// [fontFamily] 文字字体 final String fontFamily; @@ -43,9 +42,8 @@ class AppState extends Equatable { /// [appStyle] app 深色样式; final ThemeMode themeMode; final ConnectivityResult netConnect; - final String dbPath; - const AppState({ + const AppConfigState({ this.fontFamily = 'ComicNeue', this.themeColor = Colors.blue, this.themeMode = ThemeMode.system, @@ -54,24 +52,23 @@ class AppState extends Equatable { this.itemStyleIndex = 0, this.showPerformanceOverlay = false, this.showOverlayTool = true, - this.dbPath = '', this.netConnect = ConnectivityResult.none, }); @override List get props => [ - fontFamily, - themeColor, - showBackGround, - codeStyleIndex, - itemStyleIndex, - themeMode, - showOverlayTool, - showPerformanceOverlay, - netConnect, - ]; - - AppState copyWith({ + fontFamily, + themeColor, + showBackGround, + codeStyleIndex, + itemStyleIndex, + themeMode, + showOverlayTool, + showPerformanceOverlay, + netConnect, + ]; + + AppConfigState copyWith({ String? fontFamily, String? dbPath, MaterialColor? themeColor, @@ -83,7 +80,7 @@ class AppState extends Equatable { ThemeMode? themeMode, ConnectivityResult? netConnect, }) => - AppState( + AppConfigState( fontFamily: fontFamily ?? this.fontFamily, themeColor: themeColor ?? this.themeColor, showBackGround: showBackGround ?? this.showBackGround, @@ -93,7 +90,6 @@ class AppState extends Equatable { themeMode: themeMode ?? this.themeMode, showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay, netConnect: netConnect ?? this.netConnect, - dbPath: dbPath ?? this.dbPath, ); @@ -110,16 +106,16 @@ class AppState extends Equatable { ); // 根据存储的配置信息对象,形成 AppState 状态数据 - factory AppState.fromPo(AppConfigPo po) { - return AppState( - fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], - themeColor: Cons.kThemeColorSupport.keys.toList()[po.themeColorIndex], - showBackGround: po.showBackGround, - codeStyleIndex: po.codeStyleIndex, - itemStyleIndex: po.itemStyleIndex, - showPerformanceOverlay: po.showPerformanceOverlay, - showOverlayTool: po.showOverlayTool, - themeMode: ThemeMode.values[po.themeModeIndex], + factory AppConfigState.fromPo(AppConfigPo po) { + return AppConfigState( + fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], + themeColor: Cons.kThemeColorSupport.keys.toList()[po.themeColorIndex], + showBackGround: po.showBackGround, + codeStyleIndex: po.codeStyleIndex, + itemStyleIndex: po.itemStyleIndex, + showPerformanceOverlay: po.showPerformanceOverlay, + showOverlayTool: po.showOverlayTool, + themeMode: ThemeMode.values[po.themeModeIndex], ); } @@ -130,4 +126,4 @@ class AppState extends Equatable { String toString() { return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; } -} +} \ No newline at end of file diff --git a/packages/app/lib/app_config/repository/repository.dart b/packages/app/lib/app_config/repository/repository.dart new file mode 100644 index 00000000..239f64e1 --- /dev/null +++ b/packages/app/lib/app_config/repository/repository.dart @@ -0,0 +1,12 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:storage/storage.dart'; +import '../bloc/state.dart'; + +class AppStateRepository { + + Future initApp() async { + AppConfigPo po = await SpStorage.instance.appConfig.read(); + ConnectivityResult netConnect = await (Connectivity().checkConnectivity()); + return AppConfigState.fromPo(po).copyWith(netConnect: netConnect); + } +} diff --git a/packages/app/lib/bloc/update/bloc.dart b/packages/app/lib/app_update/bloc/bloc.dart similarity index 100% rename from packages/app/lib/bloc/update/bloc.dart rename to packages/app/lib/app_update/bloc/bloc.dart diff --git a/packages/app/lib/bloc/update/event.dart b/packages/app/lib/app_update/bloc/event.dart similarity index 100% rename from packages/app/lib/bloc/update/event.dart rename to packages/app/lib/app_update/bloc/event.dart diff --git a/packages/app/lib/bloc/update/state.dart b/packages/app/lib/app_update/bloc/state.dart similarity index 100% rename from packages/app/lib/bloc/update/state.dart rename to packages/app/lib/app_update/bloc/state.dart diff --git a/packages/app/lib/model/app_style.dart b/packages/app/lib/model/app_style.dart deleted file mode 100644 index 8b137891..00000000 --- a/packages/app/lib/model/app_style.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index b13d9d47..2d34592f 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.5 <3.0.0' + sdk: ">=3.0.0 <4.0.0" flutter: ">=1.17.0" dependencies: @@ -17,10 +17,12 @@ dependencies: window_manager: ^0.3.7 #桌面尺寸 storage: path: ../storage - widget_repository: - path: ../widget_repository + widget_module: + path: ../widget_module components: path: ../components + toly_ui: + path: ../toly_ui dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/artifact/lib/artifact.dart b/packages/artifact/lib/artifact.dart index fd14d461..e747288b 100644 --- a/packages/artifact/lib/artifact.dart +++ b/packages/artifact/lib/artifact.dart @@ -1,7 +1,9 @@ library artifact; -export 'src/views/artifact_page.dart'; -export 'src/views/wrapper/refresh.dart'; +export 'src/articles/view/artifact_page.dart'; +export 'src/articles/view/wrapper/refresh.dart'; -export 'src/repositories/db/article_dao.dart'; -export 'src/repositories/db/columnize_dao.dart'; \ No newline at end of file +export 'src/articles/data/db/article_dao.dart'; +export 'src/articles/data/db/columnize_dao.dart'; + +export 'src/points/exp.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/blocs/article/bloc.dart b/packages/artifact/lib/src/articles/bloc/article/bloc.dart similarity index 93% rename from packages/artifact/lib/src/blocs/article/bloc.dart rename to packages/artifact/lib/src/articles/bloc/article/bloc.dart index eefd759b..73484454 100644 --- a/packages/artifact/lib/src/blocs/article/bloc.dart +++ b/packages/artifact/lib/src/articles/bloc/article/bloc.dart @@ -1,8 +1,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; -import '../../repositories/model/article.dart'; -import '../../repositories/repository/article_repository.dart'; +import '../../data/model/article.dart'; +import '../../data/repository/article_repository.dart'; class ArticleBloc extends Cubit { ArticleBloc( diff --git a/packages/artifact/lib/src/blocs/columnize/bloc.dart b/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart similarity index 85% rename from packages/artifact/lib/src/blocs/columnize/bloc.dart rename to packages/artifact/lib/src/articles/bloc/columnize/bloc.dart index ce931571..3b2c3de3 100644 --- a/packages/artifact/lib/src/blocs/columnize/bloc.dart +++ b/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart @@ -1,8 +1,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:utils/utils.dart'; -import '../../repositories/model/columnize.dart'; -import '../../repositories/repository/columnize_repository.dart'; +import '../../data/model/columnize.dart'; +import '../../data/repository/columnize_repository.dart'; class ColumnizeBloc extends Cubit { final ColumnizeRepository repository; diff --git a/packages/artifact/lib/src/blocs/exp.dart b/packages/artifact/lib/src/articles/bloc/exp.dart similarity index 100% rename from packages/artifact/lib/src/blocs/exp.dart rename to packages/artifact/lib/src/articles/bloc/exp.dart diff --git a/packages/artifact/lib/src/repositories/db/article_dao.dart b/packages/artifact/lib/src/articles/data/db/article_dao.dart similarity index 97% rename from packages/artifact/lib/src/repositories/db/article_dao.dart rename to packages/artifact/lib/src/articles/data/db/article_dao.dart index 10bf5132..9d28944c 100644 --- a/packages/artifact/lib/src/repositories/db/article_dao.dart +++ b/packages/artifact/lib/src/articles/data/db/article_dao.dart @@ -1,6 +1,7 @@ -import 'package:artifact/src/repositories/exp.dart'; import 'package:sqflite/sqflite.dart'; +import '../model/article.dart'; + class ArticleDao { diff --git a/packages/artifact/lib/src/repositories/db/columnize_dao.dart b/packages/artifact/lib/src/articles/data/db/columnize_dao.dart similarity index 96% rename from packages/artifact/lib/src/repositories/db/columnize_dao.dart rename to packages/artifact/lib/src/articles/data/db/columnize_dao.dart index 96d1a282..f3976c50 100644 --- a/packages/artifact/lib/src/repositories/db/columnize_dao.dart +++ b/packages/artifact/lib/src/articles/data/db/columnize_dao.dart @@ -1,6 +1,7 @@ -import 'package:artifact/src/repositories/exp.dart'; import 'package:sqflite/sqflite.dart'; +import '../exp.dart'; + class ColumnizeDao { diff --git a/packages/artifact/lib/src/repositories/exp.dart b/packages/artifact/lib/src/articles/data/exp.dart similarity index 100% rename from packages/artifact/lib/src/repositories/exp.dart rename to packages/artifact/lib/src/articles/data/exp.dart diff --git a/packages/artifact/lib/src/repositories/model/article.dart b/packages/artifact/lib/src/articles/data/model/article.dart similarity index 100% rename from packages/artifact/lib/src/repositories/model/article.dart rename to packages/artifact/lib/src/articles/data/model/article.dart diff --git a/packages/artifact/lib/src/repositories/model/columnize.dart b/packages/artifact/lib/src/articles/data/model/columnize.dart similarity index 100% rename from packages/artifact/lib/src/repositories/model/columnize.dart rename to packages/artifact/lib/src/articles/data/model/columnize.dart diff --git a/packages/artifact/lib/src/repositories/repository/article_repository.dart b/packages/artifact/lib/src/articles/data/repository/article_repository.dart similarity index 81% rename from packages/artifact/lib/src/repositories/repository/article_repository.dart rename to packages/artifact/lib/src/articles/data/repository/article_repository.dart index 67cc2d83..ca92c311 100644 --- a/packages/artifact/lib/src/repositories/repository/article_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/article_repository.dart @@ -1,10 +1,12 @@ -import 'package:dio/dio.dart'; + +import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; -import 'package:utils/utils.dart'; -import '../../../artifact.dart'; import '../exp.dart'; + + + // 仓储: 提供数据 class ArticleRepository { const ArticleRepository(); diff --git a/packages/artifact/lib/src/repositories/repository/columnize_repository.dart b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart similarity index 82% rename from packages/artifact/lib/src/repositories/repository/columnize_repository.dart rename to packages/artifact/lib/src/articles/data/repository/columnize_repository.dart index 266d6ad5..7ba66680 100644 --- a/packages/artifact/lib/src/repositories/repository/columnize_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart @@ -1,8 +1,7 @@ -import 'package:dio/dio.dart'; + +import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; -import 'package:utils/utils.dart'; -import '../../../artifact.dart'; import '../model/columnize.dart'; // 仓储: 提供数据 diff --git a/packages/artifact/lib/src/views/article/article_detail_page.dart b/packages/artifact/lib/src/articles/view/article/article_detail_page.dart similarity index 97% rename from packages/artifact/lib/src/views/article/article_detail_page.dart rename to packages/artifact/lib/src/articles/view/article/article_detail_page.dart index 9e701d3e..7d5383c7 100644 --- a/packages/artifact/lib/src/views/article/article_detail_page.dart +++ b/packages/artifact/lib/src/articles/view/article/article_detail_page.dart @@ -5,7 +5,9 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../../repositories/model/article.dart'; +import '../../data/exp.dart'; + + class ArticleDetailPage extends StatefulWidget { final Article article; diff --git a/packages/artifact/lib/src/views/article/column_detail_page.dart b/packages/artifact/lib/src/articles/view/article/column_detail_page.dart similarity index 94% rename from packages/artifact/lib/src/views/article/column_detail_page.dart rename to packages/artifact/lib/src/articles/view/article/column_detail_page.dart index 74f6510c..e77620dc 100644 --- a/packages/artifact/lib/src/views/article/column_detail_page.dart +++ b/packages/artifact/lib/src/articles/view/article/column_detail_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../repositories/exp.dart'; +import '../../data/exp.dart'; import 'sliver_article.dart'; class ColumnDetailPage extends StatelessWidget { diff --git a/packages/artifact/lib/src/views/article/columnize_page_view.dart b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart similarity index 97% rename from packages/artifact/lib/src/views/article/columnize_page_view.dart rename to packages/artifact/lib/src/articles/view/article/columnize_page_view.dart index e68479ea..1382d7bb 100644 --- a/packages/artifact/lib/src/views/article/columnize_page_view.dart +++ b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -8,10 +8,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; -import '../../blocs/article/bloc.dart'; -import '../../blocs/exp.dart'; -import '../../repositories/model/columnize.dart'; -import '../../repositories/repository/article_repository.dart'; +import '../../bloc/article/bloc.dart'; +import '../../bloc/exp.dart'; +import '../../data/model/columnize.dart'; +import '../../data/repository/article_repository.dart'; import 'column_detail_page.dart'; diff --git a/packages/artifact/lib/src/views/article/sliver_article.dart b/packages/artifact/lib/src/articles/view/article/sliver_article.dart similarity index 98% rename from packages/artifact/lib/src/views/article/sliver_article.dart rename to packages/artifact/lib/src/articles/view/article/sliver_article.dart index a76262a1..0c616226 100644 --- a/packages/artifact/lib/src/views/article/sliver_article.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_article.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../blocs/exp.dart'; -import '../../repositories/exp.dart'; +import '../../bloc/exp.dart'; +import '../../data/exp.dart'; import 'article_detail_page.dart'; import 'columnize_page_view.dart'; diff --git a/packages/artifact/lib/src/views/article/sliver_columnize.dart b/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart similarity index 100% rename from packages/artifact/lib/src/views/article/sliver_columnize.dart rename to packages/artifact/lib/src/articles/view/article/sliver_columnize.dart diff --git a/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart b/packages/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart similarity index 95% rename from packages/artifact/lib/src/views/article/toly_article_scroll_page.dart rename to packages/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart index b39cf4c5..984fa4f9 100644 --- a/packages/artifact/lib/src/views/article/toly_article_scroll_page.dart +++ b/packages/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart @@ -1,13 +1,13 @@ +import 'package:artifact/artifact.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:refresh/refresh.dart'; -import '../../../artifact.dart'; -import '../../blocs/exp.dart'; -import '../toly_refresh_indicator.dart'; +import '../../bloc/exp.dart'; + import 'sliver_article.dart'; import 'sliver_columnize.dart'; diff --git a/packages/artifact/lib/src/views/artifact_page.dart b/packages/artifact/lib/src/articles/view/artifact_page.dart similarity index 98% rename from packages/artifact/lib/src/views/artifact_page.dart rename to packages/artifact/lib/src/articles/view/artifact_page.dart index ff27fc67..e71c01ee 100644 --- a/packages/artifact/lib/src/views/artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/artifact_page.dart @@ -5,10 +5,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../blocs/columnize/bloc.dart'; -import '../blocs/exp.dart'; -import '../repositories/exp.dart'; -import '../repositories/repository/article_repository.dart'; +import '../bloc/columnize/bloc.dart'; +import '../bloc/exp.dart'; +import '../data/exp.dart'; +import '../data/repository/article_repository.dart'; import 'article/toly_article_scroll_page.dart'; import 'dart:ui' as ui; diff --git a/packages/artifact/lib/src/views/building/building_panel.dart b/packages/artifact/lib/src/articles/view/building/building_panel.dart similarity index 100% rename from packages/artifact/lib/src/views/building/building_panel.dart rename to packages/artifact/lib/src/articles/view/building/building_panel.dart diff --git a/packages/artifact/lib/src/views/toly_refresh_indicator.dart b/packages/artifact/lib/src/articles/view/toly_refresh_indicator.dart similarity index 100% rename from packages/artifact/lib/src/views/toly_refresh_indicator.dart rename to packages/artifact/lib/src/articles/view/toly_refresh_indicator.dart diff --git a/packages/artifact/lib/src/views/wrapper/refresh.dart b/packages/artifact/lib/src/articles/view/wrapper/refresh.dart similarity index 100% rename from packages/artifact/lib/src/views/wrapper/refresh.dart rename to packages/artifact/lib/src/articles/view/wrapper/refresh.dart diff --git a/lib/point_system/blocs/point_bloc/point_bloc.dart b/packages/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart similarity index 90% rename from lib/point_system/blocs/point_bloc/point_bloc.dart rename to packages/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart index fd4d3281..685cf31a 100644 --- a/lib/point_system/blocs/point_bloc/point_bloc.dart +++ b/packages/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart @@ -1,7 +1,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; +import '../../data/api/issues_api.dart'; import 'point_event.dart'; import 'point_state.dart'; diff --git a/lib/point_system/blocs/point_bloc/point_event.dart b/packages/artifact/lib/src/points/bloc/point_bloc/point_event.dart similarity index 100% rename from lib/point_system/blocs/point_bloc/point_event.dart rename to packages/artifact/lib/src/points/bloc/point_bloc/point_event.dart diff --git a/lib/point_system/blocs/point_bloc/point_state.dart b/packages/artifact/lib/src/points/bloc/point_bloc/point_state.dart similarity index 88% rename from lib/point_system/blocs/point_bloc/point_state.dart rename to packages/artifact/lib/src/points/bloc/point_bloc/point_state.dart index 43b8dc9e..7e83db63 100644 --- a/lib/point_system/blocs/point_bloc/point_state.dart +++ b/packages/artifact/lib/src/points/bloc/point_bloc/point_state.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; + +import '../../data/model/issue.dart'; /// create by 张风捷特烈 on 2020/9/3 diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart similarity index 87% rename from lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart rename to packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart index 4977bf68..fa838be9 100644 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_bloc.dart +++ b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart @@ -1,10 +1,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import '../../data/api/issues_api.dart'; +import '../../data/model/github_model.dart'; import 'point_comment_event.dart'; import 'point_comment_state.dart'; diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_event.dart b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart similarity index 82% rename from lib/point_system/blocs/point_comment_bloc/point_comment_event.dart rename to packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart index 15da9ed5..8e7f8bea 100644 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_event.dart +++ b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart @@ -1,7 +1,7 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import '../../data/model/issue.dart'; /// create by 张风捷特烈 on 2020/9/3 /// contact me by email 1981462002@qq.com diff --git a/lib/point_system/blocs/point_comment_bloc/point_comment_state.dart b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart similarity index 91% rename from lib/point_system/blocs/point_comment_bloc/point_comment_state.dart rename to packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart index 1b53df4e..dfd73f6a 100644 --- a/lib/point_system/blocs/point_comment_bloc/point_comment_state.dart +++ b/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart @@ -1,5 +1,7 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; + +import '../../data/model/github_model.dart'; +import '../../data/model/issue.dart'; /// create by 张风捷特烈 on 2020/9/3 diff --git a/lib/point_system/blocs/point_system_bloc.dart b/packages/artifact/lib/src/points/bloc/point_system_bloc.dart similarity index 100% rename from lib/point_system/blocs/point_system_bloc.dart rename to packages/artifact/lib/src/points/bloc/point_system_bloc.dart diff --git a/lib/point_system/api/app_info.dart b/packages/artifact/lib/src/points/data/api/app_info.dart similarity index 100% rename from lib/point_system/api/app_info.dart rename to packages/artifact/lib/src/points/data/api/app_info.dart diff --git a/lib/point_system/api/category_api.dart b/packages/artifact/lib/src/points/data/api/category_api.dart similarity index 100% rename from lib/point_system/api/category_api.dart rename to packages/artifact/lib/src/points/data/api/category_api.dart diff --git a/lib/point_system/api/issues_api.dart b/packages/artifact/lib/src/points/data/api/issues_api.dart similarity index 91% rename from lib/point_system/api/issues_api.dart rename to packages/artifact/lib/src/points/data/api/issues_api.dart index 86f51578..4162dc92 100644 --- a/lib/point_system/api/issues_api.dart +++ b/packages/artifact/lib/src/points/data/api/issues_api.dart @@ -1,7 +1,10 @@ import 'dart:convert'; import 'package:dio/dio.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; + +import '../model/github_model.dart'; +import '../model/issue.dart'; +import '../model/repository.dart'; /// create by 张风捷特烈 on 2020/6/17 diff --git a/lib/point_system/github_model/github_model.dart b/packages/artifact/lib/src/points/data/model/github_model.dart similarity index 100% rename from lib/point_system/github_model/github_model.dart rename to packages/artifact/lib/src/points/data/model/github_model.dart diff --git a/lib/point_system/github_model/github_user.dart b/packages/artifact/lib/src/points/data/model/github_user.dart similarity index 100% rename from lib/point_system/github_model/github_user.dart rename to packages/artifact/lib/src/points/data/model/github_user.dart diff --git a/lib/point_system/github_model/issue.dart b/packages/artifact/lib/src/points/data/model/issue.dart similarity index 100% rename from lib/point_system/github_model/issue.dart rename to packages/artifact/lib/src/points/data/model/issue.dart diff --git a/lib/point_system/github_model/issue_comment.dart b/packages/artifact/lib/src/points/data/model/issue_comment.dart similarity index 100% rename from lib/point_system/github_model/issue_comment.dart rename to packages/artifact/lib/src/points/data/model/issue_comment.dart diff --git a/lib/point_system/github_model/license.dart b/packages/artifact/lib/src/points/data/model/license.dart similarity index 100% rename from lib/point_system/github_model/license.dart rename to packages/artifact/lib/src/points/data/model/license.dart diff --git a/lib/point_system/github_model/repository.dart b/packages/artifact/lib/src/points/data/model/repository.dart similarity index 100% rename from lib/point_system/github_model/repository.dart rename to packages/artifact/lib/src/points/data/model/repository.dart diff --git a/lib/point_system/github_model/repository_permissions.dart b/packages/artifact/lib/src/points/data/model/repository_permissions.dart similarity index 100% rename from lib/point_system/github_model/repository_permissions.dart rename to packages/artifact/lib/src/points/data/model/repository_permissions.dart diff --git a/packages/artifact/lib/src/points/exp.dart b/packages/artifact/lib/src/points/exp.dart new file mode 100644 index 00000000..720d052f --- /dev/null +++ b/packages/artifact/lib/src/points/exp.dart @@ -0,0 +1,8 @@ +export 'data/api/category_api.dart'; + +export 'view/desk_ui/desk_point_page.dart'; +export 'view/desk_ui/github_repo_panel.dart'; +export 'view/issues_point/issues_point_page.dart'; +export 'view/issues_point/issues_detail.dart'; + +export 'bloc/point_system_bloc.dart'; \ No newline at end of file diff --git a/lib/point_system/views/desk_ui/desk_point_page.dart b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart similarity index 90% rename from lib/point_system/views/desk_ui/desk_point_page.dart rename to packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart index 18cd6ad6..a7dbaae4 100644 --- a/lib/point_system/views/desk_ui/desk_point_page.dart +++ b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -2,13 +2,12 @@ import 'package:app/app.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../blocs/point_bloc/point_bloc.dart'; -import '../../blocs/point_bloc/point_event.dart'; -import '../../github_model/repository.dart'; -import '../../views/issues_point/issues_point_page.dart'; +import '../../bloc/point_bloc/point_bloc.dart'; +import '../../bloc/point_system_bloc.dart'; +import '../../data/model/repository.dart'; +import '../issues_point/issues_point_page.dart'; import 'github_repo_panel.dart'; class DeskPointPage extends StatefulWidget { @@ -25,7 +24,7 @@ class _DeskPointPageState extends State { 'license': {"spdx_id": 'GPL-3.0'}, 'description': '【Flutter 集录指南 App】The unity of flutter, The unity of coder.', - 'stargazers_count': 6261, + 'stargazers_count': 7958, 'forks_count': 1039, 'subscribers_count': 126, 'open_issues_count': 40, @@ -126,12 +125,14 @@ class SimpleDeskTopBar extends StatelessWidget { return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: height, color: isDark? Color(0xff2C3036):Colors.white, child: Row( children: [ - if (leading != null) leading!, + if (leading != null) Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), const Spacer(), const SizedBox( width: 20, @@ -144,3 +145,5 @@ class SimpleDeskTopBar extends StatelessWidget { ); } } + + diff --git a/lib/point_system/views/desk_ui/github_repo_panel.dart b/packages/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart similarity index 98% rename from lib/point_system/views/desk_ui/github_repo_panel.dart rename to packages/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart index c6597c9f..910586e1 100644 --- a/lib/point_system/views/desk_ui/github_repo_panel.dart +++ b/packages/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart @@ -1,8 +1,9 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import '../../github_model/repository.dart'; +import '../../data/model/repository.dart'; + class GithubRepoPanel extends StatefulWidget { final Repository repository; diff --git a/lib/point_system/views/issues_point/issue_item.dart b/packages/artifact/lib/src/points/view/issues_point/issue_item.dart similarity index 93% rename from lib/point_system/views/issues_point/issue_item.dart rename to packages/artifact/lib/src/points/view/issues_point/issue_item.dart index fc097c5e..fa3a8e53 100644 --- a/lib/point_system/views/issues_point/issue_item.dart +++ b/packages/artifact/lib/src/points/view/issues_point/issue_item.dart @@ -1,11 +1,11 @@ import 'dart:ui'; import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import 'package:utils/utils.dart'; +import '../../data/model/issue.dart'; /// create by 张风捷特烈 on 2020/9/3 diff --git a/lib/point_system/views/issues_point/issues_detail.dart b/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart similarity index 95% rename from lib/point_system/views/issues_point/issues_detail.dart rename to packages/artifact/lib/src/points/view/issues_point/issues_detail.dart index dd5d24c4..9f7e2e1b 100644 --- a/lib/point_system/views/issues_point/issues_detail.dart +++ b/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart @@ -1,10 +1,12 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import 'package:utils/utils.dart'; + +import '../../bloc/point_system_bloc.dart'; +import '../../data/model/github_model.dart'; +import '../../data/model/issue.dart'; /// create by 张风捷特烈 on 2020/9/3 /// contact me by email 1981462002@qq.com diff --git a/lib/point_system/views/issues_point/issues_point_page.dart b/packages/artifact/lib/src/points/view/issues_point/issues_point_page.dart similarity index 91% rename from lib/point_system/views/issues_point/issues_point_page.dart rename to packages/artifact/lib/src/points/view/issues_point/issues_point_page.dart index 44b9ad03..ec3b39c5 100644 --- a/lib/point_system/views/issues_point/issues_point_page.dart +++ b/packages/artifact/lib/src/points/view/issues_point/issues_point_page.dart @@ -3,10 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:flutter_unit/point_system/api/issues_api.dart'; -import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import '../../bloc/point_system_bloc.dart'; +import '../../data/api/issues_api.dart'; +import '../../data/model/issue.dart'; +import '../../data/model/repository.dart'; import 'issue_item.dart'; import 'issues_detail.dart'; import 'repo_widget.dart'; @@ -126,7 +127,7 @@ class _IssuesPointContentState extends State { color: Colors.white, ), onPressed: () { - Navigator.of(context).pushNamed(UnitRouter.bug); + // Navigator.of(context).pushNamed(UnitRouter.bug); }) ], backgroundColor: Colors.blue, @@ -153,11 +154,9 @@ class _IssuesPointContentState extends State { } void _loadRepo() async { - final Repository? result = await IssuesApi.getRepoFlutterUnit(); + final Repository result = await IssuesApi.getRepoFlutterUnit(); setState(() { - if (result != null) { - _repository = result; - } + _repository = result; }); } } diff --git a/lib/point_system/views/issues_point/repo_widget.dart b/packages/artifact/lib/src/points/view/issues_point/repo_widget.dart similarity index 93% rename from lib/point_system/views/issues_point/repo_widget.dart rename to packages/artifact/lib/src/points/view/issues_point/repo_widget.dart index 57a45820..36849e1b 100644 --- a/lib/point_system/views/issues_point/repo_widget.dart +++ b/packages/artifact/lib/src/points/view/issues_point/repo_widget.dart @@ -1,9 +1,9 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/point_system/github_model/github_model.dart'; +import 'package:utils/utils.dart'; +import '../../data/model/repository.dart'; /// create by 张风捷特烈 on 2020/9/3 /// contact me by email 1981462002@qq.com @@ -52,8 +52,7 @@ class RepoWidget extends StatelessWidget { ), const Spacer(), Text( - "创建:" + - ConvertMan.time2string(repository.createdAt!, just: true), + "创建:${ConvertMan.time2string(repository.createdAt!, just: true)}", style: const TextStyle(color: Colors.grey), ), ], diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 8eb6bd8b..7da8a2d5 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -23,6 +23,8 @@ dependencies: path: ../utils app: path: ../app + toly_ui: + path: ../toly_ui dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/authentication/lib/views/mobile/login/login_form.dart b/packages/authentication/lib/views/mobile/login/login_form.dart index cb562d70..372f8f4e 100644 --- a/packages/authentication/lib/views/mobile/login/login_form.dart +++ b/packages/authentication/lib/views/mobile/login/login_form.dart @@ -2,7 +2,7 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; import '../../../authentication.dart'; @@ -67,7 +67,7 @@ class _LoginFromState extends State { ), GestureDetector( onTap: () { - Navigator.of(context).pushReplacementNamed(UnitRouter.register); + // Navigator.of(context).pushReplacementNamed(UnitRouter.register); }, child: Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), diff --git a/packages/authentication/lib/views/mobile/register/arc_clipper.dart b/packages/authentication/lib/views/mobile/register/arc_clipper.dart index c6ee159a..3f1a6689 100644 --- a/packages/authentication/lib/views/mobile/register/arc_clipper.dart +++ b/packages/authentication/lib/views/mobile/register/arc_clipper.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; diff --git a/packages/authentication/lib/views/mobile/register/register_page.dart b/packages/authentication/lib/views/mobile/register/register_page.dart index a88e93aa..a4210538 100644 --- a/packages/authentication/lib/views/mobile/register/register_page.dart +++ b/packages/authentication/lib/views/mobile/register/register_page.dart @@ -1,5 +1,5 @@ import 'package:authentication/authentication.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:utils/utils.dart'; diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 5a8100e6..88b0ee58 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:app_update/views/update_red_point.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com @@ -26,13 +27,13 @@ class MePageItem extends StatelessWidget { height: 10, ), Gap.sfl10, - _buildItem(context, TolyIcon.icon_them, '应用设置', UnitRouter.setting), + _buildItem(context, TolyIcon.icon_them, '应用设置', '/settings'), const Divider(), _buildItem( - context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), + context, TolyIcon.icon_layout, '数据管理', '/data_manage'), const Divider(), _buildItem( - context, TolyIcon.icon_collect, '我的收藏', UnitRouter.collect,), + context, TolyIcon.icon_collect, '我的收藏', '/collect',), Gap.sfl10, Stack( @@ -41,16 +42,16 @@ class MePageItem extends StatelessWidget { context, Icons.update, '版本信息', - UnitRouter.version_info, + '/settings/version', ), const Positioned(left: 40, top: 10, child: UpdateRedPoint()) ], ), const Divider(), - _buildItem(context, Icons.info, '关于应用', UnitRouter.about_app), + _buildItem(context, Icons.info, '关于应用', '/about_app'), Gap.sfl10, - _buildItem(context, TolyIcon.icon_kafei, '联系本王', UnitRouter.about_me), + _buildItem(context, TolyIcon.icon_kafei, '联系本王', '/about_me'), ], ), ); @@ -69,11 +70,7 @@ class MePageItem extends StatelessWidget { Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), onTap: () { if (linkTo.isNotEmpty) { - Object? arg ; - if(linkTo==UnitRouter.collect){ - arg = true; - } - Navigator.of(context).pushNamed(linkTo,arguments: arg); + context.push(linkTo); if (onTap != null) onTap(); } }, diff --git a/packages/authentication/lib/views/mobile/user/user_account.dart b/packages/authentication/lib/views/mobile/user/user_account.dart index 1ec02176..35eaa599 100644 --- a/packages/authentication/lib/views/mobile/user/user_account.dart +++ b/packages/authentication/lib/views/mobile/user/user_account.dart @@ -3,7 +3,7 @@ import 'dart:ui'; import 'package:authentication/blocs/authentic/bloc.dart'; import 'package:authentication/blocs/user/bloc.dart'; -import 'package:components/components.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/packages/authentication/lib/views/mobile/user/user_page.dart index 66fde923..6cbe82fc 100644 --- a/packages/authentication/lib/views/mobile/user/user_page.dart +++ b/packages/authentication/lib/views/mobile/user/user_page.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import '../../../authentication.dart'; diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index c5541982..f629bd91 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: flutter_bloc: ^8.1.3 # 状态管理 equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.1 # xml 固化 + go_router: ^12.1.1 utils: path: ../utils app_update: @@ -21,6 +22,8 @@ dependencies: path: ../app components: path: ../components + toly_ui: + path: ../toly_ui dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/widget_repository/.gitignore b/packages/awesome/.gitignore similarity index 98% rename from packages/widget_repository/.gitignore rename to packages/awesome/.gitignore index 96486fd9..ac5aa989 100644 --- a/packages/widget_repository/.gitignore +++ b/packages/awesome/.gitignore @@ -26,5 +26,4 @@ migrate_working_dir/ /pubspec.lock **/doc/api/ .dart_tool/ -.packages build/ diff --git a/packages/widget_repository/.metadata b/packages/awesome/.metadata similarity index 76% rename from packages/widget_repository/.metadata rename to packages/awesome/.metadata index 6c08927e..fe59252b 100644 --- a/packages/widget_repository/.metadata +++ b/packages/awesome/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 - channel: stable + revision: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" project_type: package diff --git a/packages/widget_repository/CHANGELOG.md b/packages/awesome/CHANGELOG.md similarity index 100% rename from packages/widget_repository/CHANGELOG.md rename to packages/awesome/CHANGELOG.md diff --git a/packages/widget_repository/LICENSE b/packages/awesome/LICENSE similarity index 100% rename from packages/widget_repository/LICENSE rename to packages/awesome/LICENSE diff --git a/packages/widget_repository/README.md b/packages/awesome/README.md similarity index 100% rename from packages/widget_repository/README.md rename to packages/awesome/README.md diff --git a/packages/widget_repository/analysis_options.yaml b/packages/awesome/analysis_options.yaml similarity index 100% rename from packages/widget_repository/analysis_options.yaml rename to packages/awesome/analysis_options.yaml diff --git a/packages/awesome/lib/awesome.dart b/packages/awesome/lib/awesome.dart new file mode 100644 index 00000000..d19ac097 --- /dev/null +++ b/packages/awesome/lib/awesome.dart @@ -0,0 +1,7 @@ +library awesome; + +/// A Calculator. +class Calculator { + /// Returns [value] plus 1. + int addOne(int value) => value + 1; +} diff --git a/lib/awesome/listenable/change_notifier_01/main.dart b/packages/awesome/lib/listenable/change_notifier_01/main.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/main.dart rename to packages/awesome/lib/listenable/change_notifier_01/main.dart diff --git a/lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart b/packages/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/notifier/progress_value_notifier.dart rename to packages/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart diff --git a/lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart b/packages/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/page/detail/detail_progress_view.dart rename to packages/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart diff --git a/lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart b/packages/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/page/detail/download_detail.dart rename to packages/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart diff --git a/lib/awesome/listenable/change_notifier_01/page/home/home_page.dart b/packages/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/page/home/home_page.dart rename to packages/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart diff --git a/lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart b/packages/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_01/page/home/home_progress_view.dart rename to packages/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart diff --git a/lib/awesome/listenable/change_notifier_02/main.dart b/packages/awesome/lib/listenable/change_notifier_02/main.dart similarity index 81% rename from lib/awesome/listenable/change_notifier_02/main.dart rename to packages/awesome/lib/listenable/change_notifier_02/main.dart index 3d04b86e..5b807aa8 100644 --- a/lib/awesome/listenable/change_notifier_02/main.dart +++ b/packages/awesome/lib/listenable/change_notifier_02/main.dart @@ -1,16 +1,10 @@ -import 'package:app/app.dart'; + import 'package:flutter/material.dart'; import 'notifier/download_data_scope.dart'; import 'notifier/progress_value_notifier.dart'; import 'page/home/home_page.dart'; -void main(){ - WidgetsFlutterBinding.ensureInitialized(); - runApp(const MyApp()); - WindowsAdapter.setSize(); -} - class MyApp extends StatelessWidget{ const MyApp({super.key}); diff --git a/lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart b/packages/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart rename to packages/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart diff --git a/lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart b/packages/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_02/notifier/progress_value_notifier.dart rename to packages/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart diff --git a/lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart b/packages/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_02/page/detail/detail_progress_view.dart rename to packages/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart diff --git a/lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart b/packages/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_02/page/detail/download_detail.dart rename to packages/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart diff --git a/lib/awesome/listenable/change_notifier_02/page/home/home_page.dart b/packages/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart similarity index 100% rename from lib/awesome/listenable/change_notifier_02/page/home/home_page.dart rename to packages/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart diff --git a/lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart b/packages/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart similarity index 86% rename from lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart rename to packages/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart index b5a3d1d0..96d73da5 100644 --- a/lib/awesome/listenable/change_notifier_02/page/home/home_progress_view.dart +++ b/packages/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/awesome/listenable/change_notifier_02/notifier/download_data_scope.dart'; +import '../../notifier/download_data_scope.dart'; import '../../notifier/progress_value_notifier.dart'; class HomeProgressView extends StatelessWidget{ diff --git a/packages/widget_repository/pubspec.yaml b/packages/awesome/pubspec.yaml similarity index 88% rename from packages/widget_repository/pubspec.yaml rename to packages/awesome/pubspec.yaml index 16ad71a1..36a20d16 100644 --- a/packages/widget_repository/pubspec.yaml +++ b/packages/awesome/pubspec.yaml @@ -1,22 +1,15 @@ -name: widget_repository -description: A new Flutter project. +name: awesome +description: "A new Flutter package project." version: 0.0.1 -publish_to: none homepage: environment: - sdk: '>=2.18.1 <3.0.0' + sdk: '>=3.2.3 <4.0.0' flutter: ">=1.17.0" dependencies: flutter: sdk: flutter - equatable: ^2.0.5 - intl: ^0.18.0 - utils: - path: ../utils - storage: - path: ../storage dev_dependencies: flutter_test: diff --git a/packages/awesome/test/awesome_test.dart b/packages/awesome/test/awesome_test.dart new file mode 100644 index 00000000..40896d37 --- /dev/null +++ b/packages/awesome/test/awesome_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:awesome/awesome.dart'; + +void main() { + test('adds one to input values', () { + final calculator = Calculator(); + expect(calculator.addOne(2), 3); + expect(calculator.addOne(-7), -6); + expect(calculator.addOne(0), 1); + }); +} diff --git a/packages/components/lib/components.dart b/packages/components/lib/components.dart index 5fba8b54..6cf8fda4 100644 --- a/packages/components/lib/components.dart +++ b/packages/components/lib/components.dart @@ -1,5 +1,4 @@ library components; export 'flutter_ui/flutter_ui.dart'; -export 'project_ui/project_ui.dart'; -export 'toly_ui/toly_ui.dart'; \ No newline at end of file +export 'project_ui/project_ui.dart'; \ No newline at end of file diff --git a/packages/components/lib/project_ui/project_ui.dart b/packages/components/lib/project_ui/project_ui.dart index 6d54f3de..64baa704 100644 --- a/packages/components/lib/project_ui/project_ui.dart +++ b/packages/components/lib/project_ui/project_ui.dart @@ -5,4 +5,6 @@ export 'default/loading_shower.dart'; export 'default/error_page.dart'; export 'default/no_more_widget.dart'; export 'wrapper/honour_wrapper.dart'; -export 'unit_app_bar.dart'; \ No newline at end of file +export 'unit_app_bar.dart'; +export 'top_bar/desk_simple_top_bar.dart'; +export 'top_bar/desk_tab_top_bar.dart'; \ No newline at end of file diff --git a/lib/components/top_bar/desk_simple_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart similarity index 78% rename from lib/components/top_bar/desk_simple_top_bar.dart rename to packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart index 0cd3080b..e1c074df 100644 --- a/lib/components/top_bar/desk_simple_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart @@ -10,12 +10,14 @@ class SimpleDeskTopBar extends StatelessWidget { Widget build(BuildContext context) { return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, color: Colors.white, child: Row( children: [ - if (leading != null) leading!, + if (leading != null) Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), const Spacer(), const SizedBox( width: 20, diff --git a/lib/components/top_bar/desk_tab_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart similarity index 95% rename from lib/components/top_bar/desk_tab_top_bar.dart rename to packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart index 3b798c15..6e5aed5d 100644 --- a/lib/components/top_bar/desk_tab_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; @@ -40,7 +40,6 @@ class _DeskTabTopBarState extends State with TickerProviderState return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, color: isDark?Color(0xff2C3036):Colors.white, child: Row( diff --git a/packages/components/pubspec.yaml b/packages/components/pubspec.yaml index e6a0f611..ccd43218 100644 --- a/packages/components/pubspec.yaml +++ b/packages/components/pubspec.yaml @@ -12,6 +12,10 @@ dependencies: sdk: flutter flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.6.4 # markdown + toly_ui: + path: ../toly_ui + app: + path: ../app dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/draw_system/.gitignore b/packages/draw_system/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/draw_system/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/draw_system/.metadata b/packages/draw_system/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/packages/draw_system/.metadata @@ -0,0 +1,10 @@ +# 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: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/packages/draw_system/CHANGELOG.md b/packages/draw_system/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/draw_system/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/draw_system/LICENSE b/packages/draw_system/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/draw_system/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/draw_system/README.md b/packages/draw_system/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/draw_system/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/draw_system/analysis_options.yaml b/packages/draw_system/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/draw_system/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/draw_system/lib/draw_system.dart b/packages/draw_system/lib/draw_system.dart new file mode 100644 index 00000000..ca066748 --- /dev/null +++ b/packages/draw_system/lib/draw_system.dart @@ -0,0 +1,6 @@ +library draw_system; + + +export 'src/gallery_detail_page.dart'; +export 'src/gallery_unit.dart'; +export 'src/bloc/gallery_unit/bloc.dart'; \ No newline at end of file diff --git a/lib/painter_system/anim/bezier3_player/bezier3_palyer.dart b/packages/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart similarity index 100% rename from lib/painter_system/anim/bezier3_player/bezier3_palyer.dart rename to packages/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart diff --git a/lib/painter_system/anim/bezier3_player/touch_info.dart b/packages/draw_system/lib/src/anim/bezier3_player/touch_info.dart similarity index 100% rename from lib/painter_system/anim/bezier3_player/touch_info.dart rename to packages/draw_system/lib/src/anim/bezier3_player/touch_info.dart diff --git a/lib/painter_system/anim/circle_halo.dart b/packages/draw_system/lib/src/anim/circle_halo.dart similarity index 100% rename from lib/painter_system/anim/circle_halo.dart rename to packages/draw_system/lib/src/anim/circle_halo.dart diff --git a/lib/painter_system/anim/curve_shower/anim_painter.dart b/packages/draw_system/lib/src/anim/curve_shower/anim_painter.dart similarity index 100% rename from lib/painter_system/anim/curve_shower/anim_painter.dart rename to packages/draw_system/lib/src/anim/curve_shower/anim_painter.dart diff --git a/lib/painter_system/anim/curve_shower/curve_anim_shower.dart b/packages/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart similarity index 98% rename from lib/painter_system/anim/curve_shower/curve_anim_shower.dart rename to packages/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart index bf37e495..b45b72b9 100644 --- a/lib/painter_system/anim/curve_shower/curve_anim_shower.dart +++ b/packages/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart @@ -1,4 +1,4 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'anim_painter.dart'; diff --git a/lib/painter_system/anim/curve_shower/point_data.dart b/packages/draw_system/lib/src/anim/curve_shower/point_data.dart similarity index 100% rename from lib/painter_system/anim/curve_shower/point_data.dart rename to packages/draw_system/lib/src/anim/curve_shower/point_data.dart diff --git a/lib/painter_system/anim/draw_path.dart b/packages/draw_system/lib/src/anim/draw_path.dart similarity index 100% rename from lib/painter_system/anim/draw_path.dart rename to packages/draw_system/lib/src/anim/draw_path.dart diff --git a/lib/painter_system/anim/dundun_path.dart b/packages/draw_system/lib/src/anim/dundun_path.dart similarity index 100% rename from lib/painter_system/anim/dundun_path.dart rename to packages/draw_system/lib/src/anim/dundun_path.dart diff --git a/lib/painter_system/anim/rotate_by_point/angle_panter.dart b/packages/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/angle_panter.dart rename to packages/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart diff --git a/lib/painter_system/anim/rotate_by_point/line.dart b/packages/draw_system/lib/src/anim/rotate_by_point/line.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/line.dart rename to packages/draw_system/lib/src/anim/rotate_by_point/line.dart diff --git a/lib/painter_system/anim/rotate_by_point/rotate_by_point.dart b/packages/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart similarity index 100% rename from lib/painter_system/anim/rotate_by_point/rotate_by_point.dart rename to packages/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart diff --git a/lib/painter_system/anim/spring_widget.dart b/packages/draw_system/lib/src/anim/spring_widget.dart similarity index 100% rename from lib/painter_system/anim/spring_widget.dart rename to packages/draw_system/lib/src/anim/spring_widget.dart diff --git a/lib/painter_system/art/circle_packing.dart b/packages/draw_system/lib/src/art/circle_packing.dart similarity index 100% rename from lib/painter_system/art/circle_packing.dart rename to packages/draw_system/lib/src/art/circle_packing.dart diff --git a/lib/painter_system/art/cubic_disarray.dart b/packages/draw_system/lib/src/art/cubic_disarray.dart similarity index 100% rename from lib/painter_system/art/cubic_disarray.dart rename to packages/draw_system/lib/src/art/cubic_disarray.dart diff --git a/lib/painter_system/art/hypnotic_squares.dart b/packages/draw_system/lib/src/art/hypnotic_squares.dart similarity index 100% rename from lib/painter_system/art/hypnotic_squares.dart rename to packages/draw_system/lib/src/art/hypnotic_squares.dart diff --git a/lib/painter_system/art/joy_division.dart b/packages/draw_system/lib/src/art/joy_division.dart similarity index 100% rename from lib/painter_system/art/joy_division.dart rename to packages/draw_system/lib/src/art/joy_division.dart diff --git a/lib/painter_system/art/piet_mondrian.dart b/packages/draw_system/lib/src/art/piet_mondrian.dart similarity index 100% rename from lib/painter_system/art/piet_mondrian.dart rename to packages/draw_system/lib/src/art/piet_mondrian.dart diff --git a/lib/painter_system/art/tiled_lines.dart b/packages/draw_system/lib/src/art/tiled_lines.dart similarity index 100% rename from lib/painter_system/art/tiled_lines.dart rename to packages/draw_system/lib/src/art/tiled_lines.dart diff --git a/lib/painter_system/art/triangular_mesh.dart b/packages/draw_system/lib/src/art/triangular_mesh.dart similarity index 100% rename from lib/painter_system/art/triangular_mesh.dart rename to packages/draw_system/lib/src/art/triangular_mesh.dart diff --git a/lib/painter_system/art/un_deux_trois.dart b/packages/draw_system/lib/src/art/un_deux_trois.dart similarity index 100% rename from lib/painter_system/art/un_deux_trois.dart rename to packages/draw_system/lib/src/art/un_deux_trois.dart diff --git a/lib/painter_system/base/clock_widget.dart b/packages/draw_system/lib/src/base/clock_widget.dart similarity index 100% rename from lib/painter_system/base/clock_widget.dart rename to packages/draw_system/lib/src/base/clock_widget.dart diff --git a/lib/painter_system/base/digital/digital_painter.dart b/packages/draw_system/lib/src/base/digital/digital_painter.dart similarity index 100% rename from lib/painter_system/base/digital/digital_painter.dart rename to packages/draw_system/lib/src/base/digital/digital_painter.dart diff --git a/lib/painter_system/base/digital/digital_path.dart b/packages/draw_system/lib/src/base/digital/digital_path.dart similarity index 100% rename from lib/painter_system/base/digital/digital_path.dart rename to packages/draw_system/lib/src/base/digital/digital_path.dart diff --git a/lib/painter_system/base/digital/digital_shower.dart b/packages/draw_system/lib/src/base/digital/digital_shower.dart similarity index 100% rename from lib/painter_system/base/digital/digital_shower.dart rename to packages/draw_system/lib/src/base/digital/digital_shower.dart diff --git a/lib/painter_system/base/digital/digital_widget.dart b/packages/draw_system/lib/src/base/digital/digital_widget.dart similarity index 100% rename from lib/painter_system/base/digital/digital_widget.dart rename to packages/draw_system/lib/src/base/digital/digital_widget.dart diff --git a/lib/painter_system/base/draw_grid_axis.dart b/packages/draw_system/lib/src/base/draw_grid_axis.dart similarity index 100% rename from lib/painter_system/base/draw_grid_axis.dart rename to packages/draw_system/lib/src/base/draw_grid_axis.dart diff --git a/lib/painter_system/base/draw_path_fun.dart b/packages/draw_system/lib/src/base/draw_path_fun.dart similarity index 100% rename from lib/painter_system/base/draw_path_fun.dart rename to packages/draw_system/lib/src/base/draw_path_fun.dart diff --git a/lib/painter_system/base/draw_picture.dart b/packages/draw_system/lib/src/base/draw_picture.dart similarity index 100% rename from lib/painter_system/base/draw_picture.dart rename to packages/draw_system/lib/src/base/draw_picture.dart diff --git a/lib/painter_system/base/n_side/n_side_page.dart b/packages/draw_system/lib/src/base/n_side/n_side_page.dart similarity index 100% rename from lib/painter_system/base/n_side/n_side_page.dart rename to packages/draw_system/lib/src/base/n_side/n_side_page.dart diff --git a/lib/painter_system/base/n_side/shape_painter.dart b/packages/draw_system/lib/src/base/n_side/shape_painter.dart similarity index 100% rename from lib/painter_system/base/n_side/shape_painter.dart rename to packages/draw_system/lib/src/base/n_side/shape_painter.dart diff --git a/lib/painter_system/base/polar/angle_painter.dart b/packages/draw_system/lib/src/base/polar/angle_painter.dart similarity index 100% rename from lib/painter_system/base/polar/angle_painter.dart rename to packages/draw_system/lib/src/base/polar/angle_painter.dart diff --git a/lib/painter_system/base/polar/polar.dart b/packages/draw_system/lib/src/base/polar/polar.dart similarity index 100% rename from lib/painter_system/base/polar/polar.dart rename to packages/draw_system/lib/src/base/polar/polar.dart diff --git a/lib/painter_system/base/polar/polar_painter_widget.dart b/packages/draw_system/lib/src/base/polar/polar_painter_widget.dart similarity index 100% rename from lib/painter_system/base/polar/polar_painter_widget.dart rename to packages/draw_system/lib/src/base/polar/polar_painter_widget.dart diff --git a/lib/painter_system/base/windmill.dart b/packages/draw_system/lib/src/base/windmill.dart similarity index 100% rename from lib/painter_system/base/windmill.dart rename to packages/draw_system/lib/src/base/windmill.dart diff --git a/lib/painter_system/bloc/gallery_unit/bloc.dart b/packages/draw_system/lib/src/bloc/gallery_unit/bloc.dart similarity index 100% rename from lib/painter_system/bloc/gallery_unit/bloc.dart rename to packages/draw_system/lib/src/bloc/gallery_unit/bloc.dart diff --git a/lib/painter_system/desk_ui/desk_frame.dart b/packages/draw_system/lib/src/desk_ui/desk_frame.dart similarity index 94% rename from lib/painter_system/desk_ui/desk_frame.dart rename to packages/draw_system/lib/src/desk_ui/desk_frame.dart index 6edbc0c9..06508c9f 100644 --- a/lib/painter_system/desk_ui/desk_frame.dart +++ b/packages/draw_system/lib/src/desk_ui/desk_frame.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter_unit/painter_system/picture_frame.dart'; +import '../picture_frame.dart'; /// create by 张风捷特烈 on 2020/12/4 diff --git a/lib/painter_system/desk_ui/desk_gallery_unit.dart b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart similarity index 83% rename from lib/painter_system/desk_ui/desk_gallery_unit.dart rename to packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart index 441f92b7..d720c203 100644 --- a/lib/painter_system/desk_ui/desk_gallery_unit.dart +++ b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart @@ -1,15 +1,14 @@ import 'dart:convert'; import 'package:app/app.dart'; +import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; +import 'package:toly_ui/toly_ui.dart'; -import '../../point_system/views/desk_ui/desk_point_page.dart'; +import '../gallery_card_item.dart'; import '../gallery_detail_page.dart'; +import '../gallery_factory.dart'; /// create by 张风捷特烈 on 2020/11/28 /// contact me by email 1981462002@qq.com @@ -86,16 +85,16 @@ class _DeskGalleryUnitState extends State { SliverGridDelegate gridDelegate = const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 460, - mainAxisSpacing: 10, - mainAxisExtent: 360, - crossAxisSpacing: 10, + maxCrossAxisExtent: 320, + mainAxisSpacing: 8, + mainAxisExtent: 340, + crossAxisSpacing: 8, ); return GridView.builder( controller: controller, gridDelegate: gridDelegate, - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(12), itemCount: widgets.length, itemBuilder: (ctx, index) => widgets[index]); } diff --git a/lib/painter_system/fun/bufeng/bufeng_panel.dart b/packages/draw_system/lib/src/fun/bufeng/bufeng_panel.dart similarity index 100% rename from lib/painter_system/fun/bufeng/bufeng_panel.dart rename to packages/draw_system/lib/src/fun/bufeng/bufeng_panel.dart diff --git a/lib/painter_system/fun/bufeng/config.dart b/packages/draw_system/lib/src/fun/bufeng/config.dart similarity index 100% rename from lib/painter_system/fun/bufeng/config.dart rename to packages/draw_system/lib/src/fun/bufeng/config.dart diff --git a/lib/painter_system/fun/bufeng/painter.dart b/packages/draw_system/lib/src/fun/bufeng/painter.dart similarity index 100% rename from lib/painter_system/fun/bufeng/painter.dart rename to packages/draw_system/lib/src/fun/bufeng/painter.dart diff --git a/lib/painter_system/fun/dundun_view.dart b/packages/draw_system/lib/src/fun/dundun_view.dart similarity index 100% rename from lib/painter_system/fun/dundun_view.dart rename to packages/draw_system/lib/src/fun/dundun_view.dart diff --git a/lib/painter_system/fun/random_portrait.dart b/packages/draw_system/lib/src/fun/random_portrait.dart similarity index 100% rename from lib/painter_system/fun/random_portrait.dart rename to packages/draw_system/lib/src/fun/random_portrait.dart diff --git a/lib/painter_system/fun/stemp/stamp_data.dart b/packages/draw_system/lib/src/fun/stemp/stamp_data.dart similarity index 100% rename from lib/painter_system/fun/stemp/stamp_data.dart rename to packages/draw_system/lib/src/fun/stemp/stamp_data.dart diff --git a/lib/painter_system/fun/stemp/stamp_paper.dart b/packages/draw_system/lib/src/fun/stemp/stamp_paper.dart similarity index 100% rename from lib/painter_system/fun/stemp/stamp_paper.dart rename to packages/draw_system/lib/src/fun/stemp/stamp_paper.dart diff --git a/lib/painter_system/gallery_card_item.dart b/packages/draw_system/lib/src/gallery_card_item.dart similarity index 85% rename from lib/painter_system/gallery_card_item.dart rename to packages/draw_system/lib/src/gallery_card_item.dart index f87d13ca..131df6e7 100644 --- a/lib/painter_system/gallery_card_item.dart +++ b/packages/draw_system/lib/src/gallery_card_item.dart @@ -1,7 +1,9 @@ -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'gallery_factory.dart'; + /// create by 张风捷特烈 on 2020/11/28 @@ -34,7 +36,7 @@ class GalleryCardItem extends StatelessWidget { Hero( tag: galleryInfo.name, child: Container( - height: 160, + height: 150, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.cover, @@ -49,13 +51,13 @@ class GalleryCardItem extends StatelessWidget { ), Padding( padding: const EdgeInsets.only( - top: 20, left: 15, right: 15, bottom: 10), + top: 8, left: 15, right: 15, bottom: 8), child: Row( children: [ Text( galleryInfo.name, style: TextStyle( - fontSize: 24, + fontSize: 20, fontWeight: FontWeight.bold, shadows: [ Shadow( @@ -81,10 +83,12 @@ class GalleryCardItem extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(left: 15, right: 15, top: 10), + padding: const EdgeInsets.only(left: 15, right: 15, top: 8), child: Text( galleryInfo.info, - style: TextStyle(color: isDark?Colors.white:Colors.grey, shadows: [ + style: TextStyle( + fontSize: 14, + color: isDark?Colors.white:Colors.grey, shadows: [ Shadow( color: Theme.of(context).primaryColor, offset: const Offset(.2, .2), @@ -103,6 +107,14 @@ class GalleryCardItem extends StatelessWidget { } } +const Map galleryTypeMap = { + GalleryType.base: "基础绘制", + GalleryType.fun: "趣味绘制", + GalleryType.particle: "粒子绘制", + GalleryType.anim: "动画手势", + GalleryType.art: "艺术画廊", +}; + class GalleryInfo { final int count; final String name; @@ -112,7 +124,7 @@ class GalleryInfo { GalleryType get type { GalleryType galleryType = GalleryType.base; - Convert.galleryTypeMap.forEach((key, value) { + galleryTypeMap.forEach((key, value) { if (value == name) { galleryType = key; } diff --git a/lib/painter_system/gallery_detail_page.dart b/packages/draw_system/lib/src/gallery_detail_page.dart similarity index 98% rename from lib/painter_system/gallery_detail_page.dart rename to packages/draw_system/lib/src/gallery_detail_page.dart index 56ab945b..b1881c8e 100644 --- a/lib/painter_system/gallery_detail_page.dart +++ b/packages/draw_system/lib/src/gallery_detail_page.dart @@ -2,9 +2,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; /// create by 张风捷特烈 on 2020/12/4 diff --git a/lib/painter_system/gallery_factory.dart b/packages/draw_system/lib/src/gallery_factory.dart similarity index 99% rename from lib/painter_system/gallery_factory.dart rename to packages/draw_system/lib/src/gallery_factory.dart index dbdddfcf..7ff348ba 100644 --- a/lib/painter_system/gallery_factory.dart +++ b/packages/draw_system/lib/src/gallery_factory.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/painter_system/anim/spring_widget.dart'; import 'anim/bezier3_player/bezier3_palyer.dart'; import 'anim/circle_halo.dart'; @@ -7,6 +6,7 @@ import 'anim/curve_shower/curve_anim_shower.dart'; import 'anim/draw_path.dart'; import 'anim/dundun_path.dart'; import 'anim/rotate_by_point/rotate_by_point.dart'; +import 'anim/spring_widget.dart'; import 'art/circle_packing.dart'; import 'art/cubic_disarray.dart'; import 'art/hypnotic_squares.dart'; diff --git a/lib/painter_system/gallery_unit.dart b/packages/draw_system/lib/src/gallery_unit.dart similarity index 96% rename from lib/painter_system/gallery_unit.dart rename to packages/draw_system/lib/src/gallery_unit.dart index c734f15a..ac807155 100644 --- a/lib/painter_system/gallery_unit.dart +++ b/packages/draw_system/lib/src/gallery_unit.dart @@ -4,14 +4,14 @@ import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; -import 'package:flutter_unit/painter_system/gallery_card_item.dart'; -import 'package:flutter_unit/painter_system/bloc/gallery_unit/bloc.dart'; -import 'package:flutter_unit/painter_system/gallery_factory.dart'; +import 'bloc/gallery_unit/bloc.dart'; import 'desk_ui/desk_gallery_unit.dart'; +import 'gallery_card_item.dart'; import 'gallery_detail_page.dart'; +import 'gallery_factory.dart'; /// create by 张风捷特烈 on 2020/11/28 /// contact me by email 1981462002@qq.com diff --git a/lib/painter_system/particle/out/clock_fx.dart b/packages/draw_system/lib/src/particle/out/clock_fx.dart similarity index 100% rename from lib/painter_system/particle/out/clock_fx.dart rename to packages/draw_system/lib/src/particle/out/clock_fx.dart diff --git a/lib/painter_system/particle/out/clock_widget.dart b/packages/draw_system/lib/src/particle/out/clock_widget.dart similarity index 100% rename from lib/painter_system/particle/out/clock_widget.dart rename to packages/draw_system/lib/src/particle/out/clock_widget.dart diff --git a/lib/painter_system/particle/out/particle.dart b/packages/draw_system/lib/src/particle/out/particle.dart similarity index 100% rename from lib/painter_system/particle/out/particle.dart rename to packages/draw_system/lib/src/particle/out/particle.dart diff --git a/lib/painter_system/particle/out/rnd.dart b/packages/draw_system/lib/src/particle/out/rnd.dart similarity index 100% rename from lib/painter_system/particle/out/rnd.dart rename to packages/draw_system/lib/src/particle/out/rnd.dart diff --git a/lib/painter_system/particle/random/particle.dart b/packages/draw_system/lib/src/particle/random/particle.dart similarity index 100% rename from lib/painter_system/particle/random/particle.dart rename to packages/draw_system/lib/src/particle/random/particle.dart diff --git a/lib/painter_system/particle/random/particle_manage.dart b/packages/draw_system/lib/src/particle/random/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/random/particle_manage.dart rename to packages/draw_system/lib/src/particle/random/particle_manage.dart diff --git a/lib/painter_system/particle/random/random_particle.dart b/packages/draw_system/lib/src/particle/random/random_particle.dart similarity index 100% rename from lib/painter_system/particle/random/random_particle.dart rename to packages/draw_system/lib/src/particle/random/random_particle.dart diff --git a/lib/painter_system/particle/random/world_render.dart b/packages/draw_system/lib/src/particle/random/world_render.dart similarity index 100% rename from lib/painter_system/particle/random/world_render.dart rename to packages/draw_system/lib/src/particle/random/world_render.dart diff --git a/lib/painter_system/particle/split/particle.dart b/packages/draw_system/lib/src/particle/split/particle.dart similarity index 100% rename from lib/painter_system/particle/split/particle.dart rename to packages/draw_system/lib/src/particle/split/particle.dart diff --git a/lib/painter_system/particle/split/particle_manage.dart b/packages/draw_system/lib/src/particle/split/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/split/particle_manage.dart rename to packages/draw_system/lib/src/particle/split/particle_manage.dart diff --git a/lib/painter_system/particle/split/particle_split.dart b/packages/draw_system/lib/src/particle/split/particle_split.dart similarity index 100% rename from lib/painter_system/particle/split/particle_split.dart rename to packages/draw_system/lib/src/particle/split/particle_split.dart diff --git a/lib/painter_system/particle/split/world_render.dart b/packages/draw_system/lib/src/particle/split/world_render.dart similarity index 100% rename from lib/painter_system/particle/split/world_render.dart rename to packages/draw_system/lib/src/particle/split/world_render.dart diff --git a/lib/painter_system/particle/split_img/particle.dart b/packages/draw_system/lib/src/particle/split_img/particle.dart similarity index 100% rename from lib/painter_system/particle/split_img/particle.dart rename to packages/draw_system/lib/src/particle/split_img/particle.dart diff --git a/lib/painter_system/particle/split_img/particle_manage.dart b/packages/draw_system/lib/src/particle/split_img/particle_manage.dart similarity index 100% rename from lib/painter_system/particle/split_img/particle_manage.dart rename to packages/draw_system/lib/src/particle/split_img/particle_manage.dart diff --git a/lib/painter_system/particle/split_img/split_image.dart b/packages/draw_system/lib/src/particle/split_img/split_image.dart similarity index 100% rename from lib/painter_system/particle/split_img/split_image.dart rename to packages/draw_system/lib/src/particle/split_img/split_image.dart diff --git a/lib/painter_system/particle/split_img/world_render.dart b/packages/draw_system/lib/src/particle/split_img/world_render.dart similarity index 100% rename from lib/painter_system/particle/split_img/world_render.dart rename to packages/draw_system/lib/src/particle/split_img/world_render.dart diff --git a/lib/painter_system/picture_frame.dart b/packages/draw_system/lib/src/picture_frame.dart similarity index 100% rename from lib/painter_system/picture_frame.dart rename to packages/draw_system/lib/src/picture_frame.dart diff --git a/lib/painter_system/utils/colors.dart b/packages/draw_system/lib/src/utils/colors.dart similarity index 100% rename from lib/painter_system/utils/colors.dart rename to packages/draw_system/lib/src/utils/colors.dart diff --git a/lib/painter_system/utils/coordinate.dart b/packages/draw_system/lib/src/utils/coordinate.dart similarity index 100% rename from lib/painter_system/utils/coordinate.dart rename to packages/draw_system/lib/src/utils/coordinate.dart diff --git a/packages/draw_system/pubspec.yaml b/packages/draw_system/pubspec.yaml new file mode 100644 index 00000000..1ff5fd28 --- /dev/null +++ b/packages/draw_system/pubspec.yaml @@ -0,0 +1,63 @@ +name: draw_system +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.2.3 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + toly_ui: + path: ../toly_ui + app: + path: ../app + components: + path: ../components + dash_painter: ^1.0.2 + flutter_bloc: ^8.1.3 # 状态管理 + url_launcher: ^6.1.14 # url + image: ^4.0.17 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/draw_system/test/draw_system_test.dart b/packages/draw_system/test/draw_system_test.dart new file mode 100644 index 00000000..516a3964 --- /dev/null +++ b/packages/draw_system/test/draw_system_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:draw_system/draw_system.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/packages/storage/lib/src/db_storage/dao/widget_dao.dart b/packages/storage/lib/src/db_storage/dao/widget_dao.dart index 30064c5f..f9dad8fd 100644 --- a/packages/storage/lib/src/db_storage/dao/widget_dao.dart +++ b/packages/storage/lib/src/db_storage/dao/widget_dao.dart @@ -1,6 +1,7 @@ import 'package:sqflite/sqflite.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:widget_module/widget_module.dart'; + import '../models/widget_po.dart'; @@ -86,6 +87,15 @@ class WidgetDao { return 0; } + + Future?> queryWidgetByName(String name) async{ + String sql = "SELECT * FROM widget WHERE name = ?"; + List> result = await db.rawQuery(sql, [name]); + if(result.isNotEmpty){ + return result.first; + } + return null; + } } diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 415bc084..8a38b331 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -16,8 +16,8 @@ dependencies: shared_preferences: ^2.2.1 # xml 固化 path_provider: ^2.1.1 # 路径 - widget_repository: - path: ../widget_repository + widget_module: + path: ../widget_module artifact: path: ../artifact diff --git a/packages/toly_ui/.gitignore b/packages/toly_ui/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/toly_ui/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/toly_ui/.metadata b/packages/toly_ui/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/packages/toly_ui/.metadata @@ -0,0 +1,10 @@ +# 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: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/packages/toly_ui/CHANGELOG.md b/packages/toly_ui/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/toly_ui/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/toly_ui/LICENSE b/packages/toly_ui/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/toly_ui/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/toly_ui/README.md b/packages/toly_ui/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/toly_ui/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/toly_ui/analysis_options.yaml b/packages/toly_ui/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/toly_ui/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/toly_ui/lib/adapter/platform_view_adapter.dart b/packages/toly_ui/lib/adapter/platform_view_adapter.dart new file mode 100644 index 00000000..d5d5f834 --- /dev/null +++ b/packages/toly_ui/lib/adapter/platform_view_adapter.dart @@ -0,0 +1,77 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +typedef WidthConditionFun = bool Function(double width); +typedef WidgetBuilder = Widget Function(BuildContext context); + +enum ViewAdapterType { width, platform } + +class PlatformViewAdapter extends StatelessWidget { + final Widget mobile; + final Widget desk; + final ViewAdapterType type; + + const PlatformViewAdapter({ + super.key, + required this.mobile, + required this.desk, + this.type = ViewAdapterType.width, + }); + + @override + Widget build(BuildContext context) { + switch (type) { + case ViewAdapterType.width: + return WidthConditionBuilder( + conditionMap: { + phoneSize: (_) => mobile, + deskSize: (_) => desk, + }, + ); + case ViewAdapterType.platform: + bool isDesk = kIsWeb || + Platform.isMacOS || + Platform.isWindows || + Platform.isLinux; + return isDesk ? desk : mobile; + } + } + + bool phoneSize(double size) { + return size > 0 && size <= 500; + } + + bool deskSize(double size) { + return size > 500; + } +} + +class WidthConditionBuilder extends StatelessWidget { + final Map conditionMap; + final Widget unMatchWidget; + + const WidthConditionBuilder({ + super.key, + required this.conditionMap, + this.unMatchWidget = const SizedBox.shrink(), + }); + + @override + Widget build(BuildContext context) { + return LayoutBuilder(builder: (_, c) { + List conditions = conditionMap.keys.toList(); + WidthConditionFun? active; + for (int i = 0; i < conditions.length; i++) { + if (conditions[i](c.maxHeight)) { + active = conditions[i]; + } + } + if (active != null) { + return conditionMap[active]!(context); + } + return unMatchWidget; + }); + } +} diff --git a/packages/components/lib/toly_ui/button/feedback_widget.dart b/packages/toly_ui/lib/button/feedback_widget.dart similarity index 100% rename from packages/components/lib/toly_ui/button/feedback_widget.dart rename to packages/toly_ui/lib/button/feedback_widget.dart diff --git a/packages/components/lib/toly_ui/code/code.dart b/packages/toly_ui/lib/code/code.dart similarity index 100% rename from packages/components/lib/toly_ui/code/code.dart rename to packages/toly_ui/lib/code/code.dart diff --git a/packages/components/lib/toly_ui/code/code_widget.dart b/packages/toly_ui/lib/code/code_widget.dart similarity index 100% rename from packages/components/lib/toly_ui/code/code_widget.dart rename to packages/toly_ui/lib/code/code_widget.dart diff --git a/packages/components/lib/toly_ui/code/high_light_code.dart b/packages/toly_ui/lib/code/high_light_code.dart similarity index 100% rename from packages/components/lib/toly_ui/code/high_light_code.dart rename to packages/toly_ui/lib/code/high_light_code.dart diff --git a/packages/components/lib/toly_ui/code/highlighter_style.dart b/packages/toly_ui/lib/code/highlighter_style.dart similarity index 100% rename from packages/components/lib/toly_ui/code/highlighter_style.dart rename to packages/toly_ui/lib/code/highlighter_style.dart diff --git a/packages/components/lib/toly_ui/code/language/dart_languge.dart b/packages/toly_ui/lib/code/language/dart_languge.dart similarity index 100% rename from packages/components/lib/toly_ui/code/language/dart_languge.dart rename to packages/toly_ui/lib/code/language/dart_languge.dart diff --git a/packages/components/lib/toly_ui/code/language/language.dart b/packages/toly_ui/lib/code/language/language.dart similarity index 100% rename from packages/components/lib/toly_ui/code/language/language.dart rename to packages/toly_ui/lib/code/language/language.dart diff --git a/packages/components/lib/toly_ui/decorations/round_rect_rab_indicator.dart b/packages/toly_ui/lib/decorations/round_rect_rab_indicator.dart similarity index 100% rename from packages/components/lib/toly_ui/decorations/round_rect_rab_indicator.dart rename to packages/toly_ui/lib/decorations/round_rect_rab_indicator.dart diff --git a/packages/components/lib/toly_ui/default/loading/planet_loading.dart b/packages/toly_ui/lib/default/loading/planet_loading.dart similarity index 95% rename from packages/components/lib/toly_ui/default/loading/planet_loading.dart rename to packages/toly_ui/lib/default/loading/planet_loading.dart index 029c01ee..29ba49b8 100644 --- a/packages/components/lib/toly_ui/default/loading/planet_loading.dart +++ b/packages/toly_ui/lib/default/loading/planet_loading.dart @@ -1,8 +1,10 @@ import 'dart:math'; -import 'package:components/toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; +import '../../ti/circle.dart'; +import '../../ti/math_runner.dart'; + /// create by 张风捷特烈 on 2020/10/24 /// contact me by email 1981462002@qq.com diff --git a/packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart b/packages/toly_ui/lib/dialog/alert_conform_dialog.dart similarity index 100% rename from packages/components/lib/toly_ui/dialog/alert_conform_dialog.dart rename to packages/toly_ui/lib/dialog/alert_conform_dialog.dart diff --git a/packages/components/lib/toly_ui/dialog/delete_message_panel.dart b/packages/toly_ui/lib/dialog/delete_message_panel.dart similarity index 99% rename from packages/components/lib/toly_ui/dialog/delete_message_panel.dart rename to packages/toly_ui/lib/dialog/delete_message_panel.dart index e4ad1294..32a89c39 100644 --- a/packages/components/lib/toly_ui/dialog/delete_message_panel.dart +++ b/packages/toly_ui/lib/dialog/delete_message_panel.dart @@ -1,5 +1,5 @@ -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; typedef AsyncTask = Future Function(BuildContext context); diff --git a/packages/components/lib/toly_ui/input/edit_panel.dart b/packages/toly_ui/lib/input/edit_panel.dart similarity index 100% rename from packages/components/lib/toly_ui/input/edit_panel.dart rename to packages/toly_ui/lib/input/edit_panel.dart diff --git a/packages/components/lib/toly_ui/input/icon_input.dart b/packages/toly_ui/lib/input/icon_input.dart similarity index 100% rename from packages/components/lib/toly_ui/input/icon_input.dart rename to packages/toly_ui/lib/input/icon_input.dart diff --git a/packages/components/lib/toly_ui/input/input_button.dart b/packages/toly_ui/lib/input/input_button.dart similarity index 100% rename from packages/components/lib/toly_ui/input/input_button.dart rename to packages/toly_ui/lib/input/input_button.dart diff --git a/packages/components/lib/toly_ui/markdown/markdown_widget.dart b/packages/toly_ui/lib/markdown/markdown_widget.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/markdown_widget.dart rename to packages/toly_ui/lib/markdown/markdown_widget.dart diff --git a/packages/components/lib/toly_ui/markdown/md_text_styles.dart b/packages/toly_ui/lib/markdown/md_text_styles.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/md_text_styles.dart rename to packages/toly_ui/lib/markdown/md_text_styles.dart diff --git a/packages/components/lib/toly_ui/markdown/syntax_high_lighter.dart b/packages/toly_ui/lib/markdown/syntax_high_lighter.dart similarity index 100% rename from packages/components/lib/toly_ui/markdown/syntax_high_lighter.dart rename to packages/toly_ui/lib/markdown/syntax_high_lighter.dart diff --git a/packages/components/lib/toly_ui/object/windmill.dart b/packages/toly_ui/lib/object/windmill.dart similarity index 100% rename from packages/components/lib/toly_ui/object/windmill.dart rename to packages/toly_ui/lib/object/windmill.dart diff --git a/packages/components/lib/toly_ui/popable/drop_selectable_widget.dart b/packages/toly_ui/lib/popable/drop_selectable_widget.dart similarity index 100% rename from packages/components/lib/toly_ui/popable/drop_selectable_widget.dart rename to packages/toly_ui/lib/popable/drop_selectable_widget.dart diff --git a/packages/components/lib/toly_ui/selector/burst_menu.dart b/packages/toly_ui/lib/selector/burst_menu.dart similarity index 100% rename from packages/components/lib/toly_ui/selector/burst_menu.dart rename to packages/toly_ui/lib/selector/burst_menu.dart diff --git a/packages/components/lib/toly_ui/selector/color_chooser.dart b/packages/toly_ui/lib/selector/color_chooser.dart similarity index 98% rename from packages/components/lib/toly_ui/selector/color_chooser.dart rename to packages/toly_ui/lib/selector/color_chooser.dart index 2c7fdf29..9d70c648 100644 --- a/packages/components/lib/toly_ui/selector/color_chooser.dart +++ b/packages/toly_ui/lib/selector/color_chooser.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import '../button/feedback_widget.dart'; + typedef CheckCallback = void Function(T color); diff --git a/packages/components/lib/toly_ui/selector/multi_chip_filter.dart b/packages/toly_ui/lib/selector/multi_chip_filter.dart similarity index 100% rename from packages/components/lib/toly_ui/selector/multi_chip_filter.dart rename to packages/toly_ui/lib/selector/multi_chip_filter.dart diff --git a/packages/components/lib/toly_ui/sliver_header/sliver_pinned_header.dart b/packages/toly_ui/lib/sliver_header/sliver_pinned_header.dart similarity index 100% rename from packages/components/lib/toly_ui/sliver_header/sliver_pinned_header.dart rename to packages/toly_ui/lib/sliver_header/sliver_pinned_header.dart diff --git a/packages/components/lib/toly_ui/sliver_header/sliver_snap_header.dart b/packages/toly_ui/lib/sliver_header/sliver_snap_header.dart similarity index 100% rename from packages/components/lib/toly_ui/sliver_header/sliver_snap_header.dart rename to packages/toly_ui/lib/sliver_header/sliver_snap_header.dart diff --git a/packages/components/lib/toly_ui/ti/circle.dart b/packages/toly_ui/lib/ti/circle.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/circle.dart rename to packages/toly_ui/lib/ti/circle.dart diff --git a/packages/components/lib/toly_ui/ti/circle_image.dart b/packages/toly_ui/lib/ti/circle_image.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/circle_image.dart rename to packages/toly_ui/lib/ti/circle_image.dart diff --git a/packages/components/lib/toly_ui/ti/circle_text.dart b/packages/toly_ui/lib/ti/circle_text.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/circle_text.dart rename to packages/toly_ui/lib/ti/circle_text.dart diff --git a/packages/components/lib/toly_ui/ti/color_wrapper.dart b/packages/toly_ui/lib/ti/color_wrapper.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/color_wrapper.dart rename to packages/toly_ui/lib/ti/color_wrapper.dart diff --git a/packages/components/lib/toly_ui/ti/math_runner.dart b/packages/toly_ui/lib/ti/math_runner.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/math_runner.dart rename to packages/toly_ui/lib/ti/math_runner.dart diff --git a/packages/components/lib/toly_ui/ti/panel.dart b/packages/toly_ui/lib/ti/panel.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/panel.dart rename to packages/toly_ui/lib/ti/panel.dart diff --git a/packages/components/lib/toly_ui/ti/tag.dart b/packages/toly_ui/lib/ti/tag.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/tag.dart rename to packages/toly_ui/lib/ti/tag.dart diff --git a/packages/components/lib/toly_ui/ti/text_typer.dart b/packages/toly_ui/lib/ti/text_typer.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/text_typer.dart rename to packages/toly_ui/lib/ti/text_typer.dart diff --git a/packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart b/packages/toly_ui/lib/ti/toly_switch_list_tile.dart similarity index 100% rename from packages/components/lib/toly_ui/ti/toly_switch_list_tile.dart rename to packages/toly_ui/lib/ti/toly_switch_list_tile.dart diff --git a/packages/components/lib/toly_ui/toly_ui.dart b/packages/toly_ui/lib/toly_ui.dart similarity index 89% rename from packages/components/lib/toly_ui/toly_ui.dart rename to packages/toly_ui/lib/toly_ui.dart index 78d42e24..39daae04 100644 --- a/packages/components/lib/toly_ui/toly_ui.dart +++ b/packages/toly_ui/lib/toly_ui.dart @@ -22,4 +22,6 @@ export 'object/windmill.dart'; export 'sliver_header/sliver_pinned_header.dart'; export 'sliver_header/sliver_snap_header.dart'; export 'ti/toly_switch_list_tile.dart'; -export 'markdown/markdown_widget.dart' hide Highlighter; \ No newline at end of file +export 'markdown/markdown_widget.dart' hide Highlighter; + +export 'adapter/platform_view_adapter.dart'; \ No newline at end of file diff --git a/packages/toly_ui/pubspec.yaml b/packages/toly_ui/pubspec.yaml new file mode 100644 index 00000000..af2ee247 --- /dev/null +++ b/packages/toly_ui/pubspec.yaml @@ -0,0 +1,55 @@ +name: toly_ui +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.2.3 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + flutter_markdown: ^0.6.4 # markdown + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/toly_ui/test/toly_ui_test.dart b/packages/toly_ui/test/toly_ui_test.dart new file mode 100644 index 00000000..a31c1f80 --- /dev/null +++ b/packages/toly_ui/test/toly_ui_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:toly_ui/toly_ui.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/packages/treasure_tools/.gitignore b/packages/treasure_tools/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/treasure_tools/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/treasure_tools/.metadata b/packages/treasure_tools/.metadata new file mode 100644 index 00000000..fe59252b --- /dev/null +++ b/packages/treasure_tools/.metadata @@ -0,0 +1,10 @@ +# 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: "78666c8dc57e9f7548ca9f8dd0740fbf0c658dc9" + channel: "stable" + +project_type: package diff --git a/packages/treasure_tools/CHANGELOG.md b/packages/treasure_tools/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/treasure_tools/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/treasure_tools/LICENSE b/packages/treasure_tools/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/treasure_tools/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/treasure_tools/README.md b/packages/treasure_tools/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/treasure_tools/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/treasure_tools/analysis_options.yaml b/packages/treasure_tools/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/treasure_tools/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/lib/code_gen/bloc/state.dart b/packages/treasure_tools/lib/src/bloc/state.dart similarity index 71% rename from lib/code_gen/bloc/state.dart rename to packages/treasure_tools/lib/src/bloc/state.dart index e7bac1b9..d852422c 100644 --- a/lib/code_gen/bloc/state.dart +++ b/packages/treasure_tools/lib/src/bloc/state.dart @@ -1,10 +1,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/code_gen/model/class.dart'; - -class ClassGenBloc extends Cubit{ - - ClassGenBloc():super(Class(fields: [], name: '')); +import '../model/class.dart'; +class ClassGenBloc extends Cubit{ + ClassGenBloc():super(Class(fields: [], name: '')); } \ No newline at end of file diff --git a/lib/code_gen/class_generator.dart b/packages/treasure_tools/lib/src/class_generator.dart similarity index 100% rename from lib/code_gen/class_generator.dart rename to packages/treasure_tools/lib/src/class_generator.dart diff --git a/lib/code_gen/code_gen_page.dart b/packages/treasure_tools/lib/src/code_gen_page.dart similarity index 98% rename from lib/code_gen/code_gen_page.dart rename to packages/treasure_tools/lib/src/code_gen_page.dart index 5df5945c..058a0b42 100644 --- a/lib/code_gen/code_gen_page.dart +++ b/packages/treasure_tools/lib/src/code_gen_page.dart @@ -1,9 +1,9 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_gen_page.dart'; import 'class_generator.dart'; import 'desk_widget_top_bar.dart'; +import 'icon_font_gen/icon_font_gen_page.dart'; import 'model/class.dart'; import 'model/field.dart'; import 'popable/class_gen_field.dart'; diff --git a/lib/code_gen/data/task_result.dart b/packages/treasure_tools/lib/src/data/task_result.dart similarity index 100% rename from lib/code_gen/data/task_result.dart rename to packages/treasure_tools/lib/src/data/task_result.dart diff --git a/lib/code_gen/desk_widget_top_bar.dart b/packages/treasure_tools/lib/src/desk_widget_top_bar.dart similarity index 95% rename from lib/code_gen/desk_widget_top_bar.dart rename to packages/treasure_tools/lib/src/desk_widget_top_bar.dart index 8654630c..eef6b0c0 100644 --- a/lib/code_gen/desk_widget_top_bar.dart +++ b/packages/treasure_tools/lib/src/desk_widget_top_bar.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; @@ -32,11 +32,11 @@ class _DeskCodeGenTopBarState extends State with SingleTicke bool isDark = Theme.of(context).brightness == Brightness.dark; return DragToMoveAreaNoDouble( child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20), height: 64, color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ + const SizedBox(width: 12,), SizedBox( width: 350, child: TabBar( diff --git a/lib/code_gen/icon_font_gen/gen_message_action.dart b/packages/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart similarity index 100% rename from lib/code_gen/icon_font_gen/gen_message_action.dart rename to packages/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart diff --git a/lib/code_gen/icon_font_gen/icon_font_class_parser.dart b/packages/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart similarity index 100% rename from lib/code_gen/icon_font_gen/icon_font_class_parser.dart rename to packages/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_config.dart b/packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart similarity index 100% rename from lib/code_gen/icon_font_gen/icon_font_gen_config.dart rename to packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart diff --git a/lib/code_gen/icon_font_gen/icon_font_gen_page.dart b/packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart similarity index 100% rename from lib/code_gen/icon_font_gen/icon_font_gen_page.dart rename to packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart diff --git a/lib/code_gen/model/class.dart b/packages/treasure_tools/lib/src/model/class.dart similarity index 100% rename from lib/code_gen/model/class.dart rename to packages/treasure_tools/lib/src/model/class.dart diff --git a/lib/code_gen/model/field.dart b/packages/treasure_tools/lib/src/model/field.dart similarity index 100% rename from lib/code_gen/model/field.dart rename to packages/treasure_tools/lib/src/model/field.dart diff --git a/lib/code_gen/popable/class_gen_field.dart b/packages/treasure_tools/lib/src/popable/class_gen_field.dart similarity index 98% rename from lib/code_gen/popable/class_gen_field.dart rename to packages/treasure_tools/lib/src/popable/class_gen_field.dart index b57b06e2..562c927b 100644 --- a/lib/code_gen/popable/class_gen_field.dart +++ b/packages/treasure_tools/lib/src/popable/class_gen_field.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/code_gen/model/class.dart'; import '../code_gen_page.dart'; +import '../model/class.dart'; import '../model/field.dart'; import 'toly_select.dart'; diff --git a/lib/code_gen/popable/toly_select.dart b/packages/treasure_tools/lib/src/popable/toly_select.dart similarity index 100% rename from lib/code_gen/popable/toly_select.dart rename to packages/treasure_tools/lib/src/popable/toly_select.dart diff --git a/lib/code_gen/wrapper.dart b/packages/treasure_tools/lib/src/wrapper.dart similarity index 100% rename from lib/code_gen/wrapper.dart rename to packages/treasure_tools/lib/src/wrapper.dart diff --git a/packages/treasure_tools/lib/treasure_tools.dart b/packages/treasure_tools/lib/treasure_tools.dart new file mode 100644 index 00000000..20382c4a --- /dev/null +++ b/packages/treasure_tools/lib/treasure_tools.dart @@ -0,0 +1,3 @@ +library treasure_tools; + +export 'src/code_gen_page.dart'; diff --git a/packages/treasure_tools/pubspec.yaml b/packages/treasure_tools/pubspec.yaml new file mode 100644 index 00000000..444f2687 --- /dev/null +++ b/packages/treasure_tools/pubspec.yaml @@ -0,0 +1,64 @@ +name: treasure_tools +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.2.3 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + flutter_bloc: ^8.1.3 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + archive: ^3.4.10 # 解压 + file_picker: ^6.1.1 + shared_preferences: ^2.2.2 # xml 固化 + utils: + path: ../utils + app: + path: ../app + toly_ui: + path: ../toly_ui +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/test/iconfont_parser_test.dart b/packages/treasure_tools/test/iconfont_parser_test.dart similarity index 81% rename from test/iconfont_parser_test.dart rename to packages/treasure_tools/test/iconfont_parser_test.dart index 37780b40..ae20198d 100644 --- a/test/iconfont_parser_test.dart +++ b/packages/treasure_tools/test/iconfont_parser_test.dart @@ -2,7 +2,8 @@ import 'dart:convert'; import 'dart:io'; -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; +import 'package:treasure_tools/src/icon_font_gen/icon_font_class_parser.dart'; + void main(){ final String filePath = r'E:\Download\out\font_1717416_cwm89ioqkfo\iconfont.json'; diff --git a/packages/treasure_tools/test/treasure_tools_test.dart b/packages/treasure_tools/test/treasure_tools_test.dart new file mode 100644 index 00000000..1a5dd707 --- /dev/null +++ b/packages/treasure_tools/test/treasure_tools_test.dart @@ -0,0 +1,12 @@ +// import 'package:flutter_test/flutter_test.dart'; +// +// import 'package:treasure_tools/treasure_tools.dart'; +// +// void main() { +// test('adds one to input values', () { +// final calculator = Calculator(); +// expect(calculator.addOne(2), 3); +// expect(calculator.addOne(-7), -6); +// expect(calculator.addOne(0), 1); +// }); +// } diff --git a/packages/treasure_tools/test/yaml_parser_test.dart b/packages/treasure_tools/test/yaml_parser_test.dart new file mode 100644 index 00000000..ea8e36e8 --- /dev/null +++ b/packages/treasure_tools/test/yaml_parser_test.dart @@ -0,0 +1,51 @@ +// +// import 'dart:convert'; +// import 'dart:io'; +// +// // import 'package:yaml/yaml.dart'; +// import 'package:yaml_modify/yaml_modify.dart'; +// +// void main(){ +// final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; +// File pubspecFile = File(filePath); +// final String pubspec = pubspecFile.readAsStringSync(); +// print(pubspec); +// +// // YamlEditor doc = YamlEditor(pubspec); +// // print(doc); +// final doc = loadYaml(pubspec); +// print(doc); +// +// YamlList fontsList = doc['flutter']['fonts'] as YamlList; +// +// final modifiableDoc = getModifiableNode(doc); +// final modifiableList = getModifiableNode(fontsList); +// modifiableList.removeWhere((e) => e['family'] == 'TolyIcon'); +// modifiableList.add( +// YamlMap.wrap({ +// 'family': 'TolyIcon3', +// 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) +// }) +// ); +// modifiableDoc['flutter']['fonts'] = modifiableList; +// final strYaml = toYamlString(modifiableDoc); +// print(modifiableList); +// +// // // YamlMap flutterNode = doc[]; +// // doc.update('flutter', (value) { +// // // YamlList fontsNode = value as YamlList; +// // // List filter = fontsNode.where((e) => e['family']!='TolyIcon').toList(); +// // +// // return YamlMap.wrap({ +// // 'family': 'TolyIcon3', +// // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) +// // }); +// // }); +// +// // YamlList fontsList = doc['flutter']['fonts'] as YamlList; +// // +// +// // // doc. +// print(doc); +// +// } \ No newline at end of file diff --git a/packages/treasure_tools/test/yaml_parser_test2.dart b/packages/treasure_tools/test/yaml_parser_test2.dart new file mode 100644 index 00000000..f8a47928 --- /dev/null +++ b/packages/treasure_tools/test/yaml_parser_test2.dart @@ -0,0 +1,64 @@ +// +// import 'dart:convert'; +// import 'dart:io'; +// +// // import 'package:yaml/yaml.dart'; +// import 'package:yaml_modify/yaml_modify.dart'; +// +// void main(){ +// String familyName = 'TolyIcon'; +// String fontAssetsDist = 'assets/iconfont/iconfont.ttf'; +// +// // final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; +// final String filePath = r'E:\Projects\Flutter\Work\toly_image_edit\pubspec.yaml'; +// File pubspecFile = File(filePath); +// +// List lines = pubspecFile.readAsLinesSync(); +// +// RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); +// bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); +// +// if(!hasFonts){ +// // 当前没有 fonts 节点,需要添加到 flutter 节点下 +// int index = lines.indexWhere((e) => e.startsWith('flutter:')); +// +// List fonts = [ +// ' fonts:', +// ' - family: TolyIcon', +// ' fonts:', +// ' - asset: assets/iconfont/iconfont.ttf', +// ]; +// +// lines.insertAll(index+1, fonts); +// print(lines); +// pubspecFile.writeAsStringSync(lines.join('\n')); +// return; +// } +// // 存在 fonts 节点,查询 family ,有没有当前字体图标 +// bool hasTargetFamily = false; +// RegExp regExp = RegExp(r'^ +- family: +(\w+)'); +// +// for(int i=0;i e.startsWith(fontsRegex)); +// List fonts = [ +// ' - family: TolyIcon', +// ' fonts:', +// ' - asset: $fontAssetsDist', +// ]; +// lines.insertAll(index+1, fonts); +// print(lines); +// pubspecFile.writeAsStringSync(lines.join('\n')); +// return; +// } +// +// } \ No newline at end of file diff --git a/lib/app/utils/convert_man.dart b/packages/utils/lib/src/convert_man.dart similarity index 100% rename from lib/app/utils/convert_man.dart rename to packages/utils/lib/src/convert_man.dart diff --git a/packages/utils/lib/utils.dart b/packages/utils/lib/utils.dart index 43bcda4c..f83611f3 100644 --- a/packages/utils/lib/utils.dart +++ b/packages/utils/lib/utils.dart @@ -3,3 +3,4 @@ library utils; export 'src/color_utils.dart'; export 'src/http_utils/http_utils.dart'; export 'src/toast.dart'; +export 'src/convert_man.dart'; diff --git a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart index cc892dbf..14bab09d 100644 --- a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart +++ b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart @@ -1,7 +1,8 @@ import 'package:storage/storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../data/exp.dart'; + part 'category_event.dart'; part 'category_state.dart'; diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart b/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart index a99451df..a2b0d45c 100644 --- a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart +++ b/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart @@ -1,6 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../data/exp.dart'; + import '../category_bloc/category_bloc.dart'; diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart b/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart index 32035416..1ff59bbb 100644 --- a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart +++ b/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart @@ -1,6 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../data/exp.dart'; + part 'liked_widget_event.dart'; diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 25e42e71..1c96552b 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -1,7 +1,7 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../data/exp.dart'; part 'widget_detail_state.dart'; diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index de35a77e..7b8357ce 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -1,8 +1,11 @@ import 'dart:async'; +import 'dart:io'; +import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../data/exp.dart'; part 'widgets_event.dart'; @@ -25,7 +28,8 @@ class WidgetsBloc extends Bloc { /// 切换页签,以 [family] 为过滤项 void _onEventTabTap(EventTabTap event, Emitter emit) async { emit(const WidgetsLoading(operate: LoadOperate.load)); - WidgetFilter filter = WidgetFilter.family(event.family); + int size = isDesk?1000:20; + WidgetFilter filter = WidgetFilter.family(event.family,pageSize: size); try { final List widgets = await repository.searchWidgets(filter); emit(WidgetsLoaded( diff --git a/packages/widget_repository/lib/src/category_repository.dart b/packages/widget_module/lib/data/category_repository.dart similarity index 100% rename from packages/widget_repository/lib/src/category_repository.dart rename to packages/widget_module/lib/data/category_repository.dart diff --git a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart similarity index 98% rename from packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart rename to packages/widget_module/lib/data/db_impl/catagory_db_repository.dart index f0081958..8c68bd4a 100644 --- a/packages/widget_repository/lib/src/db_impl/catagory_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart @@ -3,7 +3,8 @@ import 'dart:convert'; import 'package:storage/storage.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../exp.dart'; + /// create by 张风捷特烈 on 2020-04-21 diff --git a/packages/widget_repository/lib/src/db_impl/db_impl.dart b/packages/widget_module/lib/data/db_impl/db_impl.dart similarity index 100% rename from packages/widget_repository/lib/src/db_impl/db_impl.dart rename to packages/widget_module/lib/data/db_impl/db_impl.dart diff --git a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart b/packages/widget_module/lib/data/db_impl/node_db_repository.dart similarity index 88% rename from packages/widget_repository/lib/src/db_impl/node_db_repository.dart rename to packages/widget_module/lib/data/db_impl/node_db_repository.dart index f9f6f861..2d737abe 100644 --- a/packages/widget_repository/lib/src/db_impl/node_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/node_db_repository.dart @@ -1,8 +1,8 @@ import 'package:storage/storage.dart'; -import 'package:widget_repository/src/model/node_model.dart'; +import '../model/node_model.dart'; import '../node_repository.dart'; class NodeDbRepository implements NodeRepository{ diff --git a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart similarity index 83% rename from packages/widget_repository/lib/src/db_impl/widget_db_repository.dart rename to packages/widget_module/lib/data/db_impl/widget_db_repository.dart index 613734ba..7a6e7a46 100644 --- a/packages/widget_repository/lib/src/db_impl/widget_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart @@ -1,7 +1,8 @@ -import 'package:widget_repository/src/model/model.dart'; -import 'package:widget_repository/src/widget_repository.dart'; + import 'package:storage/storage.dart'; +import '../exp.dart'; + /// create by 张风捷特烈 on 2020-03-03 @@ -52,4 +53,14 @@ class WidgetDbRepository implements WidgetRepository { @override Future total(WidgetFilter args) => widgetDao.total(args); + + @override + Future queryWidgetByName(String? name) async{ + if(name==null) return null; + Map? data = await widgetDao.queryWidgetByName(name); + if(data!=null){ + return WidgetModel.fromPo(WidgetPo.fromJson(data)); + } + return null; + } } diff --git a/packages/widget_module/lib/data/exp.dart b/packages/widget_module/lib/data/exp.dart new file mode 100644 index 00000000..6f2f9a8b --- /dev/null +++ b/packages/widget_module/lib/data/exp.dart @@ -0,0 +1,5 @@ +export 'category_repository.dart'; +export 'node_repository.dart'; +export 'widget_repository.dart'; +export 'model/model.dart'; +export 'db_impl/db_impl.dart'; \ No newline at end of file diff --git a/packages/widget_repository/lib/src/model/category_model.dart b/packages/widget_module/lib/data/model/category_model.dart similarity index 100% rename from packages/widget_repository/lib/src/model/category_model.dart rename to packages/widget_module/lib/data/model/category_model.dart diff --git a/packages/widget_repository/lib/src/model/enums.dart b/packages/widget_module/lib/data/model/enums.dart similarity index 100% rename from packages/widget_repository/lib/src/model/enums.dart rename to packages/widget_module/lib/data/model/enums.dart diff --git a/packages/widget_repository/lib/src/model/model.dart b/packages/widget_module/lib/data/model/model.dart similarity index 100% rename from packages/widget_repository/lib/src/model/model.dart rename to packages/widget_module/lib/data/model/model.dart diff --git a/packages/widget_repository/lib/src/model/node_model.dart b/packages/widget_module/lib/data/model/node_model.dart similarity index 100% rename from packages/widget_repository/lib/src/model/node_model.dart rename to packages/widget_module/lib/data/model/node_model.dart diff --git a/packages/widget_repository/lib/src/model/widget_filter.dart b/packages/widget_module/lib/data/model/widget_filter.dart similarity index 100% rename from packages/widget_repository/lib/src/model/widget_filter.dart rename to packages/widget_module/lib/data/model/widget_filter.dart diff --git a/packages/widget_repository/lib/src/model/widget_model.dart b/packages/widget_module/lib/data/model/widget_model.dart similarity index 97% rename from packages/widget_repository/lib/src/model/widget_model.dart rename to packages/widget_module/lib/data/model/widget_model.dart index a35dac94..714124f1 100644 --- a/packages/widget_repository/lib/src/model/widget_model.dart +++ b/packages/widget_module/lib/data/model/widget_model.dart @@ -1,7 +1,8 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; import 'package:storage/storage.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import 'enums.dart'; /// create by 张风捷特烈 on 2020-03-04 diff --git a/packages/widget_repository/lib/src/node_repository.dart b/packages/widget_module/lib/data/node_repository.dart similarity index 100% rename from packages/widget_repository/lib/src/node_repository.dart rename to packages/widget_module/lib/data/node_repository.dart diff --git a/packages/widget_repository/lib/src/widget_repository.dart b/packages/widget_module/lib/data/widget_repository.dart similarity index 90% rename from packages/widget_repository/lib/src/widget_repository.dart rename to packages/widget_module/lib/data/widget_repository.dart index e17aa160..e821962a 100644 --- a/packages/widget_repository/lib/src/widget_repository.dart +++ b/packages/widget_module/lib/data/widget_repository.dart @@ -9,6 +9,8 @@ abstract class WidgetRepository { /// Future> loadWidget(List ids); + Future queryWidgetByName(String? name); + /// 根据 [WidgetFilter] 搜索 [WidgetModel] 列表 Future> searchWidgets(WidgetFilter args); diff --git a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart b/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart similarity index 87% rename from lib/widget_ui/desk_ui/category_panel/desk_category_page.dart rename to packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart index a2986f1d..77d34f9c 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_category_page.dart +++ b/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart @@ -2,14 +2,14 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; -import '../../../components/top_bar/desk_tab_top_bar.dart'; +import '../../../data/exp.dart'; import '../../mobile/category_page/category_list_item.dart'; import '../../mobile/category_page/delete_category_dialog.dart'; import '../../mobile/category_page/edit_category_panel.dart'; -import '../../mobile/category_page/like_widget_page.dart'; import 'desk_top_like_panel.dart'; class DeskCategoryPage extends StatefulWidget { @@ -49,23 +49,23 @@ class _DeskCategoryPageState extends State { class DeskCateGoryPage extends StatelessWidget { const DeskCateGoryPage({Key? key}) : super(key: key); - final SliverGridDelegate deskGridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 300, - mainAxisSpacing: 10, - mainAxisExtent: 260, - crossAxisSpacing: 10, - ); + @override Widget build(BuildContext context) { + const SliverGridDelegate deskGridDelegate = SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 240, + mainAxisSpacing: 8, + mainAxisExtent: 220, + crossAxisSpacing: 8, + ); CategoryBloc bloc = context.read(); CategoryState state = bloc.state; if(state is CategoryLoadedState){ return GridView.builder( itemCount: state.categories.length, - padding: EdgeInsets.all(20), + padding: EdgeInsets.all(12), gridDelegate: deskGridDelegate, itemBuilder: (_, index) => GestureDetector( onTap: () => _toDetailPage(context, state.categories[index]), child: CategoryListItem( @@ -144,7 +144,9 @@ class DeskCateGoryPage extends StatelessWidget { void _toDetailPage(BuildContext context, CategoryModel model) { BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); - Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); + // Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + context.push('/collection/widgets/${model.id}',extra: model); } diff --git a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart b/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart similarity index 92% rename from lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart rename to packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart index 7e5cd8af..130e027d 100644 --- a/lib/widget_ui/desk_ui/category_panel/desk_top_like_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart @@ -1,11 +1,11 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/widget_detail_page.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; import '../../mobile/widget_detail/collect_widget_list_item.dart'; +import '../../mobile/widget_detail/widget_detail_page.dart'; class DeskLikePage extends StatelessWidget { const DeskLikePage({Key? key}) : super(key: key); diff --git a/packages/widget_module/lib/views/desk_ui/desk_ui.dart b/packages/widget_module/lib/views/desk_ui/desk_ui.dart new file mode 100644 index 00000000..b080b5ac --- /dev/null +++ b/packages/widget_module/lib/views/desk_ui/desk_ui.dart @@ -0,0 +1,3 @@ +export 'widget_detail/widget_detail_page.dart'; +export 'category_panel/desk_category_page.dart'; +export 'widget_panel/widget_panel.dart'; \ No newline at end of file diff --git a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart similarity index 96% rename from lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart rename to packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart index b52e2d09..ccbee6c0 100644 --- a/lib/widget_ui/desk_ui/widget_detail/link_widget_buttons.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart @@ -1,6 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; class LinkWidgetButtons extends StatelessWidget { final List links; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart similarity index 98% rename from lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart rename to packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart index 660bb1f3..580faf15 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart @@ -4,11 +4,12 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - +import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; + import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; class DeskSliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart similarity index 75% rename from lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart rename to packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 6980a189..75635172 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -1,12 +1,13 @@ import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/category_end_drawer.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; import 'package:widgets/widgets.dart'; +import '../../mobile/widget_detail/category_end_drawer.dart'; import 'link_widget_buttons.dart'; import 'widget_detail_bar.dart'; import 'widget_detail_panel.dart'; @@ -14,32 +15,62 @@ import 'widget_node_panel.dart'; // 用于组件详情不需要在一开始就加载 // WidgetDetailBloc 可以在稍后提供 -class DeskWidgetDetailPageScope extends StatelessWidget { - final WidgetModel model; +class DeskWidgetDetailPageScope extends StatefulWidget { + final WidgetModel? model; + final String? widgetName; + const DeskWidgetDetailPageScope({super.key, required this.model, this.widgetName}); - const DeskWidgetDetailPageScope({super.key, required this.model}); + @override + State createState() => _DeskWidgetDetailPageScopeState(); +} + +class _DeskWidgetDetailPageScopeState extends State { + WidgetModel? _model; + + @override + void initState() { + super.initState(); + _model = widget.model; + if (_model == null) { + _loadModelByName(); + } + } + + void _loadModelByName() async { + _model = await context + .read() + .repository + .queryWidgetByName(widget.widgetName); + } @override Widget build(BuildContext context) { + if (_model == null) + return Center( + child: CupertinoActivityIndicator(), + ); + return BlocProvider( create: (_) => WidgetDetailBloc( widgetRepository: const WidgetDbRepository(), nodeRepository: const NodeDbRepository()) - ..push(model), + ..push(_model!), child: DeskWidgetDetailPage( - model: model, + model: widget.model, ), ); } } -class DeskWidgetDetailPage extends StatelessWidget { - final WidgetModel model; +class DeskWidgetDetailPage extends StatelessWidget{ + final WidgetModel? model; const DeskWidgetDetailPage({Key? key, required this.model}) : super(key: key); @override Widget build(BuildContext context) { + + WidgetDetailBloc bloc = context.watch(); return BlocBuilder( @@ -76,7 +107,9 @@ class DeskWidgetDetailPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: DeskWidgetDetailPanel(model: bloc.currentWidget), + child: DeskWidgetDetailPanel( + model: bloc.currentWidget, + ), ), const SizedBox( width: 20, @@ -115,7 +148,7 @@ class DeskWidgetDetailPage extends StatelessWidget { Widget _buildSliverNodeList( BuildContext context, List nodes, WidgetModel model) { - AppState globalState = BlocProvider.of(context).state; + AppConfigState globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => DeskWidgetNodePanel( diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart similarity index 93% rename from lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart rename to packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index 6b8e195d..9784f0ad 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_detail_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -1,7 +1,8 @@ -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:toly_ui/toly_ui.dart'; +import '../../../../data/exp.dart'; class DeskWidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart similarity index 98% rename from lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart rename to packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart index ab11b1a9..274e04ca 100644 --- a/lib/widget_ui/desk_ui/widget_detail/widget_node_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart similarity index 96% rename from lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart rename to packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index e7c1e912..58632b52 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_search_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -4,8 +4,10 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; + class DeskSearchBar extends StatefulWidget { final ValueChanged? onChanged; @@ -37,11 +39,8 @@ class _DeskSearchBarState extends State { } _controller.clear(); - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}',extra: model); + } Future> buildOptions(TextEditingValue textEditingValue) async { diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart similarity index 98% rename from lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart rename to packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index eba629fe..05ae7b96 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -4,9 +4,11 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; import 'package:wrapper/wrapper.dart'; + + class DeskWidgetItem extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; diff --git a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart similarity index 97% rename from lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart rename to packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart index 040d2d83..92cafeef 100644 --- a/lib/widget_ui/desk_ui/widget_panel/desk_widget_top_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'desk_search_bar.dart'; diff --git a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart similarity index 88% rename from lib/widget_ui/desk_ui/widget_panel/widget_panel.dart rename to packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index d3e10a54..2489906e 100644 --- a/lib/widget_ui/desk_ui/widget_panel/widget_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -2,9 +2,9 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../../data/exp.dart'; import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; @@ -54,7 +54,7 @@ class _DeskWidgetPanelState extends State{ } void _switchTab(int index) { - WidgetFamily widgetFamily = Convert.toFamily(index); + WidgetFamily widgetFamily = WidgetFamily.values[index]; BlocProvider.of(context).add(EventTabTap(widgetFamily)); } } @@ -87,11 +87,7 @@ class WidgetList extends StatelessWidget { return DeskWidgetItem( model: model, onTap: () { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}',extra: model); }, ); } diff --git a/lib/widget_ui/mobile/category_page/category_detail.dart b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart similarity index 94% rename from lib/widget_ui/mobile/category_page/category_detail.dart rename to packages/widget_module/lib/views/mobile/category_page/category_detail.dart index 1042918a..16061ecb 100644 --- a/lib/widget_ui/mobile/category_page/category_detail.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart @@ -1,13 +1,15 @@ -import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; + +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; +import 'package:go_router/go_router.dart'; -import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/blocs/blocs.dart'; +import '../../../data/exp.dart'; + /// create by 张风捷特烈 on 2020-04-22 /// contact me by email 1981462002@qq.com @@ -69,7 +71,8 @@ class CategoryShow extends StatelessWidget { } _toDetailPage(BuildContext context, WidgetModel model) async { - Navigator.pushNamed(context, UnitRouter.widget_detail, arguments: model); + // Navigator.pushNamed(context, UnitRouter.widget_detail, arguments: model); + context.push('/widget/detail/${model.name}',extra: model); } } diff --git a/lib/widget_ui/mobile/category_page/category_list_item.dart b/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart similarity index 95% rename from lib/widget_ui/mobile/category_page/category_list_item.dart rename to packages/widget_module/lib/views/mobile/category_page/category_list_item.dart index 2b98b44f..708fd470 100644 --- a/lib/widget_ui/mobile/category_page/category_list_item.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart @@ -1,8 +1,8 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com @@ -46,7 +46,7 @@ class CategoryListItem extends StatelessWidget { maxLines: 4, style: TextStyle( color: Colors.grey, - fontSize: 12, + fontSize: 14, shadows: [ Shadow(color: themeColor.withOpacity(0.4), offset:const Offset(.2,.2),blurRadius: .5) ])), diff --git a/lib/widget_ui/mobile/category_page/category_page.dart b/packages/widget_module/lib/views/mobile/category_page/category_page.dart similarity index 94% rename from lib/widget_ui/mobile/category_page/category_page.dart rename to packages/widget_module/lib/views/mobile/category_page/category_page.dart index d17476c8..305bf68d 100644 --- a/lib/widget_ui/mobile/category_page/category_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_page.dart @@ -1,16 +1,18 @@ import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/widget_ui/mobile/category_page/delete_category_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; + import 'category_list_item.dart'; +import 'delete_category_dialog.dart'; import 'edit_category_panel.dart'; import 'empty_category.dart'; @@ -144,7 +146,7 @@ class CategoryPage extends StatelessWidget { void _toDetailPage(BuildContext context, CategoryModel model) { BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); - Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); + context.push('/collection_widgets/${model.id}',extra: model); } diff --git a/lib/widget_ui/mobile/category_page/collect_page.dart b/packages/widget_module/lib/views/mobile/category_page/collect_page.dart similarity index 98% rename from lib/widget_ui/mobile/category_page/collect_page.dart rename to packages/widget_module/lib/views/mobile/category_page/collect_page.dart index d63ff173..7a7f3adb 100644 --- a/lib/widget_ui/mobile/category_page/collect_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/collect_page.dart @@ -2,8 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:authentication/views/authentic_widget.dart'; import '../../desk_ui/category_panel/desk_category_page.dart'; diff --git a/lib/widget_ui/mobile/category_page/delete_category_dialog.dart b/packages/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart similarity index 98% rename from lib/widget_ui/mobile/category_page/delete_category_dialog.dart rename to packages/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart index ab21223d..6c74675b 100644 --- a/lib/widget_ui/mobile/category_page/delete_category_dialog.dart +++ b/packages/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; /// create by 张风捷特烈 on 2020-04-21 diff --git a/lib/widget_ui/mobile/category_page/edit_category_panel.dart b/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart similarity index 94% rename from lib/widget_ui/mobile/category_page/edit_category_panel.dart rename to packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart index 9798bd34..147520cd 100644 --- a/lib/widget_ui/mobile/category_page/edit_category_panel.dart +++ b/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart @@ -1,11 +1,12 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; +import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; + /// create by 张风捷特烈 on 2020-04-23 /// contact me by email 1981462002@qq.com diff --git a/lib/widget_ui/mobile/category_page/empty_category.dart b/packages/widget_module/lib/views/mobile/category_page/empty_category.dart similarity index 97% rename from lib/widget_ui/mobile/category_page/empty_category.dart rename to packages/widget_module/lib/views/mobile/category_page/empty_category.dart index 1be2de19..6f27ac09 100644 --- a/lib/widget_ui/mobile/category_page/empty_category.dart +++ b/packages/widget_module/lib/views/mobile/category_page/empty_category.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/widget_ui/mobile/category_page/home_right_drawer.dart b/packages/widget_module/lib/views/mobile/category_page/home_right_drawer.dart similarity index 91% rename from lib/widget_ui/mobile/category_page/home_right_drawer.dart rename to packages/widget_module/lib/views/mobile/category_page/home_right_drawer.dart index 4a99a312..e0d999b9 100644 --- a/lib/widget_ui/mobile/category_page/home_right_drawer.dart +++ b/packages/widget_module/lib/views/mobile/category_page/home_right_drawer.dart @@ -1,8 +1,9 @@ -import 'package:components/toly_ui/ti/circle.dart'; + import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/unit_drawer_header.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../widget_page/unit_drawer_header.dart'; import 'edit_category_panel.dart'; class HomeRightDrawer extends StatefulWidget { diff --git a/lib/widget_ui/mobile/category_page/like_widget_page.dart b/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart similarity index 94% rename from lib/widget_ui/mobile/category_page/like_widget_page.dart rename to packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart index 4a29dc31..674e3646 100644 --- a/lib/widget_ui/mobile/category_page/like_widget_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart @@ -4,10 +4,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_repository/widget_repository.dart'; -import 'package:flutter_unit/widget_ui/mobile/widget_detail/collect_widget_list_item.dart'; +import '../../../data/exp.dart'; + import 'package:widget_module/blocs/blocs.dart'; +import '../widget_detail/collect_widget_list_item.dart'; import '../widget_detail/widget_detail_page.dart'; diff --git a/lib/widget_ui/mobile/category_page/sync/async_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart similarity index 94% rename from lib/widget_ui/mobile/category_page/sync/async_button.dart rename to packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart index d933c488..1c0ccc50 100644 --- a/lib/widget_ui/mobile/category_page/sync/async_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -5,13 +5,15 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; +import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:storage/storage.dart'; -import 'package:widget_repository/widget_repository.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import '../../../../data/exp.dart'; + + +import 'package:toly_ui/toly_ui.dart'; /// create by 张风捷特烈 on 2021/2/24 diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart b/packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart new file mode 100644 index 00000000..df6be8fb --- /dev/null +++ b/packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart @@ -0,0 +1,73 @@ +import 'package:app/app.dart'; +import 'package:utils/utils.dart'; + + +/// create by 张风捷特烈 on 2021/2/24 +/// contact me by email 1981462002@qq.com +/// 说明: + +class CategoryApi { + static Future> uploadCategoryData( + {required String data, required String likeData}) async { + String errorMsg = ""; + + try { + var result = await HttpUtil.instance.client.post( + PathUnit.categoryDataSync, + data: {"data": data, "likeData": likeData}); + print(result.data); + if (result.data != null) { + return TaskResult.success(data:result.data['status']); + } + } catch (e) { + print(e); + errorMsg = e.toString(); + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } + + static Future> getCategoryData() async { + String errorMsg = ""; + var result = await HttpUtil.instance + .client + .get(PathUnit.categoryData) + .catchError((err) { + errorMsg =err.toString(); + + }); + + // 获取的数据非空且 status = true + if (result.data != null && result.data['status']) { + // 说明有数据 + if (result.data['data'] != null) { + return TaskResult.success(data:CategoryData.fromJson(result.data['data'])); + } else { + return const TaskResult.success(data:null); + } + } + + return TaskResult.error(msg: '请求错误: $errorMsg'); + } +} + +class CategoryData{ + final int categoryDataId; + final int userId; + final String data; + final String likeData; + + CategoryData( + {required this.categoryDataId, + required this.userId, + required this.data, + required this.likeData}); + + factory CategoryData.fromJson(Map map) { + return CategoryData( + categoryDataId: map['categoryDataId'], + userId: map["userId"], + likeData: map["likeData"], + data: map["data"]); + } +} \ No newline at end of file diff --git a/lib/widget_ui/mobile/category_page/sync/upload_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart similarity index 93% rename from lib/widget_ui/mobile/category_page/sync/upload_button.dart rename to packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index c9a37b30..18743ce3 100644 --- a/lib/widget_ui/mobile/category_page/sync/upload_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -6,11 +6,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:storage/storage.dart'; -import 'package:flutter_unit/point_system/api/category_api.dart'; +import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:toly_ui/toly_ui.dart'; +import '../../../../data/exp.dart'; + /// create by 张风捷特烈 on 2021/2/24 diff --git a/packages/widget_module/lib/views/mobile/mobile_ui.dart b/packages/widget_module/lib/views/mobile/mobile_ui.dart new file mode 100644 index 00000000..e4e9586a --- /dev/null +++ b/packages/widget_module/lib/views/mobile/mobile_ui.dart @@ -0,0 +1,7 @@ +export 'widget_detail/widget_detail_page.dart'; +export 'widget_page/standard_home_page.dart'; +export 'widget_page/widget_page.dart'; +export 'category_page/category_page.dart'; +export 'category_page/collect_page.dart'; +export 'category_page/category_detail.dart'; +export 'category_page/home_right_drawer.dart'; \ No newline at end of file diff --git a/lib/widget_ui/mobile/search_page/app_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart similarity index 97% rename from lib/widget_ui/mobile/search_page/app_search_bar.dart rename to packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart index 3011eaf6..c5fa71e4 100644 --- a/lib/widget_ui/mobile/search_page/app_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart @@ -5,7 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; + class AppSearchBar extends StatefulWidget { const AppSearchBar({Key? key}):super(key: key); diff --git a/lib/widget_ui/mobile/search_page/search_page.dart b/packages/widget_module/lib/views/mobile/search_page/search_page.dart similarity index 100% rename from lib/widget_ui/mobile/search_page/search_page.dart rename to packages/widget_module/lib/views/mobile/search_page/search_page.dart diff --git a/lib/widget_ui/mobile/search_page/standard_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart similarity index 98% rename from lib/widget_ui/mobile/search_page/standard_search_bar.dart rename to packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 5761a2c8..60db421e 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -2,7 +2,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../../data/exp.dart'; diff --git a/lib/widget_ui/mobile/search_page/standard_search_page.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart similarity index 92% rename from lib/widget_ui/mobile/search_page/standard_search_page.dart rename to packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart index 161206e3..0777df15 100644 --- a/lib/widget_ui/mobile/search_page/standard_search_page.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -2,11 +2,12 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; -import '../widget_panel/widget_model_item.dart'; +import '../../../data/exp.dart'; +import '../widget_page/widget_model_item.dart'; import 'standard_search_bar.dart'; // SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc @@ -85,10 +86,6 @@ class StandardSearchPage extends StatelessWidget { void _toDetail(BuildContext context, WidgetModel model) { // BlocProvider.of(context).add(FetchWidgetDetail(model)); - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}',extra: model); } } diff --git a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart b/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart similarity index 95% rename from lib/widget_ui/mobile/widget_detail/category_end_drawer.dart rename to packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart index 1cb45181..5c2a720e 100644 --- a/lib/widget_ui/mobile/widget_detail/category_end_drawer.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart @@ -1,11 +1,14 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/unit_drawer_header.dart'; +import 'package:toly_ui/toly_ui.dart'; + import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../../data/exp.dart'; +import '../widget_page/unit_drawer_header.dart'; /// create by 张风捷特烈 on 2020-04-22 diff --git a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart b/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart similarity index 97% rename from lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart rename to packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart index e0160057..df22313e 100644 --- a/lib/widget_ui/mobile/widget_detail/collect_widget_list_item.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart @@ -2,8 +2,9 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../../../data/exp.dart'; class CollectWidgetListItem extends StatelessWidget { final WidgetModel data; diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart similarity index 97% rename from lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart rename to packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart index c34992a1..a923f734 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_bar.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart @@ -4,10 +4,11 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../../data/exp.dart'; class SliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart similarity index 96% rename from lib/widget_ui/mobile/widget_detail/widget_detail_page.dart rename to packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index fc229a03..83ef9055 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -4,11 +4,11 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../../data/exp.dart'; import '../../desk_ui/widget_detail/link_widget_buttons.dart'; import 'widget_node_panel.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; import 'package:widgets/widgets.dart'; import 'category_end_drawer.dart'; @@ -102,7 +102,7 @@ class WidgetDetailPage extends StatelessWidget { Widget _buildSliverNodeList(BuildContext context,List nodes, WidgetModel model) { - AppState globalState = BlocProvider.of(context).state; + AppConfigState globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => WidgetNodePanel( diff --git a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart similarity index 93% rename from lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart rename to packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart index f149fbd5..e8517841 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_detail_panel.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart @@ -1,7 +1,8 @@ -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_repository/widget_repository.dart'; + +import '../../../data/exp.dart'; class WidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart similarity index 98% rename from lib/widget_ui/mobile/widget_detail/widget_node_panel.dart rename to packages/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart index cf46fd0a..67029e60 100644 --- a/lib/widget_ui/mobile/widget_detail/widget_node_panel.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:share_plus/share_plus.dart'; import 'package:toggle_rotate/toggle_rotate.dart'; diff --git a/lib/app/navigation/home_drawer.dart b/packages/widget_module/lib/views/mobile/widget_page/home_drawer.dart similarity index 86% rename from lib/app/navigation/home_drawer.dart rename to packages/widget_module/lib/views/mobile/widget_page/home_drawer.dart index 36e7bab1..18ea0980 100644 --- a/lib/app/navigation/home_drawer.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/home_drawer.dart @@ -1,7 +1,7 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; import 'unit_drawer_header.dart'; @@ -31,15 +31,15 @@ class HomeDrawer extends StatelessWidget { padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color: color), - _buildItem(context, TolyIcon.icon_them, '应用设置', UnitRouter.setting), + _buildItem(context, TolyIcon.icon_them, '应用设置', '/settings'), _buildItem( - context, TolyIcon.icon_layout, '数据管理', UnitRouter.data_manage), + context, TolyIcon.icon_layout, '数据管理', '/data_manage'), const Divider(height: 1), _buildFlutterUnit(context), _buildItem(context, TolyIcon.icon_code, 'Dart 手册', ''), const Divider(height: 1), - _buildItem(context, Icons.info, '关于应用', UnitRouter.about_app), - _buildItem(context, TolyIcon.icon_kafei, '联系本王', UnitRouter.about_me), + _buildItem(context, Icons.info, '关于应用', '/about_app'), + _buildItem(context, TolyIcon.icon_kafei, '联系本王', '/about_me'), ], ), ); @@ -56,7 +56,7 @@ class HomeDrawer extends StatelessWidget { _buildItem(context, TolyIcon.icon_tag, '属性集录', ''), _buildItem(context, Icons.palette, '绘画集录', ''), _buildItem(context, Icons.widgets, '布局集录', ''), - _buildItem(context, TolyIcon.icon_bug, '要点集录', UnitRouter.issues_point), + _buildItem(context, TolyIcon.icon_bug, '要点集录', ''), ], ); @@ -73,7 +73,7 @@ class HomeDrawer extends StatelessWidget { Icon(Icons.chevron_right, color: Theme.of(context).primaryColor), onTap: () { if (linkTo.isNotEmpty) { - Navigator.of(context).pushNamed(linkTo); + context.push(linkTo); if (onTap != null) onTap(); } }, diff --git a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart b/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart similarity index 80% rename from lib/widget_ui/mobile/widget_panel/phone_widget_content.dart rename to packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart index 7d1f7a1d..0b33f5a8 100644 --- a/lib/widget_ui/mobile/widget_panel/phone_widget_content.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart @@ -1,7 +1,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:widget_repository/widget_repository.dart'; +import 'package:go_router/go_router.dart'; +import '../../../data/exp.dart'; import 'widget_model_item.dart'; class PhoneWidgetContent extends StatelessWidget { @@ -23,10 +24,7 @@ class PhoneWidgetContent extends StatelessWidget { } void _toDetail(BuildContext context, WidgetModel model) { - Navigator.pushNamed( - context, - UnitRouter.widget_detail, - arguments: model, - ); + context.push('/widget/detail/${model.name}',extra: model); + } } diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart similarity index 91% rename from lib/widget_ui/mobile/widget_panel/standard_home_page.dart rename to packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index d2cea77f..e3a2637e 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -1,13 +1,11 @@ -import 'package:components/toly_ui/toly_ui.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/navigation/home_drawer.dart'; -import 'package:flutter_unit/app/utils/convert.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; +import '../../../data/exp.dart'; +import 'home_drawer.dart'; import 'standard_home_search.dart'; import 'widget_page.dart'; @@ -38,7 +36,7 @@ class _StandardHomePageState extends State } void _switchTab(int index) { - WidgetFamily widgetFamily = Convert.toFamily(index); + WidgetFamily widgetFamily = WidgetFamily.values[index]; WidgetsBloc bloc = BlocProvider.of(context); if (bloc.state.filter.family == widgetFamily) return; PrimaryScrollController.of(context).jumpTo(0); diff --git a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart similarity index 98% rename from lib/widget_ui/mobile/widget_panel/standard_home_search.dart rename to packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index 272c04a2..055710f9 100644 --- a/lib/widget_ui/mobile/widget_panel/standard_home_search.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -1,6 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:components/toly_ui/toly_ui.dart'; +import 'package:toly_ui/toly_ui.dart'; import '../search_page/standard_search_page.dart'; diff --git a/lib/app/navigation/unit_drawer_header.dart b/packages/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart similarity index 100% rename from lib/app/navigation/unit_drawer_header.dart rename to packages/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart diff --git a/lib/widget_ui/mobile/widget_panel/widget_list_panel.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart similarity index 100% rename from lib/widget_ui/mobile/widget_panel/widget_list_panel.dart rename to packages/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart diff --git a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart similarity index 98% rename from lib/widget_ui/mobile/widget_panel/widget_model_item.dart rename to packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart index c701ee29..b8408a80 100644 --- a/lib/widget_ui/mobile/widget_panel/widget_model_item.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart @@ -4,9 +4,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_repository/widget_repository.dart'; import 'package:wrapper/wrapper.dart'; +import '../../../data/exp.dart'; + class StandardWidgetItem extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; diff --git a/lib/widget_ui/mobile/widget_panel/widget_page.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart similarity index 100% rename from lib/widget_ui/mobile/widget_panel/widget_page.dart rename to packages/widget_module/lib/views/mobile/widget_page/widget_page.dart diff --git a/packages/widget_module/lib/widget_module.dart b/packages/widget_module/lib/widget_module.dart index a76ec00c..14aef872 100644 --- a/packages/widget_module/lib/widget_module.dart +++ b/packages/widget_module/lib/widget_module.dart @@ -1,3 +1,5 @@ library widget_module; -export ''; \ No newline at end of file +export 'views/desk_ui/desk_ui.dart'; +export 'views/mobile/mobile_ui.dart'; +export 'data/exp.dart'; \ No newline at end of file diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index 00b635fc..b4ff2970 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -13,10 +13,27 @@ dependencies: sdk: flutter flutter_bloc: ^8.1.3 # 状态管理 equatable: ^2.0.5 # 相等辅助 - widget_repository: - path: ../widget_repository + flutter_star: ^1.0.2 # 星星组件 + toggle_rotate: ^1.0.1 + wrapper: ^1.0.2 +# widget_repository: +# path: ../widget_repository storage: path: ../storage + toly_ui: + path: ../toly_ui + share_plus: ^7.2.1 # 文字分享 + components: + path: ../components + authentication: + path: ../authentication + app: + path: ../app + widgets: + path: ../widgets + utils: + path: ../utils + go_router: ^12.1.1 dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/widget_repository/lib/widget_repository.dart b/packages/widget_repository/lib/widget_repository.dart deleted file mode 100644 index 8913dcc3..00000000 --- a/packages/widget_repository/lib/widget_repository.dart +++ /dev/null @@ -1,7 +0,0 @@ -library widget_repository; - -export 'src/widget_repository.dart'; -export 'src/category_repository.dart'; -export 'src/node_repository.dart'; -export 'src/model/model.dart'; -export 'src/db_impl/db_impl.dart'; \ No newline at end of file diff --git a/packages/widget_repository/test/widget_repository_test.dart b/packages/widget_repository/test/widget_repository_test.dart deleted file mode 100644 index a5eb0900..00000000 --- a/packages/widget_repository/test/widget_repository_test.dart +++ /dev/null @@ -1,4 +0,0 @@ - -void main() { - -} diff --git a/pubspec.lock b/pubspec.lock index 6d429c67..f520d4b5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -23,13 +23,13 @@ packages: source: path version: "0.0.1" archive: - dependency: "direct main" + dependency: transitive description: name: archive - sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.4.9" + version: "3.4.10" args: dependency: transitive description: @@ -179,6 +179,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "5.4.0" + draw_system: + dependency: "direct main" + description: + path: "packages/draw_system" + relative: true + source: path + version: "0.0.1" equatable: dependency: "direct main" description: @@ -763,6 +770,20 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" + toly_ui: + dependency: "direct main" + description: + path: "packages/toly_ui" + relative: true + source: path + version: "0.0.1" + treasure_tools: + dependency: "direct main" + description: + path: "packages/treasure_tools" + relative: true + source: path + version: "0.0.1" typed_data: dependency: transitive description: @@ -1000,5 +1021,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.2.0 <4.0.0" + dart: ">=3.2.3 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index b59d493b..993ba940 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,7 +21,6 @@ dependencies: equatable: ^2.0.5 # 相等辅助 stream_transform: ^2.1.0 - archive: ^3.4.9 # 解压 package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 webview_flutter: ^4.4.2 @@ -62,6 +61,8 @@ dependencies: path: packages/storage widgets: path: packages/widgets + draw_system: + path: packages/draw_system artifact: path: packages/artifact algorithm: @@ -74,8 +75,12 @@ dependencies: path: packages/app_update components: path: packages/components + toly_ui: + path: packages/toly_ui widget_module: path: packages/widget_module + treasure_tools: + path: packages/treasure_tools # old_fancy_mobile_ui: # path: packages/old_fancy_mobile_ui diff --git a/test/yaml_parser_test.dart b/test/yaml_parser_test.dart deleted file mode 100644 index 727198b3..00000000 --- a/test/yaml_parser_test.dart +++ /dev/null @@ -1,52 +0,0 @@ - -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; -// import 'package:yaml/yaml.dart'; -import 'package:yaml_modify/yaml_modify.dart'; - -void main(){ - final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; - File pubspecFile = File(filePath); - final String pubspec = pubspecFile.readAsStringSync(); - print(pubspec); - - // YamlEditor doc = YamlEditor(pubspec); - // print(doc); - final doc = loadYaml(pubspec); - print(doc); - - YamlList fontsList = doc['flutter']['fonts'] as YamlList; - - final modifiableDoc = getModifiableNode(doc); - final modifiableList = getModifiableNode(fontsList); - modifiableList.removeWhere((e) => e['family'] == 'TolyIcon'); - modifiableList.add( - YamlMap.wrap({ - 'family': 'TolyIcon3', - 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) - }) - ); - modifiableDoc['flutter']['fonts'] = modifiableList; - final strYaml = toYamlString(modifiableDoc); - print(modifiableList); - - // // YamlMap flutterNode = doc[]; - // doc.update('flutter', (value) { - // // YamlList fontsNode = value as YamlList; - // // List filter = fontsNode.where((e) => e['family']!='TolyIcon').toList(); - // - // return YamlMap.wrap({ - // 'family': 'TolyIcon3', - // 'fonts':YamlList.wrap([YamlMap.wrap({'asset':'assets/iconfont/iconfont.ttf'})]) - // }); - // }); - - // YamlList fontsList = doc['flutter']['fonts'] as YamlList; - // - - // // doc. - print(doc); - -} \ No newline at end of file diff --git a/test/yaml_parser_test2.dart b/test/yaml_parser_test2.dart deleted file mode 100644 index da19f887..00000000 --- a/test/yaml_parser_test2.dart +++ /dev/null @@ -1,65 +0,0 @@ - -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter_unit/code_gen/icon_font_gen/icon_font_class_parser.dart'; -// import 'package:yaml/yaml.dart'; -import 'package:yaml_modify/yaml_modify.dart'; - -void main(){ - String familyName = 'TolyIcon'; - String fontAssetsDist = 'assets/iconfont/iconfont.ttf'; - - // final String filePath = r'E:\Projects\Flutter\FlutterUnit\pubspec.yaml'; - final String filePath = r'E:\Projects\Flutter\Work\toly_image_edit\pubspec.yaml'; - File pubspecFile = File(filePath); - - List lines = pubspecFile.readAsLinesSync(); - - RegExp fontsRegex = RegExp(r'^ fonts:',multiLine: true); - bool hasFonts = fontsRegex.hasMatch(lines.join('\n')); - - if(!hasFonts){ - // 当前没有 fonts 节点,需要添加到 flutter 节点下 - int index = lines.indexWhere((e) => e.startsWith('flutter:')); - - List fonts = [ - ' fonts:', - ' - family: TolyIcon', - ' fonts:', - ' - asset: assets/iconfont/iconfont.ttf', - ]; - - lines.insertAll(index+1, fonts); - print(lines); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - // 存在 fonts 节点,查询 family ,有没有当前字体图标 - bool hasTargetFamily = false; - RegExp regExp = RegExp(r'^ +- family: +(\w+)'); - - for(int i=0;i e.startsWith(fontsRegex)); - List fonts = [ - ' - family: TolyIcon', - ' fonts:', - ' - asset: $fontAssetsDist', - ]; - lines.insertAll(index+1, fonts); - print(lines); - pubspecFile.writeAsStringSync(lines.join('\n')); - return; - } - -} \ No newline at end of file From c20a2a83572888608a090c0602b86dc79c36abcc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 11 Jan 2024 16:12:29 +0800 Subject: [PATCH 049/149] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E5=8D=87=E7=BA=A7:=E6=A1=8C=E9=9D=A2=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 993ba940..f818b491 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,8 +53,6 @@ dependencies: # file_selector: ^0.9.2+2 file_picker: ^6.1.1 - widget_repository: - path: packages/widget_repository utils: path: packages/utils storage: From 67eef209fc6bfd59bea451ce0aad7a5f416a9cdf Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 11 Jan 2024 16:13:15 +0800 Subject: [PATCH 050/149] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E5=8D=87=E7=BA=A7:=E6=A1=8C=E9=9D=A2=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.lock | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index f520d4b5..e0c8057e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -950,13 +950,6 @@ packages: relative: true source: path version: "0.0.1" - widget_repository: - dependency: "direct main" - description: - path: "packages/widget_repository" - relative: true - source: path - version: "0.0.1" widgets: dependency: "direct main" description: From 1aaa3cd83687822d499036fec0a2bf844feade07 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 18 Jan 2024 15:07:35 +0800 Subject: [PATCH 051/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0DropdownMenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StatefulWidget/DropdownMenu/node1.dart | 58 +++++++ .../StatefulWidget/DropdownMenu/node2.dart | 159 ++++++++++++++++++ .../StatefulWidget/DropdownMenu/node3.dart | 140 +++++++++++++++ pubspec.yaml | 6 +- 4 files changed, 362 insertions(+), 1 deletion(-) create mode 100644 packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart create mode 100644 packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart create mode 100644 packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart new file mode 100644 index 00000000..f9a14cc6 --- /dev/null +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 370 DropdownMenu 表单菜单 +/// 下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。 +/// link: 55 +// { +// "widgetId": 370, +// "name": '表单下拉框简单使用', +// "priority": 1, +// "subtitle": +// "【dropdownMenuEntries】 : 菜单条目列表 【List>】\n" +// "【initialSelection】 : 表单验证回调 【T?】\n" +// "【onSelected】 : 表单保存回调 【ValueChanged?】\n" +// "【menuHeight】 : 菜单高度 【double】\n" +// "【width】 : 输入框宽度 【double】", +// } +class DropdownMenuNode1 extends StatefulWidget { + const DropdownMenuNode1({super.key}); + + @override + State createState() => _DropdownMenuNode1State(); +} + +class _DropdownMenuNode1State extends State { + final List data = ['语文', '数学', '英语', '物理', '化学', '生物', '地理']; + late String _dropdownValue = data.first; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + DropdownMenu( + menuHeight: 200, + initialSelection: data.first, + onSelected: _onSelect, + dropdownMenuEntries: _buildMenuList(data), + ), + const SizedBox(height: 8,), + Text('你选择的学科是: $_dropdownValue') + ], + ); + } + + void _onSelect(String? value) { + setState(() { + _dropdownValue = value!; + }); + } + + List> _buildMenuList(List data) { + return data.map((String value) { + return DropdownMenuEntry(value: value, label: value); + }).toList(); + } +} diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart new file mode 100644 index 00000000..0e6ba80a --- /dev/null +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart @@ -0,0 +1,159 @@ +import 'package:flutter/material.dart'; +// { +// "widgetId": 370, +// "name": '下拉菜单样式设置', +// "priority": 2, +// "subtitle": +// "【controller】 : 文字输入控制器 【TextEditingController?】\n" +// "【label】 : 输入框标签 【Widget?】\n" +// "【textStyle】 : 输入框文字样式 【TextStyle?】\n" +// "【inputDecorationTheme】 : 输入框装饰主题 【InputDecorationTheme?】\n" +// "【leadingIcon】 : 左侧图标 【Widget?】\n" +// "【trailingIcon】 : 右侧为展开菜单时图标 【Widget?】\n" +// "【selectedTrailingIcon】 : 右侧展开菜单时图标 【Widget?】\n" +// "【hintText】 : 输入框提示文字 【String?】\n" +// "【helperText】 : 输入框辅助文字 【String?】\n" +// "【errorText】 : 输入框错误文字 【String?】\n" +// "【menuStyle】 : 弹出菜单样式 【MenuStyle?】", +// } +enum ColorLabel { + blue('Blue', Colors.blue), + pink('Pink', Colors.pink), + green('Green', Colors.green), + yellow('Orange', Colors.orange), + grey('Grey', Colors.grey); + + const ColorLabel(this.label, this.color); + + final String label; + final Color color; +} + + +enum IconLabel { + smile('Smile', Icons.sentiment_satisfied_outlined), + cloud('Cloud', Icons.cloud_outlined), + brush('Brush', Icons.brush_outlined), + heart('Heart', Icons.favorite); + + const IconLabel(this.label, this.icon); + + final String label; + final IconData icon; +} + +class DropdownMenuNode2 extends StatefulWidget { + const DropdownMenuNode2({super.key}); + + @override + State createState() => _DropdownMenuNode2State(); +} + +class _DropdownMenuNode2State extends State { + final TextEditingController colorController = TextEditingController(); + final TextEditingController iconController = TextEditingController(); + ColorLabel? selectedColor; + IconLabel? selectedIcon; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildColorMenu(), + const SizedBox(width: 24), + _buildLabelMenu(), + ], + ), + ), + _buildInfo() + ], + ); + } + + Widget _buildColorMenu(){ + return DropdownMenu( + initialSelection: ColorLabel.green, + controller: colorController, + requestFocusOnTap: true, + label: const Text('Color'), + width: 250, + menuHeight: 150, + menuStyle: const MenuStyle( + backgroundColor: MaterialStatePropertyAll(Colors.white), + surfaceTintColor: MaterialStatePropertyAll(Colors.white), + padding: MaterialStatePropertyAll(EdgeInsets.symmetric(vertical: 20,horizontal: 8)), + ), + onSelected: (ColorLabel? color) { + setState(() { + selectedColor = color; + }); + }, + dropdownMenuEntries: ColorLabel.values.map((ColorLabel color) { + return DropdownMenuEntry( + value: color, + label: color.label, + enabled: color.label != 'Grey', + style: MenuItemButton.styleFrom( + foregroundColor: color.color, + ), + ); + } + ).toList(), + ); + } + + Widget _buildInfo() { + if (selectedColor != null && selectedIcon != null) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('You selected a ${selectedColor?.label} ${selectedIcon?.label}'), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon( + selectedIcon?.icon, + color: selectedColor?.color, + ), + ) + ], + ); + } + return const Text('Please select a color and an icon.'); + } + + Widget _buildLabelMenu() { + return DropdownMenu( + controller: iconController, + enableFilter: false, + requestFocusOnTap: false, + leadingIcon: const Icon(Icons.search), + label: const Text('Icon'), + inputDecorationTheme: const InputDecorationTheme( + filled: true, + contentPadding: EdgeInsets.symmetric(vertical: 5.0), + ), + onSelected: (IconLabel? icon) { + setState(() { + selectedIcon = icon; + }); + }, + dropdownMenuEntries: IconLabel.values.map((IconLabel icon) { + return DropdownMenuEntry( + value: icon, + label: icon.label, + leadingIcon: Icon(icon.icon), + ); + }, + ).toList(), + ); + } +} + + + diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart new file mode 100644 index 00000000..28055d0d --- /dev/null +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; + +// { +// "widgetId": 370, +// "name": '下拉菜单自定义菜单项', +// "priority": 3, +// "subtitle": +// "可以通过 DropdownMenuEntry 的 labelWidget 定制构建菜单项。", +// } +class User { + final String name; + final bool man; + final String image; + + const User(this.name, this.man, this.image); + + @override + String toString() { + return 'User{name: $name, man: $man, image: $image}'; + } +} + +class DropdownMenuNode3 extends StatefulWidget { + const DropdownMenuNode3({ super.key }); + + @override + State createState() => _DropdownMenuNode3State(); +} + +class _DropdownMenuNode3State extends State { + late final TextEditingController controller; + + List data = const [ + User('toly', true, 'icon_5.webp'), + User('toly49', false, 'icon_6.webp'), + User('toly42', true, 'icon_7.webp'), + User('toly56', false, 'icon_8.webp'), + User('card', true, 'icon_5.webp'), + User('ls', true, 'icon_6.webp'), + User('alex', true, 'icon_7.webp'), + User('fan sha', false, 'icon_8.webp'), + ]; + + User? _selectUser; + + @override + void initState() { + super.initState(); + controller = TextEditingController(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // Created by Google Bard from 'create a lyrical phrase of about 25 words that begins with "is a color"'. + const String longText = 'is a color that sings of hope, A hue that shines like gold. It is the color of dreams, A shade that never grows old.'; + + return Scaffold( + body: Center( + child: DropdownMenu( + width: 300, + menuHeight: 250, + controller: controller, + leadingIcon: _selectUser!=null?SizedBox( + width: 26, + height: 26, + child: Center( + child: CircleAvatar( + radius: 14, + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${_selectUser!.image}'), + ), + ), + ):null, + label: const Text('选择用户'), + onSelected: (User? user) { + print('Selected $user'); + setState(() { + _selectUser = user; + + }); + }, + dropdownMenuEntries: data.map>((User user) { + final String labelText = '${user.name} $longText\n'; + return DropdownMenuEntry( + value: user, + label: user.name, + // Try commenting the labelWidget out or changing + // the labelWidget's Text parameters. + labelWidget: _UserItem(user: user), + ); + }).toList(), + ), + ), + ); + } +} +class _UserItem extends StatelessWidget { + final User user; + + const _UserItem({ + Key? key, + required this.user, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 6), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${user.image}'), + ), + const SizedBox(width: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(user.name), + Text( + '性别: ${user.man ? '男' : '女'}', + style: const TextStyle(color: Colors.grey), + ), + ], + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index f818b491..1e6e77a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -120,7 +120,11 @@ flutter: fonts: - asset: assets/fonts/CHOPS.TTF - +toly: + icon: + src_zip: '' + assets_dir: 'assets/iconfont' + file_dist: 'packages/app/lib/app/res/toly_icon.dart' From 577756b3ed453fafa1cd0fce8e4beb6ca09b822f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 28 Jan 2024 09:21:19 +0800 Subject: [PATCH 052/149] update Flutter 3.16.8 --- README.md | 8 +- lib/app/flutter_unit.dart | 12 +- lib/app_stater/bloc/bloc.dart | 2 +- lib/navigation/routers/desk_route.dart | 20 +- .../desk/flutter_unit_desk_navigation.dart | 49 +++-- .../views/desk/theme_model_switch_icon.dart | 2 +- .../views/desk/unit_desk_navigation.dart | 188 +++++++++--------- .../views/desk/unit_rail_navigation.dart | 139 +++++++------ lib/navigation/views/unit_navigation.dart | 12 -- packages/app/lib/app/i10n/l10n.dart | 3 + packages/app/lib/app/theme/app_theme.dart | 4 +- .../lib/src/gallery_card_item.dart | 6 +- packages/l10n/.gitignore | 29 +++ packages/l10n/.metadata | 10 + packages/l10n/CHANGELOG.md | 3 + packages/l10n/LICENSE | 1 + packages/l10n/README.md | 39 ++++ packages/l10n/analysis_options.yaml | 4 + packages/l10n/l10n.yaml | 3 + packages/l10n/lib/arb/app_en.arb | 6 + packages/l10n/lib/arb/app_zh.arb | 6 + packages/l10n/lib/ext.dart | 9 + .../l10n/lib/gen_l10n/app_localizations.dart | 151 ++++++++++++++ .../lib/gen_l10n/app_localizations_en.dart | 18 ++ .../lib/gen_l10n/app_localizations_zh.dart | 18 ++ packages/l10n/lib/l10n.dart | 3 + packages/l10n/pubspec.yaml | 56 ++++++ packages/l10n/test/l10n_test.dart | 6 + .../toly_ui/lib/button/feedback_widget.dart | 25 ++- .../widget_detail/widget_detail_page.dart | 3 + .../widget_detail/widget_detail_panel.dart | 27 +-- .../widget_detail/widget_node_panel.dart | 8 +- packages/widget_module/pubspec.yaml | 2 + .../DropdownMenu/desc_zh-CN.json | 13 ++ .../StatefulWidget/DropdownMenu/node1.dart | 2 +- .../StatefulWidget/DropdownMenu/node2.dart | 12 +- .../StatefulWidget/DropdownMenu/node3.dart | 74 +++---- .../StatelessWidget/Container/desc_zh-CN.json | 30 +++ .../StatelessWidget/Container/node1_base.dart | 4 +- packages/widgets/lib/exp/stateful_unit.dart | 6 +- packages/widgets/lib/widgets_map.dart | 6 + pubspec.lock | 9 +- pubspec.yaml | 3 +- 43 files changed, 744 insertions(+), 287 deletions(-) create mode 100644 packages/app/lib/app/i10n/l10n.dart create mode 100644 packages/l10n/.gitignore create mode 100644 packages/l10n/.metadata create mode 100644 packages/l10n/CHANGELOG.md create mode 100644 packages/l10n/LICENSE create mode 100644 packages/l10n/README.md create mode 100644 packages/l10n/analysis_options.yaml create mode 100644 packages/l10n/l10n.yaml create mode 100644 packages/l10n/lib/arb/app_en.arb create mode 100644 packages/l10n/lib/arb/app_zh.arb create mode 100644 packages/l10n/lib/ext.dart create mode 100644 packages/l10n/lib/gen_l10n/app_localizations.dart create mode 100644 packages/l10n/lib/gen_l10n/app_localizations_en.dart create mode 100644 packages/l10n/lib/gen_l10n/app_localizations_zh.dart create mode 100644 packages/l10n/lib/l10n.dart create mode 100644 packages/l10n/pubspec.yaml create mode 100644 packages/l10n/test/l10n_test.dart create mode 100644 packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json create mode 100644 packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json diff --git a/README.md b/README.md index e9c758d3..9b21a6b2 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,10 @@ #### 当前Flutter 版本 ``` -Flutter 3.16.5 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 78666c8dc5 (3 weeks ago) • 2023-12-19 16:14:14 -0800 -Engine • revision 3f3e560236 -Tools • Dart 3.2.3 • DevTools 2.28.4 +Flutter 3.16.8 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 67457e669f (11 days ago) • 2024-01-16 16:22:29 -0800 +Engine • revision 6e2ea58a5c +Tools • Dart 3.2.5 • DevTools 2.28.5 ``` #### 构建命令,产出应用 diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index a4211e37..aab90418 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -5,7 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_unit/navigation/routers/app_route.dart'; import 'package:go_router/go_router.dart'; - +import 'package:l10n/l10n.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: 主程序 @@ -23,7 +23,8 @@ class FlutterUnit3 extends StatelessWidget { @override Widget build(BuildContext context) { - + // Locale activeLocal = Locale('en', 'us'); + Locale activeLocal = Locale('zh', 'CN'); return BlocBuilder(builder: (_, state) { return SortStateScope( notifier: SortState(), @@ -34,10 +35,9 @@ class FlutterUnit3 extends StatelessWidget { showPerformanceOverlay: state.showPerformanceOverlay, title: StrUnit.appName, debugShowCheckedModeBanner: false, - localizationsDelegates: GlobalMaterialLocalizations.delegates, - supportedLocales: const [ - Locale('zh', 'CN'), - ], + localizationsDelegates: l10nDelegates, + supportedLocales: l10nLocales, + locale: activeLocal, themeMode: state.themeMode, darkTheme: AppTheme.darkTheme(state), theme: AppTheme.lightTheme(state), diff --git a/lib/app_stater/bloc/bloc.dart b/lib/app_stater/bloc/bloc.dart index 0e54f878..e2783af1 100644 --- a/lib/app_stater/bloc/bloc.dart +++ b/lib/app_stater/bloc/bloc.dart @@ -14,7 +14,7 @@ class AppStartBloc extends Cubit { final AppStartRepository repository = const AppStartRepository(); AppStartBloc({ - this.minStartDurationMs = 20, + this.minStartDurationMs = 600, }) : super(const AppStarting()); int _timeRecord = 0; diff --git a/lib/navigation/routers/desk_route.dart b/lib/navigation/routers/desk_route.dart index f14226e9..bf939047 100644 --- a/lib/navigation/routers/desk_route.dart +++ b/lib/navigation/routers/desk_route.dart @@ -28,9 +28,9 @@ final RouteBase appNavRoute = ShellRoute( GoRoute( path: 'detail/:name', builder: (BuildContext context, GoRouterState state) { - Object? extra= state.extra; + Object? extra = state.extra; WidgetModel? model; - if(extra is WidgetModel){ + if (extra is WidgetModel) { model = extra; } return DeskWidgetDetailPageScope( @@ -39,10 +39,9 @@ final RouteBase appNavRoute = ShellRoute( ); }, ), - ] - ), + ]), GoRoute( - path: 'gallery', + path: 'painter', builder: (BuildContext context, GoRouterState state) { return GalleryUnit(); }, @@ -62,18 +61,17 @@ final RouteBase appNavRoute = ShellRoute( GoRoute( path: 'widgets/:id', builder: (BuildContext context, GoRouterState state) { - Object? extra= state.extra; + Object? extra = state.extra; CategoryModel? model; - if(extra is CategoryModel){ + if (extra is CategoryModel) { model = extra; } - return CategoryShow( + return CategoryShow( model: model!, ); }, ), - ] - ), + ]), GoRoute( path: 'algorithm', builder: (BuildContext context, GoRouterState state) { @@ -124,4 +122,4 @@ final RouteBase appNavRoute = ShellRoute( ), ]) ], -); \ No newline at end of file +); diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart index ce58c4bc..2b0debae 100644 --- a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart +++ b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart @@ -2,14 +2,13 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/navigation/menus/menu_meta.dart'; import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; import 'unit_rail_navigation.dart'; class FlutterUnitDeskNavigation extends StatelessWidget { final Widget content; const FlutterUnitDeskNavigation({super.key, required this.content}); - - @override Widget build(BuildContext context) { return Scaffold( @@ -36,19 +35,32 @@ class _DeskNavigationRailState extends State { @override Widget build(BuildContext context) { return UnitRailNavigation( - selectedIndex: activeIndex??0, - onItemClick: _onItemClick, itemData: deskNavBarMenus, + selectedIndex: activeIndex, + onAction: _onAction, + itemData: deskNavBarMenus, ); } - final List deskNavBarMenus = const [ - MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), - MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/gallery'), - MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), - MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), - MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), - MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), - ]; + late List deskNavBarMenus; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + String widget = context.l10n.widgetCollection; + String canvas = context.l10n.paintCollection; + String knowledge = context.l10n.knowledgeCollection; + String treasure = context.l10n.treasureTools; + deskNavBarMenus = [ + MenuMeta(label: widget, icon: TolyIcon.icon_layout, path: '/widget'), + MenuMeta(label: canvas, icon: Icons.palette, path: '/painter'), + MenuMeta(label: knowledge, icon: TolyIcon.icon_artifact, path: '/knowledge'), + // MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), + MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), + MenuMeta(label: treasure, icon: TolyIcon.icon_fast, path: '/tools'), + ]; + } + + final RegExp _segReg = RegExp(r'/\w+'); @@ -62,9 +74,14 @@ class _DeskNavigationRailState extends State { return index; } - void _onItemClick(int index) { - String path = deskNavBarMenus[index].path!; - GoRouter.of(context).go(path); + void _onAction(ActionType value) { + String? path = value.path; + if(path!=null){ + if(value == ActionType.settings || value == ActionType.collection){ + context.push(path); + }else{ + context.go(path); + } + } } - } diff --git a/lib/navigation/views/desk/theme_model_switch_icon.dart b/lib/navigation/views/desk/theme_model_switch_icon.dart index 3cd9fd7a..912180dc 100644 --- a/lib/navigation/views/desk/theme_model_switch_icon.dart +++ b/lib/navigation/views/desk/theme_model_switch_icon.dart @@ -4,11 +4,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class ThemeModelSwitchIcon extends StatelessWidget { + const ThemeModelSwitchIcon({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - ThemeMode model = context.select((bloc)=>bloc.state.themeMode); bool isDark = Theme.of(context).brightness == Brightness.dark; return MouseRegion( cursor: SystemMouseCursors.click, diff --git a/lib/navigation/views/desk/unit_desk_navigation.dart b/lib/navigation/views/desk/unit_desk_navigation.dart index 382e08ff..c097d785 100644 --- a/lib/navigation/views/desk/unit_desk_navigation.dart +++ b/lib/navigation/views/desk/unit_desk_navigation.dart @@ -1,94 +1,94 @@ -import 'package:algorithm/algorithm.dart'; -import 'package:app/app.dart'; -import 'package:artifact/artifact.dart'; -import 'package:draw_system/draw_system.dart'; -import 'package:flutter/material.dart'; -import 'package:treasure_tools/treasure_tools.dart'; -import 'package:widget_module/views/mobile/widget_page/home_drawer.dart'; -import 'package:widget_module/widget_module.dart'; -import '../../menus/menu_meta.dart'; -import 'unit_rail_navigation.dart'; - -class UnitDeskNavigation extends StatefulWidget { - - const UnitDeskNavigation(); - - @override - _UnitDeskNavigationState createState() => _UnitDeskNavigationState(); - -} - -class _UnitDeskNavigationState extends State { - late PageController _controller; //页面控制器,初始0 - int _currentIndex = 0; - - @override - void initState() { - super.initState(); - _controller = PageController(); - - // ActionUnit.searchAction.onSearch = () { - // Navigator.of(context).pushNamed(UnitRouter.search); - // }; - } - - @override - void dispose() { - _controller.dispose(); //释放控制器 - super.dispose(); - } - - // 构建悬浮按钮工具 - // Widget wrapOverlayTool({required Widget child}) => Builder( - // builder: (ctx) => OverlayToolWrapper( - // child: child, - // )); - final List deskNavBarMenus = const [ - MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), - MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/draw'), - MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), - MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), - MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), - MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), - ]; - @override - Widget build(BuildContext context) { - return Scaffold( - drawer: const HomeDrawer(), - endDrawer: const HomeRightDrawer(), - body: Row( - children: [ - UnitRailNavigation( - selectedIndex: _currentIndex, - onItemClick: _onItemClick, itemData: deskNavBarMenus - ), - // _buildLeftNav(), - Expanded( - child: PageView( - physics: const NeverScrollableScrollPhysics(), - //使用PageView实现页面的切换 - controller: _controller, - children: const [ - DeskWidgetPanel(), - CollectPageAdapter(), - GalleryUnit(), - DeskSortPage(), - CodeGenPage(), - DeskPointPage(), - ], - ), - ), - ], - ), - ); - } - - void _onItemClick(int value) { - _currentIndex = value; - _controller.jumpToPage(_currentIndex); - setState(() { - - }); - } -} - +// import 'package:algorithm/algorithm.dart'; +// import 'package:app/app.dart'; +// import 'package:artifact/artifact.dart'; +// import 'package:draw_system/draw_system.dart'; +// import 'package:flutter/material.dart'; +// import 'package:treasure_tools/treasure_tools.dart'; +// import 'package:widget_module/views/mobile/widget_page/home_drawer.dart'; +// import 'package:widget_module/widget_module.dart'; +// import '../../menus/menu_meta.dart'; +// import 'unit_rail_navigation.dart'; +// +// class UnitDeskNavigation extends StatefulWidget { +// +// const UnitDeskNavigation(); +// +// @override +// _UnitDeskNavigationState createState() => _UnitDeskNavigationState(); +// +// } +// +// class _UnitDeskNavigationState extends State { +// late PageController _controller; //页面控制器,初始0 +// int _currentIndex = 0; +// +// @override +// void initState() { +// super.initState(); +// _controller = PageController(); +// +// // ActionUnit.searchAction.onSearch = () { +// // Navigator.of(context).pushNamed(UnitRouter.search); +// // }; +// } +// +// @override +// void dispose() { +// _controller.dispose(); //释放控制器 +// super.dispose(); +// } +// +// // 构建悬浮按钮工具 +// // Widget wrapOverlayTool({required Widget child}) => Builder( +// // builder: (ctx) => OverlayToolWrapper( +// // child: child, +// // )); +// final List deskNavBarMenus = const [ +// MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), +// MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/draw'), +// MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), +// MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), +// MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), +// MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), +// ]; +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// drawer: const HomeDrawer(), +// endDrawer: const HomeRightDrawer(), +// body: Row( +// children: [ +// UnitRailNavigation( +// selectedIndex: _currentIndex, +// onItemClick: _onItemClick, itemData: deskNavBarMenus +// ), +// // _buildLeftNav(), +// Expanded( +// child: PageView( +// physics: const NeverScrollableScrollPhysics(), +// //使用PageView实现页面的切换 +// controller: _controller, +// children: const [ +// DeskWidgetPanel(), +// CollectPageAdapter(), +// GalleryUnit(), +// DeskSortPage(), +// CodeGenPage(), +// DeskPointPage(), +// ], +// ), +// ), +// ], +// ), +// ); +// } +// +// void _onItemClick(int value) { +// _currentIndex = value; +// _controller.jumpToPage(_currentIndex); +// setState(() { +// +// }); +// } +// } +// diff --git a/lib/navigation/views/desk/unit_rail_navigation.dart b/lib/navigation/views/desk/unit_rail_navigation.dart index 83d79c07..37dd3098 100644 --- a/lib/navigation/views/desk/unit_rail_navigation.dart +++ b/lib/navigation/views/desk/unit_rail_navigation.dart @@ -7,19 +7,36 @@ import 'package:url_launcher/url_launcher.dart'; import '../../../navigation/menus/menu_meta.dart'; +enum ActionType{ + widgets(path: '/widget'), + painter(path: '/painter'), + knowledge(path: '/knowledge'), + + algorithm(path: '/algorithm'), + tools(path: '/tools'), + + toggleDarkTheme(), + settings(path: '/settings'), + collection(path: '/collection'); + final String? path; + + const ActionType({this.path}); +} + class UnitRailNavigation extends StatefulWidget { - final ValueChanged onItemClick; - final int selectedIndex; + final ValueChanged onAction; + + final int? selectedIndex; + // final Map itemData; final List itemData; - - const UnitRailNavigation( - {Key? key, - required this.onItemClick, - required this.selectedIndex, - required this.itemData}) - : super(key: key); + const UnitRailNavigation({ + Key? key, + required this.onAction, + required this.selectedIndex, + required this.itemData, + }) : super(key: key); @override State createState() => _UnitRailNavigationState(); @@ -52,12 +69,11 @@ class _UnitRailNavigationState extends State _destinationAnimations = _destinationControllers .map((AnimationController controller) => controller.view) .toList(); - _destinationControllers[widget.selectedIndex].value = 1.0; + _destinationControllers[widget.selectedIndex??0].value = 1.0; } void _rebuild() { - setState(() { - }); + setState(() {}); } @override @@ -70,8 +86,9 @@ class _UnitRailNavigationState extends State } if (widget.selectedIndex != oldWidget.selectedIndex) { - _destinationControllers[oldWidget.selectedIndex].reverse(); - _destinationControllers[widget.selectedIndex].forward(); + _destinationControllers[oldWidget.selectedIndex??0].reverse(); + + _destinationControllers[widget.selectedIndex??0].forward(); return; } } @@ -89,14 +106,14 @@ class _UnitRailNavigationState extends State @override Widget build(BuildContext context) { - Color? divColor = Theme.of(context).dividerTheme.color; + Color? divColor = Theme.of(context).dividerTheme.color; return DragToMoveAreaNoDouble( child: Container( padding: const EdgeInsets.only(top: 20), alignment: Alignment.topCenter, margin: const EdgeInsets.only(right: 1), width: 130, - decoration: BoxDecoration(color: Color(0xff2C3036), boxShadow: [ + decoration: BoxDecoration(color: Color(0xff2C3036), boxShadow: [ BoxShadow(color: divColor!, offset: Offset(1, 0), blurRadius: 2) ]), child: Column( @@ -125,28 +142,26 @@ class _UnitRailNavigationState extends State Expanded( flex: 5, child: Padding( - padding: const EdgeInsets.only(top: 24), + padding: const EdgeInsets.only(top: 24), //const Size(120, 35) child: Column( - // mainAxisSize: MainAxisSize.min, - children: info - .asMap() - .keys - .map((int index) => _UnitRailMenu( - animation: _destinationControllers[index], - onTap: () { - widget.onItemClick.call(index); - }, - selected: widget.selectedIndex == index, - width: 130, - height: 42, - activeColor: Theme.of(context).primaryColor, - inactiveColor: Colors.white.withAlpha(33), - icon: icons[index], - label: info[index], - )) - .toList(), - )), + // mainAxisSize: MainAxisSize.min, + children: info + .asMap() + .keys + .map((int index) => _UnitRailMenu( + animation: _destinationControllers[index], + onTap: () => widget.onAction(ActionType.values[index]), + selected: widget.selectedIndex == index, + width: 130, + height: 42, + activeColor: Theme.of(context).primaryColor, + inactiveColor: Colors.white.withAlpha(33), + icon: icons[index], + label: info[index], + )) + .toList(), + )), ), Expanded( child: Container(), @@ -157,23 +172,32 @@ class _UnitRailNavigationState extends State color: Colors.white, height: 1, ), - Wrap( spacing: 12, children: [ - const ThemeModelSwitchIcon(), - Builder( - builder: (ctx) => FeedbackWidget( - onPressed: () => context.push('/settings'), - child: const Padding( - padding: EdgeInsets.only(bottom: 16, top: 16), - child: Icon( - Icons.settings, - color: Colors.white, - ), + FeedbackWidget( + onPressed: () => widget.onAction(ActionType.settings), + child: const Padding( + padding: EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + Icons.settings, + color: Colors.white, + ), + ), + ), + FeedbackWidget( + onPressed: () => widget.onAction(ActionType.collection), + child: const Padding( + padding: EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + TolyIcon.icon_collect, + color: Colors.white, ), ), ), + + const ThemeModelSwitchIcon(), + ], ), ], @@ -212,8 +236,6 @@ class _UnitRailNavigationState extends State color: Colors.white, ), ), - - ], ), ); @@ -239,7 +261,7 @@ class _UnitRailMenu extends StatefulWidget { final String label; final Animation animation; - _UnitRailMenu({ + _UnitRailMenu({ Key? key, required this.onTap, required this.selected, @@ -260,13 +282,13 @@ class _UnitRailMenuState extends State<_UnitRailMenu> { @override Widget build(BuildContext context) { return Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - child:MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: widget.onTap, - child: AnimatedBuilder( + alignment: Alignment.topLeft, + margin: const EdgeInsets.only(top: 10), + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: widget.onTap, + child: AnimatedBuilder( animation: widget.animation, builder: (BuildContext context, Widget? child) => _buildItem(), ), @@ -274,7 +296,8 @@ class _UnitRailMenuState extends State<_UnitRailMenu> { ); } - late ColorTween colorTween = ColorTween(begin: widget.inactiveColor, end: widget.activeColor); + late ColorTween colorTween = + ColorTween(begin: widget.inactiveColor, end: widget.activeColor); Widget _buildItem() { double iconSize = _sizeTween.transform(widget.animation.value); diff --git a/lib/navigation/views/unit_navigation.dart b/lib/navigation/views/unit_navigation.dart index 0e6cb445..953e7573 100644 --- a/lib/navigation/views/unit_navigation.dart +++ b/lib/navigation/views/unit_navigation.dart @@ -20,18 +20,6 @@ import '../../navigation/views/desk/unit_desk_navigation.dart'; /// contact me by email 1981462002@qq.com /// 说明: 主题结构 左右滑页 + 底部导航栏 -class UnitNavigation extends StatelessWidget { - const UnitNavigation({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const PlatformViewAdapter( - mobile: UnitPhoneNavigation(), - desk: UnitDeskNavigation(), - ); - } -} - class UnitPhoneNavigation extends StatefulWidget { const UnitPhoneNavigation({Key? key}) : super(key: key); diff --git a/packages/app/lib/app/i10n/l10n.dart b/packages/app/lib/app/i10n/l10n.dart new file mode 100644 index 00000000..e887bb65 --- /dev/null +++ b/packages/app/lib/app/i10n/l10n.dart @@ -0,0 +1,3 @@ +import 'package:flutter/widgets.dart'; + + diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index d791c134..c6e9bea4 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -34,7 +34,7 @@ class AppTheme { dividerColor: Colors.transparent, ), fontFamily: state.fontFamily, - useMaterial3:useMaterial3, + useMaterial3:true, brightness: Brightness.dark, primaryColor: const Color(0xff4699FB), listTileTheme: ListTileThemeData( @@ -76,7 +76,7 @@ class AppTheme { fontFamily: state.fontFamily, primaryColor: state.themeColor, scaffoldBackgroundColor: Color(0xffF3F4F6), - useMaterial3: useMaterial3, + useMaterial3: true, // Android 使用 Material3 chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), listTileTheme: ListTileThemeData( diff --git a/packages/draw_system/lib/src/gallery_card_item.dart b/packages/draw_system/lib/src/gallery_card_item.dart index 131df6e7..3cd7bb9e 100644 --- a/packages/draw_system/lib/src/gallery_card_item.dart +++ b/packages/draw_system/lib/src/gallery_card_item.dart @@ -57,7 +57,7 @@ class GalleryCardItem extends StatelessWidget { Text( galleryInfo.name, style: TextStyle( - fontSize: 20, + fontSize: 18, fontWeight: FontWeight.bold, shadows: [ Shadow( @@ -83,11 +83,11 @@ class GalleryCardItem extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(left: 15, right: 15, top: 8), + padding: const EdgeInsets.only(left: 15, right: 15, top: 6), child: Text( galleryInfo.info, style: TextStyle( - fontSize: 14, + fontSize: 12, color: isDark?Colors.white:Colors.grey, shadows: [ Shadow( color: Theme.of(context).primaryColor, diff --git a/packages/l10n/.gitignore b/packages/l10n/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/l10n/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/l10n/.metadata b/packages/l10n/.metadata new file mode 100644 index 00000000..b2c661a5 --- /dev/null +++ b/packages/l10n/.metadata @@ -0,0 +1,10 @@ +# 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: "67457e669f79e9f8d13d7a68fe09775fefbb79f4" + channel: "stable" + +project_type: package diff --git a/packages/l10n/CHANGELOG.md b/packages/l10n/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/l10n/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/l10n/LICENSE b/packages/l10n/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/l10n/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/l10n/README.md b/packages/l10n/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/l10n/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/l10n/analysis_options.yaml b/packages/l10n/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/l10n/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/l10n/l10n.yaml b/packages/l10n/l10n.yaml new file mode 100644 index 00000000..7f84daf8 --- /dev/null +++ b/packages/l10n/l10n.yaml @@ -0,0 +1,3 @@ +arb-dir: lib/arb +template-arb-file: app_zh.arb +output-localization-file: app_localizations.dart \ No newline at end of file diff --git a/packages/l10n/lib/arb/app_en.arb b/packages/l10n/lib/arb/app_en.arb new file mode 100644 index 00000000..cef7d214 --- /dev/null +++ b/packages/l10n/lib/arb/app_en.arb @@ -0,0 +1,6 @@ +{ + "widgetCollection": "Widgets", + "paintCollection": "Painter", + "knowledgeCollection": "Knowledge", + "treasureTools": "Treasure" +} \ No newline at end of file diff --git a/packages/l10n/lib/arb/app_zh.arb b/packages/l10n/lib/arb/app_zh.arb new file mode 100644 index 00000000..b7fb8417 --- /dev/null +++ b/packages/l10n/lib/arb/app_zh.arb @@ -0,0 +1,6 @@ +{ + "widgetCollection": "组件集录", + "paintCollection": "绘制集录", + "knowledgeCollection": "知识集锦", + "treasureTools": "工具宝箱" +} \ No newline at end of file diff --git a/packages/l10n/lib/ext.dart b/packages/l10n/lib/ext.dart new file mode 100644 index 00000000..2d5fb903 --- /dev/null +++ b/packages/l10n/lib/ext.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'gen_l10n/app_localizations.dart'; + +const l10nDelegates = AppLocalizations.localizationsDelegates; +const l10nLocales = AppLocalizations.supportedLocales; + +extension AppLocalizationsX on BuildContext { + AppLocalizations get l10n => AppLocalizations.of(this)!; +} diff --git a/packages/l10n/lib/gen_l10n/app_localizations.dart b/packages/l10n/lib/gen_l10n/app_localizations.dart new file mode 100644 index 00000000..109a79c1 --- /dev/null +++ b/packages/l10n/lib/gen_l10n/app_localizations.dart @@ -0,0 +1,151 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_en.dart'; +import 'app_localizations_zh.dart'; + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'gen_l10n/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('zh') + ]; + + /// No description provided for @widgetCollection. + /// + /// In zh, this message translates to: + /// **'组件集录'** + String get widgetCollection; + + /// No description provided for @paintCollection. + /// + /// In zh, this message translates to: + /// **'绘制集录'** + String get paintCollection; + + /// No description provided for @knowledgeCollection. + /// + /// In zh, this message translates to: + /// **'知识集锦'** + String get knowledgeCollection; + + /// No description provided for @treasureTools. + /// + /// In zh, this message translates to: + /// **'工具宝箱'** + String get treasureTools; +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return AppLocalizationsEn(); + case 'zh': return AppLocalizationsZh(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/packages/l10n/lib/gen_l10n/app_localizations_en.dart b/packages/l10n/lib/gen_l10n/app_localizations_en.dart new file mode 100644 index 00000000..d621bd39 --- /dev/null +++ b/packages/l10n/lib/gen_l10n/app_localizations_en.dart @@ -0,0 +1,18 @@ +import 'app_localizations.dart'; + +/// The translations for English (`en`). +class AppLocalizationsEn extends AppLocalizations { + AppLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get widgetCollection => 'Widgets'; + + @override + String get paintCollection => 'Painter'; + + @override + String get knowledgeCollection => 'Knowledge'; + + @override + String get treasureTools => 'Treasure'; +} diff --git a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart new file mode 100644 index 00000000..e94ba26b --- /dev/null +++ b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -0,0 +1,18 @@ +import 'app_localizations.dart'; + +/// The translations for Chinese (`zh`). +class AppLocalizationsZh extends AppLocalizations { + AppLocalizationsZh([String locale = 'zh']) : super(locale); + + @override + String get widgetCollection => '组件集录'; + + @override + String get paintCollection => '绘制集录'; + + @override + String get knowledgeCollection => '知识集锦'; + + @override + String get treasureTools => '工具宝箱'; +} diff --git a/packages/l10n/lib/l10n.dart b/packages/l10n/lib/l10n.dart new file mode 100644 index 00000000..f2a066bd --- /dev/null +++ b/packages/l10n/lib/l10n.dart @@ -0,0 +1,3 @@ +library l10n; +export 'ext.dart'; + diff --git a/packages/l10n/pubspec.yaml b/packages/l10n/pubspec.yaml new file mode 100644 index 00000000..4e32e8f4 --- /dev/null +++ b/packages/l10n/pubspec.yaml @@ -0,0 +1,56 @@ +name: l10n +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.2.5 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.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 packages. +flutter: + generate: true # 自动生成 l10n + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/l10n/test/l10n_test.dart b/packages/l10n/test/l10n_test.dart new file mode 100644 index 00000000..a3097625 --- /dev/null +++ b/packages/l10n/test/l10n_test.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:l10n/l10n.dart'; + +void main() { +} diff --git a/packages/toly_ui/lib/button/feedback_widget.dart b/packages/toly_ui/lib/button/feedback_widget.dart index f46e1c0c..d26525c0 100644 --- a/packages/toly_ui/lib/button/feedback_widget.dart +++ b/packages/toly_ui/lib/button/feedback_widget.dart @@ -73,17 +73,20 @@ class _FeedBackState extends State with SingleTickerProviderStat @override Widget build(BuildContext context) { - return GestureDetector( - onLongPress: widget.onLongPressed, - onTap: () { - _controller.forward(); - widget.onPressed?.call(); - }, - child: AnimatedBuilder( - animation: _controller, - child: widget.child, - builder: (ctx, child) => _buildByMode(child, widget.mode), - )); + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onLongPress: widget.onLongPressed, + onTap: () { + _controller.forward(); + widget.onPressed?.call(); + }, + child: AnimatedBuilder( + animation: _controller, + child: widget.child, + builder: (ctx, child) => _buildByMode(child, widget.mode), + )), + ); } Widget _buildByMode(Widget? child, FeedMode mode) { diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 75635172..edd21a3b 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -118,6 +118,7 @@ class DeskWidgetDetailPage extends StatelessWidget{ child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + const SizedBox(height: 16,), linkText, if (state is DetailWithData) LinkWidgetButtons( @@ -149,7 +150,9 @@ class DeskWidgetDetailPage extends StatelessWidget{ Widget _buildSliverNodeList( BuildContext context, List nodes, WidgetModel model) { AppConfigState globalState = BlocProvider.of(context).state; + return SliverList( + delegate: SliverChildBuilderDelegate( (_, i) => DeskWidgetNodePanel( codeStyle: globalState.codeStyle, diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index 9784f0ad..c6346a38 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -11,17 +11,20 @@ class DeskWidgetDetailPanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - _buildLeft(model, context), - _buildRight(model), - ], - ), - // const Divider(), - ], + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8,vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + _buildLeft(model, context), + _buildRight(model), + ], + ), + // const Divider(), + ], + ), ); } @@ -29,7 +32,7 @@ class DeskWidgetDetailPanel extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, + color: Color(0x33E5EAE1), child: Text(model.info)), ), ); diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart index 274e04ca..6d5a967d 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart @@ -49,12 +49,13 @@ class _DeskWidgetNodePanelState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ buildNodeTitle(), + const SizedBox( height: 20, ), _buildCode(context), Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Center( @@ -69,6 +70,7 @@ class _DeskWidgetNodePanelState extends State { ], ), + const SizedBox(height: 16,), const Divider(), ], @@ -92,14 +94,14 @@ class _DeskWidgetNodePanelState extends State { ), ), _buildShareButton(), - _buildCodeButton() + _buildCodeButton(), ], ); Widget _buildNodeInfo() => SizedBox( width: double.infinity, child: Panel( - color: Theme.of(context).appBarTheme.backgroundColor, + color: Color(0x33E5EAE1), child: Text( widget.subText, style: const TextStyle(fontSize: 12), diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index b4ff2970..a24b5d1e 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -29,6 +29,8 @@ dependencies: path: ../authentication app: path: ../app + l10n: + path: ../l10n widgets: path: ../widgets utils: diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json b/packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json new file mode 100644 index 00000000..6b0653de --- /dev/null +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json @@ -0,0 +1,13 @@ +{ + "id": 1, + "name": "DropdownMenu", + "localName": "下拉菜单", + "info": "下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。", + "lever": 4, + "family": 1, + "linkWidget": [55, 54], + "nodes": [ + + ] +} + diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart index f9a14cc6..d8e6ad84 100644 --- a/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; /// link: 55 // { // "widgetId": 370, -// "name": '表单下拉框简单使用', +// "name": '下拉菜单的简单使用', // "priority": 1, // "subtitle": // "【dropdownMenuEntries】 : 菜单条目列表 【List>】\n" diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart index 0e6ba80a..5a667c45 100644 --- a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart @@ -61,16 +61,17 @@ class _DropdownMenuNode2State extends State { mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: const EdgeInsets.symmetric(vertical: 20), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, + padding: const EdgeInsets.symmetric(vertical: 20,horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ _buildColorMenu(), - const SizedBox(width: 24), + const SizedBox(height: 16), _buildLabelMenu(), ], ), ), + const SizedBox(height: 8), _buildInfo() ], ); @@ -82,7 +83,7 @@ class _DropdownMenuNode2State extends State { controller: colorController, requestFocusOnTap: true, label: const Text('Color'), - width: 250, + width: 160, menuHeight: 150, menuStyle: const MenuStyle( backgroundColor: MaterialStatePropertyAll(Colors.white), @@ -132,6 +133,7 @@ class _DropdownMenuNode2State extends State { controller: iconController, enableFilter: false, requestFocusOnTap: false, + width: 160, leadingIcon: const Icon(Icons.search), label: const Text('Icon'), inputDecorationTheme: const InputDecorationTheme( diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart index 28055d0d..4be9d7fa 100644 --- a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart @@ -57,47 +57,39 @@ class _DropdownMenuNode3State extends State { @override Widget build(BuildContext context) { - // Created by Google Bard from 'create a lyrical phrase of about 25 words that begins with "is a color"'. - const String longText = 'is a color that sings of hope, A hue that shines like gold. It is the color of dreams, A shade that never grows old.'; - - return Scaffold( - body: Center( - child: DropdownMenu( - width: 300, - menuHeight: 250, - controller: controller, - leadingIcon: _selectUser!=null?SizedBox( - width: 26, - height: 26, - child: Center( - child: CircleAvatar( - radius: 14, - foregroundColor: Colors.transparent, - backgroundImage: - AssetImage('assets/images/head_icon/${_selectUser!.image}'), - ), - ), - ):null, - label: const Text('选择用户'), - onSelected: (User? user) { - print('Selected $user'); - setState(() { - _selectUser = user; - - }); - }, - dropdownMenuEntries: data.map>((User user) { - final String labelText = '${user.name} $longText\n'; - return DropdownMenuEntry( - value: user, - label: user.name, - // Try commenting the labelWidget out or changing - // the labelWidget's Text parameters. - labelWidget: _UserItem(user: user), - ); - }).toList(), + return DropdownMenu( + width: 300, + menuHeight: 250, + controller: controller, + leadingIcon: _selectUser!=null?SizedBox( + width: 26, + height: 26, + child: Center( + child: CircleAvatar( + radius: 14, + foregroundColor: Colors.transparent, + backgroundImage: + AssetImage('assets/images/head_icon/${_selectUser!.image}'), + ), ), - ), + ):null, + label: const Text('选择用户'), + onSelected: (User? user) { + print('Selected $user'); + setState(() { + _selectUser = user; + + }); + }, + dropdownMenuEntries: data.map>((User user) { + return DropdownMenuEntry( + value: user, + label: user.name, + // Try commenting the labelWidget out or changing + // the labelWidget's Text parameters. + labelWidget: _UserItem(user: user), + ); + }).toList(), ); } } @@ -128,7 +120,7 @@ class _UserItem extends StatelessWidget { children: [ Text(user.name), Text( - '性别: ${user.man ? '男' : '女'}', + '性别:'+ (user.man ? '男' : '女'), style: const TextStyle(color: Colors.grey), ), ], diff --git a/packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json b/packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json new file mode 100644 index 00000000..ee325d64 --- /dev/null +++ b/packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 1, + "name": "Container", + "localName": "容器组件", + "info": "用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...", + "lever": 5, + "family": 0, + "linkWidget": [74,85,80,78,70,123], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可用于显示一个指定宽高的区域", + "desc": [ + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "可以在区域中放入一个子组件", + "desc": [ + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】: 外边距 【EdgeInsetsGeometry】", + "【child】: 子组件 【Widget】" + ] + } + ] +} + diff --git a/packages/widgets/lib/StatelessWidget/Container/node1_base.dart b/packages/widgets/lib/StatelessWidget/Container/node1_base.dart index eee3ff0f..9caa7552 100644 --- a/packages/widgets/lib/StatelessWidget/Container/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/Container/node1_base.dart @@ -8,8 +8,8 @@ import 'package:flutter/material.dart'; // "name": '可用于显示一个指定宽高的区域', // "priority": 1, // "subtitle": "【width】 : 宽 【int】\n" -// "【高】: 外边距 【int】\n" -// "【color】: 子组件 【Color】", +// "【height】: 高 【int】\n" +// "【color】: 颜色 【Color】", // } class CustomContainer extends StatelessWidget { const CustomContainer({Key? key}) : super(key: key); diff --git a/packages/widgets/lib/exp/stateful_unit.dart b/packages/widgets/lib/exp/stateful_unit.dart index aa7f8574..91f36040 100644 --- a/packages/widgets/lib/exp/stateful_unit.dart +++ b/packages/widgets/lib/exp/stateful_unit.dart @@ -51,7 +51,6 @@ export '../StatefulWidget/Slider/node2_lable.dart'; export '../StatefulWidget/Switch/node1_base.dart'; export '../StatefulWidget/Switch/node2_image.dart'; export '../StatefulWidget/StatefulBuilder/node1_base.dart'; -export '../StatefulWidget/TextField/node3_decoration.dart'; export '../StatefulWidget/RefreshIndicator/node1_base.dart'; export '../StatefulWidget/SelectableText/node1_base.dart'; export '../StatefulWidget/SelectableText/node2_align.dart'; @@ -113,8 +112,11 @@ export '../StatefulWidget/Ink/node1_base.dart'; export '../StatefulWidget/Ink/node2_image.dart'; export '../StatefulWidget/InkResponse/node1_base.dart'; -export '../StatefulWidget/InkResponse/node2_color.dart'; +export '../StatefulWidget/InkResponse/node2_color.dart'; +export '../StatefulWidget/DropdownMenu/node1.dart'; +export '../StatefulWidget/DropdownMenu/node2.dart'; +export '../StatefulWidget/DropdownMenu/node3.dart'; export '../StatefulWidget/InkWell/node1_base.dart'; export '../StatefulWidget/InkWell/node2_color.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index b5c79626..878a8dd1 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -21,6 +21,12 @@ class WidgetsMap { const ContainerTransform(), const ContainerConstraints() ]; + case "DropdownMenu": + return [ + const DropdownMenuNode1(), + const DropdownMenuNode2(), + const DropdownMenuNode3(), + ]; case "CupertinoSegmentedControl": return [ const CupertinoSegmentedControlDemo(), diff --git a/pubspec.lock b/pubspec.lock index e0c8057e..ddb6543b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -358,6 +358,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" + l10n: + dependency: "direct main" + description: + path: "packages/l10n" + relative: true + source: path + version: "0.0.1" lints: dependency: transitive description: @@ -1014,5 +1021,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.2.3 <4.0.0" + dart: ">=3.2.5 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1e6e77a1..01eadacb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,7 +52,8 @@ dependencies: flutter_markdown: ^0.6.4 # markdown # file_selector: ^0.9.2+2 file_picker: ^6.1.1 - + l10n: + path: packages/l10n utils: path: packages/utils storage: From a6363bab5dcf6123faa93b6298aee82474d94e22 Mon Sep 17 00:00:00 2001 From: acsweets Date: Wed, 31 Jan 2024 13:50:51 +0800 Subject: [PATCH 053/149] =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/l10n/lib/arb/app_en.arb | 146 ++++++++++++++++++++++++++++++- packages/l10n/lib/arb/app_zh.arb | 146 ++++++++++++++++++++++++++++++- 2 files changed, 290 insertions(+), 2 deletions(-) diff --git a/packages/l10n/lib/arb/app_en.arb b/packages/l10n/lib/arb/app_en.arb index cef7d214..22c039a0 100644 --- a/packages/l10n/lib/arb/app_en.arb +++ b/packages/l10n/lib/arb/app_en.arb @@ -2,5 +2,149 @@ "widgetCollection": "Widgets", "paintCollection": "Painter", "knowledgeCollection": "Knowledge", - "treasureTools": "Treasure" + "collectCollection": "CollectionCollection", + "essentialCollection": "KeypointsCollection", + "treasureTools": "Treasure", + "anamorphic":"Anamorphic", + "stateful":"Stateful", + "singleShading":"Single shading", + "multiShading":"Multi shading", + "slidePlate":"Slide plate", + "agent":"Agent", + "other":"Other", + "favorite":"Favorite", + "enterComponentName":"Enter component name", + "containerComponents":"Container components", + "relatedComponents":"Related components", + "componentTavern":"Component Tavern", + "cherishedComponents":"Treasure components", + "textImageCollection":"TextImageCollection", + "layoutCollection":"LayoutCollection", + "eventCollection":"EventCollection", + "animationCollection":"AnimationCollection", + "slidingCollection":"SlidingCollection", + "decorationCollection":"DecorativeCollection", + "assemblyCollection":"AssemblyCollection", + "functionCollection":"FeatureCollection", + "popupCollection":"Pop upCollection", + "themeCollection":"ThemeCollection", + "derivativeCollection":"DerivativeCollection", + "hardToCategorize":"It's hard to distinguish", + "basicDrawing":"Basic drawing", + "animationGesture":"Animated gestures", + "particleDrawing":"Particle drawing", + "interestingDrawing":"Fun drawing", + "artGallery":"Art galleries ", + "drawingOfImages":"This example explains how to draw images: by loading images and drawing image resources to a specified area. Draw a batch of 45 \"angled grid lines on the upper layer to practice drawing the lines ", + "digitalDisplayTube":"This example introduces how to draw LED digital display tubes to practice the use, transformation, combination of path paths, and knowledge of component packaging. It is a very good drawing case ", + "pathDrawing":"This example introduces how to perform simple path drawing, rotate the drawing board, and combine animation to make the windmill rotate. This is a very concise case of combining drawing and animation. ", + "gridCoordinateSystem":"This example explains how to use line diameter and text to draw a grid coordinate system, and encapsulate the drawn objects for easy reuse. The coordinate system also provides reference during drawing, which is essential for beginners.", + "polarCoordinateSystemOfFaces":"This example explains how to use a polar coordinate system to draw a plane and collect polar coordinates based on a function equation for drawing. ", + "drawFunctionCurvesForPathPairs":"This example explains how to use a path to draw a function curve, fitting a small number of points on the function curve through a Bessel curve. ", + "drawRegularPolygons":"This example introduces how to collect points in a circle and draw regular polygons, which is a good example for practicing drawing and forming paths. \n Special operations:+, - Modify the number of edges", + "randomNumberProcessing":"This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data.", + "clockDrawing":"This example uses the drawing of a clock to practice the drawing technique of rotating scale types in Flutter, and uses animation to rotate the dial pointer.", + "drawSprings":" This example introduces how to draw a spring, stretch and compress it vertically through the contact points, and restore the animation when releasing it. It is a good comprehensive small case. Special operation: Drag the telescopic spring up and down ", + "theApplicationOfAnglesInDrawing":"This example explains how to perform rotational motion based on a point as the center. Learn the application of the angle between two points in drawing. \n Special operation: Click to run", + "usingShadersAndFilters":"This example explains how to use shaders and filters in painting, and achieve a rotating streamer effect through animation with numerical variations.", + "pathDrawingFunctionCurve":"This example explains how to use path to draw function curves and use path measurement for animation", + "thePathOfBingDwenDwen":"This sample will draw the path of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics and use path measurement for animation. \n Special operation: Click to run", + "drawCubicBesselCurve":"This example introduces how to draw a cubic Bezier curve, determine whether a point is activated through the contacts, and use this to control the position of the point to achieve drag control effect. \n Special operation: Click on the drawing point, double-click to clear it", + "theEffectOfAnimationCurve":"This example provides an intuitive way to examine the effect of animation curves, allowing everyone to have a deeper understanding of animation. \n Special operation: Click to run", + "randomParticlesAndBoundaryBouncing":"This example introduces how to create random particles and handle boundary bounce logic, which is a great starting point for learning particle motion. Special operation: click to stop running ", + "particleCollision":"This example introduces how to perform collision detection on a particle and split multiple particles, which is an interesting case. \n Special operation: Click Reset", + "particle":"This example introduces using particles to represent images and animating them to achieve explosive effects. \nSpecial operation: Click to run", + "rectangleAndRandomNumbers":"This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data. \nSpecial operation: Click to randomly generate", + "bingDwenDwen":"This example is to draw the shape of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics, from which you can learn knowledge such as path drawing and gradient colors.", + "pufengInjectionTest":"This sample implements the testing process of the Pufeng needle injection test, estimating pi based on probability. You can learn some drawing tips and logical processing of data.", + "ticTacToe ":"This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset", + "tiled-lines":"The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "joy-division":"The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "cubic-disarray":"The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "triangular-mesh":"The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "un-deux-trois": "The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "circle-packing":"The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "hypnotic-squares":"The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "piet-mondrian":"The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "downloadCompressedPackage":"Usage: \n1. Select the icon in iconfont.cn, add the project, and download the compressed file. \n2. Select the Flutter project address, configure resource and product file locations. \n3.Click the Generate Code button to generate the relevant code.", + "QAIssues":"The QA data in the key points collection is included in FlutterUnit's issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.", + "tips:":"tips:", + "visualSorting":"Visual sorting", + "visual":"Visual sorting", + "insertion": "Insert sorting", + "bubble": "Bubble sorting", + "cocktail": "Cocktail sorting (bidirectional bubble sorting)", + "comb": "Comb sorting", + "pigeonHole": "Pigeonhole sorting ", + "shell": "Shell sorting ", + "selection": "Select sorting", + "gnome": "Dwarf Sorting", + "cycle": "Circular sorting", + "heap": "Heap sorting", + "quick": "Quick sorting", + "merge": "Merge sorting", + "sortingAlgorithmConfiguration":"Sorting algorithm configuration", + "dataCount":"Data quantity (number)", + "timeInterval":"Time interval (microseconds)", + "randomSeed":"Random Seed", + "codeGeneration":"Code generation", + "generateCode":"Generate Code", + "artifactLocation":"Product location", + "codeClassLocation":"Code class storage location", + "resourceDirectory":"Resource Catalog", + "iconfontResourceLocation":"iconfont Resource storage location", + "projectPath":"Project Path", + "inputProjectAddress":"Please select or enter the project address", + "iconfontCompressedPackagePath":"Iconfont Compressed package path", + "pleaseSelectOrInputIconfontCompressedPackagePath":"Please select or enter the compressed file path for iconfont download", + "stayTuned":"Stay tuned", + "iconFont":"IconFont", + "dataClass":"Data class", + "stateManagement":"State management", + "jsonParsing":"Json Parsing", + "clickHereToJump":"Click here to jump to", + "appSettings":"Application Settings", + "darkMode":"Dark Mode ", + "followSystem":"Follow system", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"After activation, it will follow the system to turn on or off dark mode", + "manualSetting":"Manual settings", + "lightMode":"Light mode", + "appDetails":"Application details", + "checkDatabaseNewVersion":"Check for new versions of the database", + "viewThisProjectGithubRepository":"《View the Github warehouse for this project》", + "themeColorSetting":"Theme color settings", + "dataManagement":"Data management", + "backupFavoritesCollectionData":"Backup Collection Data", + "syncFavoritesCollectionData":"Synchronize collection data", + "favoritesCollectionDataReset":"Reset Collection Data", + "resetSuccess":"Reset successful!", + "dataSetBackupSuccess":"Dataset backup successful!", + "dataSetBackupFailure":"Dataset backup failed!", + "dataSynchronizationCopySuccess":"Data synchronization successful!", + "dataSynchronizationCopyFailure":"Data synchronization failed!", + "destructionRed":"The Red of Destruction", + "rageOrange":"Anger Orange", + "warningYellow":"Warning Yellow", + "camouflageGreen":"Disguising Green", + "coldBlue":"Indifferent Blue", + "infiniteBlue":"Infinite Indigo", + "mysteryPurple":"Mysterious Purple", + "destinyBlack":"The Black of Destiny", + "fontSetting":"Font settings", + "codeHighlightStyle":"Code Highlight Style", + "versionInformation":"Version information", + "showBackground":"Display Background", + "toly":"toly", + "DartHandbook":"Dart Handbook", + "aboutApplications":"About Applications", + "contactThisKing":"Contact this king", + "showFloatingTools":"Show floating tools", + "displayPerformanceFloatingLayer":"Display performance floating layer", + "codeCopiedSuccessfully":"Code copied successfully", + "favoriteFolderManagement":"Favorite folder management", + "assembly":"Assembly", + "draw":"Draw", + "knowledge":"Knowledge", + "collection":"Collection", + "my":"My" } \ No newline at end of file diff --git a/packages/l10n/lib/arb/app_zh.arb b/packages/l10n/lib/arb/app_zh.arb index b7fb8417..56278b06 100644 --- a/packages/l10n/lib/arb/app_zh.arb +++ b/packages/l10n/lib/arb/app_zh.arb @@ -2,5 +2,149 @@ "widgetCollection": "组件集录", "paintCollection": "绘制集录", "knowledgeCollection": "知识集锦", - "treasureTools": "工具宝箱" + "treasureTools": "工具宝箱", + "collectCollection": "收藏集录", + "essentialCollection": "要点集录", + "anamorphic":"无态", + "stateful":"有态", + "singleShading":"单渲", + "multiShading":"多渲", + "slidePlate":"滑片", + "agent":"代理", + "other":"其他", + "favorite":"已收藏", + "enterComponentName":"输入组件名称", + "containerComponents":"容器组件", + "relatedComponents":"相关组件", + "componentTavern":"组件酒肆", + "cherishedComponents":"珍藏组件", + "textImageCollection":"图文集", + "layoutCollection":"布局集", + "eventCollection":"事件集", + "animationCollection":"动画集", + "slidingCollection":"滑动集", + "decorationCollection":"装饰集", + "assemblyCollection":"组装集", + "functionCollection":"功能集", + "popupCollection":"弹出集", + "themeCollection":"主题集", + "derivativeCollection":"衍生集", + "hardToCategorize":"很难分", + "basicDrawing":"基础绘制", + "animationGesture":"动画手势", + "particleDrawing":"粒子绘制", + "interestingDrawing":"趣味绘制", + "artGallery":"艺术画廊", + "drawingOfImages":"本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 ", + "digitalDisplayTube":"本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 ", + "pathDrawing":"本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 ", + "gridCoordinateSystem":"本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 ", + "polarCoordinateSystemOfFaces":"本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 ", + "drawFunctionCurvesForPathPairs":"本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 ", + "drawRegularPolygons":"本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数", + "randomNumberProcessing":"本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。", + "clockDrawing":"本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。", + "drawSprings":" 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 ", + "theApplicationOfAnglesInDrawing":"本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行", + "usingShadersAndFilters":"本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。", + "pathDrawingFunctionCurve":"本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画", + "thePathOfBingDwenDwen":"本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行", + "drawCubicBesselCurve":"本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除", + "theEffectOfAnimationCurve":"本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行", + "randomParticlesAndBoundaryBouncing":" 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 ", + "particleCollision":"本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置", + "particle":"本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行", + "rectangleAndRandomNumbers":"本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", + "bingDwenDwen":"本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。", + "pufengInjectionTest":"本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。", + "ticTacToe ":"本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", + "tiled-lines":"本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "joy-division":"本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "cubic-disarray":"本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "triangular-mesh":"本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "un-deux-trois": "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "circle-packing":"本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "hypnotic-squares":"本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "piet-mondrian":"本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "downloadCompressedPackage":"使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。", + "QAIssues":"要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。", + "tips:":"注:", + "visualSorting":"可视化排序", + "visual":"可视排序", + "insertion": "插入排序", + "bubble": "冒泡排序", + "cocktail": "鸡尾酒排序(双向冒泡排序)", + "comb": "梳排序", + "pigeonHole": "鸽巢排序", + "shell": "希尔排序", + "selection": "选择排序", + "gnome": "侏儒排序", + "cycle": "循环排序", + "heap": "堆排序", + "quick": "快速排序", + "merge": "归并排序", + "sortingAlgorithmConfiguration":"排序算法配置", + "dataCount":"数据数量(个数)", + "timeInterval":"时间间隔(微秒)", + "randomSeed":"随机种子", + "codeGeneration":"代码生成", + "generateCode":"生成代码", + "artifactLocation":"产物位置", + "codeClassLocation":"代码类存放位置", + "resourceDirectory":"资源目录", + "iconfontResourceLocation":"iconfont 资源存放位置", + "projectPath":"项目路径", + "inputProjectAddress":"请选择或输入项目地址", + "iconfontCompressedPackagePath":"Iconfont 压缩包路径", + "pleaseSelectOrInputIconfontCompressedPackagePath":"请选择或输入 iconfont 下载的压缩包路径", + "stayTuned":"敬请期待", + "iconFont":"IconFont", + "dataClass":"数据类", + "stateManagement":"状态管理", + "jsonParsing":"Json 解析", + "clickHereToJump":"点击这里跳转", + "appSettings":"应用设置", + "darkMode":"深色模式", + "followSystem":"跟随系统", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"开启后,将跟随系统打开或关闭深色模式", + "manualSetting":"手动设置", + "lightMode":"浅色模式", + "appDetails":"应用详情", + "checkDatabaseNewVersion":"检查数据库新版本", + "viewThisProjectGithubRepository":"《查看本项目Github仓库》", + "themeColorSetting":"主题色设置", + "dataManagement":"数据管理", + "backupFavoritesCollectionData":"备份收藏集数据", + "syncFavoritesCollectionData":"同步收藏集数据", + "favoritesCollectionDataReset":"收藏集数据重置", + "resetSuccess":"重置成功!", + "dataSetBackupSuccess":"数据集备份成功!", + "dataSetBackupFailure":"数据集备份失败!", + "dataSynchronizationCopySuccess":"数据同步份成功!", + "dataSynchronizationCopyFailure":"数据同步份失败!", + "destructionRed":"毁灭之红", + "rageOrange":"愤怒之橙", + "warningYellow":"警告之黄", + "camouflageGreen":"伪装之绿", + "coldBlue":"冷漠之蓝", + "infiniteBlue":"无限之靛", + "mysteryPurple":"神秘之紫", + "destinyBlack":"归宿之黑", + "fontSetting":"字体设置", + "codeHighlightStyle":"代码高亮样式", + "versionInformation":"版本信息", + "showBackground":"显示背景", + "toly":"张风捷特烈", + "DartHandbook":"Dart 手册", + "aboutApplications":"关于应用", + "contactThisKing":"联系本王", + "showFloatingTools":"显示浮动工具", + "displayPerformanceFloatingLayer":"显示性能浮层", + "codeCopiedSuccessfully":"代码复制成功", + "favoriteFolderManagement":"收藏夹管理", + "assembly":"组件", + "draw":"绘制", + "knowledge":"知识", + "collection":"收藏", + "my":"我的" } \ No newline at end of file From e2a9996d06d865329e74d8db115f8ee1576d2446 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 31 Jan 2024 14:08:50 +0800 Subject: [PATCH 054/149] merge l10n --- packages/l10n/pubspec.yaml | 2 +- pubspec.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/l10n/pubspec.yaml b/packages/l10n/pubspec.yaml index 4e32e8f4..27f3c2ce 100644 --- a/packages/l10n/pubspec.yaml +++ b/packages/l10n/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.5 <4.0.0' + sdk: '>=3.2.0 <4.0.0' flutter: ">=1.17.0" dependencies: diff --git a/pubspec.lock b/pubspec.lock index ddb6543b..fb14171f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1021,5 +1021,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.2.5 <4.0.0" + dart: ">=3.2.3 <4.0.0" flutter: ">=3.10.0" From bc5d1b6d7851049fc981140c00e433a40dba92b8 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 15 Feb 2024 18:27:22 +0800 Subject: [PATCH 055/149] =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E7=AB=AF=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E9=9B=86=E9=94=A6=E3=80=81=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=A4=9A=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/flutter_unit.dart | 42 +- lib/app/views/about/version_info.dart | 2 +- .../views/account/desk/desk_account_page.dart | 139 +++ lib/app/views/setting/language_setting.dart | 69 ++ lib/app/views/setting/setting_page.dart | 42 +- .../views/setting/theme_color_setting.dart | 30 +- .../views/setting/theme_model_setting.dart | 76 +- .../time_line/flutter_unit_time_line.dart | 2 +- lib/navigation/routers/desk_route.dart | 8 +- .../desk/flutter_unit_desk_navigation.dart | 10 +- .../views/desk/unit_rail_navigation.dart | 7 +- lib/navigation/views/pure_bottom_bar.dart | 16 +- packages/app/lib/app/cons/cons.dart | 84 +- packages/app/lib/app/theme/app_theme.dart | 5 +- packages/app/lib/app_config/bloc/bloc.dart | 12 +- packages/app/lib/app_config/bloc/state.dart | 28 +- packages/app/pubspec.yaml | 2 + packages/artifact/lib/artifact.dart | 3 +- .../view/article/columnize_page_view.dart | 72 +- .../articles/view/article/sliver_article.dart | 30 +- .../view/article/sliver_columnize.dart | 86 +- .../lib/src/articles/view/artifact_page.dart | 8 +- .../src/articles/view/desk_artifact_page.dart | 134 +++ .../points/view/desk_ui/desk_point_page.dart | 7 - packages/artifact/pubspec.yaml | 2 + .../lib/views/mobile/user/page_item.dart | 13 +- packages/authentication/pubspec.yaml | 2 + .../components/lib/project_ui/project_ui.dart | 4 +- .../top_bar/desk_account_top_bar.dart | 33 + .../top_bar/desk_knowledge_top_bar.dart | 90 ++ .../top_bar/desk_simple_top_bar.dart | 4 +- packages/l10n/l10n.yaml | 2 +- packages/l10n/lib/arb/app_en.arb | 87 +- packages/l10n/lib/arb/app_zh.arb | 90 +- packages/l10n/lib/enum/language.dart | 14 + .../l10n/lib/gen_l10n/app_localizations.dart | 924 ++++++++++++++++++ .../lib/gen_l10n/app_localizations_en.dart | 462 +++++++++ .../lib/gen_l10n/app_localizations_zh.dart | 462 +++++++++ packages/l10n/lib/l10n.dart | 1 + .../src/sp_storage/models/app_config_po.dart | 4 + .../toly_ui/lib/code/high_light_code.dart | 4 +- .../lib/code/language/dart_languge.dart | 2 +- .../toly_ui/lib/code/language/language.dart | 4 +- .../lib/views/components/collected_tag.dart | 29 + .../widget_panel/desk_widget_model_item.dart | 20 +- .../widget_panel/desk_widget_top_bar.dart | 20 +- .../widget_page/standard_home_page.dart | 20 +- .../widget_page/standard_home_search.dart | 97 +- .../mobile/widget_page/widget_model_item.dart | 21 +- .../views/mobile/widget_page/widget_page.dart | 2 - .../LicensePage/node1_base.dart | 2 +- .../AboutDialog/node1_base.dart | 2 +- .../AboutListTile/node1_base.dart | 2 +- 53 files changed, 2943 insertions(+), 390 deletions(-) create mode 100644 lib/app/views/account/desk/desk_account_page.dart create mode 100644 lib/app/views/setting/language_setting.dart create mode 100644 packages/artifact/lib/src/articles/view/desk_artifact_page.dart create mode 100644 packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart create mode 100644 packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart create mode 100644 packages/l10n/lib/enum/language.dart create mode 100644 packages/widget_module/lib/views/components/collected_tag.dart diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index aab90418..73780d2a 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_unit/navigation/routers/app_route.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; + /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: 主程序 @@ -23,27 +24,24 @@ class FlutterUnit3 extends StatelessWidget { @override Widget build(BuildContext context) { - // Locale activeLocal = Locale('en', 'us'); - Locale activeLocal = Locale('zh', 'CN'); - return BlocBuilder(builder: (_, state) { - return SortStateScope( - notifier: SortState(), - child: DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp.router( - routerConfig: _router, - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - localizationsDelegates: l10nDelegates, - supportedLocales: l10nLocales, - locale: activeLocal, - themeMode: state.themeMode, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), - ), + AppConfigState state = context.watch().state; + return SortStateScope( + notifier: SortState(), + child: DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: MaterialApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: l10nDelegates, + supportedLocales: l10nLocales, + locale: state.language.locale, + themeMode: state.themeMode, + darkTheme: AppTheme.darkTheme(state), + theme: AppTheme.lightTheme(state), ), - ); - }); + ), + ); } -} \ No newline at end of file +} diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index 2ae3f121..6caaa046 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -114,7 +114,7 @@ class VersionInfo extends StatelessWidget { }, child: const Text('《查看本项目Github仓库》',style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), const Text('Power By 张风捷特烈',style: TextStyle(fontSize: 12,color: Colors.grey),), - const Text('Copyright © 2008-2020 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),), + const Text('Copyright © 2018-2024 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),), ], ); } diff --git a/lib/app/views/account/desk/desk_account_page.dart b/lib/app/views/account/desk/desk_account_page.dart new file mode 100644 index 00000000..b9ac3c97 --- /dev/null +++ b/lib/app/views/account/desk/desk_account_page.dart @@ -0,0 +1,139 @@ +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_unit/app_stater/view/flutter_unit_text.dart'; +import 'package:toly_ui/toly_ui.dart'; + +class DeskAccountPage extends StatefulWidget { + const DeskAccountPage({super.key}); + + @override + State createState() => _DeskAccountPageState(); +} + +class _DeskAccountPageState extends State + with SingleTickerProviderStateMixin { + late TabController tabController; + @override + void initState() { + super.initState(); + tabController = TabController(length: 3, vsync: this); + } + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return Column( + children: [ + DeskAccountTopBar( + leading: FlutterUnitText( + text: 'Flutter Unit', + ), + ), + Expanded( + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: UserHeader(), + ), + SliverPinnedHeader( + color: isDark?Color(0xff2C3036):Colors.white, + child: TabBar( + onTap: (i) {}, + tabAlignment: TabAlignment.start, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + // indicator: RoundRectTabIndicator( + // borderSide: BorderSide(color: themeColor, width: 3), + // ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + // labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + // indicatorColor: themeColor, + tabs: ['收藏', "分享", "合集"] + .map((String name) => Tab(text: name)) + .toList(), + )), + SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) => ListTile( + title: Text('测试数据: $index',style: TextStyle(color: Colors.grey),), + ), + childCount: 20 + ), + ) + ], + )) + ], + ); + } +} + +class UserHeader extends StatelessWidget { + const UserHeader({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return Stack( + // clipBehavior: Clip.none, + children: [ + Column( + children: [ + Image.asset( + 'assets/images/base_draw.webp', + height: 150, + fit: BoxFit.fitWidth, + width: MediaQuery.of(context).size.width, + ), + Container( + alignment: Alignment.topLeft, + padding: EdgeInsets.only(left: 32 + 100 + 16, top: 12), + color: isDark?Color(0xff2C3036):Colors.white, + height: 86, + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '张风捷特烈', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + ), + Text( + '海的彼岸有我未曾见证的风采', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + Text( + '公众号@编程之王', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ) + ], + ), + ) + ], + ), + Positioned( + bottom: 16, + left: 32, + child: CircleImage( + size: 100, + shadowColor: Theme.of(context) + .primaryColor + .withAlpha(33), // image: NetworkImage(state.user.userAvatar), + image: const AssetImage("assets/images/icon_head.webp"), + ), + ), + ], + ); + } +} diff --git a/lib/app/views/setting/language_setting.dart b/lib/app/views/setting/language_setting.dart new file mode 100644 index 00000000..af7fe2d5 --- /dev/null +++ b/lib/app/views/setting/language_setting.dart @@ -0,0 +1,69 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; + +class LanguageSettingPage extends StatelessWidget { + const LanguageSettingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(context.l10n.settingLanguage),), + body: const LanguageSetting(), + ); + } +} + + +class LanguageSetting extends StatelessWidget { + const LanguageSetting({super.key}); + + @override + Widget build(BuildContext context) { + List languages = Language.values; + Language activeLanguage = context.select((bloc)=>bloc.state.language); + Color iconColor = Theme.of(context).primaryColor; + + return ListView.separated( + padding: const EdgeInsets.only(top:8), + separatorBuilder: (_,__)=>const Divider(), + itemBuilder: (_,index){ + Language language = languages[index]; + return ListTile( + title: Text(language.label), + onTap: (){ + context.read().switchLanguage(language); + }, + trailing: activeLanguage == language ? Icon(Icons.check, size: 20, color: iconColor) : null, + ); + } + + ,itemCount: languages.length,); + } +} + +class LanguageSwitchTile extends StatelessWidget { + const LanguageSwitchTile({super.key}); + + @override + Widget build(BuildContext context) { + Language activeLanguage = context.select((bloc)=>bloc.state.language); + Color color = Theme.of(context).primaryColor; + return ListTile( + leading: Icon( + Icons.language, + color: color, + ), + title: Text(context.l10n.settingLanguageText, style: TextStyle(fontSize: 16)), + subtitle: Text( + '${activeLanguage.label}: ${activeLanguage.locale}',style: TextStyle(fontSize: 12), + ), + trailing: Icon(Icons.chevron_right, color: color), + onTap: (){ + showModalBottomSheet(context: context, builder: (_)=>LanguageSettingPage()); + }, + ); + } +} diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index b5541f17..9ceb3f54 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -1,5 +1,6 @@ import 'package:app/app.dart'; import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -7,6 +8,7 @@ import 'package:flutter_unit/navigation/views/overlay_tool_wrapper.dart'; import 'app_style_setting.dart'; +import 'language_setting.dart'; import 'theme_model_setting.dart'; class SettingPage extends StatelessWidget { @@ -17,8 +19,9 @@ class SettingPage extends StatelessWidget { Widget build(BuildContext context) { const Widget divider = Divider(height: 1); + return Scaffold( - appBar: AppBar(title:Text('应用设置')), + appBar: AppBar(title:Text(context.l10n.appSettings)), body: ListView( children: [ Container( height: 15), @@ -27,12 +30,17 @@ class SettingPage extends StatelessWidget { Icons.style, color: Theme.of(context).primaryColor, ), - title: const Text('深色模式', style: TextStyle(fontSize: 16)), + title: Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), subtitle: BlocBuilder( - builder: (_,state)=>Text( - themeMode2Str[state.themeMode]! - , style: const TextStyle(fontSize: 12,color: Colors.grey) - ), + builder: (_,state) { + String info = switch(state.themeMode){ + ThemeMode.system => context.l10n.followSystem, + ThemeMode.light => context.l10n.lightMode, + ThemeMode.dark => context.l10n.darkMode, + }; + return Text(info, style: const TextStyle(fontSize: 12,color: Colors.grey) + ); + }, ), trailing: _nextIcon(context), onTap: ()=> context.push('/settings/dark_mode'), @@ -43,11 +51,11 @@ class SettingPage extends StatelessWidget { Icons.palette, color: Theme.of(context).primaryColor, ), - title: const Text('主题色设置', style: TextStyle(fontSize: 16)), + title: Text(context.l10n.themeColorSetting, style: TextStyle(fontSize: 16)), subtitle: BlocBuilder( builder: (_,state)=>Text( - Cons.kThemeColorSupport[state.themeColor]!, - style: TextStyle(color: state.themeColor,fontSize: 12), + state.themeColor.label(context), + style: TextStyle(color: state.themeColor.color,fontSize: 12), ), ), trailing: _nextIcon(context), @@ -60,7 +68,7 @@ class SettingPage extends StatelessWidget { Icons.translate, color: Theme.of(context).primaryColor, ), - title: const Text('字体设置', style: TextStyle(fontSize: 16)), + title: Text(context.l10n.fontSetting, style: TextStyle(fontSize: 16)), subtitle: BlocBuilder( builder: (_,state)=>Text( state.fontFamily,style: TextStyle(fontSize: 12), @@ -70,30 +78,32 @@ class SettingPage extends StatelessWidget { onTap: () => context.push('/settings/font_setting'), ), divider, + const LanguageSwitchTile(), + divider, ListTile( leading: Icon( TolyIcon.icon_code, color: Theme.of(context).primaryColor, ), - title: const Text('代码高亮样式', style: TextStyle(fontSize: 16)), + title: Text(context.l10n.codeHighlightStyle, style: TextStyle(fontSize: 16)), trailing: _nextIcon(context), onTap: () => context.push('/settings/code_style'), ), // divider, Container( height: 10,), - _buildShowBg(context), + // _buildShowBg(context), divider, _buildShowOver(context), // divider, // _buildShowTool(context), - // divider, - Container( height: 10), + divider, + // Container( height: 10), ListTile( leading: Icon( Icons.info, color: Theme.of(context).primaryColor, ), - title: const Text('版本信息', style: TextStyle(fontSize: 16)), + title: Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)), trailing: _nextIcon(context), onTap: () => context.push('/settings/version'), ), @@ -137,7 +147,7 @@ class SettingPage extends StatelessWidget { TolyIcon.icon_background, color: Theme.of(context).primaryColor, ), - title: const Text('显示性能浮层', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) + title: Text(context.l10n.displayPerformanceFloatingLayer, style: TextStyle(fontSize: 16)) , value: state.showPerformanceOverlay, onChanged: (bool value) { BlocProvider.of(context).switchShowOver(value); }, diff --git a/lib/app/views/setting/theme_color_setting.dart b/lib/app/views/setting/theme_color_setting.dart index 19c6b9bd..c013e6a5 100644 --- a/lib/app/views/setting/theme_color_setting.dart +++ b/lib/app/views/setting/theme_color_setting.dart @@ -18,12 +18,12 @@ class ThemeColorSettingPage extends StatelessWidget { appBar: const UnitAppbar(title:'主题色设置'), body: BlocBuilder( builder: (_, state) => _buildCell( - context, Cons.kThemeColorSupport.keys.toList(), state.themeColor)), + context, ThemeColor.values, state.themeColor)), ); } Widget _buildCell( - BuildContext context, List themeColorSupport, MaterialColor color) { + BuildContext context, List themeColorSupport, ThemeColor color) { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), shrinkWrap: true, @@ -32,7 +32,7 @@ class ThemeColorSettingPage extends StatelessWidget { crossAxisSpacing: 10, childAspectRatio: 1.5, children: themeColorSupport - .map((MaterialColor c) => FeedbackWidget( + .map((ThemeColor c) => FeedbackWidget( a: 0.95, duration: const Duration(milliseconds: 200), onPressed: () => BlocProvider.of(context).switchThemeColor(c), @@ -50,7 +50,7 @@ class ThemeColorSettingPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ const Spacer(), - Text(colorString(c), + Text(colorString(c.color), style: const TextStyle( color: Colors.white, )), @@ -66,20 +66,20 @@ class ThemeColorSettingPage extends StatelessWidget { decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(10)), gradient: LinearGradient(colors: [ - c.shade50, - c.shade100, - c.shade200, - c.shade300, - c.shade400, - c.shade500, - c.shade600, - c.shade700, - c.shade800, - c.shade900, + c.color.shade50, + c.color.shade100, + c.color.shade200, + c.color.shade300, + c.color.shade400, + c.color.shade500, + c.color.shade600, + c.color.shade700, + c.color.shade800, + c.color.shade900, ])), alignment: const Alignment(0,0.35), child: Text( - '${Cons.kThemeColorSupport[c]}', + c.label(context), style: const TextStyle(fontSize: 18,color: Colors.white,fontWeight: FontWeight.bold), )), ))) diff --git a/lib/app/views/setting/theme_model_setting.dart b/lib/app/views/setting/theme_model_setting.dart index 6bf0ae60..aa6450ae 100644 --- a/lib/app/views/setting/theme_model_setting.dart +++ b/lib/app/views/setting/theme_model_setting.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -8,57 +9,68 @@ class ThemeModelSetting extends StatelessWidget { @override Widget build(BuildContext context) { - - ThemeMode mode = context.select((bloc) => bloc.state.themeMode); - Color iconColor = Theme.of(context).primaryColor; - return Scaffold( - appBar: AppBar(title: Text('深色模式')), + ThemeMode mode = context + .select((bloc) => bloc.state.themeMode); + Color iconColor = Theme.of(context).primaryColor; + String dark = context.l10n.darkMode; + String light = context.l10n.lightMode; + String followSystem = context.l10n.followSystem; + String manualSetting = context.l10n.manualSetting; + String info = + context.l10n.afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode; + return Scaffold( + appBar: AppBar(title: Text(dark)), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( height: 15,), + Container( + height: 15, + ), TolySwitchListTile( - title: const Text('跟随系统', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)), + title: Text(followSystem, + style: + const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), subtitle: Text( - '开启后,将跟随系统打开或关闭深色模式',style: TextStyle(fontSize: 12,color: Colors.grey), - ), value: mode == ThemeMode.system, onChanged: (bool value) { - print("========value:$value=========="); + info, + style: const TextStyle(fontSize: 12, color: Colors.grey), + ), + value: mode == ThemeMode.system, + onChanged: (bool value) { ThemeMode newModel; - if(value){ + if (value) { newModel = ThemeMode.system; - }else{ + } else { newModel = ThemeMode.light; } context.read().changeThemeMode(newModel); - }, - // trailing: _nextIcon(context), - // : () => Navigator.of(context).pushNamed(UnitRouter.font_setting), + }, ), - // AppStyle locale = Cons.kAppStyleStringMap.keys.toList()[index]; - // AppStyle style = BlocProvider.of(context).state.appStyle; - // bool checked = style == locale; - // Color color = Theme.of(context).primaryColor; - Padding( - padding: const EdgeInsets.only(left: 10,top: 16,bottom: 6), - child: Text("手动设置"), - ), - ListTile( - title: Text('浅色模式'), - onTap: (){ + Padding( + padding: const EdgeInsets.only(left: 10, top: 16, bottom: 6), + child: Text(manualSetting), + ), + ListTile( + title: Text(light), + onTap: () { context.read().changeThemeMode(ThemeMode.light); }, - trailing: mode == ThemeMode.light ? Icon(Icons.check, size: 20, color: iconColor) : null, + trailing: mode == ThemeMode.light + ? Icon(Icons.check, size: 20, color: iconColor) + : null, ), - Divider(), + const Divider(), ListTile( - title: Text('深色模式'), - onTap: (){ + title: Text(dark), + onTap: () { context.read().changeThemeMode(ThemeMode.dark); }, - trailing: mode == ThemeMode.dark ? Icon(Icons.check, size: 20, color: iconColor) : null, + trailing: mode == ThemeMode.dark + ? Icon(Icons.check, size: 20, color: iconColor) + : null, ) ], ), - );; + ); + ; } } diff --git a/lib/app/views/time_line/flutter_unit_time_line.dart b/lib/app/views/time_line/flutter_unit_time_line.dart index dc7578c3..eedef00a 100644 --- a/lib/app/views/time_line/flutter_unit_time_line.dart +++ b/lib/app/views/time_line/flutter_unit_time_line.dart @@ -174,7 +174,7 @@ class TimeLineNode extends StatelessWidget { @override Widget build(BuildContext context) { - Color themeColor = BlocProvider.of(context).state.themeColor; + Color themeColor = BlocProvider.of(context).state.themeColor.color; return IntrinsicHeight( child: Row( diff --git a/lib/navigation/routers/desk_route.dart b/lib/navigation/routers/desk_route.dart index bf939047..94c88cc8 100644 --- a/lib/navigation/routers/desk_route.dart +++ b/lib/navigation/routers/desk_route.dart @@ -2,6 +2,7 @@ import 'package:algorithm/algorithm.dart'; import 'package:artifact/artifact.dart'; import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/views/account/desk/desk_account_page.dart'; import 'package:flutter_unit/app/views/setting/setting_page.dart'; import 'package:go_router/go_router.dart'; import 'package:treasure_tools/treasure_tools.dart'; @@ -49,7 +50,8 @@ final RouteBase appNavRoute = ShellRoute( GoRoute( path: 'knowledge', builder: (BuildContext context, GoRouterState state) { - return DeskPointPage(); + // return DeskPointPage(); + return DeskKnowledgePage(); }, ), GoRoute( @@ -73,9 +75,9 @@ final RouteBase appNavRoute = ShellRoute( ), ]), GoRoute( - path: 'algorithm', + path: 'account', builder: (BuildContext context, GoRouterState state) { - return DeskSortPage(); + return DeskAccountPage(); }, ), GoRoute( diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart index 2b0debae..3c09feb0 100644 --- a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart +++ b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart @@ -50,18 +50,17 @@ class _DeskNavigationRailState extends State { String canvas = context.l10n.paintCollection; String knowledge = context.l10n.knowledgeCollection; String treasure = context.l10n.treasureTools; + String account = context.l10n.homeAccount; + deskNavBarMenus = [ MenuMeta(label: widget, icon: TolyIcon.icon_layout, path: '/widget'), MenuMeta(label: canvas, icon: Icons.palette, path: '/painter'), MenuMeta(label: knowledge, icon: TolyIcon.icon_artifact, path: '/knowledge'), - // MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), - MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), MenuMeta(label: treasure, icon: TolyIcon.icon_fast, path: '/tools'), + MenuMeta(label: account, icon: Icons.person, path: '/account'), ]; } - - - + final RegExp _segReg = RegExp(r'/\w+'); int? get activeIndex { @@ -69,6 +68,7 @@ class _DeskNavigationRailState extends State { RegExpMatch? match = _segReg.firstMatch(path); if (match == null) return null; String? target = match.group(0); + int index = deskNavBarMenus.indexWhere((menu) => menu.path!.contains(target??'')); if (index == -1) return null; return index; diff --git a/lib/navigation/views/desk/unit_rail_navigation.dart b/lib/navigation/views/desk/unit_rail_navigation.dart index 37dd3098..5da25481 100644 --- a/lib/navigation/views/desk/unit_rail_navigation.dart +++ b/lib/navigation/views/desk/unit_rail_navigation.dart @@ -11,9 +11,8 @@ enum ActionType{ widgets(path: '/widget'), painter(path: '/painter'), knowledge(path: '/knowledge'), - - algorithm(path: '/algorithm'), tools(path: '/tools'), + algorithm(path: '/account'), toggleDarkTheme(), settings(path: '/settings'), @@ -146,9 +145,7 @@ class _UnitRailNavigationState extends State //const Size(120, 35) child: Column( // mainAxisSize: MainAxisSize.min, - children: info - .asMap() - .keys + children: info.asMap().keys .map((int index) => _UnitRailMenu( animation: _destinationControllers[index], onTap: () => widget.onAction(ActionType.values[index]), diff --git a/lib/navigation/views/pure_bottom_bar.dart b/lib/navigation/views/pure_bottom_bar.dart index 71757e3c..4d8fbb39 100644 --- a/lib/navigation/views/pure_bottom_bar.dart +++ b/lib/navigation/views/pure_bottom_bar.dart @@ -1,5 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:l10n/ext.dart'; typedef IndexTapCallback = void Function(int); typedef IndexLongTapCallback = void Function(BuildContext, int); @@ -21,17 +22,22 @@ class PureBottomBar extends StatefulWidget { } class _PureBottomBarState extends State { - List get bottomBar => const ['组件', '绘制', - '知识', - '收藏', '我的']; + List get bottomBar => [ + context.l10n.homeTabWidget, + context.l10n.homeTabPaint, + context.l10n.homeTabKnowledge, + context.l10n.homeTabTools, + context.l10n.homeTabMine, + ]; List get bottomBarIcon => const [ TolyIcon.icon_layout, TolyIcon.dingzhi1, - TolyIcon.icon_artifact, - TolyIcon.icon_collect, + TolyIcon.icon_artifact, + TolyIcon.icon_fast, TolyIcon.yonghu, ]; + int _position = 0; @override diff --git a/packages/app/lib/app/cons/cons.dart b/packages/app/lib/app/cons/cons.dart index 57ae8e9a..95cc7744 100644 --- a/packages/app/lib/app/cons/cons.dart +++ b/packages/app/lib/app/cons/cons.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/widget_module.dart'; @@ -66,28 +67,67 @@ class Cons { }; - static final kThemeColorSupport = { - Colors.red: "毁灭之红", - Colors.orange: "愤怒之橙", - Colors.yellow: "警告之黄", - Colors.green: "伪装之绿", - Colors.blue: "冷漠之蓝", - Colors.indigo: "无限之靛", - Colors.purple: "神秘之紫", - - const MaterialColor(0xff2D2D2D, { - 50: Color(0xFF8A8A8A), - 100: Color(0xFF747474), - 200: Color(0xFF616161), - 300: Color(0xFF484848), - 400: Color(0xFF3D3D3D), - 500: Color(0xff2D2D2D), - 600: Color(0xFF252525), - 700: Color(0xFF141414), - 800: Color(0xFF050505), - 900: Color(0xff000000), - }): "归宿之黑" - }; + // static final kThemeColorSupport = { + // Colors.red: "毁灭之红", + // Colors.orange: "愤怒之橙", + // Colors.yellow: "警告之黄", + // Colors.green: "伪装之绿", + // Colors.blue: "冷漠之蓝", + // Colors.indigo: "无限之靛", + // Colors.purple: "神秘之紫", + // + // const MaterialColor(0xff2D2D2D, { + // 50: Color(0xFF8A8A8A), + // 100: Color(0xFF747474), + // 200: Color(0xFF616161), + // 300: Color(0xFF484848), + // 400: Color(0xFF3D3D3D), + // 500: Color(0xff2D2D2D), + // 600: Color(0xFF252525), + // 700: Color(0xFF141414), + // 800: Color(0xFF050505), + // 900: Color(0xff000000), + // }): "归宿之黑" + // }; } +enum ThemeColor { + red(Colors.red), + orange(Colors.orange), + yellow(Colors.yellow), + green(Colors.green), + blue(Colors.blue), + indigo(Colors.indigo), + purple(Colors.purple), + dark(MaterialColor(0xff2D2D2D, { + 50: Color(0xFF8A8A8A), + 100: Color(0xFF747474), + 200: Color(0xFF616161), + 300: Color(0xFF484848), + 400: Color(0xFF3D3D3D), + 500: Color(0xff2D2D2D), + 600: Color(0xFF252525), + 700: Color(0xFF141414), + 800: Color(0xFF050505), + 900: Color(0xff000000), + })); + + final MaterialColor color; + + const ThemeColor(this.color); + + String label(BuildContext context){ + return switch(this){ + ThemeColor.red => context.l10n.destructionRed, + ThemeColor.orange => context.l10n.rageOrange, + ThemeColor.yellow => context.l10n.warningYellow, + ThemeColor.green => context.l10n.camouflageGreen, + ThemeColor.blue => context.l10n.coldBlue, + ThemeColor.indigo => context.l10n.infiniteBlue, + ThemeColor.purple => context.l10n.mysteryPurple, + ThemeColor.dark => context.l10n.destinyBlack, + }; + } + +} diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index c6e9bea4..ac3987aa 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -13,7 +13,6 @@ class AppTheme { static ThemeData darkTheme(AppConfigState state) { Color scaffoldBackgroundColor = const Color(0xff010201); - SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarBrightness: Brightness.dark, @@ -70,11 +69,9 @@ class AppTheme { statusBarIconBrightness: Brightness.dark, ); - bool useMaterial3 = (Platform.isAndroid || Platform.isIOS); - return ThemeData( fontFamily: state.fontFamily, - primaryColor: state.themeColor, + primaryColor: state.themeColor.color, scaffoldBackgroundColor: Color(0xffF3F4F6), useMaterial3: true, // Android 使用 Material3 diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart index 966a968a..6e94cd0d 100644 --- a/packages/app/lib/app_config/bloc/bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -1,8 +1,10 @@ import 'dart:async'; +import 'package:app/app.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; import '../repository/repository.dart'; @@ -49,8 +51,16 @@ class AppConfigBloc extends Cubit { emit(newState); } + // 切换字体事件处理 : 固化索引 + 产出新状态 + void switchLanguage(Language language) async { + print("=====switchLanguage:$language============"); + AppConfigState newState = state.copyWith(language: language); + cao.write(newState.toAppConfigPo()); + emit(newState); + } + // 切换主题色事件处理 : 固化索引 + 产出新状态 - void switchThemeColor(MaterialColor color) async { + void switchThemeColor(ThemeColor color) async { AppConfigState newState = state.copyWith(themeColor: color); cao.write(newState.toAppConfigPo()); emit(newState); diff --git a/packages/app/lib/app_config/bloc/state.dart b/packages/app/lib/app_config/bloc/state.dart index 0f53c90d..d3c071b0 100644 --- a/packages/app/lib/app_config/bloc/state.dart +++ b/packages/app/lib/app_config/bloc/state.dart @@ -1,28 +1,23 @@ import 'package:app/app/cons/cons.dart'; -import 'package:toly_ui/toly_ui.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; +import 'package:toly_ui/code/code.dart' ; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com /// 说明: 全局状态类 -Map themeMode2Str = const { - ThemeMode.system: "跟随系统", - ThemeMode.light: "浅色模式", - ThemeMode.dark: "深色模式", -}; - class AppConfigState extends Equatable { /// [fontFamily] 文字字体 final String fontFamily; /// [themeColor] 主题色 - final MaterialColor themeColor; + final ThemeColor themeColor; /// [showBackGround] 是否显示主页背景图 final bool showBackGround; @@ -41,11 +36,15 @@ class AppConfigState extends Equatable { /// [appStyle] app 深色样式; final ThemeMode themeMode; + final ConnectivityResult netConnect; + final Language language; + const AppConfigState({ this.fontFamily = 'ComicNeue', - this.themeColor = Colors.blue, + this.language = Language.zh_CN, + this.themeColor = ThemeColor.blue, this.themeMode = ThemeMode.system, this.showBackGround = true, this.codeStyleIndex = 0, @@ -66,13 +65,15 @@ class AppConfigState extends Equatable { showOverlayTool, showPerformanceOverlay, netConnect, + language, ]; AppConfigState copyWith({ String? fontFamily, String? dbPath, - MaterialColor? themeColor, + ThemeColor? themeColor, bool? showBackGround, + Language? language, int? codeStyleIndex, int? itemStyleIndex, bool? showPerformanceOverlay, @@ -82,6 +83,7 @@ class AppConfigState extends Equatable { }) => AppConfigState( fontFamily: fontFamily ?? this.fontFamily, + language: language ?? this.language, themeColor: themeColor ?? this.themeColor, showBackGround: showBackGround ?? this.showBackGround, codeStyleIndex: codeStyleIndex ?? this.codeStyleIndex, @@ -99,18 +101,20 @@ class AppConfigState extends Equatable { showOverlayTool : showOverlayTool, showPerformanceOverlay : showPerformanceOverlay, fontFamilyIndex : Cons.kFontFamilySupport.indexOf(fontFamily), - themeColorIndex : Cons.kThemeColorSupport.keys.toList().indexOf(themeColor), + themeColorIndex : themeColor.index, codeStyleIndex : codeStyleIndex, themeModeIndex : themeMode.index, itemStyleIndex : itemStyleIndex, + languageIndex: language.index, ); // 根据存储的配置信息对象,形成 AppState 状态数据 factory AppConfigState.fromPo(AppConfigPo po) { return AppConfigState( fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], - themeColor: Cons.kThemeColorSupport.keys.toList()[po.themeColorIndex], + themeColor: ThemeColor.values[po.themeColorIndex], showBackGround: po.showBackGround, + language: Language.values[po.languageIndex], codeStyleIndex: po.codeStyleIndex, itemStyleIndex: po.itemStyleIndex, showPerformanceOverlay: po.showPerformanceOverlay, diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index 2d34592f..9d825a34 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -23,6 +23,8 @@ dependencies: path: ../components toly_ui: path: ../toly_ui + l10n: + path: ../l10n dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/artifact/lib/artifact.dart b/packages/artifact/lib/artifact.dart index e747288b..0f81dc95 100644 --- a/packages/artifact/lib/artifact.dart +++ b/packages/artifact/lib/artifact.dart @@ -6,4 +6,5 @@ export 'src/articles/view/wrapper/refresh.dart'; export 'src/articles/data/db/article_dao.dart'; export 'src/articles/data/db/columnize_dao.dart'; -export 'src/points/exp.dart'; \ No newline at end of file +export 'src/points/exp.dart'; +export 'src/articles/view/desk_artifact_page.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart index 1382d7bb..4aaac912 100644 --- a/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart +++ b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -81,23 +81,50 @@ class _ColumnizePageViewState extends State { @override Widget build(BuildContext context) { List data = context.watch().state.data; + Widget child = PageView.builder( + controller: _ctrl, // itemCount: 7, + itemBuilder: (_, index) { + return AnimatedBuilder( + child: _buildByIndex(context, index, data), + animation: _ctrl, + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), + ); + }, + onPageChanged: (index) { + _position = index; + }, + ); + if(!isDesk){ + return child; + } - return PageView.builder( - controller: _ctrl, // itemCount: 7, - itemBuilder: (_, index) { - return AnimatedBuilder( - child: _buildByIndex(context, index, data), - animation: _ctrl, - builder: (context, child) => _buildAnimItemByIndex( - context, - child, - index, - ), - ); - }, - onPageChanged: (index) { - _position = index; - }, + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + child: Stack( + alignment: Alignment.center, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 48.0), + child: child), + Positioned( + right: 0, + child: IconButton(onPressed: (){ + _position+=1; + _ctrl.animateToPage(_position, duration: Duration(milliseconds: 500),curve: Curves.easeIn); + }, icon: Icon(Icons.navigate_next_outlined))), + Positioned( + left: 0, + child: IconButton(onPressed: (){ + _position-=1; + _ctrl.animateToPage(_position, duration: Duration(milliseconds: 500),curve: Curves.easeIn); + }, icon: Icon(Icons.navigate_before))), + ], + ), ); } @@ -134,6 +161,19 @@ class _ColumnizePageViewState extends State { int result = offset % length; return result < 0 ? length + result : result; } + + bool _hover = false; + void _onEnter(PointerEnterEvent event) { + setState(() { + _hover = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hover = false; + }); + } } class ColumnizeItem extends StatelessWidget { diff --git a/packages/artifact/lib/src/articles/view/article/sliver_article.dart b/packages/artifact/lib/src/articles/view/article/sliver_article.dart index 0c616226..25e5efce 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_article.dart @@ -1,3 +1,4 @@ +import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -31,15 +32,32 @@ class SliverArticle extends StatelessWidget { final List
data; const SliverArticle({Key? key, required this.data}) : super(key: key); + + @override Widget build(BuildContext context) { + + const SliverGridDelegate deskGridDelegate = SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 420, + mainAxisSpacing: 8, + mainAxisExtent: 188, + crossAxisSpacing: 8, + ); + + Widget child = isDesk? SliverGrid(delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + ), gridDelegate: deskGridDelegate) + : + SliverList( + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + )); + return SliverPadding( padding: const EdgeInsets.only(bottom: 0), - sliver: SliverList( - delegate: SliverChildBuilderDelegate( - _buildItem, - childCount: data.length, - ))); + sliver: child); } Widget? _buildItem(BuildContext context, int index) { @@ -63,7 +81,7 @@ class ArticlePanel extends StatelessWidget { ); }, child: Container( - color: Colors.white, + color: Theme.of(context).listTileTheme.tileColor, padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: EdgeInsets.only(bottom: 6), child: Column( diff --git a/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart b/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart index 6f4ad2ea..54021fae 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart @@ -22,52 +22,52 @@ class _ColumnizeViewPageState extends State { @override Widget build(BuildContext context) { - return ColoredBox( - color: Colors.white, - child: SizedBox( - height: 220, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only(left: 16.0,right: 16,top: 12,bottom: 4), - child: Row( - children: [ - CircleAvatar( - backgroundImage: AssetImage('assets/images/icon_head.webp',), - backgroundColor: Colors.transparent, - radius: 10, - ), - SizedBox(width: 6,), - Text("捷特文章专栏",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), - Spacer(), - GestureDetector( - onTap: () async{ - Uri uri = Uri.parse('https://juejin.im/user/5b42c0656fb9a04fe727eb37'); - if (await canLaunchUrl(uri)) { - await launchUrl(uri,mode:LaunchMode.externalNonBrowserApplication ); - } else { - debugPrint('Could not launch ${uri.path}'); - } - }, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), - Icon(Icons.navigate_next,size: 12,color: Colors.blue,) - ], - ), + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return Container( + height: 220, + color: Theme.of(context).listTileTheme.tileColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 16.0,right: 16,top: 12,bottom: 4), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp',), + backgroundColor: Colors.transparent, + radius: 10, + ), + SizedBox(width: 6,), + Text("捷特文章专栏",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + Spacer(), + GestureDetector( + onTap: () async{ + Uri uri = Uri.parse('https://juejin.im/user/5b42c0656fb9a04fe727eb37'); + if (await canLaunchUrl(uri)) { + await launchUrl(uri,mode:LaunchMode.externalNonBrowserApplication ); + } else { + debugPrint('Could not launch ${uri.path}'); + } + }, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), + Icon(Icons.navigate_next,size: 12,color: Colors.blue,) + ], ), + ), - ], - ), - ), - Expanded( - child: ColumnizePageView(), + ], ), - SizedBox(height: 10,) - ], - ), + ), + Expanded( + child: ColumnizePageView(), + ), + SizedBox(height: 10,) + ], ), ); } diff --git a/packages/artifact/lib/src/articles/view/artifact_page.dart b/packages/artifact/lib/src/articles/view/artifact_page.dart index e71c01ee..4e6a2c05 100644 --- a/packages/artifact/lib/src/articles/view/artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/artifact_page.dart @@ -69,10 +69,8 @@ class _ArtifactPageState extends State return MultiBlocProvider( providers: [ - BlocProvider( - create: (_) => ColumnizeBloc(cRepository)..init()), - BlocProvider( - create: (_) => ArticleBloc(aRepository)..init()), + BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider(create: (_) => ArticleBloc(aRepository)..init()), ], child: Scaffold( endDrawer: SortSettings(), @@ -128,6 +126,8 @@ class _ArtifactPageState extends State } } + + List _buildAppBar(BuildContext context, bool innerBoxIsScrolled) { // print('innerBoxIsScrolled:$innerBoxIsScrolled'); return [ diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart new file mode 100644 index 00000000..862acf61 --- /dev/null +++ b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -0,0 +1,134 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:artifact/artifact.dart'; +import 'package:components/components.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../bloc/exp.dart'; +import '../data/exp.dart'; +import 'article/sliver_article.dart'; +import 'article/sliver_columnize.dart'; +import 'building/building_panel.dart'; + +class DeskKnowledgePage extends StatefulWidget { + const DeskKnowledgePage({super.key}); + + @override + State createState() => _DeskKnowledgePageState(); +} + +class _DeskKnowledgePageState extends State with SingleTickerProviderStateMixin{ + + late TabController controller; + List data = []; + int _curIndex = 0; + + @override + void initState() { + super.initState(); + controller = TabController(length: 4, vsync: this); + controller.addListener(_listen); + data = List.generate(5, (index) => 'Init $index'); + } + ArticleRepository aRepository = const ArticleRepository(); + ColumnizeRepository cRepository = const ColumnizeRepository(); + @override + Widget build(BuildContext context) { + String name = SortStateScope.of(context).config.name; + + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider(create: (_) => ArticleBloc(aRepository,pageSize: 1000)..init()), + ], + child: Column( + children: [ + DeskKnowledgeTabTopBar(onTabPressed: (int value) { + controller.index = value; + }, tabs: [ + '捷特文库', + '算法演绎', + '布局宝库', + '要点宝库', + ],), + Expanded(child: TabBarView( + controller: controller, + children: [ + TolyArticlesPage(), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + GestureDetector( + onTap: () { + _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + }, + child: Text( + '查看排序源码', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).primaryColor, + ), + )), + Spacer(), + SortSelector(), + ], + ), + ), + Expanded(child: SortPaper()), + ], + ), + BuildingPanel(), + DeskPointPage(), + ], + )) + ], + ), + ); + } + + _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + + void _listen() { + print('${controller.index}'); + if (_curIndex != controller.index) { + setState(() { + _curIndex = controller.index; + }); + } + } +} + +class TolyArticlesPage extends StatelessWidget { + const TolyArticlesPage({super.key}); + + @override + Widget build(BuildContext context) { + return CustomScrollView( + + slivers: [ + SliverPadding( + padding: EdgeInsets.only(top: 10,bottom: 10,right: 36,left: 36), + sliver: const SliverToBoxAdapter( + child: ColumnizeViewPage(), + ), + ), + SliverPadding( + padding: EdgeInsets.only(right: 36,left:36), + sliver: SliverArticlePanel(), + ), + + ], + ); + } +} diff --git a/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart index a7dbaae4..f543e69d 100644 --- a/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart +++ b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -37,13 +37,6 @@ class _DeskPointPageState extends State { child: Scaffold( body: Column( children: [ - SimpleDeskTopBar( - leading: Text( - 'Flutter 要点集录', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - ), - Divider(height: 1), Expanded( child: Row( children: [ diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 7da8a2d5..8a9497f6 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -19,6 +19,8 @@ dependencies: path: ../storage algorithm: path: ../algorithm + components: + path: ../components utils: path: ../utils app: diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 88b0ee58..90eaec60 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -2,6 +2,7 @@ import 'package:app/app.dart'; import 'package:app_update/views/update_red_point.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com @@ -27,13 +28,13 @@ class MePageItem extends StatelessWidget { height: 10, ), Gap.sfl10, - _buildItem(context, TolyIcon.icon_them, '应用设置', '/settings'), + _buildItem(context, TolyIcon.icon_them, context.l10n.appSettings, '/settings'), const Divider(), _buildItem( - context, TolyIcon.icon_layout, '数据管理', '/data_manage'), + context, TolyIcon.icon_layout, context.l10n.dataManagement, '/data_manage'), const Divider(), _buildItem( - context, TolyIcon.icon_collect, '我的收藏', '/collect',), + context, TolyIcon.icon_collect, context.l10n.userCollection, '/collect',), Gap.sfl10, Stack( @@ -41,17 +42,17 @@ class MePageItem extends StatelessWidget { _buildItem( context, Icons.update, - '版本信息', + context.l10n.versionInformation, '/settings/version', ), const Positioned(left: 40, top: 10, child: UpdateRedPoint()) ], ), const Divider(), - _buildItem(context, Icons.info, '关于应用', '/about_app'), + _buildItem(context, Icons.info, context.l10n.aboutApplications, '/about_app'), Gap.sfl10, - _buildItem(context, TolyIcon.icon_kafei, '联系本王', '/about_me'), + _buildItem(context, TolyIcon.icon_kafei, context.l10n.contactThisKing, '/about_me'), ], ), ); diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index f629bd91..7eff59e9 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: path: ../app_update app: path: ../app + l10n: + path: ../l10n components: path: ../components toly_ui: diff --git a/packages/components/lib/project_ui/project_ui.dart b/packages/components/lib/project_ui/project_ui.dart index 64baa704..edf45fcc 100644 --- a/packages/components/lib/project_ui/project_ui.dart +++ b/packages/components/lib/project_ui/project_ui.dart @@ -7,4 +7,6 @@ export 'default/no_more_widget.dart'; export 'wrapper/honour_wrapper.dart'; export 'unit_app_bar.dart'; export 'top_bar/desk_simple_top_bar.dart'; -export 'top_bar/desk_tab_top_bar.dart'; \ No newline at end of file +export 'top_bar/desk_tab_top_bar.dart'; +export 'top_bar/desk_knowledge_top_bar.dart'; +export 'top_bar/desk_account_top_bar.dart'; \ No newline at end of file diff --git a/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart new file mode 100644 index 00000000..b77e2589 --- /dev/null +++ b/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart @@ -0,0 +1,33 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +class DeskAccountTopBar extends StatelessWidget { + final Widget? leading; + + const DeskAccountTopBar({super.key, this.leading}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveAreaNoDouble( + child: Container( + height: 64, + color: isDark ? Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + if (leading != null) Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), + const Spacer(), + const SizedBox( + width: 20, + ), + const WindowButtons(), + ], + ), + ), + ); + } +} diff --git a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart new file mode 100644 index 00000000..3a236e7e --- /dev/null +++ b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart @@ -0,0 +1,90 @@ +import 'package:app/app.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:flutter/material.dart'; + +class DeskKnowledgeTabTopBar extends StatefulWidget { + final List tabs; + final ValueChanged onTabPressed; + + const DeskKnowledgeTabTopBar( + {Key? key, required this.onTabPressed, required this.tabs}) + : super(key: key); + + @override + State createState() => _DeskKnowledgeTabTopBarState(); +} + +class _DeskKnowledgeTabTopBarState extends State + with TickerProviderStateMixin { + late TabController tabController; + + @override + void initState() { + super.initState(); + tabController = TabController(length: widget.tabs.length, vsync: this); + } + + @override + void didUpdateWidget(covariant DeskKnowledgeTabTopBar oldWidget) { + if (oldWidget.tabs.length != widget.tabs.length) { + tabController.dispose(); + tabController = TabController(length: widget.tabs.length, vsync: this); + } + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return DragToMoveAreaNoDouble( + child: Stack( + children: [ + Container( + height: 64, + color: isDark ? Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + Expanded( + child: Center( + child: SizedBox( + width: 350, + child: TabBar( + onTap: widget.onTabPressed, + indicatorSize: TabBarIndicatorSize.label, + labelPadding: const EdgeInsets.symmetric(horizontal: 6), + isScrollable: false, + indicator: RoundRectTabIndicator( + borderSide: BorderSide(color: themeColor, width: 3), + ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + indicatorColor: themeColor, + tabs: widget.tabs + .map((String name) => Tab(text: name)) + .toList(), + ), + ), + ), + ), + const SizedBox( + width: 20, + ), + // WindowButtons(), + ], + ), + ), + Positioned(child: WindowButtons()) + ], + ), + ); + } +} diff --git a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart index e1c074df..cb8d1a79 100644 --- a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart @@ -8,10 +8,12 @@ class SimpleDeskTopBar extends StatelessWidget { @override Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + return DragToMoveAreaNoDouble( child: Container( height: 64, - color: Colors.white, + color: isDark ? Color(0xff2C3036) : Colors.white, child: Row( children: [ if (leading != null) Padding( diff --git a/packages/l10n/l10n.yaml b/packages/l10n/l10n.yaml index 7f84daf8..3f2ff4f7 100644 --- a/packages/l10n/l10n.yaml +++ b/packages/l10n/l10n.yaml @@ -1,3 +1,3 @@ arb-dir: lib/arb template-arb-file: app_zh.arb -output-localization-file: app_localizations.dart \ No newline at end of file +output-localization-file: app_localizations.dart diff --git a/packages/l10n/lib/arb/app_en.arb b/packages/l10n/lib/arb/app_en.arb index 22c039a0..9084b35e 100644 --- a/packages/l10n/lib/arb/app_en.arb +++ b/packages/l10n/lib/arb/app_en.arb @@ -2,17 +2,48 @@ "widgetCollection": "Widgets", "paintCollection": "Painter", "knowledgeCollection": "Knowledge", + "homeAccount": "Account", + "collectCollection": "CollectionCollection", "essentialCollection": "KeypointsCollection", "treasureTools": "Treasure", - "anamorphic":"Anamorphic", + "searchWidget": "search widget...", + "stateless":"Stateless", "stateful":"Stateful", - "singleShading":"Single shading", - "multiShading":"Multi shading", - "slidePlate":"Slide plate", - "agent":"Agent", + "single":"Single", + "multi":"Multi", + "sliver":"Sliver", + "proxy":"Proxy", "other":"Other", - "favorite":"Favorite", + "homeTabWidget": "Widget", + "homeTabPaint": "Paint", + "homeTabKnowledge": "Knowledge", + "homeTabTools": "Treasure", + "homeTabMine": "Mine", + "favorite":"Collected", + + "userCollection":"Collection", + + + "appSettings":"Application Setting", + "darkMode":"Dark Mode ", + "themeColorSetting":"Theme Color", + "fontSetting":"Font Setting", + "settingLanguage": "Language Setting", + "codeHighlightStyle":"Code Highlight Style", + "versionInformation":"App Version", + "showFloatingTools":"Show floating tools", + "displayPerformanceFloatingLayer":"Performance Layer", + + "showBackground":"Display Background", + + "followSystem":"Follow system", + "manualSetting":"Manual settings", + "lightMode":"Light mode", + "appDetails":"Application details", + + "settingLanguageText": "Setting Language", + "enterComponentName":"Enter component name", "containerComponents":"Container components", "relatedComponents":"Related components", @@ -57,18 +88,18 @@ "rectangleAndRandomNumbers":"This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data. \nSpecial operation: Click to randomly generate", "bingDwenDwen":"This example is to draw the shape of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics, from which you can learn knowledge such as path drawing and gradient colors.", "pufengInjectionTest":"This sample implements the testing process of the Pufeng needle injection test, estimating pi based on probability. You can learn some drawing tips and logical processing of data.", - "ticTacToe ":"This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset", - "tiled-lines":"The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "joy-division":"The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "cubic-disarray":"The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "triangular-mesh":"The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "un-deux-trois": "The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "circle-packing":"The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "hypnotic-squares":"The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", - "piet-mondrian":"The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "ticTacToe":"This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset", + "tiledLines":"The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "joyDivision":"The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "cubicDisarray":"The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "triangularMesh":"The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "unDeuxTrois": "The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "circlePacking":"The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "hypnoticSquares":"The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", + "pietMondrian":"The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry", "downloadCompressedPackage":"Usage: \n1. Select the icon in iconfont.cn, add the project, and download the compressed file. \n2. Select the Flutter project address, configure resource and product file locations. \n3.Click the Generate Code button to generate the relevant code.", - "QAIssues":"The QA data in the key points collection is included in FlutterUnit's issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.", - "tips:":"tips:", + "qAIssues":"The QA data in the key points collection is included in FlutterUnit's issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.", + "tips":"tips:", "visualSorting":"Visual sorting", "visual":"Visual sorting", "insertion": "Insert sorting", @@ -103,16 +134,11 @@ "stateManagement":"State management", "jsonParsing":"Json Parsing", "clickHereToJump":"Click here to jump to", - "appSettings":"Application Settings", - "darkMode":"Dark Mode ", - "followSystem":"Follow system", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"After activation, it will follow the system to turn on or off dark mode", - "manualSetting":"Manual settings", - "lightMode":"Light mode", - "appDetails":"Application details", + "checkDatabaseNewVersion":"Check for new versions of the database", "viewThisProjectGithubRepository":"《View the Github warehouse for this project》", - "themeColorSetting":"Theme color settings", "dataManagement":"Data management", "backupFavoritesCollectionData":"Backup Collection Data", "syncFavoritesCollectionData":"Synchronize collection data", @@ -122,24 +148,19 @@ "dataSetBackupFailure":"Dataset backup failed!", "dataSynchronizationCopySuccess":"Data synchronization successful!", "dataSynchronizationCopyFailure":"Data synchronization failed!", - "destructionRed":"The Red of Destruction", + "destructionRed":"Destruction Red ", "rageOrange":"Anger Orange", "warningYellow":"Warning Yellow", "camouflageGreen":"Disguising Green", "coldBlue":"Indifferent Blue", "infiniteBlue":"Infinite Indigo", "mysteryPurple":"Mysterious Purple", - "destinyBlack":"The Black of Destiny", - "fontSetting":"Font settings", - "codeHighlightStyle":"Code Highlight Style", - "versionInformation":"Version information", - "showBackground":"Display Background", + "destinyBlack":"Destiny Black", + "toly":"toly", - "DartHandbook":"Dart Handbook", + "dartHandbook":"Dart Handbook", "aboutApplications":"About Applications", "contactThisKing":"Contact this king", - "showFloatingTools":"Show floating tools", - "displayPerformanceFloatingLayer":"Display performance floating layer", "codeCopiedSuccessfully":"Code copied successfully", "favoriteFolderManagement":"Favorite folder management", "assembly":"Assembly", diff --git a/packages/l10n/lib/arb/app_zh.arb b/packages/l10n/lib/arb/app_zh.arb index 56278b06..13349374 100644 --- a/packages/l10n/lib/arb/app_zh.arb +++ b/packages/l10n/lib/arb/app_zh.arb @@ -5,13 +5,48 @@ "treasureTools": "工具宝箱", "collectCollection": "收藏集录", "essentialCollection": "要点集录", - "anamorphic":"无态", + "homeAccount": "用户信息", + + + "searchWidget": "搜索组件", + "stateless":"无态", "stateful":"有态", - "singleShading":"单渲", - "multiShading":"多渲", - "slidePlate":"滑片", - "agent":"代理", + "single":"单渲", + "multi":"多渲", + "sliver":"滑片", + "proxy":"代理", "other":"其他", + "homeTabWidget": "组件", + "homeTabPaint": "绘制", + "homeTabKnowledge": "知识", + "homeTabTools": "工具", + "homeTabMine": "我的", + + "dataManagement":"数据管理", + "userCollection":"我的收藏", + "aboutApplications":"关于应用", + "contactThisKing":"联系本王", + + "appSettings":"应用设置", + "darkMode":"深色模式", + "themeColorSetting":"主题色设置", + "fontSetting":"字体设置", + "settingLanguageText": "多语言", + "codeHighlightStyle":"代码高亮样式", + "versionInformation":"版本信息", + "displayPerformanceFloatingLayer":"显示性能浮层", + + + "showFloatingTools":"显示浮动工具", + + "followSystem":"跟随系统", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"开启后,将跟随系统打开或关闭深色模式", + "manualSetting":"手动设置", + "lightMode":"浅色模式", + "settingLanguage": "设置语言", + + + "favorite":"已收藏", "enterComponentName":"输入组件名称", "containerComponents":"容器组件", @@ -57,18 +92,18 @@ "rectangleAndRandomNumbers":"本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", "bingDwenDwen":"本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。", "pufengInjectionTest":"本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。", - "ticTacToe ":"本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", - "tiled-lines":"本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "joy-division":"本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "cubic-disarray":"本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "triangular-mesh":"本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "un-deux-trois": "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "circle-packing":"本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "hypnotic-squares":"本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - "piet-mondrian":"本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "ticTacToe":"本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", + "tiledLines":"本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "joyDivision":"本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "cubicDisarray":"本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "triangularMesh":"本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "unDeuxTrois": "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "circlePacking":"本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "hypnoticSquares":"本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + "pietMondrian":"本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", "downloadCompressedPackage":"使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。", - "QAIssues":"要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。", - "tips:":"注:", + "qAIssues":"要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。", + "tips":"注:", "visualSorting":"可视化排序", "visual":"可视排序", "insertion": "插入排序", @@ -103,17 +138,13 @@ "stateManagement":"状态管理", "jsonParsing":"Json 解析", "clickHereToJump":"点击这里跳转", - "appSettings":"应用设置", - "darkMode":"深色模式", - "followSystem":"跟随系统", - "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"开启后,将跟随系统打开或关闭深色模式", - "manualSetting":"手动设置", - "lightMode":"浅色模式", + + + "appDetails":"应用详情", "checkDatabaseNewVersion":"检查数据库新版本", "viewThisProjectGithubRepository":"《查看本项目Github仓库》", - "themeColorSetting":"主题色设置", - "dataManagement":"数据管理", + "backupFavoritesCollectionData":"备份收藏集数据", "syncFavoritesCollectionData":"同步收藏集数据", "favoritesCollectionDataReset":"收藏集数据重置", @@ -130,16 +161,11 @@ "infiniteBlue":"无限之靛", "mysteryPurple":"神秘之紫", "destinyBlack":"归宿之黑", - "fontSetting":"字体设置", - "codeHighlightStyle":"代码高亮样式", - "versionInformation":"版本信息", + "showBackground":"显示背景", "toly":"张风捷特烈", - "DartHandbook":"Dart 手册", - "aboutApplications":"关于应用", - "contactThisKing":"联系本王", - "showFloatingTools":"显示浮动工具", - "displayPerformanceFloatingLayer":"显示性能浮层", + "dartHandbook":"Dart 手册", + "codeCopiedSuccessfully":"代码复制成功", "favoriteFolderManagement":"收藏夹管理", "assembly":"组件", diff --git a/packages/l10n/lib/enum/language.dart b/packages/l10n/lib/enum/language.dart new file mode 100644 index 00000000..e3a6287b --- /dev/null +++ b/packages/l10n/lib/enum/language.dart @@ -0,0 +1,14 @@ +import 'dart:ui'; + +enum Language { + zh_CN(locale: Locale('zh','CN'), label: '简体中文'), + en_US(locale: Locale('en','US'), label: 'English'); + + final Locale locale; + final String label; + + const Language({ + required this.locale, + required this.label, + }); +} diff --git a/packages/l10n/lib/gen_l10n/app_localizations.dart b/packages/l10n/lib/gen_l10n/app_localizations.dart index 109a79c1..e731ad55 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations.dart @@ -116,6 +116,930 @@ abstract class AppLocalizations { /// In zh, this message translates to: /// **'工具宝箱'** String get treasureTools; + + /// No description provided for @collectCollection. + /// + /// In zh, this message translates to: + /// **'收藏集录'** + String get collectCollection; + + /// No description provided for @essentialCollection. + /// + /// In zh, this message translates to: + /// **'要点集录'** + String get essentialCollection; + + /// No description provided for @homeAccount. + /// + /// In zh, this message translates to: + /// **'用户信息'** + String get homeAccount; + + /// No description provided for @searchWidget. + /// + /// In zh, this message translates to: + /// **'搜索组件'** + String get searchWidget; + + /// No description provided for @stateless. + /// + /// In zh, this message translates to: + /// **'无态'** + String get stateless; + + /// No description provided for @stateful. + /// + /// In zh, this message translates to: + /// **'有态'** + String get stateful; + + /// No description provided for @single. + /// + /// In zh, this message translates to: + /// **'单渲'** + String get single; + + /// No description provided for @multi. + /// + /// In zh, this message translates to: + /// **'多渲'** + String get multi; + + /// No description provided for @sliver. + /// + /// In zh, this message translates to: + /// **'滑片'** + String get sliver; + + /// No description provided for @proxy. + /// + /// In zh, this message translates to: + /// **'代理'** + String get proxy; + + /// No description provided for @other. + /// + /// In zh, this message translates to: + /// **'其他'** + String get other; + + /// No description provided for @homeTabWidget. + /// + /// In zh, this message translates to: + /// **'组件'** + String get homeTabWidget; + + /// No description provided for @homeTabPaint. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get homeTabPaint; + + /// No description provided for @homeTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get homeTabKnowledge; + + /// No description provided for @homeTabTools. + /// + /// In zh, this message translates to: + /// **'工具'** + String get homeTabTools; + + /// No description provided for @homeTabMine. + /// + /// In zh, this message translates to: + /// **'我的'** + String get homeTabMine; + + /// No description provided for @dataManagement. + /// + /// In zh, this message translates to: + /// **'数据管理'** + String get dataManagement; + + /// No description provided for @userCollection. + /// + /// In zh, this message translates to: + /// **'我的收藏'** + String get userCollection; + + /// No description provided for @aboutApplications. + /// + /// In zh, this message translates to: + /// **'关于应用'** + String get aboutApplications; + + /// No description provided for @contactThisKing. + /// + /// In zh, this message translates to: + /// **'联系本王'** + String get contactThisKing; + + /// No description provided for @appSettings. + /// + /// In zh, this message translates to: + /// **'应用设置'** + String get appSettings; + + /// No description provided for @darkMode. + /// + /// In zh, this message translates to: + /// **'深色模式'** + String get darkMode; + + /// No description provided for @themeColorSetting. + /// + /// In zh, this message translates to: + /// **'主题色设置'** + String get themeColorSetting; + + /// No description provided for @fontSetting. + /// + /// In zh, this message translates to: + /// **'字体设置'** + String get fontSetting; + + /// No description provided for @settingLanguageText. + /// + /// In zh, this message translates to: + /// **'多语言'** + String get settingLanguageText; + + /// No description provided for @codeHighlightStyle. + /// + /// In zh, this message translates to: + /// **'代码高亮样式'** + String get codeHighlightStyle; + + /// No description provided for @versionInformation. + /// + /// In zh, this message translates to: + /// **'版本信息'** + String get versionInformation; + + /// No description provided for @displayPerformanceFloatingLayer. + /// + /// In zh, this message translates to: + /// **'显示性能浮层'** + String get displayPerformanceFloatingLayer; + + /// No description provided for @showFloatingTools. + /// + /// In zh, this message translates to: + /// **'显示浮动工具'** + String get showFloatingTools; + + /// No description provided for @followSystem. + /// + /// In zh, this message translates to: + /// **'跟随系统'** + String get followSystem; + + /// No description provided for @afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode. + /// + /// In zh, this message translates to: + /// **'开启后,将跟随系统打开或关闭深色模式'** + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode; + + /// No description provided for @manualSetting. + /// + /// In zh, this message translates to: + /// **'手动设置'** + String get manualSetting; + + /// No description provided for @lightMode. + /// + /// In zh, this message translates to: + /// **'浅色模式'** + String get lightMode; + + /// No description provided for @settingLanguage. + /// + /// In zh, this message translates to: + /// **'设置语言'** + String get settingLanguage; + + /// No description provided for @favorite. + /// + /// In zh, this message translates to: + /// **'已收藏'** + String get favorite; + + /// No description provided for @enterComponentName. + /// + /// In zh, this message translates to: + /// **'输入组件名称'** + String get enterComponentName; + + /// No description provided for @containerComponents. + /// + /// In zh, this message translates to: + /// **'容器组件'** + String get containerComponents; + + /// No description provided for @relatedComponents. + /// + /// In zh, this message translates to: + /// **'相关组件'** + String get relatedComponents; + + /// No description provided for @componentTavern. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get componentTavern; + + /// No description provided for @cherishedComponents. + /// + /// In zh, this message translates to: + /// **'珍藏组件'** + String get cherishedComponents; + + /// No description provided for @textImageCollection. + /// + /// In zh, this message translates to: + /// **'图文集'** + String get textImageCollection; + + /// No description provided for @layoutCollection. + /// + /// In zh, this message translates to: + /// **'布局集'** + String get layoutCollection; + + /// No description provided for @eventCollection. + /// + /// In zh, this message translates to: + /// **'事件集'** + String get eventCollection; + + /// No description provided for @animationCollection. + /// + /// In zh, this message translates to: + /// **'动画集'** + String get animationCollection; + + /// No description provided for @slidingCollection. + /// + /// In zh, this message translates to: + /// **'滑动集'** + String get slidingCollection; + + /// No description provided for @decorationCollection. + /// + /// In zh, this message translates to: + /// **'装饰集'** + String get decorationCollection; + + /// No description provided for @assemblyCollection. + /// + /// In zh, this message translates to: + /// **'组装集'** + String get assemblyCollection; + + /// No description provided for @functionCollection. + /// + /// In zh, this message translates to: + /// **'功能集'** + String get functionCollection; + + /// No description provided for @popupCollection. + /// + /// In zh, this message translates to: + /// **'弹出集'** + String get popupCollection; + + /// No description provided for @themeCollection. + /// + /// In zh, this message translates to: + /// **'主题集'** + String get themeCollection; + + /// No description provided for @derivativeCollection. + /// + /// In zh, this message translates to: + /// **'衍生集'** + String get derivativeCollection; + + /// No description provided for @hardToCategorize. + /// + /// In zh, this message translates to: + /// **'很难分'** + String get hardToCategorize; + + /// No description provided for @basicDrawing. + /// + /// In zh, this message translates to: + /// **'基础绘制'** + String get basicDrawing; + + /// No description provided for @animationGesture. + /// + /// In zh, this message translates to: + /// **'动画手势'** + String get animationGesture; + + /// No description provided for @particleDrawing. + /// + /// In zh, this message translates to: + /// **'粒子绘制'** + String get particleDrawing; + + /// No description provided for @interestingDrawing. + /// + /// In zh, this message translates to: + /// **'趣味绘制'** + String get interestingDrawing; + + /// No description provided for @artGallery. + /// + /// In zh, this message translates to: + /// **'艺术画廊'** + String get artGallery; + + /// No description provided for @drawingOfImages. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 '** + String get drawingOfImages; + + /// No description provided for @digitalDisplayTube. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 '** + String get digitalDisplayTube; + + /// No description provided for @pathDrawing. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 '** + String get pathDrawing; + + /// No description provided for @gridCoordinateSystem. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 '** + String get gridCoordinateSystem; + + /// No description provided for @polarCoordinateSystemOfFaces. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 '** + String get polarCoordinateSystemOfFaces; + + /// No description provided for @drawFunctionCurvesForPathPairs. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 '** + String get drawFunctionCurvesForPathPairs; + + /// No description provided for @drawRegularPolygons. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数'** + String get drawRegularPolygons; + + /// No description provided for @randomNumberProcessing. + /// + /// In zh, this message translates to: + /// **'本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。'** + String get randomNumberProcessing; + + /// No description provided for @clockDrawing. + /// + /// In zh, this message translates to: + /// **'本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。'** + String get clockDrawing; + + /// No description provided for @drawSprings. + /// + /// In zh, this message translates to: + /// **' 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 '** + String get drawSprings; + + /// No description provided for @theApplicationOfAnglesInDrawing. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行'** + String get theApplicationOfAnglesInDrawing; + + /// No description provided for @usingShadersAndFilters. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。'** + String get usingShadersAndFilters; + + /// No description provided for @pathDrawingFunctionCurve. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画'** + String get pathDrawingFunctionCurve; + + /// No description provided for @thePathOfBingDwenDwen. + /// + /// In zh, this message translates to: + /// **'本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行'** + String get thePathOfBingDwenDwen; + + /// No description provided for @drawCubicBesselCurve. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除'** + String get drawCubicBesselCurve; + + /// No description provided for @theEffectOfAnimationCurve. + /// + /// In zh, this message translates to: + /// **'本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行'** + String get theEffectOfAnimationCurve; + + /// No description provided for @randomParticlesAndBoundaryBouncing. + /// + /// In zh, this message translates to: + /// **' 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 '** + String get randomParticlesAndBoundaryBouncing; + + /// No description provided for @particleCollision. + /// + /// In zh, this message translates to: + /// **'本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置'** + String get particleCollision; + + /// No description provided for @particle. + /// + /// In zh, this message translates to: + /// **'本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行'** + String get particle; + + /// No description provided for @rectangleAndRandomNumbers. + /// + /// In zh, this message translates to: + /// **'本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成'** + String get rectangleAndRandomNumbers; + + /// No description provided for @bingDwenDwen. + /// + /// In zh, this message translates to: + /// **'本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。'** + String get bingDwenDwen; + + /// No description provided for @pufengInjectionTest. + /// + /// In zh, this message translates to: + /// **'本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。'** + String get pufengInjectionTest; + + /// No description provided for @ticTacToe. + /// + /// In zh, this message translates to: + /// **'本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置'** + String get ticTacToe; + + /// No description provided for @tiledLines. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get tiledLines; + + /// No description provided for @joyDivision. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get joyDivision; + + /// No description provided for @cubicDisarray. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get cubicDisarray; + + /// No description provided for @triangularMesh. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get triangularMesh; + + /// No description provided for @unDeuxTrois. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get unDeuxTrois; + + /// No description provided for @circlePacking. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get circlePacking; + + /// No description provided for @hypnoticSquares. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get hypnoticSquares; + + /// No description provided for @pietMondrian. + /// + /// In zh, this message translates to: + /// **'本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'** + String get pietMondrian; + + /// No description provided for @downloadCompressedPackage. + /// + /// In zh, this message translates to: + /// **'使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。'** + String get downloadCompressedPackage; + + /// No description provided for @qAIssues. + /// + /// In zh, this message translates to: + /// **'要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'** + String get qAIssues; + + /// No description provided for @tips. + /// + /// In zh, this message translates to: + /// **'注:'** + String get tips; + + /// No description provided for @visualSorting. + /// + /// In zh, this message translates to: + /// **'可视化排序'** + String get visualSorting; + + /// No description provided for @visual. + /// + /// In zh, this message translates to: + /// **'可视排序'** + String get visual; + + /// No description provided for @insertion. + /// + /// In zh, this message translates to: + /// **'插入排序'** + String get insertion; + + /// No description provided for @bubble. + /// + /// In zh, this message translates to: + /// **'冒泡排序'** + String get bubble; + + /// No description provided for @cocktail. + /// + /// In zh, this message translates to: + /// **'鸡尾酒排序(双向冒泡排序)'** + String get cocktail; + + /// No description provided for @comb. + /// + /// In zh, this message translates to: + /// **'梳排序'** + String get comb; + + /// No description provided for @pigeonHole. + /// + /// In zh, this message translates to: + /// **'鸽巢排序'** + String get pigeonHole; + + /// No description provided for @shell. + /// + /// In zh, this message translates to: + /// **'希尔排序'** + String get shell; + + /// No description provided for @selection. + /// + /// In zh, this message translates to: + /// **'选择排序'** + String get selection; + + /// No description provided for @gnome. + /// + /// In zh, this message translates to: + /// **'侏儒排序'** + String get gnome; + + /// No description provided for @cycle. + /// + /// In zh, this message translates to: + /// **'循环排序'** + String get cycle; + + /// No description provided for @heap. + /// + /// In zh, this message translates to: + /// **'堆排序'** + String get heap; + + /// No description provided for @quick. + /// + /// In zh, this message translates to: + /// **'快速排序'** + String get quick; + + /// No description provided for @merge. + /// + /// In zh, this message translates to: + /// **'归并排序'** + String get merge; + + /// No description provided for @sortingAlgorithmConfiguration. + /// + /// In zh, this message translates to: + /// **'排序算法配置'** + String get sortingAlgorithmConfiguration; + + /// No description provided for @dataCount. + /// + /// In zh, this message translates to: + /// **'数据数量(个数)'** + String get dataCount; + + /// No description provided for @timeInterval. + /// + /// In zh, this message translates to: + /// **'时间间隔(微秒)'** + String get timeInterval; + + /// No description provided for @randomSeed. + /// + /// In zh, this message translates to: + /// **'随机种子'** + String get randomSeed; + + /// No description provided for @codeGeneration. + /// + /// In zh, this message translates to: + /// **'代码生成'** + String get codeGeneration; + + /// No description provided for @generateCode. + /// + /// In zh, this message translates to: + /// **'生成代码'** + String get generateCode; + + /// No description provided for @artifactLocation. + /// + /// In zh, this message translates to: + /// **'产物位置'** + String get artifactLocation; + + /// No description provided for @codeClassLocation. + /// + /// In zh, this message translates to: + /// **'代码类存放位置'** + String get codeClassLocation; + + /// No description provided for @resourceDirectory. + /// + /// In zh, this message translates to: + /// **'资源目录'** + String get resourceDirectory; + + /// No description provided for @iconfontResourceLocation. + /// + /// In zh, this message translates to: + /// **'iconfont 资源存放位置'** + String get iconfontResourceLocation; + + /// No description provided for @projectPath. + /// + /// In zh, this message translates to: + /// **'项目路径'** + String get projectPath; + + /// No description provided for @inputProjectAddress. + /// + /// In zh, this message translates to: + /// **'请选择或输入项目地址'** + String get inputProjectAddress; + + /// No description provided for @iconfontCompressedPackagePath. + /// + /// In zh, this message translates to: + /// **'Iconfont 压缩包路径'** + String get iconfontCompressedPackagePath; + + /// No description provided for @pleaseSelectOrInputIconfontCompressedPackagePath. + /// + /// In zh, this message translates to: + /// **'请选择或输入 iconfont 下载的压缩包路径'** + String get pleaseSelectOrInputIconfontCompressedPackagePath; + + /// No description provided for @stayTuned. + /// + /// In zh, this message translates to: + /// **'敬请期待'** + String get stayTuned; + + /// No description provided for @iconFont. + /// + /// In zh, this message translates to: + /// **'IconFont'** + String get iconFont; + + /// No description provided for @dataClass. + /// + /// In zh, this message translates to: + /// **'数据类'** + String get dataClass; + + /// No description provided for @stateManagement. + /// + /// In zh, this message translates to: + /// **'状态管理'** + String get stateManagement; + + /// No description provided for @jsonParsing. + /// + /// In zh, this message translates to: + /// **'Json 解析'** + String get jsonParsing; + + /// No description provided for @clickHereToJump. + /// + /// In zh, this message translates to: + /// **'点击这里跳转'** + String get clickHereToJump; + + /// No description provided for @appDetails. + /// + /// In zh, this message translates to: + /// **'应用详情'** + String get appDetails; + + /// No description provided for @checkDatabaseNewVersion. + /// + /// In zh, this message translates to: + /// **'检查数据库新版本'** + String get checkDatabaseNewVersion; + + /// No description provided for @viewThisProjectGithubRepository. + /// + /// In zh, this message translates to: + /// **'《查看本项目Github仓库》'** + String get viewThisProjectGithubRepository; + + /// No description provided for @backupFavoritesCollectionData. + /// + /// In zh, this message translates to: + /// **'备份收藏集数据'** + String get backupFavoritesCollectionData; + + /// No description provided for @syncFavoritesCollectionData. + /// + /// In zh, this message translates to: + /// **'同步收藏集数据'** + String get syncFavoritesCollectionData; + + /// No description provided for @favoritesCollectionDataReset. + /// + /// In zh, this message translates to: + /// **'收藏集数据重置'** + String get favoritesCollectionDataReset; + + /// No description provided for @resetSuccess. + /// + /// In zh, this message translates to: + /// **'重置成功!'** + String get resetSuccess; + + /// No description provided for @dataSetBackupSuccess. + /// + /// In zh, this message translates to: + /// **'数据集备份成功!'** + String get dataSetBackupSuccess; + + /// No description provided for @dataSetBackupFailure. + /// + /// In zh, this message translates to: + /// **'数据集备份失败!'** + String get dataSetBackupFailure; + + /// No description provided for @dataSynchronizationCopySuccess. + /// + /// In zh, this message translates to: + /// **'数据同步份成功!'** + String get dataSynchronizationCopySuccess; + + /// No description provided for @dataSynchronizationCopyFailure. + /// + /// In zh, this message translates to: + /// **'数据同步份失败!'** + String get dataSynchronizationCopyFailure; + + /// No description provided for @destructionRed. + /// + /// In zh, this message translates to: + /// **'毁灭之红'** + String get destructionRed; + + /// No description provided for @rageOrange. + /// + /// In zh, this message translates to: + /// **'愤怒之橙'** + String get rageOrange; + + /// No description provided for @warningYellow. + /// + /// In zh, this message translates to: + /// **'警告之黄'** + String get warningYellow; + + /// No description provided for @camouflageGreen. + /// + /// In zh, this message translates to: + /// **'伪装之绿'** + String get camouflageGreen; + + /// No description provided for @coldBlue. + /// + /// In zh, this message translates to: + /// **'冷漠之蓝'** + String get coldBlue; + + /// No description provided for @infiniteBlue. + /// + /// In zh, this message translates to: + /// **'无限之靛'** + String get infiniteBlue; + + /// No description provided for @mysteryPurple. + /// + /// In zh, this message translates to: + /// **'神秘之紫'** + String get mysteryPurple; + + /// No description provided for @destinyBlack. + /// + /// In zh, this message translates to: + /// **'归宿之黑'** + String get destinyBlack; + + /// No description provided for @showBackground. + /// + /// In zh, this message translates to: + /// **'显示背景'** + String get showBackground; + + /// No description provided for @toly. + /// + /// In zh, this message translates to: + /// **'张风捷特烈'** + String get toly; + + /// No description provided for @dartHandbook. + /// + /// In zh, this message translates to: + /// **'Dart 手册'** + String get dartHandbook; + + /// No description provided for @codeCopiedSuccessfully. + /// + /// In zh, this message translates to: + /// **'代码复制成功'** + String get codeCopiedSuccessfully; + + /// No description provided for @favoriteFolderManagement. + /// + /// In zh, this message translates to: + /// **'收藏夹管理'** + String get favoriteFolderManagement; + + /// No description provided for @assembly. + /// + /// In zh, this message translates to: + /// **'组件'** + String get assembly; + + /// No description provided for @draw. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get draw; + + /// No description provided for @knowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get knowledge; + + /// No description provided for @collection. + /// + /// In zh, this message translates to: + /// **'收藏'** + String get collection; + + /// No description provided for @my. + /// + /// In zh, this message translates to: + /// **'我的'** + String get my; } class _AppLocalizationsDelegate extends LocalizationsDelegate { diff --git a/packages/l10n/lib/gen_l10n/app_localizations_en.dart b/packages/l10n/lib/gen_l10n/app_localizations_en.dart index d621bd39..47290cb5 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_en.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_en.dart @@ -15,4 +15,466 @@ class AppLocalizationsEn extends AppLocalizations { @override String get treasureTools => 'Treasure'; + + @override + String get collectCollection => 'CollectionCollection'; + + @override + String get essentialCollection => 'KeypointsCollection'; + + @override + String get homeAccount => 'Account'; + + @override + String get searchWidget => 'search widget...'; + + @override + String get stateless => 'Stateless'; + + @override + String get stateful => 'Stateful'; + + @override + String get single => 'Single'; + + @override + String get multi => 'Multi'; + + @override + String get sliver => 'Sliver'; + + @override + String get proxy => 'Proxy'; + + @override + String get other => 'Other'; + + @override + String get homeTabWidget => 'Widget'; + + @override + String get homeTabPaint => 'Paint'; + + @override + String get homeTabKnowledge => 'Knowledge'; + + @override + String get homeTabTools => 'Treasure'; + + @override + String get homeTabMine => 'Mine'; + + @override + String get dataManagement => 'Data management'; + + @override + String get userCollection => 'Collection'; + + @override + String get aboutApplications => 'About Applications'; + + @override + String get contactThisKing => 'Contact this king'; + + @override + String get appSettings => 'Application Setting'; + + @override + String get darkMode => 'Dark Mode '; + + @override + String get themeColorSetting => 'Theme Color'; + + @override + String get fontSetting => 'Font Setting'; + + @override + String get settingLanguageText => 'Setting Language'; + + @override + String get codeHighlightStyle => 'Code Highlight Style'; + + @override + String get versionInformation => 'App Version'; + + @override + String get displayPerformanceFloatingLayer => 'Performance Layer'; + + @override + String get showFloatingTools => 'Show floating tools'; + + @override + String get followSystem => 'Follow system'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => 'After activation, it will follow the system to turn on or off dark mode'; + + @override + String get manualSetting => 'Manual settings'; + + @override + String get lightMode => 'Light mode'; + + @override + String get settingLanguage => 'Language Setting'; + + @override + String get favorite => 'Collected'; + + @override + String get enterComponentName => 'Enter component name'; + + @override + String get containerComponents => 'Container components'; + + @override + String get relatedComponents => 'Related components'; + + @override + String get componentTavern => 'Component Tavern'; + + @override + String get cherishedComponents => 'Treasure components'; + + @override + String get textImageCollection => 'TextImageCollection'; + + @override + String get layoutCollection => 'LayoutCollection'; + + @override + String get eventCollection => 'EventCollection'; + + @override + String get animationCollection => 'AnimationCollection'; + + @override + String get slidingCollection => 'SlidingCollection'; + + @override + String get decorationCollection => 'DecorativeCollection'; + + @override + String get assemblyCollection => 'AssemblyCollection'; + + @override + String get functionCollection => 'FeatureCollection'; + + @override + String get popupCollection => 'Pop upCollection'; + + @override + String get themeCollection => 'ThemeCollection'; + + @override + String get derivativeCollection => 'DerivativeCollection'; + + @override + String get hardToCategorize => 'It\'s hard to distinguish'; + + @override + String get basicDrawing => 'Basic drawing'; + + @override + String get animationGesture => 'Animated gestures'; + + @override + String get particleDrawing => 'Particle drawing'; + + @override + String get interestingDrawing => 'Fun drawing'; + + @override + String get artGallery => 'Art galleries '; + + @override + String get drawingOfImages => 'This example explains how to draw images: by loading images and drawing image resources to a specified area. Draw a batch of 45 \"angled grid lines on the upper layer to practice drawing the lines '; + + @override + String get digitalDisplayTube => 'This example introduces how to draw LED digital display tubes to practice the use, transformation, combination of path paths, and knowledge of component packaging. It is a very good drawing case '; + + @override + String get pathDrawing => 'This example introduces how to perform simple path drawing, rotate the drawing board, and combine animation to make the windmill rotate. This is a very concise case of combining drawing and animation. '; + + @override + String get gridCoordinateSystem => 'This example explains how to use line diameter and text to draw a grid coordinate system, and encapsulate the drawn objects for easy reuse. The coordinate system also provides reference during drawing, which is essential for beginners.'; + + @override + String get polarCoordinateSystemOfFaces => 'This example explains how to use a polar coordinate system to draw a plane and collect polar coordinates based on a function equation for drawing. '; + + @override + String get drawFunctionCurvesForPathPairs => 'This example explains how to use a path to draw a function curve, fitting a small number of points on the function curve through a Bessel curve. '; + + @override + String get drawRegularPolygons => 'This example introduces how to collect points in a circle and draw regular polygons, which is a good example for practicing drawing and forming paths. \n Special operations:+, - Modify the number of edges'; + + @override + String get randomNumberProcessing => 'This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data.'; + + @override + String get clockDrawing => 'This example uses the drawing of a clock to practice the drawing technique of rotating scale types in Flutter, and uses animation to rotate the dial pointer.'; + + @override + String get drawSprings => ' This example introduces how to draw a spring, stretch and compress it vertically through the contact points, and restore the animation when releasing it. It is a good comprehensive small case. Special operation: Drag the telescopic spring up and down '; + + @override + String get theApplicationOfAnglesInDrawing => 'This example explains how to perform rotational motion based on a point as the center. Learn the application of the angle between two points in drawing. \n Special operation: Click to run'; + + @override + String get usingShadersAndFilters => 'This example explains how to use shaders and filters in painting, and achieve a rotating streamer effect through animation with numerical variations.'; + + @override + String get pathDrawingFunctionCurve => 'This example explains how to use path to draw function curves and use path measurement for animation'; + + @override + String get thePathOfBingDwenDwen => 'This sample will draw the path of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics and use path measurement for animation. \n Special operation: Click to run'; + + @override + String get drawCubicBesselCurve => 'This example introduces how to draw a cubic Bezier curve, determine whether a point is activated through the contacts, and use this to control the position of the point to achieve drag control effect. \n Special operation: Click on the drawing point, double-click to clear it'; + + @override + String get theEffectOfAnimationCurve => 'This example provides an intuitive way to examine the effect of animation curves, allowing everyone to have a deeper understanding of animation. \n Special operation: Click to run'; + + @override + String get randomParticlesAndBoundaryBouncing => 'This example introduces how to create random particles and handle boundary bounce logic, which is a great starting point for learning particle motion. Special operation: click to stop running '; + + @override + String get particleCollision => 'This example introduces how to perform collision detection on a particle and split multiple particles, which is an interesting case. \n Special operation: Click Reset'; + + @override + String get particle => 'This example introduces using particles to represent images and animating them to achieve explosive effects. \nSpecial operation: Click to run'; + + @override + String get rectangleAndRandomNumbers => 'This example introduces drawing rectangles and handling random numbers. Determine the rectangular position information through a set of points and draw it. Can practice the ability to control data. \nSpecial operation: Click to randomly generate'; + + @override + String get bingDwenDwen => 'This example is to draw the shape of the mascot Bing Dwen Dwen for the 2022 Beijing Winter Olympics, from which you can learn knowledge such as path drawing and gradient colors.'; + + @override + String get pufengInjectionTest => 'This sample implements the testing process of the Pufeng needle injection test, estimating pi based on probability. You can learn some drawing tips and logical processing of data.'; + + @override + String get ticTacToe => 'This example combines important skills such as gestures, drawing, animation, and verification through the drawing and logical verification of the Chinese checkerboard, making it a very good case study. \n Special operation: Double click to reset'; + + @override + String get tiledLines => 'The root cause of this example comes from generateArchistry.com tiled-lines,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get joyDivision => 'The root cause of this example comes from generateArchistry.com joy-division,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get cubicDisarray => 'The root cause of this example comes from generateArchistry.com cubic-disarray,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get triangularMesh => 'The root cause of this example comes from generateArchistry.com triangular-mesh,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get unDeuxTrois => 'The root cause of this example comes from generateArchistry.com un-deux-trois,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get circlePacking => 'The root cause of this example comes from generateArchistry.com circle-packing,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get hypnoticSquares => 'The root cause of this example comes from generateArchistry.com hypnotic-squares,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get pietMondrian => 'The root cause of this example comes from generateArchistry.com piet-mondrian,Implemented by xrr 2016 using Flutter。Warehouse address:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => 'Usage: \n1. Select the icon in iconfont.cn, add the project, and download the compressed file. \n2. Select the Flutter project address, configure resource and product file locations. \n3.Click the Generate Code button to generate the relevant code.'; + + @override + String get qAIssues => 'The QA data in the key points collection is included in FlutterUnit\'s issues labeled with points. If data needs to be provided, simply ask and answer in the issues section.'; + + @override + String get tips => 'tips:'; + + @override + String get visualSorting => 'Visual sorting'; + + @override + String get visual => 'Visual sorting'; + + @override + String get insertion => 'Insert sorting'; + + @override + String get bubble => 'Bubble sorting'; + + @override + String get cocktail => 'Cocktail sorting (bidirectional bubble sorting)'; + + @override + String get comb => 'Comb sorting'; + + @override + String get pigeonHole => 'Pigeonhole sorting '; + + @override + String get shell => 'Shell sorting '; + + @override + String get selection => 'Select sorting'; + + @override + String get gnome => 'Dwarf Sorting'; + + @override + String get cycle => 'Circular sorting'; + + @override + String get heap => 'Heap sorting'; + + @override + String get quick => 'Quick sorting'; + + @override + String get merge => 'Merge sorting'; + + @override + String get sortingAlgorithmConfiguration => 'Sorting algorithm configuration'; + + @override + String get dataCount => 'Data quantity (number)'; + + @override + String get timeInterval => 'Time interval (microseconds)'; + + @override + String get randomSeed => 'Random Seed'; + + @override + String get codeGeneration => 'Code generation'; + + @override + String get generateCode => 'Generate Code'; + + @override + String get artifactLocation => 'Product location'; + + @override + String get codeClassLocation => 'Code class storage location'; + + @override + String get resourceDirectory => 'Resource Catalog'; + + @override + String get iconfontResourceLocation => 'iconfont Resource storage location'; + + @override + String get projectPath => 'Project Path'; + + @override + String get inputProjectAddress => 'Please select or enter the project address'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont Compressed package path'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'Please select or enter the compressed file path for iconfont download'; + + @override + String get stayTuned => 'Stay tuned'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'Data class'; + + @override + String get stateManagement => 'State management'; + + @override + String get jsonParsing => 'Json Parsing'; + + @override + String get clickHereToJump => 'Click here to jump to'; + + @override + String get appDetails => 'Application details'; + + @override + String get checkDatabaseNewVersion => 'Check for new versions of the database'; + + @override + String get viewThisProjectGithubRepository => '《View the Github warehouse for this project》'; + + @override + String get backupFavoritesCollectionData => 'Backup Collection Data'; + + @override + String get syncFavoritesCollectionData => 'Synchronize collection data'; + + @override + String get favoritesCollectionDataReset => 'Reset Collection Data'; + + @override + String get resetSuccess => 'Reset successful!'; + + @override + String get dataSetBackupSuccess => 'Dataset backup successful!'; + + @override + String get dataSetBackupFailure => 'Dataset backup failed!'; + + @override + String get dataSynchronizationCopySuccess => 'Data synchronization successful!'; + + @override + String get dataSynchronizationCopyFailure => 'Data synchronization failed!'; + + @override + String get destructionRed => 'Destruction Red '; + + @override + String get rageOrange => 'Anger Orange'; + + @override + String get warningYellow => 'Warning Yellow'; + + @override + String get camouflageGreen => 'Disguising Green'; + + @override + String get coldBlue => 'Indifferent Blue'; + + @override + String get infiniteBlue => 'Infinite Indigo'; + + @override + String get mysteryPurple => 'Mysterious Purple'; + + @override + String get destinyBlack => 'Destiny Black'; + + @override + String get showBackground => 'Display Background'; + + @override + String get toly => 'toly'; + + @override + String get dartHandbook => 'Dart Handbook'; + + @override + String get codeCopiedSuccessfully => 'Code copied successfully'; + + @override + String get favoriteFolderManagement => 'Favorite folder management'; + + @override + String get assembly => 'Assembly'; + + @override + String get draw => 'Draw'; + + @override + String get knowledge => 'Knowledge'; + + @override + String get collection => 'Collection'; + + @override + String get my => 'My'; } diff --git a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart index e94ba26b..f1f8e66e 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -15,4 +15,466 @@ class AppLocalizationsZh extends AppLocalizations { @override String get treasureTools => '工具宝箱'; + + @override + String get collectCollection => '收藏集录'; + + @override + String get essentialCollection => '要点集录'; + + @override + String get homeAccount => '用户信息'; + + @override + String get searchWidget => '搜索组件'; + + @override + String get stateless => '无态'; + + @override + String get stateful => '有态'; + + @override + String get single => '单渲'; + + @override + String get multi => '多渲'; + + @override + String get sliver => '滑片'; + + @override + String get proxy => '代理'; + + @override + String get other => '其他'; + + @override + String get homeTabWidget => '组件'; + + @override + String get homeTabPaint => '绘制'; + + @override + String get homeTabKnowledge => '知识'; + + @override + String get homeTabTools => '工具'; + + @override + String get homeTabMine => '我的'; + + @override + String get dataManagement => '数据管理'; + + @override + String get userCollection => '我的收藏'; + + @override + String get aboutApplications => '关于应用'; + + @override + String get contactThisKing => '联系本王'; + + @override + String get appSettings => '应用设置'; + + @override + String get darkMode => '深色模式'; + + @override + String get themeColorSetting => '主题色设置'; + + @override + String get fontSetting => '字体设置'; + + @override + String get settingLanguageText => '多语言'; + + @override + String get codeHighlightStyle => '代码高亮样式'; + + @override + String get versionInformation => '版本信息'; + + @override + String get displayPerformanceFloatingLayer => '显示性能浮层'; + + @override + String get showFloatingTools => '显示浮动工具'; + + @override + String get followSystem => '跟随系统'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '开启后,将跟随系统打开或关闭深色模式'; + + @override + String get manualSetting => '手动设置'; + + @override + String get lightMode => '浅色模式'; + + @override + String get settingLanguage => '设置语言'; + + @override + String get favorite => '已收藏'; + + @override + String get enterComponentName => '输入组件名称'; + + @override + String get containerComponents => '容器组件'; + + @override + String get relatedComponents => '相关组件'; + + @override + String get componentTavern => '组件酒肆'; + + @override + String get cherishedComponents => '珍藏组件'; + + @override + String get textImageCollection => '图文集'; + + @override + String get layoutCollection => '布局集'; + + @override + String get eventCollection => '事件集'; + + @override + String get animationCollection => '动画集'; + + @override + String get slidingCollection => '滑动集'; + + @override + String get decorationCollection => '装饰集'; + + @override + String get assemblyCollection => '组装集'; + + @override + String get functionCollection => '功能集'; + + @override + String get popupCollection => '弹出集'; + + @override + String get themeCollection => '主题集'; + + @override + String get derivativeCollection => '衍生集'; + + @override + String get hardToCategorize => '很难分'; + + @override + String get basicDrawing => '基础绘制'; + + @override + String get animationGesture => '动画手势'; + + @override + String get particleDrawing => '粒子绘制'; + + @override + String get interestingDrawing => '趣味绘制'; + + @override + String get artGallery => '艺术画廊'; + + @override + String get drawingOfImages => '本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 '; + + @override + String get digitalDisplayTube => '本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 '; + + @override + String get pathDrawing => '本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 '; + + @override + String get gridCoordinateSystem => '本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。 '; + + @override + String get polarCoordinateSystemOfFaces => '本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。 '; + + @override + String get drawFunctionCurvesForPathPairs => '本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。 '; + + @override + String get drawRegularPolygons => '本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数'; + + @override + String get randomNumberProcessing => '本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。'; + + @override + String get clockDrawing => '本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。'; + + @override + String get drawSprings => ' 本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。特殊操作:上下拖拽伸缩弹簧 '; + + @override + String get theApplicationOfAnglesInDrawing => '本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行'; + + @override + String get usingShadersAndFilters => '本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。'; + + @override + String get pathDrawingFunctionCurve => '本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画'; + + @override + String get thePathOfBingDwenDwen => '本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行'; + + @override + String get drawCubicBesselCurve => '本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除'; + + @override + String get theEffectOfAnimationCurve => '本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行'; + + @override + String get randomParticlesAndBoundaryBouncing => ' 本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例特殊操作:单击停止/运行 '; + + @override + String get particleCollision => '本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置'; + + @override + String get particle => '本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行'; + + @override + String get rectangleAndRandomNumbers => '本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成'; + + @override + String get bingDwenDwen => '本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。'; + + @override + String get pufengInjectionTest => '本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。'; + + @override + String get ticTacToe => '本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置'; + + @override + String get tiledLines => '本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get joyDivision => '本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get cubicDisarray => '本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get triangularMesh => '本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get unDeuxTrois => '本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get circlePacking => '本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get hypnoticSquares => '本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get pietMondrian => '本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '使用方式:\n1. 在 iconfont.cn 挑选图标,加入项目,下载压缩包。\n2. 选择 Flutter 项目地址,配置资源、产物文件位置。\n3. 点击生成代码按钮,即可生成相关代码。'; + + @override + String get qAIssues => '要点集录中的 QA 数据收录rUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'; + + @override + String get tips => '注:'; + + @override + String get visualSorting => '可视化排序'; + + @override + String get visual => '可视排序'; + + @override + String get insertion => '插入排序'; + + @override + String get bubble => '冒泡排序'; + + @override + String get cocktail => '鸡尾酒排序(双向冒泡排序)'; + + @override + String get comb => '梳排序'; + + @override + String get pigeonHole => '鸽巢排序'; + + @override + String get shell => '希尔排序'; + + @override + String get selection => '选择排序'; + + @override + String get gnome => '侏儒排序'; + + @override + String get cycle => '循环排序'; + + @override + String get heap => '堆排序'; + + @override + String get quick => '快速排序'; + + @override + String get merge => '归并排序'; + + @override + String get sortingAlgorithmConfiguration => '排序算法配置'; + + @override + String get dataCount => '数据数量(个数)'; + + @override + String get timeInterval => '时间间隔(微秒)'; + + @override + String get randomSeed => '随机种子'; + + @override + String get codeGeneration => '代码生成'; + + @override + String get generateCode => '生成代码'; + + @override + String get artifactLocation => '产物位置'; + + @override + String get codeClassLocation => '代码类存放位置'; + + @override + String get resourceDirectory => '资源目录'; + + @override + String get iconfontResourceLocation => 'iconfont 资源存放位置'; + + @override + String get projectPath => '项目路径'; + + @override + String get inputProjectAddress => '请选择或输入项目地址'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont 压缩包路径'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => '请选择或输入 iconfont 下载的压缩包路径'; + + @override + String get stayTuned => '敬请期待'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => '数据类'; + + @override + String get stateManagement => '状态管理'; + + @override + String get jsonParsing => 'Json 解析'; + + @override + String get clickHereToJump => '点击这里跳转'; + + @override + String get appDetails => '应用详情'; + + @override + String get checkDatabaseNewVersion => '检查数据库新版本'; + + @override + String get viewThisProjectGithubRepository => '《查看本项目Github仓库》'; + + @override + String get backupFavoritesCollectionData => '备份收藏集数据'; + + @override + String get syncFavoritesCollectionData => '同步收藏集数据'; + + @override + String get favoritesCollectionDataReset => '收藏集数据重置'; + + @override + String get resetSuccess => '重置成功!'; + + @override + String get dataSetBackupSuccess => '数据集备份成功!'; + + @override + String get dataSetBackupFailure => '数据集备份失败!'; + + @override + String get dataSynchronizationCopySuccess => '数据同步份成功!'; + + @override + String get dataSynchronizationCopyFailure => '数据同步份失败!'; + + @override + String get destructionRed => '毁灭之红'; + + @override + String get rageOrange => '愤怒之橙'; + + @override + String get warningYellow => '警告之黄'; + + @override + String get camouflageGreen => '伪装之绿'; + + @override + String get coldBlue => '冷漠之蓝'; + + @override + String get infiniteBlue => '无限之靛'; + + @override + String get mysteryPurple => '神秘之紫'; + + @override + String get destinyBlack => '归宿之黑'; + + @override + String get showBackground => '显示背景'; + + @override + String get toly => '张风捷特烈'; + + @override + String get dartHandbook => 'Dart 手册'; + + @override + String get codeCopiedSuccessfully => '代码复制成功'; + + @override + String get favoriteFolderManagement => '收藏夹管理'; + + @override + String get assembly => '组件'; + + @override + String get draw => '绘制'; + + @override + String get knowledge => '知识'; + + @override + String get collection => '收藏'; + + @override + String get my => '我的'; } diff --git a/packages/l10n/lib/l10n.dart b/packages/l10n/lib/l10n.dart index f2a066bd..74a26a66 100644 --- a/packages/l10n/lib/l10n.dart +++ b/packages/l10n/lib/l10n.dart @@ -1,3 +1,4 @@ library l10n; export 'ext.dart'; +export 'enum/language.dart'; diff --git a/packages/storage/lib/src/sp_storage/models/app_config_po.dart b/packages/storage/lib/src/sp_storage/models/app_config_po.dart index c3eaeb23..3c9d4451 100644 --- a/packages/storage/lib/src/sp_storage/models/app_config_po.dart +++ b/packages/storage/lib/src/sp_storage/models/app_config_po.dart @@ -5,6 +5,7 @@ class AppConfigPo { final bool showOverlayTool; final bool showPerformanceOverlay; final int fontFamilyIndex; + final int languageIndex; final int codeStyleIndex; final int themeModeIndex; final int itemStyleIndex; @@ -15,6 +16,7 @@ class AppConfigPo { this.showOverlayTool = false, this.showPerformanceOverlay = false, this.fontFamilyIndex = 1, + this.languageIndex = 0, this.themeColorIndex = 4, this.codeStyleIndex = 0, this.themeModeIndex = 0, @@ -31,6 +33,7 @@ class AppConfigPo { codeStyleIndex: map['codeStyleIndex'] ?? 0, themeModeIndex: map['themeModeIndex'] ?? 0, itemStyleIndex: map['itemStyleIndex'] ?? 0, + languageIndex: map['languageIndex'] ?? 0, ); } @@ -43,5 +46,6 @@ class AppConfigPo { 'codeStyleIndex': codeStyleIndex, 'themeModeIndex': themeModeIndex, 'itemStyleIndex': itemStyleIndex, + 'languageIndex': languageIndex, }; } diff --git a/packages/toly_ui/lib/code/high_light_code.dart b/packages/toly_ui/lib/code/high_light_code.dart index d83a00e8..fc15af2d 100644 --- a/packages/toly_ui/lib/code/high_light_code.dart +++ b/packages/toly_ui/lib/code/high_light_code.dart @@ -19,7 +19,7 @@ import 'language/language.dart'; abstract class Highlighter { // ignore: one_member_abstracts - Language language; + ProgramLanguage language; Highlighter({required this.language}); @@ -30,7 +30,7 @@ abstract class Highlighter { //暗黑模式下的高亮样式 class CodeHighlighter extends Highlighter { CodeHighlighter( - {Language language = const DartLanguage(), HighlighterStyle? style}):super(language: language) { + {ProgramLanguage language = const DartLanguage(), HighlighterStyle? style}):super(language: language) { _spans = <_HighlightSpan>[]; _style = style ?? HighlighterStyle.fromColors(HighlighterStyle.lightColor); } diff --git a/packages/toly_ui/lib/code/language/dart_languge.dart b/packages/toly_ui/lib/code/language/dart_languge.dart index 1c82d8ed..8341d147 100644 --- a/packages/toly_ui/lib/code/language/dart_languge.dart +++ b/packages/toly_ui/lib/code/language/dart_languge.dart @@ -5,7 +5,7 @@ import 'language.dart'; /// contact me by email 1981462002@qq.com /// 说明: -class DartLanguage extends Language{ +class DartLanguage extends ProgramLanguage{ const DartLanguage() : super('Dart'); diff --git a/packages/toly_ui/lib/code/language/language.dart b/packages/toly_ui/lib/code/language/language.dart index c2ea52d4..812a3db4 100644 --- a/packages/toly_ui/lib/code/language/language.dart +++ b/packages/toly_ui/lib/code/language/language.dart @@ -2,10 +2,10 @@ /// contact me by email 1981462002@qq.com /// 说明: -abstract class Language { +abstract class ProgramLanguage { final String name; - const Language(this.name); + const ProgramLanguage(this.name); bool containsKeywords(String word); diff --git a/packages/widget_module/lib/views/components/collected_tag.dart b/packages/widget_module/lib/views/components/collected_tag.dart new file mode 100644 index 00000000..62a1d2da --- /dev/null +++ b/packages/widget_module/lib/views/components/collected_tag.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/ext.dart'; +import 'package:wrapper/wrapper.dart'; + +class CollectedTag extends StatelessWidget { + const CollectedTag({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color color = Theme.of(context).primaryColor; + String text = context.l10n.favorite; + return Wrapper.just( + radius: 10, + color: isDark ? const Color(0xff292A2D) : const Color(0xffF3F3F5), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text( + text, + style: TextStyle(color: color, height: 1, fontSize: 10, shadows: [ + Shadow( + color: isDark ? Colors.black : Colors.white, + blurRadius: 2, + offset: const Offset(1, 1), + ) + ]), + ), + ); + } +} diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 05ae7b96..411d9ea4 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/views/components/collected_tag.dart'; import '../../../../data/exp.dart'; import 'package:wrapper/wrapper.dart'; @@ -74,24 +75,7 @@ class DeskWidgetItem extends StatelessWidget { if (!show) return const SizedBox(); return Opacity( opacity: show ? 1.0 : 0.0, - child: Wrapper.just( - radius: 10, - color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - '已收藏', - style: TextStyle( - color: color, - height: 1, - fontSize: 10, - shadows: [ - Shadow( - color:isDark? Colors.black: Colors.white, - blurRadius: 2, - offset: Offset(1, 1)) - ]), - ), - ), + child: const CollectedTag(), ); }), const Spacer(), diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart index 92cafeef..36a144bd 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; @@ -16,12 +17,22 @@ class DeskWidgetTopBar extends StatefulWidget { class _DeskWidgetTopBarState extends State with SingleTickerProviderStateMixin { late TabController tabController; - static const List _tabs = ['无态', '有态', '单渲', '多渲', '滑片', '代理', '其它']; + + List get _tabs =>[ + context.l10n.stateless, + context.l10n.stateful, + context.l10n.single, + context.l10n.multi, + context.l10n.sliver, + context.l10n.proxy, + context.l10n.other, + ]; + @override void initState() { super.initState(); - tabController = TabController(length: _tabs.length, vsync: this); + tabController = TabController(length: 7, vsync: this); } @override @@ -37,12 +48,13 @@ class _DeskWidgetTopBarState extends State with SingleTickerP child: Row( children: [ SizedBox( - width: 350, + width: 380, child: TabBar( onTap: widget.onTabPressed, + tabAlignment: TabAlignment.start, indicatorSize: TabBarIndicatorSize.label, labelPadding: const EdgeInsets.symmetric(horizontal: 6), - isScrollable: false, + isScrollable: true, indicator: RoundRectTabIndicator( borderSide: BorderSide(color: themeColor, width: 3), ), diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index e3a2637e..e399935f 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -1,3 +1,4 @@ +import 'package:l10n/ext.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -18,13 +19,25 @@ class StandardHomePage extends StatefulWidget { class _StandardHomePageState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - static const List _tabs = ['无态', '有态', '单渲', '多渲', '滑片', '代理', '其它']; + + List get _tabs =>[ + context.l10n.stateless, + context.l10n.stateful, + context.l10n.single, + context.l10n.multi, + context.l10n.sliver, + context.l10n.proxy, + context.l10n.other, + ]; + late TabController tabController; + + @override void initState() { super.initState(); - tabController = TabController(length: _tabs.length, vsync: this); + tabController = TabController(length: 7, vsync: this); } int maxCount = 60; @@ -88,13 +101,14 @@ class _StandardHomePageState extends State color: isDark ? Colors.black : Colors.white, child: TabBar( onTap: _switchTab, + tabAlignment: TabAlignment.start, indicatorSize: TabBarIndicatorSize.label, isScrollable: true, indicator: RoundRectTabIndicator( borderSide: BorderSide(color: themeColor, width: 3), ), labelStyle: const TextStyle( - fontSize: 16, + fontSize: 14, fontWeight: FontWeight.bold, ), controller: tabController, diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index 055710f9..19c9c8cb 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -1,10 +1,13 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/ext.dart'; import 'package:toly_ui/toly_ui.dart'; import '../search_page/standard_search_page.dart'; -class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget { +class StandardHomeSearch extends StatelessWidget + implements PreferredSizeWidget { const StandardHomeSearch({Key? key}) : super(key: key); @override @@ -14,60 +17,72 @@ class StandardHomeSearch extends StatelessWidget implements PreferredSizeWidget Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; - return Container( - color: isDark?null:Colors.white, - padding: const EdgeInsets.symmetric(vertical: 8.0), + return ColoredBox( + color: isDark ? Colors.transparent : Colors.white, child: Row( children: [ - const SizedBox(width: 15), - FeedbackWidget( - onPressed: () => _openDrawer(context), - child: const CircleAvatar( - radius: 16, - backgroundImage: AssetImage('assets/images/icon_head.webp'), - ), - ), + _buildHead(context), Expanded( child: GestureDetector( - onTap: () { - Navigator.of(context).push( - FadePageRoute(child: const StandardSearchPageProvider())); - }, + onTap: () => _toSearchPage(context), child: Container( + margin: const EdgeInsets.symmetric(vertical: 8), height: 35, - padding: const EdgeInsets.only(left: 10, right: 10), - child: Material( - color: Colors.transparent, - child: TextField( - autofocus: false, - enabled: false, - cursorColor: Colors.blue, - maxLines: 1, - decoration: InputDecoration( - filled: true, - fillColor: isDark?Color(0xff292929):Color(0xffF3F6F9), - prefixIcon: Icon( - Icons.search, - color: Colors.grey, - ), - border: UnderlineInputBorder( - borderSide: BorderSide.none, - borderRadius: - BorderRadius.all(Radius.circular(35 / 2)), - ), - hintText: "搜索组件", - hintStyle: TextStyle(fontSize: 14)), - ), + child: TextField( + autofocus: false, + enabled: false, + cursorColor: Colors.blue, + maxLines: 1, + decoration: _topSearchInputDecoration(isDark, context), )), ), ), - const Icon(TolyIcon.icon_sound), - const SizedBox(width: 15) + _buildCollectIcon(context), ], ), ); } + InputDecoration _topSearchInputDecoration(bool isDark, BuildContext context) { + String hintText = context.l10n.searchWidget; + return InputDecoration( + filled: true, + fillColor: isDark ? const Color(0xff292929) : const Color(0xffF3F6F9), + prefixIcon: const Icon(Icons.search, color: Colors.grey), + border: const UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(35 / 2)), + ), + hintText: hintText, + hintStyle: const TextStyle(fontSize: 14)); + } + + Widget _buildHead(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: FeedbackWidget( + onPressed: () => _openDrawer(context), + child: const CircleAvatar( + radius: 16, + backgroundImage: AssetImage('assets/images/icon_head.webp'), + ), + ), + ); + } + + Widget _buildCollectIcon(BuildContext context) { + return IconButton( + // splashRadius: 20, + onPressed: () => context.push('/collect'), + icon: const Icon(TolyIcon.icon_collect), + ); + } + + void _toSearchPage(BuildContext context) { + Navigator.of(context) + .push(FadePageRoute(child: const StandardSearchPageProvider())); + } + void _openDrawer(BuildContext context) { Scaffold.of(context).openDrawer(); } diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart index b8408a80..66f9c443 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart @@ -7,6 +7,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:wrapper/wrapper.dart'; import '../../../data/exp.dart'; +import '../../components/collected_tag.dart'; class StandardWidgetItem extends StatelessWidget { final WidgetModel model; @@ -63,7 +64,6 @@ class StandardWidgetItem extends StatelessWidget { text = Text.rich(formSpan(model.name, searchArg!)); } - return Row( children: [ Expanded(child: Wrap( @@ -76,24 +76,7 @@ class StandardWidgetItem extends StatelessWidget { bool show = s.widgets.contains(model); return Opacity( opacity: show ? 1.0 : 0.0, - child: Wrapper.just( - radius: 10, - color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - '已收藏', - style: TextStyle( - color: color, - height: 1, - fontSize: 10, - shadows: [ - Shadow( - color:isDark? Colors.black: Colors.white, - blurRadius: 2, - offset: Offset(1, 1)) - ]), - ), - ), + child: const CollectedTag(), ); }), ], diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart index b8a4561b..21f40760 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart @@ -62,8 +62,6 @@ class _WidgetPageState extends State { void _listenStateChange(BuildContext context, WidgetsState state) async{ if (state is WidgetsLoaded) { - print('===_listenStateChange:${state.full}======'); - if (state.operate == LoadOperate.refresh) { _refreshController.refreshCompleted(); } diff --git a/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart b/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart index f9e13523..b339529e 100644 --- a/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart +++ b/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart @@ -24,7 +24,7 @@ class CustomLicensePage extends StatelessWidget { applicationIcon: FlutterLogo(), applicationVersion: 'v0.0.1', applicationName: 'Flutter Unit', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', ), ); } diff --git a/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart b/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart index 470f0e8f..1d92e310 100644 --- a/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart @@ -49,7 +49,7 @@ class CustomAboutDialog extends StatelessWidget { applicationIcon: const FlutterLogo(), applicationVersion: 'v0.0.1', applicationName: 'Flutter Unit', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', children: [ Container( margin: const EdgeInsets.only(top: 20), diff --git a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart index 72c6e494..8a9655a9 100644 --- a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart @@ -27,7 +27,7 @@ class AboutListTileDemo extends StatelessWidget { applicationIcon: FlutterLogo(), applicationName: 'Flutter Unit', applicationVersion: 'v0.0.1', - applicationLegalese: 'Copyright© 2018-2020 张风捷特烈', + applicationLegalese: 'Copyright© 2018-2024 张风捷特烈', aboutBoxChildren: [ Padding( padding: EdgeInsets.all(10.0), From d14cd8ce5fb4f932d57d198eb2f25f42778fe181 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 21 Feb 2024 21:51:55 +0800 Subject: [PATCH 056/149] =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E7=AB=AF=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E9=9B=86=E9=94=A6=E3=80=81=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=A4=9A=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/caver.webp | Bin 107190 -> 72676 bytes assets/images/coffee1.webp | Bin 0 -> 39614 bytes assets/images/wxgzh.webp | Bin 0 -> 5054 bytes lib/app/views/about/about_app_page.dart | 3 +- lib/app/views/about/version_info.dart | 11 +- .../views/account/desk/desk_account_page.dart | 179 +++++++----------- .../account/desk/sliver_cellection_panel.dart | 64 +++++++ .../views/account/desk/sliver_list_panel.dart | 76 ++++++++ .../account/desk/sliver_share_panel.dart | 70 +++++++ lib/app/views/account/desk/user_header.dart | 67 +++++++ lib/app/views/setting/code_style_setting.dart | 3 +- lib/app/views/setting/font_setting.dart | 2 +- lib/app/views/setting/language_setting.dart | 51 ++--- lib/app/views/setting/setting_page.dart | 164 ++++++++-------- .../views/setting/theme_color_setting.dart | 2 +- lib/app_stater/view/flutter_unit_text.dart | 12 +- lib/navigation/routers/desk_route.dart | 6 + lib/navigation/views/unit_navigation.dart | 3 +- packages/app/lib/app/cons/str_unit.dart | 40 ++-- packages/app_update/lib/bloc/bloc.dart | 22 ++- .../lib/views/app_update_panel.dart | 9 +- packages/app_update/pubspec.yaml | 1 + .../lib/src/articles/bloc/article/bloc.dart | 5 - .../articles/view/article/sliver_article.dart | 32 +++- .../view/article/sliver_columnize.dart | 7 +- .../view/building/building_panel.dart | 7 +- .../src/articles/view/desk_artifact_page.dart | 131 +++++++------ .../points/view/issues_point/issue_item.dart | 28 +-- packages/artifact/pubspec.yaml | 2 + .../top_bar/desk_knowledge_top_bar.dart | 2 +- .../project_ui/top_bar/desk_tab_top_bar.dart | 2 + .../lib/src/desk_ui/desk_frame.dart | 6 +- .../lib/src/desk_ui/desk_gallery_unit.dart | 4 +- .../lib/src/gallery_card_item.dart | 2 + .../draw_system/lib/src/gallery_factory.dart | 92 ++++----- .../draw_system/lib/src/gallery_unit.dart | 16 +- .../draw_system/lib/src/picture_frame.dart | 6 +- packages/l10n/lib/arb/app_en.arb | 35 +++- packages/l10n/lib/arb/app_zh.arb | 36 +++- .../l10n/lib/gen_l10n/app_localizations.dart | 158 ++++++++++++++-- .../lib/gen_l10n/app_localizations_en.dart | 81 +++++++- .../lib/gen_l10n/app_localizations_zh.dart | 77 +++++++- .../toly_ui/lib/button/feedback_widget.dart | 1 + .../desk_ui/widget_panel/desk_search_bar.dart | 3 +- .../mobile/category_page/category_detail.dart | 16 +- .../mobile/category_page/collect_page.dart | 11 +- 46 files changed, 1079 insertions(+), 466 deletions(-) create mode 100644 assets/images/coffee1.webp create mode 100644 assets/images/wxgzh.webp create mode 100644 lib/app/views/account/desk/sliver_cellection_panel.dart create mode 100644 lib/app/views/account/desk/sliver_list_panel.dart create mode 100644 lib/app/views/account/desk/sliver_share_panel.dart create mode 100644 lib/app/views/account/desk/user_header.dart diff --git a/assets/images/caver.webp b/assets/images/caver.webp index 426ab0ccb6d5fe62f24239d4b0365edc7fb49f1a..3d4102c05abc01a5151d81d285dedb9e0faf6b6a 100644 GIT binary patch literal 72676 zcmV($K;yqsNk&H88vy`UMM6+kP&il$000000002<0RT+_09H^qAZQx_01!w5odGKJ z0ZsuvH4=wHq9F|ilZp@lqFF#M`oHh7&~GjL5BwkI{UkXzz#p;xH`XuvU6Xs~{ckg` zY44-|GyiA$-*^A6|M!2I_z(Sr{cis;?Xm0A_e1h$;K%iU^}o0t^?&rgZ9VS)j{lwP z5B-1sZ&}yxPqClv=d8E>&)%;U*7+CKgRrm{xAHu`_J~T@;~hVx_<5bKm6DG-|+wPyd|~I@xSnY z$^P#C|NR2`&il{(m;C?EKSqzkf2sew{-5`I{?FJC^DpZ^>c7E%r~l9X8~^|R zPsN|*KjMFn|55*|{MY~g{r?reJ^tBQD zto+XcXFsw_a6rJ}|#nfj2 zk&qP4%=$LMmqaHXSeRvKk7nvj5~-2Y@GVaJZmrp)sZW#ASIz%dnpf?ZSpRyWi=v~8 ztIh-p)4^BhH*?-Gm%8~Wp%L0LAkp@`*=%}P%m9s}_x@^U#m<@t4PJH6-~0_21vBCl zeG4#r@KODWXI>gj^Vx1lIGGDSF8%;L)QY4cHsPB3#az}FTjQGBj}j{Nqk*OU>g}?j z#4F(d%CI%}ho5BDas7GFXRf^sC@ZM=Yftd~)^{mYxmJOq1JQm-qG^8#xms|S@iNup zyU`xUv38D%{Hz^Qw6a<_^d^D_9I~PL0lvBi(4eR6A9#8v9F?n=zBl}}O_n1r$)%4i zeFHXZ7{ZSmCbMIQUx3lc8#2*j4cXM&AG5B2BUmTpGo~l* z`FuE6iZcI2@GnKh^j-;#R?zL6CGi7)BH$|Qz5y^oOFU!-g?A-SN3DU~gfTh~{s_BS z=Z6)f0R?n$z+BDr0WWyZMd5`e+sLN$V?=AZ>oGs<@*ca~?Ynn>_QxN;!7=q=hf8tW zrI}!s;HDdg6JZZlww;4ZcWbDo2*lOpun~S=8!u|fYLX(ksk&*{Bkrr?B!F=NPH>MR z>Vhr(UnDC!AbP@}tMQIp>&UwxZ|#$%?lMls#SL0K(3M+Ygha(PMY@@l1BJK2qjUQ@ zDuE4{=Ysl?Tg~M7fA60ia-=!TH>hZ^gHM;~3(z}{NF*Y0RT~F4JQ1Ms){{Sx4+_8SRvEEqeb7S}yNN97FPs7Zm|Kcs_{*%eW4Z#lQVMk- zDN8t6;8e*vUs|Nk5swhIpEA{+F2{}XJY8sjy zuR|hNQFMe#{ew*UwOyxrxYdtl0I?-lQ3Y$jYR`NhZr}*VI4I#=E9zI`lLV?jnoQ(p zFeQ?X9{2N}dd{Y%Kn3*vLD-kEfiLtUXK4MX5jdh}~Lx^n2m+ z%@nQw6XMca8%%*|?7dLg*_XDI678)K1YT{PY55<;=0K{#do$b@y4aX`jZ>#Q5L9%E z_pm;iBExVrZAh7ds}JDrid%alc;B5vUPC%$C*uFF*fyHR(_^d)b$;XfbM>g&)yKu+ zn+qtm7RQ>2Kcds%!yJYPKj-51ezf(pgwMjG^-0kGT05AZYo%)J&}AsqJclhz)M~)^ z=l`TL^XAvTl&kK0A9vwbrj_iaG!nPUS#-lC;t#yzu2Klj|FXi)>t>!-%_?~B0(k^<6UNMWjAaGfb7ru< zqQbZZ>Bt3=y*?3rI_wkG_#oY5chJ)eWe>AD*Qi|Hud)eiGZAQzD54MFwyaG;BG z-A{}R8dteFpu16Sfa!wXlXcw-vEnB5(ad_g`x9(Gcv(_msr71fZ zDB=aieN_OWQUAVw%-(O>-byr9g0p4m9_#$s+^psMe5f#Bo7v=O$KFwY8k4y1OtPXf z_CQxoo=04r{f52q#fq8UU#AX%x|F>wY5Pq}Y$5G4>*xiq!mpntWbC)s1w@%#$iQRq z+dk6(TljjmVEAYg?p zsI(}@4Dn9mvBCkiuz4QENC8@U|83KaYS@$IL7@Cz4SKTyX6G4cB28y~`yE4$972#C z85Lb3ysm5xN!wecQsp#oLa-21p2rbU>u$h56}#PUqwbtR@p)cmUj7oGAJ&Y*�qd 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 G0001Xb8%k) diff --git a/assets/images/coffee1.webp b/assets/images/coffee1.webp new file mode 100644 index 0000000000000000000000000000000000000000..53ff28e9374e07b367d9b69b458f3bd4ca817d25 GIT binary patch literal 39614 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 G0002cdJ9qj literal 0 HcmV?d00001 diff --git a/assets/images/wxgzh.webp b/assets/images/wxgzh.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a44c72cca679ea511817437cb49d911cf9b7d9c GIT binary patch literal 5054 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 UdKf(}7#cBF;Xwlepa1{>0EJHBZU6uP literal 0 HcmV?d00001 diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart index d3ddae87..d0230f79 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/lib/app/views/about/about_app_page.dart @@ -179,7 +179,7 @@ class AboutAppPage extends StatelessWidget { InfoPanel( title: 'Flutter Unit 2.0 ', info: - '○ 317 的 Flutter 组件收录和详情介绍。\n' + '○ 317 个 Flutter 组件收录和详情介绍。\n' '○ 绘制集录用于收录绘制相关的优秀示例。\n' '○ 要点集录用于收录 Flutter 相关的小知识。\n' '○ 时光轴,查看 FlutterUnit 重要事件。\n' @@ -202,6 +202,7 @@ class InfoPanel extends StatelessWidget { @override Widget build(BuildContext context) { return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart index 6caaa046..601322da 100644 --- a/lib/app/views/about/version_info.dart +++ b/lib/app/views/about/version_info.dart @@ -3,6 +3,7 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -45,7 +46,7 @@ class VersionInfo extends StatelessWidget { const Spacer(), Padding( padding: const EdgeInsets.only(bottom:8.0), - child: buildBottom(), + child: buildBottom(context), ) ], @@ -78,7 +79,7 @@ class VersionInfo extends StatelessWidget { children: [ const Divider(height: 1,), ListTile( - title: const Text('应用详情',style: labelStyle,), + title: Text(context.l10n.appDetails,style: labelStyle,), trailing: _nextIcon(context), onTap: () => context.push('/about_app'), ), @@ -86,7 +87,7 @@ class VersionInfo extends StatelessWidget { const AppUpdatePanel(), const Divider(height: 1,indent: 10), ListTile( - title: const Text('检查数据库新版本',style: labelStyle), + title: Text(context.l10n.checkDatabaseNewVersion,style: labelStyle), trailing: _nextIcon(context), onTap: () async{ @@ -102,7 +103,7 @@ class VersionInfo extends StatelessWidget { Widget _nextIcon(BuildContext context) => const Icon(Icons.chevron_right, color: Colors.grey); - Widget buildBottom() { + Widget buildBottom(BuildContext context) { return Wrap( direction: Axis.vertical, crossAxisAlignment: WrapCrossAlignment.center, @@ -112,7 +113,7 @@ class VersionInfo extends StatelessWidget { onPressed: (){ _launchURL("https://github.com/toly1994328/FlutterUnit"); }, - child: const Text('《查看本项目Github仓库》',style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), + child: Text(context.l10n.viewThisProjectGithubRepository,style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)), const Text('Power By 张风捷特烈',style: TextStyle(fontSize: 12,color: Colors.grey),), const Text('Copyright © 2018-2024 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),), ], diff --git a/lib/app/views/account/desk/desk_account_page.dart b/lib/app/views/account/desk/desk_account_page.dart index b9ac3c97..1d2d8c5c 100644 --- a/lib/app/views/account/desk/desk_account_page.dart +++ b/lib/app/views/account/desk/desk_account_page.dart @@ -1,8 +1,14 @@ import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/app_stater/view/flutter_unit_text.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; +import 'sliver_cellection_panel.dart'; +import 'sliver_list_panel.dart'; +import 'sliver_share_panel.dart'; +import 'user_header.dart'; + class DeskAccountPage extends StatefulWidget { const DeskAccountPage({super.key}); @@ -13,6 +19,8 @@ class DeskAccountPage extends StatefulWidget { class _DeskAccountPageState extends State with SingleTickerProviderStateMixin { late TabController tabController; + int activeIndex = 0; + @override void initState() { super.initState(); @@ -22,118 +30,73 @@ class _DeskAccountPageState extends State @override Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; + List tabs = [ + context.l10n.homeAccountTabInfo, + context.l10n.homeAccountTabMe, + context.l10n.homeAccountSupport, + ]; - return Column( - children: [ - DeskAccountTopBar( - leading: FlutterUnitText( - text: 'Flutter Unit', - ), - ), - Expanded( - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: UserHeader(), - ), - SliverPinnedHeader( - color: isDark?Color(0xff2C3036):Colors.white, - child: TabBar( - onTap: (i) {}, - tabAlignment: TabAlignment.start, - indicatorSize: TabBarIndicatorSize.label, - isScrollable: true, - // indicator: RoundRectTabIndicator( - // borderSide: BorderSide(color: themeColor, width: 3), - // ), - labelStyle: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - controller: tabController, - // labelColor: themeColor, - indicatorWeight: 3, - unselectedLabelColor: Colors.grey, - // indicatorColor: themeColor, - tabs: ['收藏', "分享", "合集"] - .map((String name) => Tab(text: name)) - .toList(), - )), - SliverList( - delegate: SliverChildBuilderDelegate( - (_, index) => ListTile( - title: Text('测试数据: $index',style: TextStyle(color: Colors.grey),), + return Scaffold( + body: Column( + children: [ + DeskAccountTopBar( + leading: Row( + children: [ + FlutterUnitText( + text: 'Flutter Unit', + color: Theme.of(context).primaryColor, + fontSize: 24, ), - childCount: 20 - ), - ) - ], - )) - ], - ); - } -} - -class UserHeader extends StatelessWidget { - const UserHeader({super.key}); - - @override - Widget build(BuildContext context) { - bool isDark = Theme.of(context).brightness == Brightness.dark; - - return Stack( - // clipBehavior: Clip.none, - children: [ - Column( - children: [ - Image.asset( - 'assets/images/base_draw.webp', - height: 150, - fit: BoxFit.fitWidth, - width: MediaQuery.of(context).size.width, + const SizedBox( + width: 20, + ), + Text( + 'Flutter 的联合,编程者的联合', + style: TextStyle(color: Colors.grey), + ) + ], ), - Container( - alignment: Alignment.topLeft, - padding: EdgeInsets.only(left: 32 + 100 + 16, top: 12), - color: isDark?Color(0xff2C3036):Colors.white, - height: 86, - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '张风捷特烈', - style: TextStyle( - fontSize: 20, fontWeight: FontWeight.bold), - ), - Text( - '海的彼岸有我未曾见证的风采', - style: TextStyle(fontSize: 12, color: Colors.grey), - ), - Text( - '公众号@编程之王', - style: TextStyle(fontSize: 12, color: Colors.grey), - ), - ], - ) - ], - ), - ) - ], - ), - Positioned( - bottom: 16, - left: 32, - child: CircleImage( - size: 100, - shadowColor: Theme.of(context) - .primaryColor - .withAlpha(33), // image: NetworkImage(state.user.userAvatar), - image: const AssetImage("assets/images/icon_head.webp"), ), - ), - ], + Expanded( + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: UserHeader(), + ), + SliverPinnedHeader( + color: isDark ? Color(0xff2C3036) : Colors.white, + child: TabBar( + onTap: (i) { + setState(() { + activeIndex = i; + }); + }, + tabAlignment: TabAlignment.start, + indicatorSize: TabBarIndicatorSize.label, + isScrollable: true, + // indicator: RoundRectTabIndicator( + // borderSide: BorderSide(color: themeColor, width: 3), + // ), + labelStyle: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + controller: tabController, + // labelColor: themeColor, + indicatorWeight: 3, + unselectedLabelColor: Colors.grey, + // indicatorColor: themeColor, + tabs: tabs + .map((String name) => Tab(text: name)) + .toList(), + )), + if (activeIndex == 0) const SliverCollectionPanel(), + if (activeIndex == 1) const SliverSharePanel(), + if (activeIndex == 2) const SliverListPanel(), + ], + )) + ], + ), ); } } diff --git a/lib/app/views/account/desk/sliver_cellection_panel.dart b/lib/app/views/account/desk/sliver_cellection_panel.dart new file mode 100644 index 00000000..9097f13e --- /dev/null +++ b/lib/app/views/account/desk/sliver_cellection_panel.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +import '../../about/about_app_page.dart'; + +class SliverCollectionPanel extends StatelessWidget { + const SliverCollectionPanel({super.key}); + + @override + Widget build(BuildContext context) { + List items = [ + InfoPanel( + title: '项目简介', + info: 'Flutter Unit 是一个非盈利性的开源项目,' + '旨在提供全面的 Flutter 学习指南及编程者的交流技术的接口。' + '由【张风捷特烈】提供技术支持和全权维护。唯一开源网站网址:\n ' + 'https://github.com/toly1994328/FlutterUnit', + ), + const SizedBox(height: 10,), + InfoPanel( + title: 'Flutter Unit 1.0', + info: 'Flutter Unit 1.0 核心计划是收录widget,即widget集录。' + '目前收录组件 283 个,均可在 app 中进行查看。' + '项目中提供widget图鉴文件可供下载参考。功能主要如下:\n' + '○ 280+的 Flutter 组件收录和详情介绍。\n' + '○ 对一些重要的组件提供操作体验。\n' + '○ link to功能,查看组件时可以切换到相关组件。\n' + '○ 组件收藏和取消收藏功能。\n' + '○ 主题、字体设置,代码风格等全局状态管理。\n' + '○ 搜索功能和组件星级分类。', + ), + const SizedBox(height: 10,), + InfoPanel( + title: 'Flutter Unit 2.0 ', + info: + '○ 317 个 Flutter 组件收录和详情介绍。\n' + '○ 绘制集录用于收录绘制相关的优秀示例。\n' + '○ 要点集录用于收录 Flutter 相关的小知识。\n' + '○ 时光轴,查看 FlutterUnit 重要事件。\n' + '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。' + ), + const SizedBox(height: 10,), + InfoPanel( + title: 'Flutter Unit 3.0 ', + info: + '○ 335 个 Flutter 组件收录和详情介绍。\n' + '○ 知识宝库收录 Flutter 精品文章。\n' + '○ 算法演绎尝试基于 Flutter 可视化展示算法流程。\n' + '○ 工具宝箱,通过 Flutter 界面交互实现一些全平台辅助工具。\n' + '○ 功能全面升级,多语言、暗色模式、Navigator2.0 支持。' + ), + const SizedBox(height: 20,) + ]; + + + return SliverList( + delegate: SliverChildBuilderDelegate( + (_, index) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 48.0), + child: items[index], + ), + childCount: items.length), + ); + } +} diff --git a/lib/app/views/account/desk/sliver_list_panel.dart b/lib/app/views/account/desk/sliver_list_panel.dart new file mode 100644 index 00000000..fa255126 --- /dev/null +++ b/lib/app/views/account/desk/sliver_list_panel.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import '../../about/about_app_page.dart'; + +class SliverListPanel extends StatelessWidget { + const SliverListPanel({super.key}); + + //coffee1.webp + @override + Widget build(BuildContext context) { + List items = [ + InfoPanel( + title: '开源不易,请我喝咖啡 ~', + info: 'Flutter Unit 是一个非盈利性的开源项目,' + '旨在提供全面的 Flutter 学习指南及编程者的交流技术的接口。' + '由【张风捷特烈】提供技术支持和全权维护。唯一开源网站网址:\n ' + 'https://github.com/toly1994328/FlutterUnit', + ), + Divider( + height: 20, + ), + InfoPanel( + title: 'Flutter Unit 1.0', + info: 'Flutter Unit 1.0 核心计划是收录widget,即widget集录。' + '目前收录组件 283 个,均可在 app 中进行查看。' + '项目中提供widget图鉴文件可供下载参考。功能主要如下:\n' + '○ 280+的 Flutter 组件收录和详情介绍。\n' + '○ 对一些重要的组件提供操作体验。\n' + '○ link to功能,查看组件时可以切换到相关组件。\n' + '○ 组件收藏和取消收藏功能。\n' + '○ 主题、字体设置,代码风格等全局状态管理。\n' + '○ 搜索功能和组件星级分类。', + ), + Divider( + height: 20, + ), + InfoPanel( + title: 'Flutter Unit 2.0 ', + info: + '○ 317 个 Flutter 组件收录和详情介绍。\n' + '○ 绘制集录用于收录绘制相关的优秀示例。\n' + '○ 要点集录用于收录 Flutter 相关的小知识。\n' + '○ 时光轴,查看 FlutterUnit 重要事件。\n' + '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。' + ) + ]; + + + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 28.0), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Circle(color: Theme.of(context).primaryColor), + Padding( + padding: const EdgeInsets.only(left: 15,top: 15,bottom: 15), + child: Text('开源不易,请我喝咖啡 ~',style: const TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + ), + + + ], + ), + Image.asset( + 'assets/images/coffee1.webp', + + ) + ], + ), + ), + ); + } +} diff --git a/lib/app/views/account/desk/sliver_share_panel.dart b/lib/app/views/account/desk/sliver_share_panel.dart new file mode 100644 index 00000000..c98eba0e --- /dev/null +++ b/lib/app/views/account/desk/sliver_share_panel.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +class SliverSharePanel extends StatelessWidget { + const SliverSharePanel({super.key}); + + @override + Widget build(BuildContext context) { + List items = [ + const SizedBox(height: 12), + const Text( + '邮箱: 1981462002@qq.com\n' + '微信群: 编程技术交流圣地 -【Flutter群】\n' + '公众号: 编程之王\n' + '愿青梅煮酒,与君天涯共话。', + style: TextStyle(color: Colors.grey)), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Image.asset( + 'assets/images/wechat.webp', + width: 200, + height: 200, + ), + ), + const Center( + child: Text( + '我的微信', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ], + ), + const SizedBox(width: 20,), + Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Image.asset( + 'assets/images/wxgzh.webp', + width: 200, + height: 200, + ), + ), + const Center( + child: Text( + '我的公众号', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ], + ), + ], + ), + + ]; + + + return SliverToBoxAdapter( + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + children: items, + ), + ); + } +} diff --git a/lib/app/views/account/desk/user_header.dart b/lib/app/views/account/desk/user_header.dart new file mode 100644 index 00000000..c392fb26 --- /dev/null +++ b/lib/app/views/account/desk/user_header.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; + +class UserHeader extends StatelessWidget { + const UserHeader({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + String image = isDark?'anim_draw.webp':'base_draw.webp'; + + return Stack( + // clipBehavior: Clip.none, + children: [ + Column( + children: [ + Image.asset( + 'assets/images/$image', + height: 150, + fit: BoxFit.fitWidth, + width: MediaQuery.of(context).size.width, + ), + Container( + alignment: Alignment.topLeft, + padding: EdgeInsets.only(left: 32 + 100 + 16, top: 12), + color: isDark?Color(0xff2C3036):Colors.white, + height: 86, + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '张风捷特烈', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + ), + Text( + '海的彼岸有我未曾见证的风采', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + Text( + '公众号@编程之王', + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ) + ], + ), + ) + ], + ), + Positioned( + bottom: 16, + left: 32, + child: CircleImage( + size: 100, + shadowColor: Theme.of(context) + .primaryColor + .withAlpha(33), // image: NetworkImage(state.user.userAvatar), + image: const AssetImage("assets/images/icon_head.webp"), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/app/views/setting/code_style_setting.dart b/lib/app/views/setting/code_style_setting.dart index 552906eb..22a7acbf 100644 --- a/lib/app/views/setting/code_style_setting.dart +++ b/lib/app/views/setting/code_style_setting.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -30,7 +31,7 @@ class Hello { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text('代码高亮样式')), + appBar: AppBar(title: Text(context.l10n.codeHighlightStyle)), body: BlocBuilder( builder: (_, state) => _buildFontCell(context, Cons.codeThemeSupport.keys.toList(), state.codeStyleIndex)), diff --git a/lib/app/views/setting/font_setting.dart b/lib/app/views/setting/font_setting.dart index 520c307f..c746db64 100644 --- a/lib/app/views/setting/font_setting.dart +++ b/lib/app/views/setting/font_setting.dart @@ -24,7 +24,7 @@ class FontSettingPage extends StatelessWidget { BuildContext context, List fontFamilySupport, String fontFamily) { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), - crossAxisCount: 2, + crossAxisCount: isDesk?4:2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1.5, diff --git a/lib/app/views/setting/language_setting.dart b/lib/app/views/setting/language_setting.dart index af7fe2d5..cc520b14 100644 --- a/lib/app/views/setting/language_setting.dart +++ b/lib/app/views/setting/language_setting.dart @@ -10,37 +10,40 @@ class LanguageSettingPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(context.l10n.settingLanguage),), + title: Text(context.l10n.settingLanguage), + ), body: const LanguageSetting(), ); } } - class LanguageSetting extends StatelessWidget { const LanguageSetting({super.key}); @override Widget build(BuildContext context) { List languages = Language.values; - Language activeLanguage = context.select((bloc)=>bloc.state.language); - Color iconColor = Theme.of(context).primaryColor; + Language activeLanguage = + context.select((bloc) => bloc.state.language); + Color iconColor = Theme.of(context).primaryColor; return ListView.separated( - padding: const EdgeInsets.only(top:8), - separatorBuilder: (_,__)=>const Divider(), - itemBuilder: (_,index){ + padding: const EdgeInsets.only(top: 8), + separatorBuilder: (_, __) => const Divider(), + itemBuilder: (_, index) { Language language = languages[index]; - return ListTile( - title: Text(language.label), - onTap: (){ - context.read().switchLanguage(language); - }, - trailing: activeLanguage == language ? Icon(Icons.check, size: 20, color: iconColor) : null, - ); - } - - ,itemCount: languages.length,); + return ListTile( + title: Text(language.label), + onTap: () { + context.read().switchLanguage(language); + }, + trailing: activeLanguage == language + ? Icon(Icons.check, size: 20, color: iconColor) + : null, + ); + }, + itemCount: languages.length, + ); } } @@ -49,20 +52,24 @@ class LanguageSwitchTile extends StatelessWidget { @override Widget build(BuildContext context) { - Language activeLanguage = context.select((bloc)=>bloc.state.language); + Language activeLanguage = + context.select((bloc) => bloc.state.language); Color color = Theme.of(context).primaryColor; return ListTile( leading: Icon( Icons.language, color: color, ), - title: Text(context.l10n.settingLanguageText, style: TextStyle(fontSize: 16)), + title: Text(context.l10n.settingLanguageText, + style: TextStyle(fontSize: 16)), subtitle: Text( - '${activeLanguage.label}: ${activeLanguage.locale}',style: TextStyle(fontSize: 12), + '${activeLanguage.label}: ${activeLanguage.locale}', + style: TextStyle(fontSize: 12), ), trailing: Icon(Icons.chevron_right, color: color), - onTap: (){ - showModalBottomSheet(context: context, builder: (_)=>LanguageSettingPage()); + onTap: () { + showModalBottomSheet( + context: context, builder: (_) => LanguageSettingPage()); }, ); } diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index 9ceb3f54..a3d164a3 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -20,94 +20,96 @@ class SettingPage extends StatelessWidget { const Widget divider = Divider(height: 1); - return Scaffold( - appBar: AppBar(title:Text(context.l10n.appSettings)), - body: ListView( - children: [ - Container( height: 15), - ListTile( - leading: Icon( - Icons.style, - color: Theme.of(context).primaryColor, - ), - title: Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state) { - String info = switch(state.themeMode){ - ThemeMode.system => context.l10n.followSystem, - ThemeMode.light => context.l10n.lightMode, - ThemeMode.dark => context.l10n.darkMode, - }; - return Text(info, style: const TextStyle(fontSize: 12,color: Colors.grey) - ); - }, - ), - trailing: _nextIcon(context), - onTap: ()=> context.push('/settings/dark_mode'), - ), - divider, - ListTile( - leading: Icon( - Icons.palette, - color: Theme.of(context).primaryColor, - ), - title: Text(context.l10n.themeColorSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - state.themeColor.label(context), - style: TextStyle(color: state.themeColor.color,fontSize: 12), + return DragToMoveAreaNoDouble( + child: Scaffold( + appBar: AppBar(title:Text(context.l10n.appSettings)), + body: ListView( + children: [ + Container( height: 15), + ListTile( + leading: Icon( + Icons.style, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_,state) { + String info = switch(state.themeMode){ + ThemeMode.system => context.l10n.followSystem, + ThemeMode.light => context.l10n.lightMode, + ThemeMode.dark => context.l10n.darkMode, + }; + return Text(info, style: const TextStyle(fontSize: 12,color: Colors.grey) + ); + }, ), + trailing: _nextIcon(context), + onTap: ()=> context.push('/settings/dark_mode'), ), - trailing: _nextIcon(context), - onTap: () => context.push('/settings/theme_color'), - ), - // divider, - Container( height: 10), - ListTile( - leading: Icon( - Icons.translate, - color: Theme.of(context).primaryColor, + divider, + ListTile( + leading: Icon( + Icons.palette, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.themeColorSetting, style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_,state)=>Text( + state.themeColor.label(context), + style: TextStyle(color: state.themeColor.color,fontSize: 12), + ), + ), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/theme_color'), ), - title: Text(context.l10n.fontSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - state.fontFamily,style: TextStyle(fontSize: 12), + // divider, + Container( height: 10), + ListTile( + leading: Icon( + Icons.translate, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.fontSetting, style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_,state)=>Text( + state.fontFamily,style: TextStyle(fontSize: 12), + ), ), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/font_setting'), ), - trailing: _nextIcon(context), - onTap: () => context.push('/settings/font_setting'), - ), - divider, - const LanguageSwitchTile(), - divider, - ListTile( - leading: Icon( - TolyIcon.icon_code, - color: Theme.of(context).primaryColor, + divider, + const LanguageSwitchTile(), + divider, + ListTile( + leading: Icon( + TolyIcon.icon_code, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.codeHighlightStyle, style: TextStyle(fontSize: 16)), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/code_style'), ), - title: Text(context.l10n.codeHighlightStyle, style: TextStyle(fontSize: 16)), - trailing: _nextIcon(context), - onTap: () => context.push('/settings/code_style'), - ), - // divider, - Container( height: 10,), - // _buildShowBg(context), - divider, - _buildShowOver(context), - // divider, - // _buildShowTool(context), - divider, - // Container( height: 10), - ListTile( - leading: Icon( - Icons.info, - color: Theme.of(context).primaryColor, + // divider, + Container( height: 10,), + // _buildShowBg(context), + divider, + _buildShowOver(context), + // divider, + // _buildShowTool(context), + divider, + // Container( height: 10), + ListTile( + leading: Icon( + Icons.info, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)), + trailing: _nextIcon(context), + onTap: () => context.push('/settings/version'), ), - title: Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)), - trailing: _nextIcon(context), - onTap: () => context.push('/settings/version'), - ), - ], + ], + ), ), ); } diff --git a/lib/app/views/setting/theme_color_setting.dart b/lib/app/views/setting/theme_color_setting.dart index c013e6a5..572b060c 100644 --- a/lib/app/views/setting/theme_color_setting.dart +++ b/lib/app/views/setting/theme_color_setting.dart @@ -27,7 +27,7 @@ class ThemeColorSettingPage extends StatelessWidget { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), shrinkWrap: true, - crossAxisCount: 2, + crossAxisCount: isDesk?4:2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1.5, diff --git a/lib/app_stater/view/flutter_unit_text.dart b/lib/app_stater/view/flutter_unit_text.dart index 09b6e370..67340101 100644 --- a/lib/app_stater/view/flutter_unit_text.dart +++ b/lib/app_stater/view/flutter_unit_text.dart @@ -6,10 +6,12 @@ import 'package:flutter/material.dart'; class FlutterUnitText extends StatefulWidget { final String text; final Color color; + final double fontSize; const FlutterUnitText({ this.text = "Toly", this.color = Colors.blue, + this.fontSize = 32, Key? key, }) : super(key: key); @@ -31,7 +33,7 @@ class _FlutterUnitTextState extends State void initState() { super.initState(); TextSpan text = TextSpan( - text: widget.text, style: const TextStyle(fontSize: 32, color: Colors.blue)); + text: widget.text, style: TextStyle(fontSize: widget.fontSize, color: Colors.blue)); _textPainter.text = text; _textPainter.layout(); // 进行布局 @@ -60,6 +62,7 @@ class _FlutterUnitTextState extends State return CustomPaint( size: _textPainter.size, painter: SpringPainter( + fontSize: widget.fontSize, textPainter: _textPainter, color: widget.color, skew: animation, @@ -80,11 +83,12 @@ class Interpolator extends Curve { class SpringPainter extends CustomPainter { final ValueListenable skew; final TextPainter textPainter; + final double fontSize; String _text = ''; Color color; SpringPainter( - {required this.skew, required this.textPainter, this.color = Colors.blue}) + {required this.skew, required this.textPainter, this.color = Colors.blue,required this.fontSize}) : super(repaint: skew) { _text = textPainter.text?.toPlainText() ?? ''; } @@ -93,7 +97,7 @@ class SpringPainter extends CustomPainter { void paint(Canvas canvas, Size size) { canvas.translate(size.width / 2, size.height / 2); TextSpan text = - TextSpan(text: _text, style: TextStyle(fontSize: 32, color: color)); + TextSpan(text: _text, style: TextStyle(fontSize: fontSize, color: color)); textPainter.text = text; textPainter.layout(); // 进行布局 Size textSize = textPainter.size; // 尺寸必须在布局后获取 @@ -103,7 +107,7 @@ class SpringPainter extends CustomPainter { textPainter.paint(canvas, Offset.zero); TextSpan textShadow = TextSpan( text: _text, - style: TextStyle(fontSize: 32, color: color.withAlpha(88))); + style: TextStyle(fontSize: fontSize, color: color.withAlpha(88))); textPainter.text = textShadow; textPainter.layout(); // 进行布局 Matrix4 matrix4 = Matrix4.skewX((6 / 180 * pi) * skew.value); diff --git a/lib/navigation/routers/desk_route.dart b/lib/navigation/routers/desk_route.dart index 94c88cc8..4c9ce9f3 100644 --- a/lib/navigation/routers/desk_route.dart +++ b/lib/navigation/routers/desk_route.dart @@ -8,6 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/widget_module.dart'; +import '../../app/views/about/about_app_page.dart'; import '../../app/views/about/version_info.dart'; import '../../app/views/setting/code_style_setting.dart'; import '../../app/views/setting/font_setting.dart'; @@ -46,6 +47,11 @@ final RouteBase appNavRoute = ShellRoute( builder: (BuildContext context, GoRouterState state) { return GalleryUnit(); }, + ), GoRoute( + path: 'about_app', + builder: (BuildContext context, GoRouterState state) { + return AboutAppPage(); + }, ), GoRoute( path: 'knowledge', diff --git a/lib/navigation/views/unit_navigation.dart b/lib/navigation/views/unit_navigation.dart index 953e7573..fed9eb6e 100644 --- a/lib/navigation/views/unit_navigation.dart +++ b/lib/navigation/views/unit_navigation.dart @@ -39,8 +39,9 @@ class _UnitPhoneNavigationState extends State { void initState() { super.initState(); if (Platform.isAndroid||Platform.isIOS) { - BlocProvider.of(context).add(const CheckUpdate(appName: 'FlutterUnit')); } + BlocProvider.of(context).add(const CheckUpdate(appName: 'FlutterUnit')); + } @override diff --git a/packages/app/lib/app/cons/str_unit.dart b/packages/app/lib/app/cons/str_unit.dart index 25686e49..ef3a7167 100644 --- a/packages/app/lib/app/cons/str_unit.dart +++ b/packages/app/lib/app/cons/str_unit.dart @@ -1,42 +1,40 @@ +import 'package:flutter/cupertino.dart'; +import 'package:l10n/l10n.dart'; + /// create by 张风捷特烈 on 2020/11/29 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: class StrUnit { - // 小文字大小 - static const String version = 'V1.5.1'; - static const String appName = 'Flutter Unit'; + static const String version = 'V3.0.0'; + static const String appName = 'Flutter Unit'; - static const String galleryInfo = """ + static String galleryDesc(BuildContext context) => """ [ { "image":"assets/images/anim_draw.webp", - "name":"基础绘制", - "info":"收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。" + "name": "${context.l10n.basicDrawing}", + "info": "${context.l10n.basicDrawingDesc}" }, { "image":"assets/images/draw_bg3.webp", - "name":"动画手势", - "info":"收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。" + "name": "${context.l10n.animationGesture}", + "info": "${context.l10n.animationGestureDesc}" }, { "image":"assets/images/base_draw.webp", - "name":"粒子绘制", - "info":"收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。" - }, + "name": "${context.l10n.particleDrawing}", + "info": "${context.l10n.particleDrawingDesc}" + }, { "image":"assets/images/draw_bg4.webp", - "name":"趣味绘制", - "info":"收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。" - }, + "name": "${context.l10n.interestingDrawing}", + "info": "${context.l10n.interestingDrawingDesc}"}, { "image":"assets/images/caver.webp", - "name":"艺术画廊", - "info":"收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。" - } + "name": "${context.l10n.artGallery}", + "info": "${context.l10n.artGalleryDesc}"} ] """; - - -} \ No newline at end of file +} diff --git a/packages/app_update/lib/bloc/bloc.dart b/packages/app_update/lib/bloc/bloc.dart index bb31221a..ed97d949 100644 --- a/packages/app_update/lib/bloc/bloc.dart +++ b/packages/app_update/lib/bloc/bloc.dart @@ -1,9 +1,12 @@ import 'dart:async'; +import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:r_upgrade/r_upgrade.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:utils/utils.dart'; import '../model/app_info.dart'; @@ -19,12 +22,13 @@ class UpdateBloc extends Bloc { } void _onCheckUpdate(CheckUpdate event, Emitter emit) async { + print("========_onCheckUpdate=============="); emit(const CheckLoadingState()); // await Future.delayed(Duration(seconds: 1)); // 检测更新逻辑 TaskResult result = await AppInfoApi.getAppVersion(appName: event.appName); PackageInfo packageInfo = await PackageInfo.fromPlatform(); - + print(result); if (result.success && result.data != null) { if (packageInfo.version == result.data!.appVersion) { emit(NoUpdateState( @@ -49,7 +53,23 @@ class UpdateBloc extends Bloc { late int? id; late StreamSubscription? subscription; + void _launchURL(String url) async { + print(url); + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ + if(isDesk){ + // 桌面端跳转到下载地址 + _launchURL('https://github.com/toly1994328/FlutterUnit/releases'); + return; + } + id = await RUpgrade.upgrade(event.appInfo.appUrl, fileName: '${event.appInfo.appName}.apk',); subscription = RUpgrade.stream.listen((DownloadInfo info) { diff --git a/packages/app_update/lib/views/app_update_panel.dart b/packages/app_update/lib/views/app_update_panel.dart index 9220787c..895924ac 100644 --- a/packages/app_update/lib/views/app_update_panel.dart +++ b/packages/app_update/lib/views/app_update_panel.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:r_upgrade/r_upgrade.dart'; import 'package:utils/utils.dart'; +import 'package:l10n/l10n.dart'; import '../bloc/bloc.dart'; import '../bloc/event.dart'; @@ -57,10 +58,10 @@ class AppUpdatePanel extends StatelessWidget { } Widget _buildByUpdateState(BuildContext context, UpdateState state) { - String info = '检查新版本'; + String info = context.l10n.checkUpdate; Widget trail = const SizedBox.shrink(); if (state is ShouldUpdateState) { - info = "下载新版本"; + info = context.l10n.downloadNewVersion; trail = Wrap( alignment: WrapAlignment.center, crossAxisAlignment: WrapCrossAlignment.center, @@ -77,7 +78,7 @@ class AppUpdatePanel extends StatelessWidget { trail = const CupertinoActivityIndicator(); } if (state is DownloadingState) { - info = "新版本下载中..."; + info = context.l10n.downloadingNewVersion; trail = _buildProgress(context, state.progress, state.appSize); } @@ -111,7 +112,7 @@ class AppUpdatePanel extends StatelessWidget { void _listenerByUpdateState(BuildContext context, UpdateState state) { if (state is NoUpdateState) { if (state.isChecked) { - Toast.success(context, '当前应用已是最新版本!'); + Toast.success(context, context.l10n.currentIsNew); } } } diff --git a/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml index cc10eafe..93c2ce9e 100644 --- a/packages/app_update/pubspec.yaml +++ b/packages/app_update/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.1 # xml 固化 r_upgrade: ^0.4.2 # 应用升级 + url_launcher: ^6.1.14 # url package_info_plus: ^4.0.2 utils: path: ../utils diff --git a/packages/artifact/lib/src/articles/bloc/article/bloc.dart b/packages/artifact/lib/src/articles/bloc/article/bloc.dart index 73484454..e2215e50 100644 --- a/packages/artifact/lib/src/articles/bloc/article/bloc.dart +++ b/packages/artifact/lib/src/articles/bloc/article/bloc.dart @@ -55,11 +55,6 @@ class ArticleBloc extends Cubit { } } - @override - Future close() async { - super.close(); - print("=======close:${groupId}=================="); - } } sealed class ArticleState { diff --git a/packages/artifact/lib/src/articles/view/article/sliver_article.dart b/packages/artifact/lib/src/articles/view/article/sliver_article.dart index 25e5efce..6342875d 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_article.dart @@ -1,7 +1,10 @@ +import 'dart:io'; + import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../bloc/exp.dart'; import '../../data/exp.dart'; @@ -70,16 +73,31 @@ class ArticlePanel extends StatelessWidget { const ArticlePanel({Key? key, required this.article}) : super(key: key); + void toArticleDetail(BuildContext context){ + if(Platform.isAndroid||Platform.isIOS){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ArticleDetailPage(article: article), + ), + ); + } + _launchURL('https://juejin.cn${article.url}/'); + } + + void _launchURL(String url) async { + print(url); + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + @override Widget build(BuildContext context) { return GestureDetector( - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => ArticleDetailPage(article: article), - ), - ); - }, + onTap: ()=>toArticleDetail(context), child: Container( color: Theme.of(context).listTileTheme.tileColor, padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), diff --git a/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart b/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart index 54021fae..8a4fc370 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'columnize_page_view.dart'; - +import 'package:l10n/l10n.dart'; class ColumnizeViewPage extends StatefulWidget { const ColumnizeViewPage({Key? key}) : super(key: key); @@ -54,7 +54,10 @@ class _ColumnizeViewPageState extends State { child: Wrap( crossAxisAlignment: WrapCrossAlignment.center, children: [ - Text("前往掘金",style: TextStyle(fontSize: 12,color: Colors.blue),), + Text( + context.l10n.knowledgeToJuejin + + ,style: TextStyle(fontSize: 12,color: Colors.blue),), Icon(Icons.navigate_next,size: 12,color: Colors.blue,) ], ), diff --git a/packages/artifact/lib/src/articles/view/building/building_panel.dart b/packages/artifact/lib/src/articles/view/building/building_panel.dart index a8998916..e4696d54 100644 --- a/packages/artifact/lib/src/articles/view/building/building_panel.dart +++ b/packages/artifact/lib/src/articles/view/building/building_panel.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; - +import 'package:l10n/l10n.dart'; class BuildingPanel extends StatelessWidget { const BuildingPanel({Key? key}) : super(key: key); @@ -11,7 +11,10 @@ class BuildingPanel extends StatelessWidget { children: [ Icon(Icons.add_chart,size: 36,color: Colors.grey,), const SizedBox(height: 8,), - Text('正在建设中',style: TextStyle(color: Colors.grey),), + + Text( + context.l10n.knowledgeConstruction + ,style: TextStyle(color: Colors.grey),), ], ), ); diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart index 862acf61..e3f5d680 100644 --- a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -10,7 +10,7 @@ import '../data/exp.dart'; import 'article/sliver_article.dart'; import 'article/sliver_columnize.dart'; import 'building/building_panel.dart'; - +import 'package:l10n/l10n.dart'; class DeskKnowledgePage extends StatefulWidget { const DeskKnowledgePage({super.key}); @@ -35,69 +35,39 @@ class _DeskKnowledgePageState extends State with SingleTicke ColumnizeRepository cRepository = const ColumnizeRepository(); @override Widget build(BuildContext context) { - String name = SortStateScope.of(context).config.name; return MultiBlocProvider( providers: [ BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), BlocProvider(create: (_) => ArticleBloc(aRepository,pageSize: 1000)..init()), ], - child: Column( - children: [ - DeskKnowledgeTabTopBar(onTabPressed: (int value) { - controller.index = value; - }, tabs: [ - '捷特文库', - '算法演绎', - '布局宝库', - '要点宝库', - ],), - Expanded(child: TabBarView( - controller: controller, - children: [ - TolyArticlesPage(), - Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - GestureDetector( - onTap: () { - _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); - }, - child: Text( - '查看排序源码', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).primaryColor, - ), - )), - Spacer(), - SortSelector(), - ], - ), - ), - Expanded(child: SortPaper()), - ], - ), - BuildingPanel(), - DeskPointPage(), - ], - )) - ], + child: Scaffold( + endDrawer: SortSettings(), + body: Column( + children: [ + DeskKnowledgeTabTopBar(onTabPressed: (int value) { + controller.index = value; + }, tabs: [ + context.l10n.knowledgeTabToly, + context.l10n.knowledgeTabAlgo, + context.l10n.knowledgeTabLayout, + context.l10n.knowledgeTabPoint, + ],), + Expanded(child: TabBarView( + controller: controller, + children: [ + TolyArticlesPage(), + SoreAlgoPage(), + BuildingPanel(), + DeskPointPage(), + ], + )) + ], + ), ), ); } - _launchURL(String url) async { - Uri uri = Uri.parse(url); - if (await canLaunchUrl(Uri.parse(url))) { - await launchUrl(uri,mode: LaunchMode.externalApplication); - } else { - debugPrint('Could not launch $url'); - } - } void _listen() { print('${controller.index}'); @@ -127,8 +97,61 @@ class TolyArticlesPage extends StatelessWidget { padding: EdgeInsets.only(right: 36,left:36), sliver: SliverArticlePanel(), ), + ], + ); + } +} +class SoreAlgoPage extends StatelessWidget { + const SoreAlgoPage({super.key}); + + @override + Widget build(BuildContext context) { + String name = SortStateScope.of(context).config.name; + + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + + GestureDetector( + onTap: () { + _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + }, + child: Text( + '查看排序源码', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).primaryColor, + ), + )), + Spacer(), + SortButton(), + const SizedBox(width: 12,), + SortSelector(), + const SizedBox(width: 12,), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: Icon(Icons.settings)) + ], + ), + ), + Expanded(child: SortPaper()), ], ); } + + void _launchURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } + } + } diff --git a/packages/artifact/lib/src/points/view/issues_point/issue_item.dart b/packages/artifact/lib/src/points/view/issues_point/issue_item.dart index fa3a8e53..34a38c98 100644 --- a/packages/artifact/lib/src/points/view/issues_point/issue_item.dart +++ b/packages/artifact/lib/src/points/view/issues_point/issue_item.dart @@ -7,10 +7,9 @@ import 'package:utils/utils.dart'; import '../../data/model/issue.dart'; - /// create by 张风捷特烈 on 2020/9/3 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: class IssueItem extends StatelessWidget { final Issue issue; @@ -24,10 +23,11 @@ class IssueItem extends StatelessWidget { return Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).dividerColor, - width: 1 / window.devicePixelRatio))), + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerTheme.color??Colors.transparent, + width: 1 / window.devicePixelRatio)), + ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -36,8 +36,10 @@ class IssueItem extends StatelessWidget { padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), child: Text( '${issue.title}', - style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ - Shadow(color: isDark?Colors.black:Colors.white, offset: Offset(1, .5)) + style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ + Shadow( + color: isDark ? Colors.black : Colors.white, + offset: Offset(1, .5)) ]), ), ), @@ -68,7 +70,7 @@ class IssueItem extends StatelessWidget { return Row( children: [ CircleImage( - image: NetworkImage(issue.user?.avatarUrl??''), + image: NetworkImage(issue.user?.avatarUrl ?? ''), size: 40, borderSize: 2, ), @@ -77,9 +79,9 @@ class IssueItem extends StatelessWidget { ), WrapColor( child: Text( - "#${issue.number}", - style: const TextStyle(color: Colors.white), - )), + "#${issue.number}", + style: const TextStyle(color: Colors.white), + )), const SizedBox( width: 10, ), @@ -92,4 +94,4 @@ class IssueItem extends StatelessWidget { ], ); } -} \ No newline at end of file +} diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 8a9497f6..0b904525 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -25,6 +25,8 @@ dependencies: path: ../utils app: path: ../app + l10n: + path: ../l10n toly_ui: path: ../toly_ui dev_dependencies: diff --git a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart index 3a236e7e..c388aa16 100644 --- a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart @@ -50,7 +50,7 @@ class _DeskKnowledgeTabTopBarState extends State Expanded( child: Center( child: SizedBox( - width: 350, + width: 400, child: TabBar( onTap: widget.onTabPressed, indicatorSize: TabBarIndicatorSize.label, diff --git a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart index 6e5aed5d..c9def73f 100644 --- a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart @@ -44,6 +44,8 @@ class _DeskTabTopBarState extends State with TickerProviderState color: isDark?Color(0xff2C3036):Colors.white, child: Row( children: [ + const SizedBox(width: 12,), + BackButton(), SizedBox( width: 350, child: TabBar( diff --git a/packages/draw_system/lib/src/desk_ui/desk_frame.dart b/packages/draw_system/lib/src/desk_ui/desk_frame.dart index 06508c9f..97fa11d7 100644 --- a/packages/draw_system/lib/src/desk_ui/desk_frame.dart +++ b/packages/draw_system/lib/src/desk_ui/desk_frame.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import '../picture_frame.dart'; - +import 'package:l10n/l10n.dart'; /// create by 张风捷特烈 on 2020/12/4 /// contact me by email 1981462002@qq.com @@ -43,8 +43,8 @@ class DeskFrameShower extends StatelessWidget { "作者: $author ", style: const TextStyle(fontSize: 12, fontWeight: FontWeight.bold), ), - const Text( - "源码地址 ", + Text( + "${context.l10n.srcPath} ", style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, diff --git a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart index d720c203..54d363b7 100644 --- a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart +++ b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart @@ -63,9 +63,9 @@ class _DeskGalleryUnitState extends State { Widget _buildContent() { final List widgets = - (json.decode(StrUnit.galleryInfo) as List).map((e) { + (json.decode(StrUnit.galleryDesc(context)) as List).map((e) { GalleryInfo info = GalleryInfo.fromJson(e); - List children = GalleryFactory.getGalleryByName(info.type); + List children = GalleryFactory.getGalleryByName(info.type,context); return FeedbackWidget( a: 0.95, diff --git a/packages/draw_system/lib/src/gallery_card_item.dart b/packages/draw_system/lib/src/gallery_card_item.dart index 3cd7bb9e..f91e7052 100644 --- a/packages/draw_system/lib/src/gallery_card_item.dart +++ b/packages/draw_system/lib/src/gallery_card_item.dart @@ -86,6 +86,8 @@ class GalleryCardItem extends StatelessWidget { padding: const EdgeInsets.only(left: 15, right: 15, top: 6), child: Text( galleryInfo.info, + maxLines: 7, + overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 12, color: isDark?Colors.white:Colors.grey, shadows: [ diff --git a/packages/draw_system/lib/src/gallery_factory.dart b/packages/draw_system/lib/src/gallery_factory.dart index 7ff348ba..84e84328 100644 --- a/packages/draw_system/lib/src/gallery_factory.dart +++ b/packages/draw_system/lib/src/gallery_factory.dart @@ -32,7 +32,7 @@ import 'particle/random/random_particle.dart'; import 'particle/split/particle_split.dart'; import 'particle/split_img/split_image.dart'; import 'picture_frame.dart'; - +import 'package:l10n/l10n.dart'; /// create by 张风捷特烈 on 2020/12/5 /// contact me by email 1981462002@qq.com /// 说明: @@ -41,226 +41,210 @@ import 'picture_frame.dart'; enum GalleryType { base, anim, particle, fun, art } class GalleryFactory { - static List getGalleryByName(GalleryType type) { + static List getGalleryByName(GalleryType type,BuildContext context) { switch (type) { case GalleryType.base: - return const [ + return [ FrameShower( title: "The Chaos", author: "张风捷特烈", srcUrl: "/base/draw_picture.dart", - info: "本样例介绍如何进行图片的绘制:通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45° 倾角的栅格线,来练习线条的绘制。", + info: context.l10n.drawingOfImages, content: DrawPicture()), FrameShower( title: "数字显示管", author: "张风捷特烈", srcUrl: "/base/digital", - info: "本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例。", + info: context.l10n.digitalDisplayTube, content: DigitalShower()), FrameShower( title: "旋转风车", author: "张风捷特烈", srcUrl: "/base/windmill.dart", - info: "本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。", + info: context.l10n.pathDrawing, content: WindmillWidget()), FrameShower( title: "平面直角坐标系", author: "张风捷特烈", srcUrl: "/base/draw_grid_axis.dart", - info: - "本样例介绍如何使用线路径和文字绘制网格坐标系,并将绘制对象进行封装,方便重用。坐标系也会在绘制时提供参考,入门必备。", + info: context.l10n.gridCoordinateSystem, content: DrawGridAxis()), FrameShower( title: "平面极坐标系", author: "张风捷特烈", srcUrl: "/base/polar", - info: - "本样例介绍如何使用绘制平面的极坐标系,并根据函数方程收集极坐标进行绘制。", + info: context.l10n.polarCoordinateSystemOfFaces, content: PolarPainterWidget()), FrameShower( title: "曲线拟合", author: "张风捷特烈", srcUrl: "/base/draw_path_fun.dart", - info: "本样例介绍如何使用路径对函数曲线进行绘制,通过函数曲线上的少量点通过贝塞尔曲线进行拟合。", + info: context.l10n.drawFunctionCurvesForPathPairs, content: DrawPathFun()), FrameShower( title: "圆中取形", author: "张风捷特烈", srcUrl: "/base/n_side", - info: "本样例介绍如何在圆中收集点位,绘制正多边形,是练习绘制及形成路径的很好案例。\n特殊操作:+、- 修改边数", + info: context.l10n.drawRegularPolygons, content: NSidePage()), FrameShower( title: "随机对称图", author: "张风捷特烈", srcUrl: '/fun/random_portrait.dart', - info: "本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", + info: context.l10n.randomNumberProcessing, content: RandomPortrait()), FrameShower( title: "简单时钟", author: "张风捷特烈", srcUrl: '/base/clock_widget.dart', - info: "本样例通过时钟的绘制,练习 Flutter 中旋转刻度类型的绘制技巧,并通过动画使表盘指针转动。", + info: context.l10n.clockDrawing, content: ClockWidget()), ]; case GalleryType.anim: - return const [ + return [ FrameShower( title: "手势弹簧", author: "张风捷特烈", srcUrl: '/anim/spring_widget.dart', - info: "本样例介绍如何绘制弹簧,通过触点竖直拖拽拉伸、压缩,放手时进行恢复动画,是一个很好的综合小案例。\n特殊操作:上下拖拽伸缩弹簧", + info: context.l10n.drawSprings, content: SpringWidget()), FrameShower( title: "绕定点旋转", author: "张风捷特烈", srcUrl: '/anim/rotate_by_point', - info: "本样例介绍如何根据以某个点为中心,进行旋转运动。以此学习两点间的角度在绘制中的应用。\n特殊操作:点击运行", + info: context.l10n.theApplicationOfAnglesInDrawing, content: RotateByPointWidget()), FrameShower( title: "流光", author: "张风捷特烈", srcUrl: '/anim/circle_halo.dart', - info: "本样例介绍如何在绘制中使用着色器和过滤器,并通过动画进行数值变化达到旋转流光效果。", + info: context.l10n.usingShadersAndFilters, content: CircleHalo()), FrameShower( title: "曲线路径动画", author: "张风捷特烈", srcUrl: '/anim/draw_path.dart', - info: "本样例介绍如何使用路径绘制函数曲线,并使用路径测量进行动画", + info: context.l10n.pathDrawingFunctionCurve, content: DrawPath()), FrameShower( title: "冰墩墩线条动画", author: "张风捷特烈", srcUrl: '/anim/dundun_path.dart', - info: "本样例会绘制 2022 年北京冬奥会吉祥物冰墩墩的路径,并使用路径测量进行动画。\n特殊操作:点击运行", + info: context.l10n.thePathOfBingDwenDwen, content: DunDunPathPage()), FrameShower( title: "Bezier3 演示", author: "张风捷特烈", srcUrl: '/anim/bezier3_player', - info: "本样例介绍如何绘制三次贝塞尔曲线,通过触点判断某点是否激活,据此控制点的位置达到拖动控制效果。\n特殊操作:单击绘点,双击清除", + info: context.l10n.drawCubicBesselCurve, content: Bezier3Player()), FrameShower( title: "动画曲线散点图", author: "张风捷特烈", srcUrl: '/anim/curve_shower', - info: "本样例通过直观的方式,来查看动画曲线 curve 的作用效果,让大家对动画有更深的理解。\n特殊操作:点击运行", + info: context.l10n.theEffectOfAnimationCurve, content: CurveAnimShower()), ]; case GalleryType.particle: - return const [ + return [ FrameShower( title: "随机粒子生成器", author: "张风捷特烈", srcUrl: '/particle/random', - info: "本样例介绍如何创建随机粒子及边界反弹逻辑处理,是学习粒子运动非常好的入门案例。\n特殊操作:单击停止/运行", + info: context.l10n.randomParticlesAndBoundaryBouncing, content: RandomParticle()), FrameShower( title: "粒子分裂", author: "张风捷特烈", srcUrl: '/particle/split', - info: "本样例介绍如何对个粒子进行碰撞检测,并分裂处多个粒子,是一个比较有趣的案例。\n特殊操作:单击重置", + info: context.l10n.particleCollision, content: ParticleSplit()), FrameShower( title: "图片粒子分裂", author: "张风捷特烈", srcUrl: '/particle/split_img', - info: "本样例介绍将图片使用粒子表示,并对粒子进行动画处理,达到爆炸的效果。\n特殊操作:单击运行", + info: context.l10n.particle, content: SplitImage()), ]; case GalleryType.fun: - return const[ + return [ FrameShower( title: "Random Portrait", author: "张风捷特烈", srcUrl: '/fun/random_portrait.dart', - info: "本样例介绍绘制矩形及随机数处理。通过点位集合确定矩形位置信息,将其绘制出来。可以练习对数据的控制能力。\n特殊操作:点击随机生成", + info: context.l10n.rectangleAndRandomNumbers, content: RandomPortrait()), FrameShower( title: "冰墩墩", author: "张风捷特烈", srcUrl: '/fun/dundun_view.dart', - info: "本样例是绘制 2022 年北京冬奥会吉祥物冰墩墩的形体,从中可以学到路径绘制、渐变色等知识。", + info: context.l10n.bingDwenDwen, content: DunDunView()), FrameShower( title: "蒲丰投针试验", author: "张风捷特烈", srcUrl: '/fun/bufeng', - info: "本样实现蒲丰投针试验的测试过程,根据概率来估算圆周率。其中可以学习到一些绘制小技巧已经数据的逻辑处理。", + info: context.l10n.pufengInjectionTest, content: BufengPanel()), FrameShower( title: "井字棋", author: "张风捷特烈", srcUrl: '/fun/stemp', - info: "本例通过井字棋的绘制与逻辑校验,集合了手势、绘制、动画、校验等重要的技能,是一个非常好的联系案例。\n特殊操作:双击重置", + info: context.l10n.ticTacToe, content: StampPaper()), ]; case GalleryType.art: - return const [ + return [ FrameShower( title: "Tiled Line", author: "generativeartistry.com", srcUrl: '/art/tiled_lines.dart', - info: - "本样例根源来自generativeartistry.com的tiled-lines,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + info: context.l10n.tiledLines, content: TiledLines(), ), FrameShower( title: "Joy Division", author: "generativeartistry.com", srcUrl: '/art/joy_division.dart', - info: - "本样例根源来自generativeartistry.com的joy-division,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", + info: context.l10n.joyDivision, content: JoyDivision(), ), FrameShower( title: "Cubic Disarray", author: "generativeartistry.com", srcUrl: '/art/cubic_disarray.dart', - info: - "本样例根源来自generativeartistry.com的cubic-disarray,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: CubicDisarray(), + info: context.l10n.cubicDisarray, content: CubicDisarray(), ), FrameShower( title: "Triangular Mesh", author: "generativeartistry.com", srcUrl: '/art/triangular_mesh.dart', - info: - "本样例根源来自generativeartistry.com的triangular-mesh,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: TriangularMesh(), + info: context.l10n.triangularMesh, content: TriangularMesh(), ), FrameShower( title: "Un Deux Trois", srcUrl: '/art/un_deux_trois.dart', author: "generativeartistry.com", - info: - "本样例根源来自generativeartistry.com的un-deux-trois,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: UnDeuxTrois(), + info: context.l10n.unDeuxTrois, content: UnDeuxTrois(), ), FrameShower( title: "Circle Packing", author: "generativeartistry.com", srcUrl: '/art/circle_packing.dart', - info: - "本样例根源来自generativeartistry.com的circle-packing,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: CirclePacking(), + info: context.l10n.circlePacking, content: CirclePacking(), ), FrameShower( title: "Hypnotic Squares", author: "generativeartistry.com", srcUrl: '/art/hypnotic_squares.dart', - info: - "本样例根源来自generativeartistry.com的hypnotic-squares,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: HypnoticSquares(), + info: context.l10n.hypnoticSquares, content: HypnoticSquares(), ), FrameShower( title: "Piet Mondrian", author: "generativeartistry.com", srcUrl: '/art/piet_mondrian.dart', - info: - "本样例根源来自generativeartistry.com的piet-mondrian,由xrr2016使用Flutter实现。仓库地址:flutter-generative-artistry", - content: PietMondrian(), + info: context.l10n.pietMondrian, content: PietMondrian(), ) ]; default: diff --git a/packages/draw_system/lib/src/gallery_unit.dart b/packages/draw_system/lib/src/gallery_unit.dart index ac807155..ed6c69cc 100644 --- a/packages/draw_system/lib/src/gallery_unit.dart +++ b/packages/draw_system/lib/src/gallery_unit.dart @@ -1,11 +1,12 @@ import 'dart:convert'; +import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:toly_ui/toly_ui.dart'; - +import 'package:l10n/l10n.dart'; import 'bloc/gallery_unit/bloc.dart'; import 'desk_ui/desk_gallery_unit.dart'; @@ -97,9 +98,7 @@ class _PhoneGalleryUnitState extends State { Expanded( child: Container( margin: const EdgeInsets.only(left: 8, right: 8), - child: BlocBuilder( - builder: _buildContentByState, - ), + child: _buildContent(StrUnit.galleryDesc(context)), decoration: boxDecoration, )) ], @@ -124,7 +123,7 @@ class _PhoneGalleryUnitState extends State { height: MediaQuery.of(context).size.height * 0.2, child: Row( mainAxisSize: MainAxisSize.min, - children: const [ + children: [ FlutterLogo( size: 40, ), @@ -132,7 +131,7 @@ class _PhoneGalleryUnitState extends State { width: 10, ), Text( - "绘制集录", + context.l10n.paintCollection, style: TextStyle(fontSize: 26, color: Colors.white), ), ], @@ -144,13 +143,14 @@ class _PhoneGalleryUnitState extends State { if(state.isEmpty){ return const LoadingShower(); } - return _buildContent(state); + return _buildContent(StrUnit.galleryDesc(context)); } Widget _buildContent(String galleryInfo) { + final List widgets = (json.decode(galleryInfo) as List).map((e) { GalleryInfo info = GalleryInfo.fromJson(e); - List children = GalleryFactory.getGalleryByName(info.type); + List children = GalleryFactory.getGalleryByName(info.type,context); return FeedbackWidget( a: 0.95, diff --git a/packages/draw_system/lib/src/picture_frame.dart b/packages/draw_system/lib/src/picture_frame.dart index 7cb425ca..72a98f08 100644 --- a/packages/draw_system/lib/src/picture_frame.dart +++ b/packages/draw_system/lib/src/picture_frame.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'desk_ui/desk_frame.dart'; - +import 'package:l10n/l10n.dart'; class PictureFrame extends StatelessWidget { final Widget? child; final double? width; @@ -155,8 +155,8 @@ class FrameShower extends StatelessWidget { const Spacer(), GestureDetector( onTap: _launch, - child: const Text( - "源码地址 ", + child: Text( + "${context.l10n.srcPath} ", style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, diff --git a/packages/l10n/lib/arb/app_en.arb b/packages/l10n/lib/arb/app_en.arb index 9084b35e..d7e91d07 100644 --- a/packages/l10n/lib/arb/app_en.arb +++ b/packages/l10n/lib/arb/app_en.arb @@ -2,12 +2,17 @@ "widgetCollection": "Widgets", "paintCollection": "Painter", "knowledgeCollection": "Knowledge", - "homeAccount": "Account", - "collectCollection": "CollectionCollection", + "homeAccount": "Application", + + "homeAccountTabInfo": "About App", + "homeAccountTabMe": "Contact Me", + "homeAccountSupport": "Support Project", + + "collectCollection": "Collection", "essentialCollection": "KeypointsCollection", "treasureTools": "Treasure", - "searchWidget": "search widget...", + "searchWidget": "search widget ...", "stateless":"Stateless", "stateful":"Stateful", "single":"Single", @@ -44,7 +49,12 @@ "settingLanguageText": "Setting Language", - "enterComponentName":"Enter component name", + "checkUpdate":"Check New Version", + "downloadNewVersion":"Download New Version", + "downloadingNewVersion":"Downloading New Version ...", + "currentIsNew":"There is the latest version of FlutterUnit!", + + "enterComponentName":"Input widget name", "containerComponents":"Container components", "relatedComponents":"Related components", "componentTavern":"Component Tavern", @@ -134,11 +144,24 @@ "stateManagement":"State management", "jsonParsing":"Json Parsing", "clickHereToJump":"Click here to jump to", + "knowledgeTabToly":"Toly Articles", + "knowledgeTabAlgo":"Algo Player", + "knowledgeTabLayout":"Layout Treasury", + "knowledgeTabPoint":"Key Points", + "knowledgeConstruction":"In Construction", + "knowledgeToJuejin":"To Juejin", + "srcPath":"Source Path", + "widgetsInn":"Widgets Inn", + "likedWidgets":"Liked Widgets", "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode":"After activation, it will follow the system to turn on or off dark mode", - + "basicDrawingDesc":"Including some basic graphics drawing examples would be very friendly to beginners in programming. Through these examples, one can learn how to draw basic shapes such as points, lines, rectangles, circles, arcs, text, images, etc., and understand the usage of core objects in drawing like Canvas, Paint, Path, etc.", + "animationGestureDesc":"Includes some drawing examples of animation and gestures, which make drawing more interactive. Through these examples, one can learn the usage of animation and gestures, such as sliding, rotating, scaling, moving effects, etc., making drawing not just static presentation.", + "particleDrawingDesc": "Includes some drawing examples related to particles, which are top-level operations in drawing. Through these examples, one can learn how to use particles to create stunning visual effects, such as particle clocks, particle explosions, particle backgrounds, etc., giving drawing endless possibilities.", + "interestingDrawingDesc": "Includes some fun drawing examples, let's experience the joy of drawing, programming, and intelligence together here.", + "artGalleryDesc": "Includes some hall-level drawing examples, which are pinnacle works of drawing. They have no practicality and are not born for any demand. They exist only because they exist, serving as a medium for human wisdom and expression, called art.", "checkDatabaseNewVersion":"Check for new versions of the database", - "viewThisProjectGithubRepository":"《View the Github warehouse for this project》", + "viewThisProjectGithubRepository":"《View the Github Repository for this project》", "dataManagement":"Data management", "backupFavoritesCollectionData":"Backup Collection Data", "syncFavoritesCollectionData":"Synchronize collection data", diff --git a/packages/l10n/lib/arb/app_zh.arb b/packages/l10n/lib/arb/app_zh.arb index 13349374..f7d2e56b 100644 --- a/packages/l10n/lib/arb/app_zh.arb +++ b/packages/l10n/lib/arb/app_zh.arb @@ -5,7 +5,12 @@ "treasureTools": "工具宝箱", "collectCollection": "收藏集录", "essentialCollection": "要点集录", - "homeAccount": "用户信息", + + "homeAccount": "应用信息", + + "homeAccountTabInfo": "关于应用", + "homeAccountTabMe": "联系本王", + "homeAccountSupport": "支持项目", "searchWidget": "搜索组件", @@ -45,12 +50,17 @@ "lightMode":"浅色模式", "settingLanguage": "设置语言", - + "appDetails":"应用详情", + "checkUpdate":"检查新版本", + "downloadNewVersion":"下载新版本", + "downloadingNewVersion":"新版本下载中...", + "currentIsNew":"当前应用已是最新版本!", + "checkDatabaseNewVersion":"检查数据库新版本", + "viewThisProjectGithubRepository":"《查看本项目Github仓库》", "favorite":"已收藏", "enterComponentName":"输入组件名称", "containerComponents":"容器组件", - "relatedComponents":"相关组件", "componentTavern":"组件酒肆", "cherishedComponents":"珍藏组件", "textImageCollection":"图文集", @@ -66,10 +76,15 @@ "derivativeCollection":"衍生集", "hardToCategorize":"很难分", "basicDrawing":"基础绘制", + "basicDrawingDesc":"收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。", "animationGesture":"动画手势", + "animationGestureDesc":"收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。", "particleDrawing":"粒子绘制", + "particleDrawingDesc":"收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。", "interestingDrawing":"趣味绘制", + "interestingDrawingDesc":"收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。", "artGallery":"艺术画廊", + "artGalleryDesc":"收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。", "drawingOfImages":"本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 ", "digitalDisplayTube":"本样例介绍如何绘制 LED 数字显示管,以此练习对路径 Path 的使用、变换、组合,以及组件封装的知识。是一个非常好的绘制案例 ", "pathDrawing":"本样例介绍如何进行简单的路径绘制,以及画板的旋转,再结合动画让风车旋转。这是一个非常精简的绘制与动画结合的案例。 ", @@ -139,11 +154,16 @@ "jsonParsing":"Json 解析", "clickHereToJump":"点击这里跳转", - - - "appDetails":"应用详情", - "checkDatabaseNewVersion":"检查数据库新版本", - "viewThisProjectGithubRepository":"《查看本项目Github仓库》", + "knowledgeTabToly":"捷特文库", + "knowledgeTabAlgo":"算法演绎", + "knowledgeTabLayout":"布局宝库", + "knowledgeTabPoint":"要点宝库", + "knowledgeConstruction":"正在建设中", + "knowledgeToJuejin":"前往掘金", + "srcPath":"源码地址", + "widgetsInn":"组件酒肆", + "likedWidgets":"珍藏组件", + "relatedComponents":"相关组件", "backupFavoritesCollectionData":"备份收藏集数据", "syncFavoritesCollectionData":"同步收藏集数据", diff --git a/packages/l10n/lib/gen_l10n/app_localizations.dart b/packages/l10n/lib/gen_l10n/app_localizations.dart index e731ad55..24b58f4c 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations.dart @@ -132,9 +132,27 @@ abstract class AppLocalizations { /// No description provided for @homeAccount. /// /// In zh, this message translates to: - /// **'用户信息'** + /// **'应用信息'** String get homeAccount; + /// No description provided for @homeAccountTabInfo. + /// + /// In zh, this message translates to: + /// **'关于应用'** + String get homeAccountTabInfo; + + /// No description provided for @homeAccountTabMe. + /// + /// In zh, this message translates to: + /// **'联系本王'** + String get homeAccountTabMe; + + /// No description provided for @homeAccountSupport. + /// + /// In zh, this message translates to: + /// **'支持项目'** + String get homeAccountSupport; + /// No description provided for @searchWidget. /// /// In zh, this message translates to: @@ -321,6 +339,48 @@ abstract class AppLocalizations { /// **'设置语言'** String get settingLanguage; + /// No description provided for @appDetails. + /// + /// In zh, this message translates to: + /// **'应用详情'** + String get appDetails; + + /// No description provided for @checkUpdate. + /// + /// In zh, this message translates to: + /// **'检查新版本'** + String get checkUpdate; + + /// No description provided for @downloadNewVersion. + /// + /// In zh, this message translates to: + /// **'下载新版本'** + String get downloadNewVersion; + + /// No description provided for @downloadingNewVersion. + /// + /// In zh, this message translates to: + /// **'新版本下载中...'** + String get downloadingNewVersion; + + /// No description provided for @currentIsNew. + /// + /// In zh, this message translates to: + /// **'当前应用已是最新版本!'** + String get currentIsNew; + + /// No description provided for @checkDatabaseNewVersion. + /// + /// In zh, this message translates to: + /// **'检查数据库新版本'** + String get checkDatabaseNewVersion; + + /// No description provided for @viewThisProjectGithubRepository. + /// + /// In zh, this message translates to: + /// **'《查看本项目Github仓库》'** + String get viewThisProjectGithubRepository; + /// No description provided for @favorite. /// /// In zh, this message translates to: @@ -339,12 +399,6 @@ abstract class AppLocalizations { /// **'容器组件'** String get containerComponents; - /// No description provided for @relatedComponents. - /// - /// In zh, this message translates to: - /// **'相关组件'** - String get relatedComponents; - /// No description provided for @componentTavern. /// /// In zh, this message translates to: @@ -435,30 +489,60 @@ abstract class AppLocalizations { /// **'基础绘制'** String get basicDrawing; + /// No description provided for @basicDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。'** + String get basicDrawingDesc; + /// No description provided for @animationGesture. /// /// In zh, this message translates to: /// **'动画手势'** String get animationGesture; + /// No description provided for @animationGestureDesc. + /// + /// In zh, this message translates to: + /// **'收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。'** + String get animationGestureDesc; + /// No description provided for @particleDrawing. /// /// In zh, this message translates to: /// **'粒子绘制'** String get particleDrawing; + /// No description provided for @particleDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。'** + String get particleDrawingDesc; + /// No description provided for @interestingDrawing. /// /// In zh, this message translates to: /// **'趣味绘制'** String get interestingDrawing; + /// No description provided for @interestingDrawingDesc. + /// + /// In zh, this message translates to: + /// **'收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。'** + String get interestingDrawingDesc; + /// No description provided for @artGallery. /// /// In zh, this message translates to: /// **'艺术画廊'** String get artGallery; + /// No description provided for @artGalleryDesc. + /// + /// In zh, this message translates to: + /// **'收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。'** + String get artGalleryDesc; + /// No description provided for @drawingOfImages. /// /// In zh, this message translates to: @@ -867,23 +951,65 @@ abstract class AppLocalizations { /// **'点击这里跳转'** String get clickHereToJump; - /// No description provided for @appDetails. + /// No description provided for @knowledgeTabToly. /// /// In zh, this message translates to: - /// **'应用详情'** - String get appDetails; + /// **'捷特文库'** + String get knowledgeTabToly; - /// No description provided for @checkDatabaseNewVersion. + /// No description provided for @knowledgeTabAlgo. /// /// In zh, this message translates to: - /// **'检查数据库新版本'** - String get checkDatabaseNewVersion; + /// **'算法演绎'** + String get knowledgeTabAlgo; - /// No description provided for @viewThisProjectGithubRepository. + /// No description provided for @knowledgeTabLayout. /// /// In zh, this message translates to: - /// **'《查看本项目Github仓库》'** - String get viewThisProjectGithubRepository; + /// **'布局宝库'** + String get knowledgeTabLayout; + + /// No description provided for @knowledgeTabPoint. + /// + /// In zh, this message translates to: + /// **'要点宝库'** + String get knowledgeTabPoint; + + /// No description provided for @knowledgeConstruction. + /// + /// In zh, this message translates to: + /// **'正在建设中'** + String get knowledgeConstruction; + + /// No description provided for @knowledgeToJuejin. + /// + /// In zh, this message translates to: + /// **'前往掘金'** + String get knowledgeToJuejin; + + /// No description provided for @srcPath. + /// + /// In zh, this message translates to: + /// **'源码地址'** + String get srcPath; + + /// No description provided for @widgetsInn. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get widgetsInn; + + /// No description provided for @likedWidgets. + /// + /// In zh, this message translates to: + /// **'珍藏组件'** + String get likedWidgets; + + /// No description provided for @relatedComponents. + /// + /// In zh, this message translates to: + /// **'相关组件'** + String get relatedComponents; /// No description provided for @backupFavoritesCollectionData. /// diff --git a/packages/l10n/lib/gen_l10n/app_localizations_en.dart b/packages/l10n/lib/gen_l10n/app_localizations_en.dart index 47290cb5..9a4cd2d0 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_en.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_en.dart @@ -23,10 +23,19 @@ class AppLocalizationsEn extends AppLocalizations { String get essentialCollection => 'KeypointsCollection'; @override - String get homeAccount => 'Account'; + String get homeAccount => 'Application'; @override - String get searchWidget => 'search widget...'; + String get homeAccountTabInfo => 'About App'; + + @override + String get homeAccountTabMe => 'Contact Me'; + + @override + String get homeAccountSupport => 'Support Project'; + + @override + String get searchWidget => 'search widget ...'; @override String get stateless => 'Stateless'; @@ -119,16 +128,34 @@ class AppLocalizationsEn extends AppLocalizations { String get settingLanguage => 'Language Setting'; @override - String get favorite => 'Collected'; + String get appDetails => 'Application details'; @override - String get enterComponentName => 'Enter component name'; + String get checkUpdate => 'Check New Version'; @override - String get containerComponents => 'Container components'; + String get downloadNewVersion => 'Download New Version'; @override - String get relatedComponents => 'Related components'; + String get downloadingNewVersion => 'Downloading New Version ...'; + + @override + String get currentIsNew => 'There is the latest version of FlutterUnit!'; + + @override + String get checkDatabaseNewVersion => 'Check for new versions of the database'; + + @override + String get viewThisProjectGithubRepository => '《View the Github Repository for this project》'; + + @override + String get favorite => 'Collected'; + + @override + String get enterComponentName => 'Input widget name'; + + @override + String get containerComponents => 'Container components'; @override String get componentTavern => 'Component Tavern'; @@ -175,18 +202,33 @@ class AppLocalizationsEn extends AppLocalizations { @override String get basicDrawing => 'Basic drawing'; + @override + String get basicDrawingDesc => 'Including some basic graphics drawing examples would be very friendly to beginners in programming. Through these examples, one can learn how to draw basic shapes such as points, lines, rectangles, circles, arcs, text, images, etc., and understand the usage of core objects in drawing like Canvas, Paint, Path, etc.'; + @override String get animationGesture => 'Animated gestures'; + @override + String get animationGestureDesc => 'Includes some drawing examples of animation and gestures, which make drawing more interactive. Through these examples, one can learn the usage of animation and gestures, such as sliding, rotating, scaling, moving effects, etc., making drawing not just static presentation.'; + @override String get particleDrawing => 'Particle drawing'; + @override + String get particleDrawingDesc => 'Includes some drawing examples related to particles, which are top-level operations in drawing. Through these examples, one can learn how to use particles to create stunning visual effects, such as particle clocks, particle explosions, particle backgrounds, etc., giving drawing endless possibilities.'; + @override String get interestingDrawing => 'Fun drawing'; + @override + String get interestingDrawingDesc => 'Includes some fun drawing examples, let\'s experience the joy of drawing, programming, and intelligence together here.'; + @override String get artGallery => 'Art galleries '; + @override + String get artGalleryDesc => 'Includes some hall-level drawing examples, which are pinnacle works of drawing. They have no practicality and are not born for any demand. They exist only because they exist, serving as a medium for human wisdom and expression, called art.'; + @override String get drawingOfImages => 'This example explains how to draw images: by loading images and drawing image resources to a specified area. Draw a batch of 45 \"angled grid lines on the upper layer to practice drawing the lines '; @@ -392,13 +434,34 @@ class AppLocalizationsEn extends AppLocalizations { String get clickHereToJump => 'Click here to jump to'; @override - String get appDetails => 'Application details'; + String get knowledgeTabToly => 'Toly Articles'; @override - String get checkDatabaseNewVersion => 'Check for new versions of the database'; + String get knowledgeTabAlgo => 'Algo Player'; + + @override + String get knowledgeTabLayout => 'Layout Treasury'; @override - String get viewThisProjectGithubRepository => '《View the Github warehouse for this project》'; + String get knowledgeTabPoint => 'Key Points'; + + @override + String get knowledgeConstruction => 'In Construction'; + + @override + String get knowledgeToJuejin => 'To Juejin'; + + @override + String get srcPath => 'Source Path'; + + @override + String get widgetsInn => 'Widgets Inn'; + + @override + String get likedWidgets => 'Liked Widgets'; + + @override + String get relatedComponents => 'Related components'; @override String get backupFavoritesCollectionData => 'Backup Collection Data'; diff --git a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart index f1f8e66e..eb52f93b 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -23,7 +23,16 @@ class AppLocalizationsZh extends AppLocalizations { String get essentialCollection => '要点集录'; @override - String get homeAccount => '用户信息'; + String get homeAccount => '应用信息'; + + @override + String get homeAccountTabInfo => '关于应用'; + + @override + String get homeAccountTabMe => '联系本王'; + + @override + String get homeAccountSupport => '支持项目'; @override String get searchWidget => '搜索组件'; @@ -118,6 +127,27 @@ class AppLocalizationsZh extends AppLocalizations { @override String get settingLanguage => '设置语言'; + @override + String get appDetails => '应用详情'; + + @override + String get checkUpdate => '检查新版本'; + + @override + String get downloadNewVersion => '下载新版本'; + + @override + String get downloadingNewVersion => '新版本下载中...'; + + @override + String get currentIsNew => '当前应用已是最新版本!'; + + @override + String get checkDatabaseNewVersion => '检查数据库新版本'; + + @override + String get viewThisProjectGithubRepository => '《查看本项目Github仓库》'; + @override String get favorite => '已收藏'; @@ -127,9 +157,6 @@ class AppLocalizationsZh extends AppLocalizations { @override String get containerComponents => '容器组件'; - @override - String get relatedComponents => '相关组件'; - @override String get componentTavern => '组件酒肆'; @@ -175,18 +202,33 @@ class AppLocalizationsZh extends AppLocalizations { @override String get basicDrawing => '基础绘制'; + @override + String get basicDrawingDesc => '收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。'; + @override String get animationGesture => '动画手势'; + @override + String get animationGestureDesc => '收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。'; + @override String get particleDrawing => '粒子绘制'; + @override + String get particleDrawingDesc => '收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。'; + @override String get interestingDrawing => '趣味绘制'; + @override + String get interestingDrawingDesc => '收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。'; + @override String get artGallery => '艺术画廊'; + @override + String get artGalleryDesc => '收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。'; + @override String get drawingOfImages => '本样例介绍如何进行图片的绘制: 通过加载图片并将图片资源绘制到指定的区域。在上层绘制一批 45”倾角的栅格线,来练习线条的绘制 '; @@ -392,13 +434,34 @@ class AppLocalizationsZh extends AppLocalizations { String get clickHereToJump => '点击这里跳转'; @override - String get appDetails => '应用详情'; + String get knowledgeTabToly => '捷特文库'; @override - String get checkDatabaseNewVersion => '检查数据库新版本'; + String get knowledgeTabAlgo => '算法演绎'; @override - String get viewThisProjectGithubRepository => '《查看本项目Github仓库》'; + String get knowledgeTabLayout => '布局宝库'; + + @override + String get knowledgeTabPoint => '要点宝库'; + + @override + String get knowledgeConstruction => '正在建设中'; + + @override + String get knowledgeToJuejin => '前往掘金'; + + @override + String get srcPath => '源码地址'; + + @override + String get widgetsInn => '组件酒肆'; + + @override + String get likedWidgets => '珍藏组件'; + + @override + String get relatedComponents => '相关组件'; @override String get backupFavoritesCollectionData => '备份收藏集数据'; diff --git a/packages/toly_ui/lib/button/feedback_widget.dart b/packages/toly_ui/lib/button/feedback_widget.dart index d26525c0..f90777d7 100644 --- a/packages/toly_ui/lib/button/feedback_widget.dart +++ b/packages/toly_ui/lib/button/feedback_widget.dart @@ -77,6 +77,7 @@ class _FeedBackState extends State with SingleTickerProviderStat cursor: SystemMouseCursors.click, child: GestureDetector( onLongPress: widget.onLongPressed, + behavior: HitTestBehavior.opaque, onTap: () { _controller.forward(); widget.onPressed?.call(); diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index 58632b52..71479778 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -5,6 +5,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../../data/exp.dart'; @@ -127,7 +128,7 @@ class _DeskSearchBarState extends State { borderSide: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(8)), ), - hintText: "输入组件名称", + hintText: context.l10n.enterComponentName, hintStyle: TextStyle(fontSize: 12, color: Colors.grey)), ); diff --git a/packages/widget_module/lib/views/mobile/category_page/category_detail.dart b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart index 16061ecb..40dc214e 100644 --- a/packages/widget_module/lib/views/mobile/category_page/category_detail.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart @@ -22,16 +22,14 @@ class CategoryShow extends StatelessWidget { @override Widget build(BuildContext context) { - + CategoryWidgetState state = context.watch().state; + Widget child = const SizedBox(); + if (state is CategoryWidgetLoadedState) { + child = _buildWidgetList(state.widgets); + } return Scaffold( appBar: AppBar(title: Text(model.name)), - body: BlocBuilder( - builder: (_, state) { - if (state is CategoryWidgetLoadedState) { - return _buildWidgetList(state.widgets); - } - return const SizedBox(); - }), + body: child, ); } @@ -70,7 +68,7 @@ class CategoryShow extends StatelessWidget { itemCount: widgets.length); } - _toDetailPage(BuildContext context, WidgetModel model) async { + void _toDetailPage(BuildContext context, WidgetModel model) async { // Navigator.pushNamed(context, UnitRouter.widget_detail, arguments: model); context.push('/widget/detail/${model.name}',extra: model); } diff --git a/packages/widget_module/lib/views/mobile/category_page/collect_page.dart b/packages/widget_module/lib/views/mobile/category_page/collect_page.dart index 7a7f3adb..a795e4a4 100644 --- a/packages/widget_module/lib/views/mobile/category_page/collect_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/collect_page.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:authentication/views/authentic_widget.dart'; @@ -39,9 +40,9 @@ class CollectPage extends StatefulWidget { class _CollectPageState extends State with AutomaticKeepAliveClientMixin { - final List _tabs = const [ - '收藏集录', - '珍藏组件', + late final List _tabs = [ + context.l10n.widgetsInn, + context.l10n.likedWidgets, ]; @override @@ -107,8 +108,8 @@ class _CollectPageState extends State if(!widget.canPop) SizedBox(child: _buildAddAction(context)) ], - title: const Text( - '收藏集录', + title: Text( + context.l10n.collectCollection, style: TextStyle( color: Colors.white, //标题 fontSize: 18, From 072c89f906d0a7fadbef93feabbf8367311e188b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 21 Feb 2024 21:55:06 +0800 Subject: [PATCH 057/149] fix button primary --- .../lib/StatefulWidget/ElevatedButton/node2_style.dart | 4 ++-- .../lib/StatefulWidget/OutlinedButton/node2_style.dart | 4 ++-- .../widgets/lib/StatefulWidget/TextButton/node2_style.dart | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart index 9096c128..9db627ac 100644 --- a/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart +++ b/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart @@ -27,7 +27,7 @@ class ElevatedButtonStyleDemo extends StatelessWidget { ElevatedButton( style: TextButton.styleFrom( backgroundColor: Colors.orange, - primary: Colors.white, + foregroundColor: Colors.white, elevation: 2, shadowColor: Colors.orangeAccent), child: const Text('ElevatedButton样式'), @@ -37,7 +37,7 @@ class ElevatedButtonStyleDemo extends StatelessWidget { ElevatedButton( style: TextButton.styleFrom( backgroundColor: Colors.white, - primary: Colors.black, + foregroundColor: Colors.black, side: const BorderSide(color: Colors.blue,width: 1), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)) diff --git a/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart index 6cf13aaa..eddadc6b 100644 --- a/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart +++ b/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart @@ -27,7 +27,7 @@ class OutlinedButtonStyleDemo extends StatelessWidget { OutlinedButton( style: TextButton.styleFrom( backgroundColor: Colors.orange, - primary: Colors.white, + foregroundColor: Colors.white, elevation: 2, shadowColor: Colors.orangeAccent), child: const Text('ElevatedButton样式'), @@ -37,7 +37,7 @@ class OutlinedButtonStyleDemo extends StatelessWidget { OutlinedButton( style: TextButton.styleFrom( backgroundColor: Colors.white, - primary: Colors.black, + foregroundColor: Colors.black, side: const BorderSide(color: Colors.blue,width: 1), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10)) diff --git a/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart b/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart index 7bb672ea..7c13d329 100644 --- a/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart +++ b/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart @@ -27,7 +27,7 @@ class TextButtonStyleDemo extends StatelessWidget { style: TextButton.styleFrom( backgroundColor: Colors.blue, padding: const EdgeInsets.symmetric(horizontal: 8), - primary: Colors.white, + foregroundColor: Colors.white, elevation: 2, shadowColor: Colors.orangeAccent), child: const Text('TextButton 样式'), @@ -37,7 +37,7 @@ class TextButtonStyleDemo extends StatelessWidget { TextButton( style: TextButton.styleFrom( backgroundColor: Colors.white, - primary: Colors.black, + foregroundColor: Colors.black, side: const BorderSide(color: Colors.blue, width: 1), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), From dcd88ab3a82a5a7200f78efe8a5e1a61980804a9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 22 Feb 2024 11:46:27 +0800 Subject: [PATCH 058/149] update Flutter 3.19.0 --- README.md | 22 ++++---- assets/flutter.db | Bin 1363968 -> 1376256 bytes assets/images/coffee1.webp | Bin 39614 -> 0 bytes assets/images/coffee_wx.webp | Bin 0 -> 11612 bytes assets/images/coffee_wx_ac.webp | Bin 0 -> 11646 bytes assets/images/coffee_zfb.webp | Bin 0 -> 20646 bytes assets/version.json | 2 +- doc/ewm/coffee1.webp | Bin 39614 -> 48828 bytes .../views/account/desk/desk_account_page.dart | 2 +- .../views/account/desk/sliver_list_panel.dart | 42 ++++++++++----- .../views/data_manage/data_manage_page.dart | 6 ++- lib/navigation/routers/mobile_route.dart | 7 +++ lib/navigation/views/unit_navigation.dart | 2 +- packages/app/lib/app_config/bloc/bloc.dart | 5 +- .../lib/src/articles/view/artifact_page.dart | 12 +++-- .../authentication/lib/authentication.dart | 1 + .../lib/views/mobile/user/page_item.dart | 2 + .../lib/views/mobile/user/support_me.dart | 46 +++++++++++++++++ .../lib/src/desk_ui/desk_gallery_unit.dart | 3 +- packages/draw_system/pubspec.yaml | 2 + packages/l10n/lib/arb/app_en.arb | 6 ++- packages/l10n/lib/arb/app_zh.arb | 5 +- .../l10n/lib/gen_l10n/app_localizations.dart | 12 +++++ .../lib/gen_l10n/app_localizations_en.dart | 10 +++- .../lib/gen_l10n/app_localizations_zh.dart | 6 +++ .../widget_detail/widget_detail_page.dart | 11 ++-- .../widget_detail/widget_detail_page.dart | 22 ++++---- .../StatefulWidget/DropdownMenu/node2.dart | 4 ++ .../StatefulWidget/DropdownMenu/node3.dart | 3 ++ pubspec.lock | 48 +++++++++++++----- pubspec.yaml | 2 +- 31 files changed, 211 insertions(+), 72 deletions(-) delete mode 100644 assets/images/coffee1.webp create mode 100644 assets/images/coffee_wx.webp create mode 100644 assets/images/coffee_wx_ac.webp create mode 100644 assets/images/coffee_zfb.webp create mode 100644 packages/authentication/lib/views/mobile/user/support_me.dart diff --git a/README.md b/README.md index 9b21a6b2..9bcc0908 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ ### FlutterUnit 全平台下载体验: -| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | -|------|------------|------|------------| -| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 |[FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 |[FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v2.9.3/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| -| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| +| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | +|------|--------------------------------------------------------------------------------------------------------------|------|------------| +| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| #### Flutter Unit 周边 @@ -32,10 +32,10 @@ #### 当前Flutter 版本 ``` -Flutter 3.16.8 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 67457e669f (11 days ago) • 2024-01-16 16:22:29 -0800 -Engine • revision 6e2ea58a5c -Tools • Dart 3.2.5 • DevTools 2.28.5 +Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision bae5e49bc2 (8 days ago) • 2024-02-13 17:46:18 -0800 +Engine • revision 04817c99c9 +Tools • Dart 3.3.0 • DevTools 2.31.1 ``` #### 构建命令,产出应用 diff --git a/assets/flutter.db b/assets/flutter.db index 9cdba0a2c926ea2ef1bf42d38a6e805d14c849b8..2f32f67d47fc0d97ddd100f42473039880840cc3 100644 GIT binary patch delta 15980 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 Mk37IvyY|Na14aLvsQ>@~ delta 9761 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 E3jtA5RsaA1 diff --git a/assets/images/coffee1.webp b/assets/images/coffee1.webp deleted file mode 100644 index 53ff28e9374e07b367d9b69b458f3bd4ca817d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39614 zcmcG#W00iXwk=$?-DTUhZQHhO+qSFAwr$(hWp$~`uCLzx?sLvQ`$n95zqoPpM@D9> z%v{ei*PLUHIYy+Sgs5msCIEn%h@iZxJUf2H_v?6CkQ_itb8u;3-fi1@CGww?v1*3AwKV77o$aDbWf9gJ8gN(XI?wKr!O*IdiTE0 zU+cazZ{?qrpQCGPZ*c{`-hAu%24C^-Ebf1Oc+HDdB+U!`40~Ix0!#nO`0D+N{qTG` zxr5*3oA^}z3VP6+ksJI9`xyQLzr%UMHGGp=20!lg@l*OFx+Oa9z1O?xo%xi0O}jmK zo1Mn{lSjyx^(Ffy@dQ2sIp`7cCh-KnL8s8${894Id8v0%+sF3+|3};HbMb=YLu|(E zi?1C%g3tKt{t4$J8pR)yKwQFHD?V|qm4KwcR!~ZCD>yZz9g+sx5lIv6khqCv?El5G zgTCGCAivpuFqI{{p86@5$(x$IadpDhYZ%CX-+j0u^4{4LU5O_ z%_Z`GxHjNFS#7|)HN=4YYAsHM>K0hxlkiTj4#DI3&2|_ynQ4nK1mjZ7ssw&b2$qD6 z*_3YfzvdNwT2J^NoH2@134^~Q%!p3>w@4_q#bnb$FFsSL3yIt#4}iK6&tuBF1wI%#h>18 zXyQ}>tRtYCfhD3y6s7ooKD+%Puob$Hpcq(dut@(N9*gAryH&a*EzJ{k;^k;$2-KfFNp2; zg7~%-$jAR-p%`d@)0KUuI?6R>n0QPyV|Uv z0%;4bCIn@s%?URUe4cgND)H$`!C_-nMwG^$?^_&nv}Ni8AitU+{UK>WP;8lHBlYb{ z#b#$yLzcr?9$FlA(M`rAX&EoZ-Q7*N>_%Y@Rh~I8D%jd04U34mM}5*g6cHF5HkTeI z-WE-PA0*C&vGZ-6_%dd<@3hZ(eBLEpMKIL}7CSseD;FT(qc;YF^PAnkGVEMT=a{P) zybrGC{6bkx1t}7;b#iD(i2BXJ?70T&hMOLc#IF5gZ^{u^X{`Rr z+L4TwDmq32xl_afv`-rWrR-?u->%q!`KFJ0H$#X9%e&}7Hlv}u?BCF6_;|q#yS~Y|KMp|^JAS0F)^T2EId7xj&_VG(}gNr+Q+ZF3{=xU^%N)<+O zF811e1MQ62`Aq0nUK)ee7&#fSZSAYz{{KO8P`?sn~oB6ZeQ0&ENzO{&zRbyGl zdz;68pFN+5S44K?Pv}t%hdZ{#dTAA^NOE8sp4w`gnba_lXf!=)Byg*jKr&Z`6D&AZvH~14={lByc&jQS#xBm_VxIf)E9MB|p zuZ^W05J=g>k&MyF%$e9_U>it7m+X?P!^SwA>db71dGqQ9t5qNXh(rFR`3xy7E~}FN zx0V#8B91##!w?enpW6azPC@=4)I>*=qZ9;yBp^7nF%YKH#k4P#v;g4x`*zNQE#a?l z3`3e@FI9+LN?M4iVGS)n-S+YRar1=Bir|fv(FO^7c84OE+_J2W)44xj$ti^=9--d` zFuYg1$ezPRml=InEqI1tVU)~;(($n@FV@9rQj9ZGOt-P%&v+|%V1)@{Jh3Xg&$Nmg zAQe;MIV>`zMBBtDQksa0OJ(D5}! z+7i8m|7v)&6i}G){y^di7LiHfTOehdW59ty)uE)KXM?E=Qa@3xTGN8KpFNBJijxD% zZ7OG=FAhpa76>GDH4!J6=r2j_kn-OC4w(t;qg@??LEqSxU&fmfz(dnErKR`VbIs$Y zF9pCzpo)4t^7PCZlGGOJaC?F*^2PJYN?6PR=XLewCU;%s;9qUcV?A8CW{UbWKNbe@ z;7`xScSPufVu%{(GsVLN)Ul;_N^zn4xZ|t3qS{kqWiYMX_*2a@T{^8olZ9aeB{3O1S7L6WeXUnAE zeQ6+x4f_c4@8sarP(5x%)bHFBnpE!G1xZ)>)m#%PCGCE!%Ahg}T3-@rB`&ME7*)Ks zU&j&e5%IF<#>Bq0{|fYr5KR?2a$yT$yk)Gu0^IiV$- zXksdvlb+^g6V_j{(x@vmYtNx&WL08fjmwuFp=m1vy za6n{r3Cs&1AvN<*{QjNr(iHr!r)Yu|p1CO?!JJ$FcX&j1ho}ft|5sysgp17XKoYv7 zWuL_?XP5AaWWnKW&lT2q>k=1%R)u_&PBdw%I{J{rX{xZcQh>jB=ie}iQ|Yl6WRlMT z`pZSFiuu~GVZqCRfhas7$j{gb>$4tGy8Ja-vNeU-NXMEcD3Zp;0#Zh0Gv&%7>dmy? z?P)cRg4q5UlwyUjVrjc0qh_J&5 z2)>y_TWui02m)c4r14h zqFtPs{GaUK@U$OaP!0h=^iD?twqlf-nx!CcE(^tjiW}@b9C$TXshhZ|(oQlC8>#Zt zL9*+%;)r<*-Dbvg6pXbZ#7F7#R?1}qmXTNq`0e6y@D#~w+d-;-cx1Il+}!N;L&^|qo>DkW{@&*j9-IAY|WeFTWA3G z@kx$0*0wqn8%UI|puX?X!xU^Auej0`IEW+0ZGv(r%JrI4NZNlf$vHZ)4EOsfDP5sN z?Cx8Pu)a`w`ijDWI^y}xlm*4QO#lF2jf8D=#fdQnEZ#=Ct^(2mD*9I+Qf{U`8$5|& zIVlvOh#%4_yGc|>-!)dVFWfFJVVoSSh$aVWR0%+|55IL|OEow=Q7euk96A-GL7ZAp zy$bzF*Af#afMHbLY?=uwv;@I>@P6-H^9CYOffPl52cv^B?Uaw*;1krmLgo5*36cvX>*Jj zeo4+&Lph3v14jf-JU9COQ019h`Z3^zd)O7#1hp-HENve%UmNZQ`mm_Na3rQxJ;6ln zJuD7yVC(d~=b8VC1U4US5`^JAg8j=;u`L)b%KCXQbE`DOZY2vS+};exJTMm%Z0oj> zwlh|wf0)cVQbVW8FXQv5U9IZ3wmZBP<*M5gIzT&tv8&hTMA()CwsbGx`L}G zJ$8}#9nJnd(F#Y4Uq9J#_B!9Y`IY=k{U6az{%Zc2$%hUwhyCKm!`xe2pL!2zt@t*! z#=@&aE2`-@G!!e=!86-i;EKT?{mHOltzI1QPh^7G+O(k9vkmKInB3DnRq2$*9X6b{ zxFWu`k@=LKTn0-upGQMCJ>M)f0{pZi2q&L%FT; zo9s-UxL>R*!Y!8`aStF_;At<5u(8llm4>*j0vN_e*p%ekQpr7Aa55rl*#t(;s~-R- zb~3{XRp_fUP?O@kF@H@JXwhjMLQN@6QpXNr3P}A9OE`xAK|IRczQgn5HOdDMl@q0~ z9AXJ?i?b(d$zer-EmTzh*E?d7>DO1oQjTzuCoTaMB%C}i@ZAv4!B#mctWJa^G5aO= z{&}s(FgR${pB^h~9se-i&WocY47{z2!u{5a(8D(g}Mt-+hew*s@yP8Gj{$q%?8DU7q z8X(GSEkIl5>{3^1`Bs9zNnWYgS$0M3BUI!2;D%WkeV%C?^Q5o}8QDR-gue#ixulpX zX3*fntzy(uci~tgXwS!DFhV>M*;?< zH-?6#l%l_#FN4|O%!HgT-?@_gxgjQ|KKPzr!jP_r9-ZzI`OWs^RK6!p+Rc_Gq6bHi z_xpCWG~So6o_1^HY_^VmRZmLbdue5)UE2Upp94X!E`lcvJHq3mCyQXOFM<1StV1r7slzh5FG&uBFsLWq zuaFb*f%sT2zuMV-WS7^>>`OWPJt=%M2}Q4A@d7BFvy@OB@+aZl+4zOm%nXqh@Puom zg#HB(H0zsTQy`AqGR*EC|7%azZd`!d`xwuX6J*asl;G4jB_Wr;hHpuCMJ*J6*Jt>p z?*Nfe``$78)8~lUI!2y;&K*8+L)DqCjC;DrHo}`ffTs86^mHzqe+5^k;;H?GJs}*s ze8M4$N)e_CdVd%t5{XxGybQFGao>^TCShER)DOzw5(cO)kC>%a%S;IH)-{TQiTV~w z*^~)J?II}UUl2S`ssu{0W8o|f2pY^Ot&~*hZ(cBB9%BWDRDUGO*2(*)k0VV~-#rls zDgJeQbVQ^TiV$$dd&QjN0ERIxMo&2Woo?tdw84&w4l ze{tog(VAfbvbZaaH&wK;cKb|fKrqcUMDPC9{+|Cpzo`g|jx zic67HwGmoK*Cl$VT2NDV%K385k7;<_lDq4VQ*!WrGbR)N;f7Y=!;qBZ8TCUH&6|YG zHJi@LSB%h7=ya!R@GIFc>rN5G6!fmx`xyR{p*?w44$;!2o1J^<3v9Vx%g6HhiPCs7-D`(Qn@q1KVS9$ z9*4)ZxEGd0uIPUgxPMbUXMwU4{uc6X)F}R*@Oh-K9QUa!g`&8H2||LEv0^uWM1F0o zNZzU;;Xd~7q&0^UgiO9DdkKj@kyc5CV6Y`Na< zZ5LP5Cd&?0BT~s~uBB(k`*T{syAyB6w>pPJY!@~KgG>IK^y-<3Rr6mmqMXdRZIzErZ(rZZcv1VbRosV?r9jO5S<>=Ly@t$R|#sbXa z9V(uxVwczc_gwlf;-kskFoBBUe@Mi{A>ZoVH=~q&A<&FM$coN!cSSeTGFVC{_UM4s z+xJ-qEVfZi%DMY_ntX22I~>TyB^a?g&LJ($mlEzvgXXZ1Jw7C8YmZPuIC+4aqSk4A zLxg3A2FU(_AB@TG1#<0*;Zjim01}t*`^7(Youy;VhY$)zK1NY+NLDHtNV`d}4p*14sd1y7Dsv)d!UIW93xSb7|>@Lu51Q_5TLXN$Q z?%m#{oy{i?u0E2Lii+fD2%o$!T9)MIo;uV&^ROjC+*AsKRY6~sl@xM<;Gg zEQz4I#%20U(LGYnaL=}Sz+6r$7|rj1|FYH3qdhuM@Qf##+>KJ0D3PmS#S6$t`50kV zMwTv-cyRx5$SC@tOH7kLCR$l>{~4k#7*-2}h22P7^1F88FI%x7oC%GNbbKJIA0 z4Auw_pDFc-2-(P%g`a~0q;bn!zBOpybjq~^Karl(VDqwrVe6#tuoypIJ*6}0^bMg2 zc`KCT5+A(szRy%5U^H9G{kl!fa4_KP7vDD(Blu2*e-Za4|3Ov%L%F8Q`xgG%iivY> z1)I^_|5MHCQ*8ti6;BNrQkwWn-1)B}`VVR9Z=c2FFA1DR1>cLaZ3OfE``BE_)(PND zd3d4S;85iVzt5AaNj193m$L6jd*HugMC&1DH`DiE`yGVuMi|l#``6dMw^Kide0Bl- zju5#JE|8(GbF$I+%FM&&tKm1T{MOAhRC;{(?|Ttr0S$3?cndYUg3Ugf<2ZB+0Kepn z&JM5Eh>BNs8J}#*PonjKX(>gKw#hzDN~Pk3TK${4uNMGA)Ai84AM)c{ z(er&){Wn)kpOb1F`g@G8l5Zs>8v18Sd@?fdmEPPUkOECyejeJ%K~(& zrmDQuPb+M%JR5g*44uF$s&&Olb!gC|$6fus`^i9lU_sD4EE3WBU>E6733wdD`FH;k zQF$YC_avtO6?fTr3k z6f(UlQ6S+QQS_v9ojW+AO)QJC>`>wy`<3rv*JuC}CPw#RA8~tfec|<7TVk9FWH*yD zBf^!*iy<0os+Id3QPGRH>03h%6mM|h`7UTBEy6u{1klEL3Ufcqs20T4KYd}A$G4hv zbR^^sV!?{0O@i34iDPsa=`4tPr`WQC_Z8S{sJ|Z?q8PS^Iz_5Seni*tk6LV?AOjD& z;Auo94A8*185Cn{JGj(2$`y!9m}tC38`O?T7&B=a9@n`Jd%29+qMZpHsI}Z1poMGZ zfgp$gAY#535?@_`XHm#ceb8!qdM4NF4;cV>Rpj*v^<5qL%1tQ9#{-CS`VPW|8UBUs zf3fs`nzaHvnG{xTDgVSK&AWdj;kUt*Vm|gg5|3C(R1m|4d%v5fzr&HueneV4DTd2>8O`R1$N}gKi#hXZi69A zP=bnAFz%1HS!C+@+jp)E@GUs7j?^t_O?QSNVT7NqL6qGim#I2ORckS|o(6jgnI4Cj zs$$BJ1vXF@uAK!~?k0*$2tHMS$&gIf6-3T}C6~zjdTIHtGhz2sUD~r>Qu+FO#s+_x zg{3~U0YM=N-o7hjXM7T`atppm_j$!1|MmtC-6y-M63HNJOv=DV$xyywgxxy%NBp^D zoZ$5BReIOb^b6(rrzDcuDcoRA@G<33W@YBDaeTUYjo2-g#4@5`+N!Kj-+lSGfWXUN z$@m8TQy+-of}^nlY_Ar?(wTMbv+%nS&JVHoMf`r+aZ_8CBtW?u&dmb_b9Qt4!=t}y z;bz#=>RNur4gVjyqu&ix9sW-Yr?n9?>6_#9P&I;?`?qZQk16keZ^#FV_nrT%AEODm zb3y;FhR*-s>ofLVjv@jXg$FPU@u%r1K@5S-;kySNo9u3R&&P4usK4FCtEG_W7>*Jm``^Fu)y?NSx@JVAjB@^&*-ZOT? zt^xGSHosAgUMvoQ6&@;jPARM<*-hCp4%H(#v}e?n$i73458-XV^tTE6-{wn{n=H6* z^_rr8G+LXcf`*D(IM|q2Q7ixXdWz6!N1njoGmzQ-p>GyxYbv!a%)QqWd?O zg5(aOlb;GTwjeuldJc9GxR)oHtPambX;d%YS@dFUm1FaP&qMl=Nzn*nB!Abo4u>TM z@w+;#L*(g5wR2zl$wHPwFbZGZ%%^M|nS<676SGD;s@@FM__Epr-E;2QSDyPsK$%$% zxW|b>{3IwS1aiTQd})mE6pB7SigT#)3d{a%-k`2B<=V9XHJi=Kp5DZkBk0s!z4JAk zg)tl8tB_@%06zvr@HX0EA?AFrNV`5d%3%S_t(pn~&$A0PMgZ+hzPsIKHT$n9bVt z_jK!Bui5SxN+CXS7d@da>%nJbYzyn#aD*GAkkEwn3m2nn+cbm=jPZ~+%0*@9%IE?` zZ-<36QXjp9$g=i?s6$eK!l_UN>5ko%Y&4V_MgVr`tzpohmZwRPfvc>{70Nnm#2-9C z8dun8m*_p-4rHufy9rdYaE}ftVa1>O8$UiStb&3?N=<66#_jpUeimZ1_51+}%FPf3 zy=U7yJ4%6Q9FC22d%aB>vrIWK#Hgxy7Jh$D6`{g(tL8K*ro_E?@Z!iPCVf#CA0LgR zTclsb(|n}nM$54gdjHCu4=P-8#=|Y+uI<~vw6JgCrrRj8puAwGY&>8?cLbl!^jFnp zk1L^;D?2OpONKVz;O}bKiLJ;HL$t|eh(MA?q2QItC*yo!Ym;vrZ{2{{rP~Hrn*xtp z7c=;E;Bt{|J+N5`n`P{8L~_as+n!=6SV5ml^pL#>n99IeIY=X!Z8aIHR&JeC zig37(EU1qG&V0 zuuBI{pxI&Evw_Dh>salq-l?A(^35~%pxUV%Z228%HVFVQz48>p8i~R*^z6Y+hOD~{ z%Q<+Dscq?wXPJgS;bhxc zyD}Br-2)gqne5bussvx_Cc>H!4~LiG=i@$Cr{rnfCvA11mXo_{zLJzQ6)8?$k1j-R zig!eQ62zg?Nb83M=i;Xg^jJNli3|9;GX^WP;ECdwnL!3-LZUtQ2iNG*f`WHabfzGI z1qXBB?!%0A*zo5IqSa5hDcPs5CJ9)W9VYSJmOrm~8LJFccmsWYmp^k^!RR?bY+8=g zxW+f+^sU2p2O~}Hyay0Um0@YsrO}L z(Vm(J5hbqO3`^Vr7o4)(0RV8vpQe4}#(IFs==W>6(DO9IAAlsE7)?U$QX93e_~jIV zfqB7tX#Kxi57=K%0AQmx003g-){dt{II17km0p=|0KY$qsa-K?%QpL`_25CTzM7-} zC{uR$dQE5V4B)|b0RUj;ZL~k8Ds1a!07_92tmGZHoVQ6P#xzAsgRX#o)yKE=X5Mjh zF=rstPd-862_{r5k4ai9fl(SRK#RkK`}eLM2?#77`Yc33xEGuuP)AQXvvJu8pJ%2~ z3c}AHh#%SI;+~7;H4C-D42W-9KcjD~#I*G#MfOrUw9a90cEUPV@sS zP@OFAw9cvS3KrKWchu5wWaOB*O#rTll2SiGh#-VkrV8gh10=+?hZ%nTrlef1xU?j63NqD&lds_7bh|3Ke*8V z!z>v>1^^YliYojQAndBQVLW__?m2W24rrsYq*{3c^mQr%!~AlSGklh}9>*yr%RzaI zDMY-?YGP=zMgHTp6H=>Oq8CZJVhXi8f(;zSO7VF>7E!8l2Du$Ue|U@A%vrJomf&Hoy6Y94j~YXT z>A_SuIyg;L`)2%btMJ4tI>;9rV_yyl7fV)$U;Nrp3HIq)T$&8-XzwVi)5=6PbwX6x zi}mA@Y}Re{QMEti!~laVE70}*E;fw##?b-GMe}-Du6Gg`7%zi@0mfeVa^9@+}zNp_?+wOu{7OZ~QCT~-s zHD90V?d=km-MR}!7(FnjYDU?06R_5lIKCTrj35nL?9} z3Pr-KxrG<<0C1Kpp#{C@rWcJZV6$^!OLh&@`A=55h_Mrp#Jugt+t%U&J+KakNE~KD zFcjARSj)-Z%u`Fd*8doqaa>3FJ=|3ZZrF4>v*z`O2pVGyZXmOW?@>cG?j!p07>Y|| zj^`5bKZ#<5Sepu4#&B65s;#^Z?I55$Y^Bnt^+z#DAW6i70z z2uy7Cf#_gWXJk__KOfK^Um-yE+?MTRL_ayI;@}5^3HwPPWs2x>tuQV5sL53`BI$QN zjP;UY9&{(eB3LH)$_DVksWyeSy7bN&3Q-{-nb}dC$R^Z>jF*=vsSl7M#T%7f@fr(T z!IYyXVi!=m$82AwKveS*=niSxwSV{SN^$F){iIpoE>}-&77dW@`Lqi4LznG+(Q+W~ zuIQ1}CzFmsV9xC)O{wJAkvimL-J7q!!M0|k+q}u@I?nQYK^xhR+VEX&%UW31;dB0Z ziKXLE*j0|Kg!*W1DWu-Y!S*ZJ)~QpCqTed(s};4NNZbJQETM?S$if@cs?t4)z0)gV z3F-AGRK?LUIP{FgA03*0h6{JVX(uxMOI`di4=c-o{+Ia!k?`#@nI`MO{^m6d>JB1bT~?ud%t=`QEwu zN!p87jf$omm8324(3J=fDqnJ7uDXq*j?bKKzTCxMR9&lk$2@T^re2>+qOZeh$4YQG&aGcx;Az*{m-U~;qTihxOw%RY zD;SlLo}`}Bd_9<-yPI4jUFu0VVK!Q3f)qucj0Edt(VUr~t_4q~C9WM!hS(dOR%VtdipYc?MrN!{fm3m}p zdKg@zXXDIqUIG?H5FXfD-5$yi^o@?4!{@?U+xq9Wh2sm;{?(fSG`$~8w%;C;{0%c5 z#4CSIdGZGsRTiy3RBSZ_l%PsA0&88CS$ks`O5o4la|AM;dN@dRUpL1BW|Q?)o*T)HTJ0Gw^TX#NZ*D&d zTFMP@SCxp*vu5ZS>j92@!`4cLmU?G*an!&QIq6n4Ll1-GNN?4pVM@S@%YAT?AF zy~?uQ_Sg8VE;NTIaNDoquOa#4T?!bJc{1LR?l(KQ)QhP=JMoXN+@fs{Vh0dF(74Yz zIIkrD_-%u6`OhsVC7Gz(aQ5-QDCm6)u#peh3Wg%4fjQS+e4z0gIwlYGVJqJdfVaQTRTw9A(?mUV*o9 z0M%h((;4b}y1moaH`&c00@r!R60~?e&cfzcZgM7>3=9xU4gBk;HfGnT;#_6&iiW-i zCb|3I8ySyS3Y%5}o~&*=+Zh=Jd9i!9SU@u<6tfM}_P{OF-lj?9@Afd#J?k`C>63ib zm?|+KO6wC9ugki&W$(d#H8CK}WB)95lMS`!CHyf^sLhK`fK^-nR<*5ysf` ze7tl)CgjFg?~@|YNXmIuB8ZoMXUV^?pNyfkAg+wDDuJQo zBMYaFBacN&mR5E6Rhn}l!SU1)|3I9YD(l6KEgaAz%p#i0}g%Hy46|KhDmi9G?R} z%vloDDF6UuPrh}LjQEo(!wL=0n`tR+b_YXOMnwvkzc)5MAQiz1m!r%uo{2y=upJja z003rSE2lna`!-K~I@;n8a(zh+?{L#RuS2Btic@r-><7_V!t}4;O4$nIHl?kT{)Q3@ zO@KBE2_~ej*DmDN6@eU1x&R)0AaD9e#Irv7(u>xo>a7ScUv ze_}$yNarn`{v$^zVgO7#Cl-Jbv_|q?F$Y8jV&YH6h63}rT$})*^e?yt5&yzbG%TaN z=zE{FahHZNTI7r*BC6lugG`XZ8)5H-HSfBN*KZ^&eWU4TJW;X`V=_%Rr|{T3~W6& z(bVA@EO0P&%JRB<@Es`GcXo^dY=fW&R#uC{@Cj!^X(6&^CD`{`jlsQ4QxDtsX~R0JuoJxpXgxj1L>ieyGF~ zbjSLuNLtZ>5GyO@1;QB=r{!lcq#Q9Dlrz$IsIH?GGyD)99mIxVM`kRESbr0YNC^op z2hF%Tu;IgTUIj@qE2>gNxDJs_FQy*TfEFqRom#zpenrFA^{go~ksET6qC69tr#G?2 zKaABQ6#>0nEOHleU|bmlL-|P)PqK~Izon9!m%!w|RlvY7dN5Irm3-JM1T77)rkBW_ zN|3~HKhLB$sP-H@PC|ymPy+X05(sfF-g;c5BgKE0NtVy+Xqpc`6{GE4x9=haJx-Jq( zcWm%$!ggS}tB^lWg3Kzks`M1F)3JX>G>8dDc+i8OAqZN*qpkmf$vplm8#(tDdU(u> zDE3WKa9-Dj{sdB^WkO#V?GMQ}gmNcQ*6P|CuH6ug+vF}P#%Qkc`xuW`8X`(8-0}>_ zw&#SeS{CpXWHxCB)LXd(_&IvqV0=NH_Oa>->Uhr>Ccw5P`t?^1NQ*ojMwl%QUT=um5nb*>$L8D5Z zs{_UduCTn-wN9Q-;H`7skO3jiytUhI^WrT+>?r04`OPXm6k+Dy*!?Bjy>}Uo^dlPw z7k4P5LD&x@L6ceEEY*zV9r<_sYF&MpQB;~0_wSA!9Arm*T(&xUmzUM^ycDIwGM@@Eo%1kXg{$Z%$f^89rUKxeUm;0EhcDhCc|)GnsfE%O~QKR z^^3chR-~hNclwNg?ng^r_@4Me-YJlC zRBX}9p5Hy3%~)@z2qn%6+QXKKi=nE!x0fPAs1fq85}SFCU7tz}>njz5^KUs1@N|rb z$Y)J?2&L?$`mPvbLkE4)9!WNy{mU8l<_G|*bC+9osaVGqkaG30S&=p@Yf;^ln3SkW zswd94J+Pl+rQICW2Rl|2q%I#htk-B7p;YdS;ipGPvx*hw`SiZ5yx3P^KM`yXAc~&* z*ch_&@jeS9Z{nc|uFNT$Ir-8h?Ww^$MH#mBuQlLuWv(BU-58X6qk020vE~g)f(M)K zKV~W-fPe)eZDmn0rB~I{VwaDfJTE&n-uQs0kykL4LhK7j@PvAbKIVxrQ}w^XBNV^ z3~XrPj}BXj@);|A z7vTMfkv}FlUZ*ideAp}I+FNM7`PBC|i$~IQvTe?cHL!+7=zn-j=+t1(44=}Ia#Zfe zd!yQ94mM`8Ymgu#!vdrrpTe?~mtAxnEvX=IW?*`~&QhN>YG%IHa%`ru$uu#Vac5cS zF~8d6lakYP?P(T2V0oNUmnz%T1Xf?7Wg;j1MxWQ)`ezGCIRytfJ9{dDF)dTQIfI*< zjnozML^tq6(|08ypV#`iAJ65(v5d-G{Xx0B=DXu@Rwux+0auPI*!=h`VdueRPwVN! z4h8qxV_{Ibdo!11&n3|(h+1QlHh@*9er;hYC>d1$)TuHKlk4%{%?QfO6N>c*pGi}` zLQOixXIQAsP}G`P!fkZi1o4f^;MPp%!{i{?Dl3ueYway7x`mXi@u9wu{XOuEs1T@#?6!1mb~~(drDv^ptfG@+{E&_ z4*6mvZga6+k~u!f-GpI!BVg^07P~#lrIfF5megG+wN&c*%4drM+**?H;VBSxT@p%$ z4z+5iwAl{5PcB)&5YKW(cq>@U!S#uJ&e1HmxcS zu&S5LF+t~W@Ix7P_;vz}b%5@~@M2ZW3A_5YAfUx6_X2t3PhWZeRe&a(-??*p$(C^K z4M*kPL?oReX$UfB(DM%LGy%EcAuyVFr)(&jX+x$|)_G#59Pp|-$Nc}4MZf675>y@r4vkzcp zoQ!t41uFtEPr{LE*Cdau3Gfu}gU|!P&Od5sc!us_&pfC~RJ1|@l74jyj9>TN8b}+$ zD-cWXIHG+(NDB{IW~5l4tU%W2CvjD?uz*kp{3vPYYSJ>O0y&wI!0&z^h{(0COWIJe z(W8V=Rix9_Ti`!3_?qlca= zh8_%4go<7o7jL9s$kw=xt&mEPB@Gl7szq8*yF-vC)Apz@harxkv4Y*9BC(3uNYo?? z_rND_ShwJghoUir1UC8fiRbI_enJ@J>9R_af&W;e58kEKZK(DGbx5~i2b6^k*qBxk zlfGUJ1!5Hbxb2T0n*|}liofg&ueEL`=d6RACoY^YGX#${kjKHBSRCoZ|HhusmeErL%!CI-Rpp@x<^j-libq3 zq11{IDoV1%_hWWO?t@5dxs^BcM-%s_HN789WPI(EXEeyWsbQ1aLEI_3max1F>egF` zN%j|-H#RQe>D%}zr36#Gh3a%xYD_TEk7MiTfiGwLwxB37DCK7tQn+EwRP~Zm;uV@~ z6$3i!ItG=sO=c3^(HpQuzBNcTHb%llx=Z5t^3tebd>9v9p}~$!9oVV+JHLT#xz54e$Z zuBBUJ6uHHS)1)+JnOUvXob&Ogk#9nnT#+OyQs@DAt3I*IFZ=2a{@DiB0@?G5{kl-V zm?ET8EvDcq7h=R->WeqCq{x?0vZ~#?&|_7ZA*Tk0Y0eF3n*e9@W!;|#i3z!QSN&L$ z{wq|R^Sf*zs&-HDc_0V-M1(e@Tf6GnPhnKbq64u+jc=E@fj?*!#Dct;XOTYRyPapH zG*1l zx4RI5G2!X4wtOOmzYRe4z*Yl;lq?XQjF7^(;0b3LIi%6MM{` zGvm8;0n#Ex_v_cWw75#rrr@VuFUtJ*gpq@OE8ET_derv;I6OtN$!-;{q=g}ztyt{~ zJ~rA}#HP2+8l;sMw>MUH7IOY0CG=&glHdlm%#5pbirAu-s zgU{Chw*)!B;phbjb&LE%Z_!`E?(UlVXliC?Zqb=WV{WokBPMjTen0&5VZ1FVsU3A{ zBR|^Go2wMYg}SvG_Z1!i41UOi_?IPi<~ufQoRa`CPkzx~n4CzcZS=9FV}T%@aCO=p zmy>!paoW}E*#wVBqEPGbXL?>(yPvzlM4)*fS7HH=&Nx}Mc98oSHaX04+AZN;RWi$c zo$lE;g`9%zd zt+-Hit>qpRG-%$j=dg{9Yu`p1-c!4-PCb>l@9JCOddCYDzF6L|1L1N_KJ&`?v@yY0 z{*K74W*&@So(-ccFUt2>;SE-ik%nDf)4J@4(Sapwa!ndM#1?rRapam51slu~qxM3F zce;M7$p7-&FcUkbQE-5=OuCO4^|JdW2>n)d-h+tCcz+fU7kSxiT# z;FZDNMTGi@fP}6N5G=l}XrJu)=X;LKVfUVj%6H~!#wD27N``c)A)R;x1U+wpeyRd* zOT7ZwC@2q)l7C^&&Vk0jiHbx=7q5C$)W`pX5Gv-}HKPST_&-B-S`@ps!^ z21Y(xWmXv56V6Lu5d`IM0sKruX{EsPtjR^DbehX#O&PTb{AN>>%6xs`@F4G`p|}B; z9p=?fUk64Y3$Gw5j1ZL9CI%|8dcOoXcdx)82je?0CTVUvTPG{rF8rqnSYVnVUfyG- zySb*U7Q)HsGK)JFnmte=G6%+I-3zu@&NeXL;?Y7#?JicPNwj|AmlS+(%x8&7gNY97 z*Fd6(Bcwu@XJHm0h@S3^Z3|tpHiZ{2W*QwW3%Vg*1IqEVB7i@!T;lvM(IsWmCr@3$e#kt8>zknkx{JOq_0tb3di? zMIy-=InN!gZ97r|C0D8#0;+>qGWuz%CZP-Iu;J6kp&52~5@9Y_CHgZ1brp46{+I^c zhPjF(&YBs9yJ$*d&Cynfm;n~wn1VyENrX~p;#2osVisGscWYV4y4IQNPKor|I> zXZm|z`0kdxZi)>2XRMzGYR!8C^)P}zvnXt&6HVTGLLg1{U;j_x$EGKyS2{D|fC%t= z60~9J_uo8l%6mZ!$s>@d4zUmU5fuky!1te-?!10dr>wH5P*FxGxU-E}a>My_8-y%h zr2`!d1EEAExOE_KE1fKU%c^OgFYS}YBaYd_VE{4NLpwp{Frr8U-zens;L|(#0Q(wj zR5#krhTj2?vVmkukYTXx-xH2}W(9K1WxS)ul#gZMzu9MpGPSTY_zmf_n$+%^QcAKp zqXz;eyi{adsa#(FPQJr!p%ogDeb%~ZLw?NZA_BSAP%{LncnlQ=Jg$TvYc@Ep_1}`Y zXyi>HFmfXJJRjf;bu=%Tk_00)**4Ypw{G^mow5-lCFWXx*8KF(Ob8h+mCPKb->D|+ zAgkstjAqjF5)Y+iOrszR=;&Ig_w*vGZ9^K;4tCtORam$AOGm9gk~{n5$L!?e|CN>j z>R9n>%QWFJu}unlY~b%c_f_(m5zgt)ZJQL@$su)B9S)Ii@HZ~&paMumKYs#KanMBG zhdFE*xip^bjRAZosc~&v^ou`I^nso+4w>7!^%B<=3eFYG=X@jIzzzzi-SuHQ2)jL7 zOhE-srW2 zkuHZ3?8D1gO~e`{6XfO|$$W_&>$IjDQHaifeH78@e_oWSUU?b+0v7>o<|byVlW64o zPe}rz*KLYmEqjYiKGt{sLgtnuR{sA{kgF@C7gCAoRU&mk4pYHGZQCRXy<1r2k>d^{ z+*mBjBIwk^Rt;n6Iw2^oFl3FWhvjZO!5uvvN(v3 z=H1}%k-4`!YdEp@_W6S(TorcO0<>y;VRzcOv54X!ZWd;-+R{X-a}GO`?Go6cVmiOulv}vdfJ7k^gT_zl{xi@3}JIOkcD;(9orI-kj^juV7?boW&T65$>Pui54|> z>$*0)a#Y3hB{S3)YajL45qUzK6BJ)cogV1kOanwR$yIyd!-F>3f*tCA`O;dGmV5R3 zBMkL*w4+~|^tPfuo!cN8Y4kV{26x2f7m>h}PFaUqv{-3t4# znMGPvV7r(KnrFbk%REx@6ttrIb7WioL|^3Ps$WT8?zkIA)iddc{8RfM>fR=`r<7%k zJnsJU00F=4okj*eVl9^vsskelsJb#_jp~EQ9;eEDxlLPbyOy4lk^W^8qBh_3T4SB; zgl;o9U&Ztki3AdHwa6dmR zSvQ@sC{7P#Z@@AUjmg?`cZnzfmWCM5F!dZ(wXrA%_w?2)$^DF2gewEf|N$N&Cu`v*flNQpxUVwisKOIG^Lb~41Bc;{$dL_&vvF0b#;+9+|-vb9D!a65;vV^lE7Zbspyvhcw3EO@?q~?8J=m` zvx7u46~3et8X(h4a&8bWf(}L_VY+Yt3vd+*UO0sRQ>$hV#gple1FWK`8@^X{=~G7+E`o&+FX*`I^^qZWb7DzhM7iplqj zeO5+vZeJD$5rL)Y=GM442b9JZ3ojk}GHSzrHa7b@`G_EGMPktx2P_wpzU~Otql;Qp zc=Q>8U-j|AVtnukMCu_;O(eJ5sRk^!b`3j{2Q86^pi~D%r*SDsrQ!GUM?47ph{uK{ zWk@D?whj>E5i z?CF_#p+M4r$oQg2t2+@21PxFPJyv&L3r&h9bBhFK4GO?&%xn@PT>2|qF0F zQ+~?{yhWOQrqE)kw(An?Xdf@7B#V$fatPkE`(Pwhs!-`i;;(qx+G=4IIMsG zM9Z4BS||rVbNmZS85}-A&JRISimDMQ9zW!58TvPB8==z`Fm&g4)P6tYqanlrL(YZC zz8XG>9>Ck4O}X*>etu_6N*9udJ+_tO{*a|tI<+8u!u*0AQ3bzsPzv}Bic6OOgp^^ zY>84p&0WcPH!X^abBr_UH52(;9#Lggi+BaZ#Thwqq24IT=^h`3kEVtS1c4XB>;~rf zbgqvl18l9?>uzo_my^Bm=c=}}zH~exa{%k*nJY>;lg$5L$gn+SFl`^Np{Aow@ECAz zybOt=X0rmA3<(19?8bE9ME^#BuPDQJ8 zw|t5kJIt>{SzkTmeUVc5Z{v#@dhcNo80W>@m1TO;5<3eUma$e(#9^zYC)@+1LS<=- z*xoz>VpSmB*E_)k#~E_Tt4tQQg*RC+TD|eE9OpVk3?Lvn|7}pupg^IdA?vBdCUjD+ zV`2sRGnT`#YNd-pV#zow>M3$xqK;g&67;?uj7oAc1~ySHfE3n&?OoODTCY0oZD%F5 z7@`MPp}+XlPONijT1p8O@1FkX$=qu-_2F|#C2Cvnn=#ei;qMpzwCp=e|Ni}DoR$Fz zZ+I)Y-yUWFDmKjsV=xI!-V?x7wFFx&Fc>MF*62goRKNq_G$M!j$8wP_{HZJ0?N5?^5 zsM7qowfE>HcXbG054$75wfr9dN3zMd5*Ig}^mzeXRJU!C9*P~J*<4xk2WPe~;#hV1 zS2vT;BUxR{$sF*=pueekX3Mndpxuka zU&TiAM(U=ahEWYzD`68}bxOO4yrN7dF5{lMbwvJpC5a64NF&|VA=v3bHDGW}DSamG zhFFOKd%br1pVG*$3p<9%b9~@iWD566*du$dgG}@L9)4OJCkzhZU_sy=Hd82*M*NDF z-V}`!!geERHUH8^f3KNb>pu%+MXb_$1+Sa(S4yW98ova&NUtNjPLmtCWX@UlZsaQp zR6J%HF;OhnQzJ31Ptov+G)*P@xO8PkRPN9=uBYL{{V!ddZ0H%YWcE2OshCeZnbSWn z5njQ2qKliwIzK<`1Bc^p?rmPiD~FNyrt!)feT^o9j${O8;o$Y<)zi6;v;xM^Ea(k( z<^h)2;@4*pq^V5M!_@;EM(FDy0 z4>z9Y0v@eOur}ZY695@EiLgEnC4x%t2ixprQ#d5$kSNsQ%ZKb)E zK4=g(LoP2xA{$~tG++fEOSWH$?PGBywwVqHTQ>EzIPj&n`+C>XX)Q3#QsO<1C> zBLXi2Zw z)|{yB&|(xYj$2CD9avnnNd`32RA%s(@l0p%?8CYFiT;A7pNuLe{*_+lwgHM4MJZOA zESVQkr)2dzq)0Qj%y`%0x}p-zcFnA&``lJ{k{xymd`QxT81cx{Kh zfWxW3e_RzXw8N}=PD z8DrB<5F!q*hrZjYakcu`*`f;5*hdmA5{;}4t)*)3y*2`31vEFKNqy2&7>O&FMC&Na z^Pa7QOKQuaC2_D+#H$qYf+#PA#6oV3Z@Zc2_;N%1n%TVjmO?Y;h6`Zo`mhWd!M46` zUIkYxvT-DWwv$eutmH_Ks3`g^WY9&j0uU7uq~$Qz*MJoK@`73huACw=9GP?u)vT+i z%DhNw?(Q)86B;K((W5_N%h_(`mVJv1WKSeH zAZ?(HM$T^x4)+9~*)G1=G=j$EKn(ItcEc=vsz%4^;X^bxv9M+)w9-#g+``iau+Dy* zVuTy?q&SYB$V`$2##;{+;OuBgI!b>FhpS+WzwRp&m_<@94ZU!D3k%z~!})Ap%fU$G%CIxyAD-su%0m z=R5!j&{;2X<5>L`s`IwfOIz)+T-BX;S2W?+1gMy_?+;0R?{%p(oapZPZAD)qwv=r8 zd(sFbRV&Rf*9H!oC(xT_V5(}~&W1<*@ze1@BN20BeHXiF}ACJU;|c-sBGHV5Y~v8-GO!b zuGZAS@N$s!)&Pxrxe!%!N_5E=BgaHypPMvicR&9QfmqFA+N%5?aOpG`H-^}r%L;r9 zakB=|>DSmILy)NfA$}4X0H7r=6&LkbHCM?@tPHFs6;%e|3?1LwFD76yeJ+inn);iI(@m+pekmUz;eyk$)Rzu2Y-%Hmjhm`BL}`*u-{o~mG-Ivbz4*%y#W^S6 zK;%4-)4!!UTI`zb&WAVM#+W^ zkIOI6k!sy`7q`_mO^31bd+q+hchC>5uF?7UuZFuHHM8}DYq?v?hIyw9@0E@kSqcYO z(U;`VLLks;KPIv*i%HNzkPoy(pIchUy~`=Mk<`>OA#;~n^GiWU$7#@1DUh;_E2AIY z3Y#@*6px!yF0G}=K&tmaLXC)fr$Ep4!j|4HTN6KYdRE{3{e5#=ftt~e5D^9JP3^gr z&Xf|{gtX&sJx@T9oXowtxbR4q{~8%s>4FB$7Zv4$0VOW@k^|Go!G%NPXqmv13pAmVwt5AZlM#ixPJyIAoFXY%EzGFk2SFm$X z;3gAJtlLsAN$=Yg}%Z z9tpuM*XoQr0A&xismeH$FxsP&U4}sWXNNi$2Vm^q<^NWclhHF3a)RIk{OORwV+Id$ z!MWy=Ny%B$;u=(GbElB?{-};HuGFYiCReSTcVAw8DEP(dCgM86p(fs-YY$4Yy`8$W z?!wfO{a`^NpG`#WlR$?cjr%s>@U{CWubbj>9rgwLw%d0T5!j zR)IvI#R=`KTqOkEgAO=v#onh2wqIMr+8~5>uPZ&7hgglEw1vzP4)zs{C5nweLKem& zdrX5?`v~R(;X2ru=Fc2AwKOBVfKBr=XT%wT)F^i#pcSI%pl;NA1nr7Wcr|$u;~|vJ zR(tE`=-y8%kq$p41Xc`=w2m+XT2eE8P@OS+3vF;R*!3@@yfD}_&3N@ImAzI-{Y*Mm zecvrq+o%Zo`MFs+0srS5A5YeyKCH9MXTmt}taJ)W%t1*{(xsiJXep>k;Tyw>WwHK~ z!J~c|Gzv|>`1V4hSZ%V3T+|B3P5E-s6*{s_Wjqob;+TSFS}q$f*qW3-NW&o@x4>!wi@I|Te9eqQEtqn4B7^YRmvf1DlfH^ziv$vMvmOP%kb#32Rqs~`CRP( zCXdfB9ueMOX4^~)bM(w#F@{}DPOnRzchRS4oy)B4#s!@T*Bb_OBi}ch>oi@r4DP|K z{j2y&;}mJ?6PoNw;{K3iTdrIV`{zN!9xAn>kEl zx}RvQb}*s*@X;L=KjB=#ibHXUPRsQjo@5jm%q+cmky;%DcigzgnFs>iFJhb->uwU1 zg;v?W5<>bkbvjnsxEs(C@VF;VlvaliZI?ys2W&`0Nvu-B&}#H;*DXuzqy6C~%*cB0 z#Ii;N-^dm?4~<-zCo>*aOdZtiCuctfV}l;309DDBVY(c4R;Am7*M zbB3f&$E=^O*~Dx7DhU5%Zu8jlEgnqo%gvRCc`(N)*5p9&sCL9Rq2TpKv(Ovy!|-dUoC(`bbeWhotwn3d&U6i?IWwWTCo{5 z=v3D@HVOy*HGM%DnUp5grQg+E42y`M&Mlko_>NSa^KEFbC%c&ZCVJ*J4rb(_(7o_# zaW|A*LL3c%6YDe|lr3Jzch8^jghdt4A{Z=;Gsg64Rtd+U|6v8e%I<=s+ed7A<-O&8 zWoW5v59{;Qlm+!QDwNc{3+|i4d8a3@wZ;LC|A3>Lh`j1#trAinGb*HVT|`e*9_biy9W`ZJ|obukxdABLc#6|*-dJSuXBA3psxgn)P z!gVRM;c}71ev$of(=P%6Fl*PJ6Etmx)nA?F%scZA*%3B7v|eQeI*(S|D1k!bKo*5Qyv9Tp6C4* zo*A>uF%en962dYFrfH7Fv*Pisy=8YVxYSS!y!>*z>E05ydWIoa4!aW$4SeN93~-^5 zIYg;}_{t?OtN&lV`qd&?C-Y?6hM>1ww>khDL>g8$EcvY2FJ?H7cSMAhZ)B~dOnpZw z*-}J%uKw*cMtVXK>K^6bZMqKDNn!NsrI;|(Fe1hvMLwb_=WAOmxW-}Jt{>rWkRKFj z>DHiZ7IvTJA4&FJKlO89sJ6w{JQDa;5jyBYS= zx7vlEZCPxbqSuxDxR|iZv*VvVTcMl7&2TZZJSov#krxu;!g^pfH?&n zBus-IW}MeA2>HsJ<*Mz6IVVoC0VDb3>*<#`wC26wygf&{=~(y}5_h4fYYHA;6XeCR zg^M>ln@)*R#!`w3G%~KI56D3dRuwTlyzwGl@z=B5YQq^NZB z24hLxN6^w;F~>csm4P9uwadXBX7&A2HsBjAw!h3Q*<$x`WDqCpZwdu)dm0j%DU;g& z6NR@7e<5@2(>kzoto?o_q0NxqIxEl`rZL+-ME8bok+-7_whcqy4$wGK(TBD3+BSJ8 z3)+LvwGE7S?3&#cTs)1S7j_|!68{cH3T#Fk6BG?}>QqcUAp+2AjfRw7q1C}8hk+qL z5fYEt&=7d^p2B1^PRh4s-tF?MYVpGWp~G4X914pj)GgwN zFbFBbPiMn`i*F;mCV0Ws#3bk<5Z7vF!Y8upFS$bwQt+jEobcTkCsJCkY{`}b`oGPN zPQPqisw?yWHi*zV6XXG39YgcE686P|43Z2e%qFs0sSo+Aq~k`GxRn-Hv2D&w`W9Gx zo8G}?K9gr`fIEfe`yW}sDean6W&#BOgDvRj1t1~qVBLw`c;fyA<|u__11 zo-LtP_M0mpf5y>*gJ^3+I;*DOdKzTT{6v5>y`VoQ@vSKFc4c`tLnG7<~L^ z_W1+RAnq9ogBtxdH_VwIA@PVSJ^YH+25gj%7*g=m?FG_*Cyu zD&h9#(q*a$6=ufQL<}_|{tRl=v&h}wn%HZ34YYS+B4I3T*g!D&!*R&hWJVmanq)I9 z$%?!9M}Ez?=0;oW#-skjc-i8f2ifi4E9l}Zy?z#;{reyk0b8{7 z*g1m>$HSussBOWUVjhIHHKCvZW`3=1^CnHa4lI6kqqi`fw28vihzw|e+;8iS{hb*; zuc&2)QKPTW36#S|!Nbu&1TQDi`Pe7R=?E#GpOLW?2G&|c!xE0EPE7>#K&7BLMhC`D zss6P6!FP_j4NL@Ng;Lv*gv5a>rM3-bRgqhcH+~dnoAK0puq4NJ)+uuyrSGA%o|-Fk zy;3Z5Pr8mgtA~o=`*|*cYL2n3=K#(tK_&k(TiXPo!&3_^_%QIJEfjp5-dp#qMFs8EHotYXJ1p)>Ch zSPhU)v0xMk0WbvN@qVdI9s|$voS2^BTsS1k*dOgD4f*2O_C$I4G17tU8`ptai0QFO)4X2UAORKirn&GB zzD=nK)>-DU%og)s0c@4XQXFzZ?e)rw0Uq%HqTNf?)?o-xRLryoD>WPFYhGEgRng=l zdy~9T&D9m2+Iwx{Vx>i2%%WW*HV^0HwLf~){eyUn;RXjrq0C0F`upHDr?7ep4@fhu ztZ%O_-Q#)hkN2|t_7AnGeAF)XcEj@_*hn!g1c|_C#=sJkZ_Fhe zz@RUS)Pc7HZSgW#k!=S8z_@0BpC9ksD*tX@DOFpz}wJIM7VLI<6|o>dSz z!(1azfPr<|^mt27u_v7F@}!QujX1D+NMMbBHuESZhCf7bG*!F{ISV2hWc>EIPn}A3F_E1# zYxt}d?0r>zR1N@eLzU1PG-&rvB}(9)ZII0*6X~EV#SJI=2&uW?1hWD`ze~Ak2R+$X zi8#llElj4@_CfdNCi~Qt5vn_jT4FxwsUCI!VEch2e=b^8t)@_A=jeAo;(Uw?j%dDe#CWR440< zsorr>)55nHG0T{CICKVvc9;E(d(F!1fOc#F7euSaWn02hi%h2t%Of*mCcCD0G#qk%>nZQo?uR zR;D2R#MI6~U2yU)t02!!Y9y}s?Yr1qiA%BBJSHR(TNUwRwlWwS(@0SJ%CVVzj}o)_ zgA^S#;6Co-cqmHOiC8-zq{jQ34_3kzvp~+dfsbQP z2|Sf;&dw0O@eRq+L(NjSE$s+oq38Xr(rJ?Nz*icdt>cR#aMEu5!6l`f^Lx?m>M|HA zskrBUw&{RXDE^b+1-nk;`G3UUy3*;zi|%hsWb&d0^N@K*PT^;#(@KZ zzBge^HvxHQxzbVPM~txM2|3Z$w?vgc6x=J$4_rE^=mzyq0$^>YW8NXSXq~NS5y| zH++H;*L!RbV&J5ZC9$DSqW>(`{*p(9i+DI9L%9w&@6bI+#jB|N_@S{lg^|-P+3--Y zeFd>OFR4#)RGqkHFWKJ=DFeEYSzNT1){5`r0?F`Ke;fr(bNXz`07X< zrP@d3!2JHi38vMnM+cjk3+Dy*oEKPksfd>Hg4@rDucvsj4SLKjlT(48_?o(Dhsa*5 zxnh~B^|>?i-$P#L){NiEF(&{rHshQuWsClq~p| zHW16ybQV&(HJrm=E?~#C7%Rug%Jo3q{U7__xT5Cy$8&q}UinBI85FMBdmrv!Zl+A` z`K)%#ssE+zSrf@EQ1cFuMzOO|6Wr%JZo-fGawog_7y%~FB0L6zNK+77#);BDa1Us9 zkc^l1%%xM*-HJc8i#(2%QJ~ zXBe^HQS@0`K)^PFmb441H*xb&`Os|6%XcEg?)K^NuTtbroCuC&I~jwQ52}dhf)!~% z(e}hRKh#5^3%bVKG7B+f0K_BXIVC(1N`%}&Kjh@@R=yTXbgOi2kmPQhqzlpnQwS^EwLXJ{{`|rTeq?&MW1WjHZe-2p-75 zgk2MKTsTq^s18Jk!_{4gR}U5#Cp9SJeUo8q+i57eNMymFbiMvK&U6vdI4IZ7!|rYI>uHAsL%YEJfOZxf))P3le1u#ar) zl2>R6hv*5iwg6n$0q;_V#`gEcHsD!VcFwQic{6o%uo~) zhVHNZ@E{`GXjwXFi4ma3y**Gi6m;npn`;g&>@(3s8Bj0+XMb6kz&}=Q)d42}olNCC zo-0817bl01!0tI~NeyKc_{Ym>k(BMP`FF-qJ_1Ho1T=n5r&jvPpiNnt*u84l)MylKexgl3h62#qUSSDMjmSA zp*#r4j`!lPcH5KOpKwx-v=Ao3!!d9N4N`O2jG0t^w;reht&Q0}S=1|$_CF+Q3x^a; zUoc>036w^yTF@!fH$S&8O}e23Mq`jkUpRZ>Q~*IRe?a63`pgi^t7PLKB1m8W2yBo^ z%%hX~wP^R;Ru&ZB<5a9&pzb-EYG-#km|#cg;j+yR?pEo}?O$z7{K8P@Dbny2`-Co= zIEDTQx9Y+G+GRUStkk(61KhDAJ$qe3dCXolP0;QnL^aaXY5=VVw2Rul>#tRyC-drR z-q@%r+S4eacs|=dtV<0H{~n6+U8t2i3{ZvsFPY|E?&3`SetK=x?1PHcV1qc%-o`^h zN(D#Lh-Ew2V)`x7Ee1%P8?D@tO!lVNuo2wnv^$Djr)8pD@vTM zADP9FM?H@7F*Nzs6XFWdU7HbIiIqRtst^xsFz7GkL`S=FKxMtp(ae9J4U6(vzUb2G za^pbAMr$-Z24Nw@e*n3ySNNz~i z)N&-5Ii38l8JXBenOd&a7A()Q;YJP4Vu`N^*c5Og$tf;V ztBv^{1I*w2VW&gE7;VZ$T=vtdAejEKi(3oS92c~cy2nyrf|H%hUk4gu2sYO6eybf5 zRWp&t`r5JIJ|~$xF^Or;&N*5lJ?jT^)tC3~e}~>ZN!NDkpEhA!<1UZ#pamb;k<&FF zz42=WnXwh&uhK z9mZ&k0y3n4@2xWK`m<%!Y_G+56Orh`t%rs?o#3P23c96@qu-=vf?*#pfg_Iq&l-+efpROSm)tX|%ffN8pv z^Aif)a%$yN#tFD$@_rcZuA(k^0vu>HnH*5pkKh%Nw+CLh1RBo%ukU;@e;L5#dKK*4 zTc%(~Pwt+%x%-YrP9X=9th6%i*79NxTlL7eMOOk?u|OQH5Z74WaW+o-10dUeW-T8! zGjn9-D*q7&uy`foJKO6%=Z)HxW z`ZeFcq=kvlV|OlF2z!2Ho2S2I))zPAGt_W=W13!fyvQYhy4ks#&F=Z_(Ac^cz#KP& zR@ws9f#6vI*ua71H?+>Ib-5)QMl}t}rEsbGJBD4KKWrPw$B@6lN`}k}wVLMNb70z4 z0^cXkOo#o*PN&NHz7XT4-9a6Ux)h??sTD;nr50M;>$4o@E$H%XbiZ9&74hR)xL-nQ zZPqtqmoWWN;rFTK^?ZJ@_f5nM7d*FyXr41|$2$T52_F@flW+W;qWn{)W@)hf5e~8B z2_r~?32OkA=CASvgBTUVMTnqq#)~D_ejLp1rs#%tS;B#|V)SlU2rlNQ0;E+DGgNkI zwL&7S4-h1Wx_Kyac5fpIEk*Gj!bYCB0}>mG4Gi+~Fp|~U1?uu*JyRr8#2={Y_4kpV zoLYW13p){&q)q8+b8Ti2s9*ZGU#`RRGYjjdj12_@+Ic}IYEg#ArA`e8#i)#EFpGkJ zu?NmuWp<{uwLBfK`W#s-dhO}rHgx^z3Gtf+-Xy2hRKrexYGtEs<6DW;{Vp&>@AxgQ zw!6Bz-(PxKgs`M4ahD>$x++Q8B5UBM#3{iy6Ea6YsEd`!w$D`_Rj->R#+%3DOfabB z!tW+>{3G@|@R4z6B9>-lu`&{Naz(vf(jkim6U-V5NsLPBaqFYy%?hWI&s)3|9aA3X z#(SzP0--D%HAbXJ7yBVB1HgRk)p}tCn`Ya3oa1N>l8&Ylz<7v_DCk=MWJ%=-5?7C! z6oUj9*wv+9CuW<|IR2mf;*43BSblG%hVOuo#?~adnqXrv(onI!N|3!NCufU? z9uI4!QoaqOgm(`M;g1X?;{tOJvSyqRK~DdL_98 zL8xUYXg~8qa~}tK*UX^Ys*Fi($;9-7~2v&OOMBhu>pE~ zk~>Wcts4WaX32C536D76wU_LMOaiWFJ@b1~Pr+}YBN?6#9KP5y-x$9;hfdzr+BaNx zy3|Fz=`*^;aSW z)p{?T|GM)YVy}Q!Kmh9G^thKbD81Q|;sVVg%9U0W*ZritxIMCr+{UcActk0OHkgfQs40b?%Sa?^d{6q3Bg4*h>vMF?hA}{0cX@#kk%c*~eBJpvGx<+0=Ik!! zMR6fSk#ft-a&xpQGmA5>MzT9P6KTPEyW~1w7k@Ihofa;`>RR&RTLCz)QxR?NYKOaYfL zuX30*y@J8FV7C3phtL~Ik(QjY79>6hqzj}WE(4pFQ8+3=)g;rJKgzDi{X=jy5&8|> zC*x*sBE-`4R|~6@5K(s~8^JRFbTG!>58>m4rrIH`&|8e5f9)^Dix@tp z{5Zchsx(}jG=M~|cR?5(xc)d??0>{HoQ}GMH|G7Qnhds=W`hWVqZ#G$@bdHD9ZU1$ zdf}Q$lWX={NimDY9%Mw?{cqff3p!t>8kpv|K`lvFkf;f0pX8Pvs!6~Y3P$k~ov0Cj zSRG5OWeF<#FKD6>mU+k9V18TWVzg(anVt(Hbt~Q!_EI5!AMp13>eo);W4UwuI5n|C zcpWL_Nvw=SL~gJw-S#qpe-zYdC3q&0en;gYe*!k&fHW!!W9Tb09>yi##^s?XOyAK1 zrQ75vXW8{~B-ib8((ODxbtD8Cs3i6L?B6m$z#w&DEl6QH|3RCJ)sT2Wa7M#o{ zztx9GZX8P@kZj0B{QCpK^Ssi#Orn#l$^S~z`%v{WlR}?-hxQ%q_wI?8-?xFSf7UHD3@dWJ~kZ!RYr!G z(|w|h6>BqMXQj_O2DV$mD2F|1k}CHt)s`(LwYs5}3)zLZUk6cgp=-O|Ey~$2}nTZ#!VpED9Gp&tnClZJ?i}tI_`R@BpS0 ziIx#gLjj~Ib`REWDYwN45DCf5DVH~!W}UFHiqVXM()RXfCeSZlFL0Rr#rHY&r$?r3 zfgC0kvn|00seRB<+9z06jM`M@6bxmkh0$ zT*pHtoei6GVI82?-QBT(#room?6)P$f08g(2!0zDm_(VbNJhPIbB*lwa|!qtWq<%_ zG`K1vt|bj63j?R;N}Lawo99#|mm4B*7Ob8|zgSZ>nfO6HcT606Bwizrs- z9-tvDDo^KYf^e13O%K0s#k{8JUaH;IFHT3Nn>Em5F^1~PPeN0cK%NU;SyG%5%w1O3 z^Bw{`)y@p}J0sIz=V+;A0X-DTWRiN+u#%;=-i3%OH1BAch3_y8)tNL`%k*go%&Q)N zmMM;Uwu+9-oY_IqD?p5%!OyzdVj7f+IftZ$a_NCk+*&7-j*$XjuR4{&* zo)zEs@?(?Mv=}zPu1x50K1nH{GmELoRu7XX&VcEU`;(x|OGJ|vu?<1A2(2iFp&_O&Eb z&);p~>yTVhrOe~oTryvhE!8`C76wM0Fk1jR;QK;R=@83SH9{X$g42bbf2I?tQJN&4 z#;$`Ju~N~(3_WtlF$7F&3=^|x_miZ}x@Xa<{`2p*#(03}`*CuSx~zWUT17JOk*y;e zYPfB${4+u`IV#pf?Tldf!~EiX1UypoSav(qG`T+ZPHY2iQ8@H)pDh500{348<& zujC+xm#G{E7@?zN(l`%zLfS9BE*OH+2KPNd;H#W9eHyfq8n(B zDbkMWk`zI1q7&o7qGteoH5FLj&Z5cu9AHoZgHS$s{A9r9YcUe82C=og*8ypaT#jh7 zgd~|kn~qwR4p)?(6avts^n#kW{6|oh{A0|tnxr0v5loj0^0m&o*CLi~%9q-e$d`l? z&2qMGqxp&CvePUhu^2r9VGOn}tfYsQ@RJN4MaC``O{v|^6nhVv2wnzaPaM-T_|O+< zKsGt^GKXjw1Joy4ahH!0H2^Na#x}%B4g=~KL;wf5VVpEuQ}BRw04e2z_-6c!WAklP zb>lSu@Dvs~-ewv+oBy!IbM)&b5YcTZW`n+t#R%IYzO%@`n#vrl5G8Aq79ST=&K&GWRd5R1M%X>SxEVf23UA^$Z*ap%1i?HOT! zZ`IZR^=RRad2|GY{?pWaCO7%x}@`q1%!bdcr9##u#KS%C3 zJ&WTWYfbT-Nxe(!jH)1M@N4hU2 z+TCfW9!sodzs#h^LI6>Su}q+|1F4@n!k8%8M&r|xk|yi1M1nlZtNvEc6?&**>vEk* z((acpjtiPU;*f0Y_2Kz0qsf+ZTwff@X7p#Ea9&3IV*ui(3F*Z7mRn|Zk=v}*WoC+4 zf#6?Z=NyUZbu7?ykHVO;Mw<)ix!%;komj!`rqj;%r3vDj;Gws%p}Pcg0ZhFMgu$2z z9VwcE_k?nO8-oSf$fg5PuwyxZq~-YK4czg7NOAiXq6Y}K!ZOCzY$BZnHaA9l%`9&9 ztaF|-#6?bT8#0bxItQ-Ae1T<{PXIiZx-0sT@@<`_(OW*2yr3z30ji-;PIexJHt@+En-dAk zR0WxmaRH9s9yhcYATGfFMV)^3gNwzP@E!d|URvxu1qOvP49dDPSl&M}OG~k4@0BTa zf|?nSF-8yW9WhN#xegXpD<^A85e>#Lc~giEJA;-}%U`MG(2*B(|P zniK2gcfWFhn*ZnJnS~+=%nK3E5c* zvezD8hnKBd@%w?_#?WF=qFzHECwuD(Qf3p7lZ$RL*Cb6)oj@AaU`>5(aH&&a4%Ijd z*Q*wEP9As9Yf?-rOO~(ibG+?yjWApywWn+n;#KWPg@g3@6ARp^%!{H1mVexOq(5l` z^s+5nZHFqJ6#wlUrXVZ*zoTMizM_%ff8R=nvLBGKk$;A^x}lT>1LIuWf}R?6g2zR7 zPq$fcKT@4OGi49fy(2cZ!1N+4T1F$XDVsB^?)zD~LXz1v%BWrjA`#afNvCL57n8>q z*n(f~GVR?2>eG{wsxpR>EEFQ;Hd`xdJ)9EJ6^^=p^bkCKUhuwc73>%uR9&+0V)C9= z0?*)sy`Y?7*cs1`xlVjsAIt>mIXdlIprJJT^+5u6u%iAjDjLs*v0SZ03}k<68P1xN zk{2Z9vse2D!yOAv-isD?(b@;raC4Eg%3JM3HXC&20osV=xA)`K_Y(;>do-wXjC4x} zHJWl*0v4O!~fz%YJrgQsg0ccTS=^R^a_GRjX@9`jjIm96 zOV%-X6A9hUf&e}w^1}EUO)0Y?BmBR4SYe0U5fg&Jrdyi^#<2F*KydN?;rv)ZwP#IW z_`AJbyvL8XB>Ri=eS0bVWI8wX3ZwOonO$MS9bf7@x~;n$z%cg)KX(rohvtEOrp9(8 z5aC9e3~Wy7h1WN7V@%#gxxKU6duuNWDt21JmE=%{GQVpnV1E#i-!`IX{d7#Q0yDc& zE@upA^ob9NR5R6SCzEH%OBm~qm7NZgE(t~#h*La5SL#fxRiH@8+S#VcI_?(nHMt6I z3!ySGsZ5NZP5#%_-xI`2i3=9Qx{~CBwGsIYb;=S6K|}I_P(?~BD3Jd88rpYp5+<5_ zeqduZd^N5uA|4Z_1Y3p53vw4lnaD1ene!3Mgs&B=8bHA@Bxnn_q*RCP-Y6Wlavmrd zRPe&5Gxt)$8keZee;co>u#{>hWY-%M{S~01?;Y5Pv4dZZ?ydH zPZ8%xE?&$erjEUfU0=yi^R)k(qir~biJ#Gx`KKTf(v%C|)!2?l^}!ajB5poId4*O; z#3;jqO8OY+Gu|Rbw7d!|n}pZFbPXF2EE>hXVXmgnA6qw3_y@_W_D%!TDa>@5rav6a z)Z#lA5>c>i(;O)&6l+FnS^p_h!k8yt9v?N;O-VXy(3L`TnyarzgmfC(APGHbB)bJB9L`rdH?oF&b z)xREZYWcdyy8O|~JTK7lSmg64oFI;JKSehPDA3*fZXb5;b?dR;%&@rLm`;zA^b<8r z#jkZ|oN+`qEyw%rG|=A@*!97|#ElD}v9W9lM)@?C?B5yt=8{RJW^0^g3{F*bR7nU#p$-gqC&Iw77<66} zod~&)!B)m$pmtR@h$=nW>7vusmH?zrhwNq(9ch%kqeFy4Oq8WfgDc!Yf=R(H^t*)- zbLtx=Psp9v$mQz2VGvao2IdJW65VU$8X_P9#G-sb{*c>VXx-NXsi7|#EbNtyZdN_|>xxmQW?GqoJ6sHW&{aJ%!EVy1I^{<4K zQgmgi8fU#r;t7p8h+MG*x{?zwEn)RU+k0Z7;#b$#W>4pQK7mP8sGMUi|&oD|70Roi{2w7cQ9S}C%q!&;R zH%eb6RFJ4hm`x!C+}G%VH{z-eaGqz9RmU@1m7n?3ERvU0rMq;5XDImm6 ztnwGd1S4$w{zFUC$tA@gFzW@l;4$1C<5;KBIEQ5##lX1>!MTOs}@5a%-c*-Pej+J!h45g5sw0G+PGJ*g(*2zY0mB`X)8 zvx6T4n7dp+NrM*rRgSTJySEqV(ern^9NHCTYi|5)Q4C-_mFjhQHzdYQmK%o>zq6&P z^=bR43+%AH+@9&uRsL#x4!?WH>#nF4`rR~xS1mwir@~BQNm&g zn*jOYgr?_T2BGsQ$mj-MZ6_RWaSD6iz_}P|EBi_v166=PhU2^q)7V~PE0eD1LTe=I zv~I`hv)?PA%_gFhs(k(wo`Bv_h46SO2x#_QTnw3X^~bHn-2CRc0j z-xtrl6*{n`!}TPX;-J6rw&&x5C^5D9Xp2B__geL`Jiex>_VT1drtQ1~O8;y-8i=EF zXW+ZYb_>>8Leo5femghAYHT!2Bk$nIM%rY9CqBt;ziS~Xib2A526n}M;{&!~5T)Z1ATok#okcHQ+4SsL9emtAJ7d(kEd zt!TFweB(mcJ!?s!i#JqkD`^~$%9PwKV998dtm)0CgUm^KNy;0~(lMu_EVGK7q}Sxu z`fG(lvV;N(B00S<^47n&sl9?BNaYykzYtn0(Ars8&y0;Xt7^ZQQ?Qc7HczM^V9djMi z&qvau=P(IzD_!->tvsK3k|}o}r!xNcQ8MGM!OdTXLw&+Bl7oSth&Ynb(%W+RtnVUa zpk4&N^u*$Euqn&=0dNF9G==fgu6%YJ=8a;FUL@J2irGs1yb~X~R?65qLY;g91Mg>A z$XO9>n0o`_J{YQX>KYBaKshvCBJ9vAF!qF42;eo zC-))pCYEXbEv)MACj#yfOQGB4&Lajlo%^l~mhC6z{f71pKyh>ox#8V9Co; zmsBEzXQ#L=O|h&B5aZ*`JNI1zBXZt5LNS*Z;c!g*n~+%|6E9rum)$jgRwN(dXyFfN zwH<&zH^aOC{gIl>(kvU)uy~I58(Bwzgwp~qae?gTq@DX+O@8Q-^8Xe4$DjuDR6-U+ z=*dsYAA1r&)g-()dp+voEfZ6mIm&M;APOHGi%X>X=kw%U3|0}duZUbx@&FnZW~`}! zM0D&QqC^?0@o$Be&qO*2!j)*20RpZ3_w@DS>jJsqyMxb)@I|EyY*u0?%!cU5%{nae z7kgTY?S>qzM%1)pdBy0 z&dAV0*>8cqYx?bu$vFQ9^v{+uPzQ4=0k3C1@ZiVU=A}#lQPx}&AW&#VN70Km)@hV6 zo@6x37#+Q}d{fv9)=rqmNHkZ#=qIvE@^s^?9aH(ViAWCMjVc6F>QEw5sSJiW2Ux9B zg3@#e;a#7Fa==+I+AMdyMbMncMoS}f43Ka(Wc5|E4l{7Xf9eclR=(n+Y7U9#UkFnm zANHBoH^c==ilp!S(0d0p!k#iVGpa1|I>l_Gj$75Uoby0u_8^dCO;L`Ri zFaQ9En08%ng4HY${F9it10hXHUm;2(3AHn044Lu#P-U)m;e9(0UA&M G0002cdJ9qj diff --git a/assets/images/coffee_wx.webp b/assets/images/coffee_wx.webp new file mode 100644 index 0000000000000000000000000000000000000000..34298068bb36dfb156563dc93cfc79989b8bfe1b GIT binary patch literal 11612 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‹`<5XzgyZN z*W_sfA7d%W1ho&+x2MIQp*3dvvDvCH11V&1pxz?8;~^pAfNN=gTt0zJ+5)2+pl-3y zgpdtLP`;z2BX<8 zo93;nyL6izIX8*{p+{e2;l`<*@hM!DWA4u_Y?!bK^jP4{ogvsq4n>%`&U`Kjs!n?< zVyoGAdg)cuh4~wvqz>*R+-2yZ{T-1y7WQ7g7P&Ju<5#Kduud1dmV&zOa6vMY7f8;Z zFDa~&tdu&*oA9KXYTG|nk-IlUDy{;Jl`JF9ucKNkh2>Xn!JKxNq|ic^pNuRJmQ1s? z7!I3oY@w-_eOZ3GTUF6YxeH1x06odG%gvUw_FHo=%*Dg?uX}0aly?J-JOeMXTj*9*W|I$3-4}@WT)-ft0 zF+DAw(uc_Q^Q|))Q3*&6c-t1D6+Q2!Iw;h4Z#Y8!K?g{I0Mqyn@KLq-5+#ATWLy5O zsjD-Jl=ZRuRVDshN_lil=6oSmC$d4{ynB@r$!(Airv(rPI8=K_JS3Aq;S8(hGJbne zKi*J&^Wvm7LbTn7LdH-y0`~)@@#~MI-rvzjGC=G_b`>OYi*h>B>~B$>J?yP26JnHS zUt#mHb9)p$R@}WiVsbs<>bw0}cs>CNvK{9{g9l)ry0gm8RS5Zr10l)a3?YU;26)Hu zswWt%o3OYN55&Qufk{*ArHG-0P)KC%_+xkwbm74lP!iJABGd^M~a^8kK5-v^B?Q5za*Va`;ZQI z-?4!C*Xcbs-S7ykcP;MK%&kwjsGz1>cy6V4g{*f!df}$#e(Te%(fld9Y0{F}?};%S zU^%E}(`H8Ycw$VTBELi+OQ#kN!4+B=$X?Tq5V^(wy11Da%d;Kyq@%+sw~PqFMExZX zpNkA1i-p_XlW9QUHcw_2^-RvcP-mGxhDjT%l%0yVUgvXG`A6@03`tB4JPwK3Fet=t zAI2KDy#JLUej@hQ9_3vkISEMkHV|-8xshxA!~(C0O0l2&myqcVv!ad|x8*&f$8rD^ TTXxt{O4Q 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 z001~bNlgRo0000001yC30000100IC=0000100KBdNlgSO0000001N;C00KYo00000 f001~bNlgSp0000001i-MWmf?Z00sax00000 literal 0 HcmV?d00001 diff --git a/assets/version.json b/assets/version.json index 79dcc07a..f5f7e311 100644 --- a/assets/version.json +++ b/assets/version.json @@ -1,3 +1,3 @@ { - "dbVersion": 2 + "dbVersion": 3 } \ No newline at end of file diff --git a/doc/ewm/coffee1.webp b/doc/ewm/coffee1.webp index 53ff28e9374e07b367d9b69b458f3bd4ca817d25..050c2dd952b8a4115ce8b14c58c44fba2e3a8e03 100644 GIT binary patch literal 48828 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 A^8f$< literal 39614 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 G0002cdJ9qj diff --git a/lib/app/views/account/desk/desk_account_page.dart b/lib/app/views/account/desk/desk_account_page.dart index 1d2d8c5c..6ced3225 100644 --- a/lib/app/views/account/desk/desk_account_page.dart +++ b/lib/app/views/account/desk/desk_account_page.dart @@ -51,7 +51,7 @@ class _DeskAccountPageState extends State width: 20, ), Text( - 'Flutter 的联合,编程者的联合', + context.l10n.slogan, style: TextStyle(color: Colors.grey), ) ], diff --git a/lib/app/views/account/desk/sliver_list_panel.dart b/lib/app/views/account/desk/sliver_list_panel.dart index fa255126..6d54fbd5 100644 --- a/lib/app/views/account/desk/sliver_list_panel.dart +++ b/lib/app/views/account/desk/sliver_list_panel.dart @@ -1,4 +1,6 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:toly_ui/toly_ui.dart'; import '../../about/about_app_page.dart'; @@ -37,16 +39,13 @@ class SliverListPanel extends StatelessWidget { ), InfoPanel( title: 'Flutter Unit 2.0 ', - info: - '○ 317 个 Flutter 组件收录和详情介绍。\n' + info: '○ 317 个 Flutter 组件收录和详情介绍。\n' '○ 绘制集录用于收录绘制相关的优秀示例。\n' '○ 要点集录用于收录 Flutter 相关的小知识。\n' '○ 时光轴,查看 FlutterUnit 重要事件。\n' - '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。' - ) + '○ 实现应用内更新功能,方便使用者及时更新到最新版体验。') ]; - return SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 28.0), @@ -57,16 +56,35 @@ class SliverListPanel extends StatelessWidget { children: [ Circle(color: Theme.of(context).primaryColor), Padding( - padding: const EdgeInsets.only(left: 15,top: 15,bottom: 15), - child: Text('开源不易,请我喝咖啡 ~',style: const TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), + padding: const EdgeInsets.only(left: 15, top: 15, bottom: 15), + child: Text( + '开源不易,请我喝咖啡 ~', + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), ), - - ], ), - Image.asset( - 'assets/images/coffee1.webp', - + Row( + children: [ + Expanded( + child: Image.asset( + 'assets/images/coffee_zfb.webp', + ), + ), + const SizedBox(width: 8,), + Expanded( + child: Image.asset( + 'assets/images/coffee_wx.webp', + ), + ), + const SizedBox(width: 8,), + Expanded( + child: Image.asset( + 'assets/images/coffee_wx_ac.webp', + ), + ), + ], ) ], ), diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index 50fec821..5e7b3581 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; import 'package:artifact/artifact.dart'; +import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -30,11 +31,12 @@ class DataManagePage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('数据管理'), + title: Text(context.l10n.dataManagement), ), body: Builder( builder: (ctx) => ListView( children: [ + const SizedBox(height: 8,), AuthenticWidget.just( ListTile( trailing: Icon( @@ -60,7 +62,7 @@ class DataManagePage extends StatelessWidget { Icons.refresh, color: Theme.of(context).primaryColor, ), - title: const Text('收藏集数据重置'), + title: Text(context.l10n.favoritesCollectionDataReset), // trailing: _nextIcon(context), onTap: () => _recallDatabase(ctx), ), diff --git a/lib/navigation/routers/mobile_route.dart b/lib/navigation/routers/mobile_route.dart index 8a85b654..7fba9544 100644 --- a/lib/navigation/routers/mobile_route.dart +++ b/lib/navigation/routers/mobile_route.dart @@ -1,3 +1,4 @@ +import 'package:authentication/authentication.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/widget_module.dart'; @@ -111,4 +112,10 @@ final List appMobileNavRoute = [ return const AboutMePage(); }, ), + GoRoute( + path: 'support_me', + builder: (BuildContext context, GoRouterState state) { + return const SupportMe(); + }, + ), ]; diff --git a/lib/navigation/views/unit_navigation.dart b/lib/navigation/views/unit_navigation.dart index fed9eb6e..99389b73 100644 --- a/lib/navigation/views/unit_navigation.dart +++ b/lib/navigation/views/unit_navigation.dart @@ -84,7 +84,7 @@ class _UnitPhoneNavigationState extends State { onItemTap: _onTapBottomNav, onItemLongTap: _onItemLongTap, ), - const Positioned(right: 26, top: 8, child: UpdateRedPoint()) + const Positioned(right: 22, top: 8, child: UpdateRedPoint()) ], ); } diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart index 6e94cd0d..dbf3c3cb 100644 --- a/packages/app/lib/app_config/bloc/bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -7,8 +7,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; -import '../repository/repository.dart'; -import 'state.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com @@ -51,9 +49,8 @@ class AppConfigBloc extends Cubit { emit(newState); } - // 切换字体事件处理 : 固化索引 + 产出新状态 + // 切换语言事件处理 : 固化索引 + 产出新状态 void switchLanguage(Language language) async { - print("=====switchLanguage:$language============"); AppConfigState newState = state.copyWith(language: language); cao.write(newState.toAppConfigPo()); emit(newState); diff --git a/packages/artifact/lib/src/articles/view/artifact_page.dart b/packages/artifact/lib/src/articles/view/artifact_page.dart index 4e6a2c05..101e3bac 100644 --- a/packages/artifact/lib/src/articles/view/artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/artifact_page.dart @@ -4,6 +4,7 @@ import 'package:algorithm/algorithm.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; import 'package:url_launcher/url_launcher.dart'; import '../bloc/columnize/bloc.dart'; import '../bloc/exp.dart'; @@ -202,22 +203,23 @@ class _ArtifactPageState extends State // ), bottom: TabBar( controller: controller, - tabs: [ + tabs: + [ Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '捷特文库', + text: context.l10n.knowledgeTabToly, ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '可视排序', + text: context.l10n.knowledgeTabAlgo, ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '布局宝库', + text:context.l10n.knowledgeTabLayout, ), Tab( // icon: Icon(Icons.account_balance_wallet_outlined), - text: '要点宝库', + text:context.l10n.knowledgeTabPoint, ), ], ), diff --git a/packages/authentication/lib/authentication.dart b/packages/authentication/lib/authentication.dart index 3fc9d479..0147e563 100644 --- a/packages/authentication/lib/authentication.dart +++ b/packages/authentication/lib/authentication.dart @@ -13,5 +13,6 @@ export 'blocs/user/state.dart'; export 'views/mobile/user/page_item.dart'; export 'views/mobile/user/unit_drawer_header.dart'; export 'views/mobile/user/user_page.dart'; +export 'views/mobile/user/support_me.dart'; export 'views/mobile/login/login_page.dart'; export 'views/mobile/register/register_page.dart'; \ No newline at end of file diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/packages/authentication/lib/views/mobile/user/page_item.dart index 90eaec60..d4d31c30 100644 --- a/packages/authentication/lib/views/mobile/user/page_item.dart +++ b/packages/authentication/lib/views/mobile/user/page_item.dart @@ -53,6 +53,8 @@ class MePageItem extends StatelessWidget { Gap.sfl10, _buildItem(context, TolyIcon.icon_kafei, context.l10n.contactThisKing, '/about_me'), + const Divider(), + _buildItem(context, Icons.sanitizer, context.l10n.homeAccountSupport, '/support_me'), ], ), ); diff --git a/packages/authentication/lib/views/mobile/user/support_me.dart b/packages/authentication/lib/views/mobile/user/support_me.dart new file mode 100644 index 00000000..f6c8d095 --- /dev/null +++ b/packages/authentication/lib/views/mobile/user/support_me.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; + +class SupportMe extends StatelessWidget { + const SupportMe({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 3, + child: Scaffold( + appBar: AppBar( + title: Column( + children: [ + Text(context.l10n.homeAccountSupport), + Text('开源不易, 请我喝咖啡~',style: TextStyle(fontSize: 12,fontWeight: FontWeight.normal),), + ], + ), + bottom: TabBar( + tabs: [ + Tab( + text: '支付宝', + ), + Tab( + text: '微信1', + ), + Tab( + text: '微信2', + ), + ], + ), + ), + body: TabBarView( + children: [ + Image.asset( + 'assets/images/coffee_zfb.webp', + ), + Image.asset('assets/images/coffee_wx.webp'), + Image.asset('assets/images/coffee_wx_ac.webp'), + ], + ), + ), + ); + } +} + diff --git a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart index 54d363b7..5ffe1b1f 100644 --- a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart +++ b/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; @@ -51,7 +52,7 @@ class _DeskGalleryUnitState extends State { children: [ SimpleDeskTopBar( leading: Text( - 'Flutter 绘制集录', + 'Flutter ${context.l10n.paintCollection}', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), diff --git a/packages/draw_system/pubspec.yaml b/packages/draw_system/pubspec.yaml index 1ff5fd28..eebc096f 100644 --- a/packages/draw_system/pubspec.yaml +++ b/packages/draw_system/pubspec.yaml @@ -12,6 +12,8 @@ dependencies: sdk: flutter toly_ui: path: ../toly_ui + l10n: + path: ../l10n app: path: ../app components: diff --git a/packages/l10n/lib/arb/app_en.arb b/packages/l10n/lib/arb/app_en.arb index d7e91d07..c73c3fb2 100644 --- a/packages/l10n/lib/arb/app_en.arb +++ b/packages/l10n/lib/arb/app_en.arb @@ -56,7 +56,7 @@ "enterComponentName":"Input widget name", "containerComponents":"Container components", - "relatedComponents":"Related components", + "relatedComponents":"Related Widgets", "componentTavern":"Component Tavern", "cherishedComponents":"Treasure components", "textImageCollection":"TextImageCollection", @@ -190,5 +190,7 @@ "draw":"Draw", "knowledge":"Knowledge", "collection":"Collection", - "my":"My" + "my":"My", + "picture":"pics", + "slogan":"The unity of flutter, The unity of coder." } \ No newline at end of file diff --git a/packages/l10n/lib/arb/app_zh.arb b/packages/l10n/lib/arb/app_zh.arb index f7d2e56b..d2d8ede0 100644 --- a/packages/l10n/lib/arb/app_zh.arb +++ b/packages/l10n/lib/arb/app_zh.arb @@ -12,7 +12,6 @@ "homeAccountTabMe": "联系本王", "homeAccountSupport": "支持项目", - "searchWidget": "搜索组件", "stateless":"无态", "stateful":"有态", @@ -192,5 +191,7 @@ "draw":"绘制", "knowledge":"知识", "collection":"收藏", - "my":"我的" + "my":"我的", + "picture":"幅", + "slogan":"Flutter 的联合,编程者的联合" } \ No newline at end of file diff --git a/packages/l10n/lib/gen_l10n/app_localizations.dart b/packages/l10n/lib/gen_l10n/app_localizations.dart index 24b58f4c..54007e7c 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations.dart @@ -1166,6 +1166,18 @@ abstract class AppLocalizations { /// In zh, this message translates to: /// **'我的'** String get my; + + /// No description provided for @picture. + /// + /// In zh, this message translates to: + /// **'幅'** + String get picture; + + /// No description provided for @slogan. + /// + /// In zh, this message translates to: + /// **'Flutter 的联合,编程者的联合'** + String get slogan; } class _AppLocalizationsDelegate extends LocalizationsDelegate { diff --git a/packages/l10n/lib/gen_l10n/app_localizations_en.dart b/packages/l10n/lib/gen_l10n/app_localizations_en.dart index 9a4cd2d0..e1861970 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_en.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_en.dart @@ -17,7 +17,7 @@ class AppLocalizationsEn extends AppLocalizations { String get treasureTools => 'Treasure'; @override - String get collectCollection => 'CollectionCollection'; + String get collectCollection => 'Collection'; @override String get essentialCollection => 'KeypointsCollection'; @@ -461,7 +461,7 @@ class AppLocalizationsEn extends AppLocalizations { String get likedWidgets => 'Liked Widgets'; @override - String get relatedComponents => 'Related components'; + String get relatedComponents => 'Related Widgets'; @override String get backupFavoritesCollectionData => 'Backup Collection Data'; @@ -540,4 +540,10 @@ class AppLocalizationsEn extends AppLocalizations { @override String get my => 'My'; + + @override + String get picture => 'pics'; + + @override + String get slogan => 'The unity of flutter, The unity of coder.'; } diff --git a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart index eb52f93b..14a6c466 100644 --- a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart +++ b/packages/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -540,4 +540,10 @@ class AppLocalizationsZh extends AppLocalizations { @override String get my => '我的'; + + @override + String get picture => '幅'; + + @override + String get slogan => 'Flutter 的联合,编程者的联合'; } diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index edd21a3b..4e0acaa6 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -2,6 +2,7 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../../data/exp.dart'; @@ -83,13 +84,13 @@ class DeskWidgetDetailPage extends StatelessWidget{ ); } - Widget get linkText => Row( - children: const [ - Padding( + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( padding: EdgeInsets.only(left: 15, right: 5), child: Icon(Icons.link, color: Colors.blue), ), - Text('相关组件', style: UnitTextStyle.labelBold), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), ], ); @@ -119,7 +120,7 @@ class DeskWidgetDetailPage extends StatelessWidget{ crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 16,), - linkText, + linkText(context), if (state is DetailWithData) LinkWidgetButtons( links: state.links, diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 83ef9055..3e53b705 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; import '../../../data/exp.dart'; import '../../desk_ui/widget_detail/link_widget_buttons.dart'; @@ -54,15 +55,16 @@ class WidgetDetailPage extends StatelessWidget { ); } - Widget get linkText => Row( - children: const [ - Padding( - padding: EdgeInsets.only(left: 15, right: 5), - child: Icon(Icons.link, color: Colors.blue), - ), - Text('相关组件', style: UnitTextStyle.labelBold), - ], - ); + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); + Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { DetailState state = bloc.state; @@ -78,7 +80,7 @@ class WidgetDetailPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ WidgetDetailPanel(model: bloc.currentWidget), - linkText, + linkText(context), if (state is DetailWithData) LinkWidgetButtons(links: state.links, onSelect: bloc.push,), const Divider(), diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart index 5a667c45..97a3a2a1 100644 --- a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart @@ -1,4 +1,8 @@ import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 370 DropdownMenu 表单菜单 // { // "widgetId": 370, // "name": '下拉菜单样式设置', diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart index 4be9d7fa..353c97a5 100644 --- a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart +++ b/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 370 DropdownMenu 表单菜单 // { // "widgetId": 370, // "name": '下拉菜单自定义菜单项', diff --git a/pubspec.lock b/pubspec.lock index fb14171f..a0f597e2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -365,6 +365,30 @@ packages: relative: true source: path version: "0.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -393,26 +417,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.flutter-io.cn/" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -457,10 +481,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -910,14 +934,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" - web: + vm_service: dependency: transitive description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.0" + version: "13.0.0" webview_flutter: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 01eadacb..4ad976c4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. publish_to: none -version: 2.9.3+1 +version: 3.0.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 400911ec6e1fa213c048022020b4afda2cb399f7 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 27 Feb 2024 09:34:59 +0800 Subject: [PATCH 059/149] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 3 +++ packages/app_update/lib/bloc/bloc.dart | 3 +-- pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 932ba74d..f72473c0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,9 @@ + + + diff --git a/packages/app_update/lib/bloc/bloc.dart b/packages/app_update/lib/bloc/bloc.dart index ed97d949..c217b9f9 100644 --- a/packages/app_update/lib/bloc/bloc.dart +++ b/packages/app_update/lib/bloc/bloc.dart @@ -70,8 +70,7 @@ class UpdateBloc extends Bloc { return; } - id = await RUpgrade.upgrade(event.appInfo.appUrl, - fileName: '${event.appInfo.appName}.apk',); + id = await RUpgrade.upgrade(event.appInfo.appUrl, fileName: '${event.appInfo.appName}.apk',); subscription = RUpgrade.stream.listen((DownloadInfo info) { double progress = (info.percent ?? 0) / 100; if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { diff --git a/pubspec.yaml b/pubspec.yaml index 4ad976c4..2caa58b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. publish_to: none -version: 3.0.0 +version: 2.9.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 640bb2623990948ba2e5d63d3fd0d37b10c63fcc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 7 Mar 2024 09:48:03 +0800 Subject: [PATCH 060/149] update Flutter 3.19.2 --- .../InheritedWidget/node2_use.dart | 216 ++++++++++++++++++ .../{GridPager => GridPaper}/node1_base.dart | 4 +- .../node2_divisions.dart | 4 +- packages/widgets/lib/exp/stateless_unit.dart | 4 +- packages/widgets/lib/widgets_map.dart | 6 +- pubspec.yaml | 2 +- 6 files changed, 226 insertions(+), 10 deletions(-) create mode 100644 packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart rename packages/widgets/lib/StatelessWidget/{GridPager => GridPaper}/node1_base.dart (87%) rename packages/widgets/lib/StatelessWidget/{GridPager => GridPaper}/node2_divisions.dart (89%) diff --git a/packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart b/packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart new file mode 100644 index 00000000..7b132ccf --- /dev/null +++ b/packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart @@ -0,0 +1,216 @@ + +import 'package:flutter/material.dart'; + +class InheritedCounter extends InheritedWidget { + const InheritedCounter({ + super.key, + this.color, + this.counter, + required super.child, + }); + + final Color? color; + final int? counter; + + static InheritedCounter? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(InheritedCounter oldWidget) { + return color != oldWidget.color || counter != oldWidget.counter; + } +} + +class InheritedModelDemo extends StatefulWidget { + const InheritedModelDemo({super.key}); + + @override + State createState() => _InheritedModelDemoState(); +} + +class _InheritedModelDemoState extends State { + int _counter = 0; + late Color _color = colors.first; + + final List colors = const [ + Colors.black, + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.indigo, + Colors.purple, + ]; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleIconButton( + color: Colors.green, + icon: Icons.remove, + onPressed: _decrease, + ), + InheritedCounter( + color: _color, + counter: _counter, + child: const BoxDecorationWrap(), + ), + CircleIconButton( + color: Colors.blue, + icon: Icons.add, + onPressed: _increase, + ), + ], + ), + const SizedBox(height: 20), + ColorSelector( + colors: colors, + activeColor: _color, + onSelect: _onSelectColor, + ) + ], + ); + } + + void _increase() { + setState(() => _counter += 1); + } + + void _decrease() { + setState(() => _counter -= 1); + } + + void _onSelectColor(Color value) { + setState(() { + _color = value; + }); + } +} + +class CircleIconButton extends StatelessWidget { + final Color color; + final IconData icon; + final VoidCallback onPressed; + + const CircleIconButton( + {super.key, + required this.color, + required this.icon, + required this.onPressed}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + decoration: const BoxDecoration( + color: Color(0xFFDFDFDF), + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Icon( + icon, + color: Colors.white, + size: 16, + ), + ), + ), + ), + ); + } +} + +class ColorSelector extends StatelessWidget { + final List colors; + final ValueChanged onSelect; + final Color activeColor; + + const ColorSelector({ + super.key, + required this.colors, + required this.activeColor, + required this.onSelect, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: colors + .map((e) => GestureDetector( + onTap: () => onSelect(e), + child: _buildCircle(e), + )) + .toList(), + ); + } + + Widget _buildCircle(Color color) { + return CircleAvatar( + radius: 12, + child: color == activeColor + ? const Icon( + Icons.check, + color: Colors.white, + size: 16, + ) + : null, + backgroundColor: color, + ); + } +} + +class BoxDecorationWrap extends StatelessWidget { + const BoxDecorationWrap({super.key}); + + @override + Widget build(BuildContext context) { + final Color color = InheritedCounter.of(context)?.color ?? Colors.black; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: const CounterText(), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: color), + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: color, + spreadRadius: 2, + blurRadius: 8, + offset: const Offset(0, 0)) + ]), + ); + } +} + +class CounterText extends StatelessWidget { + const CounterText({super.key}); + + @override + Widget build(BuildContext context) { + final Color? color = InheritedCounter.of(context)?.color; + final int counter = InheritedCounter.of(context)?.counter??0; + return Text( + "Counter = $counter", + style: TextStyle(color: color,fontWeight: FontWeight.bold), + ); + } +} diff --git a/packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart b/packages/widgets/lib/StatelessWidget/GridPaper/node1_base.dart similarity index 87% rename from packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart rename to packages/widgets/lib/StatelessWidget/GridPaper/node1_base.dart index 12955197..71e8bf69 100644 --- a/packages/widgets/lib/StatelessWidget/GridPager/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/GridPaper/node1_base.dart @@ -12,8 +12,8 @@ import 'package:flutter/material.dart'; // "【color】: 颜色 【Color】\n" // "【interval】: 小块边长 【double】", // } -class CustomGridPage extends StatelessWidget { - const CustomGridPage({Key? key}) : super(key: key); +class CustomGridPaper extends StatelessWidget { + const CustomGridPaper({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart b/packages/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart similarity index 89% rename from packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart rename to packages/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart index 82d4eada..895ebbc5 100644 --- a/packages/widgets/lib/StatelessWidget/GridPager/node2_divisions.dart +++ b/packages/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart @@ -12,8 +12,8 @@ import 'package:flutter/material.dart'; // "【subdivisions】: 小块中子块个数 【int】\n" // "【divisions】: 小块中子块的分割数 【int】", // } -class DivisionsGridPage extends StatelessWidget { - const DivisionsGridPage({Key? key}) : super(key: key); +class DivisionsGridPaper extends StatelessWidget { + const DivisionsGridPaper({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/packages/widgets/lib/exp/stateless_unit.dart index bd53f535..15827b0b 100644 --- a/packages/widgets/lib/exp/stateless_unit.dart +++ b/packages/widgets/lib/exp/stateless_unit.dart @@ -158,8 +158,8 @@ export '../StatelessWidget/GirdView/node2_direction.dart'; export '../StatelessWidget/GirdView/node3_extend.dart'; export '../StatelessWidget/GirdView/node4_builder.dart'; -export '../StatelessWidget/GridPager/node1_base.dart'; -export '../StatelessWidget/GridPager/node2_divisions.dart'; +export '../StatelessWidget/GridPaper/node1_base.dart'; +export '../StatelessWidget/GridPaper/node2_divisions.dart'; export '../StatelessWidget/Spacer/node1_base.dart'; export '../StatelessWidget/Spacer/node2_flex.dart'; diff --git a/packages/widgets/lib/widgets_map.dart b/packages/widgets/lib/widgets_map.dart index 878a8dd1..50f0a0c0 100644 --- a/packages/widgets/lib/widgets_map.dart +++ b/packages/widgets/lib/widgets_map.dart @@ -559,10 +559,10 @@ class WidgetsMap { const CustomPlaceholder(), const FallbackPlaceholder(), ]; - case "GridPager": + case "GridPaper": return [ - const CustomGridPage(), - const DivisionsGridPage(), + const CustomGridPaper(), + const DivisionsGridPaper(), ]; case "Image": return [ diff --git a/pubspec.yaml b/pubspec.yaml index 2caa58b9..4ad976c4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. publish_to: none -version: 2.9.0 +version: 3.0.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 2cc12c878cbd6146c76314269078d2a0853d76b9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 8 Mar 2024 08:36:26 +0800 Subject: [PATCH 061/149] InheritedModel --- README.md | 2 +- .../lib/ProxyWidget/InheritedModel/node1.dart | 262 ++++++++++++++++++ 2 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart diff --git a/README.md b/README.md index 9bcc0908..ccf69e13 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ #### 当前Flutter 版本 ``` -Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git +Flutter 3.19.2 • channel stable • https://github.com/flutter/flutter.git Framework • revision bae5e49bc2 (8 days ago) • 2024-02-13 17:46:18 -0800 Engine • revision 04817c99c9 Tools • Dart 3.3.0 • DevTools 2.31.1 diff --git a/packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart b/packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart new file mode 100644 index 00000000..db3c2973 --- /dev/null +++ b/packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart @@ -0,0 +1,262 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 336 InheritedModel 共享模型 +/// 它是 InheritedWidget 抽象子类,通过 context 向子树传递数据,并通过 Aspect 方面控制依赖通知的粒度。 +/// link: 346 +/// +// { +// "widgetId": 336, +// "name": 'InheritedModel 使用', +// "priority": 1, +// "subtitle": "【child】 : 子组件 【Widget】\n" +// "下面是一个自定义 InheritedModel,实现数据的子树共享;\n并且定义颜色和数值两个方面,控制依赖通知的粒度。", +// } +class InheritedModelDemo extends StatefulWidget { + const InheritedModelDemo({super.key}); + + @override + State createState() => _InheritedModelDemoState(); +} + +class _InheritedModelDemoState extends State { + int _counter = 0; + late Color _color = colors.first; + + final List colors = const [ + Colors.black, + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green, + Colors.orange, + Colors.indigo, + Colors.purple, + ]; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleIconButton( + color: Colors.green, + icon: Icons.remove, + onPressed: _decrease, + ), + CounterModel( + color: _color, + counter: _counter, + child: BoxDecorationWrap(), + ), + CircleIconButton( + color: Colors.blue, + icon: Icons.add, + onPressed: _increase, + ), + ], + ), + const SizedBox(height: 20), + ColorSelector( + colors: colors, + activeColor: _color, + onSelect: _onSelectColor, + ) + ], + ); + } + + void _increase() { + setState(() => _counter += 1); + } + + void _decrease() { + setState(() => _counter -= 1); + } + + void _onSelectColor(Color value) { + setState(() { + _color = value; + }); + } +} +enum CounterAspect { color, value } + +class CounterModel extends InheritedModel { + const CounterModel({ + super.key, + this.color, + this.counter, + required super.child, + }); + + final Color? color; + final int? counter; + + static CounterModel? of(BuildContext context,CounterAspect aspect){ + return InheritedModel.inheritFrom(context, aspect: aspect); + } + + @override + bool updateShouldNotify(CounterModel oldWidget) { + return color != oldWidget.color || counter != oldWidget.counter; + } + + @override + bool updateShouldNotifyDependent(CounterModel oldWidget, Set dependencies) { + if (color != oldWidget.color && dependencies.contains(CounterAspect.color)) { + return true; + } + if (counter != oldWidget.counter && dependencies.contains(CounterAspect.value)) { + return true; + } + return false; + } +} + +class CircleIconButton extends StatelessWidget { + final Color color; + final IconData icon; + final VoidCallback onPressed; + + const CircleIconButton( + {super.key, + required this.color, + required this.icon, + required this.onPressed}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onPressed, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration( + color: Color(0xFFDFDFDF), + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) + ), + child: Icon( + icon, + color: Colors.white, + size: 16, + ), + ), + ), + ), + ); + } +} + +class ColorSelector extends StatelessWidget { + final List colors; + final ValueChanged onSelect; + final Color activeColor; + + const ColorSelector({ + super.key, + required this.colors, + required this.activeColor, + required this.onSelect, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: colors + .map((e) => GestureDetector( + onTap: () => onSelect(e), + child: _buildCircle(e), + )) + .toList(), + ); + } + + Widget _buildCircle(Color color) { + return CircleAvatar( + radius: 12, + child: color == activeColor + ? Icon( + Icons.check, + color: Colors.white, + size: 16, + ) + : null, + backgroundColor: color, + ); + } +} + +class BoxDecorationWrap extends StatefulWidget { + const BoxDecorationWrap({super.key}); + + @override + State createState() => _BoxDecorationWrapState(); +} + +class _BoxDecorationWrapState extends State { + + @override + void didChangeDependencies() { + print("======BoxDecorationWrap#didChangeDependencies========="); + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + final Color color = CounterModel.of(context,CounterAspect.color)?.color ?? Colors.black; + return Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: CounterText(), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: color), + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: color, + spreadRadius: 2, + blurRadius: 8, + offset: Offset(0, 0)) + ]), + ); + } +} + +class CounterText extends StatefulWidget { + const CounterText({super.key}); + + @override + State createState() => _CounterTextState(); +} + +class _CounterTextState extends State { + @override + void didChangeDependencies() { + print("======CounterText#didChangeDependencies========="); + super.didChangeDependencies(); + } + @override + Widget build(BuildContext context) { + final Color color = CounterModel.of(context,CounterAspect.color)?.color ?? Colors.black; + final int counter = CounterModel.of(context,CounterAspect.value)?.counter ?? 0; + return Text( + "Counter = $counter", + style: TextStyle(color: color,fontWeight: FontWeight.bold), + ); + } +} From 78538989361ceb8a108d824eaef0cc23ade929b4 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 3 Apr 2024 00:52:48 +0800 Subject: [PATCH 062/149] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20app=5Fboot=5Fstart?= =?UTF-8?q?er=20=E5=90=AF=E5=8A=A8=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/bloc_wrapper.dart | 5 -- .../views/account/desk/desk_account_page.dart | 2 +- lib/app_stater/app_starter.dart | 2 - lib/app_stater/bloc/bloc.dart | 49 ------------------- lib/app_stater/bloc/state.dart | 22 --------- lib/app_stater/impl/app_start_action.dart | 33 +++++++++++++ .../start_repository.dart} | 29 +++++++++-- lib/app_stater/view/app_start_listener.dart | 38 -------------- .../view/error/app_start_error.dart | 22 +++++++++ .../view/{ => splash}/flutter_unit_text.dart | 0 .../{ => splash}/standard_unit_splash.dart | 0 lib/main.dart | 13 +++-- lib/navigation/routers/app_route.dart | 23 ++++++--- .../window/windows_adapter.dart | 37 ++++++++++++++ packages/app/lib/app_config/bloc/bloc.dart | 5 +- .../src/db_storage/helper/db_open_helper.dart | 1 - pubspec.lock | 14 ++++-- pubspec.yaml | 3 ++ 18 files changed, 159 insertions(+), 139 deletions(-) delete mode 100644 lib/app_stater/app_starter.dart delete mode 100644 lib/app_stater/bloc/bloc.dart delete mode 100644 lib/app_stater/bloc/state.dart create mode 100644 lib/app_stater/impl/app_start_action.dart rename lib/app_stater/{repository/repository.dart => impl/start_repository.dart} (70%) delete mode 100644 lib/app_stater/view/app_start_listener.dart create mode 100644 lib/app_stater/view/error/app_start_error.dart rename lib/app_stater/view/{ => splash}/flutter_unit_text.dart (100%) rename lib/app_stater/view/{ => splash}/standard_unit_splash.dart (100%) diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index 0c9cd782..bb0a6213 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -2,7 +2,6 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; -import 'package:flutter_unit/app_stater/app_starter.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -34,10 +33,6 @@ class _BlocWrapperState extends State { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - /// 应用启动器 - BlocProvider( - create: (_) => AppStartBloc(minStartDurationMs: 600)..startApp()), - // 全局 bloc : 维护应用存储状态、更新、认证 BlocProvider( create: (_) => AuthBloc(repository: authRepository)), diff --git a/lib/app/views/account/desk/desk_account_page.dart b/lib/app/views/account/desk/desk_account_page.dart index 6ced3225..0b7a5a99 100644 --- a/lib/app/views/account/desk/desk_account_page.dart +++ b/lib/app/views/account/desk/desk_account_page.dart @@ -1,6 +1,6 @@ import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app_stater/view/flutter_unit_text.dart'; +import 'package:flutter_unit/app_stater/view/splash/flutter_unit_text.dart'; import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; diff --git a/lib/app_stater/app_starter.dart b/lib/app_stater/app_starter.dart deleted file mode 100644 index a9e88268..00000000 --- a/lib/app_stater/app_starter.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'bloc/state.dart'; -export 'bloc/bloc.dart'; diff --git a/lib/app_stater/bloc/bloc.dart b/lib/app_stater/bloc/bloc.dart deleted file mode 100644 index e2783af1..00000000 --- a/lib/app_stater/bloc/bloc.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../repository/repository.dart'; -import 'state.dart'; - -class AppStartBloc extends Cubit { - late SharedPreferences _sp; - - SharedPreferences get sp => _sp; - - final int minStartDurationMs; - - final AppStartRepository repository = const AppStartRepository(); - - AppStartBloc({ - this.minStartDurationMs = 600, - }) : super(const AppStarting()); - - int _timeRecord = 0; - - void startApp() async { - _timeRecord = DateTime.now().millisecondsSinceEpoch; - emit(const AppStarting()); - - try { - /// 处理初始化异步任务 - await repository.initSp(); - await repository.initDb(); - } catch (e) { - emit(AppStartFailed(e.toString())); - return; - } - - /// 计算初始化的耗时时长 - int cost = DateTime.now().millisecondsSinceEpoch - _timeRecord; - int waitTime = minStartDurationMs - cost; - if (waitTime > 0) { - /// 说明启动时间小于 [minStartDurationMs], 等待时间差 - emit(AppLoadDone(cost)); - await Future.delayed(Duration(milliseconds: waitTime)); - } else { - /// 说明启动时间超过 [minStartDurationMs],给一点预加载的时间 - emit(AppLoadDone(cost)); - await Future.delayed(const Duration(milliseconds: 50)); - } - emit(const AppStartSuccess()); - } -} diff --git a/lib/app_stater/bloc/state.dart b/lib/app_stater/bloc/state.dart deleted file mode 100644 index db0b1a4b..00000000 --- a/lib/app_stater/bloc/state.dart +++ /dev/null @@ -1,22 +0,0 @@ -sealed class AppStatus { - const AppStatus(); -} - -class AppStarting extends AppStatus { - const AppStarting(); -} - -class AppLoadDone extends AppStatus { - final int cost; - const AppLoadDone(this.cost); -} - -class AppStartSuccess extends AppStatus { - const AppStartSuccess(); -} - -class AppStartFailed extends AppStatus { - final String error; - - const AppStartFailed(this.error); -} diff --git a/lib/app_stater/impl/app_start_action.dart b/lib/app_stater/impl/app_start_action.dart new file mode 100644 index 00000000..c6aa571d --- /dev/null +++ b/lib/app_stater/impl/app_start_action.dart @@ -0,0 +1,33 @@ +import 'package:app/app.dart'; +import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:utils/utils.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/data/exp.dart'; + +class AppStartActionImpl implements AppStartAction { + + const AppStartActionImpl(); + + @override + void onLoaded(BuildContext context, int cost, AppConfigState state) { + debugPrint("App启动耗时:$cost ms"); + HttpUtil.instance.rebase(PathUnit.baseUrl); + context.read().init(state); + context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); + context.read().add(const EventLoadLikeData()); + context.read().add(const EventLoadCategory()); + } + + @override + void onStartError(BuildContext context, Object error, StackTrace trace) { + context.go('/start_error',extra: error); + } + + @override + void onStartSuccess(BuildContext context) { + context.go('/widget'); + } +} diff --git a/lib/app_stater/repository/repository.dart b/lib/app_stater/impl/start_repository.dart similarity index 70% rename from lib/app_stater/repository/repository.dart rename to lib/app_stater/impl/start_repository.dart index 7b0f3fba..84635f9a 100644 --- a/lib/app_stater/repository/repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -1,20 +1,39 @@ + + import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; +import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; -class AppStartRepository{ - const AppStartRepository(); +class AppStartRepositoryImpl implements AppStartRepository { + const AppStartRepositoryImpl(); - Future initSp() async{ + /// 初始化 app 的异步任务 + /// 返回本地持久化的 AppConfigState 对象 + @override + Future initApp() async { await SpStorage.instance.initSp(); + await initDb(); + AppConfigPo po = await SpStorage.instance.appConfig.read(); + ConnectivityResult netConnect = await (Connectivity().checkConnectivity()); + return AppConfigState.fromPo(po).copyWith(netConnect: netConnect); + } + + @override + Future fixError(Object error, {Object? extra}) async { + await Future.delayed(const Duration(seconds: 1)); + // throw "App 无法修复"; + return; } + Future initDb() async{ DbOpenHelper.setupDatabase(); //数据库不存在,执行拷贝 @@ -29,6 +48,7 @@ class AppStartRepository{ } else { print("=====flutter.db 已存在===="); } + print('====数据库所在文件夹: $databasesPath======='); await FlutterDbStorage.instance.initDb(); await AppDbStorage.instance.initDb(); @@ -72,5 +92,4 @@ class AppStartRepository{ return shouldCopy; } - -} \ No newline at end of file +} diff --git a/lib/app_stater/view/app_start_listener.dart b/lib/app_stater/view/app_start_listener.dart deleted file mode 100644 index 3a3c3f42..00000000 --- a/lib/app_stater/view/app_start_listener.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:utils/utils.dart'; -import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_module/widget_module.dart'; - -import '../bloc/bloc.dart'; -import '../bloc/state.dart'; - -class AppStartListener extends StatelessWidget { - final Widget child; - const AppStartListener({super.key, required this.child}); - - @override - Widget build(BuildContext context) { - return BlocListener( - listener: _listenAppStart, - child:child); - } - - // 监听资源加载完毕,启动,触发事件 - void _listenAppStart(BuildContext context, AppStatus state) { - if (state is AppLoadDone) { - print('::AppLoadDone::启动耗时${state.cost}'); - HttpUtil.instance.rebase(PathUnit.baseUrl); - context.read().initApp(); - context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); - context.read().add(const EventLoadLikeData()); - context.read().add(const EventLoadCategory()); - } - - if (state is AppStartSuccess) { - context.go('/widget'); - } - } -} diff --git a/lib/app_stater/view/error/app_start_error.dart b/lib/app_stater/view/error/app_start_error.dart new file mode 100644 index 00000000..e3c04a68 --- /dev/null +++ b/lib/app_stater/view/error/app_start_error.dart @@ -0,0 +1,22 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +class AppStartErrorPage extends StatelessWidget { + final Object? error; + const AppStartErrorPage({super.key, required this.error}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: DragToMoveWrapper( + child: AppBar( + title: Text("App 启动异常"), + actions: [WindowButtons()], + ), + ), + body: Center( + child: Text(error.toString()), + ), + ); + } +} diff --git a/lib/app_stater/view/flutter_unit_text.dart b/lib/app_stater/view/splash/flutter_unit_text.dart similarity index 100% rename from lib/app_stater/view/flutter_unit_text.dart rename to lib/app_stater/view/splash/flutter_unit_text.dart diff --git a/lib/app_stater/view/standard_unit_splash.dart b/lib/app_stater/view/splash/standard_unit_splash.dart similarity index 100% rename from lib/app_stater/view/standard_unit_splash.dart rename to lib/app_stater/view/splash/standard_unit_splash.dart diff --git a/lib/main.dart b/lib/main.dart index 97953c5a..a7105db1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,16 +1,23 @@ import 'package:app/app.dart'; +import 'package:app_boot_starter/app_boot_starter.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'app/bloc_wrapper.dart'; import 'app/flutter_unit.dart'; - +import 'app_stater/impl/app_start_action.dart'; +import 'app_stater/impl/start_repository.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); //滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; - runApp( BlocWrapper(child: FlutterUnit3())); + runApp( + AppStartScope( + repository: const AppStartRepositoryImpl(), + appStartAction: const AppStartActionImpl(), + child: BlocWrapper(child: FlutterUnit3()), + ), + ); WindowsAdapter.setSize(); } - diff --git a/lib/navigation/routers/app_route.dart b/lib/navigation/routers/app_route.dart index d4207635..039d959e 100644 --- a/lib/navigation/routers/app_route.dart +++ b/lib/navigation/routers/app_route.dart @@ -1,9 +1,10 @@ import 'package:app/app.dart'; +import 'package:app_boot_starter/app_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import '../../app_stater/view/app_start_listener.dart'; -import '../../app_stater/view/standard_unit_splash.dart'; +import '../../app_stater/view/error/app_start_error.dart'; +import '../../app_stater/view/splash/standard_unit_splash.dart'; import 'desk_route.dart'; import 'mobile_route.dart'; @@ -15,13 +16,21 @@ final RouteBase deskAppRoute = GoRoute( GoRoute( path: 'splash', builder: (BuildContext context, GoRouterState state) { - return const AppStartListener(child: FlutterUnitSplash()); + return const AppStartListener( + child: FlutterUnitSplash(), + ); + }, + ), + GoRoute( + path: 'start_error', + builder: (BuildContext context, GoRouterState state) { + return AppStartErrorPage( + error: state.extra, + ); }, ), // isDesk ? : - if(isDesk) - appNavRoute, - if(!isDesk) - ...appMobileNavRoute + if (isDesk) appNavRoute, + if (!isDesk) ...appMobileNavRoute ], ); diff --git a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart index aedc4a02..1853197f 100644 --- a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart +++ b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; @@ -47,4 +48,40 @@ class DragToMoveAreaNoDouble extends StatelessWidget { child: child, ); } +} + +class DragToMoveWrapper extends StatelessWidget implements PreferredSizeWidget{ + final PreferredSizeWidget child; + final bool canDouble; + + const DragToMoveWrapper({ + Key? key, + required this.child, + this.canDouble = false + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool isDesk = kIsWeb || Platform.isMacOS||Platform.isWindows||Platform.isLinux; + if(!isDesk) return child; + return GestureDetector( + behavior: HitTestBehavior.translucent, + onDoubleTap: !canDouble?null:() async{ + bool isMax = await windowManager.isMaximized(); + if(isMax){ + windowManager.unmaximize(); + }else{ + windowManager.maximize(); + + } + }, + onPanStart: (details) { + windowManager.startDragging(); + }, + child: child, + ); + } + + @override + Size get preferredSize => child.preferredSize; } \ No newline at end of file diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart index dbf3c3cb..4774829c 100644 --- a/packages/app/lib/app_config/bloc/bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -35,9 +35,8 @@ class AppConfigBloc extends Cubit { } - // 程序初始化事件处理: 使用 AppStorage 进行初始化 - void initApp() async { - emit(await storage.initApp()); + void init(AppConfigState state){ + emit(state); } AppConfigCao get cao => SpStorage.instance.appConfig; diff --git a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart index 45ffe979..5f5f2ae3 100644 --- a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart +++ b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart @@ -46,7 +46,6 @@ class DbOpenHelper{ if(!result.existsSync()){ result.createSync(recursive: true); } - print('====数据库所在文件夹: $dirPath======='); return dirPath; } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index a0f597e2..29ee339e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -15,6 +15,14 @@ packages: relative: true source: path version: "0.0.1" + app_boot_starter: + dependency: "direct main" + description: + name: app_boot_starter + sha256: "09c5473dc84d054dc5df86a45f7812b32f81a7d6c9ac02a3a04c7351f28893c9" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0" app_update: dependency: "direct main" description: @@ -235,10 +243,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae + sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.3" + version: "8.1.5" flutter_lints: dependency: "direct dev" description: @@ -1045,5 +1053,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.2.3 <4.0.0" + dart: ">=3.3.0 <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4ad976c4..c99cc652 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,9 @@ dependencies: equatable: ^2.0.5 # 相等辅助 stream_transform: ^2.1.0 + ## fx 架构 - app 启动器 + app_boot_starter: ^1.0.0 + package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 webview_flutter: ^4.4.2 From 2520eae69b80dc8c1c67ad94a42a5015a5e14f62 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 3 Apr 2024 15:02:30 +0800 Subject: [PATCH 063/149] =?UTF-8?q?=E5=B8=83=E5=B1=80=E9=9B=86=E5=BD=95?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=B8=AD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/bloc_wrapper.dart | 21 +- packages/app/lib/app_config/bloc/bloc.dart | 3 +- .../lib/app_config/repository/repository.dart | 11 - .../src/articles/view/desk_artifact_page.dart | 10 +- packages/artifact/pubspec.yaml | 2 + packages/authentication/pubspec.yaml | 2 +- packages/layout/.gitignore | 29 ++ packages/layout/.metadata | 10 + packages/layout/CHANGELOG.md | 3 + packages/layout/LICENSE | 1 + packages/layout/README.md | 39 +++ packages/layout/analysis_options.yaml | 4 + packages/layout/lib/layout.dart | 3 + .../layout/lib/src/bloc/display_logic.dart | 39 +++ .../layout/lib/src/bloc/display_state.dart | 26 ++ .../lib/src/data/model/display_frame.dart | 44 +++ .../lib/src/navigation/menu/base_layout.dart | 34 +++ .../layout/lib/src/navigation/menu/flex.dart | 31 ++ .../lib/src/navigation/menu/grid_layout.dart | 25 ++ .../lib/src/navigation/menu/layout.dart | 23 ++ .../navigation/menu/menu_repository_impl.dart | 46 +++ .../lib/src/navigation/router/app_router.dart | 29 ++ .../src/navigation/router/desk_router.dart | 129 ++++++++ .../fade_page_transitions_builder.dart | 19 ++ .../page_route/fade_page_route.dart | 56 ++++ .../page_route/slide_page_route.dart | 50 ++++ .../page_route/zero_page_route.dart | 36 +++ .../transition/size_clip_transition.dart | 105 +++++++ .../cupertino_back_gesture_detector.dart | 277 ++++++++++++++++++ .../slide_page_transition_builder.dart | 33 +++ .../navigation/view/app_desk_navigation.dart | 196 +++++++++++++ .../lib/src/views/base/size/size_display.dart | 20 ++ .../views/base/size/size_loss_by_align.dart | 76 +++++ .../base/size/size_tight_constraint.dart | 27 ++ .../views/base/size/size_unconstraint.dart | 14 + .../src/views/components/grid_xy_layout.dart | 42 +++ .../layout/lib/src/views/layout_page.dart | 62 ++++ .../views/playground/layout_playground.dart | 48 +++ .../playground/playground_bottom_bar.dart | 32 ++ .../views/playground/playground_top_bar.dart | 70 +++++ packages/layout/lib/src/views/test_show.dart | 15 + packages/layout/pubspec.yaml | 60 ++++ packages/layout/test/layout_test.dart | 12 + packages/widget_module/pubspec.yaml | 2 +- pubspec.lock | 29 +- pubspec.yaml | 6 +- 46 files changed, 1814 insertions(+), 37 deletions(-) create mode 100644 packages/layout/.gitignore create mode 100644 packages/layout/.metadata create mode 100644 packages/layout/CHANGELOG.md create mode 100644 packages/layout/LICENSE create mode 100644 packages/layout/README.md create mode 100644 packages/layout/analysis_options.yaml create mode 100644 packages/layout/lib/layout.dart create mode 100644 packages/layout/lib/src/bloc/display_logic.dart create mode 100644 packages/layout/lib/src/bloc/display_state.dart create mode 100644 packages/layout/lib/src/data/model/display_frame.dart create mode 100644 packages/layout/lib/src/navigation/menu/base_layout.dart create mode 100644 packages/layout/lib/src/navigation/menu/flex.dart create mode 100644 packages/layout/lib/src/navigation/menu/grid_layout.dart create mode 100644 packages/layout/lib/src/navigation/menu/layout.dart create mode 100644 packages/layout/lib/src/navigation/menu/menu_repository_impl.dart create mode 100644 packages/layout/lib/src/navigation/router/app_router.dart create mode 100644 packages/layout/lib/src/navigation/router/desk_router.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart create mode 100644 packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart create mode 100644 packages/layout/lib/src/navigation/view/app_desk_navigation.dart create mode 100644 packages/layout/lib/src/views/base/size/size_display.dart create mode 100644 packages/layout/lib/src/views/base/size/size_loss_by_align.dart create mode 100644 packages/layout/lib/src/views/base/size/size_tight_constraint.dart create mode 100644 packages/layout/lib/src/views/base/size/size_unconstraint.dart create mode 100644 packages/layout/lib/src/views/components/grid_xy_layout.dart create mode 100644 packages/layout/lib/src/views/layout_page.dart create mode 100644 packages/layout/lib/src/views/playground/layout_playground.dart create mode 100644 packages/layout/lib/src/views/playground/playground_bottom_bar.dart create mode 100644 packages/layout/lib/src/views/playground/playground_top_bar.dart create mode 100644 packages/layout/lib/src/views/test_show.dart create mode 100644 packages/layout/pubspec.yaml create mode 100644 packages/layout/test/layout_test.dart diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index bb0a6213..7b05e5a6 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -26,7 +26,8 @@ class BlocWrapper extends StatefulWidget { class _BlocWrapperState extends State { final WidgetRepository repository = const WidgetDbRepository(); - final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); + final CategoryBloc categoryBloc = + CategoryBloc(repository: CategoryDbRepository()); final AuthRepository authRepository = HttpAuthRepository(); @override @@ -34,22 +35,16 @@ class _BlocWrapperState extends State { return MultiBlocProvider( providers: [ // 全局 bloc : 维护应用存储状态、更新、认证 - BlocProvider( - create: (_) => AuthBloc(repository: authRepository)), - BlocProvider( - create: (_) => AppConfigBloc(AppStateRepository())), + BlocProvider(create: (_) => AuthBloc(repository: authRepository)), + BlocProvider(create: (_) => AppConfigBloc()), BlocProvider(create: (_) => UpdateBloc()), BlocProvider(create: (_) => UserBloc()), - BlocProvider( - create: (_) => WidgetsBloc(repository: repository)), + BlocProvider(create: (_) => WidgetsBloc(repository: repository)), BlocProvider(create: (_) => categoryBloc), - BlocProvider( - create: (_) => LikeWidgetBloc(repository: repository)), - BlocProvider( - create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), - BlocProvider( - create: (_) => GalleryUnitBloc()..loadGalleryInfo()), + BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), + BlocProvider(create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), + BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), ], child: widget.child, ); diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart index 4774829c..981c7996 100644 --- a/packages/app/lib/app_config/bloc/bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -16,10 +16,9 @@ class AppConfigBloc extends Cubit { final Connectivity _connectivity = Connectivity(); - final AppStateRepository storage; late StreamSubscription _subscription; - AppConfigBloc(this.storage) : super(const AppConfigState()){ + AppConfigBloc() : super(const AppConfigState()){ _subscription = _connectivity.onConnectivityChanged.listen(_onNetConnectChange); } diff --git a/packages/app/lib/app_config/repository/repository.dart b/packages/app/lib/app_config/repository/repository.dart index 239f64e1..8b137891 100644 --- a/packages/app/lib/app_config/repository/repository.dart +++ b/packages/app/lib/app_config/repository/repository.dart @@ -1,12 +1 @@ -import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:storage/storage.dart'; -import '../bloc/state.dart'; -class AppStateRepository { - - Future initApp() async { - AppConfigPo po = await SpStorage.instance.appConfig.read(); - ConnectivityResult netConnect = await (Connectivity().checkConnectivity()); - return AppConfigState.fromPo(po).copyWith(netConnect: netConnect); - } -} diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart index e3f5d680..a81cc61a 100644 --- a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -3,6 +3,7 @@ import 'package:artifact/artifact.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:layout/layout.dart'; import 'package:url_launcher/url_launcher.dart'; import '../bloc/exp.dart'; @@ -18,7 +19,7 @@ class DeskKnowledgePage extends StatefulWidget { State createState() => _DeskKnowledgePageState(); } -class _DeskKnowledgePageState extends State with SingleTickerProviderStateMixin{ +class _DeskKnowledgePageState extends State with SingleTickerProviderStateMixin,AutomaticKeepAliveClientMixin{ late TabController controller; List data = []; @@ -48,17 +49,17 @@ class _DeskKnowledgePageState extends State with SingleTicke DeskKnowledgeTabTopBar(onTabPressed: (int value) { controller.index = value; }, tabs: [ + context.l10n.knowledgeTabLayout, context.l10n.knowledgeTabToly, context.l10n.knowledgeTabAlgo, - context.l10n.knowledgeTabLayout, context.l10n.knowledgeTabPoint, ],), Expanded(child: TabBarView( controller: controller, children: [ + LayoutRouterPage(), TolyArticlesPage(), SoreAlgoPage(), - BuildingPanel(), DeskPointPage(), ], )) @@ -77,6 +78,9 @@ class _DeskKnowledgePageState extends State with SingleTicke }); } } + + @override + bool get wantKeepAlive => true; } class TolyArticlesPage extends StatelessWidget { diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 0b904525..2e1e2923 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -23,6 +23,8 @@ dependencies: path: ../components utils: path: ../utils + layout: + path: ../layout app: path: ../app l10n: diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index 7eff59e9..c9bf30b6 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: flutter_bloc: ^8.1.3 # 状态管理 equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.1 # xml 固化 - go_router: ^12.1.1 + go_router: ^13.2.2 utils: path: ../utils app_update: diff --git a/packages/layout/.gitignore b/packages/layout/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/packages/layout/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/packages/layout/.metadata b/packages/layout/.metadata new file mode 100644 index 00000000..2b377030 --- /dev/null +++ b/packages/layout/.metadata @@ -0,0 +1,10 @@ +# 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: "7482962148e8d758338d8a28f589f317e1e42ba4" + channel: "stable" + +project_type: package diff --git a/packages/layout/CHANGELOG.md b/packages/layout/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/packages/layout/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/layout/LICENSE b/packages/layout/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/packages/layout/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/layout/README.md b/packages/layout/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/packages/layout/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/layout/analysis_options.yaml b/packages/layout/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/layout/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/layout/lib/layout.dart b/packages/layout/lib/layout.dart new file mode 100644 index 00000000..bc7cbf6d --- /dev/null +++ b/packages/layout/lib/layout.dart @@ -0,0 +1,3 @@ +library layout; + +export 'src/views/layout_page.dart'; \ No newline at end of file diff --git a/packages/layout/lib/src/bloc/display_logic.dart b/packages/layout/lib/src/bloc/display_logic.dart new file mode 100644 index 00000000..c935622d --- /dev/null +++ b/packages/layout/lib/src/bloc/display_logic.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +import 'display_state.dart'; + +class DisplayLogic with ChangeNotifier { + DisplayLogic(this._state); + + DisplayState _state; + + DisplayState get state => _state; + + bool get enableNext => _state.activeIndex < _state.total-1; + bool get enablePrev => _state.activeIndex > 0; + + void nextPage() { + if(enableNext){ + _state = _state.copyWith(activeIndex: _state.activeIndex+1); + notifyListeners(); + } + } + + void prevPage() { + if(enablePrev){ + _state = _state.copyWith(activeIndex: _state.activeIndex-1); + notifyListeners(); + } + } +} + +class DisplayScope extends InheritedNotifier { + const DisplayScope({ + required super.notifier, + required super.child, + super.key, + }); + + static DisplayLogic of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; +} diff --git a/packages/layout/lib/src/bloc/display_state.dart b/packages/layout/lib/src/bloc/display_state.dart new file mode 100644 index 00000000..480afd68 --- /dev/null +++ b/packages/layout/lib/src/bloc/display_state.dart @@ -0,0 +1,26 @@ +import 'package:layout/src/data/model/display_frame.dart'; + +class DisplayState { + final String router; + final int activeIndex; + final int total; + + DisplayState({ + required this.router, + required this.activeIndex, + required this.total, + }); + + DisplayFrame get frame => kDisplayMap[router]![activeIndex]; + + DisplayState copyWith({ + int? total, + int? activeIndex, + String? router, + }) => + DisplayState( + router: router ?? this.router, + activeIndex: activeIndex ?? this.activeIndex, + total: total ?? this.total, + ); +} diff --git a/packages/layout/lib/src/data/model/display_frame.dart b/packages/layout/lib/src/data/model/display_frame.dart new file mode 100644 index 00000000..60d4bf93 --- /dev/null +++ b/packages/layout/lib/src/data/model/display_frame.dart @@ -0,0 +1,44 @@ +import 'package:flutter/cupertino.dart'; + +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_unconstraint.dart'; + +class DisplayFrame { + final String title; + final String desc; + final String src; + final WidgetBuilder display; + + DisplayFrame({ + required this.title, + required this.desc, + required this.src, + required this.display, + }); +} + +Map> get kDisplayMap => { + '/base/size': [ + DisplayFrame( + title: '父级中的紧约束', + desc: "当前虽然指定 SizeBox 宽高为 150*100。但由于父级的紧约束被强制固定尺寸。" + "下一步,将父级的紧约束改为宽松约束。", + src: '', + display: (BuildContext context) => const SizeTightConstraint(info: "受到紧约束\n尺寸无法生效",), + ), + DisplayFrame( + title: '用布局组件放宽父级约束', + desc: "通过嵌套 Align、Row、Column、Flex、Scaffold 等组件, 提供一个宽松的父级约束,让 SizeBox 指定的尺寸可以生效" + "就可以生效。", + src: '', + display: (BuildContext context) => const LossDisplay(), + ), + DisplayFrame( + title: '用 UnconstrainedBox 组件解除约束', + desc: "通过嵌套 UnconstrainedBox 组件,可以解除之前父级对当前区域的约束,从而使指定尺寸生效。", + src: '', + display: (BuildContext context) => const SizeUnconstrain(), + ), + ] + }; diff --git a/packages/layout/lib/src/navigation/menu/base_layout.dart b/packages/layout/lib/src/navigation/menu/base_layout.dart new file mode 100644 index 00000000..ddbf71cf --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/base_layout.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get baseMenus => { + 'path': '/base', + 'icon': Icons.layers_rounded, + 'label': '基本布局', + 'children': [ + { + 'path': '/size', + 'label': '布局尺寸', + }, + { + 'path': '/padding', + 'label': '布局边距', + // 'icon': Icons.calculate_outlined, + }, + { + 'path': '/align', + 'label': '布局对齐', + // 'icon': Icons.calculate_outlined, + }, + { + 'path': '/positioned', + 'label': '布局定位', + // 'icon': Icons.calculate_outlined, + }, + // { + // 'path': '/parser', + // 'label': '文字解析器', + // 'icon': Icons.text_fields, + // }, + ] +}; diff --git a/packages/layout/lib/src/navigation/menu/flex.dart b/packages/layout/lib/src/navigation/menu/flex.dart new file mode 100644 index 00000000..e7a98182 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/flex.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get drawMenus => { + 'path': '/flex', + // 'icon': FxIcon.icon_paint, + 'icon':Icons.local_florist, + 'label': '行列布局', + 'children': [ + { + 'path': '/row', + 'label': '行布局', + // 'icon': Icons.text_fields, + }, + { + 'path': '/column', + 'label': '列布局', + // 'icon': Icons.text_fields, + }, + { + 'path': '/expanded', + 'label': '延展布局', + // 'icon': Icons.text_fields, + }, + { + 'path': '/holy', + 'label': '圣杯布局', + // 'icon': Icons.text_fields, + }, + ] +}; diff --git a/packages/layout/lib/src/navigation/menu/grid_layout.dart b/packages/layout/lib/src/navigation/menu/grid_layout.dart new file mode 100644 index 00000000..0216c635 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/grid_layout.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get calcMenus => { + 'path': '/grid', + 'icon': Icons.grid_4x4, + 'label': '网格布局', + // 'children': [ + // { + // 'path': '/calculator', + // 'label': '计数器', + // 'icon': Icons.calculate_outlined, + // }, + // { + // 'path': '/date', + // 'label': '日期计算', + // 'icon': Icons.date_range, + // }, + // // { + // // 'path': '/parser', + // // 'label': '文字解析器', + // // 'icon': Icons.text_fields, + // // }, + // ] +}; diff --git a/packages/layout/lib/src/navigation/menu/layout.dart b/packages/layout/lib/src/navigation/menu/layout.dart new file mode 100644 index 00000000..501a56e6 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/layout.dart @@ -0,0 +1,23 @@ + +// import '../../../app/res/fx_icon.dart'; + +import 'package:flutter/material.dart'; + +Map home = { + 'path': '/home', + 'label': '布局总览', + 'icon': Icons.dashboard + + // 'children': [ + // { + // 'icon': Icons.home, + // 'path': '/home', + // 'label': '首页', + // }, + // { + // 'path': '/collect', + // 'label': '我的收藏', + // 'icon': Icons.collections_bookmark_outlined, + // }, + // ], +}; \ No newline at end of file diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart new file mode 100644 index 00000000..9d1bfe85 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -0,0 +1,46 @@ +import 'dart:async'; + +import 'package:toly_menu/toly_menu.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; + +import 'base_layout.dart'; +import 'grid_layout.dart'; +import 'layout.dart'; +import 'flex.dart'; + +class MenuRepositoryImpl implements MenuRepository { + + @override + FutureOr loadRootMenu() { + print("========loadRootMenu=========="); + return MenuNode.fromMap({ + 'children': [ + home, + baseMenus, + drawMenus, + calcMenus, + ] + }); + } + + @override + FutureOr<(List, String)> loadMenuActiveState() { + return (['/base'],'/base/size'); + } + + @override + FutureOr> loadMenuHistory() { + + return []; + } + + @override + FutureOr saveMenuHistory(MenuHistory history) { + + } + + @override + FutureOr deleteMenuHistory(MenuHistory history) { + + } +} diff --git a/packages/layout/lib/src/navigation/router/app_router.dart b/packages/layout/lib/src/navigation/router/app_router.dart new file mode 100644 index 00000000..ebdc49ad --- /dev/null +++ b/packages/layout/lib/src/navigation/router/app_router.dart @@ -0,0 +1,29 @@ + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + + +import '../../../layout.dart'; +import 'desk_router.dart'; + + + + RouteBase get layoutRoutes => GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + + + // GoRoute( + // path: 'start_error', + // builder: (BuildContext context, GoRouterState state) { + // return AppStartFixListener( + // child: ErrorPage( + // error: state.extra.toString(), + // ), + // ); + // }, + // ), + deskNavRoute + ], +); diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/packages/layout/lib/src/navigation/router/desk_router.dart new file mode 100644 index 00000000..d4d8b723 --- /dev/null +++ b/packages/layout/lib/src/navigation/router/desk_router.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_menu_manager/view/menu_router_scope.dart'; + +import '../../../layout.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_display.dart'; +import '../../views/test_show.dart'; +import '../menu/menu_repository_impl.dart'; +import '../view/app_desk_navigation.dart'; + + + RouteBase get deskNavRoute => ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return MenuRouterScope( + repository: MenuRepositoryImpl(), + child: AppDeskNavigation(content: child), + ); + }, + routes: [ + GoRoute( + path: 'home', + builder: (BuildContext context, GoRouterState state) { + return const LayoutPage(); + }, + ), + GoRoute( + path: 'base', + redirect: (_, state) { + if (state.fullPath == '/base') { + return '/base/size'; + } + return null; + }, + routes: [ + GoRoute( + path: 'size', + builder: (BuildContext context, GoRouterState state) { + return SizeDisplay(); + }, + ), + GoRoute( + path: 'padding', + builder: (BuildContext context, GoRouterState state) { + return TextShow( + info: 'padding', + ); + }, + ), + // GoRoute( + // path: 'home', + // builder: (BuildContext context, GoRouterState state) { + // return const HomePage(); + // }, + // ), + // GoRoute( + // path: 'collect', + // builder: (BuildContext context, GoRouterState state) { + // return const CollectPage(); + // }, + // ) + ]), + GoRoute( + path: 'flex', + builder: (_,__)=>Text("暂未实现"), + routes: [ + GoRoute( + path: 'row', + builder: (BuildContext context, GoRouterState state) { + return TextShow( + info: 'row', + ); + }, + ), + GoRoute( + path: 'column', + builder: (BuildContext context, GoRouterState state) { + return TextShow( + info: 'column', + ); + }, + ), GoRoute( + path: 'expanded', + builder: (BuildContext context, GoRouterState state) { + return TextShow( + info: 'expanded', + ); + }, + ), + GoRoute( + path: 'holy', + builder: (BuildContext context, GoRouterState state) { + return TextShow( + info: 'holy', + ); + }, + ), + ] + ), + + // GoRoute( + // path: 'text/gen/secret', + // builder: (BuildContext context, GoRouterState state) { + // return SecretGenPage(); + // }, + // ), + // GoRoute( + // path: 'text/:name', + // pageBuilder: (BuildContext context, GoRouterState state) { + // return CustomTransitionPage( + // key: ValueKey(state.uri.path), + // // transitionDuration: const Duration(milliseconds: 500), + // // reverseTransitionDuration: const Duration(milliseconds: 500), + // child: ToolListPanel( + // key: ValueKey(state.fullPath??''), + // name: state.pathParameters['name'] ?? ''), + // transitionsBuilder: (BuildContext context, + // Animation animation, + // Animation secondaryAnimation, + // Widget child) { + // return FadeTransition( + // opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + // child: child, + // ); + // }); + // }, + // ), + ]); diff --git a/packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart b/packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart new file mode 100644 index 00000000..d0e9e3f0 --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FadePageTransitionsBuilder extends PageTransitionsBuilder { + const FadePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return FadeTransition( + opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + child: child, + ); + } +} diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart b/packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart new file mode 100644 index 00000000..01b5015f --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart @@ -0,0 +1,56 @@ +//渐变透明路由动画 +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class FadePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + final Curve? curve; + + FadePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + + if (curve != null) { + animation = CurvedAnimation( + parent: animation, + curve: curve!, + ); + } + + return FadeTransition( + opacity: Tween(begin: 0.1, end: 1.0).animate(animation), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart b/packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart new file mode 100644 index 00000000..2cb92871 --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart @@ -0,0 +1,50 @@ +//右--->左 +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + + +class SlidePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + + SlidePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child); + } + final bool linearTransition = isPopGestureInProgress(this); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart b/packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart new file mode 100644 index 00000000..a6c0ca8b --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart @@ -0,0 +1,36 @@ + +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class ZeroPageRoute extends MaterialPageRoute { + final Widget child; + + + ZeroPageRoute({ + required this.child, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + return child; + } + + @override + Duration get transitionDuration => Duration.zero; +} diff --git a/packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart b/packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart new file mode 100644 index 00000000..f3fa0f5c --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart @@ -0,0 +1,105 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SizeClipTransition extends StatelessWidget { + final Animation animation; + final Animation secondaryAnimation; + final Widget child; + + const SizeClipTransition({ + super.key, + required this.animation, + required this.secondaryAnimation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), + child: child, + ); + } +} + +class SizePathClipper extends CustomClipper { + final double progress; + + SizePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height, + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant SizePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class ScalePathClipper extends CustomClipper { + final double progress; + + ScalePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height* (1 - progress), + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant ScalePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class CirclePathClipper extends CustomClipper { + final double progress; + + CirclePathClipper(this.progress); + + @override + Path getClip(Size size) { + print('progress:$progress'); + if(progress==0){ + return Path(); + } + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCircle( + center: Offset(size.width , 0), + radius: sqrt(size.width*size.width+size.height*size.height) * (progress), + ); + + Path zone = Path()..addRect(box); + Path cliper = Path()..addOval(center); + + return Path.combine(PathOperation.intersect, zone, cliper ); + } + + @override + bool shouldReclip(covariant CirclePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} \ No newline at end of file diff --git a/packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart b/packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart new file mode 100644 index 00000000..53bec7e3 --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart @@ -0,0 +1,277 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +// The maximum time for a page to get reset to it's original position if the +// user releases a page mid swipe. +const int _kMaxPageBackAnimationTime = 300; // Milliseconds. +const double _kBackGestureWidth = 20.0; +const double _kMinFlingVelocity = 1.0; // Screen widths per second. + +// An eyeballed value for the maximum time it takes for a page to animate forward +// if the user releases a page mid swipe. +const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. + +/// This is the widget side of [CupertinoBackGestureController]. +/// +/// This widget provides a gesture recognizer which, when it determines the +/// route can be closed with a back gesture, creates the controller and +/// feeds it the input from the gesture recognizer. +/// +/// The gesture data is converted from absolute coordinates to logical +/// coordinates by this widget. +/// +/// The type `T` specifies the return type of the route with which this gesture +/// detector is associated. +class CupertinoBackGestureDetector extends StatefulWidget { + const CupertinoBackGestureDetector({ + super.key, + required this.enabledCallback, + required this.onStartPopGesture, + required this.child, + }); + + final Widget child; + + final ValueGetter enabledCallback; + + final ValueGetter> onStartPopGesture; + + @override + _CupertinoBackGestureDetectorState createState() => _CupertinoBackGestureDetectorState(); +} + +class _CupertinoBackGestureDetectorState extends State> { + CupertinoBackGestureController? _backGestureController; + + late HorizontalDragGestureRecognizer _recognizer; + + @override + void initState() { + super.initState(); + _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) + ..onStart = _handleDragStart + ..onUpdate = _handleDragUpdate + ..onEnd = _handleDragEnd + ..onCancel = _handleDragCancel; + } + + @override + void dispose() { + _recognizer.dispose(); + super.dispose(); + } + + void _handleDragStart(DragStartDetails details) { + assert(mounted); + assert(_backGestureController == null); + _backGestureController = widget.onStartPopGesture(); + } + + void _handleDragUpdate(DragUpdateDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragUpdate(_convertToLogical(details.primaryDelta! / context.size!.width)); + } + + void _handleDragEnd(DragEndDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragEnd(_convertToLogical(details.velocity.pixelsPerSecond.dx / context.size!.width)); + _backGestureController = null; + } + + void _handleDragCancel() { + assert(mounted); + // This can be called even if start is not called, paired with the "down" event + // that we don't consider here. + _backGestureController?.dragEnd(0.0); + _backGestureController = null; + } + + void _handlePointerDown(PointerDownEvent event) { + if (widget.enabledCallback()) { + _recognizer.addPointer(event); + } + } + + double _convertToLogical(double value) { + switch (Directionality.of(context)) { + case TextDirection.rtl: + return -value; + case TextDirection.ltr: + return value; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasDirectionality(context)); + // For devices with notches, the drag area needs to be larger on the side + // that has the notch. + double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? + MediaQuery.paddingOf(context).left : + MediaQuery.paddingOf(context).right; + dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); + return Stack( + fit: StackFit.passthrough, + children: [ + widget.child, + PositionedDirectional( + start: 0.0, + width: dragAreaWidth, + top: 0.0, + bottom: 0.0, + child: Listener( + onPointerDown: _handlePointerDown, + behavior: HitTestBehavior.translucent, + ), + ), + ], + ); + } +} + + +class CupertinoBackGestureController { + /// Creates a controller for an iOS-style back gesture. + /// + /// The [navigator] and [controller] arguments must not be null. + CupertinoBackGestureController({ + required this.navigator, + required this.controller, + }) { + navigator.didStartUserGesture(); + } + + final AnimationController controller; + final NavigatorState navigator; + + /// The drag gesture has changed by [fractionalDelta]. The total range of the + /// drag should be 0.0 to 1.0. + void dragUpdate(double delta) { + controller.value -= delta; + } + + /// The drag gesture has ended with a horizontal motion of + /// [fractionalVelocity] as a fraction of screen width per second. + void dragEnd(double velocity) { + // Fling in the appropriate direction. + // AnimationController.fling is guaranteed to + // take at least one frame. + // + // This curve has been determined through rigorously eyeballing native iOS + // animations. + const Curve animationCurve = Curves.fastLinearToSlowEaseIn; + final bool animateForward; + + // If the user releases the page before mid screen with sufficient velocity, + // or after mid screen, we should animate the page out. Otherwise, the page + // should be animated back in. + if (velocity.abs() >= _kMinFlingVelocity) { + animateForward = velocity <= 0; + } else { + animateForward = controller.value > 0.5; + } + + if (animateForward) { + // The closer the panel is to dismissing, the shorter the animation is. + // We want to cap the animation time, but we want to use a linear curve + // to determine it. + final int droppedPageForwardAnimationTime = min( + lerpDouble(_kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!.floor(), + _kMaxPageBackAnimationTime, + ); + controller.animateTo(1.0, duration: Duration(milliseconds: droppedPageForwardAnimationTime), curve: animationCurve); + } else { + // This route is destined to pop at this point. Reuse navigator's pop. + navigator.pop(); + + // The popping may have finished inline if already at the target destination. + if (controller.isAnimating) { + // Otherwise, use a custom popping animation duration and curve. + final int droppedPageBackAnimationTime = lerpDouble(0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!.floor(); + controller.animateBack(0.0, duration: Duration(milliseconds: droppedPageBackAnimationTime), curve: animationCurve); + } + } + + if (controller.isAnimating) { + // Keep the userGestureInProgress in true state so we don't change the + // curve of the page transition mid-flight since CupertinoPageTransition + // depends on userGestureInProgress. + late AnimationStatusListener animationStatusCallback; + animationStatusCallback = (AnimationStatus status) { + navigator.didStopUserGesture(); + controller.removeStatusListener(animationStatusCallback); + }; + controller.addStatusListener(animationStatusCallback); + } else { + navigator.didStopUserGesture(); + } + } +} + +// Called by _CupertinoBackGestureDetector when a pop ("back") drag start +// gesture is detected. The returned controller handles all of the subsequent +// drag events. +CupertinoBackGestureController startPopGesture(PageRoute route) { + return CupertinoBackGestureController( + navigator: route.navigator!, + controller: route.controller!, // protected access + ); +} + +bool isPopGestureEnabled(PageRoute route) { + print( + "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); +// If there's nothing to go back to, then obviously we don't support +// the back gesture. + if (route.isFirst) { + return false; + } +// If the route wouldn't actually pop if we popped it, then the gesture +// would be really confusing (or would skip internal routes), so disallow it. + if (route.willHandlePopInternally) { + return false; + } +// If attempts to dismiss this route might be vetoed such as in a page +// with forms, then do not allow the user to dismiss the route with a swipe. + if (route.hasScopedWillPopCallback) { + return false; + } +// Fullscreen dialogs aren't dismissible by back swipe. + if (route.fullscreenDialog) { + return false; + } +// If we're in an animation already, we cannot be manually swiped. + if (route.animation!.status != AnimationStatus.completed) { + return false; + } +// If we're being popped into, we also cannot be swiped until the pop above +// it completes. This translates to our secondary animation being +// dismissed. + if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { + return false; + } +// If we're in a gesture already, we cannot start another. + if (isPopGestureInProgress(route)) { + return false; + } + +// Looks like a back gesture would be welcome! + return true; +} + +/// True if an iOS-style back swipe pop gesture is currently underway for [route]. +/// +/// This just check the route's [NavigatorState.userGestureInProgress]. +/// +/// See also: +/// +/// * [popGestureEnabled], which returns true if a user-triggered pop gesture +/// would be allowed. +bool isPopGestureInProgress(PageRoute route) { + return route.navigator!.userGestureInProgress; +} diff --git a/packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart b/packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart new file mode 100644 index 00000000..fd027cd4 --- /dev/null +++ b/packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart @@ -0,0 +1,33 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + +class SlidePageTransitionsBuilder extends PageTransitionsBuilder { + const SlidePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(route!), + onStartPopGesture: () => startPopGesture(route!), + child: child); + } + final bool linearTransition = isPopGestureInProgress(route!); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } +} \ No newline at end of file diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart new file mode 100644 index 00000000..3ba685bc --- /dev/null +++ b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -0,0 +1,196 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_menu/toly_menu.dart'; +import 'package:toly_menu_manager/bloc/state.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; +import 'package:toly_menu_manager/view/menu_task_builder.dart'; + +import '../../views/playground/layout_playground.dart'; + +class AppDeskNavigation extends StatelessWidget { + final Widget content; + + const AppDeskNavigation({super.key, required this.content}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + DeskNavigationRail(), + Expanded(child: LayoutPlayGround( + content : Column( + children: [ + MenuHistoryChangeListener(onRouterChanged: _onActiveChanged, + child: MenuRecordTab(onCloseHistory: _onCloseHistory, onTapHistory: _onTapHistory)), + Expanded(child: content), + ], + ), + )), + ], + ), + ); + } + + void _onCloseHistory(BuildContext context,MenuHistory history) { + context.removeHistory(history); + } + + void _onTapHistory(BuildContext context,String path) { + print("======_onTapHistory:$path================="); + context.activeHistory(path); + + } + + void _onActiveChanged(BuildContext context,String? value) { + if(value!=null){ + context.go(value); + } + } +} + +class DeskNavigationRail extends StatefulWidget { + final RangeValues rangeDx; + final double width; + + const DeskNavigationRail({ + super.key, + this.rangeDx = const RangeValues(160, 360), + this.width = 200, + }); + + @override + State createState() => _DeskNavigationRailState(); +} + +class _DeskNavigationRailState extends State { + late double _width = widget.width; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: _width, + child: Stack( + alignment: Alignment.centerRight, + children: [ + TolyMenuRail(), + DragChangeWidth( + onDragChanged: handleWidthChange, + ) + ], + ), + ); + } + + void handleWidthChange(double dx) { + double width = + (_width + dx).clamp(widget.rangeDx.start, widget.rangeDx.end); + if (width != _width) { + _width = width; + setState(() {}); + } + } +} + +class DragChangeWidth extends StatelessWidget { + final ValueChanged onDragChanged; + + const DragChangeWidth({super.key, required this.onDragChanged}); + + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: SystemMouseCursors.resizeColumn, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onHorizontalDragUpdate: _onHorizontalDragUpdate, + child: Container( + width: 6, + alignment: Alignment.centerRight, + // color: Colors.grey, + child: const VerticalDivider(), + ), + ), + ); + } + + void _onHorizontalDragUpdate(DragUpdateDetails details) { + onDragChanged(details.delta.dx); + } +} + +class TolyMenuRail extends StatefulWidget { + const TolyMenuRail({super.key}); + + @override + State createState() => _TolyMenuRailState(); +} + +class _TolyMenuRailState extends State { + + @override + Widget build(BuildContext context) { + return MenuLoadTaskBuilder( + builder: (_, task) => switch (task) { + MenuLoading() => Center(child: CupertinoActivityIndicator()), + MenuLoadSuccess() => MenuRouterChangeListener( + onRouterChanged: (BuildContext context, String? path) { + if(path!=null){ + // print("=====go:${path}================="); + + context.go(path); + } + }, + child: TolyMenu( + activeColor: Color(0xffe6edf3), + backgroundColor: Colors.white, + expandBackgroundColor: Colors.white, + labelTextStyle: TextStyle(color: Color(0xff2d3a53)), + state: task.state, + onSelect: _onSelect, + ), + ), + MenuLoadFailed() => Text('${task.error.toString()}'), + }, + ); + // return TolyMenu( + // // activeColor: Color(0xffe6edf3), + // // backgroundColor: Colors.white, + // // expandBackgroundColor: Colors.white, + // // labelTextStyle: TextStyle(color: Color(0xff2d3a53)), + // state: state, + // onSelect: _onSelect, + // ); + } + + + + void _onSelect(MenuNode menu) { + print(menu.path); + context.selectMenu(menu); + // if (menu.isLeaf) { + // state = state.copyWith(activeMenu: menu.path); + // } else { + // List menus = []; + // String path = menu.path.substring(1); + // List parts = path.split('/'); + // + // if (parts.isNotEmpty) { + // String path = ''; + // for (String part in parts) { + // path += '/$part'; + // menus.add(path); + // } + // } + // + // if (state.expandMenus.contains(menu.path)) { + // menus.remove(menu.path); + // } + // + // state = state.copyWith(expandMenus: menus); + // } + // setState(() {}); + } +} diff --git a/packages/layout/lib/src/views/base/size/size_display.dart b/packages/layout/lib/src/views/base/size/size_display.dart new file mode 100644 index 00000000..ff4fd344 --- /dev/null +++ b/packages/layout/lib/src/views/base/size/size_display.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +import '../../../bloc/display_logic.dart'; +import '../../../data/model/display_frame.dart'; +import 'size_loss_by_align.dart'; +import 'size_tight_constraint.dart'; + +class SizeDisplay extends StatelessWidget { + const SizeDisplay({super.key}); + + @override + Widget build(BuildContext context) { + DisplayFrame frame = DisplayScope.of(context).state.frame; + return Material( + color: Colors.transparent, + elevation: 0, + child: frame.display(context)); + + } +} diff --git a/packages/layout/lib/src/views/base/size/size_loss_by_align.dart b/packages/layout/lib/src/views/base/size/size_loss_by_align.dart new file mode 100644 index 00000000..3d018ca7 --- /dev/null +++ b/packages/layout/lib/src/views/base/size/size_loss_by_align.dart @@ -0,0 +1,76 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:layout/src/views/components/grid_xy_layout.dart'; + +import 'size_tight_constraint.dart'; + +class LossDisplay extends StatelessWidget { + const LossDisplay({super.key}); + + @override + Widget build(BuildContext context) { + return GridXYLayout( + capacity: (2, 2), + xyBuilder: ((int, int) pos) => switch (pos) { + (0, 0) => const Align(child: SizeTightConstraint(info: 'Align 放宽约束')), + (0, 1) => const Row(children: [SizeTightConstraint(info: 'Row 放宽约束')]), + (1, 0) => const Scaffold( + backgroundColor: Colors.transparent, + body: SizeTightConstraint(info: 'Scaffold 放宽约束'), + ), + (1, 1) => const Column( + children: [SizeTightConstraint(info: 'Column 放宽约束')], + ), + _ => const SizedBox() + }, + ); + } +} + +class SizeLossByAlign extends StatelessWidget { + const SizeLossByAlign({super.key}); + + @override + Widget build(BuildContext context) { + return const Align( + alignment: Alignment.topCenter, + child: ColoredBox( + color: Colors.redAccent, + child: SizedBox( + width: 120, + height: 80, + child: Center( + child: Text( + 'Align 放宽约束', + style: TextStyle(color: Colors.white), + )), + ), + ), + ); + } +} + +class SizeLossByRow extends StatelessWidget { + const SizeLossByRow({super.key}); + + @override + Widget build(BuildContext context) { + return const Row( + children: [ + ColoredBox( + color: Colors.redAccent, + child: SizedBox( + width: 150, + height: 100, + child: Center( + child: Text( + 'Row 放宽约束', + style: TextStyle(color: Colors.white), + )), + ), + ), + ], + ); + } +} diff --git a/packages/layout/lib/src/views/base/size/size_tight_constraint.dart b/packages/layout/lib/src/views/base/size/size_tight_constraint.dart new file mode 100644 index 00000000..e129a0d2 --- /dev/null +++ b/packages/layout/lib/src/views/base/size/size_tight_constraint.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class SizeTightConstraint extends StatelessWidget { + final String info; + + const SizeTightConstraint({super.key, required this.info}); + + @override + Widget build(BuildContext context) { + Color color = Theme.of(context).primaryColor; + return LayoutBuilder( + builder: (ctx,cts)=>ColoredBox( + color: color, + child: SizedBox( + width: 150, + height: 100, + child: Center( + child: Text( + '$info\n当前约束:\n${cts.toString().replaceAll('BoxConstraints', '')}', + style: const TextStyle(color: Colors.white), + textAlign: TextAlign.center, + )), + ), + ), + ); + } +} diff --git a/packages/layout/lib/src/views/base/size/size_unconstraint.dart b/packages/layout/lib/src/views/base/size/size_unconstraint.dart new file mode 100644 index 00000000..893b102c --- /dev/null +++ b/packages/layout/lib/src/views/base/size/size_unconstraint.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/size/size_tight_constraint.dart'; + +class SizeUnconstrain extends StatelessWidget { + const SizeUnconstrain({super.key}); + + @override + Widget build(BuildContext context) { + return UnconstrainedBox( + child: SizeTightConstraint(info: "通过 UnconstrainedBox 解除约束",), + ); + } +} + diff --git a/packages/layout/lib/src/views/components/grid_xy_layout.dart b/packages/layout/lib/src/views/components/grid_xy_layout.dart new file mode 100644 index 00000000..f2b9455a --- /dev/null +++ b/packages/layout/lib/src/views/components/grid_xy_layout.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +typedef XYBuilder = Function((int x, int y)); + +class GridXYLayout extends StatelessWidget { + final (int, int) capacity; + final XYBuilder xyBuilder; + final bool hasLine; + + const GridXYLayout({ + super.key, + this.capacity = (2, 2), + required this.xyBuilder, + this.hasLine = true, + }); + + @override + Widget build(BuildContext context) { + List children = []; + for (int i = 0; i < capacity.$1; i++) { + List columnChildren = []; + for (int j = 0; j < capacity.$2; j++) { + columnChildren.add(Expanded(child: xyBuilder((i, j)))); + if (hasLine && j != capacity.$2 - 1) { + columnChildren.add(Divider()); + } + } + children.add(Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: columnChildren, + ))); + if (hasLine && i != capacity.$1 - 1) { + children.add(VerticalDivider()); + } + } + return Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: children, + ); + } +} diff --git a/packages/layout/lib/src/views/layout_page.dart b/packages/layout/lib/src/views/layout_page.dart new file mode 100644 index 00000000..c250df2d --- /dev/null +++ b/packages/layout/lib/src/views/layout_page.dart @@ -0,0 +1,62 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:go_router/go_router.dart'; +import 'package:layout/src/navigation/router/app_router.dart'; + +import '../bloc/display_logic.dart'; +import '../bloc/display_state.dart'; +import '../data/model/display_frame.dart'; + +class LayoutRouterPage extends StatefulWidget { + LayoutRouterPage({super.key}); + + @override + State createState() => _LayoutRouterPageState(); +} + +class _LayoutRouterPageState extends State { + final GoRouter _router = GoRouter( + initialLocation: '/base/size', + routes: [layoutRoutes], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go('/404', extra: state.uri.toString()); + }, + ); + + late final DisplayLogic logic; + + @override + void initState() { + logic = DisplayLogic(DisplayState( + router: '/base/size', + activeIndex: 0, + total: kDisplayMap['/base/size']!.length, + )); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return DisplayScope( + notifier: logic, + child: Column( + children: [ + Divider(), + Expanded(child: Router.withConfig(config: _router)), + ], + ), + ); + } +} + +class LayoutPage extends StatelessWidget { + const LayoutPage({super.key}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.white, child: const Center(child: Text("TODO"))); + } +} diff --git a/packages/layout/lib/src/views/playground/layout_playground.dart b/packages/layout/lib/src/views/playground/layout_playground.dart new file mode 100644 index 00000000..2ac2f8c4 --- /dev/null +++ b/packages/layout/lib/src/views/playground/layout_playground.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +import 'playground_bottom_bar.dart'; +import 'playground_top_bar.dart'; + +class LayoutPlayGround extends StatelessWidget { + final Widget content; + + const LayoutPlayGround({ + super.key, + required this.content, + }); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PlaygroundTopBar(), + Divider(), + // Padding( + // padding: const EdgeInsets.only(left: 24,top: 12), + // child: Text("), + // ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24.0, + vertical: 24 + ), + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.withOpacity(0.4) + ), + ), + child: content, + ), + )), + Divider(), + PlaygroundBottomBar() + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/playground_bottom_bar.dart b/packages/layout/lib/src/views/playground/playground_bottom_bar.dart new file mode 100644 index 00000000..c1a22ecc --- /dev/null +++ b/packages/layout/lib/src/views/playground/playground_bottom_bar.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/bloc/display_logic.dart'; +import 'package:toly_menu/toly_menu.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; + +import '../../data/model/display_frame.dart'; + +class PlaygroundBottomBar extends StatelessWidget { + const PlaygroundBottomBar({super.key}); + + @override + Widget build(BuildContext context) { + DisplayFrame frame = DisplayScope.of(context).state.frame; + return Container( + width: double.maxFinite, + color: Color(0xfff2f2f2), + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 4), + // height: 24, + child: Text( + frame.desc, + style: TextStyle(fontSize: 12, fontFamily: '宋体'), + ), + // child: NavigationToolbar( + // centerMiddle: true, + // middle: Text("${menu??'布局测试'}"), + // trailing: IconButton(onPressed: (){ + // + // }, icon: Icon(Icons.code)), + // ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/playground_top_bar.dart b/packages/layout/lib/src/views/playground/playground_top_bar.dart new file mode 100644 index 00000000..8406085b --- /dev/null +++ b/packages/layout/lib/src/views/playground/playground_top_bar.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:toly_menu/toly_menu.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; + +import '../../bloc/display_logic.dart'; +import '../../bloc/display_state.dart'; +import '../../data/model/display_frame.dart'; + +class PlaygroundTopBar extends StatelessWidget { + const PlaygroundTopBar({super.key}); + + @override + Widget build(BuildContext context) { + DisplayState state = DisplayScope.of(context).state; + DisplayFrame frame = state.frame; + + return Container( + color: Color(0xfff2f2f2), + padding: EdgeInsets.symmetric(horizontal: 12), + height: 46, + child: NavigationToolbar( + centerMiddle: true, + leading: UnconstrainedBox( + child: Align( + alignment: Alignment.centerLeft, + child: Text('当前: ${state.activeIndex+1}/${state.total}', + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold + ), + )), + ), + middle: Text(frame.title,style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16),), + trailing: Wrap( + children: [ + IconButton( + onPressed: () { + DisplayScope.of(context).prevPage(); + + }, + icon: Icon(Icons.skip_previous), + ), + IconButton( + onPressed: () { + DisplayScope.of(context).nextPage(); + }, + icon: Icon(Icons.skip_next), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.code), + ) + ], + ), + ), + ); + + return Container( + color: Color(0xfff2f2f2), + padding: EdgeInsets.symmetric(horizontal: 12), + height: 42, + child: Row( + children: [ + Spacer(), + IconButton(onPressed: () {}, icon: Icon(Icons.code)) + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/test_show.dart b/packages/layout/lib/src/views/test_show.dart new file mode 100644 index 00000000..34b46ae9 --- /dev/null +++ b/packages/layout/lib/src/views/test_show.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class TextShow extends StatelessWidget { + final String info; + + const TextShow({super.key, required this.info}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.white, + child: Center(child: Text(info)), + ); + } +} diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml new file mode 100644 index 00000000..3e4ea186 --- /dev/null +++ b/packages/layout/pubspec.yaml @@ -0,0 +1,60 @@ +name: layout +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.3.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + + # 菜单管理 + toly_menu: ^0.0.5 + toly_menu_manager: ^0.0.1 + + # 路由管理 + go_router: ^13.2.2 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/layout/test/layout_test.dart b/packages/layout/test/layout_test.dart new file mode 100644 index 00000000..8a6cc84f --- /dev/null +++ b/packages/layout/test/layout_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:layout/layout.dart'; + +void main() { + // test('adds one to input values', () { + // final calculator = Calculator(); + // expect(calculator.addOne(2), 3); + // expect(calculator.addOne(-7), -6); + // expect(calculator.addOne(0), 1); + // }); +} diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index a24b5d1e..df43a142 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: path: ../widgets utils: path: ../utils - go_router: ^12.1.1 + go_router: ^13.2.2 dev_dependencies: flutter_test: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index 29ee339e..6c0ba30b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -314,10 +314,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: c5fa45fa502ee880839e3b2152d987c44abae26d064a2376d4aad434cf0f7b15 + sha256: "5ed2687bc961f33a752017ccaa7edead3e5601b28b6376a5901bf24728556b85" url: "https://pub.flutter-io.cn/" source: hosted - version: "12.1.3" + version: "13.2.2" http: dependency: transitive description: @@ -373,6 +373,13 @@ packages: relative: true source: path version: "0.0.1" + layout: + dependency: "direct main" + description: + path: "packages/layout" + relative: true + source: path + version: "0.0.1" leak_tracker: dependency: transitive description: @@ -809,6 +816,22 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" + toly_menu: + dependency: transitive + description: + name: toly_menu + sha256: dce49e04dc4ed40168c7af6f4830c8a92e9760e2cb8392cc454d031e24aee055 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.5" + toly_menu_manager: + dependency: transitive + description: + name: toly_menu_manager + sha256: "34ba03d9996097244c25575ab062ed8a16ecaa46576e4efbe6b6bc60f4853300" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" toly_ui: dependency: "direct main" description: @@ -1054,4 +1077,4 @@ packages: version: "1.0.1" sdks: dart: ">=3.3.0 <4.0.0" - flutter: ">=3.10.0" + flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index c99cc652..90118ab3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 webview_flutter: ^4.4.2 - go_router: ^12.1.1 + go_router: ^13.2.2 sqflite: ^2.3.0 # 数据库 sqflite_common_ffi: ^2.3.1 # 数据库 shared_preferences: ^2.2.2 # xml 固化 @@ -83,8 +83,8 @@ dependencies: path: packages/widget_module treasure_tools: path: packages/treasure_tools -# old_fancy_mobile_ui: -# path: packages/old_fancy_mobile_ui + layout: + path: packages/layout dev_dependencies: flutter_test: From e43cc9f85026ac04c416e9c57dc6e61d86ed3537 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 4 Apr 2024 13:30:11 +0800 Subject: [PATCH 064/149] =?UTF-8?q?=E5=B8=83=E5=B1=80=E9=9B=86=E5=BD=95?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=B8=AD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../window/windows_adapter.dart | 2 +- .../src/articles/view/desk_artifact_page.dart | 2 + .../layout/lib/src/bloc/display_logic.dart | 25 ++++-- .../layout/lib/src/bloc/display_state.dart | 6 +- .../layout/lib/src/data/display_map/base.dart | 85 ++++++++++++++++++ .../lib/src/data/display_map/display_map.dart | 45 ++++++++++ .../lib/src/data/model/display_frame.dart | 28 +----- .../layout/lib/src/navigation/menu/flex.dart | 35 ++++---- .../lib/src/navigation/menu/grid_layout.dart | 25 ------ .../navigation/menu/menu_repository_impl.dart | 4 +- .../lib/src/navigation/menu/popable.dart | 24 +++++ .../lib/src/navigation/menu/scroll.dart | 20 +++++ .../src/navigation/router/desk_router.dart | 48 +++------- .../navigation/view/app_desk_navigation.dart | 87 +++---------------- .../src/navigation/view/app_menu_tree.dart | 38 ++++++++ .../lib/src/views/base/align/align_show.dart | 62 +++++++++++++ .../lib/src/views/base/align/align_show2.dart | 75 ++++++++++++++++ .../src/views/base/padding/inner_padding.dart | 24 +++++ .../src/views/base/padding/outer_padding.dart | 21 +++++ .../views/base/padding/sizedbox_padding.dart | 20 +++++ .../base/positioned/positioned_show.dart | 79 +++++++++++++++++ .../lib/src/views/base/size/size_display.dart | 16 ++-- .../src/views/components/grid_xy_layout.dart | 4 +- .../layout/lib/src/views/layout_page.dart | 6 +- .../src/views/popable/autocomplete_demo.dart | 43 +++++++++ .../views/popable/dropdown_button_demo.dart | 68 +++++++++++++++ .../src/views/popable/dropdown_menu_demo.dart | 63 ++++++++++++++ 27 files changed, 758 insertions(+), 197 deletions(-) create mode 100644 packages/layout/lib/src/data/display_map/base.dart create mode 100644 packages/layout/lib/src/data/display_map/display_map.dart delete mode 100644 packages/layout/lib/src/navigation/menu/grid_layout.dart create mode 100644 packages/layout/lib/src/navigation/menu/popable.dart create mode 100644 packages/layout/lib/src/navigation/menu/scroll.dart create mode 100644 packages/layout/lib/src/navigation/view/app_menu_tree.dart create mode 100644 packages/layout/lib/src/views/base/align/align_show.dart create mode 100644 packages/layout/lib/src/views/base/align/align_show2.dart create mode 100644 packages/layout/lib/src/views/base/padding/inner_padding.dart create mode 100644 packages/layout/lib/src/views/base/padding/outer_padding.dart create mode 100644 packages/layout/lib/src/views/base/padding/sizedbox_padding.dart create mode 100644 packages/layout/lib/src/views/base/positioned/positioned_show.dart create mode 100644 packages/layout/lib/src/views/popable/autocomplete_demo.dart create mode 100644 packages/layout/lib/src/views/popable/dropdown_button_demo.dart create mode 100644 packages/layout/lib/src/views/popable/dropdown_menu_demo.dart diff --git a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart index 1853197f..b208703f 100644 --- a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart +++ b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart @@ -12,7 +12,7 @@ class WindowsAdapter { await windowManager.ensureInitialized(); WindowOptions windowOptions = const WindowOptions( size: Size(920,680), - minimumSize: Size(920,690), + minimumSize: Size(920/2,690/2), center: true, backgroundColor: Colors.transparent, skipTaskbar: false, diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart index a81cc61a..03f8ff69 100644 --- a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -34,8 +34,10 @@ class _DeskKnowledgePageState extends State with SingleTicke } ArticleRepository aRepository = const ArticleRepository(); ColumnizeRepository cRepository = const ColumnizeRepository(); + @override Widget build(BuildContext context) { + super.build(context); return MultiBlocProvider( providers: [ diff --git a/packages/layout/lib/src/bloc/display_logic.dart b/packages/layout/lib/src/bloc/display_logic.dart index c935622d..110c1da8 100644 --- a/packages/layout/lib/src/bloc/display_logic.dart +++ b/packages/layout/lib/src/bloc/display_logic.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import '../data/display_map/display_map.dart'; +import '../data/model/display_frame.dart'; import 'display_state.dart'; class DisplayLogic with ChangeNotifier { @@ -9,19 +11,32 @@ class DisplayLogic with ChangeNotifier { DisplayState get state => _state; - bool get enableNext => _state.activeIndex < _state.total-1; + bool get enableNext => _state.activeIndex < _state.total - 1; + bool get enablePrev => _state.activeIndex > 0; void nextPage() { - if(enableNext){ - _state = _state.copyWith(activeIndex: _state.activeIndex+1); + if (enableNext) { + _state = _state.copyWith(activeIndex: _state.activeIndex + 1); + notifyListeners(); + } + } + + void active(String path) { + if (path != _state.router) { + int length = kDisplayMap[path]!.length; + _state = DisplayState( + router: path, + activeIndex: 0, + total: length, + ); notifyListeners(); } } void prevPage() { - if(enablePrev){ - _state = _state.copyWith(activeIndex: _state.activeIndex-1); + if (enablePrev) { + _state = _state.copyWith(activeIndex: _state.activeIndex - 1); notifyListeners(); } } diff --git a/packages/layout/lib/src/bloc/display_state.dart b/packages/layout/lib/src/bloc/display_state.dart index 480afd68..dddb24d1 100644 --- a/packages/layout/lib/src/bloc/display_state.dart +++ b/packages/layout/lib/src/bloc/display_state.dart @@ -1,5 +1,7 @@ import 'package:layout/src/data/model/display_frame.dart'; +import '../data/display_map/display_map.dart'; + class DisplayState { final String router; final int activeIndex; @@ -11,7 +13,9 @@ class DisplayState { required this.total, }); - DisplayFrame get frame => kDisplayMap[router]![activeIndex]; + DisplayFrame get frame { + return kDisplayMap[router]![activeIndex]; + } DisplayState copyWith({ int? total, diff --git a/packages/layout/lib/src/data/display_map/base.dart b/packages/layout/lib/src/data/display_map/base.dart new file mode 100644 index 00000000..aed62764 --- /dev/null +++ b/packages/layout/lib/src/data/display_map/base.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/positioned/positioned_show.dart'; + +import '../../views/base/align/align_show.dart'; +import '../../views/base/align/align_show2.dart'; +import '../../views/base/padding/inner_padding.dart'; +import '../../views/base/padding/outer_padding.dart'; +import '../../views/base/padding/sizedbox_padding.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../model/display_frame.dart'; + +List get baseSize => [ + DisplayFrame( + title: '父级中的紧约束', + desc: "当前虽然指定 SizeBox 宽高为 150*100。但由于父级的紧约束被强制固定尺寸。" + "下一步,将父级的紧约束改为宽松约束。", + src: '', + display: (BuildContext context) => const SizeTightConstraint( + info: "受到紧约束\n尺寸无法生效", + ), + ), + DisplayFrame( + title: '用布局组件放宽父级约束', + desc: + "通过嵌套 Align、Row、Column、Flex、Scaffold 等组件, 提供一个宽松的父级约束,让 SizeBox 指定的尺寸可以生效" + "就可以生效。", + src: '', + display: (BuildContext context) => const LossDisplay(), + ), + DisplayFrame( + title: '用 UnconstrainedBox 组件解除约束', + desc: "通过嵌套 UnconstrainedBox 组件,可以解除之前父级对当前区域的约束,从而使指定尺寸生效。", + src: '', + display: (BuildContext context) => const SizeUnconstrain(), + ), + ]; + +List get basePadding => [ + DisplayFrame( + title: 'Padding 实现内边距', + desc: "将色块区域视为边界,文字距离边界有一定的内边距。", + src: '', + display: (BuildContext context) => const InnerPadding(), + ), + DisplayFrame( + title: 'Padding 实现外边距', + desc: + "两个色块区域之间,右侧可以通过 Padding 嵌套,距离外部有边距。Container 的 margin 属性就是这个原理。", + src: '', + display: (BuildContext context) => const OuterPadding(), + ), + DisplayFrame( + title: 'SizedBox 实现边距', + desc: + "有时在行列布局中,可以通过空白的 SizedBox 组件进行站位,来简单地实现边距效果。", + src: '', + display: (BuildContext context) => const SizedBoxPadding(), + ), +]; + +List get baseAlign => [ + DisplayFrame( + title: 'Align 组件实现对齐', + desc: "Align 组件可以在自身区域内(示例中灰色),对子组件(蓝色)进行对齐定位。", + src: '', + display: (BuildContext context) => const AlignShow(), + ), + DisplayFrame( + title: 'Align 实现 sin 排布', + desc: "由于Alignment对象可指定在父容器中宽高的分率位置,可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置。", + src: '', + display: (BuildContext context) => const AlignShow2(), + ), +]; + +List get basePostioned => [ + DisplayFrame( + title: 'Positioned 组件实现定位', + desc: "Positioned 组件可以在 Stack 组件内,对子组件指定位置(左上右下)进行定位布局。", + src: '', + display: (BuildContext context) => const PositionedShow(), + ), +]; \ No newline at end of file diff --git a/packages/layout/lib/src/data/display_map/display_map.dart b/packages/layout/lib/src/data/display_map/display_map.dart new file mode 100644 index 00000000..4de1ca6b --- /dev/null +++ b/packages/layout/lib/src/data/display_map/display_map.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../../views/popable/autocomplete_demo.dart'; +import '../../views/popable/dropdown_button_demo.dart'; +import '../../views/popable/dropdown_menu_demo.dart'; +import '../model/display_frame.dart'; +import 'base.dart'; + +Map> get kDisplayMap => { + '/base/size': baseSize, + '/base/padding': basePadding, + '/base/align': baseAlign, + '/base/positioned': basePostioned, + + // '/popable/DropdownButton': [ + // DisplayFrame( + // title: '下拉按钮 DropdownButton', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const CustomDropDownButton(), + // ), + // ], + // '/popable/DropdownMenu': [ + // DisplayFrame( + // title: '下拉按钮 DropdownMenu', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const DropdownMenuNode1(), + // ), + // ], + // '/popable/Autocomplete': [ + // DisplayFrame( + // title: '自动填充 Autocomplete', + // desc: + // "Material 风格的下拉选择按钮。基于 Navigator 导航实现,推入 _DropdownRoute 路由,所以点击外部区域时,弹框消失,且外部无法响应该次点击事件。视图构建逻辑非常固定,可定制性低。条目一次性完全加载,不适合海量条目。", + // src: '', + // display: (BuildContext context) => const AutocompleteDemo(), + // ), + // ], +}; \ No newline at end of file diff --git a/packages/layout/lib/src/data/model/display_frame.dart b/packages/layout/lib/src/data/model/display_frame.dart index 60d4bf93..b6741c8a 100644 --- a/packages/layout/lib/src/data/model/display_frame.dart +++ b/packages/layout/lib/src/data/model/display_frame.dart @@ -3,6 +3,9 @@ import 'package:flutter/cupertino.dart'; import '../../views/base/size/size_tight_constraint.dart'; import '../../views/base/size/size_loss_by_align.dart'; import '../../views/base/size/size_unconstraint.dart'; +import '../../views/popable/autocomplete_demo.dart'; +import '../../views/popable/dropdown_button_demo.dart'; +import '../../views/popable/dropdown_menu_demo.dart'; class DisplayFrame { final String title; @@ -18,27 +21,4 @@ class DisplayFrame { }); } -Map> get kDisplayMap => { - '/base/size': [ - DisplayFrame( - title: '父级中的紧约束', - desc: "当前虽然指定 SizeBox 宽高为 150*100。但由于父级的紧约束被强制固定尺寸。" - "下一步,将父级的紧约束改为宽松约束。", - src: '', - display: (BuildContext context) => const SizeTightConstraint(info: "受到紧约束\n尺寸无法生效",), - ), - DisplayFrame( - title: '用布局组件放宽父级约束', - desc: "通过嵌套 Align、Row、Column、Flex、Scaffold 等组件, 提供一个宽松的父级约束,让 SizeBox 指定的尺寸可以生效" - "就可以生效。", - src: '', - display: (BuildContext context) => const LossDisplay(), - ), - DisplayFrame( - title: '用 UnconstrainedBox 组件解除约束', - desc: "通过嵌套 UnconstrainedBox 组件,可以解除之前父级对当前区域的约束,从而使指定尺寸生效。", - src: '', - display: (BuildContext context) => const SizeUnconstrain(), - ), - ] - }; + diff --git a/packages/layout/lib/src/navigation/menu/flex.dart b/packages/layout/lib/src/navigation/menu/flex.dart index e7a98182..9860d711 100644 --- a/packages/layout/lib/src/navigation/menu/flex.dart +++ b/packages/layout/lib/src/navigation/menu/flex.dart @@ -1,31 +1,36 @@ import 'package:flutter/material.dart'; // import 'package:iroute/app/res/fx_icon.dart'; - +// { +// 'path': '/expanded', +// 'label': '延展布局', +// // 'icon': Icons.text_fields, +// }, +// { +// 'path': '/holy', +// 'label': '圣杯布局', +// // 'icon': Icons.text_fields, +// }, Map get drawMenus => { - 'path': '/flex', + 'path': '/multi', // 'icon': FxIcon.icon_paint, - 'icon':Icons.local_florist, - 'label': '行列布局', + 'icon':Icons.multitrack_audio, + 'label': '多子布局', 'children': [ { - 'path': '/row', - 'label': '行布局', + 'path': '/row_column', + 'label': '行列布局', // 'icon': Icons.text_fields, }, { - 'path': '/column', - 'label': '列布局', + 'path': '/wrap', + 'label': '包裹布局', // 'icon': Icons.text_fields, }, { - 'path': '/expanded', - 'label': '延展布局', - // 'icon': Icons.text_fields, - }, - { - 'path': '/holy', - 'label': '圣杯布局', + 'path': '/stack', + 'label': '堆叠布局', // 'icon': Icons.text_fields, }, + ] }; diff --git a/packages/layout/lib/src/navigation/menu/grid_layout.dart b/packages/layout/lib/src/navigation/menu/grid_layout.dart deleted file mode 100644 index 0216c635..00000000 --- a/packages/layout/lib/src/navigation/menu/grid_layout.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:iroute/app/res/fx_icon.dart'; - -Map get calcMenus => { - 'path': '/grid', - 'icon': Icons.grid_4x4, - 'label': '网格布局', - // 'children': [ - // { - // 'path': '/calculator', - // 'label': '计数器', - // 'icon': Icons.calculate_outlined, - // }, - // { - // 'path': '/date', - // 'label': '日期计算', - // 'icon': Icons.date_range, - // }, - // // { - // // 'path': '/parser', - // // 'label': '文字解析器', - // // 'icon': Icons.text_fields, - // // }, - // ] -}; diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart index 9d1bfe85..c0270d10 100644 --- a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -1,10 +1,11 @@ import 'dart:async'; +import 'package:layout/src/navigation/menu/popable.dart'; import 'package:toly_menu/toly_menu.dart'; import 'package:toly_menu_manager/toly_menu_manager.dart'; import 'base_layout.dart'; -import 'grid_layout.dart'; +import 'scroll.dart'; import 'layout.dart'; import 'flex.dart'; @@ -19,6 +20,7 @@ class MenuRepositoryImpl implements MenuRepository { baseMenus, drawMenus, calcMenus, + // popableMenus, ] }); } diff --git a/packages/layout/lib/src/navigation/menu/popable.dart b/packages/layout/lib/src/navigation/menu/popable.dart new file mode 100644 index 00000000..e969f68c --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/popable.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get popableMenus => { + 'path': '/popable', + 'icon': Icons.layers_rounded, + 'label': '菜单浮层', + 'children': [ + { + 'path': '/DropdownButton', + 'label': '下拉按钮', + }, + { + 'path': '/DropdownMenu', + 'label': '下拉菜单', + // 'icon': Icons.calculate_outlined, + }, + { + 'path': '/Autocomplete', + 'label': '自动填充', + // 'icon': Icons.calculate_outlined, + }, + ] +}; diff --git a/packages/layout/lib/src/navigation/menu/scroll.dart b/packages/layout/lib/src/navigation/menu/scroll.dart new file mode 100644 index 00000000..e9d9ee40 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/scroll.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +// import 'package:iroute/app/res/fx_icon.dart'; + +Map get calcMenus => { + 'path': '/scroll', + 'icon': Icons.touch_app_outlined, + 'label': '滑动布局', + 'children': [ + { + 'path': '/list', + 'label': '列表布局', + // 'icon': Icons.list_alt, + }, + { + 'path': '/grid', + 'label': '网格布局', + // 'icon': Icons.grid_on_sharp, + }, + ] +}; diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/packages/layout/lib/src/navigation/router/desk_router.dart index d4d8b723..d89acb07 100644 --- a/packages/layout/lib/src/navigation/router/desk_router.dart +++ b/packages/layout/lib/src/navigation/router/desk_router.dart @@ -26,43 +26,19 @@ import '../view/app_desk_navigation.dart'; }, ), GoRoute( - path: 'base', - redirect: (_, state) { - if (state.fullPath == '/base') { - return '/base/size'; - } - return null; - }, - routes: [ - GoRoute( - path: 'size', - builder: (BuildContext context, GoRouterState state) { - return SizeDisplay(); - }, - ), - GoRoute( - path: 'padding', - builder: (BuildContext context, GoRouterState state) { - return TextShow( - info: 'padding', - ); - }, - ), - // GoRoute( - // path: 'home', - // builder: (BuildContext context, GoRouterState state) { - // return const HomePage(); - // }, - // ), - // GoRoute( - // path: 'collect', - // builder: (BuildContext context, GoRouterState state) { - // return const CollectPage(); - // }, - // ) - ]), + path: 'base/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), + GoRoute( + path: 'popable/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), GoRoute( - path: 'flex', + path: 'multi', builder: (_,__)=>Text("暂未实现"), routes: [ GoRoute( diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart index 3ba685bc..69e20bac 100644 --- a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart +++ b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -1,13 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:go_router/go_router.dart'; -import 'package:toly_menu/toly_menu.dart'; + import 'package:toly_menu_manager/bloc/state.dart'; import 'package:toly_menu_manager/toly_menu_manager.dart'; -import 'package:toly_menu_manager/view/menu_task_builder.dart'; import '../../views/playground/layout_playground.dart'; +import 'app_menu_tree.dart'; class AppDeskNavigation extends StatelessWidget { final Widget content; @@ -75,7 +74,14 @@ class _DeskNavigationRailState extends State { child: Stack( alignment: Alignment.centerRight, children: [ - TolyMenuRail(), + MenuLoadTaskBuilder( + builder: (_, task) => + switch (task) { + MenuLoading() => const Center(child: CupertinoActivityIndicator()), + MenuLoadSuccess() => AppMenuTree(state: task.state,), + MenuLoadFailed() => Text('${task.error.toString()}'), + }, + ), DragChangeWidth( onDragChanged: handleWidthChange, ) @@ -121,76 +127,3 @@ class DragChangeWidth extends StatelessWidget { } } -class TolyMenuRail extends StatefulWidget { - const TolyMenuRail({super.key}); - - @override - State createState() => _TolyMenuRailState(); -} - -class _TolyMenuRailState extends State { - - @override - Widget build(BuildContext context) { - return MenuLoadTaskBuilder( - builder: (_, task) => switch (task) { - MenuLoading() => Center(child: CupertinoActivityIndicator()), - MenuLoadSuccess() => MenuRouterChangeListener( - onRouterChanged: (BuildContext context, String? path) { - if(path!=null){ - // print("=====go:${path}================="); - - context.go(path); - } - }, - child: TolyMenu( - activeColor: Color(0xffe6edf3), - backgroundColor: Colors.white, - expandBackgroundColor: Colors.white, - labelTextStyle: TextStyle(color: Color(0xff2d3a53)), - state: task.state, - onSelect: _onSelect, - ), - ), - MenuLoadFailed() => Text('${task.error.toString()}'), - }, - ); - // return TolyMenu( - // // activeColor: Color(0xffe6edf3), - // // backgroundColor: Colors.white, - // // expandBackgroundColor: Colors.white, - // // labelTextStyle: TextStyle(color: Color(0xff2d3a53)), - // state: state, - // onSelect: _onSelect, - // ); - } - - - - void _onSelect(MenuNode menu) { - print(menu.path); - context.selectMenu(menu); - // if (menu.isLeaf) { - // state = state.copyWith(activeMenu: menu.path); - // } else { - // List menus = []; - // String path = menu.path.substring(1); - // List parts = path.split('/'); - // - // if (parts.isNotEmpty) { - // String path = ''; - // for (String part in parts) { - // path += '/$part'; - // menus.add(path); - // } - // } - // - // if (state.expandMenus.contains(menu.path)) { - // menus.remove(menu.path); - // } - // - // state = state.copyWith(expandMenus: menus); - // } - // setState(() {}); - } -} diff --git a/packages/layout/lib/src/navigation/view/app_menu_tree.dart b/packages/layout/lib/src/navigation/view/app_menu_tree.dart new file mode 100644 index 00000000..fa1fd8ef --- /dev/null +++ b/packages/layout/lib/src/navigation/view/app_menu_tree.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_menu/toly_menu.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; + +import '../../bloc/display_logic.dart'; + +class AppMenuTree extends StatelessWidget { + final MenuState state; + + const AppMenuTree({super.key, required this.state}); + + @override + Widget build(BuildContext context) { + return MenuRouterChangeListener( + onRouterChanged: _onMenuRouterChange, + child: TolyMenu( + activeColor: Color(0xffe6edf3), + backgroundColor: Colors.white, + expandBackgroundColor: Colors.white, + labelTextStyle: TextStyle(color: Color(0xff2d3a53)), + state: state, + onSelect: (v) => _onSelect(context, v), + )); + } + + void _onMenuRouterChange(BuildContext context, String? path) { + if (path != null) { + context.go(path); + DisplayScope.of(context).active(path); + } + } + + void _onSelect(BuildContext context, MenuNode menu) { + print(menu.path); + context.selectMenu(menu); + } +} diff --git a/packages/layout/lib/src/views/base/align/align_show.dart b/packages/layout/lib/src/views/base/align/align_show.dart new file mode 100644 index 00000000..af3eae26 --- /dev/null +++ b/packages/layout/lib/src/views/base/align/align_show.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class AlignShow extends StatelessWidget { + const AlignShow({super.key}); + + final List alignments = const [ + Alignment.topLeft, + Alignment.topCenter, + Alignment.topRight, + Alignment.centerLeft, + Alignment.center, + Alignment.centerRight, + Alignment.bottomLeft, + Alignment.bottomCenter, + Alignment.bottomRight, + ]; + + final List alignmentsInfo = const [ + "topLeft", + "topCenter", + "topRight", + "centerLeft", + "center", + "centerRight", + "bottomLeft", + "bottomCenter", + "bottomRight", + ]; + + @override + Widget build(BuildContext context) { + TextStyle style = TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 12 + ); + return Center( + child: Wrap( + children: alignments + .toList() + .map((mode) => Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 150, + height: 100, + color: Colors.grey.withAlpha(88), + child: Align( + child: Container( + width: 30, + height: 30, + color: Colors.cyanAccent, + ), + alignment: mode)), + Text( + alignmentsInfo[alignments.indexOf(mode)], + style: style, + ) + ])) + .toList()), + ); + } +} diff --git a/packages/layout/lib/src/views/base/align/align_show2.dart b/packages/layout/lib/src/views/base/align/align_show2.dart new file mode 100644 index 00000000..508c768c --- /dev/null +++ b/packages/layout/lib/src/views/base/align/align_show2.dart @@ -0,0 +1,75 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +class Ball extends StatelessWidget { + const Ball({ + super.key, + this.radius = 15, + this.color = Colors.blue, + }); + final double radius; //半径 + final Color color; //颜色 + + @override + Widget build(BuildContext context) { + return Container( + width: radius * 2, + height: radius * 2, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + ), + ); + } +} + +class AlignShow2 extends StatefulWidget { + const AlignShow2({ + super.key, + }); + + @override + _AlignShow2State createState() => _AlignShow2State(); +} + +class _AlignShow2State extends State { + double _x = 0.0; //Alignment坐标系上的x坐标 + + @override + Widget build(BuildContext context) { + var item = Container( + width: 300, + height: 120, + color: Colors.black.withAlpha(10), + child: Align( + child: const Ball( + color: Colors.orangeAccent, + ), + alignment: Alignment(_x, f(_x * pi)), + ), + ); + + var slider = SizedBox( + width: 320, + child: Slider( + + max: 180, + min: -180, + divisions: 360, + label: "${_x.toStringAsFixed(2)}π", + value: _x * 180, + onChanged: (v) => setState(() => _x = v / 180)), + ); + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [slider, item], + ), + ); + } + + double f(x) { + //映射函数 -- 可随意指定 + double y = sin(x); + return y; + } +} diff --git a/packages/layout/lib/src/views/base/padding/inner_padding.dart b/packages/layout/lib/src/views/base/padding/inner_padding.dart new file mode 100644 index 00000000..789511ba --- /dev/null +++ b/packages/layout/lib/src/views/base/padding/inner_padding.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class InnerPadding extends StatelessWidget { + const InnerPadding({super.key}); + + @override + Widget build(BuildContext context) { + Color? color = Theme.of(context).primaryColor; + TextStyle? style = const TextStyle(color: Colors.white); + return Center( + child: ColoredBox( + color: color, + child: SizedBox( + width: 200, + height: 80, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0,vertical: 8), + child: Text("张风捷特烈 " * 10, style: style), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/packages/layout/lib/src/views/base/padding/outer_padding.dart b/packages/layout/lib/src/views/base/padding/outer_padding.dart new file mode 100644 index 00000000..9bf10ed6 --- /dev/null +++ b/packages/layout/lib/src/views/base/padding/outer_padding.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +import 'inner_padding.dart'; + +class OuterPadding extends StatelessWidget { + const OuterPadding({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InnerPadding(), + Padding( + padding: const EdgeInsets.only(left: 24.0), + child: InnerPadding(), + ), + ], + ); + } +} diff --git a/packages/layout/lib/src/views/base/padding/sizedbox_padding.dart b/packages/layout/lib/src/views/base/padding/sizedbox_padding.dart new file mode 100644 index 00000000..4e3fd5cd --- /dev/null +++ b/packages/layout/lib/src/views/base/padding/sizedbox_padding.dart @@ -0,0 +1,20 @@ + +import 'package:flutter/material.dart'; + +import 'inner_padding.dart'; + +class SizedBoxPadding extends StatelessWidget { + const SizedBoxPadding({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InnerPadding(), + SizedBox(width: 24), + InnerPadding(), + ], + ); + } +} diff --git a/packages/layout/lib/src/views/base/positioned/positioned_show.dart b/packages/layout/lib/src/views/base/positioned/positioned_show.dart new file mode 100644 index 00000000..05b7674f --- /dev/null +++ b/packages/layout/lib/src/views/base/positioned/positioned_show.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +class PositionedShow extends StatefulWidget { + const PositionedShow({super.key}); + + @override + State createState() => _PositionedShowState(); +} + +class _PositionedShowState extends State { + @override + Widget build(BuildContext context) { + Widget yellowBox = Container( + color: Colors.yellow, + height: 100, + width: 100, + ); + + Widget redBox = Container( + color: Colors.red, + height: 90, + width: 90, + ); + + Widget greenBox = DraggedBox( + onPanUpdate: _onPanUpdate, + ); + + Widget cyanBox = Container( + color: Colors.cyanAccent, + height: 70, + width: 70, + ); + + return Container( + color: Colors.grey.withAlpha(33), + child: Stack( + children: [ + yellowBox, + redBox, + Positioned(top: _top, left: _left, child: greenBox), + Positioned(bottom: 20, right: 20, child: cyanBox) + ], + )); + } + + double _top = 20; + double _left = 20; + void _onPanUpdate(DragUpdateDetails details) { + setState(() { + _top += details.delta.dy; + _left += details.delta.dx; + }); + } +} + +class DraggedBox extends StatelessWidget { + final GestureDragUpdateCallback? onPanUpdate; + + const DraggedBox({super.key, this.onPanUpdate}); + + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onPanUpdate: onPanUpdate, + child: Container( + color: Colors.green, + height: 80, + width: 80, + ), + ), + ); + } + + +} + diff --git a/packages/layout/lib/src/views/base/size/size_display.dart b/packages/layout/lib/src/views/base/size/size_display.dart index ff4fd344..e6a38977 100644 --- a/packages/layout/lib/src/views/base/size/size_display.dart +++ b/packages/layout/lib/src/views/base/size/size_display.dart @@ -2,19 +2,19 @@ import 'package:flutter/material.dart'; import '../../../bloc/display_logic.dart'; import '../../../data/model/display_frame.dart'; -import 'size_loss_by_align.dart'; -import 'size_tight_constraint.dart'; -class SizeDisplay extends StatelessWidget { - const SizeDisplay({super.key}); + +class FrameDisplayPanel extends StatelessWidget { + const FrameDisplayPanel({super.key}); @override Widget build(BuildContext context) { DisplayFrame frame = DisplayScope.of(context).state.frame; - return Material( - color: Colors.transparent, - elevation: 0, - child: frame.display(context)); + return Material( + color: Colors.transparent, + elevation: 0, + child: frame.display(context), + ); } } diff --git a/packages/layout/lib/src/views/components/grid_xy_layout.dart b/packages/layout/lib/src/views/components/grid_xy_layout.dart index f2b9455a..b1a44435 100644 --- a/packages/layout/lib/src/views/components/grid_xy_layout.dart +++ b/packages/layout/lib/src/views/components/grid_xy_layout.dart @@ -22,7 +22,7 @@ class GridXYLayout extends StatelessWidget { for (int j = 0; j < capacity.$2; j++) { columnChildren.add(Expanded(child: xyBuilder((i, j)))); if (hasLine && j != capacity.$2 - 1) { - columnChildren.add(Divider()); + columnChildren.add(const Divider()); } } children.add(Expanded( @@ -31,7 +31,7 @@ class GridXYLayout extends StatelessWidget { children: columnChildren, ))); if (hasLine && i != capacity.$1 - 1) { - children.add(VerticalDivider()); + children.add(const VerticalDivider()); } } return Row( diff --git a/packages/layout/lib/src/views/layout_page.dart b/packages/layout/lib/src/views/layout_page.dart index c250df2d..ad7f2b5b 100644 --- a/packages/layout/lib/src/views/layout_page.dart +++ b/packages/layout/lib/src/views/layout_page.dart @@ -3,9 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:go_router/go_router.dart'; import 'package:layout/src/navigation/router/app_router.dart'; +import 'package:toly_menu_manager/toly_menu_manager.dart'; import '../bloc/display_logic.dart'; import '../bloc/display_state.dart'; +import '../data/display_map/display_map.dart'; import '../data/model/display_frame.dart'; class LayoutRouterPage extends StatefulWidget { @@ -33,7 +35,6 @@ class _LayoutRouterPageState extends State { activeIndex: 0, total: kDisplayMap['/base/size']!.length, )); - super.initState(); } @@ -43,12 +44,13 @@ class _LayoutRouterPageState extends State { notifier: logic, child: Column( children: [ - Divider(), + const Divider(), Expanded(child: Router.withConfig(config: _router)), ], ), ); } + } class LayoutPage extends StatelessWidget { diff --git a/packages/layout/lib/src/views/popable/autocomplete_demo.dart b/packages/layout/lib/src/views/popable/autocomplete_demo.dart new file mode 100644 index 00000000..ac64c76d --- /dev/null +++ b/packages/layout/lib/src/views/popable/autocomplete_demo.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class AutocompleteDemo extends StatelessWidget { + const AutocompleteDemo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Center( + child: Autocomplete( + optionsBuilder: buildOptions, + onSelected: onSelected, + ), + ), + ); + } + + void onSelected(String selection) { + debugPrint('当前选择了 $selection'); + } + + Future> buildOptions( + TextEditingValue textEditingValue, + ) async { + if (textEditingValue.text == '') { + return const Iterable.empty(); + } + return searchByArgs(textEditingValue.text); + } + + Future> searchByArgs(String args) async{ + // 模拟网络请求 + await Future.delayed(const Duration(milliseconds: 200)); + const List data = [ + 'toly', 'toly49', 'toly42', 'toly56', + 'card', 'ls', 'alex', 'fan sha', + ]; + return data.where((String name) => name.contains(args)); + } +} diff --git a/packages/layout/lib/src/views/popable/dropdown_button_demo.dart b/packages/layout/lib/src/views/popable/dropdown_button_demo.dart new file mode 100644 index 00000000..66755554 --- /dev/null +++ b/packages/layout/lib/src/views/popable/dropdown_button_demo.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 55, +// "name": 'DropdownButton基本用法', +// "priority": 1, +// "subtitle": +// "【value】 : 当前值 【T】\n" +// "【items】 : 下拉选框 【List>】\n" +// "【icon】 : 图标 【Widget】\n" +// "【elevation】 : 影深 【double】\n" +// "【onChanged】 : 选择条目事件 【Function(T)】\n" +// "【backgroundColor】 : 背景色 【Color】", +// } +class CustomDropDownButton extends StatefulWidget { + const CustomDropDownButton({Key? key}) : super(key: key); + + @override + _CustomDropDownButtonState createState() => _CustomDropDownButtonState(); +} + +class _CustomDropDownButtonState extends State { + Color _color = Colors.red; + final List _colors = const [ + Colors.red, + Colors.yellow, + Colors.blue, + Colors.green + ]; + final List _info = const ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color, + ), + DropdownButton( + value: _color, + elevation: 1, + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (v) => setState(() => _color = v??Colors.blue)), + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} \ No newline at end of file diff --git a/packages/layout/lib/src/views/popable/dropdown_menu_demo.dart b/packages/layout/lib/src/views/popable/dropdown_menu_demo.dart new file mode 100644 index 00000000..f1d839e9 --- /dev/null +++ b/packages/layout/lib/src/views/popable/dropdown_menu_demo.dart @@ -0,0 +1,63 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 370 DropdownMenu 表单菜单 +/// 下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。 +/// link: 55 +// { +// "widgetId": 370, +// "name": '下拉菜单的简单使用', +// "priority": 1, +// "subtitle": +// "【dropdownMenuEntries】 : 菜单条目列表 【List>】\n" +// "【initialSelection】 : 表单验证回调 【T?】\n" +// "【onSelected】 : 表单保存回调 【ValueChanged?】\n" +// "【menuHeight】 : 菜单高度 【double】\n" +// "【width】 : 输入框宽度 【double】", +// } +class DropdownMenuNode1 extends StatefulWidget { + const DropdownMenuNode1({super.key}); + + @override + State createState() => _DropdownMenuNode1State(); +} + +class _DropdownMenuNode1State extends State { + final List data = ['语文', '数学', '英语', '物理', '化学', '生物', '地理']; + late String _dropdownValue = data.first; + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField(), + // DropdownMenu( + // requestFocusOnTap: false, + // menuHeight: 200, + // initialSelection: data.first, + // onSelected: _onSelect, + // dropdownMenuEntries: _buildMenuList(data), + // ), + const SizedBox(height: 8,), + Text('你选择的学科是: $_dropdownValue') + ], + ), + ); + } + + void _onSelect(String? value) { + // setState(() { + // _dropdownValue = value!; + // }); + } + + List> _buildMenuList(List data) { + return data.map((String value) { + return DropdownMenuEntry(value: value, label: value); + }).toList(); + } +} From 761c026d675edd5ed3fce7ff044095f5e340b2de Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 15 May 2024 09:02:52 +0800 Subject: [PATCH 065/149] update navigation by tolyui --- .../desk/flutter_unit_desk_navigation.dart | 61 ++-- .../views/desk/menu_bar_leading.dart | 89 +++++ lib/navigation/views/desk/menu_bar_tail.dart | 62 ++++ .../views/desk/toly_unit_menu_cell.dart | 59 ++++ .../views/desk/unit_desk_navigation.dart | 94 ----- .../views/desk/unit_rail_navigation.dart | 334 ------------------ lib/navigation/views/unit_navigation.dart | 3 - pubspec.lock | 8 + pubspec.yaml | 3 + 9 files changed, 249 insertions(+), 464 deletions(-) create mode 100644 lib/navigation/views/desk/menu_bar_leading.dart create mode 100644 lib/navigation/views/desk/menu_bar_tail.dart create mode 100644 lib/navigation/views/desk/toly_unit_menu_cell.dart delete mode 100644 lib/navigation/views/desk/unit_desk_navigation.dart delete mode 100644 lib/navigation/views/desk/unit_rail_navigation.dart diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart index 3c09feb0..4f04f6b4 100644 --- a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart +++ b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart @@ -1,12 +1,14 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/navigation/menus/menu_meta.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; -import 'unit_rail_navigation.dart'; - +import 'package:tolyui_navigation/tolyui_navigation.dart'; +import 'menu_bar_leading.dart'; +import 'menu_bar_tail.dart'; +import 'toly_unit_menu_cell.dart'; class FlutterUnitDeskNavigation extends StatelessWidget { final Widget content; + const FlutterUnitDeskNavigation({super.key, required this.content}); @override @@ -14,14 +16,12 @@ class FlutterUnitDeskNavigation extends StatelessWidget { return Scaffold( body: Row( children: [ - DeskNavigationRail(), + const DragToMoveAreaNoDouble(child: DeskNavigationRail()), Expanded(child: content), ], ), ); } - - } class DeskNavigationRail extends StatefulWidget { @@ -32,12 +32,21 @@ class DeskNavigationRail extends StatefulWidget { } class _DeskNavigationRailState extends State { + @override Widget build(BuildContext context) { - return UnitRailNavigation( - selectedIndex: activeIndex, - onAction: _onAction, - itemData: deskNavBarMenus, + return TolyRailMenuBar( + cellBuilder: FlutterUnitMenuCell.create, + width: 130, + gap: 8, + padding: EdgeInsets.zero, + backgroundColor: const Color(0xff2C3036), + menus: deskNavBarMenus, + activeId: activePath, + enableWidthChange: false, + onSelected: context.go, + tail: (_) => const MenuBarTail(), + leading: (_) => const MenuBarLeading(), ); } @@ -52,36 +61,22 @@ class _DeskNavigationRailState extends State { String treasure = context.l10n.treasureTools; String account = context.l10n.homeAccount; - deskNavBarMenus = [ - MenuMeta(label: widget, icon: TolyIcon.icon_layout, path: '/widget'), - MenuMeta(label: canvas, icon: Icons.palette, path: '/painter'), - MenuMeta(label: knowledge, icon: TolyIcon.icon_artifact, path: '/knowledge'), - MenuMeta(label: treasure, icon: TolyIcon.icon_fast, path: '/tools'), - MenuMeta(label: account, icon: Icons.person, path: '/account'), + deskNavBarMenus = [ + MenuMeta(label: widget, icon: TolyIcon.icon_layout, router: '/widget'), + MenuMeta(label: canvas, icon: Icons.palette, router: '/painter'), + MenuMeta(label: knowledge, icon: TolyIcon.icon_artifact, router: '/knowledge'), + MenuMeta(label: treasure, icon: TolyIcon.icon_fast, router: '/tools'), + MenuMeta(label: account, icon: Icons.person, router: '/account'), ]; } - + final RegExp _segReg = RegExp(r'/\w+'); - int? get activeIndex { + String? get activePath { final String path = GoRouterState.of(context).uri.toString(); RegExpMatch? match = _segReg.firstMatch(path); if (match == null) return null; String? target = match.group(0); - - int index = deskNavBarMenus.indexWhere((menu) => menu.path!.contains(target??'')); - if (index == -1) return null; - return index; - } - - void _onAction(ActionType value) { - String? path = value.path; - if(path!=null){ - if(value == ActionType.settings || value == ActionType.collection){ - context.push(path); - }else{ - context.go(path); - } - } + return target; } } diff --git a/lib/navigation/views/desk/menu_bar_leading.dart b/lib/navigation/views/desk/menu_bar_leading.dart new file mode 100644 index 00000000..b7c1ac84 --- /dev/null +++ b/lib/navigation/views/desk/menu_bar_leading.dart @@ -0,0 +1,89 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class MenuBarLeading extends StatelessWidget { + const MenuBarLeading({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 20,bottom: 20), + child: Column( + children: [ + const Wrap( + direction: Axis.vertical, + spacing: 10, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + CircleImage( + image: AssetImage('assets/images/icon_head.webp'), + size: 60, + ), + Text( + '张风捷特烈', + style: TextStyle(color: Colors.white70), + ) + ], + ), + _buildIcons(), + const Divider( + color: Colors.white, + height: 1, + endIndent: 20, + ), + const SizedBox(height: 16,), + ], + ), + ); + } + + Widget _buildIcons() { + return Padding( + padding: const EdgeInsets.only(bottom: 16, top: 16), + child: Wrap( + spacing: 8, + children: [ + FeedbackWidget( + onPressed: () => + _launchURL("https://github.com/toly1994328/FlutterUnit"), + child: const Icon( + TolyIcon.icon_github, + color: Colors.white, + ), + ), + FeedbackWidget( + onPressed: () => + _launchURL("https://juejin.im/user/5b42c0656fb9a04fe727eb37"), + child: const Icon( + TolyIcon.icon_juejin, + color: Colors.white, + ), + ), + FeedbackWidget( + onPressed: () => _launchURL("http://blog.toly1994.com/"), + child: const Icon( + TolyIcon.icon_item, + color: Colors.white, + ), + ), + ], + ), + ); + } + + void _launchURL(String url) async { + if (!await launchUrl(Uri.parse(url))) { + // throw Exception('Could not launch $url'); + } + } +} diff --git a/lib/navigation/views/desk/menu_bar_tail.dart b/lib/navigation/views/desk/menu_bar_tail.dart new file mode 100644 index 00000000..d862bdd5 --- /dev/null +++ b/lib/navigation/views/desk/menu_bar_tail.dart @@ -0,0 +1,62 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:toly_ui/toly_ui.dart'; + +import 'theme_model_switch_icon.dart'; + +enum ActionType{ + settings(path: '/settings'), + collection(path: '/collection'); + final String path; + const ActionType({required this.path}); +} + +class MenuBarTail extends StatelessWidget { + const MenuBarTail({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const Divider(indent: 20, color: Colors.white, height: 1), + Wrap( + spacing: 12, + children: [ + FeedbackWidget( + onPressed: () { + context.push(ActionType.settings.path); + }, + child: const Padding( + padding: EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + Icons.settings, + color: Colors.white, + ), + ), + ), + FeedbackWidget( + onPressed: () => context.push(ActionType.collection.path), + child: const Padding( + padding: EdgeInsets.only(bottom: 16, top: 16), + child: Icon( + TolyIcon.icon_collect, + color: Colors.white, + ), + ), + ), + const ThemeModelSwitchIcon(), + ], + ), + ], + ); + } +} diff --git a/lib/navigation/views/desk/toly_unit_menu_cell.dart b/lib/navigation/views/desk/toly_unit_menu_cell.dart new file mode 100644 index 00000000..826b9fc0 --- /dev/null +++ b/lib/navigation/views/desk/toly_unit_menu_cell.dart @@ -0,0 +1,59 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-13 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui_navigation/tolyui_navigation.dart'; + +final Tween _widthTween = Tween(begin: 0.82, end: 0.95); +final Tween _sizeTween = Tween(begin: 18.0, end: 22.0); +final Tween _fontSizeTween = Tween(begin: 14.0, end: 15); + +class FlutterUnitMenuCell extends StatelessWidget { + final MenuMeta menu; + final DisplayMeta display; + + const FlutterUnitMenuCell.create(this.menu, this.display, {super.key}); + + Color? get foregroundColor => display.selected ? Colors.white : Colors.white70; + + @override + Widget build(BuildContext context) { + double height = 42; + + double anim = display.rate; + Color? color = ColorTween( + begin: Colors.white.withAlpha(33), + end: Theme.of(context).primaryColor) + .transform(anim); + + double iconSize = _sizeTween.transform(anim); + double fontSize = _fontSizeTween.transform(anim); + + TextStyle style = TextStyle(color: foregroundColor, fontSize: fontSize); + Radius radius = Radius.circular(height / 2); + BorderRadius br = BorderRadius.only(topRight: radius, bottomRight: radius); + + return Align( + alignment: Alignment.centerLeft, + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration(color: color, borderRadius: br), + width: _widthTween.transform(anim) * 130, + height: height, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(menu.icon, color: foregroundColor, size: iconSize), + Text(menu.label, style: style), + ], + ), + ), + ); + } +} diff --git a/lib/navigation/views/desk/unit_desk_navigation.dart b/lib/navigation/views/desk/unit_desk_navigation.dart deleted file mode 100644 index c097d785..00000000 --- a/lib/navigation/views/desk/unit_desk_navigation.dart +++ /dev/null @@ -1,94 +0,0 @@ -// import 'package:algorithm/algorithm.dart'; -// import 'package:app/app.dart'; -// import 'package:artifact/artifact.dart'; -// import 'package:draw_system/draw_system.dart'; -// import 'package:flutter/material.dart'; -// import 'package:treasure_tools/treasure_tools.dart'; -// import 'package:widget_module/views/mobile/widget_page/home_drawer.dart'; -// import 'package:widget_module/widget_module.dart'; -// import '../../menus/menu_meta.dart'; -// import 'unit_rail_navigation.dart'; -// -// class UnitDeskNavigation extends StatefulWidget { -// -// const UnitDeskNavigation(); -// -// @override -// _UnitDeskNavigationState createState() => _UnitDeskNavigationState(); -// -// } -// -// class _UnitDeskNavigationState extends State { -// late PageController _controller; //页面控制器,初始0 -// int _currentIndex = 0; -// -// @override -// void initState() { -// super.initState(); -// _controller = PageController(); -// -// // ActionUnit.searchAction.onSearch = () { -// // Navigator.of(context).pushNamed(UnitRouter.search); -// // }; -// } -// -// @override -// void dispose() { -// _controller.dispose(); //释放控制器 -// super.dispose(); -// } -// -// // 构建悬浮按钮工具 -// // Widget wrapOverlayTool({required Widget child}) => Builder( -// // builder: (ctx) => OverlayToolWrapper( -// // child: child, -// // )); -// final List deskNavBarMenus = const [ -// MenuMeta(label: '组件集录', icon: TolyIcon.icon_layout, path: '/widget'), -// MenuMeta(label: '绘制集录', icon: Icons.palette, path: '/draw'), -// MenuMeta(label: '知识集锦', icon: TolyIcon.icon_artifact, path: '/knowledge'), -// MenuMeta(label: '收藏集录', icon: TolyIcon.icon_star, path: '/collection'), -// MenuMeta(label: '算法演绎', icon: Icons.person, path: '/algorithm'), -// MenuMeta(label: '工具宝箱', icon: TolyIcon.icon_fast, path: '/tools'), -// ]; -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// drawer: const HomeDrawer(), -// endDrawer: const HomeRightDrawer(), -// body: Row( -// children: [ -// UnitRailNavigation( -// selectedIndex: _currentIndex, -// onItemClick: _onItemClick, itemData: deskNavBarMenus -// ), -// // _buildLeftNav(), -// Expanded( -// child: PageView( -// physics: const NeverScrollableScrollPhysics(), -// //使用PageView实现页面的切换 -// controller: _controller, -// children: const [ -// DeskWidgetPanel(), -// CollectPageAdapter(), -// GalleryUnit(), -// DeskSortPage(), -// CodeGenPage(), -// DeskPointPage(), -// ], -// ), -// ), -// ], -// ), -// ); -// } -// -// void _onItemClick(int value) { -// _currentIndex = value; -// _controller.jumpToPage(_currentIndex); -// setState(() { -// -// }); -// } -// } -// diff --git a/lib/navigation/views/desk/unit_rail_navigation.dart b/lib/navigation/views/desk/unit_rail_navigation.dart deleted file mode 100644 index 5da25481..00000000 --- a/lib/navigation/views/desk/unit_rail_navigation.dart +++ /dev/null @@ -1,334 +0,0 @@ -import 'package:app/app.dart'; -import 'package:go_router/go_router.dart'; -import 'package:toly_ui/toly_ui.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_unit/navigation/views/desk/theme_model_switch_icon.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../navigation/menus/menu_meta.dart'; - -enum ActionType{ - widgets(path: '/widget'), - painter(path: '/painter'), - knowledge(path: '/knowledge'), - tools(path: '/tools'), - algorithm(path: '/account'), - - toggleDarkTheme(), - settings(path: '/settings'), - collection(path: '/collection'); - final String? path; - - const ActionType({this.path}); -} - -class UnitRailNavigation extends StatefulWidget { - final ValueChanged onAction; - - final int? selectedIndex; - - // final Map itemData; - final List itemData; - - const UnitRailNavigation({ - Key? key, - required this.onAction, - required this.selectedIndex, - required this.itemData, - }) : super(key: key); - - @override - State createState() => _UnitRailNavigationState(); -} - -class _UnitRailNavigationState extends State - with TickerProviderStateMixin { - late List _destinationControllers; - late List> _destinationAnimations; - - List get info => widget.itemData.map((e) => e.label).toList(); - - List get icons => widget.itemData.map((e) => e.icon).toList(); - - @override - void initState() { - super.initState(); - _initControllers(); - } - - void _initControllers() { - _destinationControllers = - List.generate(widget.itemData.length, (int index) { - return AnimationController( - duration: kThemeAnimationDuration, - vsync: this, - )..addListener(_rebuild); - }); - - _destinationAnimations = _destinationControllers - .map((AnimationController controller) => controller.view) - .toList(); - _destinationControllers[widget.selectedIndex??0].value = 1.0; - } - - void _rebuild() { - setState(() {}); - } - - @override - void didUpdateWidget(UnitRailNavigation oldWidget) { - super.didUpdateWidget(oldWidget); - // No animated segue if the length of the items list changes. - if (widget.itemData.length != oldWidget.itemData.length) { - _resetState(); - return; - } - - if (widget.selectedIndex != oldWidget.selectedIndex) { - _destinationControllers[oldWidget.selectedIndex??0].reverse(); - - _destinationControllers[widget.selectedIndex??0].forward(); - return; - } - } - - void _resetState() { - _disposeControllers(); - _initControllers(); - } - - void _disposeControllers() { - for (final AnimationController controller in _destinationControllers) { - controller.dispose(); - } - } - - @override - Widget build(BuildContext context) { - Color? divColor = Theme.of(context).dividerTheme.color; - return DragToMoveAreaNoDouble( - child: Container( - padding: const EdgeInsets.only(top: 20), - alignment: Alignment.topCenter, - margin: const EdgeInsets.only(right: 1), - width: 130, - decoration: BoxDecoration(color: Color(0xff2C3036), boxShadow: [ - BoxShadow(color: divColor!, offset: Offset(1, 0), blurRadius: 2) - ]), - child: Column( - children: [ - Wrap( - direction: Axis.vertical, - spacing: 10, - crossAxisAlignment: WrapCrossAlignment.center, - children: const [ - CircleImage( - image: AssetImage('assets/images/icon_head.webp'), - size: 60, - ), - Text( - '张风捷特烈', - style: TextStyle(color: Colors.white70), - ) - ], - ), - _buildIcons(), - const Divider( - color: Colors.white, - height: 1, - endIndent: 20, - ), - Expanded( - flex: 5, - child: Padding( - padding: const EdgeInsets.only(top: 24), - //const Size(120, 35) - child: Column( - // mainAxisSize: MainAxisSize.min, - children: info.asMap().keys - .map((int index) => _UnitRailMenu( - animation: _destinationControllers[index], - onTap: () => widget.onAction(ActionType.values[index]), - selected: widget.selectedIndex == index, - width: 130, - height: 42, - activeColor: Theme.of(context).primaryColor, - inactiveColor: Colors.white.withAlpha(33), - icon: icons[index], - label: info[index], - )) - .toList(), - )), - ), - Expanded( - child: Container(), - flex: 1, - ), - const Divider( - indent: 20, - color: Colors.white, - height: 1, - ), - Wrap( - spacing: 12, - children: [ - FeedbackWidget( - onPressed: () => widget.onAction(ActionType.settings), - child: const Padding( - padding: EdgeInsets.only(bottom: 16, top: 16), - child: Icon( - Icons.settings, - color: Colors.white, - ), - ), - ), - FeedbackWidget( - onPressed: () => widget.onAction(ActionType.collection), - child: const Padding( - padding: EdgeInsets.only(bottom: 16, top: 16), - child: Icon( - TolyIcon.icon_collect, - color: Colors.white, - ), - ), - ), - - const ThemeModelSwitchIcon(), - - ], - ), - ], - ), - ), - ); - ; - } - - Widget _buildIcons() { - return Padding( - padding: const EdgeInsets.only(bottom: 16, top: 16), - child: Wrap( - spacing: 8, - children: [ - FeedbackWidget( - onPressed: () => - _launchURL("https://github.com/toly1994328/FlutterUnit"), - child: const Icon( - TolyIcon.icon_github, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => - _launchURL("https://juejin.im/user/5b42c0656fb9a04fe727eb37"), - child: const Icon( - TolyIcon.icon_juejin, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => _launchURL("http://blog.toly1994.com/"), - child: const Icon( - TolyIcon.icon_item, - color: Colors.white, - ), - ), - ], - ), - ); - } - - _launchURL(String url) async { - if (await canLaunch(url)) { - await launch(url); - } else { - debugPrint('Could not launch $url'); - } - } -} - -class _UnitRailMenu extends StatefulWidget { - final VoidCallback onTap; - final bool selected; - final Color activeColor; - final Color inactiveColor; - final double width; - final double height; - final IconData icon; - final String label; - final Animation animation; - - _UnitRailMenu({ - Key? key, - required this.onTap, - required this.selected, - required this.width, - required this.activeColor, - required this.inactiveColor, - required this.height, - required this.animation, - required this.icon, - required this.label, - }) : super(key: key); - - @override - State<_UnitRailMenu> createState() => _UnitRailMenuState(); -} - -class _UnitRailMenuState extends State<_UnitRailMenu> { - @override - Widget build(BuildContext context) { - return Container( - alignment: Alignment.topLeft, - margin: const EdgeInsets.only(top: 10), - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: widget.onTap, - child: AnimatedBuilder( - animation: widget.animation, - builder: (BuildContext context, Widget? child) => _buildItem(), - ), - )), - ); - } - - late ColorTween colorTween = - ColorTween(begin: widget.inactiveColor, end: widget.activeColor); - - Widget _buildItem() { - double iconSize = _sizeTween.transform(widget.animation.value); - Color? color = colorTween.transform(widget.animation.value); - return Container( - alignment: Alignment.center, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.only( - topRight: Radius.circular(widget.height / 2), - bottomRight: Radius.circular(widget.height / 2))), - width: _widthTween.transform(widget.animation.value) * widget.width, - height: widget.height, - child: Wrap( - spacing: 6, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - widget.icon, - size: iconSize, - color: widget.selected ? Colors.white : Colors.white70, - ), - Text( - widget.label, - style: TextStyle( - fontSize: 14, - color: widget.selected ? Colors.white : Colors.white70, - ), - ), - ], - ), - ); - } -} - -final Tween _widthTween = Tween(begin: 0.82, end: 0.95); -final Tween _sizeTween = Tween(begin: 18.0, end: 20.0); diff --git a/lib/navigation/views/unit_navigation.dart b/lib/navigation/views/unit_navigation.dart index 99389b73..c472f730 100644 --- a/lib/navigation/views/unit_navigation.dart +++ b/lib/navigation/views/unit_navigation.dart @@ -1,20 +1,17 @@ import 'dart:io'; -import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:artifact/artifact.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; import '../../navigation/views/pure_bottom_bar.dart'; -import '../../navigation/views/desk/unit_desk_navigation.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com diff --git a/pubspec.lock b/pubspec.lock index 6c0ba30b..235b2386 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -839,6 +839,14 @@ packages: relative: true source: path version: "0.0.1" + tolyui_navigation: + dependency: "direct main" + description: + name: tolyui_navigation + sha256: c1bf119679b03e72272266fd64d1310056886f334c30e9f9cd7380927f05cabc + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3" treasure_tools: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 90118ab3..c6af2b19 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,9 @@ dependencies: ## fx 架构 - app 启动器 app_boot_starter: ^1.0.0 + ## tolyui 导航模块 + tolyui_navigation: ^0.0.3 + package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 webview_flutter: ^4.4.2 From a4fcff2bb14f96b5531bbfe973bdaa19de35d6b1 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 16 May 2024 17:47:52 +0800 Subject: [PATCH 066/149] update Flutter 3.22.0 --- README.md | 8 +- .../flutter_ui/diy_flexible_space_bar.dart | 2 +- .../lib/flutter_ui/toly_date_picker.dart | 28 ++-- .../search_page/standard_search_bar.dart | 139 ++++++++---------- .../AnimatedSwitcher/node1_base.dart | 2 +- .../AnimatedTheme/node1_base.dart | 6 +- .../toly_date_picker.dart | 28 ++-- .../MouseRegion/node1_base.dart | 2 +- .../StreamBuilder/node1_base.dart | 2 +- .../lib/StatelessWidget/Theme/node1_base.dart | 25 ++-- packages/widgets/pubspec.yaml | 2 +- pubspec.lock | 30 ++-- pubspec.yaml | 2 +- 13 files changed, 132 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index ccf69e13..9472e9b2 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,10 @@ #### 当前Flutter 版本 ``` -Flutter 3.19.2 • channel stable • https://github.com/flutter/flutter.git -Framework • revision bae5e49bc2 (8 days ago) • 2024-02-13 17:46:18 -0800 -Engine • revision 04817c99c9 -Tools • Dart 3.3.0 • DevTools 2.31.1 +Flutter 3.22.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 +Engine • revision f6344b75dc +Tools • Dart 3.4.0 • DevTools 2.34.3 ``` #### 构建命令,产出应用 diff --git a/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart b/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart index 3dcd2854..34075ef0 100644 --- a/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart +++ b/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart @@ -270,7 +270,7 @@ class _DiyFlexibleSpaceBarState extends State { final double opacity = settings.toolbarOpacity; if (opacity > 0.0) { - TextStyle titleStyle = theme.primaryTextTheme.headline6!; + TextStyle titleStyle = theme.primaryTextTheme.headlineSmall!; titleStyle = titleStyle.copyWith( color: titleStyle.color!.withOpacity(opacity), ); diff --git a/packages/components/lib/flutter_ui/toly_date_picker.dart b/packages/components/lib/flutter_ui/toly_date_picker.dart index fd3dfd2d..58cd66f3 100644 --- a/packages/components/lib/flutter_ui/toly_date_picker.dart +++ b/packages/components/lib/flutter_ui/toly_date_picker.dart @@ -445,8 +445,8 @@ class _DatePickerDialogState extends State with RestorationMix ? colorScheme.onPrimary : colorScheme.onSurface; final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.copyWith(color: onPrimarySurface) - : textTheme.headline4?.copyWith(color: onPrimarySurface); + ? textTheme.headlineMedium?.copyWith(color: onPrimarySurface) + : textTheme.headlineMedium?.copyWith(color: onPrimarySurface); final Widget actions = Container( alignment: AlignmentDirectional.centerEnd, @@ -730,7 +730,7 @@ class _DatePickerHeader extends StatelessWidget { final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; - final TextStyle? helpStyle = textTheme.overline?.copyWith( + final TextStyle? helpStyle = textTheme.headlineMedium?.copyWith( color: onPrimarySurfaceColor, ); @@ -1461,14 +1461,14 @@ class _CalendarRangePickerDialog extends StatelessWidget { final Color headerDisabledForeground = headerForeground.withOpacity(0.38); final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); - final TextStyle? headlineStyle = textTheme.headline5; + final TextStyle? headlineStyle = textTheme.headlineMedium; final TextStyle? startDateStyle = headlineStyle?.apply( color: selectedStartDate != null ? headerForeground : headerDisabledForeground, ); final TextStyle? endDateStyle = headlineStyle?.apply( color: selectedEndDate != null ? headerForeground : headerDisabledForeground, ); - final TextStyle saveButtonStyle = textTheme.button!.apply( + final TextStyle saveButtonStyle = textTheme.headlineMedium!.apply( color: onConfirm != null ? headerForeground : headerDisabledForeground, ); @@ -1503,7 +1503,7 @@ class _CalendarRangePickerDialog extends StatelessWidget { children: [ Text( helpText, - style: textTheme.overline!.apply( + style: textTheme.headlineMedium!.apply( color: headerForeground, ), ), @@ -1969,7 +1969,7 @@ class _DayHeaders extends StatelessWidget { Widget build(BuildContext context) { final ThemeData themeData = Theme.of(context); final ColorScheme colorScheme = themeData.colorScheme; - final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface); + final TextStyle textStyle = themeData.textTheme.headlineMedium!.apply(color: colorScheme.onSurface); final MaterialLocalizations localizations = MaterialLocalizations.of(context); final List labels = _getDayHeaders(textStyle, localizations); @@ -2255,7 +2255,7 @@ class _MonthItemState extends State<_MonthItem> { final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); BoxDecoration? decoration; - TextStyle? itemStyle = textTheme.bodyText2; + TextStyle? itemStyle = textTheme.headlineMedium; final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); @@ -2269,7 +2269,7 @@ class _MonthItemState extends State<_MonthItem> { if (isSelectedDayStart || isSelectedDayEnd) { // The selected start and end dates gets a circle background // highlight, and a contrasting text color. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onPrimary); + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.onPrimary); decoration = BoxDecoration( color: colorScheme.primary, shape: BoxShape.circle, @@ -2293,11 +2293,11 @@ class _MonthItemState extends State<_MonthItem> { textDirection: textDirection, ); } else if (isDisabled) { - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onSurface.withOpacity(0.38)); + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.onSurface.withOpacity(0.38)); } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { // The current day gets a different text color and a circle stroke // border. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.primary); + itemStyle = textTheme.headlineMedium?.apply(color: colorScheme.primary); decoration = BoxDecoration( border: Border.all(color: colorScheme.primary), shape: BoxShape.circle, @@ -2443,7 +2443,7 @@ class _MonthItemState extends State<_MonthItem> { child: ExcludeSemantics( child: Text( localizations.formatMonthYear(widget.displayedMonth), - style: textTheme.bodyText2!.apply(color: themeData.colorScheme.onSurface), + style: textTheme.headlineMedium!.apply(color: themeData.colorScheme.onSurface), ), ), ), @@ -2591,8 +2591,8 @@ class _InputDateRangePickerDialog extends StatelessWidget { ? colorScheme.onPrimary : colorScheme.onSurface; final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.apply(color: onPrimarySurfaceColor) - : textTheme.headline4?.apply(color: onPrimarySurfaceColor); + ? textTheme.headlineMedium?.apply(color: onPrimarySurfaceColor) + : textTheme.headlineMedium?.apply(color: onPrimarySurfaceColor); final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); final String semanticDateText = selectedStartDate != null && selectedEndDate != null ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 60db421e..7c411e87 100644 --- a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -5,10 +5,8 @@ import 'package:widget_module/blocs/blocs.dart'; import '../../../data/exp.dart'; - - -class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWidget { - +class StandardSearchBarInner extends StatelessWidget + implements PreferredSizeWidget { const StandardSearchBarInner({Key? key}) : super(key: key); @override @@ -18,81 +16,72 @@ class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWid Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; Color? color = Theme.of(context).appBarTheme.backgroundColor; - return Container( - color: isDark?color:Colors.white, - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Row( - children: [ - const SizedBox( - width: 15, - ), - - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - Navigator.of(context).maybePop(); - }, - child: const SizedBox( - height: 32, - width: 32, - child: Icon( -Icons.arrow_back + return Container( + color: isDark ? color : Colors.white, + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + children: [ + const SizedBox( + width: 15, + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).maybePop(); + }, + child: const SizedBox( + height: 32, width: 32, child: Icon(Icons.arrow_back)), + ), + Expanded( + child: Container( + height: 35, + padding: const EdgeInsets.only(left: 10, right: 10), + child: Material( + color: Colors.transparent, + child: TextField( + autofocus: true, + enabled: true, + cursorColor: Colors.blue, + maxLines: 1, + onChanged: (str) => _doSearch(context, str), + onSubmitted: (str) { + //提交后,收起键盘 + FocusScope.of(context).requestFocus(FocusNode()); + }, + decoration: InputDecoration( + filled: true, + fillColor: + isDark ? Color(0xff292929) : Color(0xffF3F6F9), + prefixIcon: Icon( + Icons.search, + color: Colors.grey, + ), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: + BorderRadius.all(Radius.circular(35 / 2)), + ), + hintText: "搜索组件", + hintStyle: TextStyle(fontSize: 14)), ), - ), - ), - Expanded( - child: Container( - height: 35, - padding: const EdgeInsets.only(left: 10, right: 10), - child: Material( - color: Colors.transparent, - child: TextField( - autofocus: true, - enabled: true, - cursorColor: Colors.blue, - maxLines: 1, - onChanged: (str)=>_doSearch(context,str), - onSubmitted: (str) { - //提交后,收起键盘 - FocusScope.of(context).requestFocus(FocusNode()); - }, - decoration: InputDecoration( - filled: true, - fillColor: isDark?Color(0xff292929):Color(0xffF3F6F9), - - prefixIcon: Icon( - Icons.search, - color: Colors.grey, - ), - border: UnderlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(35 / 2)), - ), - hintText: "搜索组件", - hintStyle: TextStyle(fontSize: 14) - ), - ), - )), - ), - Wrap( - spacing: 3, - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Icon(TolyIcon.icon_sound), - // Text('已签',style: TextStyle(color: Colors.grey),) - ], - ), - const SizedBox( - width: 15, - ) - ], - ), - + )), + ), + Wrap( + spacing: 3, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Icon(TolyIcon.icon_sound), + // Text('已签',style: TextStyle(color: Colors.grey),) + ], + ), + const SizedBox(width: 15) + ], + ), ); } - void _doSearch(BuildContext context,String str) { + void _doSearch(BuildContext context, String str) { WidgetsBloc widgetsBloc = BlocProvider.of(context); final WidgetFilter filter = widgetsBloc.state.filter.copyWith( name: str, diff --git a/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart index 6e7eca93..ebd9e8ec 100644 --- a/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart +++ b/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart @@ -49,7 +49,7 @@ class _CustomAnimatedSwitcherState extends State { child: Text( '$_count', key: ValueKey(_count), - style: Theme.of(context).textTheme.headline3, + style: Theme.of(context).textTheme.headlineSmall, ), ); diff --git a/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart b/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart index d6aee269..a6e7fa88 100644 --- a/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart +++ b/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart @@ -24,7 +24,7 @@ class _AnimatedThemeDemoState extends State { ThemeData startThem = ThemeData( primaryColor: Colors.blue, textTheme: const TextTheme( - headline1: TextStyle( + headlineMedium: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, @@ -34,7 +34,7 @@ class _AnimatedThemeDemoState extends State { ThemeData endThem = ThemeData( primaryColor: Colors.red, textTheme: const TextTheme( - headline1: TextStyle( + headlineMedium: TextStyle( color: Colors.black, fontSize: 16, fontWeight: FontWeight.normal, @@ -94,7 +94,7 @@ class ChildContent extends StatelessWidget { padding: const EdgeInsets.all(10), child: Text( 'Flutter Unit', - style: Theme.of(context).textTheme.headline1, + style: Theme.of(context).textTheme.headlineMedium, ), ); } diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart b/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart index fd3dfd2d..e304e801 100644 --- a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart +++ b/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart @@ -445,8 +445,8 @@ class _DatePickerDialogState extends State with RestorationMix ? colorScheme.onPrimary : colorScheme.onSurface; final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.copyWith(color: onPrimarySurface) - : textTheme.headline4?.copyWith(color: onPrimarySurface); + ? textTheme.bodyMedium?.copyWith(color: onPrimarySurface) + : textTheme.bodySmall?.copyWith(color: onPrimarySurface); final Widget actions = Container( alignment: AlignmentDirectional.centerEnd, @@ -730,7 +730,7 @@ class _DatePickerHeader extends StatelessWidget { final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; final Color onPrimarySurfaceColor = isDark ? colorScheme.onSurface : colorScheme.onPrimary; - final TextStyle? helpStyle = textTheme.overline?.copyWith( + final TextStyle? helpStyle = textTheme.bodyMedium?.copyWith( color: onPrimarySurfaceColor, ); @@ -1461,14 +1461,14 @@ class _CalendarRangePickerDialog extends StatelessWidget { final Color headerDisabledForeground = headerForeground.withOpacity(0.38); final String startDateText = _formatRangeStartDate(localizations, selectedStartDate, selectedEndDate); final String endDateText = _formatRangeEndDate(localizations, selectedStartDate, selectedEndDate, DateTime.now()); - final TextStyle? headlineStyle = textTheme.headline5; + final TextStyle? headlineStyle = textTheme.headlineSmall; final TextStyle? startDateStyle = headlineStyle?.apply( color: selectedStartDate != null ? headerForeground : headerDisabledForeground, ); final TextStyle? endDateStyle = headlineStyle?.apply( color: selectedEndDate != null ? headerForeground : headerDisabledForeground, ); - final TextStyle saveButtonStyle = textTheme.button!.apply( + final TextStyle saveButtonStyle = textTheme.titleMedium!.apply( color: onConfirm != null ? headerForeground : headerDisabledForeground, ); @@ -1503,7 +1503,7 @@ class _CalendarRangePickerDialog extends StatelessWidget { children: [ Text( helpText, - style: textTheme.overline!.apply( + style: textTheme.bodyMedium!.apply( color: headerForeground, ), ), @@ -1969,7 +1969,7 @@ class _DayHeaders extends StatelessWidget { Widget build(BuildContext context) { final ThemeData themeData = Theme.of(context); final ColorScheme colorScheme = themeData.colorScheme; - final TextStyle textStyle = themeData.textTheme.subtitle2!.apply(color: colorScheme.onSurface); + final TextStyle textStyle = themeData.textTheme.bodyMedium!.apply(color: colorScheme.onSurface); final MaterialLocalizations localizations = MaterialLocalizations.of(context); final List labels = _getDayHeaders(textStyle, localizations); @@ -2255,7 +2255,7 @@ class _MonthItemState extends State<_MonthItem> { final bool isDisabled = dayToBuild.isAfter(widget.lastDate) || dayToBuild.isBefore(widget.firstDate); BoxDecoration? decoration; - TextStyle? itemStyle = textTheme.bodyText2; + TextStyle? itemStyle = textTheme.bodyMedium; final bool isRangeSelected = widget.selectedDateStart != null && widget.selectedDateEnd != null; final bool isSelectedDayStart = widget.selectedDateStart != null && dayToBuild.isAtSameMomentAs(widget.selectedDateStart!); @@ -2269,7 +2269,7 @@ class _MonthItemState extends State<_MonthItem> { if (isSelectedDayStart || isSelectedDayEnd) { // The selected start and end dates gets a circle background // highlight, and a contrasting text color. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onPrimary); + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.onPrimary); decoration = BoxDecoration( color: colorScheme.primary, shape: BoxShape.circle, @@ -2293,11 +2293,11 @@ class _MonthItemState extends State<_MonthItem> { textDirection: textDirection, ); } else if (isDisabled) { - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.onSurface.withOpacity(0.38)); + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.onSurface.withOpacity(0.38)); } else if (DateUtils.isSameDay(widget.currentDate, dayToBuild)) { // The current day gets a different text color and a circle stroke // border. - itemStyle = textTheme.bodyText2?.apply(color: colorScheme.primary); + itemStyle = textTheme.bodyMedium?.apply(color: colorScheme.primary); decoration = BoxDecoration( border: Border.all(color: colorScheme.primary), shape: BoxShape.circle, @@ -2443,7 +2443,7 @@ class _MonthItemState extends State<_MonthItem> { child: ExcludeSemantics( child: Text( localizations.formatMonthYear(widget.displayedMonth), - style: textTheme.bodyText2!.apply(color: themeData.colorScheme.onSurface), + style: textTheme.bodyMedium!.apply(color: themeData.colorScheme.onSurface), ), ), ), @@ -2591,8 +2591,8 @@ class _InputDateRangePickerDialog extends StatelessWidget { ? colorScheme.onPrimary : colorScheme.onSurface; final TextStyle? dateStyle = orientation == Orientation.landscape - ? textTheme.headline5?.apply(color: onPrimarySurfaceColor) - : textTheme.headline4?.apply(color: onPrimarySurfaceColor); + ? textTheme.bodySmall?.apply(color: onPrimarySurfaceColor) + : textTheme.bodyMedium?.apply(color: onPrimarySurfaceColor); final String dateText = _formatDateRange(context, selectedStartDate, selectedEndDate, currentDate!); final String semanticDateText = selectedStartDate != null && selectedEndDate != null ? '${localizations.formatMediumDate(selectedStartDate!)} – ${localizations.formatMediumDate(selectedEndDate!)}' diff --git a/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart b/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart index e5f7a6d8..114db985 100644 --- a/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart +++ b/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart @@ -57,7 +57,7 @@ class _MouseRegionDemoState extends State { const Text('你的鼠标移入移除信息:'), Text( '$_enterCounter Entries\n$_exitCounter Exits', - style: Theme.of(context).textTheme.headline4, + style: Theme.of(context).textTheme.headlineMedium, ), Text( 'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})', diff --git a/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart b/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart index b7708e77..be5cdb1a 100644 --- a/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart +++ b/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart @@ -77,7 +77,7 @@ class _CustomStreamBuilderState extends State { if (snap.connectionState == ConnectionState.active) { return Text( snap.data.toString(), - style: Theme.of(context).textTheme.bodyText2, + style: Theme.of(context).textTheme.bodyMedium, ); } if (snap.connectionState == ConnectionState.waiting) { diff --git a/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart b/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart index d16b467f..9b175948 100644 --- a/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart @@ -17,19 +17,18 @@ class TextThemeDemo extends StatelessWidget { Widget build(BuildContext context) { TextTheme queryData = Theme.of(context).textTheme; Map styles = { - "headline1: ": queryData.headline1!, - "headline2: ": queryData.headline2!, - "headline3: ": queryData.headline3!, - "headline4: ": queryData.headline4!, - "headline5: ": queryData.headline5!, - "headline6: ": queryData.headline6!, - "button: ": queryData.button!, - "overline: ": queryData.overline!, - "subtitle1: ": queryData.subtitle1!, - "subtitle2: ": queryData.subtitle2!, - "caption: ": queryData.caption!, - "bodyText1: ": queryData.bodyText1!, - "bodyText2: ": queryData.bodyText2!, + "headlineSmall: ": queryData.headlineSmall!, + "headlineMedium: ": queryData.headlineMedium!, + "headlineLarge: ": queryData.headlineLarge!, + "bodySmall: ": queryData.bodySmall!, + "bodyMedium: ": queryData.bodyMedium!, + "bodyLarge: ": queryData.bodyLarge!, + "titleSmall: ": queryData.titleSmall!, + "titleMedium: ": queryData.titleMedium!, + "titleLarge: ": queryData.titleLarge!, + "labelMedium: ": queryData.labelMedium!, + "labelSmall: ": queryData.labelSmall!, + "labelLarge: ": queryData.labelLarge!, }; return Column( diff --git a/packages/widgets/pubspec.yaml b/packages/widgets/pubspec.yaml index 765207f8..4e4b43d1 100644 --- a/packages/widgets/pubspec.yaml +++ b/packages/widgets/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter path_provider: ^2.0.11 # 路径 - intl: ^0.18.0 + intl: ^0.19.0 app: path: ../app components: diff --git a/pubspec.lock b/pubspec.lock index 235b2386..1d574511 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -346,10 +346,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.flutter-io.cn/" source: hosted - version: "0.18.1" + version: "0.19.0" js: dependency: transitive description: @@ -384,26 +384,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.flutter-io.cn/" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -448,10 +448,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: @@ -804,10 +804,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.1" + version: "0.7.0" toggle_rotate: dependency: "direct main" description: @@ -977,10 +977,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.flutter-io.cn/" source: hosted - version: "13.0.0" + version: "14.2.1" webview_flutter: dependency: "direct main" description: @@ -1085,4 +1085,4 @@ packages: version: "1.0.1" sdks: dart: ">=3.3.0 <4.0.0" - flutter: ">=3.16.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index c6af2b19..44f077f2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,7 +51,7 @@ dependencies: share_plus: ^7.2.1 # 文字分享 flutter_svg: ^2.0.7 - intl: ^0.18.0 + intl: ^0.19.0 platform: ^3.1.0 image: ^4.0.17 flutter_spinkit: ^5.2.0 # loading From 349724fe0ef28f6d68e0190c8c3a0131d8b17f7b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 4 Jun 2024 06:39:48 +0800 Subject: [PATCH 067/149] =?UTF-8?q?=E5=9F=BA=E4=BA=8Etolyui=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E5=B8=83=E5=B1=80=E9=9B=86=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/src/ext/go_router/listener.dart | 36 ++++++++ .../layout/lib/src/ext/go_router/path.dart | 14 ++++ .../navigation/menu/menu_repository_impl.dart | 52 +++--------- .../src/navigation/router/desk_router.dart | 7 +- .../navigation/view/app_desk_navigation.dart | 35 +------- .../src/navigation/view/app_menu_tree.dart | 84 +++++++++++++++---- .../layout/lib/src/views/layout_page.dart | 1 - .../playground/playground_bottom_bar.dart | 2 - .../views/playground/playground_top_bar.dart | 2 - packages/layout/pubspec.yaml | 3 +- pubspec.lock | 54 +++++++----- pubspec.yaml | 4 +- 12 files changed, 168 insertions(+), 126 deletions(-) create mode 100644 packages/layout/lib/src/ext/go_router/listener.dart create mode 100644 packages/layout/lib/src/ext/go_router/path.dart diff --git a/packages/layout/lib/src/ext/go_router/listener.dart b/packages/layout/lib/src/ext/go_router/listener.dart new file mode 100644 index 00000000..d0db8c4c --- /dev/null +++ b/packages/layout/lib/src/ext/go_router/listener.dart @@ -0,0 +1,36 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +mixin RouterChangeListenerMixin on State { + late GoRouterDelegate _delegate; + + String get path => '/${_delegate.currentConfiguration.matches.last.matchedLocation}'; + + @override + void initState() { + super.initState(); + _delegate = GoRouter.of(context).routerDelegate; + _delegate.addListener(_onChange); + } + + @override + void dispose() { + _delegate.removeListener(_onChange); + super.dispose(); + } + + void _onChange() { + RouteMatchBase match = _delegate.currentConfiguration.matches.last; + onChangeRoute("/${match.matchedLocation}"); + } + + void onChangeRoute(String path); +} diff --git a/packages/layout/lib/src/ext/go_router/path.dart b/packages/layout/lib/src/ext/go_router/path.dart new file mode 100644 index 00000000..89442b5f --- /dev/null +++ b/packages/layout/lib/src/ext/go_router/path.dart @@ -0,0 +1,14 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:go_router/go_router.dart'; + +extension GoRouterPath on GoRouter{ + String get path => '/${routerDelegate.currentConfiguration.matches.last.matchedLocation}'; +} + diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart index c0270d10..bd8b2991 100644 --- a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -1,48 +1,18 @@ -import 'dart:async'; - -import 'package:layout/src/navigation/menu/popable.dart'; -import 'package:toly_menu/toly_menu.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; import 'base_layout.dart'; import 'scroll.dart'; import 'layout.dart'; import 'flex.dart'; -class MenuRepositoryImpl implements MenuRepository { - - @override - FutureOr loadRootMenu() { - print("========loadRootMenu=========="); - return MenuNode.fromMap({ - 'children': [ - home, - baseMenus, - drawMenus, - calcMenus, - // popableMenus, - ] - }); - } - - @override - FutureOr<(List, String)> loadMenuActiveState() { - return (['/base'],'/base/size'); - } - - @override - FutureOr> loadMenuHistory() { - - return []; - } - - @override - FutureOr saveMenuHistory(MenuHistory history) { - - } - - @override - FutureOr deleteMenuHistory(MenuHistory history) { - - } +Map get layoutMenus => { + 'path': '', + 'label': '', + 'children': [ + home, + baseMenus, + drawMenus, + calcMenus, +// popableMenus, + ] } +; diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/packages/layout/lib/src/navigation/router/desk_router.dart index d89acb07..236b34e8 100644 --- a/packages/layout/lib/src/navigation/router/desk_router.dart +++ b/packages/layout/lib/src/navigation/router/desk_router.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:toly_menu_manager/view/menu_router_scope.dart'; import '../../../layout.dart'; -import '../../views/base/size/size_loss_by_align.dart'; import '../../views/base/size/size_tight_constraint.dart'; import '../../views/base/size/size_display.dart'; import '../../views/test_show.dart'; @@ -13,10 +11,7 @@ import '../view/app_desk_navigation.dart'; RouteBase get deskNavRoute => ShellRoute( builder: (BuildContext context, GoRouterState state, Widget child) { - return MenuRouterScope( - repository: MenuRepositoryImpl(), - child: AppDeskNavigation(content: child), - ); + return AppDeskNavigation(content: child); }, routes: [ GoRoute( diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart index 69e20bac..07e13b1a 100644 --- a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart +++ b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -2,8 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:toly_menu_manager/bloc/state.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; import '../../views/playground/layout_playground.dart'; import 'app_menu_tree.dart'; @@ -20,34 +18,12 @@ class AppDeskNavigation extends StatelessWidget { children: [ DeskNavigationRail(), Expanded(child: LayoutPlayGround( - content : Column( - children: [ - MenuHistoryChangeListener(onRouterChanged: _onActiveChanged, - child: MenuRecordTab(onCloseHistory: _onCloseHistory, onTapHistory: _onTapHistory)), - Expanded(child: content), - ], - ), + content : content, )), ], ), ); } - - void _onCloseHistory(BuildContext context,MenuHistory history) { - context.removeHistory(history); - } - - void _onTapHistory(BuildContext context,String path) { - print("======_onTapHistory:$path================="); - context.activeHistory(path); - - } - - void _onActiveChanged(BuildContext context,String? value) { - if(value!=null){ - context.go(value); - } - } } class DeskNavigationRail extends StatefulWidget { @@ -74,14 +50,7 @@ class _DeskNavigationRailState extends State { child: Stack( alignment: Alignment.centerRight, children: [ - MenuLoadTaskBuilder( - builder: (_, task) => - switch (task) { - MenuLoading() => const Center(child: CupertinoActivityIndicator()), - MenuLoadSuccess() => AppMenuTree(state: task.state,), - MenuLoadFailed() => Text('${task.error.toString()}'), - }, - ), + AppMenuTree(), DragChangeWidth( onDragChanged: handleWidthChange, ) diff --git a/packages/layout/lib/src/navigation/view/app_menu_tree.dart b/packages/layout/lib/src/navigation/view/app_menu_tree.dart index fa1fd8ef..8611dced 100644 --- a/packages/layout/lib/src/navigation/view/app_menu_tree.dart +++ b/packages/layout/lib/src/navigation/view/app_menu_tree.dart @@ -1,27 +1,56 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:toly_menu/toly_menu.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; +import 'package:tolyui/tolyui.dart'; import '../../bloc/display_logic.dart'; +import '../../ext/go_router/listener.dart'; +import '../menu/menu_repository_impl.dart'; -class AppMenuTree extends StatelessWidget { - final MenuState state; +class AppMenuTree extends StatefulWidget { - const AppMenuTree({super.key, required this.state}); + const AppMenuTree({super.key}); + + @override + State createState() => _AppMenuTreeState(); +} + +class _AppMenuTreeState extends State with RouterChangeListenerMixin { + + late MenuTreeMeta _menuMeta; + + + @override + void initState() { + super.initState(); + _initTreeMeta(); + } + + void _initTreeMeta() { + MenuNode root = MenuNode.fromMap(layoutMenus); + List parts = Uri.parse(path).pathSegments; + String parentPath = parts.sublist(0,parts.length-1).join('/'); + _menuMeta = MenuTreeMeta( + expandMenus: ['/$parentPath'], + activeMenu: root.find(path), + root: root, + ); + } @override Widget build(BuildContext context) { - return MenuRouterChangeListener( - onRouterChanged: _onMenuRouterChange, - child: TolyMenu( - activeColor: Color(0xffe6edf3), - backgroundColor: Colors.white, - expandBackgroundColor: Colors.white, - labelTextStyle: TextStyle(color: Color(0xff2d3a53)), - state: state, - onSelect: (v) => _onSelect(context, v), - )); + Color expandBackgroundColor = context.isDark?Colors.black:Colors.transparent; + Color backgroundColor = context.isDark?Color(0xff001529):Colors.white; + + return TolyRailMenuTree( + leading: SizedBox(height: 18,), + enableWidthChange: true, + maxWidth: 360, + width: 240, + meta: _menuMeta, + backgroundColor: backgroundColor, + expandBackgroundColor: expandBackgroundColor, + onSelect: _onSelect, + ); } void _onMenuRouterChange(BuildContext context, String? path) { @@ -31,8 +60,27 @@ class AppMenuTree extends StatelessWidget { } } - void _onSelect(BuildContext context, MenuNode menu) { - print(menu.path); - context.selectMenu(menu); + void _onSelect(MenuNode menu) { + if(menu.isLeaf){ + context.go(menu.id); + print(path); + }else{ + _menuMeta = _menuMeta.select(menu, singleExpand: true); + setState(() {}); + } + } + + @override + void reassemble() { + MenuNode root = MenuNode.fromMap(layoutMenus); + _menuMeta = _menuMeta.copyWith(root: root); + super.reassemble(); + } + + @override + void onChangeRoute(String path) { + _menuMeta = _menuMeta.selectPath(path, singleExpand: true); + DisplayScope.of(context).active(path); + setState(() {}); } } diff --git a/packages/layout/lib/src/views/layout_page.dart b/packages/layout/lib/src/views/layout_page.dart index ad7f2b5b..e7eeacd0 100644 --- a/packages/layout/lib/src/views/layout_page.dart +++ b/packages/layout/lib/src/views/layout_page.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:go_router/go_router.dart'; import 'package:layout/src/navigation/router/app_router.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; import '../bloc/display_logic.dart'; import '../bloc/display_state.dart'; diff --git a/packages/layout/lib/src/views/playground/playground_bottom_bar.dart b/packages/layout/lib/src/views/playground/playground_bottom_bar.dart index c1a22ecc..0b96227c 100644 --- a/packages/layout/lib/src/views/playground/playground_bottom_bar.dart +++ b/packages/layout/lib/src/views/playground/playground_bottom_bar.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:layout/src/bloc/display_logic.dart'; -import 'package:toly_menu/toly_menu.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; import '../../data/model/display_frame.dart'; diff --git a/packages/layout/lib/src/views/playground/playground_top_bar.dart b/packages/layout/lib/src/views/playground/playground_top_bar.dart index 8406085b..416ea18c 100644 --- a/packages/layout/lib/src/views/playground/playground_top_bar.dart +++ b/packages/layout/lib/src/views/playground/playground_top_bar.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:toly_menu/toly_menu.dart'; -import 'package:toly_menu_manager/toly_menu_manager.dart'; import '../../bloc/display_logic.dart'; import '../../bloc/display_state.dart'; diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml index 3e4ea186..ca9163a4 100644 --- a/packages/layout/pubspec.yaml +++ b/packages/layout/pubspec.yaml @@ -12,8 +12,7 @@ dependencies: sdk: flutter # 菜单管理 - toly_menu: ^0.0.5 - toly_menu_manager: ^0.0.1 + tolyui: ^0.0.2 # 路由管理 go_router: ^13.2.2 diff --git a/pubspec.lock b/pubspec.lock index 1d574511..c0b48b20 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -816,37 +816,53 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" - toly_menu: - dependency: transitive + toly_ui: + dependency: "direct main" description: - name: toly_menu - sha256: dce49e04dc4ed40168c7af6f4830c8a92e9760e2cb8392cc454d031e24aee055 + path: "packages/toly_ui" + relative: true + source: path + version: "0.0.1" + tolyui: + dependency: "direct main" + description: + name: tolyui + sha256: "8fcd5fb7f763db3b04ace1586f6930220990abb6eefc809faff78fcb435f04e4" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.5" - toly_menu_manager: + version: "0.0.2" + tolyui_feedback: dependency: transitive description: - name: toly_menu_manager - sha256: "34ba03d9996097244c25575ab062ed8a16ecaa46576e4efbe6b6bc60f4853300" + name: tolyui_feedback + sha256: "08508038ee77c9ec1c27a39e6cc7fae5a1f9c59da20c771b2fbd52258ff31206" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.1" - toly_ui: - dependency: "direct main" + version: "0.3.4" + tolyui_message: + dependency: transitive description: - path: "packages/toly_ui" - relative: true - source: path - version: "0.0.1" + name: tolyui_message + sha256: eb611cc7ed05aac4c962d6f2af2d71e32515f9e17aafbc45b00fe6fcb60db4db + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.2.1" tolyui_navigation: - dependency: "direct main" + dependency: transitive description: name: tolyui_navigation - sha256: c1bf119679b03e72272266fd64d1310056886f334c30e9f9cd7380927f05cabc + sha256: "777685f1794b7b93c6ff901e54843feac6e24833e3f243dce40c2bdc87964cae" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.8" + tolyui_rx_layout: + dependency: transitive + description: + name: tolyui_rx_layout + sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.3" + version: "1.0.0" treasure_tools: dependency: "direct main" description: @@ -1084,5 +1100,5 @@ packages: source: hosted version: "1.0.1" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.3.4 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 44f077f2..11dc2c36 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,8 +24,8 @@ dependencies: ## fx 架构 - app 启动器 app_boot_starter: ^1.0.0 - ## tolyui 导航模块 - tolyui_navigation: ^0.0.3 + ## tolyui + tolyui: ^0.0.2 package_info_plus: ^4.1.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 From f0fac67b2fb6f00c9c7630fbe0f7d5a2a9c8da2d Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 23 Jun 2024 17:30:53 +0800 Subject: [PATCH 068/149] update plugin version --- lib/app_stater/impl/start_repository.dart | 17 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- packages/app/lib/app_config/bloc/bloc.dart | 24 +- packages/app/pubspec.yaml | 6 +- packages/app_update/pubspec.yaml | 8 +- packages/artifact/pubspec.yaml | 2 +- packages/authentication/pubspec.yaml | 4 +- packages/components/pubspec.yaml | 2 +- packages/draw_system/pubspec.yaml | 2 +- packages/l10n/l10n_copy.sh | 11 + packages/l10n/lib/ext.dart | 1 + packages/l10n/pubspec.yaml | 1 + packages/l10n/test/l10n_copy.dart | 22 ++ packages/layout/pubspec.yaml | 2 +- packages/toly_ui/pubspec.yaml | 2 +- packages/treasure_tools/pubspec.yaml | 6 +- packages/utils/pubspec.yaml | 2 +- packages/widget_module/pubspec.yaml | 6 +- .../lib/StatelessWidget/Card/node1_base.dart | 6 +- packages/widgets/pubspec.yaml | 2 +- pubspec.lock | 244 ++++++++---------- pubspec.yaml | 40 ++- 22 files changed, 206 insertions(+), 208 deletions(-) create mode 100644 packages/l10n/l10n_copy.sh create mode 100644 packages/l10n/test/l10n_copy.dart diff --git a/lib/app_stater/impl/start_repository.dart b/lib/app_stater/impl/start_repository.dart index 84635f9a..84b48fc9 100644 --- a/lib/app_stater/impl/start_repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -1,5 +1,3 @@ - - import 'dart:convert'; import 'dart:io'; @@ -11,7 +9,6 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; - class AppStartRepositoryImpl implements AppStartRepository { const AppStartRepositoryImpl(); @@ -22,8 +19,12 @@ class AppStartRepositoryImpl implements AppStartRepository { await SpStorage.instance.initSp(); await initDb(); AppConfigPo po = await SpStorage.instance.appConfig.read(); - ConnectivityResult netConnect = await (Connectivity().checkConnectivity()); - return AppConfigState.fromPo(po).copyWith(netConnect: netConnect); + List netConnect = await (Connectivity().checkConnectivity()); + AppConfigState state = AppConfigState.fromPo(po); + if (netConnect.isNotEmpty) { + state = state.copyWith(netConnect: netConnect.first); + } + return state; } @override @@ -33,8 +34,7 @@ class AppStartRepositoryImpl implements AppStartRepository { return; } - - Future initDb() async{ + Future initDb() async { DbOpenHelper.setupDatabase(); //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); @@ -60,8 +60,7 @@ class AppStartRepositoryImpl implements AppStartRepository { await dir.create(recursive: true); } ByteData data = await rootBundle.load("assets/flutter.db"); - List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(dbPath).writeAsBytes(bytes, flush: true); print("=====flutter.db==== assets ======拷贝完成===="); diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 56911c68..20085aa4 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -16,8 +16,8 @@ import url_launcher_macos import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) - FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/packages/app/lib/app_config/bloc/bloc.dart index 981c7996..b161bc39 100644 --- a/packages/app/lib/app_config/bloc/bloc.dart +++ b/packages/app/lib/app_config/bloc/bloc.dart @@ -7,34 +7,34 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; - /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com /// 说明: 全局信息的bloc class AppConfigBloc extends Cubit { - final Connectivity _connectivity = Connectivity(); - late StreamSubscription _subscription; + late StreamSubscription> _subscription; - AppConfigBloc() : super(const AppConfigState()){ + AppConfigBloc() : super(const AppConfigState()) { _subscription = _connectivity.onConnectivityChanged.listen(_onNetConnectChange); } - void _onNetConnectChange(ConnectivityResult event) { - emit(state.copyWith(netConnect: event,)); + void _onNetConnectChange(List event) { + if (event.isNotEmpty) { + emit(state.copyWith( + netConnect: event.first, + )); + } } - @override - Future close() async{ + Future close() async { _subscription.cancel(); super.close(); } - - void init(AppConfigState state){ + void init(AppConfigState state) { emit(state); } @@ -89,13 +89,13 @@ class AppConfigBloc extends Cubit { emit(newState); } - void changeThemeMode(ThemeMode style) async{ + void changeThemeMode(ThemeMode style) async { AppConfigState newState = state.copyWith(themeMode: style); cao.write(newState.toAppConfigPo()); emit(newState); } - void switchShowTool(bool show) async{ + void switchShowTool(bool show) async { AppConfigState newState = state.copyWith(showOverlayTool: show); cao.write(newState.toAppConfigPo()); emit(newState); diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index 9d825a34..70d1dcb7 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -10,11 +10,11 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.2 # xml 固化 - connectivity_plus: ^5.0.2 - window_manager: ^0.3.7 #桌面尺寸 + connectivity_plus: ^6.0.3 + window_manager: ^0.3.9 #桌面尺寸 storage: path: ../storage widget_module: diff --git a/packages/app_update/pubspec.yaml b/packages/app_update/pubspec.yaml index 93c2ce9e..23a501dc 100644 --- a/packages/app_update/pubspec.yaml +++ b/packages/app_update/pubspec.yaml @@ -10,12 +10,12 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 - shared_preferences: ^2.2.1 # xml 固化 + shared_preferences: ^2.2.3 # xml 固化 r_upgrade: ^0.4.2 # 应用升级 - url_launcher: ^6.1.14 # url - package_info_plus: ^4.0.2 + url_launcher: ^6.3.0 # url + package_info_plus: ^8.0.0 utils: path: ../utils app: diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 2e1e2923..fdd79072 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 dio: ^5.3.2 # 网络请求 webview_flutter: ^4.2.4 url_launcher: ^6.1.14 # url diff --git a/packages/authentication/pubspec.yaml b/packages/authentication/pubspec.yaml index c9bf30b6..f7a96759 100644 --- a/packages/authentication/pubspec.yaml +++ b/packages/authentication/pubspec.yaml @@ -10,10 +10,10 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.1 # xml 固化 - go_router: ^13.2.2 + go_router: ^14.2.0 utils: path: ../utils app_update: diff --git a/packages/components/pubspec.yaml b/packages/components/pubspec.yaml index ccd43218..0073e268 100644 --- a/packages/components/pubspec.yaml +++ b/packages/components/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter flutter_spinkit: ^5.2.0 # loading - flutter_markdown: ^0.6.4 # markdown + flutter_markdown: ^0.7.2+1 # markdown toly_ui: path: ../toly_ui app: diff --git a/packages/draw_system/pubspec.yaml b/packages/draw_system/pubspec.yaml index eebc096f..d0f36408 100644 --- a/packages/draw_system/pubspec.yaml +++ b/packages/draw_system/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: components: path: ../components dash_painter: ^1.0.2 - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 url_launcher: ^6.1.14 # url image: ^4.0.17 dev_dependencies: diff --git a/packages/l10n/l10n_copy.sh b/packages/l10n/l10n_copy.sh new file mode 100644 index 00000000..7f95dd96 --- /dev/null +++ b/packages/l10n/l10n_copy.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# 复制文件夹 +cp -r .dart_tool/flutter_gen/gen_l10n lib + +# 检查拷贝是否成功 +if [ $? -eq 0 ]; then + echo "文件夹拷贝成功" +else + echo "文件夹拷贝失败" +fi \ No newline at end of file diff --git a/packages/l10n/lib/ext.dart b/packages/l10n/lib/ext.dart index 2d5fb903..e65fed43 100644 --- a/packages/l10n/lib/ext.dart +++ b/packages/l10n/lib/ext.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import 'gen_l10n/app_localizations.dart'; const l10nDelegates = AppLocalizations.localizationsDelegates; diff --git a/packages/l10n/pubspec.yaml b/packages/l10n/pubspec.yaml index 27f3c2ce..8ca05064 100644 --- a/packages/l10n/pubspec.yaml +++ b/packages/l10n/pubspec.yaml @@ -24,6 +24,7 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: generate: true # 自动生成 l10n + # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/packages/l10n/test/l10n_copy.dart b/packages/l10n/test/l10n_copy.dart new file mode 100644 index 00000000..9118552f --- /dev/null +++ b/packages/l10n/test/l10n_copy.dart @@ -0,0 +1,22 @@ +import 'dart:io'; + +import 'package:path/path.dart' as path; + +void main() async { + Directory distDir = + Directory(path.join(Directory.current.path, '.dart_tool', 'flutter_gen', 'gen_l10n')); + if (!distDir.existsSync()) return; + + Directory srcDir = Directory(path.join(Directory.current.path, 'lib', 'gen_l10n')); + if (srcDir.existsSync()) { + await srcDir.delete(recursive: true); + } else { + await srcDir.create(recursive: true); + } + List entity = distDir.listSync(); + for (FileSystemEntity e in entity) { + if (e is File) { + e.copy(path.join(srcDir.path, path.basename(e.path))); + } + } +} diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml index ca9163a4..0267092c 100644 --- a/packages/layout/pubspec.yaml +++ b/packages/layout/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: tolyui: ^0.0.2 # 路由管理 - go_router: ^13.2.2 + go_router: ^14.2.0 dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/toly_ui/pubspec.yaml b/packages/toly_ui/pubspec.yaml index af2ee247..72ead5dc 100644 --- a/packages/toly_ui/pubspec.yaml +++ b/packages/toly_ui/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_markdown: ^0.6.4 # markdown + flutter_markdown: ^0.7.2+1 # markdown dev_dependencies: flutter_test: diff --git a/packages/treasure_tools/pubspec.yaml b/packages/treasure_tools/pubspec.yaml index 444f2687..0f60e5df 100644 --- a/packages/treasure_tools/pubspec.yaml +++ b/packages/treasure_tools/pubspec.yaml @@ -10,10 +10,10 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 - archive: ^3.4.10 # 解压 - file_picker: ^6.1.1 + archive: ^3.6.1 # 解压 + file_picker: ^8.0.5 shared_preferences: ^2.2.2 # xml 固化 utils: path: ../utils diff --git a/packages/utils/pubspec.yaml b/packages/utils/pubspec.yaml index e558a7bb..3cef9949 100644 --- a/packages/utils/pubspec.yaml +++ b/packages/utils/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - dio: ^5.4.0 # 网络请求 + dio: ^5.4.3+1 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 dev_dependencies: flutter_test: diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index df43a142..04359ae5 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 flutter_star: ^1.0.2 # 星星组件 toggle_rotate: ^1.0.1 @@ -22,7 +22,7 @@ dependencies: path: ../storage toly_ui: path: ../toly_ui - share_plus: ^7.2.1 # 文字分享 + share_plus: ^9.0.0 # 文字分享 components: path: ../components authentication: @@ -35,7 +35,7 @@ dependencies: path: ../widgets utils: path: ../utils - go_router: ^13.2.2 + go_router: ^14.2.0 dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart b/packages/widgets/lib/StatelessWidget/Card/node1_base.dart index 36aa99b2..13f833cc 100644 --- a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart +++ b/packages/widgets/lib/StatelessWidget/Card/node1_base.dart @@ -1,5 +1,3 @@ - - import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 @@ -27,10 +25,10 @@ class CustomCard extends StatelessWidget { child: Container( alignment: Alignment.topLeft, width: 200, - height: 0.618*200, + height: 0.618 * 200, margin: const EdgeInsets.all(10), child: const Text("Card", style: TextStyle(fontSize: 20)), ), ); } -} \ No newline at end of file +} diff --git a/packages/widgets/pubspec.yaml b/packages/widgets/pubspec.yaml index 4e4b43d1..4a092edc 100644 --- a/packages/widgets/pubspec.yaml +++ b/packages/widgets/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - path_provider: ^2.0.11 # 路径 + path_provider: ^2.1.3 # 路径 intl: ^0.19.0 app: path: ../app diff --git a/pubspec.lock b/pubspec.lock index c0b48b20..30ec1ebd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -34,10 +34,10 @@ packages: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.flutter-io.cn/" source: hosted - version: "3.4.10" + version: "3.6.1" args: dependency: transitive description: @@ -119,34 +119,26 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.0.2" + version: "6.0.3" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.4" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.1.1" + version: "2.0.0" cross_file: dependency: transitive description: name: cross_file - sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.3+4" + version: "0.3.4+1" crypto: dependency: transitive description: @@ -183,10 +175,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" + sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.4.0" + version: "5.4.3+1" draw_system: dependency: "direct main" description: @@ -214,10 +206,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "2.1.2" file: dependency: transitive description: @@ -230,10 +222,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" + sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.1" + version: "8.0.5" flutter: dependency: "direct main" description: flutter @@ -243,10 +235,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a url: "https://pub.flutter-io.cn/" source: hosted - version: "8.1.5" + version: "8.1.6" flutter_lints: dependency: "direct dev" description: @@ -264,26 +256,26 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "981442432b632237ffc1cf8092b4173b9e9f2278b5740637287c3069b51c8f09" + sha256: "85cc6f7daeae537844c92e2d56e2aff61b00095f8f77913b529ea4be12fc45ea" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.6.13" + version: "0.7.2+1" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" + sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.15" + version: "2.0.20" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.2.0" + version: "5.2.1" flutter_star: dependency: "direct main" description: @@ -296,10 +288,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.7" + version: "2.0.10+1" flutter_test: dependency: "direct dev" description: flutter @@ -314,18 +306,18 @@ packages: dependency: "direct main" description: name: go_router - sha256: "5ed2687bc961f33a752017ccaa7edead3e5601b28b6376a5901bf24728556b85" + sha256: cdae1b9c8bd7efadcef6112e81c903662ef2ce105cbd220a04bbb7c3425b5554 url: "https://pub.flutter-io.cn/" source: hosted - version: "13.2.2" + version: "14.2.0" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.13.5" + version: "1.2.1" http_parser: dependency: transitive description: @@ -338,10 +330,10 @@ packages: dependency: "direct main" description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.17" + version: "4.2.0" intl: dependency: "direct main" description: @@ -350,14 +342,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.19.0" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.6.7" jwt_decoder: dependency: "direct main" description: @@ -424,10 +408,10 @@ packages: dependency: transitive description: name: markdown - sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2 + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.1" + version: "7.2.2" matcher: dependency: transitive description: @@ -480,18 +464,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a" + sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 url: "https://pub.flutter-io.cn/" source: hosted - version: "4.1.0" + version: "8.0.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.1" + version: "3.0.0" path: dependency: transitive description: @@ -512,10 +496,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "2.1.3" path_provider_android: dependency: transitive description: @@ -528,10 +512,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -576,18 +560,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.4" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.7.3" + version: "2.1.8" process: dependency: transitive description: @@ -632,26 +608,26 @@ packages: dependency: "direct main" description: name: share_plus - sha256: f74fc3f1cbd99f39760182e176802f693fa0ec9625c045561cfad54681ea93dd + sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 url: "https://pub.flutter-io.cn/" source: hosted - version: "7.2.1" + version: "9.0.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.1" + version: "4.0.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_android: dependency: transitive description: @@ -664,10 +640,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.4" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -717,34 +693,34 @@ packages: dependency: "direct main" description: name: sqflite - sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.0" + version: "2.3.3+1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bb4738f15b23352822f4c42a531677e5c6f522e079461fd240ead29d8d8a54a6 + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.5.0+2" + version: "2.5.4" sqflite_common_ffi: dependency: "direct main" description: name: sqflite_common_ffi - sha256: "873677ee78738a723d1ded4ccb23980581998d873d30ee9c331f6a81748663ff" + sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.3.3" sqlite3: dependency: transitive description: name: sqlite3 - sha256: "8922805564b78eb7aa9386c10056d377a541ac7270dc6a1589176277ebb4d15d" + sha256: b384f598b813b347c5a7e5ffad82cbaff1bec3d1561af267041e66f6f0899295 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0" + version: "2.4.3" stack_trace: dependency: transitive description: @@ -827,10 +803,10 @@ packages: dependency: "direct main" description: name: tolyui - sha256: "8fcd5fb7f763db3b04ace1586f6930220990abb6eefc809faff78fcb435f04e4" + sha256: "92c3ea5f9240746c336dca8ab898797144e52545a8061937df20c924b6e5cdb7" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2" + version: "0.0.2+7" tolyui_feedback: dependency: transitive description: @@ -851,10 +827,10 @@ packages: dependency: transitive description: name: tolyui_navigation - sha256: "777685f1794b7b93c6ff901e54843feac6e24833e3f243dce40c2bdc87964cae" + sha256: "1b1012899d477f7860e60e564abe152dab86cbd31b091065525f57b31d139dc6" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.8" + version: "0.0.8+3" tolyui_rx_layout: dependency: transitive description: @@ -882,66 +858,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.1.14" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "6f91d30ce9060c204b2dbe728adb300750fa4b228e8f7ed1b961aa1ceb728799" + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.22" + version: "6.3.3" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "6ba7dddee26c9fae27c9203c424631109d73c8fa26cfa7bc3e35e751cb87f62e" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.17" + version: "6.3.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.5" + version: "3.1.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: a9b3ea9043eabfaadfa3fb89de67a11210d85569086d22b3854484beab8b3978 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.1" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.2" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.16" + version: "2.3.1" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.6" + version: "3.1.1" utils: dependency: "direct main" description: @@ -961,26 +937,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f" + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.7" + version: "1.1.11+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f" + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.7" + version: "1.1.11+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e" + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.7" + version: "1.1.11+1" vector_math: dependency: transitive description: @@ -997,38 +973,46 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.5.1" webview_flutter: dependency: "direct main" description: name: webview_flutter - sha256: "42393b4492e629aa3a88618530a4a00de8bb46e50e7b3993fedbfdc5352f0dbf" + sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.4.2" + version: "4.8.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "8326ee235f87605a2bfc444a4abc897f4abc78d83f054ba7d3d1074ce82b4fbf" + sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc url: "https://pub.flutter-io.cn/" source: hosted - version: "3.12.1" + version: "3.16.4" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "68e86162aa8fc646ae859e1585995c096c95fc2476881fa0c4a8d10f56013a5a" + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d url: "https://pub.flutter-io.cn/" source: hosted - version: "2.8.0" + version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: accdaaa49a2aca2dc3c3230907988954cdd23fed0a19525d6c9789d380f4dc76 + sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.9.4" + version: "3.13.1" widget_module: dependency: "direct main" description: @@ -1047,18 +1031,18 @@ packages: dependency: transitive description: name: win32 - sha256: "7dacfda1edcca378031db9905ad7d7bd56b29fd1a90b0908b71a52a12c41e36b" + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 url: "https://pub.flutter-io.cn/" source: hosted - version: "5.0.3" + version: "5.5.1" window_manager: dependency: transitive description: name: window_manager - sha256: dcc865277f26a7dad263a47d0e405d77e21f12cb71f30333a52710a408690bd7 + sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.7" + version: "0.3.9" wrapper: dependency: "direct main" description: @@ -1083,22 +1067,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "3.1.1" - yaml_modify: - dependency: "direct main" - description: - name: yaml_modify - sha256: "0c67ba263546f44b738c9ae14bd602bb1ef75c74a61a25b9111708a7a7e9af94" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.0.1" sdks: - dart: ">=3.3.4 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 11dc2c36..a9ac4f14 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: cupertino_icons: ^1.0.4 - flutter_bloc: ^8.1.3 # 状态管理 + flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 stream_transform: ^2.1.0 @@ -25,39 +25,37 @@ dependencies: app_boot_starter: ^1.0.0 ## tolyui - tolyui: ^0.0.2 + tolyui: ^0.0.2+7 - package_info_plus: ^4.1.0 # 应用包信息 + package_info_plus: ^8.0.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 - webview_flutter: ^4.4.2 - go_router: ^13.2.2 - sqflite: ^2.3.0 # 数据库 - sqflite_common_ffi: ^2.3.1 # 数据库 - shared_preferences: ^2.2.2 # xml 固化 - path_provider: ^2.1.1 # 路径 - - dio: ^5.4.0 # 网络请求 + webview_flutter: ^4.8.0 + go_router: ^14.2.0 + sqflite: ^2.3.3+1 # 数据库 + sqflite_common_ffi: ^2.3.3 # 数据库 + shared_preferences: ^2.2.3 # xml 固化 + path_provider: ^2.1.3 # 路径 + + dio: ^5.4.3+1 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 - connectivity_plus: ^5.0.2 + connectivity_plus: ^6.0.3 refresh: ^1.0.1 toggle_rotate: ^1.0.1 flutter_star: ^1.0.2 # 星星组件 dash_painter: ^1.0.2 wrapper: ^1.0.2 - yaml_modify: ^1.0.1 - url_launcher: ^6.1.14 # url - share_plus: ^7.2.1 # 文字分享 + url_launcher: ^6.3.0 # url + share_plus: ^9.0.0 # 文字分享 - flutter_svg: ^2.0.7 + flutter_svg: ^2.0.10+1 intl: ^0.19.0 platform: ^3.1.0 - image: ^4.0.17 - flutter_spinkit: ^5.2.0 # loading - flutter_markdown: ^0.6.4 # markdown -# file_selector: ^0.9.2+2 - file_picker: ^6.1.1 + image: ^4.2.0 + flutter_spinkit: ^5.2.1 # loading + flutter_markdown: ^0.7.2+1 # markdown + file_picker: ^8.0.5 l10n: path: packages/l10n utils: From 97dbc96f7c895eecdcbea18e06929211fc6f5952 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 25 Jun 2024 08:11:03 +0800 Subject: [PATCH 069/149] flex player --- lib/app/flutter_unit.dart | 22 +- .../lib/src/data/display_map/display_map.dart | 3 + .../lib/src/data/display_map/multi.dart | 36 ++ .../lib/src/navigation/menu/base_layout.dart | 52 +- .../layout/lib/src/navigation/menu/flex.dart | 36 -- .../navigation/menu/menu_repository_impl.dart | 22 +- .../layout/lib/src/navigation/menu/multi.dart | 32 + .../src/navigation/router/desk_router.dart | 148 ++--- .../navigation/view/app_desk_navigation.dart | 82 +-- .../src/navigation/view/app_menu_tree.dart | 19 +- .../layout/lib/src/views/layout_page.dart | 8 +- .../lib/src/views/multi/flex/column_show.dart | 23 + .../multi/flex/drop_selectable_widget.dart | 252 ++++++++ .../src/views/multi/flex/flex_playground.dart | 552 ++++++++++++++++++ .../lib/src/views/multi/flex/row_show.dart | 23 + .../views/playground/layout_playground.dart | 33 +- .../views/playground/playground_top_bar.dart | 62 +- packages/layout/pubspec.yaml | 2 +- 18 files changed, 1098 insertions(+), 309 deletions(-) create mode 100644 packages/layout/lib/src/data/display_map/multi.dart delete mode 100644 packages/layout/lib/src/navigation/menu/flex.dart create mode 100644 packages/layout/lib/src/navigation/menu/multi.dart create mode 100644 packages/layout/lib/src/views/multi/flex/column_show.dart create mode 100644 packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart create mode 100644 packages/layout/lib/src/views/multi/flex/flex_playground.dart create mode 100644 packages/layout/lib/src/views/multi/flex/row_show.dart diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 73780d2a..391203b5 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_unit/navigation/routers/app_route.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; +import 'package:tolyui/tolyui.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com @@ -29,17 +30,22 @@ class FlutterUnit3 extends StatelessWidget { notifier: SortState(), child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), - child: MaterialApp.router( - routerConfig: _router, - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - localizationsDelegates: l10nDelegates, - supportedLocales: l10nLocales, - locale: state.language.locale, + child: TolyMessage( themeMode: state.themeMode, darkTheme: AppTheme.darkTheme(state), theme: AppTheme.lightTheme(state), + child: MaterialApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: l10nDelegates, + supportedLocales: l10nLocales, + locale: state.language.locale, + themeMode: state.themeMode, + darkTheme: AppTheme.darkTheme(state), + theme: AppTheme.lightTheme(state), + ), ), ), ); diff --git a/packages/layout/lib/src/data/display_map/display_map.dart b/packages/layout/lib/src/data/display_map/display_map.dart index 4de1ca6b..30311825 100644 --- a/packages/layout/lib/src/data/display_map/display_map.dart +++ b/packages/layout/lib/src/data/display_map/display_map.dart @@ -8,6 +8,7 @@ import '../../views/popable/dropdown_button_demo.dart'; import '../../views/popable/dropdown_menu_demo.dart'; import '../model/display_frame.dart'; import 'base.dart'; +import 'multi.dart'; Map> get kDisplayMap => { '/base/size': baseSize, @@ -15,6 +16,8 @@ Map> get kDisplayMap => { '/base/align': baseAlign, '/base/positioned': basePostioned, + '/multi/flex': multiFlex, + // '/popable/DropdownButton': [ // DisplayFrame( // title: '下拉按钮 DropdownButton', diff --git a/packages/layout/lib/src/data/display_map/multi.dart b/packages/layout/lib/src/data/display_map/multi.dart new file mode 100644 index 00000000..f4e4ef25 --- /dev/null +++ b/packages/layout/lib/src/data/display_map/multi.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:layout/src/views/base/positioned/positioned_show.dart'; + +import '../../views/base/align/align_show.dart'; +import '../../views/base/align/align_show2.dart'; +import '../../views/base/padding/inner_padding.dart'; +import '../../views/base/padding/outer_padding.dart'; +import '../../views/base/padding/sizedbox_padding.dart'; +import '../../views/base/size/size_loss_by_align.dart'; +import '../../views/base/size/size_tight_constraint.dart'; +import '../../views/base/size/size_unconstraint.dart'; +import '../../views/multi/flex/column_show.dart'; +import '../../views/multi/flex/flex_playground.dart'; +import '../../views/multi/flex/row_show.dart'; +import '../model/display_frame.dart'; + +List get multiFlex => [ + DisplayFrame( + title: 'Row 组件横向排列', + desc: "可以将若干个组件横向排列,区域宽度无上限约束,子组件总宽超过时会越界异常。详细布局特性见第三页: Flex PlayGround", + src: '', + display: (BuildContext context) => const RowShow(), + ), + DisplayFrame( + title: 'Column 组件横向排列', + desc: "可以将若干个组件竖向排列,区域高度无上限约束,子组件总高超过时会越界异常。详细布局特性见第三页: Flex PlayGround", + src: '', + display: (BuildContext context) => const ColumnShow(), + ), + DisplayFrame( + title: 'Flex PlayGround', + desc: "在 Flex PlayGround 中,你可以通过交互来直观体验 Flex 布局特性。灰色是 Flex 布局区域。", + src: '', + display: (BuildContext context) => const FlexPlayground(), + ), + ]; diff --git a/packages/layout/lib/src/navigation/menu/base_layout.dart b/packages/layout/lib/src/navigation/menu/base_layout.dart index ddbf71cf..df3f5da7 100644 --- a/packages/layout/lib/src/navigation/menu/base_layout.dart +++ b/packages/layout/lib/src/navigation/menu/base_layout.dart @@ -2,33 +2,25 @@ import 'package:flutter/material.dart'; // import 'package:iroute/app/res/fx_icon.dart'; Map get baseMenus => { - 'path': '/base', - 'icon': Icons.layers_rounded, - 'label': '基本布局', - 'children': [ - { - 'path': '/size', - 'label': '布局尺寸', - }, - { - 'path': '/padding', - 'label': '布局边距', - // 'icon': Icons.calculate_outlined, - }, - { - 'path': '/align', - 'label': '布局对齐', - // 'icon': Icons.calculate_outlined, - }, - { - 'path': '/positioned', - 'label': '布局定位', - // 'icon': Icons.calculate_outlined, - }, - // { - // 'path': '/parser', - // 'label': '文字解析器', - // 'icon': Icons.text_fields, - // }, - ] -}; + 'path': '/base', + 'icon': Icons.layers_rounded, + 'label': '基本布局', + 'children': [ + { + 'path': '/size', + 'label': '布局尺寸', + }, + { + 'path': '/padding', + 'label': '布局边距', + }, + { + 'path': '/align', + 'label': '布局对齐', + }, + { + 'path': '/positioned', + 'label': '布局定位', + }, + ] + }; diff --git a/packages/layout/lib/src/navigation/menu/flex.dart b/packages/layout/lib/src/navigation/menu/flex.dart deleted file mode 100644 index 9860d711..00000000 --- a/packages/layout/lib/src/navigation/menu/flex.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:iroute/app/res/fx_icon.dart'; -// { -// 'path': '/expanded', -// 'label': '延展布局', -// // 'icon': Icons.text_fields, -// }, -// { -// 'path': '/holy', -// 'label': '圣杯布局', -// // 'icon': Icons.text_fields, -// }, -Map get drawMenus => { - 'path': '/multi', - // 'icon': FxIcon.icon_paint, - 'icon':Icons.multitrack_audio, - 'label': '多子布局', - 'children': [ - { - 'path': '/row_column', - 'label': '行列布局', - // 'icon': Icons.text_fields, - }, - { - 'path': '/wrap', - 'label': '包裹布局', - // 'icon': Icons.text_fields, - }, - { - 'path': '/stack', - 'label': '堆叠布局', - // 'icon': Icons.text_fields, - }, - - ] -}; diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart index bd8b2991..6bb07e86 100644 --- a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -1,18 +1,16 @@ - import 'base_layout.dart'; import 'scroll.dart'; import 'layout.dart'; -import 'flex.dart'; +import 'multi.dart'; Map get layoutMenus => { - 'path': '', - 'label': '', - 'children': [ - home, - baseMenus, - drawMenus, - calcMenus, + 'path': '', + 'label': '', + 'children': [ + home, + baseMenus, + drawMenus, + calcMenus, // popableMenus, - ] -} -; + ] + }; diff --git a/packages/layout/lib/src/navigation/menu/multi.dart b/packages/layout/lib/src/navigation/menu/multi.dart new file mode 100644 index 00000000..17edec0b --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/multi.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +// import 'package:iroute/app/res/fx_icon.dart'; +// { +// 'path': '/expanded', +// 'label': '延展布局', +// // 'icon': Icons.text_fields, +// }, +// { +// 'path': '/holy', +// 'label': '圣杯布局', +// // 'icon': Icons.text_fields, +// }, +Map get drawMenus => { + 'path': '/multi', + 'icon': Icons.multitrack_audio, + 'label': '多子布局', + 'children': [ + { + 'path': '/flex', + 'label': '行列布局', + }, + { + 'path': '/wrap', + 'label': '包裹布局', + }, + { + 'path': '/stack', + 'label': '堆叠布局', + }, + ] + }; diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/packages/layout/lib/src/navigation/router/desk_router.dart index 236b34e8..c4f5937c 100644 --- a/packages/layout/lib/src/navigation/router/desk_router.dart +++ b/packages/layout/lib/src/navigation/router/desk_router.dart @@ -8,93 +8,95 @@ import '../../views/test_show.dart'; import '../menu/menu_repository_impl.dart'; import '../view/app_desk_navigation.dart'; - - RouteBase get deskNavRoute => ShellRoute( - builder: (BuildContext context, GoRouterState state, Widget child) { - return AppDeskNavigation(content: child); - }, - routes: [ - GoRoute( - path: 'home', - builder: (BuildContext context, GoRouterState state) { - return const LayoutPage(); - }, - ), - GoRoute( - path: 'base/:name', - builder: (BuildContext context, GoRouterState state) { - return const FrameDisplayPanel(); - }, - ), - GoRoute( - path: 'popable/:name', - builder: (BuildContext context, GoRouterState state) { - return const FrameDisplayPanel(); +RouteBase get deskNavRoute => ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return AppDeskNavigation(content: child); }, - ), - GoRoute( - path: 'multi', - builder: (_,__)=>Text("暂未实现"), routes: [ GoRoute( - path: 'row', + path: 'home', builder: (BuildContext context, GoRouterState state) { - return TextShow( - info: 'row', - ); + return const LayoutPage(); }, ), GoRoute( - path: 'column', + path: 'base/:name', builder: (BuildContext context, GoRouterState state) { - return TextShow( - info: 'column', - ); + return const FrameDisplayPanel(); }, - ), GoRoute( - path: 'expanded', + ), + GoRoute( + path: 'popable/:name', builder: (BuildContext context, GoRouterState state) { - return TextShow( - info: 'expanded', - ); + return const FrameDisplayPanel(); }, ), GoRoute( - path: 'holy', + path: 'multi/:name', builder: (BuildContext context, GoRouterState state) { - return TextShow( - info: 'holy', - ); + return const FrameDisplayPanel(); }, + // builder: (_,__)=>Text("暂未实现"), + // routes: [ + // GoRoute( + // path: 'row', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'row', + // ); + // }, + // ), + // GoRoute( + // path: 'column', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'column', + // ); + // }, + // ), GoRoute( + // path: 'expanded', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'expanded', + // ); + // }, + // ), + // GoRoute( + // path: 'holy', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'holy', + // ); + // }, + // ), + // ] ), - ] - ), - // GoRoute( - // path: 'text/gen/secret', - // builder: (BuildContext context, GoRouterState state) { - // return SecretGenPage(); - // }, - // ), - // GoRoute( - // path: 'text/:name', - // pageBuilder: (BuildContext context, GoRouterState state) { - // return CustomTransitionPage( - // key: ValueKey(state.uri.path), - // // transitionDuration: const Duration(milliseconds: 500), - // // reverseTransitionDuration: const Duration(milliseconds: 500), - // child: ToolListPanel( - // key: ValueKey(state.fullPath??''), - // name: state.pathParameters['name'] ?? ''), - // transitionsBuilder: (BuildContext context, - // Animation animation, - // Animation secondaryAnimation, - // Widget child) { - // return FadeTransition( - // opacity: animation.drive(CurveTween(curve: Curves.easeIn)), - // child: child, - // ); - // }); - // }, - // ), - ]); + // GoRoute( + // path: 'text/gen/secret', + // builder: (BuildContext context, GoRouterState state) { + // return SecretGenPage(); + // }, + // ), + // GoRoute( + // path: 'text/:name', + // pageBuilder: (BuildContext context, GoRouterState state) { + // return CustomTransitionPage( + // key: ValueKey(state.uri.path), + // // transitionDuration: const Duration(milliseconds: 500), + // // reverseTransitionDuration: const Duration(milliseconds: 500), + // child: ToolListPanel( + // key: ValueKey(state.fullPath??''), + // name: state.pathParameters['name'] ?? ''), + // transitionsBuilder: (BuildContext context, + // Animation animation, + // Animation secondaryAnimation, + // Widget child) { + // return FadeTransition( + // opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + // child: child, + // ); + // }); + // }, + // ), + ]); diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart index 07e13b1a..ac489485 100644 --- a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart +++ b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - +import 'package:tolyui/tolyui.dart'; import '../../views/playground/layout_playground.dart'; import 'app_menu_tree.dart'; @@ -13,86 +13,16 @@ class AppDeskNavigation extends StatelessWidget { @override Widget build(BuildContext context) { + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + return Scaffold( + backgroundColor: backgroundColor, body: Row( children: [ - DeskNavigationRail(), - Expanded(child: LayoutPlayGround( - content : content, - )), + const AppMenuTree(), + Expanded(child: LayoutPlayGround(content: content)), ], ), ); } } - -class DeskNavigationRail extends StatefulWidget { - final RangeValues rangeDx; - final double width; - - const DeskNavigationRail({ - super.key, - this.rangeDx = const RangeValues(160, 360), - this.width = 200, - }); - - @override - State createState() => _DeskNavigationRailState(); -} - -class _DeskNavigationRailState extends State { - late double _width = widget.width; - - @override - Widget build(BuildContext context) { - return SizedBox( - width: _width, - child: Stack( - alignment: Alignment.centerRight, - children: [ - AppMenuTree(), - DragChangeWidth( - onDragChanged: handleWidthChange, - ) - ], - ), - ); - } - - void handleWidthChange(double dx) { - double width = - (_width + dx).clamp(widget.rangeDx.start, widget.rangeDx.end); - if (width != _width) { - _width = width; - setState(() {}); - } - } -} - -class DragChangeWidth extends StatelessWidget { - final ValueChanged onDragChanged; - - const DragChangeWidth({super.key, required this.onDragChanged}); - - @override - Widget build(BuildContext context) { - return MouseRegion( - cursor: SystemMouseCursors.resizeColumn, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onHorizontalDragUpdate: _onHorizontalDragUpdate, - child: Container( - width: 6, - alignment: Alignment.centerRight, - // color: Colors.grey, - child: const VerticalDivider(), - ), - ), - ); - } - - void _onHorizontalDragUpdate(DragUpdateDetails details) { - onDragChanged(details.delta.dx); - } -} - diff --git a/packages/layout/lib/src/navigation/view/app_menu_tree.dart b/packages/layout/lib/src/navigation/view/app_menu_tree.dart index 8611dced..3242d3d7 100644 --- a/packages/layout/lib/src/navigation/view/app_menu_tree.dart +++ b/packages/layout/lib/src/navigation/view/app_menu_tree.dart @@ -7,7 +7,6 @@ import '../../ext/go_router/listener.dart'; import '../menu/menu_repository_impl.dart'; class AppMenuTree extends StatefulWidget { - const AppMenuTree({super.key}); @override @@ -15,10 +14,8 @@ class AppMenuTree extends StatefulWidget { } class _AppMenuTreeState extends State with RouterChangeListenerMixin { - late MenuTreeMeta _menuMeta; - @override void initState() { super.initState(); @@ -28,7 +25,7 @@ class _AppMenuTreeState extends State with RouterChangeListenerMixi void _initTreeMeta() { MenuNode root = MenuNode.fromMap(layoutMenus); List parts = Uri.parse(path).pathSegments; - String parentPath = parts.sublist(0,parts.length-1).join('/'); + String parentPath = parts.sublist(0, parts.length - 1).join('/'); _menuMeta = MenuTreeMeta( expandMenus: ['/$parentPath'], activeMenu: root.find(path), @@ -38,14 +35,16 @@ class _AppMenuTreeState extends State with RouterChangeListenerMixi @override Widget build(BuildContext context) { - Color expandBackgroundColor = context.isDark?Colors.black:Colors.transparent; - Color backgroundColor = context.isDark?Color(0xff001529):Colors.white; + Color expandBackgroundColor = context.isDark ? Colors.black : Colors.transparent; + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; return TolyRailMenuTree( - leading: SizedBox(height: 18,), + leading: const SizedBox( + height: 18, + ), enableWidthChange: true, maxWidth: 360, - width: 240, + width: 190, meta: _menuMeta, backgroundColor: backgroundColor, expandBackgroundColor: expandBackgroundColor, @@ -61,10 +60,10 @@ class _AppMenuTreeState extends State with RouterChangeListenerMixi } void _onSelect(MenuNode menu) { - if(menu.isLeaf){ + if (menu.isLeaf) { context.go(menu.id); print(path); - }else{ + } else { _menuMeta = _menuMeta.select(menu, singleExpand: true); setState(() {}); } diff --git a/packages/layout/lib/src/views/layout_page.dart b/packages/layout/lib/src/views/layout_page.dart index e7eeacd0..7b843ee7 100644 --- a/packages/layout/lib/src/views/layout_page.dart +++ b/packages/layout/lib/src/views/layout_page.dart @@ -44,12 +44,13 @@ class _LayoutRouterPageState extends State { child: Column( children: [ const Divider(), - Expanded(child: Router.withConfig(config: _router)), + Expanded( + child: Router.withConfig(config: _router), + ), ], ), ); } - } class LayoutPage extends StatelessWidget { @@ -57,7 +58,6 @@ class LayoutPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Material( - color: Colors.white, child: const Center(child: Text("TODO"))); + return Material(color: Colors.white, child: const Center(child: Text("TODO"))); } } diff --git a/packages/layout/lib/src/views/multi/flex/column_show.dart b/packages/layout/lib/src/views/multi/flex/column_show.dart new file mode 100644 index 00000000..63ffbb5c --- /dev/null +++ b/packages/layout/lib/src/views/multi/flex/column_show.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class ColumnShow extends StatelessWidget { + const ColumnShow({super.key}); + + @override + Widget build(BuildContext context) { + List colors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), + ]; + return Column( + children: [ + Container(width: 20, height: 20, color: colors[0]), + Container(width: 10, height: 80, color: colors[1]), + Container(width: 40, height: 30, color: colors[2]), + Container(width: 60, height: 20, color: colors[3]), + ], + ); + } +} diff --git a/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart b/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart new file mode 100644 index 00000000..769e59ac --- /dev/null +++ b/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart @@ -0,0 +1,252 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +typedef OnDropSelected = void Function(int index); + +class TolySelect extends StatefulWidget { + final List data; + final int selectIndex; + final OnDropSelected? onSelected; + final Color disableColor; + final double iconSize; + final double height; + final double width; + final double fontSize; + + const TolySelect({ + super.key, + this.data = const [], + required this.selectIndex, + this.onSelected, + this.disableColor = const Color(0xffcccccc), + this.iconSize = 24, + this.height = 30, + this.width = 200, + this.fontSize = 14, + }); + + @override + _TolySelectState createState() => _TolySelectState(); +} + +class _TolySelectState extends State with SingleTickerProviderStateMixin { + late FocusNode _node; + bool _focused = false; + late FocusAttachment _nodeAttachment; + OverlayEntry? _overlayEntry; + late AnimationController _ctrl; + late Animation animation; + final LayerLink layerLink = LayerLink(); + + @override + void initState() { + super.initState(); + + _ctrl = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + ); + + animation = Tween(begin: 0, end: pi).animate(_ctrl); + _node = FocusNode() + ..addListener(() { + if (_node.hasFocus != _focused) { + if (!_focused) { + _ctrl.forward(); + _showOverlay(); + } else { + _hideOverlay(); + _ctrl.reverse(); + } + setState(() { + _focused = _node.hasFocus; + }); + } + }); + _nodeAttachment = _node.attach(context); + } + + @override + void dispose() { + _node.dispose(); + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _nodeAttachment.reparent(); + return TapRegion( + groupId: 'selector', + onTapOutside: (_) { + _node.unfocus(); + }, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (_focused) { + _node.unfocus(); + } else { + _node.requestFocus(); + } + }, + child: CompositedTransformTarget( + link: layerLink, + child: _SelectTarget( + constraints: BoxConstraints.tight(Size(widget.width,widget.height)), + focused: _focused, + label: widget.data.isNotEmpty ? widget.data[widget.selectIndex] : "暂无数据", + fontSize: widget.fontSize, + disableColor: widget.disableColor, + animation: animation, + iconSize: widget.iconSize, + ), + ), + ), + ); + } + + void _showOverlay() { + _overlayEntry = _createOverlayEntry(); + Overlay.of(context, rootOverlay: true).insert(_overlayEntry!); + } + + void _hideOverlay() { + _overlayEntry?.remove(); + } + + OverlayEntry _createOverlayEntry() => OverlayEntry( + builder: (BuildContext context) => UnconstrainedBox( + child: CompositedTransformFollower( + link: layerLink, + targetAnchor: Alignment.bottomCenter, + followerAnchor: Alignment.topCenter, + child: Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Material( + shape: const RoundedRectangleBorder( + side: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(4))), + elevation: 0, + child: Container( + // height: 200, + // alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + border: + Border.all(color: Color(0xffe4e7ed), width: 1 / window.devicePixelRatio), + borderRadius: BorderRadius.all(Radius.circular(4)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + offset: const Offset(0, 2), + blurRadius: 6, + spreadRadius: 0, + ) + ]), + // padding: const EdgeInsets.only(top: 5), + width: widget.width, + child: ListView.builder( + shrinkWrap: true, + padding: EdgeInsets.symmetric(vertical: 8), + // shrinkWrap: true, + itemCount: widget.data.length, + itemBuilder: _buildItem), + ), + ), + ), + ), + ), + ); + + Widget _buildItem(BuildContext context, int index) { + return TapRegion( + groupId: 'selector', + child: Material( + color: Colors.white, + child: InkWell( + onTap: () { + if (widget.selectIndex != index) widget.onSelected?.call(index); + _overlayEntry?.markNeedsBuild(); + _node.unfocus(); + }, + child: Container( + padding: const EdgeInsets.all(8), + color: index == widget.selectIndex ? Color(0xfff5f7fa) : Colors.transparent, + child: Text( + widget.data[index], + style: TextStyle(fontSize: widget.fontSize), + )), + ), + ), + ); + } +} + +class _SelectTarget extends StatefulWidget { + final BoxConstraints? constraints; + final bool focused; + final String label; + final double fontSize; + final double iconSize; + final Color disableColor; + final Animation animation; + + const _SelectTarget({ + super.key, + this.constraints, + required this.focused, + required this.label, + required this.fontSize, + required this.disableColor, + required this.animation, + required this.iconSize, + }); + + @override + State<_SelectTarget> createState() => _SelectTargetState(); +} + +class _SelectTargetState extends State<_SelectTarget> { + Color get borderColor { + if (widget.focused) { + return Colors.blue; + } + return widget.disableColor; + } + + @override + Widget build(BuildContext context) { + return Container( + constraints: widget.constraints, + padding: const EdgeInsets.only(left: 6, right: 2), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: borderColor, + )), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.label, + style: TextStyle(height: 1, fontSize: widget.fontSize), + ), + AnimatedBuilder( + animation: widget.animation, + builder: (_, child) => Transform.rotate( + angle: widget.animation.value, + child: child, + ), + child: Icon( + Icons.keyboard_arrow_down, + size: widget.iconSize, + ), + ), + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/multi/flex/flex_playground.dart b/packages/layout/lib/src/views/multi/flex/flex_playground.dart new file mode 100644 index 00000000..e4e57eff --- /dev/null +++ b/packages/layout/lib/src/views/multi/flex/flex_playground.dart @@ -0,0 +1,552 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; +import 'package:tolyui/tolyui.dart'; + +import 'drop_selectable_widget.dart'; + +const List kColors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), +]; + +class FlexPlayground extends StatefulWidget { + const FlexPlayground({super.key}); + + @override + State createState() => _FlexPlaygroundState(); +} + +class _FlexPlaygroundState extends State { + List _data = []; + FlexAttr _attr = FlexAttr(direction: Axis.horizontal); + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _data = [ + DisplayItem(width: 20, height: 20, color: kColors[0]), + DisplayItem(width: 10, height: 80, color: kColors[1]), + DisplayItem(width: 40, height: 30, color: kColors[2]), + DisplayItem(width: 60, height: 20, color: kColors[3]), + ]; + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child:FlexDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )))), + VerticalDivider(), + SizedBox( + width: 200, + child: FlexOpTool( + attr: _attr, + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange:_onAttrChange, + + )), + ], + ); + } + + void _onAttrChange(FlexAttr attr){ + _attr = attr; + setState(() { + }); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + print(size); + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } +} + +class DisplayItem { + final double width; + final double height; + final Color color; + + DisplayItem({ + required this.width, + required this.height, + required this.color, + }); +} + +class FlexAttr { + final Axis direction; + final MainAxisAlignment mainAxisAlignment; + final CrossAxisAlignment crossAxisAlignment; + final MainAxisSize mainAxisSize; + final TextDirection? textDirection; + final VerticalDirection verticalDirection; + final TextBaseline textBaseline; + + FlexAttr({ + required this.direction, + this.mainAxisAlignment = MainAxisAlignment.start, + this.crossAxisAlignment = CrossAxisAlignment.center, + this.mainAxisSize = MainAxisSize.max, + this.textDirection, + this.textBaseline = TextBaseline.alphabetic, + this.verticalDirection = VerticalDirection.down, + }); + + FlexAttr copyWith({ + Axis? direction, + MainAxisAlignment? mainAxisAlignment, + CrossAxisAlignment? crossAxisAlignment, + MainAxisSize? mainAxisSize, + TextDirection? textDirection, + VerticalDirection? verticalDirection, + TextBaseline? textBaseline, + }) => + FlexAttr( + direction: direction ?? this.direction, + mainAxisAlignment: mainAxisAlignment ?? this.mainAxisAlignment, + crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, + mainAxisSize: mainAxisSize ?? this.mainAxisSize, + textDirection: textDirection ?? this.textDirection, + verticalDirection: verticalDirection ?? this.verticalDirection, + textBaseline: textBaseline ?? this.textBaseline, + ); +} + +class FlexDisplay extends StatelessWidget { + final List items; + final FlexAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const FlexDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Flex( + direction: attr.direction, + mainAxisAlignment: attr.mainAxisAlignment, + crossAxisAlignment: attr.crossAxisAlignment, + mainAxisSize: attr.mainAxisSize, + textDirection: attr.textDirection, + verticalDirection: attr.verticalDirection, + textBaseline: TextBaseline.alphabetic, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: FlexPlayItem( + item: items[index], + selected: active, + ), + ); + }).toList(), + ); + } +} + +class FlexOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final FlexAttr attr; + final ValueChanged onAttrChange; + + const FlexOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _FlexOpToolState(); +} + +class _FlexOpToolState extends State { + final TextEditingController widthCtrl = TextEditingController(text: '24'); + final TextEditingController heightCtrl = TextEditingController(text: '64'); + + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Flex 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle), + Spacer(), + TolyAction(child: Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), + TolyAction(child: Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + ), + child: Row( + children: [ + Text('宽高: ', style: labelStyle), + SizedBox(width: 20), + Expanded( + child: GridSizeSetting( + widthCtrl: widthCtrl, + heightCtrl: heightCtrl, + ), + ), + ], + ), + ), + const SizedBox(height: 12), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('排列方向:', style: labelStyle), + Text('direction', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + data: Axis.values.map((e) => e.name).toList(), + selectIndex: widget.attr.direction.index, + + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + Axis axis = Axis.values[index]; + widget.onAttrChange(widget.attr.copyWith(direction: axis)); + }, + ) + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('主轴对齐:', style: labelStyle), + Text('mainAxisAlignment', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + data: MainAxisAlignment.values.map((e) => e.name).toList(), + selectIndex: widget.attr.mainAxisAlignment.index, + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + MainAxisAlignment mainAxisAlignment = MainAxisAlignment.values[index]; + widget.onAttrChange(widget.attr.copyWith(mainAxisAlignment: mainAxisAlignment)); + }, + ) + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('主轴尺寸:', style: labelStyle), + Text('mainAxisSize', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + selectIndex: widget.attr.mainAxisSize.index, + data: MainAxisSize.values.map((e) => e.name).toList(), + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + MainAxisSize mainAxisSize = MainAxisSize.values[index]; + widget.onAttrChange(widget.attr.copyWith(mainAxisSize: mainAxisSize)); + }, + ) + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('叉轴对齐:', style: labelStyle), + Text('crossAxisAlignment', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + selectIndex: widget.attr.crossAxisAlignment.index, + + data: CrossAxisAlignment.values.map((e) => e.name).toList(), + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + CrossAxisAlignment value = CrossAxisAlignment.values[index]; + widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); + }, + ) + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('垂直方向:', style: labelStyle), + Text('verticalDirection', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + data: VerticalDirection.values.map((e) => e.name).toList(), + selectIndex: widget.attr.verticalDirection.index, + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + VerticalDirection verticalDirection = VerticalDirection.values[index]; + widget.onAttrChange(widget.attr.copyWith(verticalDirection: verticalDirection)); + }, + ) + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('文字方向:', style: labelStyle), + Text('textDirection', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + selectIndex: widget.attr.textDirection?.index??0, + data: TextDirection.values.map((e) => e.name).toList(), + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + TextDirection textDirection = TextDirection.values[index]; + widget.onAttrChange(widget.attr.copyWith(textDirection: textDirection)); + }, + ) + ], + ), + ), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('文字基线:', style: labelStyle), + Text('textBaseline', style: labelStyle.copyWith(fontSize: 8)), + ], + ), + Spacer(), + TolySelect( + fontSize: 11, + data: TextBaseline.values.map((e) => e.name).toList(), + selectIndex: widget.attr.textBaseline.index, + iconSize: 16, + height: 25, + width: 100, + onSelected: (int index) async { + TextBaseline value = TextBaseline.values[index]; + widget.onAttrChange(widget.attr.copyWith(textBaseline: value)); + }, + ) + ], + ), + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(widthCtrl.text); + final double? height = double.tryParse(heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } +} + +class FlexPlayItem extends StatefulWidget { + final DisplayItem item; + final bool selected; + const FlexPlayItem({ + super.key, + required this.item, + required this.selected, + }); + + @override + State createState() => _FlexPlayItemState(); +} + +class _FlexPlayItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.item.width, + height: widget.item.height, + decoration: BoxDecoration( + border: widget.selected ? Border.all() : null, + color: widget.item.color, + ), + ); + } +} + +class GridSetting extends StatelessWidget { + const GridSetting({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} + +class GridSizeSetting extends StatelessWidget { + final TextEditingController widthCtrl; + final TextEditingController heightCtrl; + const GridSizeSetting({ + super.key, + required this.widthCtrl, + required this.heightCtrl, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: CupertinoTextField( + controller: widthCtrl, + onChanged: (v) { + // logic.updateRow(v); + }, + style: TextStyle(fontSize: 12), + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text( + "x", + style: TextStyle(fontSize: 12), + ), + ), + Expanded( + child: CupertinoTextField( + controller: heightCtrl, + style: TextStyle(fontSize: 12), + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )) + ], + ); + } +} diff --git a/packages/layout/lib/src/views/multi/flex/row_show.dart b/packages/layout/lib/src/views/multi/flex/row_show.dart new file mode 100644 index 00000000..4a15ef26 --- /dev/null +++ b/packages/layout/lib/src/views/multi/flex/row_show.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class RowShow extends StatelessWidget { + const RowShow({super.key}); + + @override + Widget build(BuildContext context) { + List colors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), + ]; + return Row( + children: [ + Container(width: 20, height: 20, color: colors[0]), + Container(width: 10, height: 80, color: colors[1]), + Container(width: 40, height: 30, color: colors[2]), + Container(width: 60, height: 20, color: colors[3]), + ], + ); + } +} diff --git a/packages/layout/lib/src/views/playground/layout_playground.dart b/packages/layout/lib/src/views/playground/layout_playground.dart index 2ac2f8c4..72e43078 100644 --- a/packages/layout/lib/src/views/playground/layout_playground.dart +++ b/packages/layout/lib/src/views/playground/layout_playground.dart @@ -18,29 +18,20 @@ class LayoutPlayGround extends StatelessWidget { body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - PlaygroundTopBar(), - Divider(), - // Padding( - // padding: const EdgeInsets.only(left: 24,top: 12), - // child: Text("), - // ), + const PlaygroundTopBar(), + const Divider(), Expanded( child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 24.0, - vertical: 24 - ), - child: DecoratedBox( - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.withOpacity(0.4) - ), - ), - child: content, - ), - )), - Divider(), - PlaygroundBottomBar() + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 24), + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4)), + ), + child: content, + ), + )), + const Divider(), + const PlaygroundBottomBar() ], ), ); diff --git a/packages/layout/lib/src/views/playground/playground_top_bar.dart b/packages/layout/lib/src/views/playground/playground_top_bar.dart index 416ea18c..5a893447 100644 --- a/packages/layout/lib/src/views/playground/playground_top_bar.dart +++ b/packages/layout/lib/src/views/playground/playground_top_bar.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; import '../../bloc/display_logic.dart'; import '../../bloc/display_state.dart'; @@ -11,58 +12,43 @@ class PlaygroundTopBar extends StatelessWidget { Widget build(BuildContext context) { DisplayState state = DisplayScope.of(context).state; DisplayFrame frame = state.frame; - + const ActionStyle style = ActionStyle.light(backgroundColor: Color(0xffd5d5d5)); return Container( - color: Color(0xfff2f2f2), - padding: EdgeInsets.symmetric(horizontal: 12), + color: const Color(0xfff2f2f2), + padding: const EdgeInsets.symmetric(horizontal: 12), height: 46, child: NavigationToolbar( centerMiddle: true, leading: UnconstrainedBox( child: Align( alignment: Alignment.centerLeft, - child: Text('当前: ${state.activeIndex+1}/${state.total}', - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.bold - ), + child: Text( + '当前: ${state.activeIndex + 1}/${state.total}', + style: const TextStyle(color: Colors.grey, fontWeight: FontWeight.bold), )), ), - middle: Text(frame.title,style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16),), + middle: Text( + frame.title, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), trailing: Wrap( children: [ - IconButton( - onPressed: () { - DisplayScope.of(context).prevPage(); - - }, - icon: Icon(Icons.skip_previous), - ), - IconButton( - onPressed: () { - DisplayScope.of(context).nextPage(); - }, - icon: Icon(Icons.skip_next), - ), - IconButton( - onPressed: () {}, - icon: Icon(Icons.code), - ) + TolyAction( + style: style, + child: const Icon(Icons.skip_previous, size: 20), + onTap: () { + DisplayScope.of(context).prevPage(); + }), + TolyAction( + style: style, + child: const Icon(Icons.skip_next, size: 20), + onTap: () { + DisplayScope.of(context).nextPage(); + }), + TolyAction(style: style, child: const Icon(Icons.code, size: 20), onTap: () {}), ], ), ), ); - - return Container( - color: Color(0xfff2f2f2), - padding: EdgeInsets.symmetric(horizontal: 12), - height: 42, - child: Row( - children: [ - Spacer(), - IconButton(onPressed: () {}, icon: Icon(Icons.code)) - ], - ), - ); } } diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml index 0267092c..023f6a8f 100644 --- a/packages/layout/pubspec.yaml +++ b/packages/layout/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter # 菜单管理 - tolyui: ^0.0.2 + tolyui: ^0.0.2+7 # 路由管理 go_router: ^14.2.0 From e0036fd91736293c28cca845133b0b9a3c53b3e6 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 1 Jul 2024 07:38:01 +0800 Subject: [PATCH 070/149] Layout Playground --- .../lib/src/data/display_map/display_map.dart | 2 + .../lib/src/data/display_map/multi.dart | 29 +- .../navigation/menu/menu_repository_impl.dart | 5 +- .../layout/lib/src/navigation/menu/multi.dart | 8 +- .../navigation/view/app_desk_navigation.dart | 3 +- .../layout_playground.dart | 0 .../playground_bottom_bar.dart | 0 .../playground_top_bar.dart | 0 .../lib/src/views/multi/flex/column_show.dart | 8 +- .../multi/flex/drop_selectable_widget.dart | 252 -------- .../src/views/multi/flex/flex_playground.dart | 552 ------------------ .../layout/lib/src/views/playground/cons.dart | 16 + .../src/views/playground/data/flex_attr.dart | 48 ++ .../src/views/playground/data/stack_attr.dart | 50 ++ .../src/views/playground/data/wrap_attr.dart | 55 ++ .../views/playground/view/display_item.dart | 49 ++ .../playground/view/flex/flex_op_panel.dart | 170 ++++++ .../playground/view/flex/flex_playground.dart | 144 +++++ .../view/form_item/item_selector.dart | 74 +++ .../view/form_item/item_size_input.dart | 54 ++ .../view/form_item/value_input.dart | 52 ++ .../playground/view/stack/stack_op_panel.dart | 130 +++++ .../view/stack/stack_playground.dart | 137 +++++ .../playground/view/wrap/wrap_op_panel.dart | 172 ++++++ .../playground/view/wrap/wrap_playground.dart | 158 +++++ packages/layout/pubspec.yaml | 2 +- pubspec.lock | 12 +- pubspec.yaml | 3 +- 28 files changed, 1355 insertions(+), 830 deletions(-) rename packages/layout/lib/src/views/{playground => display}/layout_playground.dart (100%) rename packages/layout/lib/src/views/{playground => display}/playground_bottom_bar.dart (100%) rename packages/layout/lib/src/views/{playground => display}/playground_top_bar.dart (100%) delete mode 100644 packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart delete mode 100644 packages/layout/lib/src/views/multi/flex/flex_playground.dart create mode 100644 packages/layout/lib/src/views/playground/cons.dart create mode 100644 packages/layout/lib/src/views/playground/data/flex_attr.dart create mode 100644 packages/layout/lib/src/views/playground/data/stack_attr.dart create mode 100644 packages/layout/lib/src/views/playground/data/wrap_attr.dart create mode 100644 packages/layout/lib/src/views/playground/view/display_item.dart create mode 100644 packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart create mode 100644 packages/layout/lib/src/views/playground/view/flex/flex_playground.dart create mode 100644 packages/layout/lib/src/views/playground/view/form_item/item_selector.dart create mode 100644 packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart create mode 100644 packages/layout/lib/src/views/playground/view/form_item/value_input.dart create mode 100644 packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart create mode 100644 packages/layout/lib/src/views/playground/view/stack/stack_playground.dart create mode 100644 packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart create mode 100644 packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart diff --git a/packages/layout/lib/src/data/display_map/display_map.dart b/packages/layout/lib/src/data/display_map/display_map.dart index 30311825..13bed44f 100644 --- a/packages/layout/lib/src/data/display_map/display_map.dart +++ b/packages/layout/lib/src/data/display_map/display_map.dart @@ -17,6 +17,8 @@ Map> get kDisplayMap => { '/base/positioned': basePostioned, '/multi/flex': multiFlex, + '/multi/wrap': multiWrap, + '/multi/stack': multiStack, // '/popable/DropdownButton': [ // DisplayFrame( diff --git a/packages/layout/lib/src/data/display_map/multi.dart b/packages/layout/lib/src/data/display_map/multi.dart index f4e4ef25..4e123b32 100644 --- a/packages/layout/lib/src/data/display_map/multi.dart +++ b/packages/layout/lib/src/data/display_map/multi.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:layout/src/views/base/positioned/positioned_show.dart'; +import 'package:layout/src/views/playground/view/stack/stack_playground.dart'; import '../../views/base/align/align_show.dart'; import '../../views/base/align/align_show2.dart'; @@ -10,11 +11,18 @@ import '../../views/base/size/size_loss_by_align.dart'; import '../../views/base/size/size_tight_constraint.dart'; import '../../views/base/size/size_unconstraint.dart'; import '../../views/multi/flex/column_show.dart'; -import '../../views/multi/flex/flex_playground.dart'; +import '../../views/playground/view/flex/flex_playground.dart'; import '../../views/multi/flex/row_show.dart'; +import '../../views/playground/view/wrap/wrap_playground.dart'; import '../model/display_frame.dart'; List get multiFlex => [ + DisplayFrame( + title: 'Flex PlayGround', + desc: "在 Flex PlayGround 中,你可以通过交互来直观体验 Flex 布局特性。灰色是 Flex 布局区域。", + src: '', + display: (BuildContext context) => const FlexPlayground(), + ), DisplayFrame( title: 'Row 组件横向排列', desc: "可以将若干个组件横向排列,区域宽度无上限约束,子组件总宽超过时会越界异常。详细布局特性见第三页: Flex PlayGround", @@ -27,10 +35,23 @@ List get multiFlex => [ src: '', display: (BuildContext context) => const ColumnShow(), ), + ]; + +List get multiWrap => [ DisplayFrame( - title: 'Flex PlayGround', - desc: "在 Flex PlayGround 中,你可以通过交互来直观体验 Flex 布局特性。灰色是 Flex 布局区域。", + title: 'Wrap PlayGround', + desc: "在 Wrap PlayGround 中,你可以通过交互来直观体验 Wrap 布局特性。", src: '', - display: (BuildContext context) => const FlexPlayground(), + display: (BuildContext context) => WrapPlayground(), ), ]; + +List get multiStack => [ + DisplayFrame( + title: 'Stack PlayGround', + desc: "在 Stack PlayGround 中,你可以通过交互来直观体验 Stack 布局特性。", + src: '', + display: (BuildContext context) => StackPlayground(), + ), +]; + diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart index 6bb07e86..b9e91aca 100644 --- a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -4,13 +4,10 @@ import 'layout.dart'; import 'multi.dart'; Map get layoutMenus => { - 'path': '', - 'label': '', 'children': [ home, baseMenus, - drawMenus, + multiMenus, calcMenus, -// popableMenus, ] }; diff --git a/packages/layout/lib/src/navigation/menu/multi.dart b/packages/layout/lib/src/navigation/menu/multi.dart index 17edec0b..bccec3a3 100644 --- a/packages/layout/lib/src/navigation/menu/multi.dart +++ b/packages/layout/lib/src/navigation/menu/multi.dart @@ -11,22 +11,22 @@ import 'package:flutter/material.dart'; // 'label': '圣杯布局', // // 'icon': Icons.text_fields, // }, -Map get drawMenus => { +Map get multiMenus => { 'path': '/multi', 'icon': Icons.multitrack_audio, 'label': '多子布局', 'children': [ { 'path': '/flex', - 'label': '行列布局', + 'label': 'Flex 适应布局', }, { 'path': '/wrap', - 'label': '包裹布局', + 'label': 'Wrap 包裹布局', }, { 'path': '/stack', - 'label': '堆叠布局', + 'label': 'Stack 堆叠布局', }, ] }; diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart index ac489485..7ea382dd 100644 --- a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart +++ b/packages/layout/lib/src/navigation/view/app_desk_navigation.dart @@ -1,9 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:tolyui/tolyui.dart'; -import '../../views/playground/layout_playground.dart'; +import '../../views/display/layout_playground.dart'; import 'app_menu_tree.dart'; class AppDeskNavigation extends StatelessWidget { diff --git a/packages/layout/lib/src/views/playground/layout_playground.dart b/packages/layout/lib/src/views/display/layout_playground.dart similarity index 100% rename from packages/layout/lib/src/views/playground/layout_playground.dart rename to packages/layout/lib/src/views/display/layout_playground.dart diff --git a/packages/layout/lib/src/views/playground/playground_bottom_bar.dart b/packages/layout/lib/src/views/display/playground_bottom_bar.dart similarity index 100% rename from packages/layout/lib/src/views/playground/playground_bottom_bar.dart rename to packages/layout/lib/src/views/display/playground_bottom_bar.dart diff --git a/packages/layout/lib/src/views/playground/playground_top_bar.dart b/packages/layout/lib/src/views/display/playground_top_bar.dart similarity index 100% rename from packages/layout/lib/src/views/playground/playground_top_bar.dart rename to packages/layout/lib/src/views/display/playground_top_bar.dart diff --git a/packages/layout/lib/src/views/multi/flex/column_show.dart b/packages/layout/lib/src/views/multi/flex/column_show.dart index 63ffbb5c..ee4659a6 100644 --- a/packages/layout/lib/src/views/multi/flex/column_show.dart +++ b/packages/layout/lib/src/views/multi/flex/column_show.dart @@ -6,10 +6,10 @@ class ColumnShow extends StatelessWidget { @override Widget build(BuildContext context) { List colors = [ - Color(0xffe64032), - Color(0xff307dee), - Color(0xfff9c01f), - Color(0xff309949), + const Color(0xffe64032), + const Color(0xff307dee), + const Color(0xfff9c01f), + const Color(0xff309949), ]; return Column( children: [ diff --git a/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart b/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart deleted file mode 100644 index 769e59ac..00000000 --- a/packages/layout/lib/src/views/multi/flex/drop_selectable_widget.dart +++ /dev/null @@ -1,252 +0,0 @@ -import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -typedef OnDropSelected = void Function(int index); - -class TolySelect extends StatefulWidget { - final List data; - final int selectIndex; - final OnDropSelected? onSelected; - final Color disableColor; - final double iconSize; - final double height; - final double width; - final double fontSize; - - const TolySelect({ - super.key, - this.data = const [], - required this.selectIndex, - this.onSelected, - this.disableColor = const Color(0xffcccccc), - this.iconSize = 24, - this.height = 30, - this.width = 200, - this.fontSize = 14, - }); - - @override - _TolySelectState createState() => _TolySelectState(); -} - -class _TolySelectState extends State with SingleTickerProviderStateMixin { - late FocusNode _node; - bool _focused = false; - late FocusAttachment _nodeAttachment; - OverlayEntry? _overlayEntry; - late AnimationController _ctrl; - late Animation animation; - final LayerLink layerLink = LayerLink(); - - @override - void initState() { - super.initState(); - - _ctrl = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 200), - ); - - animation = Tween(begin: 0, end: pi).animate(_ctrl); - _node = FocusNode() - ..addListener(() { - if (_node.hasFocus != _focused) { - if (!_focused) { - _ctrl.forward(); - _showOverlay(); - } else { - _hideOverlay(); - _ctrl.reverse(); - } - setState(() { - _focused = _node.hasFocus; - }); - } - }); - _nodeAttachment = _node.attach(context); - } - - @override - void dispose() { - _node.dispose(); - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - _nodeAttachment.reparent(); - return TapRegion( - groupId: 'selector', - onTapOutside: (_) { - _node.unfocus(); - }, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (_focused) { - _node.unfocus(); - } else { - _node.requestFocus(); - } - }, - child: CompositedTransformTarget( - link: layerLink, - child: _SelectTarget( - constraints: BoxConstraints.tight(Size(widget.width,widget.height)), - focused: _focused, - label: widget.data.isNotEmpty ? widget.data[widget.selectIndex] : "暂无数据", - fontSize: widget.fontSize, - disableColor: widget.disableColor, - animation: animation, - iconSize: widget.iconSize, - ), - ), - ), - ); - } - - void _showOverlay() { - _overlayEntry = _createOverlayEntry(); - Overlay.of(context, rootOverlay: true).insert(_overlayEntry!); - } - - void _hideOverlay() { - _overlayEntry?.remove(); - } - - OverlayEntry _createOverlayEntry() => OverlayEntry( - builder: (BuildContext context) => UnconstrainedBox( - child: CompositedTransformFollower( - link: layerLink, - targetAnchor: Alignment.bottomCenter, - followerAnchor: Alignment.topCenter, - child: Padding( - padding: const EdgeInsets.only(top: 4.0), - child: Material( - shape: const RoundedRectangleBorder( - side: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(4))), - elevation: 0, - child: Container( - // height: 200, - // alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.white, - border: - Border.all(color: Color(0xffe4e7ed), width: 1 / window.devicePixelRatio), - borderRadius: BorderRadius.all(Radius.circular(4)), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - offset: const Offset(0, 2), - blurRadius: 6, - spreadRadius: 0, - ) - ]), - // padding: const EdgeInsets.only(top: 5), - width: widget.width, - child: ListView.builder( - shrinkWrap: true, - padding: EdgeInsets.symmetric(vertical: 8), - // shrinkWrap: true, - itemCount: widget.data.length, - itemBuilder: _buildItem), - ), - ), - ), - ), - ), - ); - - Widget _buildItem(BuildContext context, int index) { - return TapRegion( - groupId: 'selector', - child: Material( - color: Colors.white, - child: InkWell( - onTap: () { - if (widget.selectIndex != index) widget.onSelected?.call(index); - _overlayEntry?.markNeedsBuild(); - _node.unfocus(); - }, - child: Container( - padding: const EdgeInsets.all(8), - color: index == widget.selectIndex ? Color(0xfff5f7fa) : Colors.transparent, - child: Text( - widget.data[index], - style: TextStyle(fontSize: widget.fontSize), - )), - ), - ), - ); - } -} - -class _SelectTarget extends StatefulWidget { - final BoxConstraints? constraints; - final bool focused; - final String label; - final double fontSize; - final double iconSize; - final Color disableColor; - final Animation animation; - - const _SelectTarget({ - super.key, - this.constraints, - required this.focused, - required this.label, - required this.fontSize, - required this.disableColor, - required this.animation, - required this.iconSize, - }); - - @override - State<_SelectTarget> createState() => _SelectTargetState(); -} - -class _SelectTargetState extends State<_SelectTarget> { - Color get borderColor { - if (widget.focused) { - return Colors.blue; - } - return widget.disableColor; - } - - @override - Widget build(BuildContext context) { - return Container( - constraints: widget.constraints, - padding: const EdgeInsets.only(left: 6, right: 2), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - border: Border.all( - color: borderColor, - )), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.label, - style: TextStyle(height: 1, fontSize: widget.fontSize), - ), - AnimatedBuilder( - animation: widget.animation, - builder: (_, child) => Transform.rotate( - angle: widget.animation.value, - child: child, - ), - child: Icon( - Icons.keyboard_arrow_down, - size: widget.iconSize, - ), - ), - ], - ), - ); - } -} diff --git a/packages/layout/lib/src/views/multi/flex/flex_playground.dart b/packages/layout/lib/src/views/multi/flex/flex_playground.dart deleted file mode 100644 index e4e57eff..00000000 --- a/packages/layout/lib/src/views/multi/flex/flex_playground.dart +++ /dev/null @@ -1,552 +0,0 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Author: 张风捷特烈 -// CreateTime: 2024-06-23 -// Contact Me: 1981462002@qq.com - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:tolyui/basic/basic.dart'; -import 'package:tolyui/tolyui.dart'; - -import 'drop_selectable_widget.dart'; - -const List kColors = [ - Color(0xffe64032), - Color(0xff307dee), - Color(0xfff9c01f), - Color(0xff309949), -]; - -class FlexPlayground extends StatefulWidget { - const FlexPlayground({super.key}); - - @override - State createState() => _FlexPlaygroundState(); -} - -class _FlexPlaygroundState extends State { - List _data = []; - FlexAttr _attr = FlexAttr(direction: Axis.horizontal); - int _selectIndex = -1; - - @override - void initState() { - super.initState(); - _data = [ - DisplayItem(width: 20, height: 20, color: kColors[0]), - DisplayItem(width: 10, height: 80, color: kColors[1]), - DisplayItem(width: 40, height: 30, color: kColors[2]), - DisplayItem(width: 60, height: 20, color: kColors[3]), - ]; - } - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: ColoredBox( - color: Colors.grey.withOpacity(0.1), - child:FlexDisplay( - items: _data, - attr: _attr, - selectIndex: _selectIndex, - onSelectChanged: _onSelectChanged, - )))), - VerticalDivider(), - SizedBox( - width: 200, - child: FlexOpTool( - attr: _attr, - onAddBox: _onAddBox, - onDelete: _deleteSelectIndex, - onAttrChange:_onAttrChange, - - )), - ], - ); - } - - void _onAttrChange(FlexAttr attr){ - _attr = attr; - setState(() { - }); - } - - void _onAddBox(Size size) { - int index = _data.length + 1; - Color color = kColors[index % kColors.length]; - _data.add(DisplayItem(width: size.width, height: size.height, color: color)); - print(size); - setState(() {}); - } - - void _onSelectChanged(int value) { - if (_selectIndex == value) { - _selectIndex = -1; - } else { - _selectIndex = value; - } - setState(() {}); - } - - void _deleteSelectIndex() { - if (_selectIndex < 0 || _selectIndex >= _data.length) { - $message.warning(message: '请先选择删除的色块!'); - return; - } - _data.removeAt(_selectIndex); - _selectIndex = -1; - setState(() {}); - } -} - -class DisplayItem { - final double width; - final double height; - final Color color; - - DisplayItem({ - required this.width, - required this.height, - required this.color, - }); -} - -class FlexAttr { - final Axis direction; - final MainAxisAlignment mainAxisAlignment; - final CrossAxisAlignment crossAxisAlignment; - final MainAxisSize mainAxisSize; - final TextDirection? textDirection; - final VerticalDirection verticalDirection; - final TextBaseline textBaseline; - - FlexAttr({ - required this.direction, - this.mainAxisAlignment = MainAxisAlignment.start, - this.crossAxisAlignment = CrossAxisAlignment.center, - this.mainAxisSize = MainAxisSize.max, - this.textDirection, - this.textBaseline = TextBaseline.alphabetic, - this.verticalDirection = VerticalDirection.down, - }); - - FlexAttr copyWith({ - Axis? direction, - MainAxisAlignment? mainAxisAlignment, - CrossAxisAlignment? crossAxisAlignment, - MainAxisSize? mainAxisSize, - TextDirection? textDirection, - VerticalDirection? verticalDirection, - TextBaseline? textBaseline, - }) => - FlexAttr( - direction: direction ?? this.direction, - mainAxisAlignment: mainAxisAlignment ?? this.mainAxisAlignment, - crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, - mainAxisSize: mainAxisSize ?? this.mainAxisSize, - textDirection: textDirection ?? this.textDirection, - verticalDirection: verticalDirection ?? this.verticalDirection, - textBaseline: textBaseline ?? this.textBaseline, - ); -} - -class FlexDisplay extends StatelessWidget { - final List items; - final FlexAttr attr; - final int selectIndex; - final ValueChanged onSelectChanged; - - const FlexDisplay({ - super.key, - required this.items, - required this.attr, - required this.selectIndex, - required this.onSelectChanged, - }); - - @override - Widget build(BuildContext context) { - return Flex( - direction: attr.direction, - mainAxisAlignment: attr.mainAxisAlignment, - crossAxisAlignment: attr.crossAxisAlignment, - mainAxisSize: attr.mainAxisSize, - textDirection: attr.textDirection, - verticalDirection: attr.verticalDirection, - textBaseline: TextBaseline.alphabetic, - children: items.asMap().keys.map((int index) { - bool active = selectIndex == index; - return GestureDetector( - onTap: () => onSelectChanged(index), - child: FlexPlayItem( - item: items[index], - selected: active, - ), - ); - }).toList(), - ); - } -} - -class FlexOpTool extends StatefulWidget { - final ValueChanged onAddBox; - final VoidCallback onDelete; - final FlexAttr attr; - final ValueChanged onAttrChange; - - const FlexOpTool({ - super.key, - required this.onAddBox, - required this.onDelete, - required this.attr, - required this.onAttrChange, - }); - - @override - State createState() => _FlexOpToolState(); -} - -class _FlexOpToolState extends State { - final TextEditingController widthCtrl = TextEditingController(text: '24'); - final TextEditingController heightCtrl = TextEditingController(text: '64'); - - - @override - Widget build(BuildContext context) { - TextStyle labelStyle = TextStyle(color: Color(0xff61666d), fontSize: 12); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - 'Flex 操作面板', - style: TextStyle(fontWeight: FontWeight.bold), - ), - ), - Divider(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Text('增删操作', style: labelStyle), - Spacer(), - TolyAction(child: Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), - TolyAction(child: Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - ), - child: Row( - children: [ - Text('宽高: ', style: labelStyle), - SizedBox(width: 20), - Expanded( - child: GridSizeSetting( - widthCtrl: widthCtrl, - heightCtrl: heightCtrl, - ), - ), - ], - ), - ), - const SizedBox(height: 12), - Divider(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Text('属性操作', style: labelStyle), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('排列方向:', style: labelStyle), - Text('direction', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - data: Axis.values.map((e) => e.name).toList(), - selectIndex: widget.attr.direction.index, - - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - Axis axis = Axis.values[index]; - widget.onAttrChange(widget.attr.copyWith(direction: axis)); - }, - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('主轴对齐:', style: labelStyle), - Text('mainAxisAlignment', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - data: MainAxisAlignment.values.map((e) => e.name).toList(), - selectIndex: widget.attr.mainAxisAlignment.index, - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - MainAxisAlignment mainAxisAlignment = MainAxisAlignment.values[index]; - widget.onAttrChange(widget.attr.copyWith(mainAxisAlignment: mainAxisAlignment)); - }, - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('主轴尺寸:', style: labelStyle), - Text('mainAxisSize', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - selectIndex: widget.attr.mainAxisSize.index, - data: MainAxisSize.values.map((e) => e.name).toList(), - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - MainAxisSize mainAxisSize = MainAxisSize.values[index]; - widget.onAttrChange(widget.attr.copyWith(mainAxisSize: mainAxisSize)); - }, - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('叉轴对齐:', style: labelStyle), - Text('crossAxisAlignment', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - selectIndex: widget.attr.crossAxisAlignment.index, - - data: CrossAxisAlignment.values.map((e) => e.name).toList(), - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - CrossAxisAlignment value = CrossAxisAlignment.values[index]; - widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); - }, - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('垂直方向:', style: labelStyle), - Text('verticalDirection', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - data: VerticalDirection.values.map((e) => e.name).toList(), - selectIndex: widget.attr.verticalDirection.index, - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - VerticalDirection verticalDirection = VerticalDirection.values[index]; - widget.onAttrChange(widget.attr.copyWith(verticalDirection: verticalDirection)); - }, - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('文字方向:', style: labelStyle), - Text('textDirection', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - selectIndex: widget.attr.textDirection?.index??0, - data: TextDirection.values.map((e) => e.name).toList(), - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - TextDirection textDirection = TextDirection.values[index]; - widget.onAttrChange(widget.attr.copyWith(textDirection: textDirection)); - }, - ) - ], - ), - ), - - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), - child: Row( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('文字基线:', style: labelStyle), - Text('textBaseline', style: labelStyle.copyWith(fontSize: 8)), - ], - ), - Spacer(), - TolySelect( - fontSize: 11, - data: TextBaseline.values.map((e) => e.name).toList(), - selectIndex: widget.attr.textBaseline.index, - iconSize: 16, - height: 25, - width: 100, - onSelected: (int index) async { - TextBaseline value = TextBaseline.values[index]; - widget.onAttrChange(widget.attr.copyWith(textBaseline: value)); - }, - ) - ], - ), - ), - ], - ); - } - - void _handleAdd() { - final double? width = double.tryParse(widthCtrl.text); - final double? height = double.tryParse(heightCtrl.text); - if (width == null || height == null) { - $message.warning(message: '请输入合法宽高数字!'); - return; - } - widget.onAddBox(Size(width, height)); - } -} - -class FlexPlayItem extends StatefulWidget { - final DisplayItem item; - final bool selected; - const FlexPlayItem({ - super.key, - required this.item, - required this.selected, - }); - - @override - State createState() => _FlexPlayItemState(); -} - -class _FlexPlayItemState extends State { - @override - Widget build(BuildContext context) { - return Container( - width: widget.item.width, - height: widget.item.height, - decoration: BoxDecoration( - border: widget.selected ? Border.all() : null, - color: widget.item.color, - ), - ); - } -} - -class GridSetting extends StatelessWidget { - const GridSetting({super.key}); - - @override - Widget build(BuildContext context) { - return const Placeholder(); - } -} - -class GridSizeSetting extends StatelessWidget { - final TextEditingController widthCtrl; - final TextEditingController heightCtrl; - const GridSizeSetting({ - super.key, - required this.widthCtrl, - required this.heightCtrl, - }); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: CupertinoTextField( - controller: widthCtrl, - onChanged: (v) { - // logic.updateRow(v); - }, - style: TextStyle(fontSize: 12), - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - )), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: Text( - "x", - style: TextStyle(fontSize: 12), - ), - ), - Expanded( - child: CupertinoTextField( - controller: heightCtrl, - style: TextStyle(fontSize: 12), - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - )) - ], - ); - } -} diff --git a/packages/layout/lib/src/views/playground/cons.dart b/packages/layout/lib/src/views/playground/cons.dart new file mode 100644 index 00000000..f97ab2d1 --- /dev/null +++ b/packages/layout/lib/src/views/playground/cons.dart @@ -0,0 +1,16 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'dart:ui'; + +const List kColors = [ + Color(0xffe64032), + Color(0xff307dee), + Color(0xfff9c01f), + Color(0xff309949), +]; diff --git a/packages/layout/lib/src/views/playground/data/flex_attr.dart b/packages/layout/lib/src/views/playground/data/flex_attr.dart new file mode 100644 index 00000000..9d608d06 --- /dev/null +++ b/packages/layout/lib/src/views/playground/data/flex_attr.dart @@ -0,0 +1,48 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class FlexAttr { + final Axis direction; + final MainAxisAlignment mainAxisAlignment; + final CrossAxisAlignment crossAxisAlignment; + final MainAxisSize mainAxisSize; + final TextDirection textDirection; + final VerticalDirection verticalDirection; + final TextBaseline textBaseline; + + FlexAttr({ + required this.direction, + this.mainAxisAlignment = MainAxisAlignment.start, + this.crossAxisAlignment = CrossAxisAlignment.center, + this.mainAxisSize = MainAxisSize.max, + this.textDirection = TextDirection.ltr, + this.textBaseline = TextBaseline.alphabetic, + this.verticalDirection = VerticalDirection.down, + }); + + FlexAttr copyWith({ + Axis? direction, + MainAxisAlignment? mainAxisAlignment, + CrossAxisAlignment? crossAxisAlignment, + MainAxisSize? mainAxisSize, + TextDirection? textDirection, + VerticalDirection? verticalDirection, + TextBaseline? textBaseline, + }) => + FlexAttr( + direction: direction ?? this.direction, + mainAxisAlignment: mainAxisAlignment ?? this.mainAxisAlignment, + crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, + mainAxisSize: mainAxisSize ?? this.mainAxisSize, + textDirection: textDirection ?? this.textDirection, + verticalDirection: verticalDirection ?? this.verticalDirection, + textBaseline: textBaseline ?? this.textBaseline, + ); +} diff --git a/packages/layout/lib/src/views/playground/data/stack_attr.dart b/packages/layout/lib/src/views/playground/data/stack_attr.dart new file mode 100644 index 00000000..c307bb23 --- /dev/null +++ b/packages/layout/lib/src/views/playground/data/stack_attr.dart @@ -0,0 +1,50 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + + + +class StackAttr { + final AttrAlignment alignment; + final StackFit fit; + final TextDirection textDirection; + + StackAttr({ + this.alignment = AttrAlignment.topStart, + this.fit = StackFit.loose, + this.textDirection = TextDirection.ltr, + + }); + + StackAttr copyWith({ + AttrAlignment? alignment, + StackFit? fit, + TextDirection? textDirection, + }) => + StackAttr( + alignment: alignment ?? this.alignment, + fit: fit ?? this.fit, + textDirection: textDirection ?? this.textDirection, + ); +} + +enum AttrAlignment{ + topStart(Alignment.topLeft), + topCenter(Alignment.topCenter), + topRight(Alignment.topRight), + bottomCenter(Alignment.bottomCenter), + bottomLeft(Alignment.bottomLeft), + bottomRight(Alignment.bottomRight), + center(Alignment.center), + centerLeft(Alignment.centerLeft), + centerRight(Alignment.centerRight), + ; + final Alignment value; + const AttrAlignment(this.value); +} diff --git a/packages/layout/lib/src/views/playground/data/wrap_attr.dart b/packages/layout/lib/src/views/playground/data/wrap_attr.dart new file mode 100644 index 00000000..e2acc5f2 --- /dev/null +++ b/packages/layout/lib/src/views/playground/data/wrap_attr.dart @@ -0,0 +1,55 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + + +class WrapAttr { + final Axis direction; + final WrapAlignment mainAlignment; + final WrapCrossAlignment crossAxisAlignment; + final double spacing; + final TextDirection textDirection; + final VerticalDirection verticalDirection; + final WrapAlignment runAlignment; + final double runSpacing; + + const WrapAttr({ + this.direction = Axis.horizontal, + this.mainAlignment = WrapAlignment.start, + this.crossAxisAlignment = WrapCrossAlignment.center, + this.spacing = 0.0, + this.textDirection = TextDirection.ltr, + this.verticalDirection = VerticalDirection.down, + this.runAlignment = WrapAlignment.start, + this.runSpacing =0.0, + }); + + WrapAttr copyWith({ + Axis? direction, + WrapAlignment? mainAlignment, + WrapCrossAlignment? crossAxisAlignment, + double? spacing, + TextDirection?textDirection, + VerticalDirection? verticalDirection, + WrapAlignment?runAlignment, + Clip? clipBehavior, + double ?runSpacing, + + }) => + WrapAttr( + direction: direction ?? this.direction, + mainAlignment: mainAlignment ?? this.mainAlignment, + crossAxisAlignment: crossAxisAlignment ?? this.crossAxisAlignment, + spacing: spacing ?? this.spacing, + textDirection: textDirection ?? this.textDirection, + verticalDirection: verticalDirection ?? this.verticalDirection, + runAlignment: runAlignment ?? this.runAlignment, + runSpacing: runSpacing??this.runSpacing, + ); +} diff --git a/packages/layout/lib/src/views/playground/view/display_item.dart b/packages/layout/lib/src/views/playground/view/display_item.dart new file mode 100644 index 00000000..0438b225 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/display_item.dart @@ -0,0 +1,49 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +class DisplayItem { + final double width; + final double height; + final Color color; + + DisplayItem({ + required this.width, + required this.height, + required this.color, + }); +} + + +class DisplayPlayItem extends StatefulWidget { + final DisplayItem item; + final bool selected; + const DisplayPlayItem({ + super.key, + required this.item, + required this.selected, + }); + + @override + State createState() => _DisplayPlayItemState(); +} + +class _DisplayPlayItemState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.item.width, + height: widget.item.height, + decoration: BoxDecoration( + border: widget.selected ? Border.all() : null, + color: widget.item.color, + ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart b/packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart new file mode 100644 index 00000000..592cce69 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart @@ -0,0 +1,170 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/flex_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + + +class FlexOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final VoidCallback onReset; + final FlexAttr attr; + final ValueChanged onAttrChange; + + const FlexOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _FlexOpToolState(); +} + +class _FlexOpToolState extends State { + final TextEditingController _widthCtrl = TextEditingController(text: '24'); + final TextEditingController _heightCtrl = TextEditingController(text: '64'); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Flex 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(onTap: _handleAdd, child: const Icon(CupertinoIcons.add, size: 18)), + TolyAction(onTap: widget.onDelete, child: const Icon(CupertinoIcons.delete, size: 16)), + ], + ), + ), + ItemSizeInput(widthCtrl: _widthCtrl, heightCtrl: _heightCtrl), + const SizedBox(height: 12), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(onTap: widget.onReset, child: const Icon(CupertinoIcons.refresh, size: 16)), + + ], + ), + ), + ItemSelector( + label: '排列方向:', + subTitle: 'direction', + selectIndex: widget.attr.direction.index, + data: Axis.values, + calcFun: (Axis data) => data.name, + onSelect: (Axis value) { + widget.onAttrChange(widget.attr.copyWith(direction: value)); + }, + ), + ItemSelector( + label: '主轴对齐:', + subTitle: 'mainAxisAlignment', + selectIndex: widget.attr.mainAxisAlignment.index, + data: MainAxisAlignment.values, + calcFun: (MainAxisAlignment data) => data.name, + onSelect: (MainAxisAlignment value) { + widget.onAttrChange(widget.attr.copyWith(mainAxisAlignment: value)); + }, + ), + ItemSelector( + label: '主轴尺寸:', + subTitle: 'mainAxisSize', + selectIndex: widget.attr.mainAxisSize.index, + data: MainAxisSize.values, + calcFun: (MainAxisSize data) => data.name, + onSelect: (MainAxisSize value) { + widget.onAttrChange(widget.attr.copyWith(mainAxisSize: value)); + }, + ), + ItemSelector( + label: '叉轴对齐:', + subTitle: 'crossAxisAlignment', + selectIndex: widget.attr.crossAxisAlignment.index, + data: CrossAxisAlignment.values, + calcFun: (CrossAxisAlignment data) => data.name, + onSelect: (CrossAxisAlignment value) { + widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); + }, + ), + ItemSelector( + label: '垂直方向:', + subTitle: 'verticalDirection', + selectIndex: widget.attr.verticalDirection.index, + data: VerticalDirection.values, + calcFun: (VerticalDirection data) => data.name, + onSelect: (VerticalDirection value) { + widget.onAttrChange(widget.attr.copyWith(verticalDirection: value)); + }, + ), + ItemSelector( + label: '文字方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ItemSelector( + label: '文字基线:', + subTitle: 'textBaseline', + selectIndex: widget.attr.textBaseline.index, + data: TextBaseline.values, + calcFun: (TextBaseline data) => data.name, + onSelect: (TextBaseline value) { + widget.onAttrChange(widget.attr.copyWith(textBaseline: value)); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(_widthCtrl.text); + final double? height = double.tryParse(_heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } + + @override + void dispose() { + _widthCtrl.dispose(); + _heightCtrl.dispose(); + super.dispose(); + } +} diff --git a/packages/layout/lib/src/views/playground/view/flex/flex_playground.dart b/packages/layout/lib/src/views/playground/view/flex/flex_playground.dart new file mode 100644 index 00000000..0e46956c --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/flex/flex_playground.dart @@ -0,0 +1,144 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../cons.dart'; +import '../../data/flex_attr.dart'; +import '../display_item.dart'; +import 'flex_op_panel.dart'; + +class FlexPlayground extends StatefulWidget { + const FlexPlayground({super.key}); + + @override + State createState() => _FlexPlaygroundState(); +} + +class _FlexPlaygroundState extends State { + List _data = []; + late FlexAttr _attr; + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _reset(init: true); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: FlexDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )), + )), + const VerticalDivider(), + SizedBox( + width: 200, + child: FlexOpTool( + attr: _attr, + onReset: _reset, + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + )), + ], + ); + } + + void _reset({bool init=false}){ + _attr = FlexAttr(direction: Axis.horizontal); + _data = [ + DisplayItem(width: 20, height: 20, color: kColors[0]), + DisplayItem(width: 10, height: 80, color: kColors[1]), + DisplayItem(width: 40, height: 30, color: kColors[2]), + DisplayItem(width: 60, height: 20, color: kColors[3]), + ]; + if(init) return; + setState(() {}); + } + + void _onAttrChange(FlexAttr attr) { + setState(() { + _attr = attr; + }); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + +} + +class FlexDisplay extends StatelessWidget { + final List items; + final FlexAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const FlexDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Flex( + direction: attr.direction, + mainAxisAlignment: attr.mainAxisAlignment, + crossAxisAlignment: attr.crossAxisAlignment, + mainAxisSize: attr.mainAxisSize, + textDirection: attr.textDirection, + verticalDirection: attr.verticalDirection, + textBaseline: TextBaseline.alphabetic, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/form_item/item_selector.dart b/packages/layout/lib/src/views/playground/view/form_item/item_selector.dart new file mode 100644 index 00000000..57432213 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/form_item/item_selector.dart @@ -0,0 +1,74 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-30 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +typedef NameCalc = String Function(T data); + +class ItemSelector extends StatelessWidget { + final int selectIndex; + final List data; + final NameCalc calcFun; + final ValueChanged onSelect; + final String label; + final String subTitle; + + const ItemSelector({ + super.key, + required this.selectIndex, + required this.data, + required this.calcFun, + required this.onSelect, + required this.subTitle, + required this.label, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + DropMenuCellStyle lightStyle = const DropMenuCellStyle( + padding: EdgeInsets.symmetric(horizontal: 4,vertical: 1), + borderRadius: BorderRadius.all(Radius.circular(6)), + foregroundColor: Color(0xff1f1f1f), + backgroundColor: Colors.transparent, + disableColor: Color(0xffbfbfbf), + hoverBackgroundColor: Color(0xfff5f5f5), + hoverForegroundColor: Color(0xff1f1f1f), + textStyle: TextStyle(fontSize: 11) + ); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: labelStyle), + Text(subTitle, style: labelStyle.copyWith(fontSize: 8)), + ], + ), + const Spacer(), + TolySelect( + fontSize: 11, + cellStyle: lightStyle, + data: data.map((e) => calcFun(e)).toList(), + selectIndex: selectIndex, + iconSize: 16, + height: 25, + width: 110, + maxHeight: 200, + shrinkWrapWidthOverlay: false, + minWidth: 0, + onSelected: (int index) => onSelect(data[index]), + ) + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart b/packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart new file mode 100644 index 00000000..1ccb27ae --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart @@ -0,0 +1,54 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +class ItemSizeInput extends StatelessWidget { + final TextEditingController widthCtrl; + final TextEditingController heightCtrl; + + const ItemSizeInput({ + super.key, + required this.widthCtrl, + required this.heightCtrl, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + children: [ + Text('宽高: ', style: labelStyle), + const SizedBox(width: 20), + Expanded( + child: CupertinoTextField( + controller: widthCtrl, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 4.0), + child: Text( + "x", + style: TextStyle(fontSize: 12), + ), + ), + Expanded( + child: CupertinoTextField( + controller: heightCtrl, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + )) + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/form_item/value_input.dart b/packages/layout/lib/src/views/playground/view/form_item/value_input.dart new file mode 100644 index 00000000..67a300a9 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/form_item/value_input.dart @@ -0,0 +1,52 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-30 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +class ValueInput extends StatelessWidget { + final String label; + final String subtitle; + final ValueChanged onChange; + + const ValueInput({ + super.key, + required this.onChange, + required this.label, + required this.subtitle, + }); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: labelStyle), + Text(subtitle, style: labelStyle.copyWith(fontSize: 8)), + ], + ), + const Spacer(), + SizedBox( + width: 110, + child: CupertinoTextField( + keyboardType: TextInputType.number, + onChanged: onChange, + style: const TextStyle(fontSize: 12), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + ), + ) + ], + ), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart b/packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart new file mode 100644 index 00000000..7b6d6d1e --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart @@ -0,0 +1,130 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/stack_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + + +class StackOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final VoidCallback onReset; + final StackAttr attr; + final ValueChanged onAttrChange; + + const StackOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _StackOpToolState(); +} + +class _StackOpToolState extends State { + final TextEditingController _widthCtrl = TextEditingController(text: '24'); + final TextEditingController _heightCtrl = TextEditingController(text: '64'); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'Flex 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + const Spacer(), + TolyAction(child: const Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), + TolyAction(child: const Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), + ], + ), + ), + ItemSizeInput(widthCtrl: _widthCtrl, heightCtrl: _heightCtrl), + const SizedBox(height: 12), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction(child: const Icon(CupertinoIcons.refresh, size: 16), onTap: widget.onReset), + + ], + ), + ), + ItemSelector( + label: '对齐方式:', + subTitle: 'direction', + selectIndex: widget.attr.alignment.index, + data: AttrAlignment.values, + calcFun: (AttrAlignment data) => data.name, + onSelect: (AttrAlignment value) { + widget.onAttrChange(widget.attr.copyWith(alignment: value)); + }, + ), + ItemSelector( + label: '适应模式:', + subTitle: 'fit', + selectIndex: widget.attr.fit.index, + data: StackFit.values, + calcFun: (StackFit data) => data.name, + onSelect: (StackFit value) { + widget.onAttrChange(widget.attr.copyWith(fit: value)); + }, + ), + ItemSelector( + label: '文章方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(_widthCtrl.text); + final double? height = double.tryParse(_heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } + + @override + void dispose() { + _widthCtrl.dispose(); + _heightCtrl.dispose(); + super.dispose(); + } +} diff --git a/packages/layout/lib/src/views/playground/view/stack/stack_playground.dart b/packages/layout/lib/src/views/playground/view/stack/stack_playground.dart new file mode 100644 index 00000000..3a22f8f2 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/stack/stack_playground.dart @@ -0,0 +1,137 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../cons.dart'; +import '../../data/flex_attr.dart'; +import '../../data/stack_attr.dart'; +import '../display_item.dart'; +import 'stack_op_panel.dart'; + +class StackPlayground extends StatefulWidget { + const StackPlayground({super.key}); + + @override + State createState() => _StackPlaygroundState(); +} + +class _StackPlaygroundState extends State { + List _data = []; + StackAttr _attr = StackAttr(); + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _data = [ + DisplayItem(width: 80, height: 80, color: kColors[3]), + DisplayItem(width: 60, height: 60, color: kColors[2]), + DisplayItem(width: 40, height: 40, color: kColors[1]), + DisplayItem(width: 20, height: 20, color: kColors[0]), + ]; + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: SizedBox( + width: 200, + height: 200, + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: StackDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )), + ), + )), + const VerticalDivider(), + SizedBox( + width: 200, + child: StackOpTool( + attr: _attr, + onReset: ()=>_onAttrChange(StackAttr()), + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + )), + ], + ); + } + + void _onAttrChange(StackAttr attr) { + setState(() { + _attr = attr; + }); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + print(size); + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } +} + +class StackDisplay extends StatelessWidget { + final List items; + final StackAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const StackDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Stack( + fit: attr.fit, + alignment: attr.alignment.value, + textDirection: attr.textDirection, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} diff --git a/packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart b/packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart new file mode 100644 index 00000000..61f65d56 --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart @@ -0,0 +1,172 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-29 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:layout/src/views/playground/view/form_item/value_input.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/wrap_attr.dart'; +import '../form_item/item_selector.dart'; +import '../form_item/item_size_input.dart'; + +class WrapOpTool extends StatefulWidget { + final ValueChanged onAddBox; + final VoidCallback onDelete; + final WrapAttr attr; + final ValueChanged onAttrChange; + final VoidCallback onReset; + + const WrapOpTool({ + super.key, + required this.onAddBox, + required this.onDelete, + required this.onReset, + required this.attr, + required this.onAttrChange, + }); + + @override + State createState() => _WrapOpToolState(); +} + +class _WrapOpToolState extends State { + final TextEditingController widthCtrl = TextEditingController(text: '24'); + final TextEditingController heightCtrl = TextEditingController(text: '64'); + final TextEditingController spacingCtrl = TextEditingController(text: "0"); + final TextEditingController rubSpacingCtrl = TextEditingController(text: "0"); + + @override + Widget build(BuildContext context) { + TextStyle labelStyle = TextStyle(color: Color(0xff61666d), fontSize: 12); + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Wrap 操作面板', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('增删操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction(child: Icon(CupertinoIcons.add, size: 18), onTap: _handleAdd), + TolyAction(child: Icon(CupertinoIcons.delete, size: 16), onTap: widget.onDelete), + ], + ), + ), + ItemSizeInput( + widthCtrl: widthCtrl, + heightCtrl: heightCtrl, + ), + const SizedBox(height: 12), + Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6), + child: Row( + children: [ + Text('属性操作', style: labelStyle.copyWith(fontWeight: FontWeight.bold)), + Spacer(), + TolyAction( + child: const Icon(CupertinoIcons.refresh, size: 16), onTap: widget.onReset), + ], + ), + ), + ItemSelector( + label: '排列方向:', + subTitle: 'direction', + selectIndex: widget.attr.direction.index, + data: Axis.values, + calcFun: (Axis data) => data.name, + onSelect: (Axis value) { + widget.onAttrChange(widget.attr.copyWith(direction: value)); + }, + ), + ItemSelector( + label: '主轴对齐:', + subTitle: 'mainAlignment', + selectIndex: widget.attr.mainAlignment.index, + data: WrapAlignment.values, + calcFun: (WrapAlignment data) => data.name, + onSelect: (WrapAlignment value) { + widget.onAttrChange(widget.attr.copyWith(mainAlignment: value)); + }, + ), + ItemSelector( + label: '交叉轴对齐:', + subTitle: 'crossAxisAlignment', + selectIndex: widget.attr.crossAxisAlignment.index, + data: WrapCrossAlignment.values, + calcFun: (WrapCrossAlignment data) => data.name, + onSelect: (WrapCrossAlignment value) { + widget.onAttrChange(widget.attr.copyWith(crossAxisAlignment: value)); + }, + ), + ItemSelector( + label: '叉轴对齐:', + subTitle: 'runAlignment', + selectIndex: widget.attr.runAlignment.index, + data: WrapAlignment.values, + calcFun: (WrapAlignment data) => data.name, + onSelect: (WrapAlignment value) { + widget.onAttrChange(widget.attr.copyWith(runAlignment: value)); + }, + ), + ItemSelector( + label: '垂直方向:', + subTitle: 'verticalDirection', + selectIndex: widget.attr.verticalDirection.index, + data: VerticalDirection.values, + calcFun: (VerticalDirection data) => data.name, + onSelect: (VerticalDirection value) { + widget.onAttrChange(widget.attr.copyWith(verticalDirection: value)); + }, + ), + ItemSelector( + label: '文字方向:', + subTitle: 'textDirection', + selectIndex: widget.attr.textDirection.index, + data: TextDirection.values, + calcFun: (TextDirection data) => data.name, + onSelect: (TextDirection value) { + widget.onAttrChange(widget.attr.copyWith(textDirection: value)); + }, + ), + ValueInput( + label: '主轴间距:', + subtitle: 'spacing', + onChange: (String v) { + widget.onAttrChange(widget.attr.copyWith(spacing: double.tryParse(v))); + }, + ), + ValueInput( + label: '叉轴间距:', + subtitle: 'runSpacing', + onChange: (String v) { + widget.onAttrChange(widget.attr.copyWith(runSpacing: double.parse(v))); + }, + ), + ], + ); + } + + void _handleAdd() { + final double? width = double.tryParse(widthCtrl.text); + final double? height = double.tryParse(heightCtrl.text); + if (width == null || height == null) { + $message.warning(message: '请输入合法宽高数字!'); + return; + } + widget.onAddBox(Size(width, height)); + } +} diff --git a/packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart b/packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart new file mode 100644 index 00000000..4dfb431f --- /dev/null +++ b/packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart @@ -0,0 +1,158 @@ +// Copyright 2014 The 星星 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-06-25 +// Contact Me: 1981462002@qq.com + +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-06-23 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../data/wrap_attr.dart'; +import '../display_item.dart'; +import '../form_item/item_size_input.dart'; +import 'wrap_op_panel.dart'; + +const List kColors = [ + Color(0xffd23eb9), + Color(0xff2164c7), + Color(0xffd5a213), + Color(0xff16e848), +]; + +class WrapPlayground extends StatefulWidget { + const WrapPlayground({super.key}); + + @override + State createState() => _WrapPlaygroundState(); +} + +class _WrapPlaygroundState extends State { + List _data = []; + late WrapAttr _attr; + int _selectIndex = -1; + + @override + void initState() { + super.initState(); + _reset(); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Center( + child: ColoredBox( + color: Colors.grey.withOpacity(0.1), + child: WrapDisplay( + items: _data, + attr: _attr, + selectIndex: _selectIndex, + onSelectChanged: _onSelectChanged, + )))), + const VerticalDivider(), + SizedBox( + width: 200, + child: WrapOpTool( + attr: _attr, + onAddBox: _onAddBox, + onDelete: _deleteSelectIndex, + onAttrChange: _onAttrChange, + onReset: _reset, + )), + ], + ); + } + + void _reset() { + _attr = const WrapAttr(); + _data = [ + DisplayItem(width: 20, height: 20, color: kColors[0]), + DisplayItem(width: 10, height: 80, color: kColors[1]), + DisplayItem(width: 40, height: 30, color: kColors[2]), + DisplayItem(width: 60, height: 20, color: kColors[3]), + ]; + setState(() {}); + } + + void _onAttrChange(WrapAttr attr) { + _attr = attr; + setState(() {}); + } + + void _onAddBox(Size size) { + int index = _data.length + 1; + Color color = kColors[index % kColors.length]; + _data.add(DisplayItem(width: size.width, height: size.height, color: color)); + print(size); + setState(() {}); + } + + void _onSelectChanged(int value) { + if (_selectIndex == value) { + _selectIndex = -1; + } else { + _selectIndex = value; + } + setState(() {}); + } + + void _deleteSelectIndex() { + if (_selectIndex < 0 || _selectIndex >= _data.length) { + $message.warning(message: '请先选择删除的色块!'); + return; + } + _data.removeAt(_selectIndex); + _selectIndex = -1; + setState(() {}); + } +} + +class WrapDisplay extends StatelessWidget { + final List items; + final WrapAttr attr; + final int selectIndex; + final ValueChanged onSelectChanged; + + const WrapDisplay({ + super.key, + required this.items, + required this.attr, + required this.selectIndex, + required this.onSelectChanged, + }); + + @override + Widget build(BuildContext context) { + return Wrap( + direction: attr.direction, + alignment: attr.mainAlignment, + crossAxisAlignment: attr.crossAxisAlignment, + spacing: attr.spacing, + textDirection: attr.textDirection, + verticalDirection: attr.verticalDirection, + runAlignment: attr.runAlignment, + runSpacing: attr.runSpacing, + children: items.asMap().keys.map((int index) { + bool active = selectIndex == index; + return GestureDetector( + onTap: () => onSelectChanged(index), + child: DisplayPlayItem(item: items[index], selected: active), + ); + }).toList(), + ); + } +} + diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml index 023f6a8f..ee47da56 100644 --- a/packages/layout/pubspec.yaml +++ b/packages/layout/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter # 菜单管理 - tolyui: ^0.0.2+7 + tolyui: ^0.0.2+15 # 路由管理 go_router: ^14.2.0 diff --git a/pubspec.lock b/pubspec.lock index 30ec1ebd..851e97ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -803,18 +803,18 @@ packages: dependency: "direct main" description: name: tolyui - sha256: "92c3ea5f9240746c336dca8ab898797144e52545a8061937df20c924b6e5cdb7" + sha256: f88af1cabd06d0eb2df989abac9bfc37f1ad76d273cc9f8d9109cc163205fe48 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2+7" + version: "0.0.2+15" tolyui_feedback: dependency: transitive description: name: tolyui_feedback - sha256: "08508038ee77c9ec1c27a39e6cc7fae5a1f9c59da20c771b2fbd52258ff31206" + sha256: "0efc505b83fbb3546344a9c94988938954c11f8680a9ed9e226ff82fe924053d" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.4" + version: "0.3.4+4" tolyui_message: dependency: transitive description: @@ -827,10 +827,10 @@ packages: dependency: transitive description: name: tolyui_navigation - sha256: "1b1012899d477f7860e60e564abe152dab86cbd31b091065525f57b31d139dc6" + sha256: "2b1c323962903406370367d2e637a785399a568554c77d87d405da8df33f79cb" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.8+3" + version: "0.0.8+6" tolyui_rx_layout: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a9ac4f14..04a74b2a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,8 @@ dependencies: app_boot_starter: ^1.0.0 ## tolyui - tolyui: ^0.0.2+7 + tolyui: ^0.0.2+15 + package_info_plus: ^8.0.0 # 应用包信息 r_upgrade: ^0.4.2 # 应用升级 From fa558424c83d9d8d5ea749d9ca1c35e6aa68643d Mon Sep 17 00:00:00 2001 From: acsweet <1395723441@qq.com> Date: Wed, 3 Jul 2024 14:06:01 +0800 Subject: [PATCH 071/149] change --- README.md | 2 +- doc/ewm/coffee1.png | Bin 0 -> 401097 bytes doc/ewm/coffee1.webp | Bin 48828 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/ewm/coffee1.png delete mode 100644 doc/ewm/coffee1.webp diff --git a/README.md b/README.md index 9472e9b2..31504152 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Tools • Dart 3.4.0 • DevTools 2.34.3 > 开源不易,请我喝咖啡 ~ -![](./doc/ewm/coffee1.webp) +![](./doc/ewm/coffee1.png) diff --git a/doc/ewm/coffee1.png b/doc/ewm/coffee1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbf38bc7f672462b69a4384db57a189dda46769 GIT binary patch literal 401097 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
  • ^dbmW97g}#B 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
  • LkC5Cl&6|;jkjhE!*>3_>lybSfcdsret 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/ewm/coffee1.webp b/doc/ewm/coffee1.webp deleted file mode 100644 index 050c2dd952b8a4115ce8b14c58c44fba2e3a8e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48828 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 A^8f$< From 87107d8c419dba1fd55c0eb24f1afe7dc4e8d3f4 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 8 Jul 2024 06:56:59 +0800 Subject: [PATCH 072/149] =?UTF-8?q?=E5=AF=BB=E8=B7=AF=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E6=BC=94=E7=BB=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/flutter_unit.dart | 3 +- .../view/splash/standard_unit_splash.dart | 1 + modules/fx_go_router_ext/.gitignore | 29 ++ modules/fx_go_router_ext/.metadata | 10 + modules/fx_go_router_ext/CHANGELOG.md | 3 + modules/fx_go_router_ext/LICENSE | 1 + modules/fx_go_router_ext/README.md | 39 +++ .../fx_go_router_ext/analysis_options.yaml | 4 + .../lib/fx_go_router_ext.dart | 7 + .../lib/src/listener/listener.dart | 36 +++ .../lib/src/listener/path.dart | 14 + .../fade_page_transitions_builder.dart | 19 ++ .../page_route/fade_page_route.dart | 56 ++++ .../page_route/slide_page_route.dart | 50 ++++ .../page_route/zero_page_route.dart | 36 +++ .../src/transition/size_clip_transition.dart | 105 +++++++ .../cupertino_back_gesture_detector.dart | 277 ++++++++++++++++++ .../slide_page_transition_builder.dart | 33 +++ .../lib/src/transition/transition.dart | 7 + modules/fx_go_router_ext/pubspec.yaml | 56 ++++ .../test/fx_go_router_ext_test.dart | 0 packages/algorithm/lib/algorithm.dart | 14 +- .../lib/src/algorithm/finding/functions.dart | 35 +++ .../algorithm/finding/functions/AStar.dart | 109 +++++++ .../src/algorithm/finding/functions/BFS.dart | 88 ++++++ .../algorithm/finding/functions/BestFS.dart | 101 +++++++ .../src/algorithm/finding/functions/DFS.dart | 84 ++++++ .../algorithm/finding/functions/dijkstra.dart | 101 +++++++ .../finding/data_scope/finding_config.dart | 25 ++ .../src/finding/data_scope/finding_state.dart | 250 ++++++++++++++++ .../lib/src/finding/data_scope/position.dart | 11 + .../src/finding/data_scope/random_queue.dart | 48 +++ .../algorithm/lib/src/finding/view/board.dart | 51 ++++ .../lib/src/finding/view/finding_page.dart | 18 ++ .../src/finding/view/finding_tool_bar.dart | 139 +++++++++ .../lib/src/navigation/menu/algo_menu.dart | 9 + .../lib/src/navigation/menu/finding.dart | 29 ++ .../lib/src/navigation/menu/sort.dart | 57 ++++ .../lib/src/navigation/router/router.dart | 39 +++ .../navigation/view/algo_desk_navigation.dart | 26 ++ .../src/navigation/view/algo_menu_cell.dart | 179 +++++++++++ .../src/navigation/view/algo_menu_tree.dart | 88 ++++++ .../algorithm/lib/src/views/algo_page.dart | 64 ++++ .../src/views/desktop/desk_algo_panel.dart | 63 ++++ .../src/views/{ => sort}/data_painter.dart | 0 .../lib/src/views/{ => sort}/sort_page.dart | 2 + .../lib/src/views/{ => sort}/sort_parper.dart | 2 +- .../src/views/{ => sort}/sort_setting.dart | 3 +- .../lib/src/views/sort/top_bar/sort_bar.dart | 94 ++++++ .../views/{ => sort}/top_bar/sort_button.dart | 32 +- .../lib/src/views/top_bar/sort_bar.dart | 89 ------ packages/algorithm/pubspec.yaml | 8 +- packages/app/lib/app.dart | 4 +- packages/app/lib/app/action/action.dart | 1 + packages/app/lib/app/action/url.dart | 17 ++ packages/app/lib/app/i10n/l10n.dart | 3 - .../app/lib/app/style/unit_text_style.dart | 2 +- packages/app/pubspec.yaml | 1 + .../lib/src/articles/view/artifact_page.dart | 2 +- .../src/articles/view/desk_artifact_page.dart | 4 +- packages/artifact/pubspec.yaml | 1 - .../lib/src/data/display_map/display_map.dart | 3 + .../lib/src/data/display_map/funny.dart | 21 ++ .../layout/lib/src/navigation/menu/funny.dart | 25 ++ .../navigation/menu/menu_repository_impl.dart | 2 + .../src/navigation/router/desk_router.dart | 41 ++- .../src/views/interest/elevator/elevator.dart | 85 ++++++ .../layout/lib/src/views/layout_page.dart | 1 - packages/layout/pubspec.yaml | 2 +- pubspec.lock | 7 + 70 files changed, 2738 insertions(+), 128 deletions(-) create mode 100644 modules/fx_go_router_ext/.gitignore create mode 100644 modules/fx_go_router_ext/.metadata create mode 100644 modules/fx_go_router_ext/CHANGELOG.md create mode 100644 modules/fx_go_router_ext/LICENSE create mode 100644 modules/fx_go_router_ext/README.md create mode 100644 modules/fx_go_router_ext/analysis_options.yaml create mode 100644 modules/fx_go_router_ext/lib/fx_go_router_ext.dart create mode 100644 modules/fx_go_router_ext/lib/src/listener/listener.dart create mode 100644 modules/fx_go_router_ext/lib/src/listener/path.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart create mode 100644 modules/fx_go_router_ext/lib/src/transition/transition.dart create mode 100644 modules/fx_go_router_ext/pubspec.yaml create mode 100644 modules/fx_go_router_ext/test/fx_go_router_ext_test.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart create mode 100644 packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart create mode 100644 packages/algorithm/lib/src/finding/data_scope/finding_config.dart create mode 100644 packages/algorithm/lib/src/finding/data_scope/finding_state.dart create mode 100644 packages/algorithm/lib/src/finding/data_scope/position.dart create mode 100644 packages/algorithm/lib/src/finding/data_scope/random_queue.dart create mode 100644 packages/algorithm/lib/src/finding/view/board.dart create mode 100644 packages/algorithm/lib/src/finding/view/finding_page.dart create mode 100644 packages/algorithm/lib/src/finding/view/finding_tool_bar.dart create mode 100644 packages/algorithm/lib/src/navigation/menu/algo_menu.dart create mode 100644 packages/algorithm/lib/src/navigation/menu/finding.dart create mode 100644 packages/algorithm/lib/src/navigation/menu/sort.dart create mode 100644 packages/algorithm/lib/src/navigation/router/router.dart create mode 100644 packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart create mode 100644 packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart create mode 100644 packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart create mode 100644 packages/algorithm/lib/src/views/algo_page.dart create mode 100644 packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart rename packages/algorithm/lib/src/views/{ => sort}/data_painter.dart (100%) rename packages/algorithm/lib/src/views/{ => sort}/sort_page.dart (93%) rename packages/algorithm/lib/src/views/{ => sort}/sort_parper.dart (91%) rename packages/algorithm/lib/src/views/{ => sort}/sort_setting.dart (98%) create mode 100644 packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart rename packages/algorithm/lib/src/views/{ => sort}/top_bar/sort_button.dart (51%) delete mode 100644 packages/algorithm/lib/src/views/top_bar/sort_bar.dart create mode 100644 packages/app/lib/app/action/action.dart create mode 100644 packages/app/lib/app/action/url.dart delete mode 100644 packages/app/lib/app/i10n/l10n.dart create mode 100644 packages/layout/lib/src/data/display_map/funny.dart create mode 100644 packages/layout/lib/src/navigation/menu/funny.dart create mode 100644 packages/layout/lib/src/views/interest/elevator/elevator.dart diff --git a/lib/app/flutter_unit.dart b/lib/app/flutter_unit.dart index 391203b5..744e2d57 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/app/flutter_unit.dart @@ -26,8 +26,7 @@ class FlutterUnit3 extends StatelessWidget { @override Widget build(BuildContext context) { AppConfigState state = context.watch().state; - return SortStateScope( - notifier: SortState(), + return AlgoScope( child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: TolyMessage( diff --git a/lib/app_stater/view/splash/standard_unit_splash.dart b/lib/app_stater/view/splash/standard_unit_splash.dart index 2e67f1fb..43e81878 100644 --- a/lib/app_stater/view/splash/standard_unit_splash.dart +++ b/lib/app_stater/view/splash/standard_unit_splash.dart @@ -23,6 +23,7 @@ class FlutterUnitSplash extends StatelessWidget { statusBarIconBrightness: Brightness.dark, ), child: Material( + color: Colors.white, child: _SplashBody(), ), ); diff --git a/modules/fx_go_router_ext/.gitignore b/modules/fx_go_router_ext/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/fx_go_router_ext/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/fx_go_router_ext/.metadata b/modules/fx_go_router_ext/.metadata new file mode 100644 index 00000000..7e6d66ad --- /dev/null +++ b/modules/fx_go_router_ext/.metadata @@ -0,0 +1,10 @@ +# 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: "54e66469a933b60ddf175f858f82eaeb97e48c8d" + channel: "stable" + +project_type: package diff --git a/modules/fx_go_router_ext/CHANGELOG.md b/modules/fx_go_router_ext/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/fx_go_router_ext/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/fx_go_router_ext/LICENSE b/modules/fx_go_router_ext/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/fx_go_router_ext/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/fx_go_router_ext/README.md b/modules/fx_go_router_ext/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/fx_go_router_ext/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/fx_go_router_ext/analysis_options.yaml b/modules/fx_go_router_ext/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/fx_go_router_ext/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_go_router_ext/lib/fx_go_router_ext.dart b/modules/fx_go_router_ext/lib/fx_go_router_ext.dart new file mode 100644 index 00000000..31c88c6a --- /dev/null +++ b/modules/fx_go_router_ext/lib/fx_go_router_ext.dart @@ -0,0 +1,7 @@ +library fx_go_router_ext; + +export 'package:go_router/go_router.dart'; + +export 'src/listener/listener.dart'; +export 'src/listener/path.dart'; +export 'src/transition/transition.dart'; \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/listener/listener.dart b/modules/fx_go_router_ext/lib/src/listener/listener.dart new file mode 100644 index 00000000..d0db8c4c --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/listener/listener.dart @@ -0,0 +1,36 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +mixin RouterChangeListenerMixin on State { + late GoRouterDelegate _delegate; + + String get path => '/${_delegate.currentConfiguration.matches.last.matchedLocation}'; + + @override + void initState() { + super.initState(); + _delegate = GoRouter.of(context).routerDelegate; + _delegate.addListener(_onChange); + } + + @override + void dispose() { + _delegate.removeListener(_onChange); + super.dispose(); + } + + void _onChange() { + RouteMatchBase match = _delegate.currentConfiguration.matches.last; + onChangeRoute("/${match.matchedLocation}"); + } + + void onChangeRoute(String path); +} diff --git a/modules/fx_go_router_ext/lib/src/listener/path.dart b/modules/fx_go_router_ext/lib/src/listener/path.dart new file mode 100644 index 00000000..89442b5f --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/listener/path.dart @@ -0,0 +1,14 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-25 +// Contact Me: 1981462002@qq.com + +import 'package:go_router/go_router.dart'; + +extension GoRouterPath on GoRouter{ + String get path => '/${routerDelegate.currentConfiguration.matches.last.matchedLocation}'; +} + diff --git a/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart b/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart new file mode 100644 index 00000000..d0e9e3f0 --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FadePageTransitionsBuilder extends PageTransitionsBuilder { + const FadePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + return FadeTransition( + opacity: animation.drive(CurveTween(curve: Curves.easeIn)), + child: child, + ); + } +} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart new file mode 100644 index 00000000..01b5015f --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart @@ -0,0 +1,56 @@ +//渐变透明路由动画 +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class FadePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + final Curve? curve; + + FadePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + this.curve, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + + if (curve != null) { + animation = CurvedAnimation( + parent: animation, + curve: curve!, + ); + } + + return FadeTransition( + opacity: Tween(begin: 0.1, end: 1.0).animate(animation), + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart new file mode 100644 index 00000000..2cb92871 --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart @@ -0,0 +1,50 @@ +//右--->左 +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + + +class SlidePageRoute extends MaterialPageRoute { + final Widget child; + final Duration duration; + + SlidePageRoute({ + required this.child, + this.duration = const Duration(milliseconds: 300), + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child); + } + final bool linearTransition = isPopGestureInProgress(this); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } + + @override + Duration get transitionDuration => duration; + + @override + @protected + bool get hasScopedWillPopCallback { + return false; + } +} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart new file mode 100644 index 00000000..a6c0ca8b --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart @@ -0,0 +1,36 @@ + +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../slide_transition/cupertino_back_gesture_detector.dart'; + + +class ZeroPageRoute extends MaterialPageRoute { + final Widget child; + + + ZeroPageRoute({ + required this.child, + }) : super(builder: (_) => child); + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(this), + onStartPopGesture: () => startPopGesture(this), + child: child, + ); + } + return child; + } + + @override + Duration get transitionDuration => Duration.zero; +} diff --git a/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart b/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart new file mode 100644 index 00000000..f3fa0f5c --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart @@ -0,0 +1,105 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SizeClipTransition extends StatelessWidget { + final Animation animation; + final Animation secondaryAnimation; + final Widget child; + + const SizeClipTransition({ + super.key, + required this.animation, + required this.secondaryAnimation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return ClipPath( + clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), + child: child, + ); + } +} + +class SizePathClipper extends CustomClipper { + final double progress; + + SizePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height, + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant SizePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class ScalePathClipper extends CustomClipper { + final double progress; + + ScalePathClipper(this.progress); + + @override + Path getClip(Size size) { + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + width: size.width * (1 - progress), + height: size.height* (1 - progress), + ); + + return Path() + ..addRect(box) + ..addRect(center) + ..fillType = PathFillType.evenOdd; + } + + @override + bool shouldReclip(covariant ScalePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} + +class CirclePathClipper extends CustomClipper { + final double progress; + + CirclePathClipper(this.progress); + + @override + Path getClip(Size size) { + print('progress:$progress'); + if(progress==0){ + return Path(); + } + Rect box = Rect.fromLTWH(0, 0, size.width, size.height); + Rect center = Rect.fromCircle( + center: Offset(size.width , 0), + radius: sqrt(size.width*size.width+size.height*size.height) * (progress), + ); + + Path zone = Path()..addRect(box); + Path cliper = Path()..addOval(center); + + return Path.combine(PathOperation.intersect, zone, cliper ); + } + + @override + bool shouldReclip(covariant CirclePathClipper oldClipper) { + return oldClipper.progress != progress; + } +} \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart new file mode 100644 index 00000000..53bec7e3 --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart @@ -0,0 +1,277 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +// The maximum time for a page to get reset to it's original position if the +// user releases a page mid swipe. +const int _kMaxPageBackAnimationTime = 300; // Milliseconds. +const double _kBackGestureWidth = 20.0; +const double _kMinFlingVelocity = 1.0; // Screen widths per second. + +// An eyeballed value for the maximum time it takes for a page to animate forward +// if the user releases a page mid swipe. +const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. + +/// This is the widget side of [CupertinoBackGestureController]. +/// +/// This widget provides a gesture recognizer which, when it determines the +/// route can be closed with a back gesture, creates the controller and +/// feeds it the input from the gesture recognizer. +/// +/// The gesture data is converted from absolute coordinates to logical +/// coordinates by this widget. +/// +/// The type `T` specifies the return type of the route with which this gesture +/// detector is associated. +class CupertinoBackGestureDetector extends StatefulWidget { + const CupertinoBackGestureDetector({ + super.key, + required this.enabledCallback, + required this.onStartPopGesture, + required this.child, + }); + + final Widget child; + + final ValueGetter enabledCallback; + + final ValueGetter> onStartPopGesture; + + @override + _CupertinoBackGestureDetectorState createState() => _CupertinoBackGestureDetectorState(); +} + +class _CupertinoBackGestureDetectorState extends State> { + CupertinoBackGestureController? _backGestureController; + + late HorizontalDragGestureRecognizer _recognizer; + + @override + void initState() { + super.initState(); + _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) + ..onStart = _handleDragStart + ..onUpdate = _handleDragUpdate + ..onEnd = _handleDragEnd + ..onCancel = _handleDragCancel; + } + + @override + void dispose() { + _recognizer.dispose(); + super.dispose(); + } + + void _handleDragStart(DragStartDetails details) { + assert(mounted); + assert(_backGestureController == null); + _backGestureController = widget.onStartPopGesture(); + } + + void _handleDragUpdate(DragUpdateDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragUpdate(_convertToLogical(details.primaryDelta! / context.size!.width)); + } + + void _handleDragEnd(DragEndDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragEnd(_convertToLogical(details.velocity.pixelsPerSecond.dx / context.size!.width)); + _backGestureController = null; + } + + void _handleDragCancel() { + assert(mounted); + // This can be called even if start is not called, paired with the "down" event + // that we don't consider here. + _backGestureController?.dragEnd(0.0); + _backGestureController = null; + } + + void _handlePointerDown(PointerDownEvent event) { + if (widget.enabledCallback()) { + _recognizer.addPointer(event); + } + } + + double _convertToLogical(double value) { + switch (Directionality.of(context)) { + case TextDirection.rtl: + return -value; + case TextDirection.ltr: + return value; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasDirectionality(context)); + // For devices with notches, the drag area needs to be larger on the side + // that has the notch. + double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? + MediaQuery.paddingOf(context).left : + MediaQuery.paddingOf(context).right; + dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); + return Stack( + fit: StackFit.passthrough, + children: [ + widget.child, + PositionedDirectional( + start: 0.0, + width: dragAreaWidth, + top: 0.0, + bottom: 0.0, + child: Listener( + onPointerDown: _handlePointerDown, + behavior: HitTestBehavior.translucent, + ), + ), + ], + ); + } +} + + +class CupertinoBackGestureController { + /// Creates a controller for an iOS-style back gesture. + /// + /// The [navigator] and [controller] arguments must not be null. + CupertinoBackGestureController({ + required this.navigator, + required this.controller, + }) { + navigator.didStartUserGesture(); + } + + final AnimationController controller; + final NavigatorState navigator; + + /// The drag gesture has changed by [fractionalDelta]. The total range of the + /// drag should be 0.0 to 1.0. + void dragUpdate(double delta) { + controller.value -= delta; + } + + /// The drag gesture has ended with a horizontal motion of + /// [fractionalVelocity] as a fraction of screen width per second. + void dragEnd(double velocity) { + // Fling in the appropriate direction. + // AnimationController.fling is guaranteed to + // take at least one frame. + // + // This curve has been determined through rigorously eyeballing native iOS + // animations. + const Curve animationCurve = Curves.fastLinearToSlowEaseIn; + final bool animateForward; + + // If the user releases the page before mid screen with sufficient velocity, + // or after mid screen, we should animate the page out. Otherwise, the page + // should be animated back in. + if (velocity.abs() >= _kMinFlingVelocity) { + animateForward = velocity <= 0; + } else { + animateForward = controller.value > 0.5; + } + + if (animateForward) { + // The closer the panel is to dismissing, the shorter the animation is. + // We want to cap the animation time, but we want to use a linear curve + // to determine it. + final int droppedPageForwardAnimationTime = min( + lerpDouble(_kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!.floor(), + _kMaxPageBackAnimationTime, + ); + controller.animateTo(1.0, duration: Duration(milliseconds: droppedPageForwardAnimationTime), curve: animationCurve); + } else { + // This route is destined to pop at this point. Reuse navigator's pop. + navigator.pop(); + + // The popping may have finished inline if already at the target destination. + if (controller.isAnimating) { + // Otherwise, use a custom popping animation duration and curve. + final int droppedPageBackAnimationTime = lerpDouble(0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!.floor(); + controller.animateBack(0.0, duration: Duration(milliseconds: droppedPageBackAnimationTime), curve: animationCurve); + } + } + + if (controller.isAnimating) { + // Keep the userGestureInProgress in true state so we don't change the + // curve of the page transition mid-flight since CupertinoPageTransition + // depends on userGestureInProgress. + late AnimationStatusListener animationStatusCallback; + animationStatusCallback = (AnimationStatus status) { + navigator.didStopUserGesture(); + controller.removeStatusListener(animationStatusCallback); + }; + controller.addStatusListener(animationStatusCallback); + } else { + navigator.didStopUserGesture(); + } + } +} + +// Called by _CupertinoBackGestureDetector when a pop ("back") drag start +// gesture is detected. The returned controller handles all of the subsequent +// drag events. +CupertinoBackGestureController startPopGesture(PageRoute route) { + return CupertinoBackGestureController( + navigator: route.navigator!, + controller: route.controller!, // protected access + ); +} + +bool isPopGestureEnabled(PageRoute route) { + print( + "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); +// If there's nothing to go back to, then obviously we don't support +// the back gesture. + if (route.isFirst) { + return false; + } +// If the route wouldn't actually pop if we popped it, then the gesture +// would be really confusing (or would skip internal routes), so disallow it. + if (route.willHandlePopInternally) { + return false; + } +// If attempts to dismiss this route might be vetoed such as in a page +// with forms, then do not allow the user to dismiss the route with a swipe. + if (route.hasScopedWillPopCallback) { + return false; + } +// Fullscreen dialogs aren't dismissible by back swipe. + if (route.fullscreenDialog) { + return false; + } +// If we're in an animation already, we cannot be manually swiped. + if (route.animation!.status != AnimationStatus.completed) { + return false; + } +// If we're being popped into, we also cannot be swiped until the pop above +// it completes. This translates to our secondary animation being +// dismissed. + if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { + return false; + } +// If we're in a gesture already, we cannot start another. + if (isPopGestureInProgress(route)) { + return false; + } + +// Looks like a back gesture would be welcome! + return true; +} + +/// True if an iOS-style back swipe pop gesture is currently underway for [route]. +/// +/// This just check the route's [NavigatorState.userGestureInProgress]. +/// +/// See also: +/// +/// * [popGestureEnabled], which returns true if a user-triggered pop gesture +/// would be allowed. +bool isPopGestureInProgress(PageRoute route) { + return route.navigator!.userGestureInProgress; +} diff --git a/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart b/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart new file mode 100644 index 00000000..fd027cd4 --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart @@ -0,0 +1,33 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'cupertino_back_gesture_detector.dart'; + +class SlidePageTransitionsBuilder extends PageTransitionsBuilder { + const SlidePageTransitionsBuilder(); + + @override + Widget buildTransitions( + PageRoute? route, + BuildContext? context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (Platform.isIOS) { + child = CupertinoBackGestureDetector( + enabledCallback: () => isPopGestureEnabled(route!), + onStartPopGesture: () => startPopGesture(route!), + child: child); + } + final bool linearTransition = isPopGestureInProgress(route!); + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: child, + ); + } +} \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/transition/transition.dart b/modules/fx_go_router_ext/lib/src/transition/transition.dart new file mode 100644 index 00000000..3197d3fc --- /dev/null +++ b/modules/fx_go_router_ext/lib/src/transition/transition.dart @@ -0,0 +1,7 @@ +export 'size_clip_transition.dart'; +export 'fade_page_transitions_builder.dart'; +export 'slide_transition/slide_page_transition_builder.dart'; +export 'slide_transition/cupertino_back_gesture_detector.dart'; +export 'page_route/fade_page_route.dart'; +export 'page_route/slide_page_route.dart'; +export 'page_route/zero_page_route.dart'; \ No newline at end of file diff --git a/modules/fx_go_router_ext/pubspec.yaml b/modules/fx_go_router_ext/pubspec.yaml new file mode 100644 index 00000000..f74adf65 --- /dev/null +++ b/modules/fx_go_router_ext/pubspec.yaml @@ -0,0 +1,56 @@ +name: fx_go_router_ext +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.3.4 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + # 路由管理 + go_router: ^14.2.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_go_router_ext/test/fx_go_router_ext_test.dart b/modules/fx_go_router_ext/test/fx_go_router_ext_test.dart new file mode 100644 index 00000000..e69de29b diff --git a/packages/algorithm/lib/algorithm.dart b/packages/algorithm/lib/algorithm.dart index f9639cf2..51b89c98 100644 --- a/packages/algorithm/lib/algorithm.dart +++ b/packages/algorithm/lib/algorithm.dart @@ -1,9 +1,11 @@ library algorithm; -export 'src/views/sort_parper.dart'; -export 'src/views/top_bar/sort_bar.dart'; -export 'src/views/top_bar/sort_button.dart'; -export 'src/views/sort_setting.dart'; -export 'src/views/sort_page.dart'; +export 'src/views/sort/sort_parper.dart'; +export 'src/views/sort/top_bar/sort_bar.dart'; +export 'src/views/sort/top_bar/sort_button.dart'; +export 'src/views/sort/sort_setting.dart'; +export 'src/views/sort/sort_page.dart'; export 'src/data_scope/sort_config.dart'; -export 'src/data_scope/state.dart'; \ No newline at end of file +export 'src/data_scope/state.dart'; + +export 'src/views/algo_page.dart'; \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/finding/functions.dart b/packages/algorithm/lib/src/algorithm/finding/functions.dart new file mode 100644 index 00000000..e0585797 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions.dart @@ -0,0 +1,35 @@ + +import '../../finding/data_scope/finding_state.dart'; +import 'functions/AStar.dart'; +import 'functions/BestFS.dart'; +import 'functions/BFS.dart'; +import 'functions/DFS.dart'; +import 'functions/dijkstra.dart'; + +typedef XY = (int,int); + +typedef FindFunction = Future Function(FindingState state); + +enum FindingAlgo { + bfs('BFS'), + dfs('DFS'), + aStar('AStar'), + bestFS('BestFS'), + dijkstra('dijkstra'), + ; + + final String path; + + const FindingAlgo(this.path); + + FindFunction get function{ + return switch(this){ + FindingAlgo.bfs => findingBFS, + FindingAlgo.dfs => findingDFS, + FindingAlgo.aStar => findingAStar, + FindingAlgo.bestFS => findingBestFS, + FindingAlgo.dijkstra => findingDijkstra, + }; + } +} + diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart b/packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart new file mode 100644 index 00000000..6f4f5424 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart @@ -0,0 +1,109 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + +/// AStar算法 +Future findingAStar(FindingState state) async { + XY start = state.start; + XY end = state.end; + // 创建优先队列作为开放列表 + PriorityQueue openList = PriorityQueue(); + openList.add(Node(start, 0, heuristic(start, end))); + var (row, col) = state.config.size; + // 初始化路径记录和访问标记 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + + while (!openList.isEmpty) { + // 从开放列表中移除f值最小的节点作为当前节点 + Node current = openList.removeFirst(); + int x = current.p.$1; + int y = current.p.$2; + + // 检查当前节点是否超出地图范围 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果当前节点已经访问过,则继续下一个节点 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + // 回溯路径 + List> path = []; + Node? curNode = current; + while (curNode != null) { + path.add([curNode.p.$1, curNode.p.$2]); + curNode = curNode.parent; + } + // 将路径标记到pathList中,并显示路径动画 + state.pathList = List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; + } + + // 遍历当前节点的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果新节点在地图范围内且是可通行的空地且未被访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + int g = current.g + 1; // 更新新节点的g值 + double h = heuristic((newX, newY), end); // 计算新节点的启发值h + openList.add(Node((newX, newY), g, h, current)); // 将新节点加入开放列表 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); // 延迟显示效果 + } + } + } + + return false; // 开放列表为空,未找到路径,搜索失败 +} + +// 估价函数 +double heuristic(XY start, XY end) { + return ((start.$1 - end.$1).abs() + (start.$2 - end.$2).abs()).toDouble(); +} + +class Node { + XY p; // 坐标 + int g; // 节点的坐标和当前路径长度g值 + double h; // 启发值h + Node? parent; // 父节点 + + Node(this.p, this.g, this.h, [this.parent]); + + double get f => g + h; // 计算节点的总代价f值 +} + +class PriorityQueue { + final List _queue = []; // 优先队列使用的列表 + + bool get isEmpty => _queue.isEmpty; // 判断队列是否为空 + + void add(Node node) { + _queue.add(node); // 添加节点到队列 + _queue.sort((a, b) => a.f.compareTo(b.f)); // 根据f值排序,f值小的在前面 + } + + Node removeFirst() { + return _queue.removeAt(0); // 移除并返回队列中f值最小的节点 + } +} diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart b/packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart new file mode 100644 index 00000000..db37b8dc --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart @@ -0,0 +1,88 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:collection'; + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + +/// 广度优先搜索(BFS)寻找路径 +Future findingBFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + + // 创建队列并添加起始位置 + Queue> queue = Queue(); + queue.add([start.$1, start.$2]); + var (row,col) = state.config.size; + + // 初始化访问标记、路径记录和父节点记录 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List>> parent = List.generate(col, (_) => List.generate(row, (_) => [-1, -1])); + + // 开始广度优先搜索 + while (queue.isNotEmpty) { + List current = queue.removeFirst(); + int x = current[0]; + int y = current[1]; + + // 检查当前位置是否越界 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果已经访问过当前位置,则继续下一个循环 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; // 标记当前位置为已访问 + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径并记录到 path 列表中 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + List prev = parent[curX][curY]; + curX = prev[0]; + curY = prev[1]; + } + + // 清空原路径记录,并设置新的路径记录为找到的路径 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); // 设置路径标记 + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 返回找到路径的结果 + } + + // 遍历当前位置的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 检查新位置是否在地图范围内,并且是可通过的道路,并且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + queue.add([newX, newY]); // 将新位置添加到队列中 + parent[newX][newY] = [x, y]; // 记录新位置的父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); // 等待一段时间,以便显示搜索过程(如果在 Flutter 中) + } + } + } + + return false; // 如果队列为空仍未找到路径,则返回 false +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart b/packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart new file mode 100644 index 00000000..2d462797 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart @@ -0,0 +1,101 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; +import 'AStar.dart'; + +/// BestFS算法 +Future findingBestFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + + // 初始化优先队列、起始节点和父节点数组 + PriorityQueue priorityQueue = PriorityQueue(); + var (row,col) = state.config.size; + + Node startNode = + Node(start, 0, euclideanDistance(start.$1, start.$2, end.$1, end.$2)); + priorityQueue.add(startNode); + + // 初始化 visitedList、pathList 和 parent + // 初始化路径记录和访问标记 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List> parent = + List.generate(col, (_) => List.filled(row, -1)); + + while (!priorityQueue.isEmpty) { + Node currentNode = priorityQueue.removeFirst(); + int x = currentNode.p.$1; + int y = currentNode.p.$2; + + // 如果当前节点已访问过,则跳过 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + int prevX = parent[curX][curY] ~/ row; + int prevY = parent[curX][curY] % row; + curX = prevX; + curY = prevY; + print("curX:$curX,curY:$curY"); + // 防止出现死循环,检查是否回溯到起点 + if (curX == start.$1 && curY == start.$2) { + break; + } + } + // path = path.reversed.toList(); + + // 绘制路径到界面上 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 找到路径并绘制完成,返回true + } + + // 探索当前节点的邻居节点 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果邻居节点在地图范围内且是可通行的道路且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + Node newNode = Node((newX, newY), currentNode.g + 1, + euclideanDistance(newX, newY, state.end.$1, state.end.$2)); + priorityQueue.add(newNode); + parent[newX][newY] = x * row + y; // 记录父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); + } + } + } + + return false; // 未找到路径,返回false +} + +double euclideanDistance(int x, int y, int endX, int endY) { + return sqrt(pow((x - endX).toDouble(), 2) + pow((y - endY).toDouble(), 2)); +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart b/packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart new file mode 100644 index 00000000..ffad96b7 --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart @@ -0,0 +1,84 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + + +import '../../../finding/data_scope/finding_state.dart'; +import '../functions.dart'; + + /// 深度优先搜索(DFS)寻找路径 + Future findingDFS(FindingState state) async { + XY start = state.start; + XY end = state.end; + var (row,col) = state.config.size; + + // 初始化访问标记、路径记录和父节点记录 + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + List>> parent = List.generate(col, (_) => List.generate(row, (_) => [-1, -1])); + + // 定义DFS递归函数 + Future dfs(int x, int y) async { + // 检查当前位置是否越界 + if (!state.isInMap(x, y)) { + throw "坐标越界"; + } + + // 如果已经访问过当前位置,则返回 false + if (state.visitedList[x][y]) return false; + state.visitedList[x][y] = true; // 标记当前位置为已访问 + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径并记录到 path 列表中 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + List prev = parent[curX][curY]; + curX = prev[0]; + curY = prev[1]; + } + + // 清空原路径记录,并设置新的路径记录为找到的路径 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); // 设置路径标记 + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 返回找到路径的结果 + } + + // 遍历当前位置的四个方向 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 检查新位置是否在地图范围内,并且是可通过的道路,并且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + parent[newX][newY] = [x, y]; // 记录新位置的父节点 + state.tick(); // 更新界面状态(如果在 Flutter 中) + await Future.delayed(const Duration(milliseconds: 50)); + if (await dfs(newX, newY)) { + return true; // 如果找到路径,则返回 true + } + } + } + + return false; // 如果当前位置无法继续搜索,则返回 false + } + + // 调用DFS函数并返回最终结果 + return await dfs(start.$1, start.$2); + } \ No newline at end of file diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart b/packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart new file mode 100644 index 00000000..d028929a --- /dev/null +++ b/packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart @@ -0,0 +1,101 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import '../../../finding/data_scope/finding_state.dart'; + +import '../functions.dart'; +import 'AStar.dart'; + +/// Dijkstra算法 +Future findingDijkstra(FindingState state) async { + XY start = state.start; + XY end = state.end; + var (row, col) = state.config.size; + // 初始化优先队列、距离数组和父节点数组 + PriorityQueue priorityQueue = PriorityQueue(); + List> distance = + List.generate(col, (_) => List.filled(row, -1)); + List> parent = + List.generate(col, (_) => List.filled(row, -1)); + + state.visitedList = List.generate(col, (_) => List.filled(row, false)); + state.pathList = List.generate(col, (_) => List.filled(row, false)); + // 将起始节点加入优先队列并初始化距离 + priorityQueue.add(Node(start, 0, 0.0)); + distance[start.$1][start.$2] = 0; + + while (!priorityQueue.isEmpty) { + // 从优先队列中取出当前节点 + Node currentNode = priorityQueue.removeFirst(); + int x = currentNode.p.$1; + int y = currentNode.p.$2; + int currentDistance = currentNode.g; + + // 如果当前节点已访问过,则跳过 + if (state.visitedList[x][y]) continue; + state.visitedList[x][y] = true; + state.tick(); + + // 检查是否到达终点 + if (x == state.end.$1 && y == state.end.$2) { + print("找到路径了"); + + // 回溯路径 + List> path = []; + int curX = x; + int curY = y; + while (curX != -1 && curY != -1) { + path.add([curX, curY]); + int prevX = parent[curX][curY] ~/ row; + int prevY = parent[curX][curY] % row; + curX = prevX; + curY = prevY; + print("curX:$curX,curY:$curY"); + // 防止出现死循环,检查是否回溯到起点 + if (curX == start.$1 && curY == start.$2) { + break; + } + } + // path = path.reversed.toList(); + + // 绘制路径到界面上 + state.pathList = + List.generate(col, (_) => List.filled(row, false)); + for (var point in path) { + state.setPath(point[0], point[1], true); + await Future.delayed(const Duration(milliseconds: 50)); + } + return true; // 找到路径并绘制完成,返回true + } + + // 探索当前节点的邻居节点 + for (int i = 0; i < 4; i++) { + int newX = x + state.direction[i][0]; + int newY = y + state.direction[i][1]; + + // 如果邻居节点在地图范围内且是可通行的道路且未访问过 + if (state.isInMap(newX, newY) && + state.blockList[newX][newY] == state.road && + !state.visitedList[newX][newY]) { + int newDistance = currentDistance + 1; // 更新距离 + + // 如果是第一次访问或找到更短的路径,则更新距离和父节点,并加入优先队列 + if (distance[newX][newY] == -1 || newDistance < distance[newX][newY]) { + distance[newX][newY] = newDistance; + Node newNode = Node((newX, newY), newDistance, 0.0); // Dijkstra没有启发式函数,h设为0 + priorityQueue.add(newNode); + parent[newX][newY] = x * row + y; // 记录父节点 + state.tick(); + await Future.delayed(const Duration(milliseconds: 50)); + } + } + } + } + + return false; // 未找到路径,返回false +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/finding/data_scope/finding_config.dart b/packages/algorithm/lib/src/finding/data_scope/finding_config.dart new file mode 100644 index 00000000..61dc99a7 --- /dev/null +++ b/packages/algorithm/lib/src/finding/data_scope/finding_config.dart @@ -0,0 +1,25 @@ +import '../../algorithm/finding/functions.dart'; + + +class FindingConfig { + final XY size; + final int seed; + final FindingAlgo algo; + + FindingConfig({ + this.seed = -1, + this.algo = FindingAlgo.bfs, + this.size = (31, 31), + }); + + FindingConfig copyWith({ + XY? size, + int? seed, + FindingAlgo? algo, + }) => + FindingConfig( + size: size ?? this.size, + seed: seed ?? this.seed, + algo: algo ?? this.algo, + ); +} diff --git a/packages/algorithm/lib/src/finding/data_scope/finding_state.dart b/packages/algorithm/lib/src/finding/data_scope/finding_state.dart new file mode 100644 index 00000000..360bbc69 --- /dev/null +++ b/packages/algorithm/lib/src/finding/data_scope/finding_state.dart @@ -0,0 +1,250 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; +import 'package:flutter/material.dart'; + +import '../../algorithm/finding/functions.dart'; +import 'finding_config.dart'; +import 'position.dart'; +import 'random_queue.dart'; + +enum FindingStatus{ + none, // 未操作 + finding, // 寻路中 + find, // 寻路完成 +} + +class FindingState with ChangeNotifier { + + int road = 1; //路 + int wall = 0; //墙 + + bool lockMap = false; + + //路径是否被访问过 + List> visitedList = []; + + //迷宫地图 + List> blockList = []; + + //寻找到的正确路线 + List> pathList = []; + + //方向 + List> direction = [ + [-1, 0], + [0, -1], + [1, 0], + [0, 1] + ]; + + FindingState() { + reset(); + } + + List> cacheBlockList = [[]]; + + void lock(){ + print("============lock====="); + lockMap=true; + cacheBlockList.clear(); + var (row,col) = _config.size; + + List.generate(row, (i) { + List tempMazeList = []; + List.generate(col, (j) { + tempMazeList.add(blockList[i][j]); //设置为墙 + }); + cacheBlockList.add(tempMazeList); + }); + notifyListeners(); + } + + void unlock(){ + lockMap=false; + cacheBlockList.clear(); + notifyListeners(); + } + + void tick(){ + notifyListeners(); + } + + FindingStatus status = FindingStatus.none; + FindingConfig _config = FindingConfig(); + FindingConfig get config => _config; + + late XY start; + late XY end; + + void reset(){ + status = FindingStatus.none; + if(lockMap){ + resetLocMap(); + notifyListeners(); + return; + } + + var (row,col) = _config.size; + if (row % 2 == 0 || col % 2 == 0) { + throw "地图行数和列数不能为偶数"; + } + + start = (1,0); + end = (row-2,col-1); + + blockList = []; + visitedList = []; + pathList = []; + //初始化迷宫遍历的方向(上、左、右、下)顺序(迷宫趋势) + //随机遍历顺序,提高迷宫生成的随机性(共12种可能性) + List.generate(direction.length, (index) { + int random = Random().nextInt(direction.length); + List temp = direction[random]; + direction[random] = direction[index]; + direction[index] = temp; + }); + + List.generate(row, (i) { + List tempVisited = []; + List tempMazeList = []; + List tempPath = []; + List.generate(col, (j) { + //行和列为奇数都设置为路,否则设置为墙 + if (i % 2 == 1 && j % 2 == 1) { + tempMazeList.add(1); //设置为路 + } else { + tempMazeList.add(0); //设置为墙 + } + //初始化访问,所有都没有访问过 + tempVisited.add(false); + tempPath.add(false); + }); + visitedList.add(tempVisited); + blockList.add(tempMazeList); + pathList.add(tempPath); + }); + + blockList[start.$1][start.$2] = 1; + blockList[end.$1][end.$2] = 1; + createMap(start.$1,start.$2+1); + status = FindingStatus.none; + + notifyListeners(); + } + + + ///设置为正确的路径 + void setPath(int x, int y, bool isPath) { + if (isInMap(x, y)) { + pathList[x][y] = isPath; + } + tick(); + } + + void changeAlgo(String name){ + FindingAlgo algo = FindingAlgo.values.firstWhere((e)=>e.path==name); + _config = config.copyWith(algo: algo); + if(lockMap){ + + } + status = FindingStatus.none; + notifyListeners(); + } + + void resetLocMap(){ + cacheBlockList = cacheBlockList; + visitedList = visitedList.map((innerList) => innerList.map((element) => false).toList()).toList(); + pathList = pathList.map((innerList) => innerList.map((element) => false).toList()).toList(); + } + + void run() async{ + status = FindingStatus.finding; + await config.algo.function(this); + status = FindingStatus.find; + notifyListeners(); + } + + /// 创建地图并使用随机队列生成地图结构 + void createMap(int startX, int startY) { + RandomQueue randomQueue = RandomQueue(); // 创建一个随机队列实例 + Position start = Position(startX, startY); // 创建起始位置 + randomQueue.addRandomQueue(start); // 将起始位置加入随机队列 + + visitedList[startX][startY] = true; // 标记起始位置为已访问 + + // 使用随机队列生成地图 + while (randomQueue.getSize() != 0) { + Position position = randomQueue.removeRandomQueue(); // 移除队列中的一个位置 + + // 生成四个方向的新位置 + List.generate(4, (i) { + int newX = position.x! + direction[i][0] * 2; + int newY = position.y! + direction[i][1] * 2; + + // 检查新位置是否在地图内且未被访问过 + if (isInMap(newX, newY) && !visitedList[newX][newY]) { + // 将新位置加入随机队列,并记录为已访问 + randomQueue.addRandomQueue(Position(newX, newY, prePosition: position)); + visitedList[newX][newY] = true; + + // 设置新位置与当前位置之间的路径或道路 + setWithRoad(position.x! + direction[i][0], position.y! + direction[i][1]); + } + }); + } + + // 把visitedList全部设置为没有访问 + visitedList = visitedList.map((innerList) => innerList.map((element) => false).toList()).toList(); + } + + ///设置为路 + void setWithRoad(int x, int y) { + blockList[x][y] = road; + } + + ///用来判断blockList[i][j]是否在地图内 + bool isInMap(int i, int j) { + return i >= 0 && i < config.size.$1 && j >= 0 && j < config.size.$2; + } + + Color getBoxColor(int i, int j) { + Color color = Colors.white; + if (blockList[i][j] == 0) { + color = Colors.black54; + } else if (start.$1 == i && start.$2 == j) { + color = Colors.blue; + } else if (end.$1 == i && end.$2 == j) { + color = Colors.red; + } else if (visitedList[i][j]) { + color = Colors.blue.shade200; + } + if (pathList[i][j]) { + color = Colors.orange; + } + return color; + } + +} + +/// Provides the current [FindingState] to descendant widgets in the tree. +class FindingStateScope extends InheritedNotifier { + const FindingStateScope({ + required super.notifier, + required super.child, + super.key, + }); + + static FindingState of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; + + + static FindingState read(BuildContext context) => + context.getInheritedWidgetOfExactType()!.notifier!; +} \ No newline at end of file diff --git a/packages/algorithm/lib/src/finding/data_scope/position.dart b/packages/algorithm/lib/src/finding/data_scope/position.dart new file mode 100644 index 00000000..1f739aab --- /dev/null +++ b/packages/algorithm/lib/src/finding/data_scope/position.dart @@ -0,0 +1,11 @@ +import 'dart:collection'; + +base class Position extends LinkedListEntry { + int? x, y; + Position? prePosition; + + Position(int x, int y, {this.prePosition}) { + this.x = x; + this.y = y; + } +} diff --git a/packages/algorithm/lib/src/finding/data_scope/random_queue.dart b/packages/algorithm/lib/src/finding/data_scope/random_queue.dart new file mode 100644 index 00000000..2bf66b70 --- /dev/null +++ b/packages/algorithm/lib/src/finding/data_scope/random_queue.dart @@ -0,0 +1,48 @@ +import 'dart:collection'; +import 'dart:math'; + +import 'position.dart'; + +///借助LinkedList链表实现随机队列 +class RandomQueue { + LinkedList _queue = LinkedList(); + + RandomQueue() { + _queue = LinkedList(); + } + + void addRandomQueue(Position position) { + if (Random().nextInt(100) < 50) { + _queue.addFirst(position);// 插入到队列头部 + } else { + _queue.add(position);// 插入到队列尾部 + } + } + + ///返回随机队列中的一个元素 + Position removeRandomQueue() { + if (_queue.isEmpty) { + throw "数组为空"; + } else { + if (Random().nextInt(100) < 50) { + Position position = _queue.first; + _queue.remove(position); + return position; + } else { + Position position = _queue.last; + _queue.remove(position); + return position; + } + } + } + + //返回随机队列元素数量 + int getSize() { + return _queue.length; + } + + //判断随机队列是否为空 + bool isEmpty() { + return _queue.isEmpty; + } +} diff --git a/packages/algorithm/lib/src/finding/view/board.dart b/packages/algorithm/lib/src/finding/view/board.dart new file mode 100644 index 00000000..897f34a6 --- /dev/null +++ b/packages/algorithm/lib/src/finding/view/board.dart @@ -0,0 +1,51 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; + +import '../data_scope/finding_state.dart'; + +class MazeBoard extends StatelessWidget { + const MazeBoard({super.key}); + + @override + Widget build(BuildContext context) { + FindingState state = FindingStateScope.of(context); + + return LayoutBuilder( + builder: (ctx,cts){ + double side = cts.biggest.shortestSide*0.9; + double cellSize = side / state.config.size.$1; + + List rowList = []; + List.generate(state.blockList.length, (i) { + List columnList = []; + List.generate(state.blockList[i].length, (j) { + columnList.add(Container( + width: cellSize, + height: cellSize, + decoration: BoxDecoration( + color: state.getBoxColor(i, j), + ), + )); + }); + + rowList.add(Row( + mainAxisAlignment: MainAxisAlignment.center, + children: columnList, + )); + }); + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: rowList, + ); + }, + ); + } +} diff --git a/packages/algorithm/lib/src/finding/view/finding_page.dart b/packages/algorithm/lib/src/finding/view/finding_page.dart new file mode 100644 index 00000000..4bc13209 --- /dev/null +++ b/packages/algorithm/lib/src/finding/view/finding_page.dart @@ -0,0 +1,18 @@ +import 'package:algorithm/src/finding/view/board.dart'; +import 'package:flutter/material.dart'; +import 'finding_tool_bar.dart'; + +class FindingPage extends StatelessWidget { + const FindingPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold( + appBar: FindingToolBar(), + body: Column( + children: [ + Expanded(child: MazeBoard()), + ], + )); + } +} diff --git a/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart b/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart new file mode 100644 index 00000000..695b6b52 --- /dev/null +++ b/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart @@ -0,0 +1,139 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/algorithm/sort/functions.dart'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../data_scope/finding_state.dart'; + + +class FindingToolBar extends StatelessWidget implements PreferredSizeWidget{ + const FindingToolBar({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + FindingState state = FindingStateScope.of(context); + String name = state.config.algo.name; + + + return DragToMoveAreaNoDouble( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 42, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + const FindingButton(), + TolyAction( + tooltip: '更新地图', + onTap: () { + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + state.reset(); + // Scaffold.of(context).openEndDrawer(); + }, + child: const Icon( + Icons.refresh, + color: Colors.orange, + size: 20, + )), + TolyAction( + selected: state.lockMap, + tooltip: state.lockMap?'解除锁定':'锁定地图', + onTap: () { + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + if(state.lockMap){ + state.unlock(); + + }else{ + state.lock(); + + } + // Scaffold.of(context).openEndDrawer(); + }, + child: const Icon( + Icons.lock, + color: Colors.blue, + size: 20, + )), + Spacer(), + TolyLink( + href: + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/finding/functions/$%7Bname%7D.dart', + text: '查看[$name 寻路]源码', + hoverColor: Colors.blue, + style: TextStyle(fontSize: 12,fontFamily: '宋体'), + onTap: jumpURL), + const SizedBox(width: 10), + // TolyAction( + // tooltip: '设置', + // onTap: () { + // Scaffold.of(context).openEndDrawer(); + // }, + // child: const Icon( + // Icons.settings, + // size: 20, + // )), + ], + ), + ), + ); + } + + @override + // TODO: implement preferredSize + Size get preferredSize => Size.fromHeight(42); +} + +class SortBar extends StatelessWidget { + const SortBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const FindingButton(), + const SizedBox( + width: 10, + ), + const SortSelector(), + const SizedBox( + width: 10, + ), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} + +class SortSelector extends StatelessWidget { + const SortSelector({super.key}); + + @override + Widget build(BuildContext context) { + return DropSelectableWidget( + fontSize: 12, + data: sortNameMap.values.toList(), + iconSize: 20, + height: 28, + width: 200, + disableColor: const Color(0xff1F425F), + onDropSelected: (int index) async { + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: sortNameMap.keys.toList()[index]); + }, + ); + } +} diff --git a/packages/algorithm/lib/src/navigation/menu/algo_menu.dart b/packages/algorithm/lib/src/navigation/menu/algo_menu.dart new file mode 100644 index 00000000..2118f0a5 --- /dev/null +++ b/packages/algorithm/lib/src/navigation/menu/algo_menu.dart @@ -0,0 +1,9 @@ +import 'sort.dart'; +import 'finding.dart'; + +Map get algoMenus => { + 'children': [ + findingMenus, + sortMenus, + ] +}; diff --git a/packages/algorithm/lib/src/navigation/menu/finding.dart b/packages/algorithm/lib/src/navigation/menu/finding.dart new file mode 100644 index 00000000..a370c6f0 --- /dev/null +++ b/packages/algorithm/lib/src/navigation/menu/finding.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +Map get findingMenus => { + 'path': '/finding', + 'icon': Icons.pages_outlined, + 'label': '寻路算法', + 'children': [ + { + 'path': '/BFS', + 'label': '广度优先搜索', + }, + { + 'path': '/DFS', + 'label': '深度优先搜索', + }, + { + 'path': '/AStar', + 'label': 'A* 寻路算法', + }, + { + 'path': '/BestFS', + 'label': '最佳优先算法', + }, + { + 'path': '/dijkstra', + 'label': 'Dijkstra 算法', + }, + ] +}; \ No newline at end of file diff --git a/packages/algorithm/lib/src/navigation/menu/sort.dart b/packages/algorithm/lib/src/navigation/menu/sort.dart new file mode 100644 index 00000000..6af6c48f --- /dev/null +++ b/packages/algorithm/lib/src/navigation/menu/sort.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +Map get sortMenus => { + 'path': '/sort', + 'icon': Icons.sort, + 'label': '排序算法', + 'children': [ + { + 'path': '/insertion', + 'label': '插入排序', + }, + { + 'path': '/bubble', + 'label': '冒泡排序', + }, + { + 'path': '/cocktail', + 'label': '鸡尾酒排序', + }, + { + 'path': '/comb', + 'label': '梳排序', + }, + { + 'path': '/pigeonHole', + 'label': '鸽巢排序', + }, + { + 'path': '/shell', + 'label': '希尔排序', + }, + { + 'path': '/selection', + 'label': '选择排序', + }, + { + 'path': '/gnome', + 'label': '侏儒排序', + }, + { + 'path': '/cycle', + 'label': '循环排序', + }, + { + 'path': '/heap', + 'label': '堆排序', + }, + { + 'path': '/quick', + 'label': '快速排序', + }, + { + 'path': '/merge', + 'label': '归并排序', + }, + ] +}; \ No newline at end of file diff --git a/packages/algorithm/lib/src/navigation/router/router.dart b/packages/algorithm/lib/src/navigation/router/router.dart new file mode 100644 index 00000000..61deee81 --- /dev/null +++ b/packages/algorithm/lib/src/navigation/router/router.dart @@ -0,0 +1,39 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/finding/view/finding_page.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; + +import '../view/algo_desk_navigation.dart'; + +RouteBase get algoRoutes => GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + ShellRoute( + builder: (BuildContext context, GoRouterState state, Widget child) { + return AppDeskNavigation(content: child); + }, + routes: [ + GoRoute( + path: 'sort/:name', + builder: (BuildContext context, GoRouterState state) { + return const DeskSortPage(); + }, + ), + GoRoute( + path: 'finding/:name', + builder: (BuildContext context, GoRouterState state) { + return const FindingPage(); + }, + ), + ]) + ], +); diff --git a/packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart b/packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart new file mode 100644 index 00000000..d721ec79 --- /dev/null +++ b/packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart @@ -0,0 +1,26 @@ + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import 'algo_menu_tree.dart'; + +class AppDeskNavigation extends StatelessWidget { + final Widget content; + + const AppDeskNavigation({super.key, required this.content}); + + @override + Widget build(BuildContext context) { + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return Scaffold( + backgroundColor: backgroundColor, + body: Row( + children: [ + const AppMenuTree(), + Expanded(child: content), + ], + ), + ); + } +} diff --git a/packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart b/packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart new file mode 100644 index 00000000..2f3601dc --- /dev/null +++ b/packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart @@ -0,0 +1,179 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-05-23 +// Contact Me: 1981462002@qq.com + +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +class AlgoMenuMetaExt extends MenuMateExt { + final String? subtitle; + final String? tag; + final bool? isFlutter; + + const AlgoMenuMetaExt({ + required this.subtitle, + required this.tag, + required this.isFlutter, + }); + + factory AlgoMenuMetaExt.fromMap(Map map) { + return AlgoMenuMetaExt( + subtitle: map['subtitle'], + tag: map['tag'], + isFlutter: map['isFlutter'], + ); + } +} + +class AlgoMenuCell extends StatelessWidget { + final MenuNode menuNode; + final DisplayMeta display; + final MenuTreeCellStyle? style; + + const AlgoMenuCell({ + super.key, + required this.menuNode, + required this.display, + this.style, + }); + + MenuTreeCellStyle get effectStyle => + style ?? (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + + Color? effectForegroundColor(MenuTreeCellStyle style) { + if (display.selected) { + return display.isDark ? Colors.white : style.activeForegroundColor; + } + if (display.hovered) { + return display.isDark ? Colors.white : style.hoverForegroundColor; + } + return style.inactiveForegroundColor; + } + + double get anim => display.anima ?? 1; + + Color? backgroundColor(MenuTreeCellStyle style) { + if (hasChild) return null; + if (selectOrPlaying) { + return style.activeBackgroundColor.withOpacity(anim); + } + if (display.hovered) { + return style.hoverBackgroundColor; + } + return null; + } + + bool get selectOrPlaying => (display.selected || display.playing); + + bool get hasChild => menuNode.children.isNotEmpty; + + @override + Widget build(BuildContext context) { + MenuTreeCellStyle effectStyle = + style ?? (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + + Color? bgColor = backgroundColor(effectStyle); + Color? fgColor = effectForegroundColor(effectStyle); + EdgeInsets padding = const EdgeInsets.symmetric(horizontal: 8, vertical: 2); + + Widget cell = DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + color: bgColor, + ), + child: Row( + children: [ + Expanded( + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only( + left: 12.0 + (28 * menuNode.depth), + top: ext?.subtitle == null ? 8 : 8, + bottom: ext?.subtitle == null ? 8 : 8, + ), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + if (menuNode.data.icon != null) + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon(menuNode.data.icon, size: 20, color: fgColor), + ), + _buildTitle(fgColor) + ], + ), + ), + ), + if (ext?.tag != null) _buildTag(ext), + if (menuNode.children.isNotEmpty) _buildExpandIndicator(display.expanded, fgColor) + ], + ), + ); + if (selectOrPlaying && effectStyle.showIndicator && !hasChild) { + cell = Stack( + alignment: Alignment.centerLeft, + children: [ + cell, + LineIndicator(progress: anim, color: fgColor), + ], + ); + } + return Padding(padding: padding, child: cell); + } + + AlgoMenuMetaExt? get ext => menuNode.data.ext?.me(); + + Widget _buildTitle(Color? fgColor) { + TextStyle subStyle = const TextStyle(fontSize: 12, color: Colors.grey); + TextStyle titleStyle = TextStyle(color: fgColor); + Widget child = Text( + menuNode.data.label, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: titleStyle, + ); + if (ext?.isFlutter ?? false) { + child = Wrap( + spacing: 4, + crossAxisAlignment: WrapCrossAlignment.center, + children: [child, const FlutterLogo(size: 14)], + ); + } + if (ext?.subtitle != null) { + child = Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [child, Text(ext!.subtitle!, style: subStyle)], + ); + } + return child; + } + + Widget _buildTag(AlgoMenuMetaExt? ext) { + TextStyle tagStyle = const TextStyle(color: Colors.white, height: 1, fontSize: 10); + Widget child = + Text('${ext?.tag}', overflow: TextOverflow.ellipsis, maxLines: 1, style: tagStyle); + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + decoration: BoxDecoration( + color: Colors.blue.withOpacity(0.8), borderRadius: BorderRadius.circular(4)), + child: child), + ); + } + + Widget _buildExpandIndicator(bool expanded, Color? color) { + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Transform.rotate( + angle: display.rate * pi, + child: Icon(CupertinoIcons.chevron_down, size: 16, color: color))); + } +} diff --git a/packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart b/packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart new file mode 100644 index 00000000..c6be71f6 --- /dev/null +++ b/packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart @@ -0,0 +1,88 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../finding/data_scope/finding_state.dart'; +import '../menu/algo_menu.dart'; +import 'package:path/path.dart' as p ; + +import 'algo_menu_cell.dart'; + +class AppMenuTree extends StatefulWidget { + const AppMenuTree({super.key}); + + @override + State createState() => _AppMenuTreeState(); +} + +class _AppMenuTreeState extends State with RouterChangeListenerMixin { + late MenuTreeMeta _menuMeta; + + @override + void initState() { + super.initState(); + _initTreeMeta(); + } + + void _initTreeMeta() { + MenuNode root = MenuNode.fromMap(algoMenus); + List parts = Uri.parse(path).pathSegments; + String parentPath = parts.sublist(0, parts.length - 1).join('/'); + _menuMeta = MenuTreeMeta( + expandMenus: ['/$parentPath'], + activeMenu: root.find(path), + root: root, + ); + } + + @override + Widget build(BuildContext context) { + Color expandBackgroundColor = context.isDark ? Colors.black : Colors.transparent; + Color backgroundColor = context.isDark ? Color(0xff001529) : Colors.white; + + return TolyRailMenuTree( + enableWidthChange: true, + maxWidth: 360, + width: 190, + meta: _menuMeta, + builder: (node, display) => AlgoMenuCell( + menuNode: node, + display: display, + ), + backgroundColor: backgroundColor, + expandBackgroundColor: expandBackgroundColor, + onSelect: _onSelect, + ); + } + + + void _onSelect(MenuNode menu) { + if (menu.isLeaf) { + FindingState state = FindingStateScope.read(context); + if(state.status==FindingStatus.finding){ + $message.warning(message: '正在寻路中,请稍后'); + return; + } + context.go(menu.id); + } else { + _menuMeta = _menuMeta.select(menu, singleExpand: true); + setState(() {}); + } + } + + @override + void reassemble() { + MenuNode root = MenuNode.fromMap(algoMenus); + _menuMeta = _menuMeta.copyWith(root: root); + super.reassemble(); + } + + @override + void onChangeRoute(String path) { + FindingState state = FindingStateScope.read(context); + state.changeAlgo(p.basename(path)); + _menuMeta = _menuMeta.selectPath(path, singleExpand: true); + setState(() {}); + } +} diff --git a/packages/algorithm/lib/src/views/algo_page.dart b/packages/algorithm/lib/src/views/algo_page.dart new file mode 100644 index 00000000..40696186 --- /dev/null +++ b/packages/algorithm/lib/src/views/algo_page.dart @@ -0,0 +1,64 @@ +import 'package:algorithm/src/finding/data_scope/finding_state.dart'; +import 'package:algorithm/src/navigation/router/router.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; + +import '../../algorithm.dart'; + +class AlgoScope extends StatelessWidget { + final Widget child; + + const AlgoScope({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return SortStateScope( + notifier: SortState(), + child: FindingStateScope( + notifier: FindingState(), + child: child, + ), + ); + } +} + +class AlgoRouterPage extends StatefulWidget { + const AlgoRouterPage({super.key}); + + @override + State createState() => _AlgoRouterPageState(); +} + +class _AlgoRouterPageState extends State { + final GoRouter _router = GoRouter( + initialLocation: '/finding/BFS', + routes: [algoRoutes], + onException: (BuildContext ctx, GoRouterState state, GoRouter router) { + router.go('/404', extra: state.uri.toString()); + }, + ); + + // late final DisplayLogic logic; + + @override + void initState() { + // logic = DisplayLogic(DisplayState( + // router: '/base/size', + // activeIndex: 0, + // total: kDisplayMap['/base/size']!.length, + // )); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + const Divider(), + Expanded( + child: Router.withConfig(config: _router), + ), + ], + ); + } +} diff --git a/packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart b/packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart new file mode 100644 index 00000000..012ebfcf --- /dev/null +++ b/packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart @@ -0,0 +1,63 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +// class LayoutRouterPage extends StatefulWidget { +// LayoutRouterPage({super.key}); +// +// @override +// State createState() => _LayoutRouterPageState(); +// } +// +// class _LayoutRouterPageState extends State { +// final GoRouter _router = GoRouter( +// initialLocation: '/base/size', +// routes: [layoutRoutes], +// onException: (BuildContext ctx, GoRouterState state, GoRouter router) { +// router.go('/404', extra: state.uri.toString()); +// }, +// ); +// +// late final DisplayLogic logic; +// +// @override +// void initState() { +// logic = DisplayLogic(DisplayState( +// router: '/base/size', +// activeIndex: 0, +// total: kDisplayMap['/base/size']!.length, +// )); +// super.initState(); +// } +// +// @override +// Widget build(BuildContext context) { +// return DisplayScope( +// notifier: logic, +// child: Column( +// children: [ +// const Divider(), +// Expanded( +// child: Router.withConfig(config: _router), +// ), +// ], +// ), +// ); +// } +// } + +class DeskAlgoPanel extends StatelessWidget { + const DeskAlgoPanel({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + + ); + } +} diff --git a/packages/algorithm/lib/src/views/data_painter.dart b/packages/algorithm/lib/src/views/sort/data_painter.dart similarity index 100% rename from packages/algorithm/lib/src/views/data_painter.dart rename to packages/algorithm/lib/src/views/sort/data_painter.dart diff --git a/packages/algorithm/lib/src/views/sort_page.dart b/packages/algorithm/lib/src/views/sort/sort_page.dart similarity index 93% rename from packages/algorithm/lib/src/views/sort_page.dart rename to packages/algorithm/lib/src/views/sort/sort_page.dart index efb0f074..151f6281 100644 --- a/packages/algorithm/lib/src/views/sort_page.dart +++ b/packages/algorithm/lib/src/views/sort/sort_page.dart @@ -1,6 +1,8 @@ import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; +import 'top_bar/sort_bar.dart'; + class DeskSortPage extends StatelessWidget{ const DeskSortPage({super.key}); diff --git a/packages/algorithm/lib/src/views/sort_parper.dart b/packages/algorithm/lib/src/views/sort/sort_parper.dart similarity index 91% rename from packages/algorithm/lib/src/views/sort_parper.dart rename to packages/algorithm/lib/src/views/sort/sort_parper.dart index bdb752aa..a48f8e7e 100644 --- a/packages/algorithm/lib/src/views/sort_parper.dart +++ b/packages/algorithm/lib/src/views/sort/sort_parper.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import '../data_scope/state.dart'; +import '../../data_scope/state.dart'; import 'data_painter.dart'; class SortPaper extends StatelessWidget{ diff --git a/packages/algorithm/lib/src/views/sort_setting.dart b/packages/algorithm/lib/src/views/sort/sort_setting.dart similarity index 98% rename from packages/algorithm/lib/src/views/sort_setting.dart rename to packages/algorithm/lib/src/views/sort/sort_setting.dart index 71311b8b..44a27351 100644 --- a/packages/algorithm/lib/src/views/sort_setting.dart +++ b/packages/algorithm/lib/src/views/sort/sort_setting.dart @@ -1,6 +1,7 @@ +import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; -import '../../algorithm.dart'; + class SortSettings extends StatefulWidget { const SortSettings({super.key,}); diff --git a/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart b/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart new file mode 100644 index 00000000..e9366181 --- /dev/null +++ b/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart @@ -0,0 +1,94 @@ +import 'package:algorithm/algorithm.dart'; +import 'package:algorithm/src/algorithm/sort/functions.dart'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; + +import 'sort_button.dart'; + +class DeskSortBar extends StatelessWidget { + const DeskSortBar({super.key}); + + @override + Widget build(BuildContext context) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + String name = SortStateScope.of(context).config.name; + + return DragToMoveAreaNoDouble( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 42, + color: isDark ? const Color(0xff2C3036) : Colors.white, + child: Row( + children: [ + const FindingButton(), + Spacer(), + TolyLink( + href: + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart', + text: '查看排序源码', + hoverColor: Colors.blue, + style: TextStyle(fontSize: 12,fontFamily: '宋体'), + onTap: jumpURL), + const SizedBox(width: 10), + TolyAction( + tooltip: '设置', + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon( + Icons.settings, + size: 20, + )), + ], + ), + ), + ); + } +} + +class SortBar extends StatelessWidget { + const SortBar({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const FindingButton(), + const SizedBox( + width: 10, + ), + const SortSelector(), + const SizedBox( + width: 10, + ), + GestureDetector( + onTap: () { + Scaffold.of(context).openEndDrawer(); + }, + child: const Icon(Icons.settings)) + ], + ); + } +} + +class SortSelector extends StatelessWidget { + const SortSelector({super.key}); + + @override + Widget build(BuildContext context) { + return DropSelectableWidget( + fontSize: 12, + data: sortNameMap.values.toList(), + iconSize: 20, + height: 28, + width: 200, + disableColor: const Color(0xff1F425F), + onDropSelected: (int index) async { + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: sortNameMap.keys.toList()[index]); + }, + ); + } +} diff --git a/packages/algorithm/lib/src/views/top_bar/sort_button.dart b/packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart similarity index 51% rename from packages/algorithm/lib/src/views/top_bar/sort_button.dart rename to packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart index cce2959b..8fa45022 100644 --- a/packages/algorithm/lib/src/views/top_bar/sort_button.dart +++ b/packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart @@ -1,43 +1,43 @@ import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; -import '../../data_scope/state.dart'; +import '../../../finding/data_scope/finding_state.dart'; - - -class SortButton extends StatelessWidget { - const SortButton({super.key}); +class FindingButton extends StatelessWidget { + const FindingButton({super.key}); @override Widget build(BuildContext context) { - SortState state = SortStateScope.of(context); + FindingState state = FindingStateScope.of(context); VoidCallback? action; IconData icon; + String? tip; Color color; switch (state.status) { - case SortStatus.none: + case FindingStatus.none: icon = Icons.not_started_outlined; color = Colors.green; - action = state.sort; + action = state.run; + tip = '运行'; break; - case SortStatus.sorting: + case FindingStatus.finding: icon = Icons.stop_circle_outlined; color = Colors.grey; + tip = '排序中'; action = null; break; - case SortStatus.sorted: + case FindingStatus.find: icon = Icons.refresh; color = Colors.black; action = state.reset; + tip = '重置'; break; } - - return GestureDetector( + return TolyAction( onTap: action, - child: Icon( - icon, - color: color, - ), + tooltip: tip, + child: Icon(icon, color: color, size: 20), ); } } diff --git a/packages/algorithm/lib/src/views/top_bar/sort_bar.dart b/packages/algorithm/lib/src/views/top_bar/sort_bar.dart deleted file mode 100644 index 3bcecd90..00000000 --- a/packages/algorithm/lib/src/views/top_bar/sort_bar.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:toly_ui/toly_ui.dart'; - - -import '../../data_scope/state.dart'; -import '../../algorithm/sort/functions.dart'; -import 'sort_button.dart'; - -class DeskSortBar extends StatelessWidget { - const DeskSortBar({super.key}); - - @override - Widget build(BuildContext context) { - - bool isDark = Theme.of(context).brightness == Brightness.dark; - - return DragToMoveAreaNoDouble( - child: Container( - height: 64, - color: isDark? const Color(0xff2C3036):Colors.white, - child: const Row( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Text('可视化排序',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),), - ), - Spacer(), - SizedBox( - width: 20, - ), - SortBar(), - Padding( - padding: EdgeInsets.symmetric(vertical: 18.0), - child: VerticalDivider( - width: 32, - ), - ), - WindowButtons(), - ], - ), - ), - ); - } -} - - -class SortBar extends StatelessWidget { - const SortBar({super.key}); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - const SortButton(), - const SizedBox(width: 10,), - const SortSelector(), - const SizedBox(width: 10,), - GestureDetector( - onTap: (){ - Scaffold.of(context).openEndDrawer(); - }, - child: const Icon(Icons.settings)) - ], - ); - } -} - -class SortSelector extends StatelessWidget { - const SortSelector({super.key}); - - @override - Widget build(BuildContext context) { - return DropSelectableWidget( - fontSize: 12, - data: sortNameMap.values.toList(), - iconSize: 20, - height: 28, - width: 200, - disableColor: const Color(0xff1F425F), - onDropSelected: (int index) async { - SortState state = SortStateScope.of(context); - state.config =state.config.copyWith( - name: sortNameMap.keys.toList()[index] - ); - }, - ); - } -} diff --git a/packages/algorithm/pubspec.yaml b/packages/algorithm/pubspec.yaml index 7112b5de..1f23ba95 100644 --- a/packages/algorithm/pubspec.yaml +++ b/packages/algorithm/pubspec.yaml @@ -4,12 +4,18 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.1 <3.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=1.17.0" dependencies: flutter: sdk: flutter + # tolyui + tolyui: ^0.0.2+15 + + fx_go_router_ext: + path: ../../modules/fx_go_router_ext + components: path: ../components toly_ui: diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index 866e5e16..6f4628d7 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -26,4 +26,6 @@ export 'app/style/behavior/no_scroll_behavior.dart'; export 'app/platform_adapter/window/windows_adapter.dart'; export 'app/platform_adapter/views/window_buttons.dart'; -export 'app_config/app_config.dart'; \ No newline at end of file +export 'app_config/app_config.dart'; + +export 'app/action/action.dart'; \ No newline at end of file diff --git a/packages/app/lib/app/action/action.dart b/packages/app/lib/app/action/action.dart new file mode 100644 index 00000000..a49af120 --- /dev/null +++ b/packages/app/lib/app/action/action.dart @@ -0,0 +1 @@ +export 'url.dart'; \ No newline at end of file diff --git a/packages/app/lib/app/action/url.dart b/packages/app/lib/app/action/url.dart new file mode 100644 index 00000000..fd8b8297 --- /dev/null +++ b/packages/app/lib/app/action/url.dart @@ -0,0 +1,17 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-07 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/foundation.dart'; +import 'package:url_launcher/url_launcher.dart'; + +void jumpURL(String url) async { + Uri uri = Uri.parse(url); + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(uri,mode: LaunchMode.externalApplication); + } else { + debugPrint('Could not launch $url'); + } +} \ No newline at end of file diff --git a/packages/app/lib/app/i10n/l10n.dart b/packages/app/lib/app/i10n/l10n.dart deleted file mode 100644 index e887bb65..00000000 --- a/packages/app/lib/app/i10n/l10n.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:flutter/widgets.dart'; - - diff --git a/packages/app/lib/app/style/unit_text_style.dart b/packages/app/lib/app/style/unit_text_style.dart index 545663d3..1fdf7c19 100644 --- a/packages/app/lib/app/style/unit_text_style.dart +++ b/packages/app/lib/app/style/unit_text_style.dart @@ -15,7 +15,7 @@ class UnitTextStyle { shadows: [ Shadow( color: Colors.black, - blurRadius: 1, + blurRadius: 0.5, offset: Offset(0.1, 0.1)) ], fontSize: 12); diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index 70d1dcb7..2bce3a20 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: shared_preferences: ^2.2.2 # xml 固化 connectivity_plus: ^6.0.3 window_manager: ^0.3.9 #桌面尺寸 + url_launcher: ^6.1.14 # url storage: path: ../storage widget_module: diff --git a/packages/artifact/lib/src/articles/view/artifact_page.dart b/packages/artifact/lib/src/articles/view/artifact_page.dart index 101e3bac..d71e3c8e 100644 --- a/packages/artifact/lib/src/articles/view/artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/artifact_page.dart @@ -141,7 +141,7 @@ class _ArtifactPageState extends State snap: true, pinned: true, backgroundColor: Colors.white, - leading: _curIndex == 1 ? SortButton() : null, + leading: _curIndex == 1 ? FindingButton() : null, // flexibleSpace: Image.network( // 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/448d4eb270f44edab0192a1281141954~tplv-k3u1fbpfcp-watermark.image?', diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart index 03f8ff69..bdafa61c 100644 --- a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/packages/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -61,7 +61,7 @@ class _DeskKnowledgePageState extends State with SingleTicke children: [ LayoutRouterPage(), TolyArticlesPage(), - SoreAlgoPage(), + AlgoRouterPage(), DeskPointPage(), ], )) @@ -134,7 +134,7 @@ class SoreAlgoPage extends StatelessWidget { ), )), Spacer(), - SortButton(), + FindingButton(), const SizedBox(width: 12,), SortSelector(), const SizedBox(width: 12,), diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index fdd79072..00c1bc51 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -13,7 +13,6 @@ dependencies: flutter_bloc: ^8.1.6 # 状态管理 dio: ^5.3.2 # 网络请求 webview_flutter: ^4.2.4 - url_launcher: ^6.1.14 # url refresh: ^1.0.1 storage: path: ../storage diff --git a/packages/layout/lib/src/data/display_map/display_map.dart b/packages/layout/lib/src/data/display_map/display_map.dart index 13bed44f..b6aa8f12 100644 --- a/packages/layout/lib/src/data/display_map/display_map.dart +++ b/packages/layout/lib/src/data/display_map/display_map.dart @@ -8,6 +8,7 @@ import '../../views/popable/dropdown_button_demo.dart'; import '../../views/popable/dropdown_menu_demo.dart'; import '../model/display_frame.dart'; import 'base.dart'; +import 'funny.dart'; import 'multi.dart'; Map> get kDisplayMap => { @@ -20,6 +21,8 @@ Map> get kDisplayMap => { '/multi/wrap': multiWrap, '/multi/stack': multiStack, + '/funny/elevator':funnyElevator, + // '/popable/DropdownButton': [ // DisplayFrame( // title: '下拉按钮 DropdownButton', diff --git a/packages/layout/lib/src/data/display_map/funny.dart b/packages/layout/lib/src/data/display_map/funny.dart new file mode 100644 index 00000000..5df2be11 --- /dev/null +++ b/packages/layout/lib/src/data/display_map/funny.dart @@ -0,0 +1,21 @@ +// Copyright 2014 The 星星 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-07-02 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/cupertino.dart'; + +import '../../views/interest/elevator/elevator.dart'; +import '../model/display_frame.dart'; + +List get funnyElevator => [ + DisplayFrame( + title: '电梯布局', + desc: "模拟完成电梯的运行。", + src: '', + display: (BuildContext context) => ElevatorRoom(), + ), +]; diff --git a/packages/layout/lib/src/navigation/menu/funny.dart b/packages/layout/lib/src/navigation/menu/funny.dart new file mode 100644 index 00000000..028a6cb7 --- /dev/null +++ b/packages/layout/lib/src/navigation/menu/funny.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +// import 'package:iroute/app/res/fx_icon.dart'; +// { +// 'path': '/expanded', +// 'label': '延展布局', +// // 'icon': Icons.text_fields, +// }, +// { +// 'path': '/holy', +// 'label': '圣杯布局', +// // 'icon': Icons.text_fields, +// }, +Map get funnyMenus => { + 'path': '/funny', + 'icon': Icons.multitrack_audio, + 'label': '趣味布局', + 'children': [ + { + 'path': '/elevator', + 'label': '电梯布局', + }, + + ] + }; diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart index b9e91aca..3608b305 100644 --- a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart +++ b/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart @@ -1,4 +1,5 @@ import 'base_layout.dart'; +import 'funny.dart'; import 'scroll.dart'; import 'layout.dart'; import 'multi.dart'; @@ -9,5 +10,6 @@ Map get layoutMenus => { baseMenus, multiMenus, calcMenus, + funnyMenus, ] }; diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/packages/layout/lib/src/navigation/router/desk_router.dart index c4f5937c..8cc7df44 100644 --- a/packages/layout/lib/src/navigation/router/desk_router.dart +++ b/packages/layout/lib/src/navigation/router/desk_router.dart @@ -71,7 +71,46 @@ RouteBase get deskNavRoute => ShellRoute( // ), // ] ), - + GoRoute( + path: 'funny/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + // builder: (_,__)=>Text("暂未实现"), + // routes: [ + // GoRoute( + // path: 'row', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'row', + // ); + // }, + // ), + // GoRoute( + // path: 'column', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'column', + // ); + // }, + // ), GoRoute( + // path: 'expanded', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'expanded', + // ); + // }, + // ), + // GoRoute( + // path: 'holy', + // builder: (BuildContext context, GoRouterState state) { + // return TextShow( + // info: 'holy', + // ); + // }, + // ), + // ] + ), // GoRoute( // path: 'text/gen/secret', // builder: (BuildContext context, GoRouterState state) { diff --git a/packages/layout/lib/src/views/interest/elevator/elevator.dart b/packages/layout/lib/src/views/interest/elevator/elevator.dart new file mode 100644 index 00000000..1b3818cf --- /dev/null +++ b/packages/layout/lib/src/views/interest/elevator/elevator.dart @@ -0,0 +1,85 @@ +// Copyright 2014 The 星星. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 星星 +// CreateTime: 2024-07-02 +// Contact Me: 1981462002@qq.com + +import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; + +class ElevatorRoom extends StatefulWidget { + const ElevatorRoom({super.key}); + + @override + State createState() => _ElevatorRoomState(); +} + +class _ElevatorRoomState extends State { + int lv = 1 ; + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + double roomHeight = constraints.maxHeight/20; + + return Row( + children: [ + SizedBox( + width: 10, + ), + Stack( + children: [ + Column( + children: List.generate( + 20, + (index) => Container( + decoration: + BoxDecoration(border: Border.all(width: 1, color: Colors.grey)), + width: constraints.minWidth / 10, + height: roomHeight, + )), + ), + Positioned( + bottom: roomHeight * ( lv - 1 ), + child: elevator( width: constraints.minWidth / 10, + height: constraints.maxHeight / 20,), + ), + ], + ), + Column( + children: [ + TolyAction(child: Icon(Icons.arrow_upward_outlined), onTap:upRoom), + TolyAction(child: Icon(Icons.arrow_downward_outlined), onTap:downRoom), + + ], + ), + ], + ); + }, + ); + } + + void upRoom() { + lv+=1; + setState(() { + + }); + } + + void downRoom() { + + lv-=1; + setState(() { + + }); + } + Widget elevator({required double height, required double width}) { + return Container( + height: height, + width: width, + color: Colors.blue, + ); + } +} diff --git a/packages/layout/lib/src/views/layout_page.dart b/packages/layout/lib/src/views/layout_page.dart index 7b843ee7..1b953d3f 100644 --- a/packages/layout/lib/src/views/layout_page.dart +++ b/packages/layout/lib/src/views/layout_page.dart @@ -7,7 +7,6 @@ import 'package:layout/src/navigation/router/app_router.dart'; import '../bloc/display_logic.dart'; import '../bloc/display_state.dart'; import '../data/display_map/display_map.dart'; -import '../data/model/display_frame.dart'; class LayoutRouterPage extends StatefulWidget { LayoutRouterPage({super.key}); diff --git a/packages/layout/pubspec.yaml b/packages/layout/pubspec.yaml index ee47da56..22110061 100644 --- a/packages/layout/pubspec.yaml +++ b/packages/layout/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - # 菜单管理 + # tolyui tolyui: ^0.0.2+15 # 路由管理 diff --git a/pubspec.lock b/pubspec.lock index 851e97ae..686730c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,6 +302,13 @@ packages: description: flutter source: sdk version: "0.0.0" + fx_go_router_ext: + dependency: transitive + description: + path: "modules/fx_go_router_ext" + relative: true + source: path + version: "0.0.1" go_router: dependency: "direct main" description: From db48fed25df76e9b7e6b325d27f918479e75453b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 13 Jul 2024 10:48:24 +0800 Subject: [PATCH 073/149] . --- assets/data/web/node.json | 1 + assets/data/web/widget.json | 1 + modules/fx_app_env/lib/src/app_env.dart | 8 ++ modules/fx_app_env/lib/src/os.dart | 8 ++ .../memory_impl/memory_node_repository.dart | 92 ++++++++++++++++++ .../memory_impl/memory_widget_repository.dart | 8 ++ .../lib/data/{exp.dart => zone.dart} | 0 web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes web/index.html | 38 ++++++++ web/manifest.json | 35 +++++++ web/splash.gif | Bin 0 -> 340438 bytes web/splash.js | 0 sqlite3.dll => windows/libs/sqlite3.dll | Bin 17 files changed, 191 insertions(+) create mode 100644 assets/data/web/node.json create mode 100644 assets/data/web/widget.json create mode 100644 modules/fx_app_env/lib/src/app_env.dart create mode 100644 modules/fx_app_env/lib/src/os.dart create mode 100644 packages/widget_module/lib/data/memory_impl/memory_node_repository.dart create mode 100644 packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart rename packages/widget_module/lib/data/{exp.dart => zone.dart} (100%) create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/Icon-maskable-192.png create mode 100644 web/icons/Icon-maskable-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json create mode 100644 web/splash.gif create mode 100644 web/splash.js rename sqlite3.dll => windows/libs/sqlite3.dll (100%) diff --git a/assets/data/web/node.json b/assets/data/web/node.json new file mode 100644 index 00000000..b27cbda5 --- /dev/null +++ b/assets/data/web/node.json @@ -0,0 +1 @@ +[{"id":null,"widgetId":9,"name":"CircleAvatar的表现","priority":1,"subtitle":"【radius】 : 半径 【double】\n【backgroundImage】 : 图片资源 【ImageProvider】\n【foregroundColor】: 前景色 【Color】\n【backgroundColor】: 背景色 【Color】\n【minRadius】: 最小半径 【double】\n【maxRadius】: 最大半径 【double】\n【child】: 孩子组件 【Child】","code":"import 'package:flutter/material.dart';\nclass CustomCircleAvatar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return CircleAvatar(\n radius: 50,\n backgroundImage: AssetImage(\"assets/images/wy_200x300.jpg\"),\n foregroundColor: Colors.white,\n child: Icon(\n Icons.check,\n size: 50,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":19,"name":"RadioListTile需要一个泛型T","priority":1,"subtitle":"【value】 : 条目对象 【T】\n【groupValue】 : 选中对象 【T】\n【selected】: 是否选中 【bool】\n【secondary】: 右侧组件 【Widget】\n【title】: 中间上组件 【Widget】\n【subtitle】: 中间下组件 【Widget】\n【onChanged】: 切换事件 【Function(T)】","code":"import 'package:flutter/material.dart';\nclass ItemBean {\n final String title;\n final String subTitle;\n final String imgUrl;\n\n ItemBean(this.title, this.subTitle, this.imgUrl);\n}\n\nclass CustomRadioListTile extends StatefulWidget {\n @override\n _CustomRadioListTileState createState() => _CustomRadioListTileState();\n}\n\nclass _CustomRadioListTileState extends State {\n final Map languages = {\n ItemType.java:\n ItemBean(\"Java\", \"曾经世界上最流行的语言\", \"assets/images/java.jpeg\"),\n ItemType.kotlin:\n ItemBean(\"Kotlin\", \"未来世界上最流行的语言\", \"assets/images/kotlin.jpg\"),\n ItemType.dart:\n ItemBean(\"Dart\", \"世界上最优雅的语言\", \"assets/images/dart.jpg\"),\n };\n var _type = ItemType.java;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(11),\n child: Column(\n mainAxisSize: MainAxisSize.min,\n children: languages.keys\n .map((type) => RadioListTile(\n value: type,\n groupValue: _type,\n title: Text(languages[type].title),\n subtitle: Text(languages[type].subTitle),\n selected: _type == type,\n secondary: CircleAvatar(\n backgroundImage: AssetImage(languages[type].imgUrl),\n ),\n onChanged: (type) => setState(() => _type = type),\n ))\n .toList()),\n );\n }\n}\n"},{"id":null,"widgetId":19,"name":"RadioListTile选中色和密排","priority":2,"subtitle":"【activeColor】 : 选中时颜色 【Color】\n【dense】: 是否密排 【bool】","code":"import 'package:flutter/material.dart';\nclass ItemBean {\n final String title;\n final String subTitle;\n final String imgUrl;\n\n ItemBean(this.title, this.subTitle, this.imgUrl);\n}\n\nclass DenseRadioListTile extends StatefulWidget {\n @override\n _DenseRadioListTileState createState() => _DenseRadioListTileState();\n}\n\nclass _DenseRadioListTileState extends State {\n final Map languages = {\n ItemType.java:\n ItemBean(\"Java\", \"曾经世界上最流行的语言\", \"assets/images/java.jpeg\"),\n ItemType.kotlin:\n ItemBean(\"Kotlin\", \"未来世界上最流行的语言\", \"assets/images/kotlin.jpg\"),\n ItemType.dart:\n ItemBean(\"Dart\", \"世界上最优雅的语言\", \"assets/images/dart.jpg\"),\n };\n var _type = ItemType.java;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(11),\n child: Column(\n mainAxisSize: MainAxisSize.min,\n children: languages.keys\n .map((type) => RadioListTile(\n value: type,\n groupValue: _type,\n title: Text(languages[type].title),\n activeColor: Colors.orangeAccent,\n dense: true,\n subtitle: Text(languages[type].subTitle),\n selected: _type == type,\n secondary: CircleAvatar(\n backgroundImage: AssetImage(languages[type].imgUrl),\n ),\n onChanged: (type) => setState(() => _type = type),\n ))\n .toList()),\n );\n }\n}"},{"id":null,"widgetId":28,"name":"mini属性","priority":2,"subtitle":"【mini】: 是否是迷你 【bool】","code":"import 'package:flutter/material.dart';\nclass MiniFAB extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n Colors.red: Icons.add,\n Colors.blue: Icons.bluetooth,\n Colors.green: Icons.android,\n };\n return Wrap(\n spacing: 20,\n children: data.keys\n .map((e) => FloatingActionButton(\n heroTag: e.toString()+\"b\",\n onPressed: () {},\n backgroundColor: e,\n mini: true,\n foregroundColor: Colors.white,\n child: Icon(data[e]),\n tooltip: \"android\",\n elevation: 5, //z-阴影盖度\n ))\n .toList());\n }\n}"},{"id":null,"widgetId":28,"name":"FloatingActionButton点击事件","priority":1,"subtitle":"【child】: 子组件 【Widget】\n【tooltip】: 长按时提示文字 【String】\n【backgroundColor】: 背景色 【Color】\n【foregroundColor】: 前景色 【Color】\n【elevation】: 影深 【double】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomFAB extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n Colors.red: Icons.add,\n Colors.blue: Icons.bluetooth,\n Colors.green: Icons.android,\n };\n return Wrap(\n spacing: 20,\n children: data.keys\n .map((e) => FloatingActionButton(\n heroTag: e.toString()+\"a\",\n onPressed: () {},\n backgroundColor: e,\n foregroundColor: Colors.white,\n child: Icon(data[e]),\n tooltip: \"android\",\n elevation: 5, //z-阴影盖度\n ))\n .toList());\n }\n}"},{"id":null,"widgetId":28,"name":"shape属性","priority":3,"subtitle":"【shape】: 形状 【ShapeBorder】","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nimport '../../../../app/utils/pather.dart';\nclass ShapeFAB extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n Colors.red: Icons.add,\n Colors.blue: Icons.bluetooth,\n Colors.green: Icons.android,\n };\n return Wrap(\n spacing: 20,\n children: data.keys\n .map((e) => FloatingActionButton(\n heroTag: e.toString()+\"c\",\n onPressed: () {},\n backgroundColor: e,\n shape: StarBorder(),\n foregroundColor: Colors.white,\n child: Icon(data[e]),\n tooltip: \"android\",\n elevation: 5,\n ))\n .toList());\n }\n}\n\n/// 边线形状类\nclass StarBorder extends ShapeBorder {\n @override\n EdgeInsetsGeometry get dimensions => null;\n\n @override\n Path getInnerPath(Rect rect, {TextDirection textDirection}) {\n return null;\n }\n\n @override\n Path getOuterPath(Rect rect, {TextDirection textDirection}) {\n return Pather.create.nStarPath(20, 25, 25 * cos((360 / 9 / 2) * pi / 180),\n dx: rect.height / 2, dy: rect.width / 2);\n }\n\n @override\n void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {}\n\n @override\n ShapeBorder scale(double t) {\n return null;\n }\n}"},{"id":null,"widgetId":154,"name":"Drawer基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【elevation】 : 影深 【double】","code":"import 'package:flutter/material.dart';\nclass CustomDrawer extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 400,\n child: Scaffold(\n appBar: AppBar(\n title: Text('Flutter Unit'),\n ),\n drawer: Drawer(\n elevation: 3,\n child: _buildChild(),\n ),\n ),\n );\n }\n\n Widget _buildChild() => ListView(\n padding: EdgeInsets.zero,\n children: const [\n DrawerHeader(\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/caver.jpeg'),\n fit: BoxFit.cover),\n ),\n child: Text(\n '张风捷特烈',\n style: TextStyle(fontSize: 24, color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3)\n ]),\n ),\n ),\n ListTile(\n leading: Icon(\n Icons.star,\n color: Colors.blue,\n ),\n title: Text('我的收藏'),\n ),\n ListTile(\n leading: Icon(\n Icons.palette,\n color: Colors.orangeAccent,\n ),\n title: Text('我的绘画'),\n ),\n ListTile(\n leading: Icon(\n Icons.insert_drive_file,\n color: Colors.green,\n ),\n title: Text('我的文件'),\n ),\n ],\n );\n}\n"},{"id":null,"widgetId":134,"name":"DayPicker基本使用","priority":1,"subtitle":" \n【selectedDate】 : 选中日期 【DateTime】\n【currentDate】 : 当前日期 【DateTime】\n【firstDate】 : 最前日期限制 【DateTime】\n【lastDate】 : 最后日期限制 【DateTime】\n【displayedMonth】 : 当前展示的月份 【DateTime】\n【onChanged】 : 点击回调 【Function(DateTime)】","code":"import 'package:flutter/material.dart';\nclass CustomDayPicker extends StatefulWidget {\n @override\n _CustomDayPickerState createState() => _CustomDayPickerState();\n}\n\nclass _CustomDayPickerState extends State {\n\n DateTime _date = DateTime.now();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 350,\n child: DayPicker(\n selectedDate: _date,\n currentDate: DateTime.now(),\n onChanged: (date){\n setState(() => _date = date);\n },\n firstDate: DateTime(2018),\n lastDate: DateTime(2030),\n displayedMonth: DateTime.now()\n ),\n );\n }\n}\n"},{"id":null,"widgetId":27,"name":"OutlineButton点击事件","priority":1,"subtitle":"【textColor】: 子组件文字颜色 【Color】\n【splashColor】: 水波纹颜色 【Color】\n【highlightColor】: 长按高亮色 【Color】\n【highlightedBorderColor】: 高亮时框色 【Color】\n【child】: 子组件 【Widget】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【borderSide】: 边线 【BorderSide】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomOutlineButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return OutlineButton(//边线按钮\n onPressed: () {},\n child: Text(\"OutlineButton\"),\n padding: EdgeInsets.all(8),\n splashColor: Colors.green,\n highlightColor: Colors.orangeAccent,\n highlightedBorderColor: Colors.grey,\n textColor: Color(0xff000000),\n borderSide: BorderSide(color: Color(0xff0A66F8), width: 2),\n );\n }\n}\n"},{"id":null,"widgetId":147,"name":"Listener基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onPointerDown】 : 按下事件 【Function(PointerDownEvent)】\n【onPointerMove】 : 移动事件 【Function(PointerMoveEvent)】\n【onPointerMove】 : 抬起事件 【Function(PointerUpEvent)】\n【onPointerCancel】 : 取消事件 【Function(PointerUpEvent)】","code":"import 'package:flutter/material.dart';\nclass CustomListener extends StatefulWidget {\n @override\n _CustomListenerState createState() => _CustomListenerState();\n}\n\nclass _CustomListenerState extends State {\n var _info = '';\n\n @override\n Widget build(BuildContext context) {\n return Listener(\n onPointerDown: (detail) => setState(() => _info = detail.toString()),\n onPointerMove: (detail) => setState(() => _info = detail.toString()),\n onPointerUp: (detail) => setState(() => _info = detail.toString()),\n onPointerCancel: (detail) => setState(() => _info = detail.toString()),\n\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 300 * 0.618,\n color: Colors.grey.withAlpha(33),\n child: Text(\n _info,\n style: TextStyle(fontSize: 16, color: Colors.blue),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":159,"name":"PositionedDirectional基本使用","priority":1,"subtitle":" \n【child】 : 组件 【Widget】\n【top】 : 到父顶距离 【double】\n【end】 : 到父右距离 【double】\n【start】 : 到父左距离 【double】\n【bottom】 : 到父底距离 【double】","code":"import 'package:flutter/material.dart';\nclass CustomPositionedDirectional extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var yellowBox = Container(\n color: Colors.yellow,\n height: 100,\n width: 100,\n );\n\n var redBox = Container(\n color: Colors.red,\n height: 90,\n width: 90,\n );\n\n var greenBox = Container(\n color: Colors.green,\n height: 80,\n width: 80,\n );\n\n var cyanBox = Container(\n color: Colors.cyanAccent,\n height: 70,\n width: 70,\n );\n\n return Container(\n width: 200,\n height: 120,\n color: Colors.grey.withAlpha(33),\n child: Stack(\n children: [\n yellowBox,\n redBox,\n PositionedDirectional(top: 20, start: 20, child: greenBox),\n PositionedDirectional(\n child: cyanBox,\n bottom: 10,\n end: 10,\n )\n ],\n ));\n }\n}\n"},{"id":null,"widgetId":3,"name":"可以通过shape属性实现裁切效果","priority":2,"subtitle":"【shape】 : 形状 【ShapeBorder】\n【margin】: 外边距 【double】\n【color】: 颜色 【Color】\n【child】: 孩子 【Widget】","code":"import 'package:flutter/material.dart';\nimport '../../../../app/utils/pather.dart';\nclass ShapeCard extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Card(\n color: Color(0xffB3FE65),\n elevation: 6,\n shape: StarShapeBorder(),\n child: Container(\n alignment: Alignment.center,\n width: 100,\n height: 100,\n child: Text(\"Card\", style: TextStyle(fontSize: 20)),\n ),\n );\n }\n}\n\nclass StarShapeBorder extends ShapeBorder {\n @override\n EdgeInsetsGeometry get dimensions => null;\n\n @override\n Path getInnerPath(Rect rect, {TextDirection textDirection}) {\n return null;\n }\n\n @override\n Path getOuterPath(Rect rect, {TextDirection textDirection}) =>\n Pather.create.nStarPath(9, 50, 40, dx: 50, dy: 50);\n\n @override\n void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {\n }\n\n @override\n ShapeBorder scale(double t) {\n return null;\n }\n}"},{"id":null,"widgetId":3,"name":"Card可以让一个组件卡片化","priority":1,"subtitle":"【elevation】 : 影深 【double】\n【margin】: 外边距 【double】\n【color】: 颜色 【Color】\n【child】: 孩子 【Widget】","code":"import 'package:flutter/material.dart';\nclass CustomCard extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Card(\n color: Color(0xffB3FE65),\n elevation: 4,\n margin: EdgeInsets.all(10),\n child: Container(\n alignment: Alignment.topLeft,\n width: 200,\n height: 0.618*200,\n margin: EdgeInsets.all(10),\n child: Text(\"Card\", style: TextStyle(fontSize: 20)),\n ),\n );\n }\n}"},{"id":null,"widgetId":204,"name":"PreferredSize的转化使用","priority":2,"subtitle":"【PreferredSize将普通组件转化为PreferredSizeWidget","code":"import 'package:flutter/material.dart';\nclass AdapterPreferredSize extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scaffold(\n appBar: PreferredSize(\n preferredSize: Size.fromHeight(150),\n child: AppBar(\n title: Text('PreferredSize'),\n bottom: PreferredSize(\n preferredSize: Size.fromHeight(40),\n child: Container(\n height: 40,\n color: Colors.orange,\n ),\n ),\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":204,"name":"PreferredSize调整AppBar高度","priority":1,"subtitle":"【preferredSize】 : 尺寸 【Size】","code":"import 'package:flutter/material.dart';\nclass CustomPreferredSize extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scaffold(\n appBar: PreferredSize(\n preferredSize: Size.fromHeight(150),\n child: AppBar(\n title: Text('PreferredSize'),\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":29,"name":"ButtonBar边距和高","priority":2,"subtitle":"【buttonPadding】: 内边距 【EdgeInsetsGeometry】\n【buttonHeight】: 高 【double】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass PaddingButtonBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ButtonBar(\n alignment: MainAxisAlignment.center,\n buttonHeight: 40,\n buttonPadding: EdgeInsets.only(left: 15,right: 15),\n children: [\n RaisedButton(\n color: Colors.blue,\n child: Text(\"Raised\"),\n onPressed: () => DialogAbout.show(context)),\n OutlineButton(\n child: Text(\"Outline\"),\n onPressed: () => DialogAbout.show(context)),\n FlatButton(\n color: Colors.blue,\n onPressed: () => DialogAbout.show(context),\n child: Text(\"Flat\"),\n )\n ],\n );\n }\n}\n"},{"id":null,"widgetId":29,"name":"ButtonBar对齐方式","priority":1,"subtitle":"【alignment】: 对齐方式 【MainAxisAlignment】\n【children】: 子组件集 【List】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomButtonBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ButtonBar(\n alignment: MainAxisAlignment.center,\n children: [\n RaisedButton(\n color: Colors.blue,\n child: Text(\"Raised\"),\n onPressed: () => DialogAbout.show(context)),\n OutlineButton(\n child: Text(\"Outline\"),\n onPressed: () => DialogAbout.show(context)),\n FlatButton(\n color: Colors.blue,\n onPressed: () => DialogAbout.show(context),\n child: Text(\"Flat\"),\n )\n ],\n );\n }\n}\n\n"},{"id":null,"widgetId":146,"name":"GestureDetector基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onTap】 : 点击事件 【Function()】\n【onDoubleTap】 : 双击事件 【Function()】\n【onLongPress】 : 长按事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomGestureDetector extends StatefulWidget {\n @override\n _CustomGestureDetectorState createState() => _CustomGestureDetectorState();\n}\n\nclass _CustomGestureDetectorState extends State {\n var _info = '';\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () => setState(() => _info = 'onTap'),\n onDoubleTap: () => setState(() => _info = 'onDoubleTap'),\n onLongPress: () => setState(() => _info = 'onLongPress'),\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 300 * 0.4,\n color: Colors.grey.withAlpha(33),\n child: Text(\n _info,\n style: TextStyle(fontSize: 18, color: Colors.blue),\n ),\n ),\n );\n }\n}"},{"id":null,"widgetId":146,"name":"GestureDetector详情信息","priority":2,"subtitle":" \n【onTapDown】 : 按下回调 【Function(TapDownDetails)】\n【onTapUp】 : 子组件 【Function(TapUpDetails)】\n【onTapCancel】 : 点击取消 【Function()】","code":"import 'package:flutter/material.dart';\nclass TapGestureDetector extends StatefulWidget {\n @override\n _TapGestureDetectorState createState() => _TapGestureDetectorState();\n}\n\nclass _TapGestureDetectorState extends State {\n var _info = '';\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTapDown: (detail) => setState(() => _info =\n 'onTapDown:\\n相对落点:${detail.localPosition}\\n绝对落点:${detail.globalPosition}'),\n onTapUp: (detail) => setState(() => _info =\n 'onTapUp:\\n相对落点:${detail.localPosition}\\n绝对落点:${detail.globalPosition}'),\n onTapCancel: () => setState(() => _info = 'onTapCancel'),\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 300 * 0.618,\n color: Colors.grey.withAlpha(33),\n child: Text(\n _info,\n style: TextStyle(fontSize: 18, color: Colors.blue),\n ),\n ),\n );\n }\n}"},{"id":null,"widgetId":146,"name":"GestureDetector的Pan事件","priority":3,"subtitle":" \n【onPanDown】 : 按下回调 【Function(DragDownDetails)】\n【onPanEnd】 : 拖动结束 【Function(DragEndDetails)】\n【onPanStart】 : 开始拖动 【Function(DragStartDetails)】\n【onPanUpdate】 : 拖动更新 【Function(TapUpDetails)】\n【onPanCancel】 : 拖动取消 【Function()】","code":"import 'package:flutter/material.dart';\nclass PanGestureDetector extends StatefulWidget {\n @override\n _PanGestureDetectorState createState() => _PanGestureDetectorState();\n}\n\nclass _PanGestureDetectorState extends State {\n var _info = '';\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onPanDown: (detail) => setState(() => _info =\n 'onPanDown:\\n相对落点:${detail.localPosition}\\n绝对落点:${detail.globalPosition}'),\n onPanEnd: (detail) => setState(() => _info =\n 'onPanEnd:\\n初速度:${detail.primaryVelocity}\\n最终速度:${detail.velocity}'),\n onPanUpdate: (detail) => setState(() => _info =\n 'onPanUpdate:\\n相对落点:${detail.localPosition}\\n绝对落点:${detail.globalPosition}'),\n onPanStart: (detail) => setState(() => _info =\n 'onPanStart:\\n相对落点:${detail.localPosition}\\n绝对落点:${detail.globalPosition}'),\n onPanCancel: () => setState(() => _info = 'onTapCancel'),\n child: SingleChildScrollView(\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 300 * 0.618,\n color: Colors.grey.withAlpha(33),\n child: Text(\n _info,\n style: TextStyle(fontSize: 18, color: Colors.blue),\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":13,"name":"ActionChip的普通表现如下","priority":1,"subtitle":"【onPressed】: 点击事件 【Function】\n【pressElevation】: 按下时影深 【double】\n其他属性同Chip组件,无右侧组件。","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomActionChip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ActionChip(\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n label: Text(\"This is a ActionChip.\"),\n backgroundColor: Colors.grey.withAlpha(66),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n shadowColor: Colors.orangeAccent,\n elevation: 3,\n pressElevation: 5,\n onPressed: ()=> DialogAbout.show(context),\n );\n }\n}\n"},{"id":null,"widgetId":26,"name":"RaisedButton点击事件","priority":1,"subtitle":"【color】: 颜色 【Color】\n【splashColor】: 水波纹颜色 【Color】\n【elevation】: 影深 【double】\n【child】: 子组件 【Widget】\n【textColor】: 子组件文字颜色 【Color】\n【highlightColor】: 长按高亮色 【Color】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomRaisedButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return RaisedButton(\n color: Colors.blue,\n splashColor: Colors.green,\n onPressed: () {},\n child: Text(\"RaisedButton\"),\n textColor: Color(0xffFfffff),\n padding: EdgeInsets.all(8),\n elevation: 5,\n highlightColor: Color(0xffF88B0A),\n );\n }\n}\n"},{"id":null,"widgetId":211,"name":"MaterialBanner两行的使用","priority":2,"subtitle":"【contentTextStyle】: 中间位置样式 【TextStyle】\n【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】\n当尾部组件数量大于1,该组件结构为左中下。","code":"import 'package:flutter/material.dart';\nclass MaterialBannerDemoTwo extends StatelessWidget {\n final info =\n 'A banner displays an important, succinct message, and provides actions for users to address. '\n 'A user action is required for itto be dismissed.';\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [MaterialBanner(\n content: Text(\n info,\n style: TextStyle(color: Colors.white),\n ),\n backgroundColor: Colors.purple,\n leading: Icon(Icons.warning, color: Colors.yellow),\n padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2),\n leadingPadding:EdgeInsetsDirectional.only(end: 16.0) ,\n actions: [\n RaisedButton(\n color: Colors.white,\n onPressed: () {},\n child: Text(\n 'I KNOW',\n style: TextStyle(\n color: Colors.purple,\n fontWeight: FontWeight.bold,\n fontSize: 14),\n ),\n ),\n\n RaisedButton(\n color: Colors.white,\n onPressed: () {},\n child: Text(\n 'I IGNORE',\n style: TextStyle(\n color: Colors.purple,\n fontWeight: FontWeight.bold,\n fontSize: 14),\n ),\n ),\n ],\n )],\n );\n }\n\n}\n"},{"id":null,"widgetId":211,"name":"MaterialBanner一行的使用","priority":1,"subtitle":"【content】 : 中间组件 【Widget】\n【leading】: 左侧组件 【Widget】\n【actions】: 右侧组件列表 【List】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【forceActionsBelow】: 是否按钮在下方 【bool】\n【backgroundColor】: 背景色 【Color】","code":"import 'package:flutter/material.dart';\nclass MaterialBannerDemo extends StatelessWidget {\n final info =\n 'Welcome to Flutter Unit!';\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [MaterialBanner(\n content: Text(\n info,\n style: TextStyle(color: Colors.white),\n ),\n backgroundColor: Colors.purple,\n leading: Icon(Icons.info, color: Colors.lightBlueAccent),\n padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0),\n forceActionsBelow: false, // 默认false\n actions: [\n Text(\n 'I KNOW',\n style:TextStyle(\n color: Colors.orange,\n fontWeight: FontWeight.bold,\n fontSize: 14) ,\n )\n ],\n )],\n );\n }\n\n}\n"},{"id":null,"widgetId":164,"name":"SingleChildScrollView基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【padding】 : 点击事件 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomSingleChildScrollView extends StatelessWidget {\n final data = [\n Colors.blue[50],\n Colors.blue[100],\n Colors.blue[200],\n Colors.blue[300],\n Colors.blue[400],\n Colors.blue[500],\n Colors.blue[600],\n Colors.blue[700],\n Colors.blue[800],\n Colors.blue[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: SingleChildScrollView(\n padding: EdgeInsets.symmetric(horizontal: 10),\n child: Column(\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n\n ),\n );\n }\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":164,"name":"SingleChildScrollView滑动方向","priority":2,"subtitle":" \n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向 【Axis】","code":"import 'package:flutter/material.dart';\nclass DirectionSingleChildScrollView extends StatelessWidget {\n final data = [\n Colors.blue[50],\n Colors.blue[100],\n Colors.blue[200],\n Colors.blue[300],\n Colors.blue[400],\n Colors.blue[500],\n Colors.blue[600],\n Colors.blue[700],\n Colors.blue[800],\n Colors.blue[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: SingleChildScrollView(\n scrollDirection: Axis.horizontal,\n reverse: true,\n padding: EdgeInsets.symmetric(horizontal: 10),\n child: Row(\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 90,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n\n ),\n );\n }\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":33,"name":"ToggleButtons多选切换","priority":3,"subtitle":" 可以控制状态转化的逻辑来形成不同的效果。","code":"import 'package:flutter/material.dart';\nclass ProToggleButtons extends StatefulWidget {\n @override\n _ProToggleButtonsState createState() => _ProToggleButtonsState();\n}\n\nclass _ProToggleButtonsState extends State {\n var _isSelected = [false, false, false];\n @override\n Widget build(BuildContext context) {\n return ToggleButtons(\n children: [\n Icon(Icons.skip_previous),\n Icon(Icons.pause),\n Icon(Icons.skip_next),\n ],\n borderWidth: 1,\n borderColor: Colors.blue,\n selectedBorderColor: Colors.orangeAccent,\n splashColor: Colors.purple.withAlpha(66),\n borderRadius: BorderRadius.circular(10),\n selectedColor: Colors.red,\n fillColor: Colors.green.withAlpha(11),\n isSelected: _isSelected,\n onPressed: (value) => setState(() {\n _isSelected[value] = !_isSelected[value];\n }),\n );\n }\n}"},{"id":null,"widgetId":33,"name":"ToggleButtons单选切换","priority":1,"subtitle":"【children】: 子组件集 【List】\n【borderWidth】: 边线宽 【double】\n【borderRadius】: 圆角 【BorderRadius】\n【isSelected】: 是否选中集 【List】\n【onPressed】: 点击事件 【Function(int)】","code":"import 'package:flutter/material.dart';\nclass CustomToggleButtons extends StatefulWidget {\n @override\n _CustomToggleButtonsState createState() => _CustomToggleButtonsState();\n}\n\nclass _CustomToggleButtonsState extends State {\n var _isSelected = [true, false, false];\n\n @override\n Widget build(BuildContext context) {\n return ToggleButtons(\n children: [\n Icon(Icons.skip_previous),\n Icon(Icons.pause),\n Icon(Icons.skip_next),\n ],\n borderWidth: 1,\n borderRadius: BorderRadius.circular(10),\n isSelected: _isSelected,\n onPressed: (value) => setState(() {\n _isSelected = _isSelected.map((e) => false).toList();\n _isSelected[value] = true;\n }),\n );\n\n }\n}"},{"id":null,"widgetId":33,"name":"ToggleButtons颜色属性","priority":2,"subtitle":"【borderColor】: 边线色 【Color】\n【selectedBorderColor】: 选中边线色 【Color】\n【selectedColor】: 选中时组件色 【Color】\n【fillColor】: 选中时填充色 【Color】\n【splashColor】: 水波纹色 【Color】","code":"import 'package:flutter/material.dart';\nclass ColorToggleButtons extends StatefulWidget {\n @override\n _ColorToggleButtonsState createState() => _ColorToggleButtonsState();\n}\n\nclass _ColorToggleButtonsState extends State {\n var _isSelected = [true, false, false];\n @override\n Widget build(BuildContext context) {\n return ToggleButtons(\n children: [\n Icon(Icons.skip_previous),\n Icon(Icons.pause),\n Icon(Icons.skip_next),\n ],\n borderWidth: 1,\n borderColor: Colors.orangeAccent,\n selectedBorderColor: Colors.blue,\n splashColor: Colors.purple.withAlpha(66),\n borderRadius: BorderRadius.circular(10),\n selectedColor: Colors.red,\n fillColor: Colors.green.withAlpha(11),\n isSelected: _isSelected,\n onPressed: (value) => setState(() {\n _isSelected = _isSelected.map((e) => false).toList();\n _isSelected[value] = true;\n }),\n );\n }\n}\n"},{"id":null,"widgetId":10,"name":"replacement可在隐藏时进行占位","priority":2,"subtitle":"【replacement】 : 隐藏时的占位组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass ReplacementVisibility extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: [\n _buildVisibility(true),\n _buildVisibility(false),\n ],\n );\n }\n\n _buildVisibility(bool visible) {\n var box = Container(\n height: 30,\n width: 30,\n color: Colors.blue,\n );\n return Container(\n width: 150,\n height: 150 * 0.618,\n color: Colors.cyanAccent.withAlpha(33),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n box,\n Visibility(\n visible: visible,\n replacement: Container(\n alignment: Alignment.center,\n height: 80 * 0.618,\n width: 80,\n ),\n child: Container(\n alignment: Alignment.center,\n height: 80 * 0.618,\n width: 80,\n color: Colors.red,\n child: Text(\n \"visible\\ntrue\",\n style: TextStyle(fontSize: 20),\n ),\n )),\n box,\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":10,"name":"根据visible控制内部子组件的显隐情况","priority":1,"subtitle":"【visible】 : 是否显示 【bool】\n【child】: 孩子 【Widget】\n默认孩子隐藏时会失去原来所在区域。","code":"import 'package:flutter/material.dart';\nclass CustomVisibility extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: [\n _buildVisibility(true),\n _buildVisibility(false),\n ],\n );\n }\n\n _buildVisibility(bool visible) {\n var box = Container(\n height: 30,\n width: 30,\n color: Colors.blue,\n );\n return Container(\n width: 150,\n height: 150 * 0.618,\n color: Colors.cyanAccent.withAlpha(33),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n box,\n Visibility(\n visible: visible,\n child: Container(\n alignment: Alignment.center,\n height: 80 * 0.618,\n width: 80,\n color: Colors.red,\n child: Text(\n \"visible\\ntrue\",\n style: TextStyle(fontSize: 20),\n ),\n )),\n box,\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":208,"name":"Title基本使用","priority":1,"subtitle":"【title】 : 名称 【int】\n【color】: 颜色 【Color】\n【child】: 子组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass TitleDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Title(\n title: '张风捷特烈',\n color: Color(0xFF9C27B0),\n child: Center(child: Text('应用菜单栏中该页的名称为: 张风捷特烈'))),\n );\n }\n}\n"},{"id":null,"widgetId":163,"name":"GridView.extent构造","priority":3,"subtitle":" \n【maxCrossAxisExtent】 : box轴向长度 【double】\n【reverse】 : 是否反向滑动 【bool】\n【shrinkWrap】 : 无边界时是否包裹 【bool】","code":"import 'package:flutter/material.dart';\nclass ExtentGridView extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF00FFFF - 2*i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: GridView.extent(\n scrollDirection: Axis.horizontal,\n maxCrossAxisExtent: 80.0,\n mainAxisSpacing: 2,\n crossAxisSpacing: 2,\n childAspectRatio: 0.618,\n children: data\n .map((color) => _buildItem(color))\n .toList(),\n ),\n );\n }\n\n Container _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 30,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":163,"name":"GridView.count构造","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【crossAxisCount】 : 主轴一行box数量 【int】\n【mainAxisSpacing】 : 主轴每行间距 【double】\n【crossAxisSpacing】 : 交叉轴每行间距 【double】\n【childAspectRatio】 : box主长/交叉轴长 【double】\n【crossAxisCount】 : 主轴一行数量 【int】","code":"import 'package:flutter/material.dart';\nclass CustomGridView extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFFFF00FF - 2*i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: GridView.count(\n crossAxisCount: 4,\n mainAxisSpacing: 2,\n crossAxisSpacing: 2,\n childAspectRatio: 1/0.618,\n children: data\n .map((color) => _buildItem(color))\n .toList(),\n ),\n );\n }\n\n Container _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 30,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":163,"name":"GridView.builder构造","priority":4,"subtitle":" \n【itemCount】 : 条目数量 【int】\n【gridDelegate】 : 网格代理 【SliverGridDelegate】\n【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass BuilderGridView extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF33FFF - 2*i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: GridView.builder(\n itemCount: data.length,\n scrollDirection: Axis.vertical,\n gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(//网格代理:定交叉轴数目\n crossAxisCount: 4,//条目个数\n mainAxisSpacing: 5,//主轴间距\n crossAxisSpacing: 5,//交叉轴间距\n childAspectRatio:1/0.618),\n itemBuilder: (_, int position)=> _buildItem(data[position])\n ),\n );\n }\n\n Container _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 30,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":163,"name":"GridView滑动方向","priority":2,"subtitle":" \n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向滑动 【bool】\n【shrinkWrap】 : 无边界时是否包裹 【bool】","code":"import 'package:flutter/material.dart';\nclass HorizontalGridView extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF00FFFF - 2*i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: GridView.count(\n scrollDirection: Axis.horizontal,\n reverse: true,\n crossAxisCount: 4,\n mainAxisSpacing: 2,\n crossAxisSpacing: 2,\n childAspectRatio: 0.618,\n children: data\n .map((color) => _buildItem(color))\n .toList(),\n ),\n );\n }\n\n Container _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 30,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":140,"name":"SnackBar基本使用","priority":1,"subtitle":" \n【content】 : 中间内容组件 【Widget】\n【action】 : 右侧按钮 【SnackBarAction】\n【duration】 : 持续时长 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【elevation】 : 影深 【double】\n【shape】 : 形状 【ShapeBorder】\n【onVisible】 : 显示时回调 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomSnackBar extends StatefulWidget {\n @override\n _CustomSnackBarState createState() => _CustomSnackBarState();\n}\n\nclass _CustomSnackBarState extends State {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: FlatButton(\n color: Colors.blue,\n onPressed: () =>\n Scaffold.of(context).showSnackBar(_buildSnackBar()),\n child: Text(\n '点我弹出SnackBar',\n style: TextStyle(color: Colors.white),\n )));\n }\n\n Widget _buildSnackBar() {\n return SnackBar(\n elevation: 3,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(10), topRight: Radius.circular(10))),\n content: Text('Wellcome to for join Flutter Unit!'),\n duration: Duration(seconds: 3),\n //持续时间\n backgroundColor: Colors.red,\n onVisible: () => print('onVisible'),\n action: SnackBarAction(\n textColor: Colors.white, label: '确定', onPressed: () {}),\n );\n }\n}\n"},{"id":null,"widgetId":206,"name":"TabPageSelectorIndicator基本使用","priority":1,"subtitle":"【size】: 大小 【double】\n【backgroundColor】: 背景色 【Color】\n【borderColor】: 边线色 【Color】","code":"import 'package:flutter/material.dart';\nclass TabPageSelectorIndicatorDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n TabPageSelectorIndicator(\n backgroundColor: Colors.greenAccent,\n borderColor: Colors.deepPurpleAccent,\n size: 15,\n ),\n TabPageSelectorIndicator(\n backgroundColor: Colors.blue,\n borderColor: Colors.grey,\n size: 20,\n ),\n TabPageSelectorIndicator(\n backgroundColor: Colors.green,\n borderColor: Colors.red,\n size: 25,\n ),\n TabPageSelectorIndicator(\n backgroundColor: Colors.yellow,\n borderColor: Colors.brown,\n size: 30,\n ),\n TabPageSelectorIndicator(\n backgroundColor: Colors.amber,\n borderColor: Colors.purpleAccent,\n size: 35,\n ),\n ],\n ),\n );\n }\n\n}\n\n"},{"id":null,"widgetId":16,"name":"ListTile的密排属性","priority":3,"subtitle":"【dense】: 是否密排 【bool】","code":"import 'package:flutter/material.dart';\nclass DenseListTile extends StatefulWidget {\n @override\n _DenseListTileState createState() => _DenseListTileState();\n}\n\nclass _DenseListTileState extends State {\n bool _dense = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n selected: false,\n contentPadding: EdgeInsets.all(5),\n trailing: Icon(Icons.more_vert),\n dense: _dense,\n onTap: () => setState(() => _dense = !_dense),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":16,"name":"ListTile选中效果和长按事件","priority":2,"subtitle":"【selected】: 是否选中 【bool】\n【onTap】: 点击事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass SelectListTile extends StatefulWidget {\n @override\n _SelectListTileState createState() => _SelectListTileState();\n}\n\nclass _SelectListTileState extends State {\n bool _selected = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n selected: _selected,\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n contentPadding: EdgeInsets.all(5),\n trailing: Icon(Icons.more_vert),\n onTap: () => setState(() => _selected = !_selected),\n ),\n );\n }\n}"},{"id":null,"widgetId":16,"name":"ListTile的基本表现如下","priority":1,"subtitle":"【leading】: 左侧组件 【Widget】\n【title】: 中间上组件 【Widget】\n【subtitle】: 中间下组件 【Widget】\n【trailing】: 尾组件 【Widget】\n【contentPadding】: 内边距 【EdgeInsetsGeometry】\n【onLongPress】: 点击事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomListTile extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n contentPadding: EdgeInsets.all(5),\n trailing: Icon(Icons.more_vert),\n onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'),\n ),\n );\n }\n}"},{"id":null,"widgetId":20,"name":"GridTileBar的基本表现如下","priority":1,"subtitle":"【value】 : 条目对象 【T】\n【leading】: 左侧组件 【Widget】\n【trailing】: 尾组件 【Widget】\n【title】: 中间上组件 【Widget】\n【subtitle】: 中间下组件 【Widget】\n【backgroundColor】: 背景色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomGridTileBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return GridTileBar(\n backgroundColor: Colors.blue.withAlpha(120),\n trailing: Icon(\n Icons.star,\n color: Colors.red,\n ),\n leading: CircleAvatar(\n backgroundImage: AssetImage(\"assets/images/wy_200x300.jpg\"),\n ),\n title: Text(\"百里·巫缨\"),\n subtitle: Text(\"倾国必倾城\"),\n );\n }\n}\n"},{"id":null,"widgetId":21,"name":"GridTile的基本表现如下","priority":1,"subtitle":"【header】: 头组件 【Widget】\n【child】: 子组件 【Widget】\n【footer】: 脚组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass CustomGridTile extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 200, height: 200,\n child: GridTile(\n header: GridTileBar(\n backgroundColor: Colors.blue.withAlpha(120),\n trailing: Icon(\n Icons.star,\n color: Colors.red,\n ),\n leading: CircleAvatar(\n backgroundImage: AssetImage(\"assets/images/wy_200x300.jpg\"),\n ),\n title: Text(\"百里·巫缨\"),\n subtitle: Text(\"倾国必倾城\"),\n ),\n child: Opacity(\n opacity: 0.5,\n child: Image.asset(\n \"assets/images/sabar.jpg\",\n fit: BoxFit.cover,\n ),\n ),\n footer: Padding(\n padding: const EdgeInsets.all(8.0),\n child: Text(\n \"ID:z\\$ySX32&29\",\n style: TextStyle(shadows: [\n Shadow(\n color: Colors.blue,\n offset: Offset(.1, .1),\n blurRadius: 2),\n ]),\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":11,"name":"可以设置颜色和阴影","priority":2,"subtitle":"【backgroundColor】: 背景色 【Color】\n【shadowColor】: 阴影色 【Color】\n【elevation】: 影深 【double】","code":"import 'package:flutter/material.dart';\nclass ColorOfChip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n children: [\n Chip(\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n label: Text(\"张风捷特烈\"),\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(5),\n backgroundColor: Colors.grey.withAlpha(66),\n shadowColor: Colors.orangeAccent,\n elevation: 3,\n ),\n Chip(\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n label: Text(\"张风捷特烈\"),\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(5),\n backgroundColor: Colors.cyanAccent.withAlpha(11),\n shadowColor: Colors.blue.withAlpha(88),\n elevation: 4,\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":11,"name":"可以设置右侧点击按钮","priority":3,"subtitle":"【deleteIcon】: 右侧组件(通常为Icon) 【Widget】\n【deleteIconColor】: 右侧组件颜色 【Color】\n【onDeleted】: 右侧组件点击事件 【Function】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass DeleteOfChip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Chip(\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n label: Text(\"张风捷特烈\"),\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n backgroundColor: Colors.grey.withAlpha(66),\n shadowColor: Colors.orangeAccent,\n// deleteIcon: Icon(Icons.close,size: 18),\n deleteIconColor: Colors.red,\n onDeleted: () => DialogAbout.show(context),\n elevation: 3,\n );\n }\n}"},{"id":null,"widgetId":11,"name":"Chip的普通表现如下","priority":1,"subtitle":"【avatar】: 左侧组件 【Widget】\n【label】: 中间组件 【Widget】\n【padding】 : 内边距 【EdgeInsetsGeometry】\n【labelPadding】: label边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomChip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n children: [\n Chip(\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n label: Text(\"张风捷特烈\"),\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(5),\n ),\n Chip(\n avatar: CircleAvatar(\n backgroundImage:\n AssetImage(\"assets/images/wy_200x300.jpg\")),\n label: Text(\"百里巫缨\"),\n padding: EdgeInsets.all(8),\n labelPadding: EdgeInsets.all(6),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":214,"name":"NavigationToolbar基本使用","priority":1,"subtitle":"【leading】 : 左侧组件 【Widget】\n【middle】: 中间组件 【Widget】\n【trailing】: 右侧组件组件 【Widget】\n【centerMiddle】: 中间组件是否居中 【bool】\n【middleSpacing】: 中间组件距左距离 【double】","code":"import 'package:flutter/material.dart';\nclass NavigationToolbarDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n Container(\n height: 60,\n child: NavigationToolbar(\n leading: Icon(Icons.ac_unit),\n middle: Text('middleSpacing#true'),\n middleSpacing: 20,\n centerMiddle: true,\n trailing: Icon(Icons.more_vert),\n ),\n ),\n Container(\n height: 60,\n child: NavigationToolbar(\n leading: Icon(Icons.ac_unit),\n middle: Text('middleSpacing#false'),\n middleSpacing: 20,\n centerMiddle: false,\n trailing: Icon(Icons.more_vert),\n ),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":128,"name":"SimpleDialog基本使用","priority":1,"subtitle":" \n【title】 : 顶部组件 【Widget】\n【children】 : 子组件列表 【List】\n【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n【backgroundColor】 : 右下角组件列表 【背景色】\n【elevation】 : 右下角组件列表 【背景色】\n【shape】 : 影深 【double】","code":"import 'dart:math';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomSimpleDialog extends StatelessWidget {\n final info = [\n '性别: 男 未婚',\n '微信: zdl1994328',\n \"掘金: 张风捷特烈\",\n \"github: toly1994328\",\n \"邮箱: 1981462008@qq.com\",\n ];\n\n @override\n Widget build(BuildContext context) {\n return Stack(\n children: [\n _buildSimpleDialog(context),\n Positioned(\n top: 70,\n right: 30,\n child: _buildRaisedButton(context)),\n\n ],\n );\n }\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () {\n showDialog(context: context, builder: (ctx) => _buildSimpleDialog(ctx));\n },\n child: Text(\n 'Just Show It',\n style: TextStyle(color: Colors.white),\n ),\n );\n\n SimpleDialog _buildSimpleDialog(BuildContext context) {\n return SimpleDialog(\n title: _buildTitle(),\n titlePadding: EdgeInsets.only(\n top: 5,\n left: 20,\n ),\n contentPadding: EdgeInsets.symmetric(horizontal: 5),\n children: _buildChild(context),\n backgroundColor: Colors.white,\n elevation: 4,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n );\n }\n\n List _buildChild(BuildContext context) {\n return info\n .map((str) => Column(\n crossAxisAlignment: CrossAxisAlignment.start,\n children: [\n SimpleDialogOption(\n onPressed: () => print(str),\n child: Container(\n width: double.infinity,\n child: Text(\n str,\n style: TextStyle(color: Color(0xff999999), fontSize: 16),\n ),\n ),\n ),\n Divider(\n indent: 20,\n height: 12,\n color: info.indexOf(str) == info.length - 1\n ? Colors.transparent\n : Theme.of(context).dividerColor,\n )\n ],\n ))\n .toList();\n }\n\n Widget _buildTitle() {\n return Row(\n //标题\n children: [\n Image.asset(\n \"assets/images/icon_head.png\",\n width: 30,\n height: 30,\n ),\n SizedBox(\n width: 10,\n ),\n Expanded(\n child: Text(\n \"张风捷特烈\",\n style: TextStyle(fontSize: 18),\n )),\n CloseButton()\n ],\n );\n }\n}\n"},{"id":null,"widgetId":23,"name":"MaterialButton长按事件","priority":2,"subtitle":"【highlightColor】: 长按高亮色 【Color】\n【onLongPress】: 长按事件 【Function】","code":"import 'package:flutter/material.dart';\nclass LongPressMaterialButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialButton(\n height: 40,\n elevation: 5,\n color: Colors.blue,\n highlightColor: Colors.green,\n textColor: Colors.white,\n padding: EdgeInsets.all(8),\n child: Text(\"MaterialButton\"),\n onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'));\n }\n}"},{"id":null,"widgetId":23,"name":"MaterialButton点击事件","priority":1,"subtitle":"【color】: 颜色 【Color】\n【splashColor】: 水波纹颜色 【Color】\n【height】: 高 【double】\n【elevation】: 影深 【double】\n【child】: 子组件 【Widget】\n【textColor】: 子组件文字颜色 【Color】\n【highlightColor】: 长按高亮色 【Color】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomMaterialButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialButton(\n height: 40,\n elevation: 5,\n color: Colors.orangeAccent,\n textColor: Colors.white,\n splashColor: Colors.blue,\n padding: EdgeInsets.all(8),\n child: Text(\"MaterialButton\"),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'));\n }\n}"},{"id":null,"widgetId":23,"name":"MaterialButton的自定义形状","priority":3,"subtitle":"【shape】: 形状 【ShapeBorder】","code":"import 'package:flutter/material.dart';\nclass ShapeMaterialButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n children: [\n Container(\n width: 40,\n height: 40,\n child: MaterialButton(\n padding: EdgeInsets.all(0),\n textColor: Color(0xffFfffff),\n elevation: 3,\n color: Colors.blue,\n highlightColor: Color(0xffF88B0A),\n splashColor: Colors.red,\n child: Icon(\n Icons.add,\n color: Colors.white,\n ),\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage')),\n ),\n Container(\n width: 100,\n height: 40,\n child: MaterialButton(\n padding: EdgeInsets.all(0),\n textColor: Color(0xffFfffff),\n elevation: 3,\n color: Colors.blue,\n highlightColor: Color(0xffF88B0A),\n splashColor: Colors.red,\n child: Icon(\n Icons.remove,\n color: Colors.white,\n ),\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(15))),\n onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage')),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":32,"name":"CloseButton点击事件","priority":1,"subtitle":" 点击时会退出当前栈","code":"import 'package:flutter/material.dart';\nclass CustomCloseButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return CloseButton();\n }\n}\n"},{"id":null,"widgetId":58,"name":"TabBar基本使用","priority":1,"subtitle":" \n【controller】 : 控制器 【TabController】\n【indicatorColor】 : 指示器颜色 【指示器颜色】\n【indicatorWeight】 : 指示器高 【double】\n【indicatorPadding】 : 指示器边距 【EdgeInsetsGeometry】\n【labelStyle】 : 页签文字样式 【TextStyle】\n【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n【isScrollable】 : 是否可滑动 【bool】\n【onTap】 : 页签点击回调 【Function(int)】\n【tabs】 : 标签组件 【List】","code":"import 'package:flutter/material.dart';\nclass CustomTabBar extends StatefulWidget {\n @override\n _CustomTabBarState createState() => _CustomTabBarState();\n}\n\nclass _CustomTabBarState extends State\n with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return TabBar(\n onTap: (tab) {\n print(tab);\n },\n labelStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n unselectedLabelStyle: TextStyle(fontSize: 16),\n isScrollable: true,\n controller: _tabController,\n labelColor: Colors.blue,\n indicatorWeight: 3,\n indicatorPadding: EdgeInsets.symmetric(horizontal: 10),\n unselectedLabelColor: Colors.grey,\n indicatorColor: Colors.orangeAccent,\n tabs: tabs.map((e) => Tab(text: e)).toList(),\n );\n }\n}"},{"id":null,"widgetId":58,"name":"通过修改源码可实现无水波纹","priority":1,"subtitle":" \n详见:components/flutter/no_shadow_tab_bar.dart","code":"import 'package:flutter/material.dart';\nimport 'no_shadow_tab_bar.dart';\nclass NoShadowTabBarDemo extends StatefulWidget {\n @override\n _NSTabBarState createState() => _NSTabBarState();\n}\n\nclass _NSTabBarState extends State\n with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return NoShadowTabBar(\n onTap: (tab) {\n print(tab);\n },\n labelStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n unselectedLabelStyle: TextStyle(fontSize: 16),\n isScrollable: true,\n controller: _tabController,\n labelColor: Colors.blue,\n indicatorWeight: 3,\n indicatorPadding: EdgeInsets.symmetric(horizontal: 10),\n unselectedLabelColor: Colors.grey,\n indicatorColor: Colors.orangeAccent,\n tabs: tabs.map((e) => Tab(text: e)).toList(),\n );\n }\n}"},{"id":null,"widgetId":37,"name":"GridPage基础属性","priority":1,"subtitle":"【child】: 子组件 【Widget】\n【color】: 颜色 【Color】\n【interval】: 小块边长 【double】","code":"import 'package:flutter/material.dart';\nclass CustomGridPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 200,\n height: 100,\n child: GridPaper(\n color: Colors.red,\n interval: 50,\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n fit: BoxFit.cover,\n )));\n }\n}"},{"id":null,"widgetId":37,"name":"GridPage再分割","priority":2,"subtitle":"【child】: 子组件 【Widget】\n【color】: 颜色 【Color】\n【subdivisions】: 小块中子块个数 【int】\n【divisions】: 小块中子块的分割数 【int】","code":"import 'package:flutter/material.dart';\nclass DivisionsGridPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 200,\n height: 100,\n child: GridPaper(\n color: Colors.red,\n interval: 50,\n divisions: 4,\n subdivisions: 4,\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n fit: BoxFit.cover,\n )));\n }\n}\n"},{"id":null,"widgetId":129,"name":"CupertinoAlertDialog基本使用","priority":1,"subtitle":" \n【title】 : 顶部组件 【Widget】\n【content】 : 内容组件 【Widget】\n【actions】 : 顶部文字样式 【List】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoAlertDialog extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildRaisedButton(context),\n _buildCupertinoAlertDialog(context),\n ],\n );\n }\n\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () {\n showDialog(\n context: context,\n builder: (ctx) => _buildCupertinoAlertDialog(context));\n },\n child: Text(\n 'Just Show It !',\n style: TextStyle(color: Colors.white),\n ),\n );\n\n Widget _buildCupertinoAlertDialog(BuildContext context) {\n return Material(\n color: Colors.transparent,\n child: CupertinoAlertDialog(\n title: _buildTitle(context),\n content: _buildContent(),\n actions: [\n CupertinoButton(\n child: Text(\"Yes, Delete\"),\n onPressed: () => Navigator.pop(context),\n ),\n CupertinoButton(\n child: Text(\"Cancle\"),\n onPressed: () => Navigator.pop(context),\n ),\n ]),\n );\n }\n\n Widget _buildTitle(context) {\n return Row(\n //标题\n children: [\n Icon(\n CupertinoIcons.delete_solid,\n color: Colors.red,\n ),\n Expanded(\n child: Text(\n 'Delete File',\n style: TextStyle(color: Colors.red, fontSize: 20),\n )),\n InkWell(\n child: Icon(CupertinoIcons.clear_thick),\n onTap: () => Navigator.pop(context),\n )\n ]);\n }\n\n Widget _buildContent() {\n return Padding(\n padding: const EdgeInsets.only(top: 18.0),\n child: Column(\n children: [\n Text(\n ' Hi toly! If you push the conform buttom ,'\n ' You will lose this file. Are you sure wand to do that?',\n style: TextStyle(color: Color(0xff999999), fontSize: 16),\n textAlign: TextAlign.justify,\n ),\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":218,"name":"返回按钮基本使用","priority":1,"subtitle":"【onPressed】 : 点击事件 【VoidCallback】\n【color】: 颜色 【Color】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CupertinoNavigationBarBackButtonDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: CupertinoNavigationBarBackButton(\n color: Colors.deepPurpleAccent,\n onPressed: ()=>Navigator.of(context).pop(),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":107,"name":"Spacer基本使用","priority":1,"subtitle":" \n一个Spacer会占据可延伸区域","code":"import 'package:flutter/material.dart';\nclass OneSpacer extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return\n Container(\n color: Colors.grey.withAlpha(33),\n child: Row(children: [\n Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: Colors.red,\n ),\n Spacer(),\n Container(\n alignment: Alignment.center,\n width: 60,\n height: 50,\n color: Colors.blue,\n ),\n ],),\n );\n }\n}"},{"id":null,"widgetId":148,"name":"Tab基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【text】 : 文字 【String】\n【icon】 : 下方组件 【Widgit】\n text和child不能同时存在","code":"import 'package:flutter/material.dart';\nclass CustomTab extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Tab(\n icon:Icon( Icons.add,color: Colors.blue,),\n child: Text('添加'),\n ),\n Tab(\n icon:Icon( Icons.close,color: Colors.red,),\n text: '删除',\n ),\n Tab(\n icon:Icon( Icons.refresh,color: Colors.green),\n text: '更新',\n ),\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":107,"name":"多个Spacer空间分配","priority":2,"subtitle":" \n【flex】 : 剩余空间分配占比 【int】","code":"import 'package:flutter/material.dart';\nclass ManySpacer extends StatefulWidget {\n @override\n _ManySpacerState createState() => _ManySpacerState();\n}\n\nclass _ManySpacerState extends State {\n int _flexA=1;\n int _flexB=1;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSliders(),\n Container(\n color: Colors.grey.withAlpha(33),\n child: Row(children: [\n Spacer(flex: _flexA),\n Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: Colors.red,\n ),\n Spacer(flex: _flexB),\n Container(\n alignment: Alignment.center,\n width: 60,\n height: 50,\n color: Colors.blue,\n ),\n ],),\n )\n ],\n );\n }\n\n Widget _buildSliders() {\n return Column(\n children: [\n Slider(\n divisions: 20,\n min: 1,\n max: 10,\n label: \"左边flex: $_flexA\",\n value: _flexA.toDouble(),\n onChanged: (v) => setState(() => _flexA = v.round())\n ),\n Slider(\n divisions: 20,\n label: \"右边flex: $_flexB\",\n min: 1,\n max: 10,\n value: _flexB.toDouble(),\n onChanged: (v) => setState(() => _flexB = v.round())\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":35,"name":"VerticalDivider颜色和粗细","priority":1,"subtitle":"【color】: 颜色 【Color】\n【thickness】: 线粗细 【double】","code":"import 'package:flutter/material.dart';\nclass CustomVerticalDivider extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var dataColor = [\n Colors.red, Colors.yellow,\n Colors.blue, Colors.green];\n var dataThickness = [1.0, 2.0, 4.0, 6.0];\n var data = Map.fromIterables(dataColor, dataThickness);\n return Container(\n height: 150,\n child: Row(\n mainAxisSize: MainAxisSize.min,\n children: dataColor\n .map((e) => VerticalDivider(\n color: e,\n thickness: data[e],\n ))\n .toList(),\n ),\n );\n }\n}"},{"id":null,"widgetId":35,"name":"VerticalDivider宽度和空缺","priority":2,"subtitle":"【indent】: 前面空缺长度 【double】\n【endIndent】: 后面空缺长度 【double】\n【height】: 占位高 【double】","code":"import 'package:flutter/material.dart';\nclass HeightVerticalDivider extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var dataColor = [\n Colors.red, Colors.yellow,\n Colors.blue, Colors.green];\n var dataThickness = [10.0, 20.0, 30.0, 40.0];\n var data = Map.fromIterables(dataColor, dataThickness);\n return Container(\n height: 150,\n child: Row(\n mainAxisSize: MainAxisSize.min,\n children: dataColor\n .map((e) => VerticalDivider(\n color: e,\n indent:data[e],\n endIndent: data[e]*2,\n width: data[e],\n thickness: data[e]/10,\n ))\n .toList(),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":7,"name":"用于显示一个纯色图片","priority":1,"subtitle":"【入参】 : 图片资源 【ImageProvider】\n【size】 : 大小 【double】\n【color】: 角标颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomImageIcon extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n Colors.blue: 50.0,\n Colors.red: 60.0,\n Colors.green: 70.0,\n Colors.yellow: 80.0,\n };\n return Wrap(\n spacing: 10,\n children: data.keys\n .map((e) => ImageIcon(\n AssetImage(\"assets/images/leaf.png\"),\n color: e,\n size: data[e],\n ))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":22,"name":"右上角和底部","priority":2,"subtitle":"【otherAccountsPictures】: 右上组件 【List】\n【onDetailsPressed】: 右下角点击事件 【Function()】\n【arrowColor】: 右下角按钮颜色 【Color】\n【margin】: 外边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass ProUAGHP extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width / 3 * 2,\n child: UserAccountsDrawerHeader(\n margin: EdgeInsets.all(10),\n accountName: Container(\n padding: const EdgeInsets.all(8.0),\n child: Text(\n \"张风捷特烈\",\n style:\n TextStyle(color: Colors.orangeAccent, fontSize: 22,\n shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2),\n ]),\n ),\n ),\n accountEmail: Padding(\n padding: const EdgeInsets.all(8.0),\n child: Text(\"1981462002@qq.com\",\n style: TextStyle(\n color: Colors.white, fontSize: 14,\n shadows: [\n Shadow(\n color: Colors.orangeAccent,\n offset: Offset(.5, .5),\n blurRadius: 2),\n ])),\n ),\n currentAccountPicture: Container(\n padding: const EdgeInsets.all(15.0),\n child: CircleAvatar(\n backgroundImage: AssetImage(\"assets/images/icon_head.png\"),\n ),\n ),\n otherAccountsPictures: [\n FlutterLogo(colors: Colors.green),\n ],\n onDetailsPressed: () {\n\n },\n arrowColor: Colors.white,\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage(\"assets/images/caver.jpeg\")),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":22,"name":"该组件的基本表现如下","priority":1,"subtitle":"【currentAccountPicture】: 上组件 【Widget】\n【accountName】: 中组件 【Widget】\n【accountEmail】: 下组件 【Widget】\n【decoration】: 装饰 【Decoration】","code":"import 'package:flutter/material.dart';\nclass CustomUAGHP extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width / 3 * 2,\n child: UserAccountsDrawerHeader(\n accountName: Container(\n padding: const EdgeInsets.all(8.0),\n child: Text(\n \"张风捷特烈\",\n style:\n TextStyle(color: Colors.orangeAccent, fontSize: 22, shadows: [\n Shadow(\n color: Colors.black, offset: Offset(.5, .5), blurRadius: 2),\n ]),\n ),\n ),\n accountEmail: Padding(\n padding: const EdgeInsets.all(8.0),\n child: Text(\"1981462002@qq.com\",\n style: TextStyle(color: Colors.white, fontSize: 14, shadows: [\n Shadow(\n color: Colors.orangeAccent,\n offset: Offset(.5, .5),\n blurRadius: 2),\n ])),\n ),\n currentAccountPicture: Container(\n padding: const EdgeInsets.all(15.0),\n child: CircleAvatar(\n backgroundImage: AssetImage(\"assets/images/icon_head.png\"),\n ),\n ),\n decoration: BoxDecoration(\n image: DecorationImage(image: AssetImage(\"assets/images/caver.jpeg\")),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":126,"name":"Dialog基本使用","priority":1,"subtitle":" \n【child】 : 动画图标数据 【Widget】\n【elevation】 : 影深 【double】\n【backgroundColor】 : 背景色 【Color】\n【shape】 : 形状 【ShapeBorder】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomDialog extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildRaisedButton(context),\n _buildDialog(),\n ],\n );\n }\n\n Widget _buildDialog() => Dialog(\n backgroundColor: Colors.white,\n elevation: 5,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n child: Container(\n width: 50,\n child: DeleteDialog(),\n ),\n );\n\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () {\n showDialog(context: context, builder: (ctx) => _buildDialog());\n },\n child: Text(\n 'Just Show It !',\n style: TextStyle(color: Colors.white),\n ),\n\n );\n}\n\nclass DeleteDialog extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n\n child: Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n _buildBar(context),\n _buildTitle(),\n _buildContent(),\n _buildFooter(context),\n ],\n ),\n );\n }\n\n Widget _buildTitle() {\n return Text(\n 'Delete Doucument',\n style: TextStyle(color: Color(0xff5CC5E9), fontSize: 24),\n );\n }\n\n Widget _buildContent() {\n return Padding(\n padding: const EdgeInsets.all(15.0),\n child: Text(\n ' Hi toly! If you push the conform buttom ,'\n ' You will lose this file. Are you sure wand to do that?',\n style: TextStyle(color: Color(0xffCFCFCF), fontSize: 16),\n textAlign: TextAlign.justify,\n ),\n );\n }\n\n Widget _buildFooter(context) {\n return Padding(\n padding: const EdgeInsets.only(bottom: 15.0, top: 10,left: 10,right: 10),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Container(\n alignment: Alignment.center,\n height: 40,\n width: 100,\n decoration: BoxDecoration(\n borderRadius: BorderRadius.all(Radius.circular(30)),\n color: Color(0xff73D1EE)),\n child: Text('Yes',\n style: TextStyle(color: Colors.white, fontSize: 16)),\n ),\n InkWell(\n onTap: ()=>Navigator.of(context).pop(),\n child: Container(\n alignment: Alignment.center,\n height: 40,\n width: 100,\n decoration: BoxDecoration(\n borderRadius: BorderRadius.all(Radius.circular(30)),\n color: Colors.orangeAccent),\n child: Text('Cancle',\n style: TextStyle(color: Colors.white, fontSize: 16)),\n ),\n )\n ],\n ),\n );\n }\n\n _buildBar(context) => Container(\n height: 30,\n alignment: Alignment.centerRight,\n margin: EdgeInsets.only(right: 10, top: 5),\n child: InkWell(\n onTap: ()=>Navigator.of(context).pop(),\n child: Icon(\n Icons.close,\n color: Color(0xff82CAE3),\n ),\n ),\n );\n}\n"},{"id":null,"widgetId":131,"name":"CupertinoActionSheet基本使用","priority":1,"subtitle":" \n【title】 : 第一行组件 【Widget】\n【message】 : 第二行组件 【Widget】\n【cancelButton】 : 取消按钮处组件 【Widget】\n【actions】 : 中间组件列表 【List】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoActionSheet extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n _buildRaisedButton(context),\n _buildCupertinoActionSheet(context),\n ],\n );\n }\n\n Widget _buildCupertinoActionSheet(BuildContext context) =>\n Container(\n alignment: Alignment.bottomCenter,\n child: CupertinoActionSheet(\n title: Text(\"Please chose a language\"),\n message: Text('the language you use in this application.'),\n cancelButton: CupertinoActionSheetAction(\n onPressed: () => Navigator.pop(context), child: Text(\"Cancel\")),\n actions: [\n CupertinoActionSheetAction(\n onPressed: () => Navigator.pop(context), child: Text('Dart')),\n CupertinoActionSheetAction(\n onPressed: () => Navigator.pop(context), child: Text('Java')),\n CupertinoActionSheetAction(\n onPressed: () => Navigator.pop(context), child: Text('Kotlin')),\n ],\n ),\n );\n\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () => showDialog(\n context: context,\n builder: (ctx) => _buildCupertinoActionSheet(context)),\n child: Text(\n 'Just Show It !',\n style: TextStyle(color: Colors.white),\n ),\n );\n}\n"},{"id":null,"widgetId":155,"name":"DrawerHeader基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【decoration】 : 装饰 【Decoration】\n【margin】 : 外边距 【EdgeInsetsGeometry】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomDrawerHeader extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 400,\n child: Scaffold(\n appBar: AppBar(\n title: Text('Flutter Unit'),\n ),\n drawer: Drawer(\n elevation: 3,\n child: _buildChild(),\n ),\n ),\n );\n }\n\n Widget _buildChild() => ListView(\n padding: EdgeInsets.zero,\n children: [\n _buildHeader(),\n ListTile(\n leading: Icon(\n Icons.star,\n color: Colors.blue,\n ),\n title: Text('我的收藏'),\n ),\n ListTile(\n leading: Icon(\n Icons.palette,\n color: Colors.orangeAccent,\n ),\n title: Text('我的绘画'),\n ),\n ListTile(\n leading: Icon(\n Icons.insert_drive_file,\n color: Colors.green,\n ),\n title: Text('我的文件'),\n ),\n ],\n );\n\n Widget _buildHeader() {\n return DrawerHeader(\n margin: EdgeInsets.all(10),\n padding: EdgeInsets.only(left: 20,top: 15),\n decoration: BoxDecoration(\n borderRadius: BorderRadius.only(\n topLeft:Radius.circular(40),\n topRight:Radius.circular(40)\n ),\n image: DecorationImage(\n image: AssetImage('assets/images/caver.jpeg'),\n fit: BoxFit.cover),\n ),\n child: Text(\n '张风捷特烈',\n style: TextStyle(fontSize: 24, color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(1, 1), blurRadius: 3)\n ]),\n ),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"Container还具有变换性","priority":5,"subtitle":"【transform】 : 变换矩阵 【Matrix4】\n基于Matrix4的矩阵变换,变换详情见线性代数","code":"import 'package:flutter/material.dart';\nimport 'dart:math';\nclass ContainerTransform extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n //容器\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 150,\n height: 150 * 0.618,\n transform: Matrix4.skew(-pi / 10, 0),\n child: Text(\n \"Container\",\n style: TextStyle(fontSize: 20),\n ),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"Container的约束性","priority":6,"subtitle":" \n【constraints】 : 约束 【BoxConstraints】\n会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。","code":"import 'package:flutter/material.dart';\nclass ContainerConstraints extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n //容器\n color: Colors.blue,\n width: 200,\n height: 200 * 0.618,\n constraints: BoxConstraints(\n minWidth: 100, maxWidth: 150,\n minHeight: 20, maxHeight: 100),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"可对子组件进行对齐定位","priority":3,"subtitle":"【alignment】 : 对齐定位 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass ContainerAlignment extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n alignment: Alignment.bottomRight,\n width: 200,\n height: 200 * 0.618,\n color: Colors.grey.withAlpha(88),\n child: Icon(\n Icons.android,\n color: Colors.green,\n ),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"可用于显示一个指定宽高的区域","priority":1,"subtitle":"【width】 : 宽 【int】\n【高】: 外边距 【int】\n【color】: 子组件 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomContainer extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n alignment: Alignment.topLeft,\n width: 200,\n height: 200 * 0.618,\n color: Colors.red.withAlpha(88),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"可以在区域中放入一个子组件","priority":2,"subtitle":"【padding】 : 内边距 【EdgeInsetsGeometry】\n【margin】: 外边距 【EdgeInsetsGeometry】\n【child】: 子组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass ContainerWithChild extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n alignment: Alignment.topLeft,\n padding: EdgeInsets.all(20),\n margin: EdgeInsets.all(10),\n width: 200,\n height: 200 * 0.618,\n color: Colors.grey.withAlpha(88),\n child: Icon(Icons.android),\n );\n }\n}"},{"id":null,"widgetId":1,"name":"可对子组件进行装饰","priority":4,"subtitle":" \n【decoration】 : 装饰 【Decoration】\n可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容","code":"import 'package:flutter/material.dart';\nclass ContainerDecoration extends StatelessWidget {\n\n static const rainbow = [\n 0xffff0000,\n 0xffFF7F00,\n 0xffFFFF00,\n 0xff00FF00,\n 0xff00FFFF,\n 0xff0000FF,\n 0xff8B00FF\n ];\n\n @override\n Widget build(BuildContext context) {\n var stops = [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0];\n return Container(//容器\n alignment: Alignment.center,\n width: 200,\n height: 200 * 0.618,\n margin: EdgeInsets.all(20),\n padding: EdgeInsets.all(20),\n decoration: BoxDecoration(//添加渐变色\n gradient: LinearGradient(\n stops: stops,\n colors: rainbow.map((e) => Color(e)).toList()),\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(50),\n bottomRight: Radius.circular(50)),\n boxShadow: [\n BoxShadow(\n color: Colors.grey,\n offset: Offset(1, 1),\n blurRadius: 10,\n spreadRadius: 1),\n ]),\n child: Text(\n \"Container\",\n style: TextStyle(fontSize: 20),\n ),\n );\n }\n}"},{"id":null,"widgetId":162,"name":"ListView.separated构造","priority":3,"subtitle":" \n【separatorBuilder】 : 条目构造器 【IndexedWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass SeparatedListView extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView.separated(\n separatorBuilder: (context, index) => Divider(\n thickness: 1,\n height: 1,\n color: Colors.orange,\n ),\n itemCount: data.length,\n itemBuilder: (context, index) => _buildItem(data[index]),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n\n Widget _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n );\n}\n"},{"id":null,"widgetId":162,"name":"ListView基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【padding】 : 点击事件 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomListView extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":162,"name":"ListView.builder构造","priority":3,"subtitle":" \n【itemCount】 : 条目个数 【int】\n【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass BuilderListView extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView.builder(\n itemCount: data.length,\n itemBuilder: (context, index) => _buildItem(data[index]),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n\n Widget _buildItem(Color color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n );\n}"},{"id":null,"widgetId":162,"name":"ListView横向滑动","priority":2,"subtitle":" \n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向滑动 【bool】\n【shrinkWrap】 : 无边界时是否包裹 【bool】","code":"import 'package:flutter/material.dart';\nclass HorizontalListView extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView(\n reverse: true,\n shrinkWrap: true,\n scrollDirection: Axis.horizontal,\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":12,"name":"ChoiceChip的普通表现如下","priority":1,"subtitle":"【selectedColor】: 选中时颜色 【Color】\n【selectedShadowColor】: 选中时阴影颜色 【Color】\n【onSelected】: 选中事件 【Fuction(bool)】\n 其他属性同Chip组件,无右侧组件。","code":"import 'package:flutter/material.dart';\nclass CustomChoiceChip extends StatefulWidget {\n @override\n _CustomChoiceChipState createState() => _CustomChoiceChipState();\n}\n\nclass _CustomChoiceChipState extends State {\n bool _select = false;\n\n @override\n Widget build(BuildContext context) {\n return ChoiceChip(\n selected: _select,\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(5),\n label: Text(\n _select ?\n \"You are selected it.\" :\n \"This is a ChoiceChip.\",\n style: TextStyle(fontSize: 16),\n ),\n backgroundColor: Colors.grey.withAlpha(66),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n selectedColor: Colors.orangeAccent.withAlpha(44),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n elevation: 3,\n onSelected: (value) => setState(() => _select = value),\n );\n }\n}"},{"id":null,"widgetId":141,"name":"SnackBarAction基本使用","priority":1,"subtitle":" \n【label】 : 标签 【String】\n【textColor】 : 文字颜色 【Color】\n【disabledTextColor】 : 文字失效色 【Color】\n【onPressed】 : 点击回调 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomSnackBarAction extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: SnackBarAction(\n disabledTextColor: Colors.red,\n textColor: Colors.blue,\n label: '确定',\n onPressed: () => print('onPressed')));\n }\n}\n"},{"id":null,"widgetId":168,"name":"文字样式-ThemeData#TextTheme","priority":1,"subtitle":" \n子组件可以通过ThemeData.of获取主题的数据进行使用。","code":"import 'package:flutter/material.dart';\nclass TextThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var queryData = Theme.of(context).textTheme;\n var styles = {\n \"headline: \": queryData.headline,\n \"title: \": queryData.title,\n \"subhead: \": queryData.subhead,\n \"subtitle: \": queryData.body1,\n \"body2: \": queryData.body2,\n \"button: \": queryData.button,\n \"overline: \": queryData.overline,\n \"subtitle: \": queryData.subtitle,\n \"button: \": queryData.caption,\n \"display1: \": queryData.display1,\n \"display2: \": queryData.display2,\n \"display3: \": queryData.display3,\n \"display4: \": queryData.display4,\n };\n\n return Container(\n child: Column(\n children: styles.keys.map((e) => buildItem(e, styles[e])).toList(),\n ),\n );\n }\n\n Widget buildItem(String e, TextStyle style) => Column(\n children: [\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceBetween,\n children: [\n Text(\n e,\n style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n ),\n Text(\n \"@toly\",\n style: style,\n )\n ],\n ),\n ),\n Divider(\n height: 1,\n )\n ],\n );\n}"},{"id":null,"widgetId":168,"name":"Theme的用法","priority":2,"subtitle":" \n使用Theme,可以指定非常多的属性作为主题,这些属性将应用于所有的后代组件,如指定字体、滑块、卡片、文字、分割线、按钮等属性。","code":"import 'package:flutter/material.dart';\nclass CustomTheme extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Theme(\n data: ThemeData(\n cardTheme: CardTheme(color: Colors.red, elevation: 4),\n dividerTheme: DividerThemeData(\n color: Colors.blue,\n thickness: 2\n ),\n sliderTheme: SliderThemeData(\n thumbColor: Colors.red,\n activeTrackColor: Colors.green,\n inactiveTrackColor: Colors.grey,\n )),\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Card(\n child: Container(\n width: 50,\n height: 50,\n color: Colors.transparent,\n ),\n ),\n Container(\n width: 150,\n child: Slider(value: 0.8, onChanged: (v) => {})),\n Container( width: 150,child: Divider())\n ]));\n }\n}"},{"id":null,"widgetId":15,"name":"FilterChip可接受选择事件","priority":1,"subtitle":"【selected】: 是否选择 【bool】\n【onSelected】: 选择事件 【Function(bool)】\n【selectedColor】: 选择后的颜色 【Color】\n【selectedShadowColor】: 选择后的阴影颜色 【Color】,","code":"import 'package:flutter/material.dart';\nclass CustomFilterChip extends StatefulWidget {\n @override\n _CustomFilterChipState createState() => _CustomFilterChipState();\n}\n\nclass _CustomFilterChipState extends State {\n final Map map = {\n 'A': 'Ant',\n 'B': 'Bug',\n 'C': 'Cat',\n 'D': 'Dog',\n };\n List _selected = [];\n\n @override\n Widget build(BuildContext context) {\n return Column(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n Wrap(\n children: map.keys.map((key) =>\n _buildChild(key)).toList(),\n ),\n Container(\n padding: EdgeInsets.all(10),\n child: Text('您已选择: ${_selected.join(', ')}')),\n ],\n );\n }\n\n Padding _buildChild(String key) {\n return Padding(\n padding: const EdgeInsets.all(4.0),\n child: FilterChip(\n selectedColor: Colors.orange.withAlpha(55),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n pressElevation: 5,\n elevation: 3,\n avatar: CircleAvatar(child: Text(key)),\n label: Text(map[key]),\n selected: _selected.contains(map[key]),\n onSelected: (bool value) {\n setState(() {\n if (value) {\n _selected.add(map[key]);\n } else {\n _selected.removeWhere((name) => name == map[key]);\n }\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":352,"name":"CupertinoDialogAction基本使用","priority":1,"subtitle":"【isDefaultAction】 : 是否是默认性操作 【bool】\n【isDestructiveAction】 : 是否是毁灭性操作 【bool】\n【textStyle】: 文字样式 【TextStyle】\n【onPressed】: 点击事件 【VoidCallback】\n【child】: 子组件 【Widget】","code":"import 'dart:async';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'dart:ui' as ui;\nclass CupertinoDialogActionDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n CupertinoDialogAction(\n isDestructiveAction: false,\n onPressed: ()=>_toast(context),\n child: Text('CupertinoDialogAction'),\n ),\n CupertinoDialogAction(\n isDestructiveAction: true,\n onPressed: ()=>_toast(context),\n child: Text('CupertinoDialogAction'),\n ),\n ],\n );\n }\n\n _toast(BuildContext context){\n Scaffold.of(context).showSnackBar(SnackBar(\n backgroundColor: Theme.of(context).primaryColor,\n content: Text('CupertinoDialogAction'),));\n }\n}\n"},{"id":null,"widgetId":34,"name":"Divider颜色和粗细","priority":1,"subtitle":"【color】: 颜色 【Color】\n【thickness】: 线粗细 【double】","code":"import 'package:flutter/material.dart';\nclass CustomDivider extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var dataColor = [\n Colors.red, Colors.yellow,\n Colors.blue, Colors.green];\n var dataThickness = [1.0, 2.0, 4.0, 6.0];\n var data = Map.fromIterables(dataColor, dataThickness);\n return Column(\n children: dataColor\n .map((e) => Divider(\n color: e,\n thickness: data[e],\n ))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":34,"name":"Divider高度和空缺","priority":2,"subtitle":"【indent】: 前面空缺长度 【double】\n【endIndent】: 后面空缺长度 【double】\n【height】: 占位高 【double】","code":"import 'package:flutter/material.dart';\nclass HeightDivider extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var dataColor = [\n Colors.red, Colors.yellow,\n Colors.blue, Colors.green];\n var dataThickness = [10.0, 20.0, 30.0, 40.0];\n var data = Map.fromIterables(dataColor, dataThickness);\n return Column(\n children: dataColor\n .map((e) => Divider(\n color: e,\n indent:data[e],\n endIndent: data[e]*2,\n height: data[e],\n thickness: data[e]/10,\n ))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":205,"name":"TabPageSelector基本使用","priority":1,"subtitle":"【controller】 : 控制器 【TabController】\n【indicatorSize】: 指示器大小 【double】\n【selectedColor】: 选中色 【Color】\n【color】: 颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass TabPageSelectorDemo extends StatefulWidget {\n @override\n _TabPageSelectorDemoState createState() => _TabPageSelectorDemoState();\n}\n\nclass _TabPageSelectorDemoState extends State\n with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Stack(\n alignment: Alignment.center,\n children: [\n Container(color: Colors.purple, child: _buildTableBarView()),\n Positioned(\n bottom: 10,\n child: buildTabPageSelector(),\n ),\n ],\n ),\n );\n }\n\n Widget buildTabPageSelector() => TabPageSelector(\n controller: _tabController,\n color: Colors.white,\n indicatorSize: 10,\n selectedColor: Colors.orangeAccent,\n );\n\n Widget _buildTableBarView() => TabBarView(\n controller: _tabController,\n children: tabs\n .map((e) => Center(\n child: Text(\n e,\n style: TextStyle(color: Colors.white, fontSize: 20),\n )))\n .toList());\n}\n"},{"id":null,"widgetId":142,"name":"BottomSheet基本使用","priority":1,"subtitle":" \n【builder】 : 组件构造器 【WidgetBuilder】\n【backgroundColor】 : 背景色 【Color】\n【elevation】 : 影深 【double】\n【shape】 : 形状 【ShapeBorder】\n【onClosing】 : 关闭回调 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomBottomSheet extends StatefulWidget {\n @override\n _CustomBottomSheetState createState() => _CustomBottomSheetState();\n}\n\nclass _CustomBottomSheetState extends State {\n bool opened = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: FlatButton(\n color: Colors.blue,\n onPressed: () {\n opened = !opened;\n opened\n ? Scaffold.of(context)\n .showBottomSheet((_) => _buildBottomSheet())\n : Navigator.of(context).pop();\n },\n child: Text(\n '点我显隐BottomSheet',\n style: TextStyle(color: Colors.white),\n )));\n }\n\n Widget _buildBottomSheet() => BottomSheet(\n enableDrag: true,\n elevation: 4,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topRight: Radius.circular(60),\n topLeft: Radius.circular(60),\n )\n ),\n backgroundColor: Colors.transparent,\n onClosing: () => print('onClosing'),\n builder: (_) => (Container(\n height: 250,\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/sabar_bar.jpg'),\n fit: BoxFit.cover),\n borderRadius: BorderRadius.only(\n topRight: Radius.circular(60),\n topLeft: Radius.circular(60),\n )),\n )));\n}\n"},{"id":null,"widgetId":17,"name":"CheckBoxListTile的选中效果","priority":2,"subtitle":"【selected】: 是否选中 【bool】","code":"import 'package:flutter/material.dart';\nclass SelectCheckBoxListTile extends StatefulWidget {\n @override\n _SelectCheckBoxListTileState createState() => _SelectCheckBoxListTileState();\n}\n\nclass _SelectCheckBoxListTileState extends State {\n var _selected = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: CheckboxListTile(\n value: _selected,\n selected: _selected,\n checkColor: Colors.yellow,\n activeColor: Colors.orangeAccent,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _selected = !_selected),\n ),\n );\n }\n}"},{"id":null,"widgetId":17,"name":"CheckBoxListTile的密排属性","priority":3,"subtitle":"【dense】: 是否密排 【bool】","code":"import 'package:flutter/material.dart';\nclass DenseCheckBoxListTile extends StatefulWidget {\n @override\n _DenseCheckBoxListTileState createState() => _DenseCheckBoxListTileState();\n}\n\nclass _DenseCheckBoxListTileState extends State {\n var _selected = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: CheckboxListTile(\n value: _selected,\n dense: true,\n checkColor: Colors.yellow,\n activeColor: Colors.orangeAccent,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _selected = !_selected),\n ),\n );\n }\n}"},{"id":null,"widgetId":17,"name":"CheckBoxListTile的基本表现如下","priority":1,"subtitle":"【secondary】: 左侧组件 【Widget】\n【checkColor】: ✔️颜色 【Color】\n【activeColor】: 选中时外框颜色 【Color】\n【title】: 中间上组件 【Widget】\n【subtitle】: 中间下组件 【Widget】\n【onChanged】: 选中事件 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass CustomCheckBoxListTile extends StatefulWidget {\n @override\n _CustomCheckBoxListTileState createState() => _CustomCheckBoxListTileState();\n}\n\nclass _CustomCheckBoxListTileState extends State {\n var _selected = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: CheckboxListTile(\n value: _selected,\n checkColor: Colors.yellow,\n activeColor: Colors.orangeAccent,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _selected = !_selected),\n ),\n );\n }\n}"},{"id":null,"widgetId":203,"name":"OrientationBuilder基本使用","priority":1,"subtitle":"【builder】 : 方向组件构造器 【OrientationWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass OrientationBuilderDemo extends StatefulWidget {\n @override\n _OrientationBuilderDemoState createState() => _OrientationBuilderDemoState();\n}\n\nclass _OrientationBuilderDemoState extends State {\n double _width = 200;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n width: _width,\n height: 200,\n child: OrientationBuilder(builder: _builder),\n color: Colors.orange,\n ),\n _buildSlider()\n ],\n );\n }\n\n //根据回调的orientation返回组件\n Widget _builder(BuildContext context, Orientation orientation) {\n switch(orientation){\n case Orientation.portrait:\n return Icon(Icons.phone_android,size: 60,);\n break;\n case Orientation.landscape:\n return RotatedBox(\n quarterTurns: 1,\n child: Icon(Icons.phone_android,size: 60,));\n break;\n default: return Container();\n }\n }\n\n Widget _buildSlider() =>Slider(\n value: _width,\n max: 350.0,\n min: 80.0,\n divisions: 17,\n onChanged: (v)=> setState(() => _width= v),\n );\n}\n"},{"id":null,"widgetId":132,"name":"CupertinoActionSheetAction基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【isDefaultAction】 : 是否默认选中 【bool】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomCupertinoActionSheetAction extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n margin: EdgeInsets.all(5),\n color: Colors.grey.withAlpha(33),\n child: CupertinoActionSheetAction(\n isDefaultAction: true,\n onPressed: () => DialogAbout.show(context),\n child: Text('张风捷特烈')),\n ),\n Container(\n color: Colors.grey.withAlpha(33),\n margin: EdgeInsets.all(5),\n child: CupertinoActionSheetAction(\n isDefaultAction: false,\n onPressed: () => DialogAbout.show(context),\n child: Text('百里·巫缨')),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":125,"name":"AnimatedIcon基本使用","priority":1,"subtitle":" \n【icon】 : 动画图标数据 【AnimatedIcons】\n【size】 : 大小 【double】\n【color】 : 颜色 【Color】\n【progress】 : 动画 【Animation】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomAnimatedIcon extends StatefulWidget {\n @override\n _CustomAnimatedIconState createState() => _CustomAnimatedIconState();\n}\n\nclass _CustomAnimatedIconState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Wrap(\n runSpacing: 30,\n children: _buildChildren(),\n ),\n );\n }\n\n final data = {\n Colors.orange: AnimatedIcons.menu_arrow,\n Colors.blue: AnimatedIcons.ellipsis_search,\n Colors.red: AnimatedIcons.close_menu,\n Colors.green: AnimatedIcons.arrow_menu,\n Colors.cyanAccent: AnimatedIcons.play_pause,\n Colors.purple: AnimatedIcons.pause_play,\n };\n\n List _buildChildren() => data.keys\n .map((e) => AnimatedIcon(\n size: 50,\n color: e,\n icon: data[e],\n progress: _ctrl,\n ))\n .toList();\n}\n"},{"id":null,"widgetId":130,"name":"AboutDialog基本使用","priority":1,"subtitle":" \n【applicationIcon】 : 左上图标 【Widget】\n【applicationVersion】 : 版本号 【String】\n【applicationName】 : 应用名 【String】\n【applicationLegalese】 : 应用律术 【String】\n【children】 : 子组件列表 【List】","code":"import 'package:flutter/material.dart';\nclass CustomAboutDialog extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Stack(\n children: [\n _buildAboutDialog(),\n Positioned(top: 50, right: 20, child: _buildRaisedButton(context)),\n ],\n );\n }\n\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () {\n showDialog(context: context, builder: (ctx) => _buildAboutDialog());\n },\n child: Text(\n 'Just Show It',\n style: TextStyle(color: Colors.white),\n ),\n );\n\n AboutDialog _buildAboutDialog() {\n return AboutDialog(\n applicationIcon: FlutterLogo(),\n applicationVersion: 'v0.0.1',\n applicationName: 'Flutter Unit',\n applicationLegalese: 'Copyright© 2018-2020 张风捷特烈',\n children: [\n Container(\n margin: EdgeInsets.only(top: 20),\n width: 80,\n height: 80,\n child: Image.asset('assets/images/icon_head.png')),\n Container(\n margin: EdgeInsets.only(top: 10),\n alignment: Alignment.center,\n child: Text(\n 'The King Of Coder.',\n style: TextStyle(color: Colors.white, fontSize: 20, shadows: [\n Shadow(\n color: Colors.blue, offset: Offset(.5, .5), blurRadius: 3)\n ]),\n ))\n ],\n );\n }\n}\n"},{"id":null,"widgetId":8,"name":"FadeInImage.assetNetwork加载网络图片","priority":1,"subtitle":"【placeholder】 : 展位图地址 【String】\n【image】 : 显示图地址 【String】\n【width】: 宽 【double】\n【height】: 高 【double】\n【fadeInDuration】: 淡入时长 【Duration】\n【fadeOutDuration】: 淡出时长 【Duration】\n【fadeInCurve】: 淡入曲线 【Cubic】\n【fadeOutCurve】: 淡出曲线 【Cubic】\n【fit】: 适应模式 【BoxFit】\n【alignment】: 对齐模式 【Alignment】\n【repeat】: 重复模式 【ImageRepeat】,","code":"import 'package:flutter/material.dart';\nclass CustomFadeInImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var placeholder = \"assets/images/icon_head.png\";\n var img =\n \"https://user-gold-cdn.xitu.io/2017/8/24//"\n \"d324efef8cbee6468a018aad7ab2ba6b?imageView2/\"\n \"1/w/180/h/180/q/85/format/webp/interlace/1\";\n return FadeInImage.assetNetwork(\n placeholder: placeholder,\n image: img,\n width: 100,\n height: 100,\n fit: BoxFit.cover,\n repeat:ImageRepeat.noRepeat,\n alignment: Alignment.center,\n fadeInDuration: Duration(seconds: 5),\n fadeInCurve: Curves.easeInCubic,\n );\n }\n}\n"},{"id":null,"widgetId":36,"name":"Placeholder的fallback属性","priority":2,"subtitle":" 当所在区域无宽高约束时,占位组件的宽高。\"\n【fallbackHeight】: 高 【double】\n【fallbackWidth】: 宽 【double】","code":"import 'package:flutter/material.dart';\nclass FallbackPlaceholder extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return UnconstrainedBox(\n child: Placeholder(\n color: Colors.blue,\n strokeWidth: 2,\n fallbackHeight: 100,\n fallbackWidth: 150,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":36,"name":"Placeholder基础属性","priority":1,"subtitle":"【color】: 颜色 【Color】\n【strokeWidth】: 线粗 【double】","code":"import 'package:flutter/material.dart';\nclass CustomPlaceholder extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 100,\n height: 100*0.618,\n child: Placeholder(\n color: Colors.orangeAccent,\n strokeWidth: 2,\n ),\n );\n }\n}"},{"id":null,"widgetId":30,"name":"IconButton属性","priority":1,"subtitle":"【child】: 子组件 【Widget】\n【icon】: 内边距 【Widget】\n【tooltip】: 长按提示文字 【String】\n【highlightColor】: 长按高亮色 【Color】\n【splashColor】: 水波纹色 【Color】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomIconButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Padding(\n padding: const EdgeInsets.all(8.0),\n child: IconButton(\n padding: EdgeInsets.only(),\n onPressed: () {},\n icon: Icon(Icons.android, size: 40, color: Colors.green),\n tooltip: \"android\",\n highlightColor: Colors.orangeAccent,\n splashColor: Colors.blue,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":14,"name":"可以接受选中事件","priority":2,"subtitle":"【selected】: 是否选中 【bool】\n【onSelected】: 选中事件 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass SelectInputChip extends StatefulWidget {\n @override\n _SelectInputChipState createState() => _SelectInputChipState();\n}\n\nclass _SelectInputChipState extends State {\n bool _select = false;\n\n @override\n Widget build(BuildContext context) {\n return InputChip(\n selected: _select,\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n label: Text(\"This is a InputChip.\"),\n backgroundColor: Colors.grey.withAlpha(66),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n selectedColor: Colors.orangeAccent.withAlpha(88),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n elevation: 3,\n onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'),\n onSelected: (bool value) {\n setState(() {\n _select = value;\n });\n print(\"onSelected\");\n },\n );\n }\n}"},{"id":null,"widgetId":14,"name":"可以接受点击、删除事件","priority":1,"subtitle":"【onPressed】: 点击事件 【Function()】\n【onDeleted】: 删除事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass PressInputChip extends StatefulWidget {\n @override\n _PressInputChipState createState() => _PressInputChipState();\n}\n\nclass _PressInputChipState extends State {\n bool _delete = false;\n\n @override\n Widget build(BuildContext context) {\n return InputChip(\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n label: Text(\n !_delete ?\n \"This is a InputChip.\" :\n \"You are clicked delete icon.\"),\n backgroundColor: Colors.grey.withAlpha(66),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n selectedColor: Colors.orangeAccent.withAlpha(88),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n elevation: 3,\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n onDeleted: () => setState(() => _delete = !_delete));\n }\n}"},{"id":null,"widgetId":2,"name":"文字对齐方式","priority":4,"subtitle":"【textAlign】: 对齐方式 【TextAlign】\n下面依次是:left、right、center、justify、start、end,","code":"import 'package:flutter/material.dart';\nclass TextAlignText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: TextAlign.values\n .map((e) => Container(\n width: 120,\n color: Colors.cyanAccent.withAlpha(33),\n height: 120 * 0.618,\n child: Text(\n \" 张风捷特烈 toly \" * 3,\n textAlign: e,\n ),\n ))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":2,"name":"文字的基本样式","priority":1,"subtitle":"【入参】 : 文字 【String】\n【style】: 文字样式 【TextStyle】\n【color】: 文字样式 【Color】\n【fontSize】: 文字大小 【double】\n【fontWeight】: 字重 【FontWeight】\n【fontStyle】: 字体样式 【fontStyle】\n【letterSpacing】: 字距 【double】","code":"import 'package:flutter/material.dart';\nclass CustomText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var style = TextStyle(\n color: Colors.blue,\n fontSize: 20,\n fontWeight: FontWeight.bold,\n fontStyle: FontStyle.italic,\n letterSpacing: 10,\n );\n return Container(\n width: 200,\n color: Colors.cyanAccent.withAlpha(33),\n height: 200 * 0.618 * 0.618,\n child: Text(\"toly-张风捷特烈-1994`\", style: style),\n );\n }\n}"},{"id":null,"widgetId":2,"name":"文字方向与最大行数","priority":5,"subtitle":"【maxLines】 : 最大行数 【int】\n【【textDirection】 : 文字方向 【TextDirection】\n下面依次是:rtl、ltr,","code":"import 'package:flutter/material.dart';\nclass TextDirectionText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 40,\n runSpacing: 10,\n children: TextDirection.values\n .map((e) => Container(\n width: 120,\n color: Colors.cyanAccent.withAlpha(33),\n height: 120 * 0.618,\n child: Text(\n \" 张风捷特烈 toly \" * 10,\n textDirection: e,\n maxLines: 3,\n overflow: TextOverflow.ellipsis,\n ),\n ))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":2,"name":"文字装饰线","priority":3,"subtitle":"【fontFamily】 : 文字字体 【String】\n【decoration】: 装饰线 【TextDecoration】\n【decorationColor】: 装饰线颜色 【Color】\n【decorationThickness】: 装饰线粗 【double】\n【decorationStyle】: 装饰线样式 【TextDecorationStyle】","code":"import 'package:flutter/material.dart';\nclass DecorationText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Text(\n \"19940328\",\n style: TextStyle(\n fontSize: 50,\n fontWeight: FontWeight.bold,\n decoration: TextDecoration.underline,\n decorationThickness: 3,\n decorationStyle: TextDecorationStyle.wavy,\n decorationColor: Colors.blue,\n fontStyle: FontStyle.italic,\n fontFamily: \"DancingScript\",\n letterSpacing: 10),\n );\n }\n}"},{"id":null,"widgetId":2,"name":"是否包裹与越界效果","priority":6,"subtitle":"【softWrap】 : 是否换行 【bool】\n【overflow】 : 越界效果 【TextOverflow】\n下面softWrap=false; overflow依次是:clip、fade、ellipsis、visible,","code":"import 'package:flutter/material.dart';\nclass SoftWrapText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: TextOverflow.values\n .map((e) => Container(\n width: 150,\n color: Colors.cyanAccent.withAlpha(33),\n height: 150 * 0.618 * 0.618,\n child: Text(\" 张风捷特烈 toly \" * 5,\n overflow: e,\n softWrap: false),\n ))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":2,"name":"文字阴影","priority":2,"subtitle":"【shadows】 : 文字 【List】\n【backgroundColor】: 背景颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass ShadowText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Text(\n \"张风捷特烈\",\n style: TextStyle(\n fontSize: 50,\n color: Colors.white,\n backgroundColor: Colors.black,\n shadows: [\n Shadow(\n color: Colors.cyanAccent,\n offset: Offset(1, 1),\n blurRadius: 10),\n Shadow(\n color: Colors.blue,\n offset: Offset(-0.1, 0.1),\n blurRadius: 10),\n ]),\n );\n }\n}"},{"id":null,"widgetId":6,"name":"用于显示一个图标","priority":1,"subtitle":"【入参】 :图标数据 【IconData】\n【size】 : 大小 【double】\n【color】: 颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomIcon extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Icon(\n Icons.send,\n color: Colors.orange,\n size: 60,\n ),\n Icon(\n Icons.android,\n color: Colors.green,\n size: 100,\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":6,"name":"使用自定义图标","priority":2,"subtitle":"可在iconfont网站中下载图标字体进行使用","code":"import 'package:flutter/material.dart';\nimport '../../../../app/style/TolyIcon.dart';\nclass MyIcon extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n TolyIcon.icon_search,\n TolyIcon.icon_star,\n TolyIcon.icon_layout,\n TolyIcon.icon_star_ok\n ]\n .map((e) => Icon(\n e,\n color: Colors.green,\n size: 60,\n ))\n .toList(),\n );\n }\n}\n\n"},{"id":null,"widgetId":169,"name":"文字样式-TextTheme","priority":1,"subtitle":"后代组件可以通过CupertinoTheme.of获取主题的数据进行使用。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass TextCupertinoTheme extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var queryData = CupertinoTheme.of(context).textTheme;\n var styles = {\n \"tabLabelTextStyle: \": queryData.tabLabelTextStyle,\n \"actionTextStyle: \": queryData.actionTextStyle,\n \"navActionTextStyle: \": queryData.navActionTextStyle,\n \"textStyle: \": queryData.textStyle,\n \"navTitleTextStyle: \": queryData.navTitleTextStyle,\n \"pickerTextStyle: \": queryData.pickerTextStyle,\n \"dateTimePickerTextStyle: \": queryData.dateTimePickerTextStyle,\n \"navLargeTitleTextStyle: \": queryData.navLargeTitleTextStyle,\n };\n\n return Container(\n child: Column(\n children: styles.keys.map((e) => buildItem(e, styles[e])).toList(),\n ),\n );\n }\n\n Widget buildItem(String e, TextStyle style) => Column(\n children: [\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceBetween,\n children: [\n Text(\n e,\n style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n ),\n Text(\n \"@toly\",\n style: style,\n )\n ],\n ),\n ),\n Divider(\n height: 1,\n )\n ],\n );\n}"},{"id":null,"widgetId":169,"name":"CupertinoThemeData的使用","priority":2,"subtitle":" \n和Theme一样可以通过指定的属性,让它们在后代中共享,不过属性较少。注意如果需要使用主题,不能在当前的context中获取。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoTheme extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return CupertinoTheme(\n data: CupertinoThemeData(\n primaryColor: Colors.blue,\n primaryContrastingColor: Colors.green\n ),\n child: _ChildUseTheme());\n }\n}\n\nclass _ChildUseTheme extends StatelessWidget {\n const _ChildUseTheme({\n Key key,\n }) : super(key: key);\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Container(\n width: 50,\n height: 50,\n color: CupertinoTheme.of(context).primaryContrastingColor,\n ),\n Container(\n width: 150,\n child: Slider(value: 0.8, onChanged: (v) => {})),\n Container( width: 150,child: Divider(color:CupertinoTheme.of(context).primaryContrastingColor,thickness: 1,))\n ]);\n }\n}"},{"id":null,"widgetId":25,"name":"FlatButton点击事件","priority":1,"subtitle":"【color】: 颜色 【Color】\n【splashColor】: 水波纹颜色 【Color】\n【child】: 子组件 【Widget】\n【textColor】: 子组件文字颜色 【Color】\n【highlightColor】: 长按高亮色 【Color】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/material.dart';\nclass CustomFlatButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return FlatButton(\n onPressed: ()=>{},\n padding: EdgeInsets.all(8),\n splashColor: Colors.green,\n child: Text(\"FlatButton\"),\n textColor: Color(0xffFfffff),\n color: Colors.blue,\n highlightColor: Color(0xffF88B0A),\n );\n }\n}\n"},{"id":null,"widgetId":133,"name":"SimpleDialogOption基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomSimpleDialogOption extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n alignment: Alignment.center,\n width: double.infinity,\n height: 50,\n margin: EdgeInsets.all(5),\n color: Colors.grey.withAlpha(33),\n child: SimpleDialogOption(\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n child: Text('张风捷特烈')),\n ),\n Container(\n height: 50,\n alignment: Alignment.center,\n width: double.infinity,\n color: Colors.grey.withAlpha(33),\n margin: EdgeInsets.all(5),\n child: SimpleDialogOption(\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n child: Text('百里·巫缨')),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":31,"name":"BackButton属性","priority":1,"subtitle":"【color】: 颜色 【Color】\n【onPressed】: 点击事件 【Function】\n onPressed为空会退出当前栈","code":"import 'package:flutter/material.dart';\nclass CustomBackButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = [Colors.red,Colors.yellow,Colors.blue,Colors.green];\n return Wrap(\n spacing: 10,\n children: data.map((e)=>BackButton(\n color: e,\n )).toList()\n );\n }\n}\n"},{"id":null,"widgetId":202,"name":"Builder的使用","priority":1,"subtitle":"【builder】 : 组件构造器 【WidgetBuilder】\n同一个类中使用`XXX.of(context)`获取某类状态对象方法会存在`上下文滞后`的错误,使用Builder解决。","code":"import 'package:flutter/material.dart';\nclass BuilderDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scaffold(\n appBar: AppBar(\n title: Text('Builder'),\n ),\n floatingActionButton: Builder(\n builder: (ctx) => FloatingActionButton(\n onPressed: () {\n Scaffold.of(ctx)\n .showSnackBar(SnackBar(content: Text('hello builder')));\n },\n child: Icon(Icons.add),\n ),\n ),\n ),\n );\n }\n\n\n}\n"},{"id":null,"widgetId":18,"name":"SwitchListTile的密排属性","priority":3,"subtitle":"【dense】: 是否密排 【bool】","code":"import 'package:flutter/material.dart';\nclass DenseSwitchListTile extends StatefulWidget {\n @override\n _DenseSwitchListTileState createState() => _DenseSwitchListTileState();\n}\n\nclass _DenseSwitchListTileState extends State {\n var _value=false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: SwitchListTile(\n value: _value,\n dense: true,\n selected: _value,\n activeColor: Colors.orangeAccent,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _value = !_value),\n ),\n );\n }\n}"},{"id":null,"widgetId":18,"name":"SwitchListTile的选中效果","priority":2,"subtitle":"【selected】: 是否选中 【bool】\n【inactiveThumbImage】: 未选中时圆圈图片 【ImageProvider】\n【activeThumbImage】: 选中时圆圈图片 【ImageProvider】","code":"import 'package:flutter/material.dart';\nclass SelectSwitchListTile extends StatefulWidget {\n @override\n _SelectSwitchListTileState createState() => _SelectSwitchListTileState();\n}\n\nclass _SelectSwitchListTileState extends State {\n var _value=false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: SwitchListTile(\n value: _value,\n selected: _value,\n activeColor: Colors.orangeAccent,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n inactiveThumbImage: AssetImage(\"assets/images/pica.gif\"),\n activeThumbImage: AssetImage(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _value = !_value),\n ),\n );\n }\n}"},{"id":null,"widgetId":18,"name":"SwitchListTile的基本表现如下","priority":1,"subtitle":"【secondary】: 左侧组件 【Widget】\n【title】: 中间上组件 【Widget】\n【subtitle】: 中间下组件 【Widget】\n【inactiveThumbColor】: 未选中时圆圈颜色 【Color】\n【inactiveTrackColor】: 未选中滑槽颜色 【Color】\n【activeColor】: 选中时圆圈颜色 【Color】\n【activeTrackColor】: 选中滑槽颜色 【Color】\n【onChanged】: 选中事件 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass CustomSwitchListTile extends StatefulWidget {\n @override\n _CustomSwitchListTileState createState() => _CustomSwitchListTileState();\n}\n\nclass _CustomSwitchListTileState extends State {\n var _value=false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: SwitchListTile(\n value: _value,\n inactiveThumbColor:Colors.cyanAccent ,\n inactiveTrackColor: Colors.blue.withAlpha(88),\n activeColor: Colors.orangeAccent,\n activeTrackColor: Colors.orange,\n secondary: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"张风捷特烈\"),\n subtitle: Text(\"@万花过尽知无物\"),\n onChanged: (v) => setState(() => _value = !_value),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":102,"name":"DataTable的sort","priority":2,"subtitle":" \n【sortColumnIndex】 : 列号 【int】\n【columnSpacing】 : 列间距 【double】\n【sortAscending】 : 是否顺序 【bool】","code":"import 'package:flutter/material.dart';\nclass _BeanOp {\n final int id;\n final String name;\n final String type;\n bool select;\n\n _BeanOp(this.id, this.name, this.type, this.select);\n\n @override\n String toString() {\n return '_BeanOp{id: $id, name: $name, type: $type, select: $select}';\n }\n}\n\nclass SortDataTable extends StatefulWidget {\n @override\n _SortDataTableState createState() => _SortDataTableState();\n}\n\nclass _SortDataTableState extends State {\n var data = [\n _BeanOp(101, 'DataTable', 'StatelessWidget', false),\n _BeanOp(44, 'RangeSlider', 'StatefulWidget', false),\n _BeanOp(2, 'Text', 'StatelessWidget', false),\n _BeanOp(1, 'Image', 'StatefulWidget', false),\n ];\n\n bool _sortAscending = false;\n var selectData = <_BeanOp>[];\n\n @override\n Widget build(BuildContext context) {\n return DataTable(\n columnSpacing: 20,\n sortColumnIndex: 1,\n sortAscending: _sortAscending,\n columns: [\n DataColumn(\n label: Container(\n child: Checkbox(\n value: selectData.length == data.length,\n onChanged: _onSelectAll,\n ),\n ),\n ),\n DataColumn(label: Text('id'), numeric: false, onSort: _onSortId),\n DataColumn(label: Text('名称')),\n DataColumn(label: Text('类型')),\n ],\n rows: data\n .map((e) => DataRow(selected: false, cells: [\n DataCell(Checkbox(\n value: e.select,\n onChanged: (v) => _onSelectOne(v, e),\n )),\n DataCell(Text('${e.id}')),\n DataCell(Text('${e.name}'),\n showEditIcon: true, onTap: () {}),\n DataCell(Text('${e.type}')),\n ]))\n .toList());\n }\n\n _onSortId(int index, bool ascending) {\n setState(() {\n _sortAscending = ascending;\n data.sort(\n (a, b) => ascending ? a.id.compareTo(b.id) : b.id.compareTo(a.id));\n });\n }\n\n _onSelectOne(bool selected, _BeanOp e) {\n setState(() {\n if (selected) {\n //选中\n selectData.add(e);\n } else {\n selectData.remove(e);\n }\n e.select = selected;\n print(selectData);\n });\n }\n\n _onSelectAll(bool select) {\n setState(() {\n if (select) {\n data.forEach((e) => e.select = true);\n selectData = data.map((e) => e).toList();\n } else {\n data.forEach((e) => e.select = false);\n selectData = [];\n }\n });\n }\n}"},{"id":null,"widgetId":102,"name":"DataTable基本使用","priority":1,"subtitle":" \n【columns】 : 列 【List】\n【rows】 : 行 【List】","code":"import 'package:flutter/material.dart';\nclass _Bean {\n final int id;\n final String name;\n final String type;\n\n _Bean(this.id, this.name, this.type);\n}\n\nclass CustomDataTable extends StatelessWidget {\n final data = [\n _Bean(101, 'DataTable', 'StatelessWidget'),\n _Bean(44, 'RangeSlider', 'StatefulWidget'),\n _Bean(2, 'Text', 'StatelessWidget'),\n _Bean(1, 'Image', 'StatefulWidget'),\n ];\n\n final columns = ['id', '名称', '类型'];\n\n @override\n Widget build(BuildContext context) {\n return DataTable(\n columns: columns.map((e) => DataColumn(label: Text(e))).toList(),\n rows: data\n .map((e) => DataRow(cells: [\n DataCell(Text('${e.id}')),\n DataCell(Text('${e.name}')),\n DataCell(Text('${e.type}')),\n ]))\n .toList());\n }\n}"},{"id":null,"widgetId":4,"name":"样式用于显示文字","priority":2,"subtitle":"【style】 : 样式-3种枚举 【FlutterLogoStyle】\n【textColor】: 文字颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass FlutterLogoWithText extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n FlutterLogoStyle.horizontal:Colors.blue,\n FlutterLogoStyle.markOnly:Colors.red,\n FlutterLogoStyle.stacked:Colors.green,\n };\n\n return Wrap(\n spacing: 20,\n children: data.keys.map((e) => FlutterLogo(\n size: 80,\n style: e,\n textColor: data[e],\n ))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":4,"name":"用于显示一个FlutterLogo","priority":1,"subtitle":"【size】 : 大小 【double】\n【colors】: 颜色 【MaterialColor】","code":"import 'package:flutter/material.dart';\nclass CustomFlutterLogo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n\n var data = {\n Colors.blue:50.0,\n Colors.red:60.0,\n Colors.green:70.0,\n Colors.yellow:80.0,\n };\n return Wrap(\n children: data.keys\n .map((e) => FlutterLogo(\n size: data[e],\n colors: e,\n ))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":193,"name":"AboutListTile基本使用","priority":1,"subtitle":" \n【icon】 : 左图标 【Widget】\n【applicationIcon】 : 左上图标 【Widget】\n【applicationVersion】 : 版本号 【String】\n【applicationName】 : 应用名 【String】\n【applicationLegalese】 : 应用律术 【String】\n【aboutBoxChildren】 : 弹框内容组件 【List】","code":"import 'package:flutter/material.dart';\nclass AboutListTileDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return AboutListTile(\n icon: Icon(Icons.info),\n applicationIcon: FlutterLogo(),\n applicationName: 'Flutter Unit',\n applicationVersion: 'v0.0.1',\n applicationLegalese: 'Copyright© 2018-2020 张风捷特烈',\n aboutBoxChildren: [\n Padding(\n padding: const EdgeInsets.all(10.0),\n child: Text(\n ' FlutterUnit是【张风捷特烈】的开源项目,'\n '收录Flutter的200+组件,并附加详细介绍以及操作交互,'\n '希望帮助广大编程爱好者入门Flutter。'\n '更多知识可以关注掘金账号、公众号【编程之王】。',\n style: TextStyle(color: Color(0xff999999), fontSize: 16),\n textAlign: TextAlign.justify,\n ),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":5,"name":"用于显示一个角标","priority":1,"subtitle":"【message】 : 显示的文字信息 【String】\n【location】 : 位置*4 【BannerLocation】\n【color】: 角标颜色 【Color】\n【child】: 孩子 【Widget】\n【textStyle】: 文字样式 【TextStyle】","code":"import 'package:flutter/material.dart';\nclass CustomBanner extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n BannerLocation.topStart: Colors.red,\n BannerLocation.topEnd: Colors.blue,\n BannerLocation.bottomStart: Colors.green,\n BannerLocation.bottomEnd: Colors.yellow,\n };\n\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: data.keys.map((e) =>\n Container(\n color: Color(0xffD8F5FF),\n width: 150,\n height: 150 * 0.618,\n child: Banner(\n message: \"Flutter 1.12发布\",\n location: e,\n color: data[e],\n child: Padding(\n padding: EdgeInsets.all(20),\n child: FlutterLogo(colors: Colors.blue,\n style: FlutterLogoStyle.horizontal,)),\n ),\n )).toList());\n }\n}\n"},{"id":null,"widgetId":127,"name":"AlertDialog基本使用","priority":1,"subtitle":" \n【title】 : 顶部组件 【Widget】\n【content】 : 内容组件 【Widget】\n【titleTextStyle】 : 顶部文字样式 【TextStyle】\n【contentTextStyle】 : 内容文字样式 【TextStyle】\n【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n【actions】 : 右下角组件列表 【List】\n【backgroundColor】 : 右下角组件列表 【背景色】\n【elevation】 : 右下角组件列表 【背景色】\n【shape】 : 影深 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAlertDialog extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildRaisedButton(context),\n _buildAlertDialog(),\n ],\n );\n }\n\n Widget _buildRaisedButton(BuildContext context) => RaisedButton(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n color: Colors.blue,\n onPressed: () {\n showDialog(context: context, builder: (ctx) => _buildAlertDialog());\n },\n child: Text(\n 'Just Show It !',\n style: TextStyle(color: Colors.white),\n ),\n );\n\n Widget _buildAlertDialog() {\n return AlertDialog(\n title: _buildTitle(),\n titleTextStyle: TextStyle(fontSize: 20, color: Colors.black),\n titlePadding: EdgeInsets.only(\n top: 5,\n left: 20,\n ),\n contentPadding: EdgeInsets.symmetric(horizontal: 5),\n backgroundColor: Colors.white,\n content: _buildContent(),\n actions: [\n Icon(Icons.android, color: Colors.blue,),\n Icon(Icons.add, color: Colors.blue,),\n Icon(Icons.g_translate, color: Colors.blue,),\n Icon(Icons.games, color: Colors.blue,),\n ],\n elevation: 4,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n );\n }\n\n Widget _buildTitle() {\n return Row(\n //标题\n children: [\n Image.asset(\n \"assets/images/icon_head.png\",\n width: 30,\n height: 30,\n ),\n SizedBox(width: 10,),\n Expanded(\n child: Text(\n \"关于\",\n style: TextStyle(fontSize: 18),\n )),\n CloseButton()\n ],\n );\n }\n\n Widget _buildContent() {\n return Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n Padding(\n padding: const EdgeInsets.all(10.0),\n child: Text(\n ' FlutterUnit是【张风捷特烈】的开源项目,'\n '收录Flutter的200+组件,并附加详细介绍以及操作交互,'\n '希望帮助广大编程爱好者入门Flutter。'\n '更多知识可以关注掘金账号、公众号【编程之王】。',\n style: TextStyle(color: Color(0xff999999), fontSize: 16),\n textAlign: TextAlign.justify,\n ),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":71,"name":"Offstage基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【offstage】 : 是否消失 【bool】","code":"import 'package:flutter/material.dart';\nclass CustomOffstage extends StatefulWidget {\n @override\n _CustomOffstageState createState() => _CustomOffstageState();\n}\n\nclass _CustomOffstageState extends State {\n bool _off = false;\n\n @override\n Widget build(BuildContext context) {\n var radBox = Container(\n height: 50,\n width: 60,\n color: Colors.red,\n child: Switch(\n value: _off,\n onChanged: (v) => setState(() => _off = v)),\n );\n\n return Container(\n width: 250,\n height: 200,\n child: Row(\n children: [radBox, _buildOffStage(), radBox],\n ),\n );\n }\n\n Widget _buildOffStage() => Offstage(\n offstage: _off,\n child: Container(\n alignment: Alignment.center,\n height: 100,\n width: 100,\n color: Colors.blue,\n child: Text(\n \"Offstage\",\n style: TextStyle(fontSize: 20),\n ),\n ));\n}\n"},{"id":null,"widgetId":67,"name":"ClipRect基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【clipBehavior】 : 裁剪行为 【Clip】\n【clipper】 : 裁剪器 【CustomClipper】","code":"import 'package:flutter/material.dart';\nclass CustomClipRect extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ClipRect(\n child: SizedBox(\n height: 100,\n width: 100,\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n fit: BoxFit.cover,),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":279,"name":"返回按钮基本使用","priority":1,"subtitle":"【clipper】 : 裁剪器 【CustomClipper】\n【clipBehavior】 : 裁剪行为 【Clip】\n【child】 : 子组件 【Widget】\n【elevation】 : 阴影深 【double】\n【shadowColor】 : 阴影颜色 【Color】\n【color】: 颜色 【Color】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass PhysicalShapeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 200,\n height: 200,\n child: PhysicalShape(\n shadowColor: Colors.orange,\n elevation: 3,\n child: Image.asset(\n 'assets/images/caver.jpeg',\n fit: BoxFit.cover,\n ),\n clipBehavior: Clip.hardEdge,\n clipper: ShapeBorderClipper(\n shape: CircleBorder(side: BorderSide.none),\n ),\n color: Colors.deepPurpleAccent),\n );\n }\n}\n"},{"id":null,"widgetId":72,"name":"RotatedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【quarterTurns】 : 旋转多少个90° 【int】","code":"import 'package:flutter/material.dart';\nclass CustomRotatedBox extends StatefulWidget {\n @override\n _CustomRotatedBoxState createState() => _CustomRotatedBoxState();\n}\n\nclass _CustomRotatedBoxState extends State {\n int _quarterTurns = 0;\n\n @override\n Widget build(BuildContext context) {\n return RotatedBox(\n quarterTurns: _quarterTurns,\n child: GestureDetector(\n onTap: () => setState(() => _quarterTurns++),\n child: Icon(\n Icons.android,\n size: 60,\n color: Colors.blue,\n )),\n );\n }\n}\n"},{"id":null,"widgetId":79,"name":"LimitedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【maxHeight】 : 最大高 【double】\n【maxWidth】 : 最大宽 【double】","code":"import 'package:flutter/material.dart';\nclass CustomLimitedBox extends StatefulWidget {\n @override\n _CustomLimitedBoxState createState() => _CustomLimitedBoxState();\n}\n\nclass _CustomLimitedBoxState extends State {\n var _text = '';\n\n @override\n Widget build(BuildContext context) {\n var child = Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 50,\n height: 50,\n child: Text(\"Static\"),\n );\n\n var box = LimitedBox(\n maxHeight: 60,\n maxWidth: 100,\n child: Container(color: Colors.orange, child: Text(_text)),\n );\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(22),\n width: 300,\n height: 100,\n child: Row(\n children: [child, UnconstrainedBox(child: box), child],\n ),\n ),\n _buildInput()\n ],\n );\n }\n\n Widget _buildInput() {\n return Padding(\n padding: const EdgeInsets.all(18.0),\n child: TextField(\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n hintText: '请输入',\n ),\n onChanged: (v) {\n setState(() {\n _text = v;\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":83,"name":"OverflowBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【minWidth】 : 最小宽 【double】\n【minHeight】 : 最小高 【double】\n【maxHeight】 : 最大高 【double】\n【maxWidth】 : 最大宽 【double】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomOverflowBox extends StatefulWidget {\n @override\n _CustomOverflowBoxState createState() => _CustomOverflowBoxState();\n}\n\nclass _CustomOverflowBoxState extends State {\n var _text = '';\n\n @override\n Widget build(BuildContext context) {\n var box = OverflowBox(\n alignment: Alignment.center,\n minHeight: 50,\n minWidth: 50,\n maxWidth: 200,\n maxHeight: 120,\n child: Container(\n color: Colors.orange,\n child: Text(_text),\n ),\n// child: Text(\"张风\"),\n );\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(33),\n width: 100,\n height: 100,\n child: box),\n _buildInput()\n ],\n );\n }\n\n Widget _buildInput() {\n return Padding(\n padding: const EdgeInsets.all(18.0),\n child: TextField(\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n hintText: '请输入',\n ),\n onChanged: (v) {\n setState(() {\n _text = v;\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":166,"name":"CustomPaint绘线贝塞尔曲线","priority":2,"subtitle":" \n Flutter也支持贝塞尔曲线等复杂绘制。","code":"import 'dart:ui';\nimport 'package:flutter/material.dart';\nclass PlayBezier3Page extends StatefulWidget {\n @override\n _PlayBezier3PageState createState() => _PlayBezier3PageState();\n}\n\nclass _PlayBezier3PageState extends State {\n List _pos = [];\n int selectPos;\n\n @override\n void initState() {\n _initPoints();\n super.initState();\n }\n\n void _initPoints() {\n _pos = List();\n _pos.add(Offset(0, 0));\n _pos.add(Offset(60, -60));\n _pos.add(Offset(-90, -90));\n _pos.add(Offset(-120, -40));\n }\n\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n width: MediaQuery.of(context).size.width,\n child: RepaintBoundary(\n child: CustomPaint(\n painter: BezierPainter(pos: _pos, selectPos: selectPos),\n ),\n ),\n\n );\n }\n}\n\nclass BezierPainter extends CustomPainter {\n Paint _gridPaint;\n Path _gridPath;\n\n Paint _mainPaint;\n Path _mainPath;\n int selectPos;\n Paint _helpPaint;\n\n List pos;\n\n BezierPainter({this.pos, this.selectPos}) {\n _gridPaint = Paint()..style = PaintingStyle.stroke;\n _gridPath = Path();\n\n _mainPaint = Paint()\n ..color = Colors.orange\n ..style = PaintingStyle.stroke\n ..strokeWidth = 2;\n _mainPath = Path();\n\n _helpPaint = Paint()\n ..color = Colors.purple\n ..style = PaintingStyle.stroke\n ..strokeWidth = 2\n ..strokeCap = StrokeCap.round;\n }\n\n @override\n void paint(Canvas canvas, Size size) {\n canvas.clipRect(Offset.zero & size);\n canvas.translate(size.width / 2, size.height / 2);\n _drawGrid(canvas, size); //绘制格线\n _drawAxis(canvas, size); //绘制轴线\n\n _mainPath.moveTo(pos[0].dx, pos[0].dy);\n _mainPath.cubicTo(pos[1].dx, pos[1].dy, pos[2].dx, pos[2].dy, pos[3].dx, pos[3].dy);\n canvas.drawPath(_mainPath, _mainPaint);\n _drawHelp(canvas);\n _drawSelectPos(canvas);\n\n }\n\n @override\n bool shouldRepaint(CustomPainter oldDelegate) => false;\n\n void _drawGrid(Canvas canvas, Size size) {\n _gridPaint\n ..color = Colors.grey\n ..strokeWidth = 0.5;\n _gridPath = _buildGridPath(_gridPath, size);\n canvas.drawPath(_buildGridPath(_gridPath, size), _gridPaint);\n\n canvas.save();\n canvas.scale(1, -1); //沿x轴镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n\n canvas.save();\n canvas.scale(-1, 1); //沿y轴镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n\n canvas.save();\n canvas.scale(-1, -1); //沿原点镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n }\n\n void _drawAxis(Canvas canvas, Size size) {\n canvas.drawPoints(\n PointMode.lines,\n [\n Offset(-size.width / 2, 0),\n Offset(size.width / 2, 0),\n Offset(0, -size.height / 2),\n Offset(0, size.height / 2),\n Offset(0, size.height / 2),\n Offset(0 - 7.0, size.height / 2 - 10),\n Offset(0, size.height / 2),\n Offset(0 + 7.0, size.height / 2 - 10),\n Offset(size.width / 2, 0),\n Offset(size.width / 2 - 10, 7),\n Offset(size.width / 2, 0),\n Offset(size.width / 2 - 10, -7),\n ],\n _gridPaint\n ..color = Colors.blue\n ..strokeWidth = 1.5);\n }\n\n Path _buildGridPath(Path path, Size size, {step = 20.0}) {\n for (int i = 0; i < size.height / 2 / step; i++) {\n path.moveTo(0, step * i);\n path.relativeLineTo(size.width / 2, 0);\n }\n for (int i = 0; i < size.width / 2 / step; i++) {\n path.moveTo(step * i, 0);\n path.relativeLineTo(\n 0,\n size.height / 2,\n );\n }\n return path;\n }\n\n void _drawHelp(Canvas canvas) {\n canvas.drawPoints(PointMode.lines, pos, _helpPaint..strokeWidth = 1);\n canvas.drawPoints(PointMode.points, pos, _helpPaint..strokeWidth = 8);\n }\n\n void _drawSelectPos(Canvas canvas) {\n if (selectPos == null) return;\n canvas.drawCircle(\n pos[selectPos],\n 10,\n _helpPaint\n ..color = Colors.green\n ..strokeWidth = 2);\n }\n}"},{"id":null,"widgetId":166,"name":"CustomPaint绘线图形","priority":1,"subtitle":" \n【painter】 : 绘画器 【CustomPainter】","code":"import 'package:flutter/material.dart';\nclass ClockPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: 100,\n child:RepaintBoundary(\n child: CustomPaint(//使用CustomPaint盛放画布\n painter: ClockPainter(),\n ),\n ),\n )\n ;\n }\n}\n\nclass ClockPainter extends CustomPainter {\n Paint _paint;\n var _radius = 3.0; //小球半径\n Path _path = Path(); //画笔对象\n ClockPainter () {\n _paint = Paint()..color= Color(0xff45d0fd)..isAntiAlias=true;\n _path.addOval(Rect.fromCircle(radius: _radius, center: Offset(0, 0))); //小球路径\n }\n\n @override\n void paint(Canvas canvas, Size size) {\n print(size);\n canvas.clipRect(Offset.zero & size);\n canvas.translate(size.width/2-65*2, 0);\n renderDigit(1, canvas);//渲染数字\n canvas.translate(65, 0);//平移画布\n renderDigit(9, canvas);\n canvas.translate(65, 0); renderDigit(9, canvas);\n canvas.translate(65, 0); renderDigit(4, canvas);\n }\n //渲染数字 num :要显示的数字 canvas :画布\n void renderDigit(int num, Canvas canvas) {\n if (num > 10) { return; }\n for (int i = 0; i < digit[num].length; i++) {\n for (int j = 0; j < digit[num][j].length; j++) {\n if (digit[num][i][j] == 1) {\n canvas.save();\n double rX = j * 2 * (_radius + 1) + (_radius + 1); //第(i,j)个点圆心横坐标\n double rY = i * 2 * (_radius + 1) + (_radius + 1); //第(i,j)个点圆心纵坐标\n canvas.translate(rX, rY);\n canvas.drawPath(_path, _paint);\n canvas.restore();\n }\n }\n }\n }\n @override\n bool shouldRepaint(CustomPainter oldDelegate)=> false;\n}\n\nconst digit = [\n [\n [0, 0, 1, 1, 1, 0, 0],\n [0, 1, 1, 0, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 0, 1, 1, 0],\n [0, 0, 1, 1, 1, 0, 0]\n ], //0\n\n [\n [0, 0, 0, 1, 1, 0, 0],\n [0, 1, 1, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [1, 1, 1, 1, 1, 1, 1]\n ], //1\n [\n [0, 1, 1, 1, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 1, 1, 0, 0, 0],\n [0, 1, 1, 0, 0, 0, 0],\n [1, 1, 0, 0, 0, 0, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 1, 1, 1, 1, 1]\n ], //2\n [\n [1, 1, 1, 1, 1, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 1, 1, 0]\n ], //3\n\n [\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 1, 0],\n [0, 0, 1, 1, 1, 1, 0],\n [0, 1, 1, 0, 1, 1, 0],\n [1, 1, 0, 0, 1, 1, 0],\n [1, 1, 1, 1, 1, 1, 1],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 1, 1]\n ], //4\n [\n [1, 1, 1, 1, 1, 1, 1],\n [1, 1, 0, 0, 0, 0, 0],\n [1, 1, 0, 0, 0, 0, 0],\n [1, 1, 1, 1, 1, 1, 0],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 1, 1, 0]\n ], //5\n [\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 1, 1, 0, 0, 0],\n [0, 1, 1, 0, 0, 0, 0],\n [1, 1, 0, 0, 0, 0, 0],\n [1, 1, 0, 1, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 1, 1, 0]\n ], //6\n [\n [1, 1, 1, 1, 1, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 0, 1, 1, 0, 0, 0],\n [0, 0, 1, 1, 0, 0, 0],\n [0, 0, 1, 1, 0, 0, 0],\n [0, 0, 1, 1, 0, 0, 0]\n ], //7\n [\n [0, 1, 1, 1, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 1, 1, 0]\n ], //8\n [\n [0, 1, 1, 1, 1, 1, 0],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [1, 1, 0, 0, 0, 1, 1],\n [0, 1, 1, 1, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 0, 1, 1],\n [0, 0, 0, 0, 1, 1, 0],\n [0, 0, 0, 1, 1, 0, 0],\n [0, 1, 1, 0, 0, 0, 0]\n ], //9\n [\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 1, 1, 0],\n [0, 1, 1, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 1, 1, 0],\n [0, 1, 1, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0]\n ] //:\n];\n"},{"id":null,"widgetId":292,"name":"IgnorePointer基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【ignoring】 : 是否忽视事件 【bool】\n如下,Switch选中时ignoring为true,按钮事件将被锁定,无法点击。","code":"import 'package:flutter/material.dart';\nclass CustomIgnorePointer extends StatefulWidget {\n @override\n _CustomIgnorePointerState createState() => _CustomIgnorePointerState();\n}\n\nclass _CustomIgnorePointerState extends State {\n bool _ignore = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n GestureDetector(\n onTap: (){\n print('IgnorePointer');\n },\n child: IgnorePointer(\n ignoring: _ignore,\n child: _buildButton(),\n ),\n ),\n _buildSwitch(),\n Text(!_ignore ? '允许点击' : '点击已锁定')\n ],\n ),\n );\n }\n\n Widget _buildButton() => RaisedButton(\n color: Theme.of(context).primaryColor,\n child: Text(\n 'To About',\n style: TextStyle(color: Colors.white),\n ),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'));\n\n _buildSwitch() => Switch(\n value: _ignore,\n onChanged: (v) {\n setState(() {\n _ignore = v;\n });\n });\n}\n"},{"id":null,"widgetId":287,"name":"LayoutBuilder基本认识","priority":1,"subtitle":" \n【builder】 : 布局构造器 【LayoutWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass CustomLayoutBuilder extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n print('CustomLayoutBuild');\n return Container(\n alignment: Alignment.center,\n height: 80,\n width: 150,\n color: Colors.green,\n child: LayoutBuilder(\n builder: (_, zone) {\n return Text(\n '父容器宽:${zone.maxWidth}\\n'\n '父容器高:${zone.maxHeight}',\n style: TextStyle(color: Colors.white, fontSize: 16),\n );\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":287,"name":"LayoutBuilder的展开使用","priority":3,"subtitle":" \n使用TextPainter来检测文字的行数,实现展开或收起功能。","code":"import 'package:flutter/material.dart';\nclass SimpleExpandableText extends StatefulWidget {\n\n @override\n createState() => _SimpleExpandableTextState();\n}\n\nclass _SimpleExpandableTextState extends State {\n\n final text = '桃树、杏树、梨树,你不让我,我不让你,都开满了花赶趟儿。'\n '红的像火,粉的像霞,白的像雪。'\n '花里带着甜味儿;闭了眼,树上仿佛已经满是桃儿、杏儿、梨儿。'\n '花下成千成百的蜜蜂嗡嗡地闹着,大小的蝴蝶飞来飞去。'\n '野花遍地是:杂样儿,有名字的,没名字的,散在草丛里,像眼睛,像星星,还眨呀眨的。';\n\n bool expand = false;\n int maxLines =3;\n\n\n final style = TextStyle(fontSize: 15, color: Colors.grey, shadows: [\n Shadow(\n color: Colors.white, offset: Offset(1,1)\n )\n ]);\n\n @override\n build(context) => Container(\n decoration: BoxDecoration(\n color: Colors.cyanAccent.withAlpha(8),\n borderRadius: BorderRadiusDirectional.all(Radius.circular(20))),\n padding: EdgeInsets.all(15),\n child: LayoutBuilder(builder: (context, size) {\n\n final painter = TextPainter(\n text: TextSpan(text: text, style: style),\n maxLines: maxLines,\n textDirection: TextDirection.ltr,\n );\n painter.layout(maxWidth: size.maxWidth);\n if (!painter.didExceedMaxLines)\n return Text(text, style: style);\n\n return Column(\n mainAxisSize: MainAxisSize.min,\n crossAxisAlignment: CrossAxisAlignment.start,\n children: [\n Text(text, maxLines: expand ? null : 3, style: style),\n GestureDetector(\n onTap: () => setState(() {\n expand = !expand;\n }),\n child: Text(\n expand ? '<< 收起' : '展开 >>',\n style: TextStyle(color: Colors.blue),\n ),\n ),\n ],\n );\n }),\n );\n}\n\n"},{"id":null,"widgetId":287,"name":"LayoutBuilder的适应布局","priority":2,"subtitle":" \n可以根据区域的大小进行组件展示设计。\"\n比如在不同的宽度区域显示不同的布局结构。\"\n毕竟很多地方不容易获取父组件区域,使用LayoutBuilder就会非常爽口。","code":"import 'package:flutter/material.dart';\nclass FitByLayoutBuilder extends StatefulWidget {\n @override\n _FitByLayoutBuilderState createState() => _FitByLayoutBuilderState();\n}\n\nclass _FitByLayoutBuilderState extends State {\n double _width = 100;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n width: _width,\n child: LayoutBuilder(\n builder: (_, zone) {\n if (zone.maxWidth <= 150) {\n return _buildType1();\n } else {\n return _buildType2(zone);\n }\n },\n ),\n ),\n _buildSlider(),\n ],\n );\n }\n\n Widget _buildSlider() {\n return Slider(\n min: 50,\n max: 300,\n label: \"父宽:${_width.toStringAsFixed(1)}\",\n value: _width,\n onChanged: (v) => setState(() {\n _width = v;\n }));\n }\n\n Widget _buildType1() => Container(\n color: Colors.blue,\n child: Column(\n children: [\n _buildTitle(),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: _buildContent(),\n ),\n ],\n ),\n );\n\n Widget _buildType2(BoxConstraints zone) => Container(\n height: 100,\n width: zone.maxWidth,\n color: Colors.orange,\n child: Row(\n children: [\n Container(\n margin: EdgeInsets.all(10),\n height: 80,\n width: 30,\n color: Colors.grey,\n ),\n Expanded(child: _buildContent())\n ],\n ),\n );\n\n Widget _buildTitle() => Container(\n margin: EdgeInsets.only(left: 10, right: 10, top: 10),\n color: Colors.grey,\n height: 30,\n );\n\n Widget _buildContent() => Wrap(\n runSpacing: 3,\n children: [\n Container(\n color: Colors.red,\n height: 30,\n ),\n Container(\n color: Colors.yellow,\n height: 30,\n ),\n Container(\n color: Colors.green,\n height: 30,\n ),\n ],\n );\n}\n"},{"id":null,"widgetId":86,"name":"Center基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass CustomCenter extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(5),\n width: 200,\n height: 100,\n color: Colors.grey.withAlpha(88),\n child: Center(\n child: Container(\n width: 80,\n height: 60,\n color: Colors.cyanAccent,\n )));\n }\n}\n"},{"id":null,"widgetId":68,"name":"ClipRRect基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【borderRadius】 : 边线半径 【BorderRadius】\n【clipBehavior】 : 裁剪行为 【Clip】\n【clipper】 : 裁剪器 【CustomClipper】","code":"import 'package:flutter/material.dart';\nclass CustomClipRRect extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ClipRRect(\n borderRadius: BorderRadius.all(Radius.elliptical(35, 30)),\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n width: 150,\n height: 100,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":76,"name":"SizedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【width】 : 宽 【double】\n【height】 : 高 【double】","code":"import 'package:flutter/material.dart';\nclass CustomSizedBox extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var child = Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 50,\n height: 50,\n child: Text(\"Static\"),\n );\n\n var box = SizedBox(\n width: 80,\n height: 40,\n child: Container(\n color: Colors.orange,\n child: Icon(\n Icons.android,\n color: Colors.white,\n )),\n );\n\n return Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: Row(\n children: [child, box, child],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":77,"name":"AspectRatio基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【aspectRatio】 : 宽高比例 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAspectRatio extends StatefulWidget {\n @override\n _CustomAspectRatioState createState() => _CustomAspectRatioState();\n}\n\nclass _CustomAspectRatioState extends State {\n var _ratio = 0.75;\n\n @override\n Widget build(BuildContext context) {\n var child = Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 50,\n height: 50,\n child: Text(\"Static\"),\n );\n\n var box = AspectRatio(\n aspectRatio: _ratio,\n child: Container(\n color: Colors.orange,\n child: Icon(\n Icons.android,\n color: Colors.white,\n )),\n );\n\n return Column(\n children: [\n _buildSlider(),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 300,\n height: 100,\n child: Row(\n children: [child, box, child],\n ),\n ),\n ],\n );\n }\n\n Widget _buildSlider() => Slider(\n divisions: 20,\n min: 0.1,\n max: 2.0,\n label: _ratio.toStringAsFixed(2),\n value: _ratio,\n onChanged: (v) => setState(() => _ratio = v));\n}\n"},{"id":null,"widgetId":69,"name":"ClipPath基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【clipBehavior】 : 裁剪行为 【Clip】\n【clipper】 : 裁剪器 【CustomClipper】","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass CustomClipPath extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ClipPath(\n clipper: ShapeBorderClipper(shape: _StarShapeBorder()),\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n width: 150,\n height: 100,\n fit: BoxFit.cover,\n ),\n );\n }\n}\n\nclass _StarShapeBorder extends ShapeBorder {\n final Path _path = Path();\n\n @override\n EdgeInsetsGeometry get dimensions => null;\n\n @override\n Path getInnerPath(Rect rect, {TextDirection textDirection}) {\n return null;\n }\n\n @override\n Path getOuterPath(Rect rect, {TextDirection textDirection}) =>\n nStarPath(20, rect.height / 2, rect.height / 2 * 0.85,\n dx: rect.width / 2, dy: rect.height / 2);\n\n @override\n void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {}\n\n Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) {\n double perRad = 2 * pi / num;\n double radA = perRad / 2 / 2;\n double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA;\n _path.moveTo(cos(radA) * R + dx, -sin(radA) * R + dy);\n for (int i = 0; i < num; i++) {\n _path.lineTo(\n cos(radA + perRad * i) * R + dx, -sin(radA + perRad * i) * R + dy);\n _path.lineTo(\n cos(radB + perRad * i) * r + dx, -sin(radB + perRad * i) * r + dy);\n }\n _path.close();\n return _path;\n }\n\n @override\n ShapeBorder scale(double t) {\n return null;\n }\n}\n"},{"id":null,"widgetId":75,"name":"Baseline基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【baseline】 : 基线位置 【double】\n【baselineType】 : 基线类型 【TextBaseline】","code":"import 'package:flutter/material.dart';\nclass CustomBaseline extends StatefulWidget {\n @override\n _CustomBaselineState createState() => _CustomBaselineState();\n}\n\nclass _CustomBaselineState extends State {\n double _baseline=20;\n\n @override\n Widget build(BuildContext context) {\n\n var childBox = Text(\n '你好,Flutter',\n style: TextStyle(fontSize: 20,fontFamily: \"Menlo\"),\n );\n\n\n var baseline = Baseline(\n child: childBox,\n baseline: _baseline,\n baselineType: TextBaseline.alphabetic\n );\n\n return Column(\n children: [\n _buildSlider(),\n Container(\n width: 100/0.618,\n height: 100,\n color: Colors.grey.withAlpha(22),\n child: baseline,\n ),\n ],\n );\n }\n\n Widget _buildSlider() => Slider(\n divisions: 20,\n min: 0,\n max: 60,\n label: _baseline.toString(),\n value: _baseline,\n onChanged: (v) => setState(() => _baseline = v));\n}\n"},{"id":null,"widgetId":277,"name":"线性渐变着色","priority":2,"subtitle":" \n通过LinearGradient#createShader创建线性渐变着色器\n着色器相关知识详见【绘制专辑】","code":"import 'package:flutter/material.dart';\nclass LinearShaderMask extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n ShaderMask(\n shaderCallback: _buildShader,\n child: Image.asset(\n 'assets/images/icon_head.png',\n height: 70,\n width: 70,\n ),\n ),\n ShaderMask(\n shaderCallback: _buildShader,\n child: Text(\n '张风捷特烈',\n style: TextStyle(fontSize: 40, color: Colors.white),\n ),\n ),\n ShaderMask(\n shaderCallback: _buildShader,\n child: Container(\n height: 100,\n color: Colors.white,\n width: 50,\n ),\n ),\n ],\n );\n }\n\n final colors = [Colors.red, Colors.yellow, Colors.blue];\n\n Shader _buildShader(Rect bounds) => LinearGradient(\n begin: Alignment.centerLeft,\n end: Alignment.centerRight,\n tileMode: TileMode.mirror,\n colors: colors)\n .createShader(bounds);\n}\n"},{"id":null,"widgetId":277,"name":"径向渐变着色","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【shaderCallback】 : 着色器回调 【ShaderCallback】\n【blendMode】 : 混色模式 【BlendMode】\n 通过RadialGradient#createShader创建径向渐变着色器。","code":"import 'package:flutter/material.dart';\nclass RadialShaderMask extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n ShaderMask(\n shaderCallback: _buildShader,\n child: Image.asset(\n 'assets/images/icon_head.png',\n height: 70,\n width: 70,\n ),\n ),\n ShaderMask(\n shaderCallback: _buildShader,\n child: Text(\n '张风捷特烈',\n style: TextStyle(fontSize: 40, color: Colors.white),\n ),\n ),\n ShaderMask(\n shaderCallback: _buildShader,\n child: Container(\n height: 100,\n color: Colors.white,\n width: 50,\n ),\n ),\n ],\n );\n }\n\n final colors = [Colors.red, Colors.yellow, Colors.blue];\n\n Shader _buildShader(Rect bounds) => RadialGradient(\n center: Alignment.topLeft,\n radius: 1.0,\n tileMode: TileMode.mirror,\n colors: colors)\n .createShader(bounds);\n}"},{"id":null,"widgetId":88,"name":"ColorFiltered基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【colorFilter】 : 滤色器 【ColorFilter】","code":"import 'package:flutter/material.dart';\nimport '../../../../app/utils/color_utils.dart';\nclass CustomColorFiltered extends StatefulWidget {\n @override\n _CustomColorFilteredState createState() => _CustomColorFilteredState();\n}\n\nclass _CustomColorFilteredState extends State {\n Color _color = Colors.blue.withAlpha(88);\n\n @override\n Widget build(BuildContext context) {\n _color = ColorUtils.randomColor();\n return Column(\n children: [\n Wrap(spacing: 10, runSpacing: 10, children: [\n _buildRandomColor(),\n ...BlendMode.values\n .map((mode) => Column(\n children: [\n _buildChild(mode),\n SizedBox(\n height: 10,\n ),\n Text(\n mode.toString().split('.')[1],\n style: TextStyle(fontSize: 10),\n )\n ],\n ))\n .toList()\n ]),\n ],\n );\n ;\n }\n\n Widget _buildChild(m) => Container(\n width: 58,\n height: 58,\n child: ColorFiltered(\n child: Image(image: AssetImage(\"assets/images/icon_head.png\")),\n colorFilter: ColorFilter.mode(_color, m)),\n );\n\n Widget _buildRandomColor() => GestureDetector(\n onTap: () => setState(() {}),\n child: Container(\n alignment: Alignment.center,\n width: 60,\n height: 60,\n decoration: BoxDecoration(color: _color, shape: BoxShape.circle),\n child: Text('点我'),\n ),\n );\n}\n"},{"id":null,"widgetId":298,"name":"IntrinsicHeight基本使用","priority":1,"subtitle":"【child】 : 子组件 【Widget】\n如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。","code":"import 'package:flutter/material.dart';\nclass IntrinsicHeightDemo extends StatefulWidget {\n @override\n _IntrinsicHeightDemoState createState() => _IntrinsicHeightDemoState();\n}\n\nclass _IntrinsicHeightDemoState extends State {\n var _height =120.0;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n buildChild(_height),\n SizedBox(height: 10),\n _buildSlider()\n ],\n ),\n );\n }\n\n Widget buildChild(double leftHeight) {\n return IntrinsicHeight(\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n crossAxisAlignment: CrossAxisAlignment.start,\n children: [\n Container(\n height: leftHeight,\n width: 120,\n color: Colors.yellow,\n alignment: Alignment.center,\n child: Text(\"height:${leftHeight.toStringAsFixed(1)}\"),\n ),\n Container(\n color: Colors.blue,\n width: 150,\n height: 80,\n alignment: Alignment.center,\n child: Text(\"固定高\"),\n ),\n Container(\n color: Colors.red,\n width: 60,\n alignment: Alignment.center,\n child: Text(\"最高\"),\n )\n ],\n ),\n );\n }\n\n Widget _buildSlider() =>Slider(\n value: _height,\n max: 200.0,\n min: 30.0,\n divisions: 17,\n onChanged: (v)=> setState(() => _height= v),\n );\n}\n"},{"id":null,"widgetId":70,"name":"DecoratedBox底线装饰","priority":5,"subtitle":"通过UnderlineTabIndicator对象可指定底线,","code":"import 'package:flutter/material.dart';\nclass UnderlineTabIndicatorDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n decoration: UnderlineTabIndicator(\n insets: EdgeInsets.symmetric(horizontal: 5, vertical: -5),\n borderSide: BorderSide(color: Colors.orange, width: 2)),\n child: Icon(\n Icons.ac_unit,\n color: Colors.blue,\n size: 40,\n ),\n );\n }\n}"},{"id":null,"widgetId":70,"name":"DecoratedBox基本使用","priority":1,"subtitle":" \n【decoration】 : 装饰对象 【Decoration】\n【position】 : 前景色(左)/后景色(右) 【DecorationPosition】","code":"import 'package:flutter/material.dart';\nclass BoxDecorationDemo extends StatelessWidget {\n final rainbow = const [\n 0xffff0000,\n 0xffFF7F00,\n 0xffFFFF00,\n 0xff00FF00,\n 0xff00FFFF,\n 0xff0000FF,\n 0xff8B00FF\n ];\n\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n position: DecorationPosition.background,\n decoration: BoxDecoration(\n gradient: LinearGradient(\n stops: [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0],\n colors: rainbow.map((e) => Color(e)).toList()),\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20), bottomRight: Radius.circular(20)),\n boxShadow: [\n const BoxShadow(\n color: Colors.orangeAccent,\n offset: Offset(1, 1),\n blurRadius: 10,\n spreadRadius: 1),\n ]),\n child: Icon(\n Icons.android,\n size: 80,\n color: Colors.black.withAlpha(123),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":70,"name":"FlutterLogoDecoration装饰","priority":6,"subtitle":"通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用),","code":"import 'package:flutter/material.dart';\nclass FlutterLogoDecorationDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n decoration: FlutterLogoDecoration(\n darkColor: Colors.orange,\n lightColor: Colors.deepPurpleAccent,\n style: FlutterLogoStyle.stacked),\n child: SizedBox(\n width: 100,\n height: 100,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":70,"name":"DecoratedBox形状装饰","priority":4,"subtitle":"通过ShapeDecoration对象可指定边线形状,","code":"import 'package:flutter/material.dart';\nclass ShapeDecorationDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n decoration: ShapeDecoration(\n shadows: [\n const BoxShadow(\n color: Colors.orangeAccent,\n offset: Offset(0, 0),\n blurRadius: 2,\n spreadRadius: 1),\n ],\n image: DecorationImage(\n fit: BoxFit.cover,\n image: AssetImage(\n 'assets/images/wy_200x300.jpg',\n )),\n shape: CircleBorder(\n side: BorderSide(width: 1.0, color: Colors.orangeAccent),\n )),\n child: SizedBox(\n height: 100,\n width: 100,\n child: Icon(\n Icons.ac_unit,\n color: Colors.white,\n size: 40,\n ),\n ),\n );\n }\n}"},{"id":null,"widgetId":70,"name":"DecoratedBox形状和图片装饰","priority":2,"subtitle":" \n【shape】 : 形状 【BoxShape】\n【image】 : 背景图片 【DecorationImage】,","code":"import 'package:flutter/material.dart';\nclass ShapeImageDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n decoration: BoxDecoration(\n shape: BoxShape.circle,\n image: DecorationImage(\n fit: BoxFit.cover,\n image: AssetImage(\n 'assets/images/wy_200x300.jpg',\n ))),\n child: SizedBox(\n height: 80,\n width: 80,\n child: Icon(\n Icons.ac_unit,\n color: Colors.white,\n size: 40,\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":70,"name":"DecoratedBox边线装饰","priority":3,"subtitle":"【border】 : 边线 【BoxBorder】,","code":"import 'package:flutter/material.dart';\nclass BorderDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DecoratedBox(\n position: DecorationPosition.foreground,\n decoration: BoxDecoration(\n border: Border(\n bottom: BorderSide(color: Colors.orange, width: 2),\n top: BorderSide(color: Colors.orange, width: 2)),\n ),\n child: SizedBox(\n height: 80,\n width: 100,\n child: Image.asset(\n 'assets/images/wy_200x300.jpg',\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n}"},{"id":null,"widgetId":85,"name":"Align其他用法","priority":2,"subtitle":" \n由于Alignment对象可指定在父容器中宽高的分率位置\n可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass Ball extends StatelessWidget {\n Ball({\n Key key,\n this.radius = 15,\n this.color = Colors.blue,\n }) : super(key: key);\n final double radius; //半径\n final Color color; //颜色\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: radius * 2,\n height: radius * 2,\n decoration: BoxDecoration(\n shape: BoxShape.circle,\n color: color,\n ),\n );\n }\n}\n\nclass SinLayout extends StatefulWidget {\n SinLayout({\n Key key,\n }) : super(key: key);\n\n @override\n _SinLayoutState createState() => _SinLayoutState();\n}\n\nclass _SinLayoutState extends State {\n var _x = 0.0; //Alignment坐标系上的x坐标\n\n @override\n Widget build(BuildContext context) {\n var item = Container(\n width: 300,\n height: 120,\n color: Colors.black.withAlpha(10),\n child: Align(\n child: Ball(\n color: Colors.orangeAccent,\n ),\n alignment: Alignment(_x, f(_x * pi)),\n ),\n );\n\n var slider = Slider(\n max: 180,\n min: -180,\n divisions: 360,\n label: \"${_x.toStringAsFixed(2)}π\",\n value: _x * 180,\n onChanged: (v) => setState(() => _x = v / 180));\n return Column(\n mainAxisSize: MainAxisSize.min,\n children: [slider, item],\n );\n }\n\n double f(x) {\n //映射函数 -- 可随意指定\n double y = sin(x);\n return y;\n }\n}\n"},{"id":null,"widgetId":278,"name":"BackdropFilter基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【filter】 : 过滤器 【ImageFilter】\nImageFilter.blur可以实现高斯模糊,指定x,y模糊因子。","code":"import 'dart:ui';\nimport 'package:flutter/material.dart';\nclass CustomBackdropFilter extends StatefulWidget {\n @override\n _CustomBackdropFilterState createState() => _CustomBackdropFilterState();\n}\n\nclass _CustomBackdropFilterState extends State {\n double _sigmaX = 1.2;\n double _sigmaY = 1.2;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Stack(\n children: [\n _buildImage(),\n Positioned.fill(\n child: ClipRect(\n child: BackdropFilter(\n filter: ImageFilter.blur(sigmaX: _sigmaX, sigmaY: _sigmaY),\n child: Container(\n color: Colors.black.withAlpha(0),\n ),\n ),\n ),\n )\n ],\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildImage() {\n return Wrap(\n spacing: 20,\n children: [\n Container(\n height: 150,\n width: 150,\n child: Image.asset(\n 'assets/images/sabar.jpg',\n fit: BoxFit.cover,\n ),\n ),\n Container(\n height: 150,\n width: 150,\n child: Image.asset(\n 'assets/images/wy_200x300.jpg',\n fit: BoxFit.cover,\n ),\n ),\n ],\n );\n }\n\n Widget _buildSliders() => Column(\n children: [\n Slider(\n min: 0,\n max: 4,\n value: _sigmaX,\n divisions: 360,\n label: 'x:' + _sigmaX.toStringAsFixed(1),\n onChanged: (v) {\n setState(() {\n _sigmaX = v;\n });\n }),\n Slider(\n min: 0,\n max: 4,\n value: _sigmaY,\n divisions: 360,\n label: 'beta:' + _sigmaY.toStringAsFixed(1),\n onChanged: (v) {\n setState(() {\n _sigmaY = v;\n });\n })\n ],\n );\n}\n"},{"id":null,"widgetId":85,"name":"Align基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomAlign extends StatelessWidget {\n final alignments = [\n Alignment.topLeft,\n Alignment.topCenter,\n Alignment.topRight,\n Alignment.centerLeft,\n Alignment.center,\n Alignment.centerRight,\n Alignment.bottomLeft,\n Alignment.bottomCenter,\n Alignment.bottomRight,\n ];\n\n final alignmentsInfo = [\n \"topLeft\",\n \"topCenter\",\n \"topRight\",\n \"centerLeft\",\n \"center\",\n \"centerRight\",\n \"bottomLeft\",\n \"bottomCenter\",\n \"bottomRight\",\n ];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: alignments\n .toList()\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 100,\n height: 60,\n color: Colors.grey.withAlpha(88),\n child: Align(\n child: Container(\n width: 30,\n height: 30,\n color: Colors.cyanAccent,\n ),\n alignment: mode)),\n Text(alignmentsInfo[alignments.indexOf(mode)])\n ]))\n .toList());\n }\n}"},{"id":null,"widgetId":297,"name":"IntrinsicWidth基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。","code":"import 'package:flutter/material.dart';\nclass IntrinsicWidthDemo extends StatefulWidget {\n @override\n _IntrinsicWidthDemoState createState() => _IntrinsicWidthDemoState();\n}\n\nclass _IntrinsicWidthDemoState extends State {\n var _height =120.0;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n buildChild(_height),\n SizedBox(height: 10),\n _buildSlider()\n ],\n ),\n );\n }\n\n Widget buildChild(double leftWidth) {\n return IntrinsicWidth(\n child: Column(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n crossAxisAlignment: CrossAxisAlignment.start,\n children: [\n Container(\n height: 50,\n width: leftWidth,\n color: Colors.yellow,\n alignment: Alignment.center,\n child: Text(\"width:${leftWidth.toStringAsFixed(1)}\"),\n ),\n Container(\n color: Colors.blue,\n width: 150,\n height: 60,\n alignment: Alignment.center,\n child: Text(\"固定宽\"),\n ),\n Container(\n color: Colors.red,\n height: 40,\n alignment: Alignment.center,\n child: Text(\"最宽\"),\n )\n ],\n ),\n );\n }\n\n Widget _buildSlider() =>Slider(\n value: _height,\n max: 200.0,\n min: 80.0,\n divisions: 17,\n onChanged: (v)=> setState(() => _height= v),\n );\n}\n"},{"id":null,"widgetId":82,"name":"FractionallySizedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【widthFactor】 : 宽分率 【double】\n【heightFactor】 : 高分率 【double】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomFractionallySizedBox extends StatefulWidget {\n @override\n _CustomFractionallySizedBoxState createState() =>\n _CustomFractionallySizedBoxState();\n}\n\nclass _CustomFractionallySizedBoxState\n extends State {\n var _hf = 0.5;\n var _wf = 0.4;\n\n @override\n Widget build(BuildContext context) {\n var box = FractionallySizedBox(\n widthFactor: _wf,\n heightFactor: _hf,\n alignment: Alignment.center,\n child: Container(color: Colors.orange),\n );\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: box),\n _buildSlider()\n ],\n );\n }\n\n Widget _buildSlider() => Column(\n children: [\n Slider(\n divisions: 20,\n min: 0.0,\n max: 2,\n label: '宽分率:' + _wf.toStringAsFixed(1),\n value: _wf,\n onChanged: (v) => setState(() => _wf = v)),\n Slider(\n divisions: 20,\n min: 0.0,\n max: 2,\n label: '高分率:' + _hf.toStringAsFixed(1),\n value: _hf,\n onChanged: (v) => setState(() => _hf = v)),\n ],\n );\n}\n"},{"id":null,"widgetId":73,"name":"Opacity基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【opacity】 : 透明度0~1 【double】","code":"import 'package:flutter/material.dart';\nclass CustomOpacity extends StatefulWidget {\n @override\n _CustomOpacityState createState() => _CustomOpacityState();\n}\n\nclass _CustomOpacityState extends State {\n var _opacity = 0.2;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [_buildSlider(), _buildOpacity()],\n );\n }\n // 创建Opacity\n Widget _buildOpacity() => Opacity(\n opacity: _opacity,\n child: Image.asset(// 图片\n 'assets/images/icon_head.png',\n width: 100,\n ),\n );\n Widget _buildSlider() => Slider(\n divisions: 20,\n label: _opacity.toString(),\n value: _opacity,\n onChanged: (v) => setState(() => _opacity = v));\n}\n"},{"id":null,"widgetId":264,"name":"保存Widget成为图片","priority":2,"subtitle":"通过RenderRepaintBoundary可以获取子组件的Image信息,从而获取字节保存为图片文件。","code":"import 'dart:io';\nimport 'dart:typed_data';\nimport 'dart:ui';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:path_provider/path_provider.dart';\nimport 'dart:ui' as ui;\nimport 'node1_base.dart';\nclass RepaintBoundarySave extends StatelessWidget {\n final GlobalKey _globalKey = GlobalKey();\n\n @override\n Widget build(BuildContext context) {\n return Stack(\n children: [\n RepaintBoundary(\n key: _globalKey,\n child: TempPlayBezier3Page(),\n ),\n Positioned(right: -10, child: _buildButton3(context))\n ],\n );\n }\n\n Widget _buildButton3(context) => MaterialButton(\n child: Icon(\n Icons.save_alt,\n size: 15,\n color: Colors.white,\n ),\n color: Colors.green,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: () async {\n var bits = await _widget2Image(_globalKey);\n var dir = await getApplicationSupportDirectory();\n var file = File(dir.path + \"/save_img.png\");\n var f = await file.writeAsBytes(bits);\n Scaffold.of(context).showSnackBar(SnackBar(\n backgroundColor: Theme.of(context).primaryColor,\n content: Text('保存成功后! 路径为:${f.path}'),\n ));\n });\n\n Future _widget2Image(GlobalKey key) async {\n RenderRepaintBoundary boundary = key.currentContext.findRenderObject();\n //获得 ui.image\n ui.Image img = await boundary.toImage();\n //获取图片字节\n var byteData = await img.toByteData(format: ui.ImageByteFormat.png);\n Uint8List bits = byteData.buffer.asUint8List();\n return bits;\n }\n}\n"},{"id":null,"widgetId":264,"name":"RepaintBoundary基本使用","priority":1,"subtitle":"【child】 : 子组件 【Widget】\n比如上面的绘制视图,即使shouldRepaint为false,在滑动中会也会不断执行paint方法,使用RepaintBoundary可以避免不必要的绘制。","code":"import 'dart:ui';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass RepaintBoundaryDemo extends StatelessWidget{\n @override\n Widget build(BuildContext context) {\n return RepaintBoundary(\n child: TempPlayBezier3Page(),\n );\n }\n}\n\nclass TempPlayBezier3Page extends StatefulWidget {\n @override\n _TempPlayBezier3PageState createState() => _TempPlayBezier3PageState();\n}\n\nclass _TempPlayBezier3PageState extends State {\n List _pos = [];\n int selectPos;\n\n @override\n void initState() {\n _initPoints();\n super.initState();\n }\n\n void _initPoints() {\n _pos = List();\n _pos.add(Offset(0, 0));\n _pos.add(Offset(60, -60));\n _pos.add(Offset(-90, -90));\n _pos.add(Offset(-120, -40));\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n width: MediaQuery.of(context).size.width,\n child: CustomPaint(\n painter: TempBezierPainter(pos: _pos, selectPos: selectPos),\n ),\n );\n }\n}\n\nclass TempBezierPainter extends CustomPainter {\n Paint _gridPaint;\n Path _gridPath;\n\n Paint _mainPaint;\n Path _mainPath;\n int selectPos;\n Paint _helpPaint;\n\n List pos;\n\n TempBezierPainter({this.pos, this.selectPos}) {\n _gridPaint = Paint()..style = PaintingStyle.stroke;\n _gridPath = Path();\n\n _mainPaint = Paint()\n ..color = Colors.orange\n ..style = PaintingStyle.stroke\n ..strokeWidth = 2;\n _mainPath = Path();\n\n _helpPaint = Paint()\n ..color = Colors.purple\n ..style = PaintingStyle.stroke\n ..strokeWidth = 2\n ..strokeCap = StrokeCap.round;\n }\n\n @override\n void paint(Canvas canvas, Size size) {\n print('----------Paint-------');\n canvas.clipRect(Offset.zero & size);\n canvas.translate(size.width / 2, size.height / 2);\n _drawGrid(canvas, size); //绘制格线\n _drawAxis(canvas, size); //绘制轴线\n\n _mainPath.moveTo(pos[0].dx, pos[0].dy);\n _mainPath.cubicTo(\n pos[1].dx, pos[1].dy, pos[2].dx, pos[2].dy, pos[3].dx, pos[3].dy);\n canvas.drawPath(_mainPath, _mainPaint);\n _drawHelp(canvas);\n _drawSelectPos(canvas);\n }\n\n @override\n bool shouldRepaint(CustomPainter oldDelegate) => false;\n\n void _drawGrid(Canvas canvas, Size size) {\n _gridPaint\n ..color = Colors.grey\n ..strokeWidth = 0.5;\n _gridPath = _buildGridPath(_gridPath, size);\n canvas.drawPath(_buildGridPath(_gridPath, size), _gridPaint);\n\n canvas.save();\n canvas.scale(1, -1); //沿x轴镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n\n canvas.save();\n canvas.scale(-1, 1); //沿y轴镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n\n canvas.save();\n canvas.scale(-1, -1); //沿原点镜像\n canvas.drawPath(_gridPath, _gridPaint);\n canvas.restore();\n }\n\n void _drawAxis(Canvas canvas, Size size) {\n canvas.drawPoints(\n PointMode.lines,\n [\n Offset(-size.width / 2, 0),\n Offset(size.width / 2, 0),\n Offset(0, -size.height / 2),\n Offset(0, size.height / 2),\n Offset(0, size.height / 2),\n Offset(0 - 7.0, size.height / 2 - 10),\n Offset(0, size.height / 2),\n Offset(0 + 7.0, size.height / 2 - 10),\n Offset(size.width / 2, 0),\n Offset(size.width / 2 - 10, 7),\n Offset(size.width / 2, 0),\n Offset(size.width / 2 - 10, -7),\n ],\n _gridPaint\n ..color = Colors.blue\n ..strokeWidth = 1.5);\n }\n\n Path _buildGridPath(Path path, Size size, {step = 20.0}) {\n for (int i = 0; i < size.height / 2 / step; i++) {\n path.moveTo(0, step * i);\n path.relativeLineTo(size.width / 2, 0);\n }\n for (int i = 0; i < size.width / 2 / step; i++) {\n path.moveTo(step * i, 0);\n path.relativeLineTo(\n 0,\n size.height / 2,\n );\n }\n return path;\n }\n\n void _drawHelp(Canvas canvas) {\n canvas.drawPoints(PointMode.lines, pos, _helpPaint..strokeWidth = 1);\n canvas.drawPoints(PointMode.points, pos, _helpPaint..strokeWidth = 8);\n }\n\n void _drawSelectPos(Canvas canvas) {\n if (selectPos == null) return;\n canvas.drawCircle(\n pos[selectPos],\n 10,\n _helpPaint\n ..color = Colors.green\n ..strokeWidth = 2);\n }\n}\n"},{"id":null,"widgetId":81,"name":"UnConstrainedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【constrainedAxis】 : 仍受约束的轴*2 【Axis】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomUnConstrainedBox extends StatefulWidget {\n @override\n _CustomUnConstrainedBoxState createState() => _CustomUnConstrainedBoxState();\n}\n\nclass _CustomUnConstrainedBoxState extends State {\n var _value = false;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n children: [_buildUnconstrainedBox(), _buildConstrainedAxis()],\n );\n }\n\n Widget _buildUnconstrainedBox() {\n var child = Container(\n color: Colors.cyanAccent,\n width: 60,\n height: 60,\n child: Switch(\n value: _value,\n onChanged: (v) {\n setState(() {\n _value = v;\n });\n },\n ),\n );\n\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(22),\n width: 150,\n height: 100,\n child: _value\n ? UnconstrainedBox(alignment: Alignment.center, child: child)\n : child,\n ),\n Text(_value ? \"已解除约束\" : \"子组件受约束\")\n ],\n );\n }\n\n Widget _buildConstrainedAxis() {\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(22),\n width: 150,\n height: 100,\n child: UnconstrainedBox(\n alignment: Alignment.center,\n constrainedAxis: Axis.vertical,\n child: Container(\n color: Colors.cyanAccent,\n width: 60,\n height: 60,\n )),\n ),\n Text(\"竖直方向仍约束\")\n ],\n );\n }\n}\n"},{"id":null,"widgetId":201,"name":"AnimatedSize基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【alignment】 : 对齐方式 【AlignmentGeometry】\n【curve】 : 动画曲线 【Duration】\n【vsync】 : vsync 【TickerProvider】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedSize extends StatefulWidget {\n @override\n _CustomAnimatedSizeState createState() => _CustomAnimatedSizeState();\n}\n\nclass _CustomAnimatedSizeState extends State\n with SingleTickerProviderStateMixin {\n final double start = 100;\n final double end = 200;\n\n double _width;\n\n @override\n void initState() {\n _width = start;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n alignment: Alignment.center,\n child: AnimatedSize(\n vsync: this,\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n alignment: Alignment(0, 0),\n child: Container(\n height: 40,\n width: _width,\n alignment: Alignment.center,\n color: Colors.blue,\n child: Text(\n '张风捷特烈',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n ),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(\n value: _width == end,\n onChanged: (v) {\n setState(() {\n _width = v ? end : start;\n });\n });\n}\n"},{"id":null,"widgetId":89,"name":"FadeTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【opacity】 : 动画 【Animation】","code":"import 'package:flutter/material.dart';\nclass CustomFadeTransition extends StatefulWidget {\n @override\n _CustomFadeTransitionState createState() => _CustomFadeTransitionState();\n}\n\nclass _CustomFadeTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 2));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n color: Colors.grey.withAlpha(22),\n width: 100,\n height: 100,\n child: FadeTransition(\n opacity: CurvedAnimation(parent: _ctrl, curve: Curves.linear),\n child: Icon(Icons.android, color: Colors.green, size: 60),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":285,"name":"CustomSingleChildLayout的偏移使用","priority":2,"subtitle":" \n可以利用代理的偏移能力,对子组件进行偏移定位。","code":"import 'package:flutter/material.dart';\nclass OffSetWidgetDemo extends StatelessWidget {\n final data = [\n {\n 'offset': Offset(20, 20),\n 'direction': Direction.topLeft,\n },\n {\n 'offset': Offset(20, -15),\n 'direction': Direction.topRight,\n },\n {\n 'offset': Offset(-15, 20),\n 'direction': Direction.bottomLeft,\n },\n {\n 'offset': Offset(-15, 20),\n 'direction': Direction.bottomLeft,\n },\n {\n 'offset': Offset(15, 20),\n 'direction': Direction.bottomLeft,\n },\n {\n 'offset': Offset(-15, -15),\n 'direction': Direction.topRight,\n },\n ];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n runSpacing: 20,\n children: data\n .map((e) => Container(\n width: 150,\n height: 100,\n alignment: Alignment.topRight,\n color: Colors.grey.withAlpha(11),\n child: OffSetWidget(\n offset: e['offset'],\n direction: e['direction'],\n child: Icon(\n Icons.android,\n size: 30,\n color: Colors.green,\n ),\n )))\n .toList());\n }\n}\n\nclass OffSetWidget extends StatelessWidget {\n final Offset offset;\n final Widget child;\n final Direction direction;\n\n OffSetWidget(\n {this.offset = Offset.zero,\n this.child,\n this.direction = Direction.topLeft});\n\n @override\n Widget build(BuildContext context) {\n return CustomSingleChildLayout(\n delegate: _OffSetDelegate(offset: offset, direction: direction),\n child: child,\n );\n }\n}\n\nenum Direction { topLeft, topRight, bottomLeft, bottomRight }\n\nclass _OffSetDelegate extends SingleChildLayoutDelegate {\n final Offset offset;\n final Direction direction;\n\n _OffSetDelegate(\n {this.offset = Offset.zero, this.direction = Direction.topLeft});\n\n @override\n bool shouldRelayout(_OffSetDelegate oldDelegate) =>\n offset != oldDelegate.offset;\n\n @override\n Offset getPositionForChild(Size size, Size childSize) {\n var w = size.width;\n var h = size.height;\n var wc = childSize.width;\n var hc = childSize.height;\n\n switch (direction) {\n case Direction.topLeft:\n return offset;\n case Direction.topRight:\n return offset.translate(w - wc - offset.dx * 2, 0);\n case Direction.bottomLeft:\n return offset.translate(0, h - hc - offset.dy * 2);\n case Direction.bottomRight:\n return offset.translate(w - wc - offset.dx * 2, h - hc - offset.dy * 2);\n }\n return offset;\n }\n}\n"},{"id":null,"widgetId":285,"name":"CustomSingleChildLayout基本使用","priority":1,"subtitle":" \n【delegate】 : 代理 【SingleChildLayoutDelegate】","code":"import 'package:flutter/material.dart';\nclass CustomSingleChildLayoutDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n print('-------CustomSingleChildLayoutDemo------');\n return Container(\n width: 300,\n height: 200,\n color: Colors.grey.withAlpha(11),\n child: CustomSingleChildLayout(\n delegate: _TolySingleChildLayoutDelegate(),\n child: Container(\n color: Colors.orange,\n ),\n ),\n );\n }\n}\n\nclass _TolySingleChildLayoutDelegate extends SingleChildLayoutDelegate {\n @override\n bool shouldRelayout(SingleChildLayoutDelegate oldDelegate) {\n return true;\n }\n\n @override\n Size getSize(BoxConstraints constraints) {\n print('----getSize:----constraints:$constraints----');\n return super.getSize(constraints);\n }\n\n @override\n Offset getPositionForChild(Size size, Size childSize) {\n print('----getPositionForChild: size:$size----childSize:$childSize----');\n return Offset(size.width / 2, 0);\n }\n\n @override\n BoxConstraints getConstraintsForChild(BoxConstraints constraints) {\n print('----getConstraintsForChild:----constraints:$constraints----');\n return BoxConstraints(\n maxWidth: constraints.maxWidth / 2,\n maxHeight: constraints.maxHeight / 2,\n minHeight: constraints.maxHeight / 4,\n minWidth: constraints.maxWidth / 4,\n );\n }\n}"},{"id":null,"widgetId":74,"name":"Padding单独边距边距","priority":2,"subtitle":" \nEdgeInsets.only用来限定相同的四边边距","code":"import 'package:flutter/material.dart';\nclass PaddingOnly extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 150,\n child: Padding(\n padding: EdgeInsets.only(top:10,left: 10),\n child: _buildChild(),\n ),\n );\n }\n\n Widget _buildChild() {\n return Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Text(\"孩子\"),\n );\n }\n}"},{"id":null,"widgetId":74,"name":"Padding方向边距","priority":3,"subtitle":" \nEdgeInsets.symmetric用来限定水平和竖直方向的边距","code":"import 'package:flutter/material.dart';\nclass PaddingSymmetric extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 150,\n child: Padding(\n padding: EdgeInsets.symmetric(vertical: 30,horizontal: 10),\n child: _buildChild(),\n ),\n );\n }\n\n Widget _buildChild() {\n return Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Text(\"孩子\"),\n );\n }\n}"},{"id":null,"widgetId":74,"name":"Padding四面等边距","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【padding】 : 内四边距 【EdgeInsetsGeometry】\"\nEdgeInsets.all用来限定相同的四边边距","code":"import 'package:flutter/material.dart';\nclass PaddingAll extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 150,\n child: Padding(\n padding: EdgeInsets.all(20),\n child: _buildChild(),\n ),\n );\n }\n\n Widget _buildChild() {\n return Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Text(\"孩子\"),\n );\n }\n}"},{"id":null,"widgetId":66,"name":"ClipOval基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【clipBehavior】 : 裁剪行为 【Clip】\n【clipper】 : 裁剪器 【CustomClipper】","code":"import 'package:flutter/material.dart';\nclass CustomClipOval extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 20,\n children: [\n ClipOval(\n\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n width: 150,\n height: 100,\n ),\n ),\n ClipOval(\n child: Image.asset(\n \"assets/images/wy_300x200.jpg\",\n width: 100,\n height: 100,\n fit: BoxFit.cover,\n ),\n ),\n ],\n );\n }\n}"},{"id":null,"widgetId":263,"name":"FractionalTranslation基本使用","priority":1,"subtitle":"【translation】 : 偏移分度值 【Offset】\n【child】: 子组件 【Widget】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass FractionalTranslationDemo extends StatefulWidget {\n @override\n _FractionalTranslationDemoState createState() =>\n _FractionalTranslationDemoState();\n}\n\nclass _FractionalTranslationDemoState extends State {\n var dx = 0.0;\n var dy = 0.0;\n\n @override\n Widget build(BuildContext context) {\n print(dx);\n return Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n Container(\n width: 200,\n height: 100,\n alignment: Alignment.topLeft,\n color: Colors.grey.withAlpha(33),\n child: FractionalTranslation(\n translation: Offset(dx, dy),\n child: Icon(\n Icons.android,\n color: Colors.green,\n ),\n ),\n ),\n _buildSliderX(),\n _buildSliderY()\n ],\n );\n }\n\n Widget _buildSliderX() => Slider(\n min: -2.0,\n max: 10.0,\n value: dx,\n divisions: 100,\n label: 'dx:${dx.toStringAsFixed(1)}',\n onChanged: (v) => setState(() => dx = v),\n );\n\n\n Widget _buildSliderY() => Slider(\n min: -2.0,\n max: 6.0,\n value: dy,\n divisions: 100,\n label: 'dy:${dy.toStringAsFixed(1)}',\n onChanged: (v) => setState(() => dy = v),\n );\n}\n"},{"id":null,"widgetId":80,"name":"BoxConstraints基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【minWidth】 : 最小宽 【double】\n【minHeight】 : 最小高 【double】\n【maxHeight】 : 最大高 【double】\n【maxWidth】 : 最大宽 【double】","code":"import 'package:flutter/material.dart';\nclass CustomConstrainedBox extends StatefulWidget {\n @override\n _CustomConstrainedBoxState createState() => _CustomConstrainedBoxState();\n}\n\nclass _CustomConstrainedBoxState extends State {\n var _text = '';\n\n @override\n Widget build(BuildContext context) {\n var child = Container(\n alignment: Alignment.center,\n color: Colors.cyanAccent,\n width: 40,\n height: 40,\n child: Text(\"Static\"),\n );\n\n var box = ConstrainedBox(\n constraints: BoxConstraints(\n minHeight: 50,\n minWidth: 20,\n maxHeight: 80,\n maxWidth: 150,\n ),\n child: Container(color: Colors.orange, child: Text(_text)),\n );\n return Column(\n children: [\n Container(\n color: Colors.grey.withAlpha(22),\n width: 300,\n height: 100,\n child: Row(\n children: [child, UnconstrainedBox(child: box), child],\n ),\n ),\n _buildInput(),\n ],\n );\n }\n\n Widget _buildInput() {\n return Padding(\n padding: const EdgeInsets.all(18.0),\n child: TextField(\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n hintText: '请输入',\n ),\n onChanged: (v) {\n setState(() {\n _text = v;\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":87,"name":"FittedBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【fit】 : 适应模式 【BoxFit】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomFittedBox extends StatefulWidget {\n @override\n _CustomFittedBoxState createState() => _CustomFittedBoxState();\n}\n\nclass _CustomFittedBoxState extends State {\n double _childW = 20;\n double _childH = 30;\n\n final rainbow = [\n 0xffff0000,\n 0xffFF7F00,\n 0xffFFFF00,\n 0xff00FF00,\n 0xff00FFFF,\n 0xff0000FF,\n 0xff8B00FF\n ];\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Wrap(\n spacing: 10,\n runSpacing: 10,\n children: BoxFit.values\n .map((mode) => Column(\n children: [\n _buildChild(mode),\n SizedBox(\n height: 10,\n ),\n Text(mode.toString().split('.')[1])\n ],\n ))\n .toList()),\n _buildSlider()\n ],\n );\n }\n\n Widget _buildChild(BoxFit m) {\n return Container(\n color: Colors.grey.withAlpha(44),\n width: 80,\n height: 60,\n child: FittedBox(\n fit: m,\n child: Container(\n width: _childW,\n height: _childH,\n decoration: BoxDecoration(\n //添加渐变色\n gradient: LinearGradient(\n stops: [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0],\n colors: rainbow.map((e) => Color(e)).toList()),\n ),\n ),\n ),\n );\n }\n\n Widget _buildSlider() => Column(\n children: [\n Slider(\n min: 10,\n max: 150,\n divisions: 100,\n label: '子宽度:' + _childW.toStringAsFixed(1),\n value: _childW,\n onChanged: (v) => setState(() => _childW = v)),\n Slider(\n min: 10,\n max: 150,\n divisions: 100,\n label: '子高度:' + _childH.toStringAsFixed(1),\n value: _childH,\n onChanged: (v) => setState(() => _childH = v)),\n ],\n );\n}\n"},{"id":null,"widgetId":78,"name":"平移变换translationValues","priority":2,"subtitle":" \n平移x由R0C3数控制,入参为数值,表示平移长度\n平移y由R1C3数控制,入参为数值,表示平移长度\n平移z由R2C3数控制,入参为数值,表示平移长度","code":"import 'package:flutter/material.dart';\nimport 'matrix4_shower.dart';\nclass TranslationTransform extends StatefulWidget {\n @override\n _TranslationTransformState createState() => _TranslationTransformState();\n}\n\nclass _TranslationTransformState extends State {\n Matrix4 _m4;\n double _x = 0;\n double _y = 0;\n double _z = 0;\n\n @override\n void initState() {\n _m4 = Matrix4.identity();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [_buildTransform(), Matrix4Shower(_m4)],\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildTransform() {\n _m4 = Matrix4.translationValues(_x, _y, _z);\n return Transform(\n transform: _m4,\n child: Container(\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Image.asset(\n 'assets/images/wy_300x200.jpg',\n fit: BoxFit.cover,\n )),\n );\n }\n\n Widget _buildSliders() => Column(\n children: [\n Slider(\n min: -100,\n max: 100,\n value: _x,\n divisions: 360,\n label: 'x:${_x.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _x = v;\n });\n }),\n Slider(\n min: -100,\n max: 100,\n value: _y,\n divisions: 360,\n label: 'y:${_y.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _y = v;\n });\n }),\n Slider(\n min: -100,\n max: 100,\n value: _z,\n divisions: 360,\n label: 'z:${_z.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _z = v;\n });\n })\n ],\n );\n}\n"},{"id":null,"widgetId":78,"name":"斜切变换skew","priority":1,"subtitle":" \n斜切x由R0C1数控制,入参为弧度值,表示斜切角度\n斜切y由R1C0数控制,入参为弧度值,表示斜切角度","code":"import 'dart:math';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'matrix4_shower.dart';\nclass SkewTransform extends StatefulWidget {\n @override\n _SkewTransformState createState() => _SkewTransformState();\n}\n\nclass _SkewTransformState extends State {\n Matrix4 _m4;\n double _alpha = 0;\n double _beta = 0;\n\n @override\n void initState() {\n _m4 = Matrix4.identity();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [_buildTransform(), Matrix4Shower(_m4)],\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildTransform() {\n _m4 = Matrix4.skew(_alpha, _beta);\n return Transform(\n transform: _m4,\n child: Container(\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Image.asset(\n 'assets/images/wy_300x200.jpg',\n fit: BoxFit.cover,\n )),\n );\n }\n\n Widget _buildSliders() => Column(\n children: [\n Slider(\n min: -pi,\n max: pi,\n value: _alpha,\n divisions: 360,\n label: 'alpha:' + (_alpha * 180 / pi).toStringAsFixed(1) + \"°\",\n onChanged: (v) {\n setState(() {\n _alpha = v;\n });\n }),\n Slider(\n min: -pi,\n max: pi,\n value: _beta,\n divisions: 360,\n label: 'beta:' + (_beta * 180 / pi).toStringAsFixed(1) + \"°\",\n onChanged: (v) {\n setState(() {\n _beta = v;\n });\n })\n ],\n );\n}"},{"id":null,"widgetId":78,"name":"透视变换rotation","priority":5,"subtitle":" \n由R3C1、R3C2、R3C3控制透视","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass R3C2 extends StatefulWidget {\n @override\n _R3C2State createState() => _R3C2State();\n}\n\nclass _R3C2State extends State {\n Matrix4 _m4;\n double _value = 0;\n double _rad = 0;\n\n @override\n Widget build(BuildContext context) {\n _m4 = Matrix4.identity()\n// ..setEntry(3, 0, _value) // x\n// ..setEntry(3, 1, _value)// y\n ..setEntry(3, 2, _value) // z\n ..rotateY(_rad)\n// ..rotateX(_rad)\n ;\n return Column(\n children: [\n Transform(\n transform: _m4,\n child: Container(\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Image.asset(\n 'assets/images/wy_300x200.jpg',\n fit: BoxFit.cover,\n )),\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildSliders() => Column(\n children: [\n Slider(\n min: -0.01,\n max: 0.01,\n value: _value,\n divisions: 360,\n label: 'x:${_value.toStringAsFixed(5)}',\n onChanged: (v) {\n setState(() {\n _value = v;\n });\n }),\n Slider(\n min: -pi,\n max: pi,\n value: _rad,\n divisions: 360,\n label: '角度:' + (_rad * 180 / pi).toStringAsFixed(1) + \"°\",\n onChanged: (v) {\n setState(() {\n _rad = v;\n });\n }),\n ],\n );\n}"},{"id":null,"widgetId":78,"name":"旋转变换rotation","priority":4,"subtitle":" \nx旋转由R1C1、R1C2、R2C1、R2C2控制,入参表示弧度\ny旋转由R0C0、R0C2、R2C0、R2C2控制,入参表示弧度\nz旋转由R0C0、R0C1、R1C0、R1C1控制,","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nimport 'matrix4_shower.dart';\nclass RotateTransform extends StatefulWidget {\n @override\n _RotateTransformState createState() => _RotateTransformState();\n}\n\nclass _RotateTransformState extends State {\n Matrix4 _m4;\n double _x = 0;\n int _rotateFlag = 1;\n\n @override\n void initState() {\n _m4 = Matrix4.identity();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [_buildTransform(), Matrix4Shower(_m4)],\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildTransform() {\n if (_rotateFlag == 1) {\n _m4 = Matrix4.rotationX(_x);\n } else if (_rotateFlag == 2) {\n _m4 = Matrix4.rotationY(_x);\n } else {\n _m4 = Matrix4.rotationZ(_x);\n }\n\n return Transform(\n transform: _m4,\n child: Container(\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Image.asset(\n 'assets/images/wy_300x200.jpg',\n fit: BoxFit.cover,\n )),\n );\n }\n\n final Map map = {\n 1: 'rotationX',\n 2: 'rotationY',\n 3: 'rotationZ',\n };\n\n Widget _buildSliders() => Column(\n children: [\n Wrap(\n children: map.keys.map((key) => _buildChild(key)).toList(),\n ),\n Slider(\n min: -pi,\n max: pi,\n value: _x,\n divisions: 360,\n label: 'x:${_x.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _x = v;\n });\n }),\n ],\n );\n\n Padding _buildChild(int key) {\n return Padding(\n padding: const EdgeInsets.all(4.0),\n child: FilterChip(\n selectedColor: Colors.orange.withAlpha(55),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n pressElevation: 5,\n elevation: 3,\n avatar: CircleAvatar(child: Text(key.toString())),\n label: Text(map[key]),\n selected: _rotateFlag == key,\n onSelected: (bool value) {\n print(map[key]);\n setState(() {\n _x = 0;\n if (value) {\n _rotateFlag = key;\n }\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":78,"name":"缩放变换diagonal3Values","priority":3,"subtitle":" \n缩放x由R0C0数控制,入参为数值,表示缩放分率\n缩放y由R1C2数控制,入参为数值,表示缩放分率\n缩放z由R2C2数控制,入参为数值,表示缩放分率","code":"import 'package:flutter/material.dart';\nimport 'matrix4_shower.dart';\nclass ScaleTransform extends StatefulWidget {\n @override\n _ScaleTransformState createState() => _ScaleTransformState();\n}\n\nclass _ScaleTransformState extends State {\n Matrix4 _m4;\n double _x = 1.0;\n double _y = 1.0;\n double _z = 1.0;\n\n @override\n void initState() {\n _m4 = Matrix4.identity();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [_buildTransform(), Matrix4Shower(_m4)],\n ),\n _buildSliders()\n ],\n );\n }\n\n Widget _buildTransform() {\n _m4 = Matrix4.diagonal3Values(_x, _y, _z);\n return Transform(\n transform: _m4,\n child: Container(\n color: Colors.cyanAccent,\n width: 100,\n height: 100,\n child: Image.asset(\n 'assets/images/wy_300x200.jpg',\n fit: BoxFit.cover,\n )),\n );\n }\n\n Widget _buildSliders() => Column(\n children: [\n Slider(\n min: -2,\n max: 2,\n value: _x,\n divisions: 360,\n label: 'x:${_x.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _x = v;\n });\n }),\n Slider(\n min: -2,\n max: 2,\n value: _y,\n divisions: 360,\n label: 'y:${_y.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _y = v;\n });\n }),\n Slider(\n min: -2,\n max: 2,\n value: _z,\n divisions: 360,\n label: 'z:${_z.toStringAsFixed(1)}',\n onChanged: (v) {\n setState(() {\n _z = v;\n });\n })\n ],\n );\n}"},{"id":null,"widgetId":295,"name":"AbsorbPointer基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【absorbing】 : 是否吸收事件 【bool】\n如下,Switch选中时absorbing为true,按钮事件将被吸收,无法点击。","code":"import 'package:flutter/material.dart';\nclass CustomAbsorbPointer extends StatefulWidget {\n @override\n _CustomAbsorbPointerState createState() => _CustomAbsorbPointerState();\n}\n\nclass _CustomAbsorbPointerState extends State {\n bool _absorbing = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n GestureDetector(\n onTap: (){\n print('AbsorbPointer');\n },\n child: AbsorbPointer(\n absorbing: _absorbing,\n child: _buildButton(),\n ),\n ),\n _buildSwitch(),\n Text(!_absorbing ? '允许点击' : '事件已被吸收')\n ],\n ),\n );\n }\n\n Widget _buildButton() => RaisedButton(\n color: Theme.of(context).primaryColor,\n child: Text(\n 'To About',\n style: TextStyle(color: Colors.white),\n ),\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'));\n\n _buildSwitch() => Switch(\n value: _absorbing,\n onChanged: (v) {\n setState(() {\n _absorbing = v;\n });\n });\n}\n"},{"id":null,"widgetId":84,"name":"SizedOverflowBox基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【size】 : 尺寸偏移 【Size】\n【alignment】 : 对齐方式 【AlignmentGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomSizedOverflowBox extends StatefulWidget {\n\n @override\n _CustomSizedOverflowBoxState createState() => _CustomSizedOverflowBoxState();\n}\n\nclass _CustomSizedOverflowBoxState extends State {\n double _x = 50;\n double _y = 44;\n\n @override\n Widget build(BuildContext context) {\n var box = SizedOverflowBox(\n alignment: Alignment.bottomRight,\n size: Size(_x, _y),\n child: Container(width: 30, height: 50, color: Colors.orange),\n );\n return Column(\n children: [\n Container(\n alignment: Alignment.topLeft,\n color: Colors.grey.withAlpha(88),\n width: 250,\n height: 60,\n child: box),\n _buildSlider()\n ],\n );\n }\n\n Widget _buildSlider() =>\n Column(\n children: [\n Slider(\n divisions: 100,\n min: 0,\n max: 250,\n label: 'x:' + _x.toStringAsFixed(1),\n value: _x,\n onChanged: (v) => setState(() => _x = v)),\n Slider(\n divisions: 100,\n min: 0,\n max: 100,\n label: 'y:' + _y.toStringAsFixed(1),\n value: _y,\n onChanged: (v) => setState(() => _y = v)),\n\n ],\n );\n}\n"},{"id":null,"widgetId":192,"name":"SliverOpacity基本使用","priority":1,"subtitle":" \n【opacity】 : 透明度 【double】\n【sliver】 : 子组件 【Function()】","code":"import 'package:flutter/material.dart';\nclass SliverOpacityDemo extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [\n _buildSliverAppBar(),\n SliverPadding(\n padding: EdgeInsets.only(top: 10),\n sliver: SliverOpacity(opacity: 0.2, sliver: _buildSliverGrid()))\n ],\n ),\n );\n }\n\n Widget _buildSliverGrid() => SliverGrid.extent(\n childAspectRatio: 1 / 0.618,\n maxCrossAxisExtent: 180,\n crossAxisSpacing: 5,\n mainAxisSpacing: 5,\n children: data\n .map((e) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: e,\n child: Text(\n colorString(e),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":183,"name":"CustomScrollView基本使用","priority":1,"subtitle":" \n【slivers】 : 子组件列表 【List】\n【reverse】 : 是否反向 【bool】\n【scrollDirection】 : 滑动方向 【Axis】\n【controller】 : 控制器 【ScrollController】","code":"import 'package:flutter/material.dart';\nclass CustomScrollViewDemo extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n anchor: 0,\n scrollDirection: Axis.vertical,\n reverse: false,\n slivers: [_buildSliverAppBar(), _buildSliverFixedExtentList()],\n ),\n );\n }\n\n Widget _buildSliverFixedExtentList() => SliverFixedExtentList(\n itemExtent: 60,\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n\n _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png')),\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n title: Text(\n '张风捷特烈',\n style: TextStyle(color: Colors.black, //标题\n shadows: [\n Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2)\n ]),\n ),\n background: Image.asset(\n \"assets/images/caver.jpeg\", fit: BoxFit.cover,\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":191,"name":"SliverPadding基本使用","priority":1,"subtitle":" \n【sliver】 : 子组件 【Widget】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass SliverPaddingDemo extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [_buildSliverAppBar(), SliverPadding(\n padding: EdgeInsets.only(top: 10),\n sliver\n : _buildSliverGrid())],\n ),\n );\n }\n\n Widget _buildSliverGrid() => SliverGrid.extent(\n childAspectRatio: 1 / 0.618,\n maxCrossAxisExtent: 180,\n crossAxisSpacing: 5,\n mainAxisSpacing: 5,\n children: data\n .map((e) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: e,\n child: Text(\n colorString(e),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":188,"name":"SliverList基本使用","priority":1,"subtitle":" \nSliverGrid.count 指定轴向数量构造\nSliverGrid.extent 指定轴向长度构造\n属性特征同GridView,可详见之","code":"import 'package:flutter/material.dart';\nclass SliverGirdDemo extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [_buildSliverAppBar(), _buildSliverList()],\n ),\n );\n }\n\n Widget _buildSliverList() => SliverGrid.extent(\n childAspectRatio: 1 / 0.618,\n maxCrossAxisExtent: 180,\n crossAxisSpacing: 5,\n mainAxisSpacing: 5,\n children: data\n .map((e) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: e,\n child: Text(\n colorString(e),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":184,"name":"SliverAppBar基本使用","priority":1,"subtitle":" \n【leading】 : 左侧组件 【Widget】\n【title】 : 中间组件 【Widget】\n【actions】 : 尾部组件列表 【List】\n【floating】 : 是否浮动 【bool】\n【pinned】 : 是否顶部停留 【bool】\n【snap】 : 是否半收展 【bool】\n【bottom】 : 底部组件 【PreferredSizeWidget】\n【expandedHeight】 : 延展高度 【double】\n【elevation】 : 影深 【double】\n【flexibleSpace】 : 延展空间 【FlexibleSpaceBar】\n【backgroundColor】 : 背景色 【Color】\n【controller】 : 控制器 【ScrollController】\n snap为true时必需floating为true","code":"import 'package:flutter/material.dart';\nclass SliverAppBarDemo extends StatefulWidget {\n @override\n _SliverAppBarDemoState createState() => _SliverAppBarDemoState();\n}\n\nclass _SliverAppBarDemoState extends State {\n bool _floating = false;\n bool _pinned = false;\n bool _snap = false;\n\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildTool(),\n Container(\n height: 300,\n child: CustomScrollView(\n slivers: [\n _buildSliverAppBar(),\n _buildSliverFixedExtentList()\n ],\n ),\n ),\n ],\n );\n }\n\n Widget _buildSliverAppBar() {\n print(_floating);\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n floating: _floating,\n pinned: _pinned,\n snap: _snap,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(//伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n Widget _buildSliverFixedExtentList() => SliverFixedExtentList(\n itemExtent: 60,\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n\n Widget _buildTool() {\n return Row(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n Wrap(\n direction: Axis.vertical,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Text('floating'),\n Switch(\n value: _floating,\n onChanged: (v) {\n if(_snap&&!v){\n _snap =false;\n }\n setState(() => _floating = v);\n }),\n ],\n ),\n Wrap(\n direction: Axis.vertical,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Text('pinned'),\n Switch(\n value: _pinned,\n onChanged: (v) => setState(() => _pinned = v)),\n ],\n ) ,Wrap(\n direction: Axis.vertical,\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Text('snap'),\n Switch(\n value: _snap,\n onChanged: (v) {\n if(_floating){\n setState(() => _snap = v);\n }\n\n }),\n ],\n )\n ],\n );\n }\n}\n"},{"id":null,"widgetId":185,"name":"SliverList基本使用","priority":1,"subtitle":" \n【delegate】 : 孩子代理 【SliverChildDelegate】","code":"import 'package:flutter/material.dart';\nclass SliverListDemo extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [_buildSliverAppBar(), _buildSliverList()],\n ),\n );\n }\n\n Widget _buildSliverList() => SliverList(\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":307,"name":"SliverOverlapAbsorber基本使用","priority":1,"subtitle":" \n【sliver】 : 子组件 【Widget】\n【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。","code":"import 'package:flutter/material.dart';\nclass SliverOverlapAbsorberDemo extends StatelessWidget {\n final _tabs = ['风神传', '封妖志', \"幻将录\", \"永恒传说\"];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 200,\n child: Scaffold(\n body: DefaultTabController(\n length: _tabs.length,\n child: NestedScrollView(\n headerSliverBuilder:\n (BuildContext context, bool innerBoxIsScrolled) {\n return [\n SliverOverlapAbsorber(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),\n sliver: SliverAppBar(\n title: const Text('旷古奇书'),\n pinned: true,\n elevation: 6, //影深\n expandedHeight: 220.0,\n forceElevated: innerBoxIsScrolled, //为true时展开有阴影\n flexibleSpace: FlexibleSpaceBar(\n background: Image.asset(\n \"assets/images/wy_300x200_filter.jpg\",\n fit: BoxFit.cover,\n ),\n ),\n bottom: TabBar(\n tabs: _tabs\n .map((String name) => Tab(text: name,))\n .toList(),\n ),\n ),\n ),\n ];\n },\n body: _buildTabBarView(),\n ),\n ),\n ));\n }\n\n Widget _buildTabBarView() {\n return TabBarView(\n children: _tabs.map((String name) {\n return SafeArea(\n top: false,\n bottom: false,\n child: Builder(\n builder: (BuildContext context) {\n return CustomScrollView(\n key: PageStorageKey(name),\n slivers: [\n SliverOverlapInjector(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),\n ),\n SliverPadding(\n padding: const EdgeInsets.all(8.0),\n sliver: SliverFixedExtentList(\n itemExtent: 48.0,\n delegate: SliverChildBuilderDelegate(\n (BuildContext context, int index) {\n return ListTile(\n title: Text('《$name》 第 $index章'),\n );\n },\n childCount: 50,\n ),\n ),\n ),\n ],\n );\n },\n ),\n );\n }).toList(),\n );\n }\n}\n"},{"id":null,"widgetId":186,"name":"SliverFixedExtentList基本使用","priority":1,"subtitle":" \n【itemExtent】 : 主轴方向强迫长度 【double】\n【delegate】 : 孩子代理 【SliverChildDelegate】","code":"import 'package:flutter/material.dart';\nclass SliverFixedExtentListDemo extends StatefulWidget {\n @override\n _SliverFixedExtentListDemoState createState() => _SliverFixedExtentListDemoState();\n}\n\nclass _SliverFixedExtentListDemoState extends State {\n final data = [\n Colors.orange[50],\n Colors.orange[100],\n Colors.orange[200],\n Colors.orange[300],\n Colors.orange[400],\n Colors.orange[500],\n Colors.orange[600],\n Colors.orange[700],\n Colors.orange[800],\n Colors.orange[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [_buildSliverAppBar(), _buildSliverList()],\n ),\n );\n }\n\n Widget _buildSliverList() => SliverFixedExtentList(\n itemExtent: 50,\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":189,"name":"SliverToBoxAdapter基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass SliverToBoxAdapterDemo extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: CustomScrollView(\n slivers: [\n _buildSliverAppBar(),\n _buildCommonWidget(),\n _buildSliverList()\n ],\n ),\n );\n }\n\n Widget _buildCommonWidget() => SliverToBoxAdapter(\n child: Container(\n padding: EdgeInsets.symmetric(horizontal: 10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n selected: true,\n contentPadding: EdgeInsets.all(5),\n trailing: Icon(Icons.more_vert),\n ),\n ),\n );\n\n Widget _buildSliverList() => SliverList(\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 2,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":308,"name":"SliverOverlapInjector基本使用","priority":1,"subtitle":" \n【sliver】 : 子组件 【Widget】\n【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。","code":"import 'package:flutter/material.dart';\nclass SliverOverlapInjectorDemo extends StatelessWidget {\n final _tabs = ['风神传', '封妖志', \"幻将录\", \"永恒传说\"];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 200,\n child: Scaffold(\n body: DefaultTabController(\n length: _tabs.length,\n child: NestedScrollView(\n headerSliverBuilder:\n (BuildContext context, bool innerBoxIsScrolled) {\n return [\n SliverOverlapAbsorber(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),\n sliver: SliverAppBar(\n title: const Text('旷古奇书'),\n pinned: true,\n elevation: 6, //影深\n expandedHeight: 220.0,\n forceElevated: innerBoxIsScrolled, //为true时展开有阴影\n flexibleSpace: FlexibleSpaceBar(\n background: Image.asset(\n \"assets/images/wy_300x200_filter.jpg\",\n fit: BoxFit.cover,\n ),\n ),\n bottom: TabBar(\n tabs: _tabs\n .map((String name) => Tab(text: name,))\n .toList(),\n ),\n ),\n ),\n ];\n },\n body: _buildTabBarView(),\n ),\n ),\n ));\n }\n\n Widget _buildTabBarView() {\n return TabBarView(\n children: _tabs.map((String name) {\n return SafeArea(\n top: false,\n bottom: false,\n child: Builder(\n builder: (BuildContext context) {\n return CustomScrollView(\n key: PageStorageKey(name),\n slivers: [\n SliverOverlapInjector(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),\n ),\n SliverPadding(\n padding: const EdgeInsets.all(8.0),\n sliver: SliverFixedExtentList(\n itemExtent: 48.0,\n delegate: SliverChildBuilderDelegate(\n (BuildContext context, int index) {\n return ListTile(\n title: Text('《$name》 第 $index章'),\n );\n },\n childCount: 50,\n ),\n ),\n ),\n ],\n );\n },\n ),\n );\n }).toList(),\n );\n }\n}\n"},{"id":null,"widgetId":187,"name":"SliverFillViewport基本使用","priority":1,"subtitle":" \n【viewportFraction】 : 视口分率 【double】\n【delegate】 : 孩子代理 【SliverChildDelegate】","code":"import 'package:flutter/material.dart';\nclass SliverFillViewportDemo extends StatefulWidget {\n @override\n _SliverFillViewportDemoState createState() => _SliverFillViewportDemoState();\n}\n\nclass _SliverFillViewportDemoState extends State {\n final data = [\n Colors.orange[50],\n Colors.orange[100],\n Colors.orange[200],\n Colors.orange[300],\n Colors.orange[400],\n Colors.orange[500],\n Colors.orange[600],\n Colors.orange[700],\n Colors.orange[800],\n Colors.orange[900],\n ];\n var _viewportFraction = 0.5;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildTool(),\n Container(\n height: 300,\n child: CustomScrollView(\n slivers: [_buildSliverAppBar(), _buildSliverList()],\n ),\n ),\n ],\n );\n }\n\n Widget _buildSliverList() => SliverFillViewport(\n viewportFraction: _viewportFraction,\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 5,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n\n _buildTool() {\n return Slider(\n value: _viewportFraction,\n min: 0.01,\n divisions: 20,\n label: _viewportFraction.toStringAsFixed(1),\n max: 2.0,\n onChanged: (v) => setState(() => _viewportFraction = v));\n }\n}\n"},{"id":null,"widgetId":196,"name":"FlexibleSpaceBar基本使用","priority":1,"subtitle":" \n【title】 : 标题组件 【Widget】\n【titlePadding】 : 标题间距 【EdgeInsetsGeometry】\n【collapseMode】 : 折叠模式 【CollapseMode】\n【stretchModes】 : 延伸模式 【List】\n【background】 : 背景组件 【Widget】\n【centerTitle】 : 是否居中 【bool】","code":"import 'package:flutter/material.dart';\nclass FlexibleSpaceBarDemo extends StatelessWidget {\n\n final data = [\n Colors.blue[50],\n Colors.blue[100],\n Colors.blue[200],\n Colors.blue[300],\n Colors.blue[400],\n Colors.blue[500],\n Colors.blue[600],\n Colors.blue[700],\n Colors.blue[800],\n Colors.blue[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return\n Container(\n height: 300,\n child: CustomScrollView(\n slivers: [\n _buildSliverAppBar(),\n _buildSliverFixedExtentList()\n ],\n ),\n );\n }\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n actions: _buildActions(),\n pinned: true,\n backgroundColor: Colors.blue,\n flexibleSpace: FlexibleSpaceBar(//伸展处布局\n centerTitle: false,\n title: Text('张风捷特烈',style: TextStyle(shadows: [\n Shadow(color: Colors.blue, offset: Offset(1, 1), blurRadius: 2)\n ]),),\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n stretchModes: [StretchMode.blurBackground,StretchMode.zoomBackground],\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n Widget _buildSliverFixedExtentList() => SliverFixedExtentList(\n itemExtent: 60,\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":190,"name":"SliverPersistentHeader基本使用","priority":1,"subtitle":" \n【delegate】 : 代理 【SliverPersistentHeaderDelegate】\n【floating】 : 是否浮动 【bool】\n【pinned】 : 是否顶部停留 【bool】","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass SliverPersistentHeaderDemo extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 500,\n child: CustomScrollView(\n slivers: [\n _buildSliverAppBar(),\n _buildPersistentHeader('袅缈岁月,青丝银发',Color(0xffe7fcc9)),\n _buildCommonWidget(),\n _buildPersistentHeader('以梦为马,不负韶华',Color(0xffcca4ff)),\n _buildSliverList()\n ],\n ),\n );\n }\n\n Widget _buildCommonWidget() => SliverToBoxAdapter(\n child: Container(\n padding: EdgeInsets.symmetric(horizontal: 10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n selected: true,\n contentPadding: EdgeInsets.all(5),\n trailing: Icon(Icons.more_vert),\n ),\n ),\n );\n Widget _buildPersistentHeader(String text,Color color) => SliverPersistentHeader(\n pinned: true,\n delegate: _SliverDelegate(\n minHeight: 40.0,\n maxHeight: 100.0,\n child: Container(\n color: color,\n child: Center(\n child: Text(text, style: TextStyle(\n fontSize: 18,\n shadows: [Shadow(color: Colors.white, offset: Offset(1, 1))]),\n ),\n )),\n ));\n\n Widget _buildSliverList() => SliverList(\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n Widget _buildSliverAppBar() {\n return SliverAppBar(\n expandedHeight: 190.0,\n leading: _buildLeading(),\n title: Text('张风捷特烈'),\n actions: _buildActions(),\n elevation: 2,\n pinned: true,\n backgroundColor: Colors.orange,\n flexibleSpace: FlexibleSpaceBar(\n //伸展处布局\n titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距\n collapseMode: CollapseMode.parallax, //视差效果\n background: Image.asset(\n \"assets/images/caver.jpeg\",\n fit: BoxFit.cover,\n ),\n ),\n );\n }\n\n Widget _buildLeading() => Container(\n margin: EdgeInsets.all(10),\n child: Image.asset('assets/images/icon_head.png'));\n\n List _buildActions() => [\n IconButton(\n onPressed: () {},\n icon: Icon(\n Icons.star_border,\n color: Colors.white,\n ),\n )\n ];\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n\n\nclass _SliverDelegate extends SliverPersistentHeaderDelegate {\n _SliverDelegate({\n @required this.minHeight,\n @required this.maxHeight,\n @required this.child,\n });\n\n final double minHeight; //最小高度\n final double maxHeight; //最大高度\n final Widget child; //孩子\n\n @override\n double get minExtent => minHeight;\n\n @override\n double get maxExtent => max(maxHeight, minHeight);\n\n @override\n Widget build(\n BuildContext context, double shrinkOffset, bool overlapsContent) {\n return new SizedBox.expand(child: child);\n }\n\n @override //是否需要重建\n bool shouldRebuild(_SliverDelegate oldDelegate) {\n return maxHeight != oldDelegate.maxHeight ||\n minHeight != oldDelegate.minHeight ||\n child != oldDelegate.child;\n }\n}"},{"id":null,"widgetId":312,"name":"PerformanceOverlay基本使用","priority":1,"subtitle":"使用PerformanceOverlay.allEnabled可以开始所有的监测项。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass PerformanceOverlayDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return PerformanceOverlay.allEnabled(\n\n );\n }\n}\n\n"},{"id":null,"widgetId":197,"name":"ErrorWidget基本使用","priority":1,"subtitle":" \n入参 : 显示信息 【Object】","code":"import 'package:flutter/material.dart';\nclass ErrorWidgetDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ErrorWidget(\n 'I am Error ErrorWidget\\n'\n 'But now, there has no error.'\n ),\n );\n }\n}\n"},{"id":null,"widgetId":110,"name":"Table基本使用","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【columnWidths】 : 列宽 【Map】\n【defaultColumnWidth】 : 默认列宽 【TableColumnWidth】\n【border】 : 边线 【TableBorder】\n【textDirection】 : 文字方向 【TextDirection】\n【defaultVerticalAlignment】 : 单元格竖直方向对齐模式 【TableCellVerticalAlignment】","code":"import 'package:flutter/material.dart';\nclass CustomTable extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var title = _ItemBean(\"单位称\", \"量纲\", \"单位\", \"单位名称\", \"单位符号\");\n var m = _ItemBean(\"长度\", \"L\", \"1m\", \"米\", \"m\");\n var kg = _ItemBean(\"质量\", \"M\", \"1Kg\", \"千克\", \"Kg\");\n var s = _ItemBean(\"时间\", \"T\", \"1s\", \"秒\", \"s\");\n var a = _ItemBean(\"安培\", \"Ι\", \"1A\", \"安培\", \"A\");\n var k = _ItemBean(\"热力学温度\", \"θ\", \"1K\", \"开尔文\", \"K\");\n var mol = _ItemBean(\"物质的量\", \"N\", \"1mol\", \"摩尔\", \"mol\");\n var cd = _ItemBean(\"发光强度\", \"J\", \"1cd\", \"坎德拉\", \"cd\");\n\n var data = <_ItemBean>[title, m, kg, s, a, k, mol, cd];\n\n return SingleChildScrollView(\n scrollDirection: Axis.horizontal,\n child: Table(\n columnWidths: const {\n 0: FixedColumnWidth(80.0),\n 1: FixedColumnWidth(80.0),\n 2: FixedColumnWidth(80.0),\n 3: FixedColumnWidth(80.0),\n 4: FixedColumnWidth(80.0),\n },\n defaultVerticalAlignment: TableCellVerticalAlignment.middle,\n border: TableBorder.all(\n color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid),\n children: data\n .map((item) => TableRow(children: [\n Center(\n child: Text(\n item.name,\n style: TextStyle(color: Colors.blue),\n )),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.symbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitSymbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitName)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unit)),\n ),\n ]))\n .toList(),\n ),\n );\n }\n}\n\nclass _ItemBean {\n String name;\n String symbol;\n String unit;\n String unitName;\n String unitSymbol;\n\n _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol);\n}\n"},{"id":null,"widgetId":313,"name":"RawImage基本使用","priority":1,"subtitle":"【image】 : 图片 【ui.Image】\n【width】 : 宽 【int】\n【height】: 高 【int】\n【isAntiAlias】: 是否抗锯齿 【bool】\n【filterQuality】: 过滤质量 【FilterQuality】\n很多属性同Image,详见之.","code":"import 'dart:async';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'dart:ui' as ui;\nclass RawImageDemo extends StatefulWidget {\n @override\n _RawImageDemoState createState() => _RawImageDemoState();\n}\n\nclass _RawImageDemoState extends State {\n ui.Image _image;\n\n @override\n void initState() {\n super.initState();\n _loadImageFromAssets('assets/images/icon_head.png');\n }\n\n @override\n Widget build(BuildContext context) {\n if (_image == null)\n return Container(\n width: 80,\n height: 80,\n );\n\n return Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n RawImage(\n image: _image,\n width: 150,\n height: 150,\n isAntiAlias: true,\n filterQuality: FilterQuality.high,\n ),\n Text('isAntiAlias: true'),\n Text('FilterQuality.high')\n ],\n ),\n Column(\n mainAxisSize: MainAxisSize.min,\n children: [\n RawImage(\n image: _image,\n width: 150,\n height: 150,\n isAntiAlias: false,\n ),\n Text('isAntiAlias: false'),\n Text('FilterQuality.low')\n ],\n ),\n ],\n );\n }\n\n void _loadImageFromAssets(String name) async {\n _image = await loadImageByProvider(AssetImage(name));\n\n setState(() {});\n }\n\n //通过ImageProvider读取Image\n Future loadImageByProvider(\n ImageProvider provider, {\n ImageConfiguration config = ImageConfiguration.empty,\n }) async {\n Completer completer = Completer(); //完成的回调\n ImageStreamListener listener;\n ImageStream stream = provider.resolve(config); //获取图片流\n listener = ImageStreamListener((ImageInfo frame, bool sync) {\n //监听\n final ui.Image image = frame.image;\n completer.complete(image); //完成\n stream.removeListener(listener); //移除监听\n });\n stream.addListener(listener); //添加监听\n return completer.future; //返回\n }\n}\n"},{"id":null,"widgetId":338,"name":"ButtonBarTheme基本使用","priority":1,"subtitle":"可指定ButtonBarThemeData数据属性为【后代】的ButtonBar组件设置默认样式,如对齐方式、样式、边距等。也可以用ButtonBarTheme.of获取ButtonBar的主题属性。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass ButtonBarThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ButtonBarTheme(\n child: TempButtonBar(),\n data: ButtonBarTheme.of(context).copyWith(\n alignment: MainAxisAlignment.center,\n buttonPadding: EdgeInsets.symmetric(horizontal: 6),\n overflowDirection: VerticalDirection.up,\n buttonMinWidth: 150,\n buttonHeight: 30,\n buttonTextTheme: ButtonTextTheme.primary));\n }\n}\n\nclass TempButtonBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ButtonBar(\n alignment: MainAxisAlignment.center,\n children: [\n RaisedButton(\n color: Colors.blue, child: Text(\"1.Raised\"), onPressed: () {}),\n OutlineButton(child: Text(\"2.Outline\"), onPressed: () {}),\n FlatButton(\n color: Colors.blue,\n onPressed: () {},\n child: Text(\"3.Flat\"),\n )\n ],\n );\n }\n}\n"},{"id":null,"widgetId":329,"name":"DividerTheme使用","priority":1,"subtitle":" \n属性参数与Divider类似,可以通过DividerTheme.of获取分割线主题数据,\"\n也可以为DividerTheme【后代】的分割线设置默认样式,包括颜色、粗细、高度等。","code":"import 'package:flutter/material.dart';\nclass DividerThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DividerTheme(\n data: DividerThemeData(\n color: Colors.orange,\n thickness: 2,\n space: 10,\n indent: 10,\n endIndent: 10,\n\n ),\n child: Wrap(\n spacing: 10,\n children: [\n Divider(),\n Divider(),\n Divider(),\n Divider(),\n Divider(),\n Container(\n height: 100,\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n VerticalDivider(),\n VerticalDivider(),\n VerticalDivider(),\n VerticalDivider(),\n VerticalDivider(),\n ],\n ),\n )\n ],\n ),\n );\n }\n}"},{"id":null,"widgetId":334,"name":"ListTileTheme基本使用","priority":1,"subtitle":"可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。","code":"import 'package:flutter/material.dart';\nclass ListTileThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ListTileTheme(\n dense: false,\n style: ListTileStyle.list,\n selectedColor: Colors.blue,\n contentPadding: EdgeInsets.only(left: 15,right: 15,top: 5,bottom: 5),\n iconColor: Colors.purple,\n textColor: Colors.orange,\n child: _ListTileSimple(),\n );\n }\n}\n\nclass _ListTileSimple extends StatefulWidget {\n @override\n _ListTileSimpleState createState() => _ListTileSimpleState();\n}\n\nclass _ListTileSimpleState extends State<_ListTileSimple> {\n bool _selected = false;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.all(10),\n color: Colors.grey.withAlpha(22),\n child: ListTile(\n leading: Image.asset(\"assets/images/icon_head.png\"),\n selected: _selected,\n title: Text(\"以梦为马\"),\n subtitle: Text(\"海子\"),\n trailing: Icon(Icons.more_vert),\n onTap: () => setState(() => _selected = !_selected),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":106,"name":"Expanded基本使用","priority":1,"subtitle":" \n【child】 : 孩子 【Widget】\n【flex】 : 剩余空间分配占比 【int】","code":"import 'package:flutter/material.dart';\nimport '../../../../app/utils/color_utils.dart';\nclass CustomExpended extends StatefulWidget {\n @override\n _CustomExpendedState createState() => _CustomExpendedState();\n}\n\nclass _CustomExpendedState extends State {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n buildRow([0, 0, 0]),\n SizedBox(height: 10,),\n buildRow([0, 0, 1]),\n SizedBox(height: 10,),\n buildRow([1, 1, 1]),\n SizedBox(height: 10,),\n buildRow([2, 3, 3]),\n ],\n ),\n );\n }\n\n Widget buildRow(List num) {\n return Row(\n children: num.map((e) => Expanded(\n flex: e,\n child: Container(\n alignment: Alignment.center,\n width: 50,\n height: 50,\n color: ColorUtils.randomColor(),\n child: Text(\n 'flex=$e',\n style: TextStyle(color: Colors.white),\n ),\n ),\n )).toList());\n }\n}\n"},{"id":null,"widgetId":181,"name":"DropDownButtonHideUnderline使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】,","code":"import 'package:flutter/material.dart';\nclass CustomDropDownButtonHideUnderline extends StatefulWidget {\n @override\n _CustomDropDownButtonHideUnderlineState createState() =>\n _CustomDropDownButtonHideUnderlineState();\n}\n\nclass _CustomDropDownButtonHideUnderlineState\n extends State {\n Color _color = Colors.red;\n final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n final _info = [\"红色\", \"黄色\", \"蓝色\", \"绿色\"];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n margin: EdgeInsets.symmetric(horizontal: 20),\n width: 50,\n height: 50,\n color: _color,\n ),\n DropdownButtonHideUnderline(\n child: DropdownButton(\n value: _color,\n elevation: 1,\n icon: Icon(\n Icons.expand_more,\n size: 20,\n color: _color,\n ),\n items: _buildItems(),\n onChanged: (v) => setState(() => _color = v)),\n ),\n ],\n );\n }\n\n List> _buildItems() => _colors\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(\n _info[_colors.indexOf(e)],\n style: TextStyle(color: e),\n )))\n .toList();\n}\n"},{"id":null,"widgetId":331,"name":"SliderTheme使用","priority":1,"subtitle":" \n可通过SliderTheme.of获取Slider主题数据对象,其中包含大量属性用于对Slider的设定。\"\n可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass SliderThemeDemo extends StatefulWidget {\n @override\n _SliderThemeDemoState createState() => _SliderThemeDemoState();\n}\n\nclass _SliderThemeDemoState extends State {\n var _bliss = 0.5;\n\n @override\n Widget build(BuildContext context) {\n return SliderTheme(\n data: SliderTheme.of(context).copyWith(activeTrackColor: Colors.orange),\n child: Slider(\n min: 0.0,\n max: 200.0,\n divisions: 10,\n label: \"${_bliss.toStringAsFixed(1)}\",\n onChanged: (double value) {\n setState(() {\n _bliss = value;\n });\n },\n value: _bliss,\n ),\n );\n }\n}"},{"id":null,"widgetId":333,"name":"TooltipTheme基本使用","priority":1,"subtitle":"可指定TooltipThemeData数据属性为【后代】的Tooltip组件设置默认样式,如装饰、文字样式、显示时长、边距等。也可以用TooltipTheme.of获取Tooltip的主题属性。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass TooltipThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return TooltipTheme(\n child: TempTooltip(),\n data: TooltipTheme.of(context).copyWith(\n preferBelow: false,\n padding: EdgeInsets.all(5),\n verticalOffset: 20,\n margin: EdgeInsets.all(2),\n textStyle: TextStyle(\n color: Colors.red,\n shadows: [Shadow(color: Colors.white, offset: Offset(1, 1))]),\n decoration: BoxDecoration(boxShadow: [\n BoxShadow(\n color: Colors.orangeAccent,\n offset: Offset(1, 1),\n blurRadius: 8)\n ])));\n }\n}\n\nclass TempTooltip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Tooltip(\n message: \"天王盖地虎\",\n child: Icon(Icons.info_outline)),\n Tooltip(\n message: \"宝塔镇河妖\",\n child: Icon(Icons.info_outline)),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":331,"name":"SliderTheme对Slider的样式定制","priority":2,"subtitle":" \n通过thumbShape和valueIndicatorShape可以对Slider进行样式定制。\"\n注: 本例参考flutter-gallery中的SlideDemo","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass DIYSliderTheme extends StatefulWidget {\n @override\n _DIYSliderThemeState createState() => _DIYSliderThemeState();\n}\n\nclass _DIYSliderThemeState extends State {\n var _bliss = 0.5;\n\n @override\n Widget build(BuildContext context) {\n final ThemeData theme = Theme.of(context);\n\n return SliderTheme(\n data: theme.sliderTheme.copyWith(\n activeTrackColor: Colors.deepPurple,\n inactiveTrackColor: Colors.blue.withAlpha(55),\n activeTickMarkColor: theme.colorScheme.onSurface.withOpacity(0.7),\n inactiveTickMarkColor: theme.colorScheme.surface.withOpacity(0.7),\n overlayColor: theme.colorScheme.onSurface.withOpacity(0.12),\n thumbColor: Colors.deepPurple,\n valueIndicatorColor: Colors.deepPurpleAccent,\n thumbShape: _CustomThumbShape(),\n valueIndicatorShape: _CustomValueIndicatorShape(),\n valueIndicatorTextStyle: theme.accentTextTheme.body2\n .copyWith(color: theme.colorScheme.onSurface),\n ),\n child: Slider(\n min: 0.0,\n max: 200.0,\n divisions: 10,\n label: \"${_bliss.toStringAsFixed(1)}\",\n onChanged: (double value) {\n setState(() {\n _bliss = value;\n });\n },\n value: _bliss,\n ),\n );\n }\n}\n\nclass _CustomThumbShape extends SliderComponentShape {\n static const double _thumbSize = 4.0;\n static const double _disabledThumbSize = 3.0;\n\n @override\n Size getPreferredSize(bool isEnabled, bool isDiscrete) {\n return isEnabled\n ? const Size.fromRadius(_thumbSize)\n : const Size.fromRadius(_disabledThumbSize);\n }\n\n static final Animatable sizeTween = Tween(\n begin: _disabledThumbSize,\n end: _thumbSize,\n );\n\n @override\n void paint(PaintingContext context, Offset center,\n {Animation activationAnimation,\n Animation enableAnimation,\n bool isDiscrete,\n TextPainter labelPainter,\n RenderBox parentBox,\n SliderThemeData sliderTheme,\n TextDirection textDirection,\n double value,\n double textScaleFactor,\n Size sizeWithOverflow}) {\n final Canvas canvas = context.canvas;\n final ColorTween colorTween = ColorTween(\n begin: sliderTheme.disabledThumbColor,\n end: sliderTheme.thumbColor,\n );\n final double size = _thumbSize * sizeTween.evaluate(enableAnimation);\n final Path thumbPath = _downTriangle(size, center);\n canvas.drawPath(\n thumbPath, Paint()..color = colorTween.evaluate(enableAnimation));\n }\n}\n\nPath _upTriangle(double size, Offset thumbCenter) =>\n _downTriangle(size, thumbCenter, invert: true);\n\nPath _downTriangle(double size, Offset thumbCenter, {bool invert = false}) {\n final Path thumbPath = Path();\n final double height = sqrt(3.0) / 2.0;\n final double centerHeight = size * height / 3.0;\n final double halfSize = size / 2.0;\n final double sign = invert ? -1.0 : 1.0;\n thumbPath.moveTo(\n thumbCenter.dx - halfSize, thumbCenter.dy + sign * centerHeight);\n thumbPath.lineTo(thumbCenter.dx, thumbCenter.dy - 2.0 * sign * centerHeight);\n thumbPath.lineTo(\n thumbCenter.dx + halfSize, thumbCenter.dy + sign * centerHeight);\n thumbPath.close();\n return thumbPath;\n}\n\nclass _CustomValueIndicatorShape extends SliderComponentShape {\n static const double _indicatorSize = 4.0;\n static const double _disabledIndicatorSize = 3.0;\n static const double _slideUpHeight = 30.0;\n\n @override\n Size getPreferredSize(bool isEnabled, bool isDiscrete) {\n return Size.fromRadius(isEnabled ? _indicatorSize : _disabledIndicatorSize);\n }\n\n static final Animatable sizeTween = Tween(\n begin: _disabledIndicatorSize,\n end: _indicatorSize,\n );\n\n @override\n void paint(PaintingContext context, Offset center,\n {Animation activationAnimation,\n Animation enableAnimation,\n bool isDiscrete,\n TextPainter labelPainter,\n RenderBox parentBox,\n SliderThemeData sliderTheme,\n TextDirection textDirection,\n double value,\n double textScaleFactor,\n Size sizeWithOverflow}) {\n final Canvas canvas = context.canvas;\n final ColorTween enableColor = ColorTween(\n begin: sliderTheme.disabledThumbColor,\n end: sliderTheme.valueIndicatorColor,\n );\n final Tween slideUpTween = Tween(\n begin: 0.0,\n end: _slideUpHeight,\n );\n final double size = _indicatorSize * sizeTween.evaluate(enableAnimation);\n final Offset slideUpOffset =\n Offset(0.0, -slideUpTween.evaluate(activationAnimation));\n final Path thumbPath = _upTriangle(size, center + slideUpOffset);\n final Color paintColor = enableColor\n .evaluate(enableAnimation)\n .withAlpha((255.0 * activationAnimation.value).round());\n canvas.drawPath(\n thumbPath,\n Paint()..color = paintColor,\n );\n canvas.drawLine(\n center,\n center + slideUpOffset,\n Paint()\n ..color = paintColor\n ..style = PaintingStyle.stroke\n ..strokeWidth = 2.0);\n labelPainter.paint(\n canvas,\n center +\n slideUpOffset +\n Offset(-labelPainter.width / 2.0, -labelPainter.height - 4.0));\n }\n}\n"},{"id":null,"widgetId":328,"name":"ChipTheme基本使用","priority":1,"subtitle":"可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。","code":"import 'package:flutter/material.dart';\nclass ChipThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ChipTheme(\n data: ChipTheme.of(context).copyWith(\n selectedColor: Colors.orange.withAlpha(55),\n selectedShadowColor: Colors.blue,\n shadowColor: Colors.orangeAccent,\n pressElevation: 5,\n elevation: 3,\n ),\n child: CustomFilterChip(),\n );\n }\n}\n\nclass CustomFilterChip extends StatefulWidget {\n @override\n _CustomFilterChipState createState() => _CustomFilterChipState();\n}\n\nclass _CustomFilterChipState extends State {\n final Map map = {\n 'A': 'Ant',\n 'B': 'Bug',\n 'C': 'Cat',\n 'D': 'Dog',\n };\n List _selected = [];\n\n @override\n Widget build(BuildContext context) {\n return Column(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n Wrap(\n children: map.keys.map((key) => _buildChild(key)).toList(),\n ),\n Container(\n padding: EdgeInsets.all(10),\n child: Text('您已选择: ${_selected.join(', ')}')),\n ],\n );\n }\n\n Padding _buildChild(String key) {\n return Padding(\n padding: const EdgeInsets.all(4.0),\n child: FilterChip(\n avatar: CircleAvatar(child: Text(key)),\n label: Text(map[key]),\n selected: _selected.contains(map[key]),\n onSelected: (bool value) {\n setState(() {\n if (value) {\n _selected.add(map[key]);\n } else {\n _selected.removeWhere((name) => name == map[key]);\n }\n });\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":315,"name":"LayoutId使用场景","priority":1,"subtitle":" \n【id】 : 标识id 【Object】\n【child】 : 子组件 【Widget】","code":"import 'dart:io';\nimport 'package:flutter/material.dart';\nclass LayoutIdDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n height: 150,\n color: Colors.grey.withAlpha(33),\n child: CustomMultiChildLayout(\n delegate: CornerCustomMultiChildLayout(\n padding:EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5),\n ),\n children: [\n LayoutId(id: CornerType.topLeft, child: Box50(Colors.red)),\n LayoutId(id: CornerType.topRight, child: Box50(Colors.yellow)),\n LayoutId(id: CornerType.bottomLeft, child: Box50(Colors.blue)),\n LayoutId(id: CornerType.bottomRight, child: Box50(Colors.green)),\n ],\n ),\n );\n }\n}\n\n// 50 颜射盒\nclass Box50 extends StatelessWidget {\n final Color color;\n Box50(this.color);\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 50,\n height: 50,\n color: color,\n );\n }\n}\n\n\nenum CornerType{\n topLeft,\n topRight,\n bottomLeft,\n bottomRight\n}\n\n\nclass CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{\n final EdgeInsets padding;\n \n CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero});\n\n @override\n void performLayout(Size size) {\n if (hasChild(CornerType.topLeft)) {\n layoutChild(CornerType.topLeft, BoxConstraints.loose(size));\n positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top));\n }\n if (hasChild(CornerType.topRight)) {\n var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size));\n positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top));\n }\n if (hasChild(CornerType.bottomLeft)) {\n var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size));\n positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom));\n }\n if (hasChild(CornerType.bottomRight)) {\n var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size));\n positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom));\n }\n }\n\n @override\n bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding;\n \n}\n\n"},{"id":null,"widgetId":327,"name":"MaterialBannerTheme基本使用","priority":1,"subtitle":"可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。","code":"import 'package:flutter/material.dart';\nclass MaterialBannerThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialBannerTheme(\n data: MaterialBannerTheme.of(context).copyWith(\n backgroundColor: Colors.purple,\n padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2),\n leadingPadding:EdgeInsetsDirectional.only(end: 16.0) ,\n contentTextStyle: TextStyle(color: Colors.white),\n ),\n child: _MaterialBannerDemo(),\n );\n }\n}\n\n\nclass _MaterialBannerDemo extends StatelessWidget {\n final info =\n 'A banner displays an important, succinct message, and provides actions for users to address. '\n 'A user action is required for itto be dismissed.';\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [MaterialBanner(\n content: Text(info),\n leading: Icon(Icons.warning, color: Colors.yellow),\n actions: [\n RaisedButton(\n color: Colors.white,\n onPressed: () {},\n child: Text(\n 'I KNOW',\n style: TextStyle(\n color: Colors.purple,\n fontWeight: FontWeight.bold,\n fontSize: 14),\n ),\n ),\n\n RaisedButton(\n color: Colors.white,\n onPressed: () {},\n child: Text(\n 'I IGNORE',\n style: TextStyle(\n color: Colors.purple,\n fontWeight: FontWeight.bold,\n fontSize: 14),\n ),\n ),\n ],\n )],\n );\n }\n}"},{"id":null,"widgetId":109,"name":"Flexible基本使用","priority":1,"subtitle":" \n【child】 : 孩子 【Widget】\n【fit】 : 适应模式*2 【FlexFit】\n【flex】 : 剩余空间分配占比 【int】","code":"import 'package:flutter/material.dart';\nclass CustomFlexible extends StatefulWidget {\n @override\n _CustomFlexibleState createState() => _CustomFlexibleState();\n}\n\nclass _CustomFlexibleState extends State {\n double _width = 300.0;\n bool _loose = false;\n\n @override\n Widget build(BuildContext context) {\n return Column(children: [\n Container(\n color: Colors.grey.withAlpha(33),\n width: _width,\n padding: EdgeInsets.all(8.0),\n child: Row(\n children: [\n Flexible(\n flex: 2,\n child: Container(\n alignment: Alignment.center,\n height: 50,\n color: Colors.red,\n child: Text(\n 'flex=2',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n Flexible(\n flex: 3,\n child: Container(\n alignment: Alignment.center,\n height: 50,\n color: Colors.blue,\n child: Text(\n 'flex=3',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n Flexible(\n flex: 4,\n fit: _loose?FlexFit.loose:FlexFit.tight,\n child: Container(\n constraints: BoxConstraints(maxWidth: 60),\n alignment: Alignment.center,\n height: 50,\n color: Colors.green,\n child: Text(\n 'flex=4 \\nfit:${_loose?'loose':'tight'}',\n style: TextStyle(color: Colors.white),\n ),\n ),\n )\n ],\n )),\n _buildOp()\n ]);\n }\n\n Widget _buildOp() {\n return Row(\n children: [\n Switch(\n value: _loose,\n onChanged: (v) => setState(() => _loose = v)),\n Expanded(\n child: Slider(\n divisions: 10,\n min: 100,\n max: 350,\n value: _width,\n onChanged: (v) => setState(() => _width = v)),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":180,"name":"ScrollConfiguration基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【behavior】 : 滑动行为 【ScrollBehavior】\n 可以使用ScrollConfiguration让ListView无蓝色阴影","code":"import 'package:flutter/material.dart';\nclass CustomScrollConfiguration extends StatelessWidget {\n final data = [\n Colors.cyan[50],\n Colors.cyan[100],\n Colors.cyan[200],\n Colors.cyan[300],\n Colors.cyan[400],\n Colors.cyan[500],\n Colors.cyan[600],\n Colors.cyan[700],\n Colors.cyan[800],\n Colors.cyan[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ScrollConfiguration(\n behavior: NoScrollBehavior(), child: _buildListView()),\n );\n }\n\n Widget _buildListView() => ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n\nclass NoScrollBehavior extends ScrollBehavior {\n @override\n Widget buildViewportChrome(\n BuildContext context, Widget child, AxisDirection axisDirection) =>\n child;\n}\n"},{"id":null,"widgetId":108,"name":"Positioned基本使用","priority":1,"subtitle":" \n【child】 : 组件 【Widget】\n【top】 : 到父顶距离 【double】\n【right】 : 到父右距离 【double】\n【left】 : 到父左距离 【double】\n【bottom】 : 到父底距离 【double】","code":"import 'package:flutter/material.dart';\nclass CustomPositioned extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var yellowBox = Container(\n color: Colors.yellow,\n height: 100,\n width: 100,\n );\n\n var redBox = Container(\n color: Colors.red,\n height: 90,\n width: 90,\n );\n\n var greenBox = Container(\n color: Colors.green,\n height: 80,\n width: 80,\n );\n\n var cyanBox = Container(\n color: Colors.cyanAccent,\n height: 70,\n width: 70,\n );\n\n return Container(\n width: 200,\n height: 120,\n color: Colors.grey.withAlpha(33),\n child: Stack(\n children: [\n yellowBox,\n redBox,\n Positioned(top: 20, left: 20, child: greenBox),\n Positioned(\n child: cyanBox,\n bottom: 10,\n right: 10,\n )\n ],\n ));\n }\n}\n"},{"id":null,"widgetId":332,"name":"ToggleButtonsTheme基本使用","priority":1,"subtitle":"可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。","code":"import 'package:flutter/material.dart';\nclass ToggleButtonsThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ToggleButtonsTheme(\n data: ToggleButtonsTheme.of(context).copyWith(\n borderWidth: 1,\n borderColor: Colors.orangeAccent,\n selectedBorderColor: Colors.blue,\n splashColor: Colors.purple.withAlpha(66),\n borderRadius: BorderRadius.circular(10),\n selectedColor: Colors.red,\n fillColor: Colors.green.withAlpha(11),\n ),\n child: _ToggleButtonsSimple(),\n );\n }\n}\n\n\nclass _ToggleButtonsSimple extends StatefulWidget {\n @override\n _ToggleButtonsSimpleState createState() => _ToggleButtonsSimpleState();\n}\n\nclass _ToggleButtonsSimpleState extends State<_ToggleButtonsSimple> {\n var _isSelected = [true, false, false];\n\n @override\n Widget build(BuildContext context) {\n return ToggleButtons(\n children: [\n Icon(Icons.skip_previous),\n Icon(Icons.pause),\n Icon(Icons.skip_next),\n ],\n isSelected: _isSelected,\n onPressed: (value) => setState(() {\n _isSelected = _isSelected.map((e) => false).toList();\n _isSelected[value] = true;\n }),\n );\n }\n}"},{"id":null,"widgetId":167,"name":"MediaQuery获取数据信息","priority":1,"subtitle":" \nMediaQuery.of(context)可以获取MediaQueryData","code":"import 'package:flutter/material.dart';\nclass CustomMediaQuery extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var queryData = MediaQuery.of(context);\n var data = {\n \"size\": queryData.size,\n \"devicePixelRatio\": queryData.devicePixelRatio.toStringAsFixed(1),\n \"textScaleFactor\": queryData.textScaleFactor.toStringAsFixed(1),\n \"platformBrightness\": queryData.platformBrightness,\n \"padding\": queryData.padding,\n \"viewInsets\": queryData.viewInsets,\n \"systemGestureInsets\": queryData.padding,\n \"viewPadding\": queryData.padding,\n \"physicalDepth\": queryData.padding,\n \"alwaysUse24HourFormat\": queryData.padding,\n \"accessibleNavigation\": queryData.alwaysUse24HourFormat,\n \"invertColors\": queryData.invertColors,\n \"highContrast\": queryData.highContrast,\n \"disableAnimations\": queryData.disableAnimations,\n \"boldText\": queryData.boldText,\n };\n\n return Container(\n height: 200,\n color: Colors.grey.withAlpha(11),\n child:ListView(\n children: data.keys.map((e) => buildItem(e, data)).toList(),\n ),\n );\n }\n\n Widget buildItem(String e, Map data) => Column(\n children: [\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceBetween,\n children: [\n Text(\n e,\n style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n ),\n Text(\n data[e].toString(),\n style: TextStyle(fontSize: 16, color: Colors.orange),\n )\n ],\n ),\n ),\n Divider(\n height: 1,\n )\n ],\n );\n}\n\n\n"},{"id":null,"widgetId":325,"name":"IconTheme使用","priority":1,"subtitle":" \n可以通过IconTheme.of获取图标主题数据,也可以为IconTheme【后代】的图标组件设置默认样式,包括颜色、透明度、尺寸。","code":"import 'package:flutter/material.dart';\nclass IconThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return IconTheme(\n data: IconThemeData(\n color: Colors.purple,\n opacity: 1.0,\n size: 30\n ),\n child: Wrap(\n spacing: 10,\n children: [\n Icon(Icons.add),\n Icon(Icons.ac_unit),\n Icon(Icons.g_translate),\n Icon(Icons.remove)\n ],\n ),\n );\n }\n}"},{"id":null,"widgetId":324,"name":"DefaultTextStyle使用","priority":1,"subtitle":" \n各属性同Text,详见之。\n其功能是: 设置默认的文字样式应用于【后代组件】,注意后代组件也可以指定自身的样式","code":"import 'package:flutter/material.dart';\nclass DefaultTextStyleDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return DefaultTextStyle(\n style: TextStyle(\n fontSize: 18,\n color: Colors.blue,\n decoration: TextDecoration.underline),\n child: Wrap(\n spacing: 5,\n children: [\n Text(\"Hello,\",),\n FlutterLogo(),\n Text(\"Flutter\",style: TextStyle(color: Colors.red),),\n Text(\"Unit.\"),\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":330,"name":"PopupMenuTheme基本使用","priority":1,"subtitle":"可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。","code":"import 'package:flutter/material.dart';\nclass PopupMenuThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return PopupMenuTheme(\n data: PopupMenuTheme.of(context).copyWith(\n color: Colors.orangeAccent,\n elevation: 1,\n textStyle: TextStyle(color: Colors.white),\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n ),\n child: _PopupMenuButtonSimple(),\n );\n }\n}\n\nclass _PopupMenuButtonSimple extends StatefulWidget {\n @override\n _PopupMenuButtonSimpleState createState() => _PopupMenuButtonSimpleState();\n}\n\nclass _PopupMenuButtonSimpleState extends State<_PopupMenuButtonSimple> {\n final map = {\n \"关于\": Icons.info_outline,\n \"帮助\": Icons.help_outline,\n \"反馈\": Icons.add_comment,\n };\n\n @override\n Widget build(BuildContext context) {\n return PopupMenuButton(\n itemBuilder: (context) => buildItems(),\n offset: Offset(0, 50),\n onSelected: print,\n onCanceled: () => print('onCanceled'),\n );\n }\n\n List> buildItems() {\n return map.keys\n .toList()\n .map((e) => PopupMenuItem(\n value: e,\n child: Wrap(\n spacing: 6,\n children: [\n Icon(\n map[e],\n ),\n Text(e),\n ],\n )))\n .toList();\n }\n}"},{"id":null,"widgetId":326,"name":"ButtonTheme使用","priority":1,"subtitle":" \n属性参数同MaterialButton,可以通过ButtonTheme.of获取按钮主题数据,\"\n也可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。","code":"import 'package:flutter/material.dart';\nclass ButtonThemeDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return ButtonTheme(\n buttonColor: Colors.orange,\n splashColor: Colors.blue,\n minWidth: 40,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n child: Wrap(\n spacing: 10,\n children: [\n RaisedButton(onPressed: (){},child: Icon(Icons.add)),\n FlatButton(onPressed: (){},child: Icon(Icons.add)),\n OutlineButton(onPressed: (){},child: Icon(Icons.add)),\n MaterialButton(onPressed: (){},child: Icon(Icons.add)),\n ],\n ),\n );\n }\n}"},{"id":null,"widgetId":161,"name":"IndexedStack基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【Lis】\n【alignment】 : 对齐方式 【AlignmentGeometry】\n【index】 : 当前显示组件 【int】","code":"import 'package:flutter/material.dart';\nclass CustomIndexedStack extends StatefulWidget {\n @override\n _CustomIndexedStackState createState() => _CustomIndexedStackState();\n}\n\nclass _CustomIndexedStackState extends State {\n var _index = 1;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n width: 200,\n height: 100,\n color: Colors.grey.withAlpha(33),\n child: IndexedStack(\n index: _index,\n children: [\n Container(\n color: Colors.red,\n width: 80,\n height: 80,\n ),\n Positioned(\n bottom: 10,\n right: 10,\n child: Container(\n color: Colors.blue,\n width: 80,\n height: 80,\n ),\n )\n ],\n ),\n ),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(\n value: _index == 0,\n onChanged: (v) => setState(() => _index = v ? 0 : 1),\n );\n}\n"},{"id":null,"widgetId":340,"name":"Viewport的基本使用","priority":1,"subtitle":"【offset】 : *视口偏移量 【ViewportOffset】\n【cacheExtentStyle】: 预加载类型 【CacheExtentStyle】\n【cacheExtent】: 预加载量 【double】\n【axisDirection】: 滑动方向 【AxisDirection】\n【slivers】: 子Sliver组件集 【List】\n【anchor】: 锚点 【double】\n可以运行这些代码,查看ColorItem的构建情况,128个色条并非一次性全部构建。","code":"import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nclass ViewportDemo extends StatelessWidget {\n final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 250,\n child: Scrollable(\n axisDirection: AxisDirection.down,\n physics: BouncingScrollPhysics(),\n dragStartBehavior: DragStartBehavior.start,\n viewportBuilder: (ctx, position) => Viewport(\n axisDirection: AxisDirection.down,\n cacheExtent: 200,\n anchor: 0,\n cacheExtentStyle: CacheExtentStyle.pixel,\n offset: position,\n slivers: [_buildSliverList()],\n ),\n ),\n );\n }\n\n Widget _buildSliverList() => SliverList(\n delegate: SliverChildBuilderDelegate(\n (_, int index) =>ColorItem(color: data[index],),\n childCount: data.length),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n\nclass ColorItem extends StatefulWidget {\n final Color color;\n\n ColorItem({Key key,this.color}) : super(key: key);\n @override\n _ColorItemState createState() => _ColorItemState();\n}\n\nclass _ColorItemState extends State {\n\n @override\n void initState() {\n super.initState();\n print('-----initState----${colorString(widget.color)}-----------');\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n margin: EdgeInsets.only(top: 1),\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: widget.color,\n child: Text(\n colorString(widget.color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n );\n }\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":341,"name":"CustomMultiChildLayout基本使用","priority":1,"subtitle":" \n【children】 : 子组件集 【List】\n【delegate】 : 布局代理 【MultiChildLayoutDelegate】","code":"import 'dart:io';\nimport 'package:flutter/material.dart';\nclass CustomMultiChildLayoutDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n height: 150,\n color: Colors.grey.withAlpha(33),\n child: CustomMultiChildLayout(\n delegate: CornerCustomMultiChildLayout(\n padding:EdgeInsets.only(left: 10,top: 5,right: 10,bottom: 5),\n ),\n children: [\n LayoutId(id: CornerType.topLeft, child: Box50(Colors.red)),\n LayoutId(id: CornerType.topRight, child: Box50(Colors.yellow)),\n LayoutId(id: CornerType.bottomLeft, child: Box50(Colors.blue)),\n LayoutId(id: CornerType.bottomRight, child: Box50(Colors.green)),\n ],\n ),\n );\n }\n}\n\n// 50 颜射盒\nclass Box50 extends StatelessWidget {\n final Color color;\n Box50(this.color);\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 50,\n height: 50,\n color: color,\n );\n }\n}\n\n\nenum CornerType{\n topLeft,\n topRight,\n bottomLeft,\n bottomRight\n}\n\n\nclass CornerCustomMultiChildLayout extends MultiChildLayoutDelegate{\n final EdgeInsets padding;\n \n CornerCustomMultiChildLayout({this.padding = EdgeInsets.zero});\n\n @override\n void performLayout(Size size) {\n if (hasChild(CornerType.topLeft)) {\n layoutChild(CornerType.topLeft, BoxConstraints.loose(size));\n positionChild(CornerType.topLeft, Offset.zero.translate(padding.left, padding.top));\n }\n if (hasChild(CornerType.topRight)) {\n var childSize = layoutChild(CornerType.topRight, BoxConstraints.loose(size));\n positionChild(CornerType.topRight, Offset(size.width-childSize.width,0).translate(-padding.right, padding.top));\n }\n if (hasChild(CornerType.bottomLeft)) {\n var childSize = layoutChild(CornerType.bottomLeft, BoxConstraints.loose(size));\n positionChild(CornerType.bottomLeft, Offset(0,size.height-childSize.height).translate(padding.left, -padding.bottom));\n }\n if (hasChild(CornerType.bottomRight)) {\n var childSize = layoutChild(CornerType.bottomRight, BoxConstraints.loose(size));\n positionChild(CornerType.bottomRight, Offset(size.width-childSize.width,size.height-childSize.height).translate(-padding.right, -padding.bottom));\n }\n }\n\n @override\n bool shouldRelayout(CornerCustomMultiChildLayout oldDelegate) => oldDelegate.padding!=padding;\n \n}\n\n"},{"id":null,"widgetId":96,"name":"Column基本使用","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n【textBaseline】 : 文字基线 【TextBaseline】\n【verticalDirection】 : 竖直方向 【VerticalDirection】\n【mainAxisSize】 : 主轴尺寸 【MainAxisSize】","code":"import 'package:flutter/material.dart';\nclass CustomColumn extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildTitle(),\n _buildContent(context),\n ],\n );\n }\n\n Widget _buildTitle() {\n return Container(\n height: 70,\n color: Color(0x4484FFFF),\n child: Row(\n children: [\n Padding(\n child: Icon(\n Icons.add_location,\n size: 30,\n color: Colors.pink,\n ),\n padding: EdgeInsets.only(left: 25, right: 20),\n ),\n Expanded(\n child: Text(\n \"附近\",\n style: TextStyle(fontSize: 18),\n ),\n ),\n Padding(\n child: Icon(Icons.keyboard_arrow_right, color: Colors.black38),\n padding: EdgeInsets.only(right: 25),\n ),\n ],\n ));\n }\n\n Widget _buildContent(ctx) => Container(\n width: MediaQuery.of(ctx).size.width,\n color: Colors.orangeAccent,\n height: 100,\n child: Icon(\n Icons.android,\n size: 50,\n color: Colors.white,\n ),\n );\n}\n"},{"id":null,"widgetId":342,"name":"ListView的基本使用","priority":1,"subtitle":"【mainAxis】 : 主轴方向 【Axis】\n【reverse】: 是否反向 【bool】\n【children】: 子组件集 【List】","code":"import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nclass ListBodyDemo extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 300,\n child: ListView(\n children: [\n ListBody(\n mainAxis: Axis.vertical,\n reverse: false,\n children: [\n Container(color: Colors.red, height: 50.0,),\n Container(color: Colors.orange, height: 50.0,),\n Container(color: Colors.yellow, height: 50.0,),\n ],\n ),\n Container(color: Colors.green, height: 80.0,),\n ListBody(\n mainAxis: Axis.vertical,\n reverse: false,\n children: [\n Container(color: Colors.blue, height: 50.0,),\n Container(color: Colors.indigo, height: 50.0,),\n Container(color: Colors.purple, height: 50.0,),\n ],\n )\n ]\n ),\n );\n }\n}\n"},{"id":null,"widgetId":95,"name":"Row基本使用","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n【textBaseline】 : 文字基线 【TextBaseline】\n【verticalDirection】 : 竖直方向 【VerticalDirection】\n【mainAxisSize】 : 主轴尺寸 【MainAxisSize】","code":"import 'package:flutter/material.dart';\nclass CustomRow extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 70,\n color: Color(0x4484FFFF),\n child: Row(\n children: [\n Padding(\n child: Icon(\n Icons.add_location,\n size: 30,\n color: Colors.pink,\n ),\n padding: EdgeInsets.only(left: 25, right: 20),\n ),\n Expanded(\n child: Text(\n \"附近\",\n style: TextStyle(fontSize: 18),\n ),\n ),\n Padding(\n child: Icon(Icons.keyboard_arrow_right, color: Colors.black38),\n padding: EdgeInsets.only(right: 25),\n ),\n ],\n ));\n }\n}\n"},{"id":null,"widgetId":98,"name":"Wrap的textDirection属性","priority":4,"subtitle":" \n【textDirection】 : 文字方向 【TextDirection】","code":"import 'package:flutter/material.dart';\nclass TextDirectionWrap extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: TextDirection.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 100,\n color: Colors.grey.withAlpha(88),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n final yellowBox = Container(\n color: Colors.yellow,\n height: 30,\n width: 50,\n );\n\n final redBox = Container(\n color: Colors.red,\n height: 40,\n width: 40,\n );\n final greenBox = Container(\n color: Colors.green,\n height: 40,\n width: 20,\n );\n final blackBox = Container(\n color: Colors.black,\n height: 10,\n width: 10,\n );\n final purpleBox = Container(\n color: Colors.purple,\n height: 20,\n width: 20,\n );\n final orangeBox = Container(\n color: Colors.orange,\n height: 80,\n width: 20,\n );\n final cyanBox = Container(\n color: Colors.cyanAccent,\n height: 10,\n width: 20,\n );\n\n _buildItem(mode) => Wrap(\n textDirection: mode,\n runSpacing: 10,\n spacing: 10,\n children: [\n yellowBox, redBox, greenBox, cyanBox,\n blackBox, purpleBox, orangeBox,\n ],\n );\n}\n"},{"id":null,"widgetId":98,"name":"Wrap的基础用法","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【spacing】 : 主轴条目间距 【double】\n【runSpacing】 : 交叉轴条目间距 【double】\n【direction】 : 主轴对齐 【Axis】","code":"import 'package:flutter/material.dart';\nclass DirectionWrap extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: Axis.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 100,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n final yellowBox = Container(\n color: Colors.yellow,\n height: 30,\n width: 50,\n );\n\n final redBox = Container(\n color: Colors.red,\n height: 40,\n width: 40,\n );\n final greenBox = Container(\n color: Colors.green,\n height: 40,\n width: 20,\n );\n final blackBox = Container(\n color: Colors.black,\n height: 10,\n width: 10,\n );\n final purpleBox = Container(\n color: Colors.purple,\n height: 20,\n width: 20,\n );\n final orangeBox = Container(\n color: Colors.orange,\n height: 80,\n width: 20,\n );\n final cyanBox = Container(\n color: Colors.cyanAccent,\n height: 10,\n width: 20,\n );\n\n _buildItem(mode) => Wrap(\n direction: mode,\n runSpacing: 10,\n spacing: 10,\n children: [\n yellowBox, redBox, greenBox, cyanBox,\n blackBox, purpleBox, orangeBox,\n ],\n );\n}"},{"id":null,"widgetId":98,"name":"Wrap的verticalDirection属性","priority":5,"subtitle":" \n【verticalDirection】 : 竖直方向 【VerticalDirection】","code":"import 'package:flutter/material.dart';\nclass VerticalDirectionWrap extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: VerticalDirection.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 100,\n color: Colors.grey.withAlpha(88),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n final yellowBox = Container(\n color: Colors.yellow,\n height: 30,\n width: 50,\n );\n\n final redBox = Container(\n color: Colors.red,\n height: 40,\n width: 40,\n );\n final greenBox = Container(\n color: Colors.green,\n height: 40,\n width: 20,\n );\n final blackBox = Container(\n color: Colors.black,\n height: 10,\n width: 10,\n );\n final purpleBox = Container(\n color: Colors.purple,\n height: 20,\n width: 20,\n );\n final orangeBox = Container(\n color: Colors.orange,\n height: 80,\n width: 20,\n );\n final cyanBox = Container(\n color: Colors.cyanAccent,\n height: 10,\n width: 20,\n );\n\n _buildItem(mode) => Wrap(\n verticalDirection: mode,\n direction: Axis.vertical,\n runSpacing: 10,\n spacing: 10,\n children: [\n yellowBox, redBox, greenBox, cyanBox,\n blackBox, purpleBox, orangeBox,\n ],\n );\n}"},{"id":null,"widgetId":98,"name":"Wrap的alignment属性","priority":2,"subtitle":" \n【alignment】 : 主轴对齐 【WrapAlignment】","code":"import 'package:flutter/material.dart';\nclass WrapAlignmentWrap extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: WrapAlignment.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 100,\n color: Colors.grey.withAlpha(88),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n final yellowBox = Container(\n color: Colors.yellow,\n height: 30,\n width: 50,\n );\n\n final redBox = Container(\n color: Colors.red,\n height: 40,\n width: 40,\n );\n final greenBox = Container(\n color: Colors.green,\n height: 40,\n width: 20,\n );\n final blackBox = Container(\n color: Colors.black,\n height: 10,\n width: 10,\n );\n final purpleBox = Container(\n color: Colors.purple,\n height: 20,\n width: 20,\n );\n final orangeBox = Container(\n color: Colors.orange,\n height: 80,\n width: 20,\n );\n final cyanBox = Container(\n color: Colors.cyanAccent,\n height: 10,\n width: 20,\n );\n\n _buildItem(mode) => Wrap(\n alignment: mode,\n runSpacing: 10,\n spacing: 10,\n children: [\n yellowBox, redBox,\n greenBox, cyanBox,\n blackBox, purpleBox,\n orangeBox,\n ],\n );\n}"},{"id":null,"widgetId":98,"name":"Wrap的crossAxisAlignment属性","priority":3,"subtitle":" \n【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】","code":"import 'package:flutter/material.dart';\nclass CrossAxisAlignmentWrap extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: WrapCrossAlignment.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 100,\n color: Colors.grey.withAlpha(88),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n final yellowBox = Container(\n color: Colors.yellow,\n height: 30,\n width: 50,\n );\n\n final redBox = Container(\n color: Colors.red,\n height: 40,\n width: 40,\n );\n final greenBox = Container(\n color: Colors.green,\n height: 40,\n width: 20,\n );\n final blackBox = Container(\n color: Colors.black,\n height: 10,\n width: 10,\n );\n final purpleBox = Container(\n color: Colors.purple,\n height: 20,\n width: 20,\n );\n final orangeBox = Container(\n color: Colors.orange,\n height: 80,\n width: 20,\n );\n final cyanBox = Container(\n color: Colors.cyanAccent,\n height: 10,\n width: 20,\n );\n\n _buildItem(mode) => Wrap(\n crossAxisAlignment: mode,\n runSpacing: 10,\n spacing: 10,\n children: [\n yellowBox, redBox,\n greenBox, cyanBox,\n blackBox, purpleBox,\n orangeBox,\n ],\n );\n}"},{"id":null,"widgetId":101,"name":"RichText基本使用","priority":1,"subtitle":" \n【text】 : 文字 【TextSpan】\n 其他属性与Text相同,详见之。","code":"import 'package:flutter/material.dart';\nimport '../../../../app/utils/color_utils.dart';\nclass CustomRichText extends StatelessWidget {\n final str = \" 发光强度简称光强,国际单位是(坎德拉)简写cd。\"\n \"1cd是指光源在指定方向的单位立体角内发出的光通量。\"\n \"光源辐射是均匀时,则光强为I=F/Ω,Ω为立体角,单位为球面度(sr),F为光通量,\"\n \"单位是流明,对于点光源由I=F/4π 。光亮度是表示发光面明亮程度的,\"\n \"指发光表面在指定方向的发光强度与垂直且指定方向的发光面的面积之比,\"\n \"单位是坎德拉/平方米。对于一个漫散射面,尽管各个方向的光强和光通量不同,\"\n \"但各个方向的亮度都是相等的。电视机的荧光屏就是近似于这样的漫散射面,\"\n \"所以从各个方向上观看图像,都有相同的亮度感。\";\n\n @override\n Widget build(BuildContext context) {\n return Padding(\n padding: const EdgeInsets.only(\n left: 10.0,\n right: 10,\n ),\n child: RichText(\n text: TextSpan(\n children: str\n .split(\"\")\n .map((str) => TextSpan(\n text: str,\n style: TextStyle(\n fontSize: 14, color: ColorUtils.randomColor())))\n .toList())),\n );\n }\n}\n"},{"id":null,"widgetId":97,"name":"Stack基本使用","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【textDirection】 : 孩子排布方向 【MainAxisAlignment】\n【alignment】 : 对齐方式 【AlignmentGeometry】\n【overflow】 : 溢出模式 【Overflow】\n【fit】 : 适应模式 【StackFit】","code":"import 'package:flutter/material.dart';\nclass CustomStack extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var yellowBox = Container(\n color: Colors.yellow,\n height: 100,\n width: 100,\n );\n\n var redBox = Container(\n color: Colors.red,\n height: 90,\n width: 90,\n );\n\n var greenBox = Container(\n color: Colors.green,\n height: 80,\n width: 80,\n );\n\n var cyanBox = Container(\n color: Colors.cyanAccent,\n height: 70,\n width: 70,\n );\n\n return Container(\n width: 200,\n height: 120,\n color: Colors.grey.withAlpha(33),\n child: Stack(\n textDirection: TextDirection.rtl,\n fit: StackFit.loose,\n alignment: Alignment.topRight,\n overflow: Overflow.clip,\n children: [yellowBox, redBox, greenBox, cyanBox],\n ),\n );\n }\n}"},{"id":null,"widgetId":97,"name":"Stack和Positioned结合使用","priority":2,"subtitle":" \nPositioned组件只能用与Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。","code":"import 'package:flutter/material.dart';\nclass PositionedStack extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var yellowBox = Container(\n color: Colors.yellow,\n height: 100,\n width: 100,\n );\n\n var redBox = Container(\n color: Colors.red,\n height: 90,\n width: 90,\n );\n\n var greenBox = Container(\n color: Colors.green,\n height: 80,\n width: 80,\n );\n\n var cyanBox = Container(\n color: Colors.cyanAccent,\n height: 70,\n width: 70,\n );\n\n return Container(\n width: 200,\n height: 120,\n color: Colors.grey.withAlpha(33),\n child: Stack(\n children: [yellowBox, redBox, greenBox,\n Positioned(\n child: cyanBox,\n bottom: 10,\n right: 10,\n )\n ],\n ));\n }\n}\n"},{"id":null,"widgetId":101,"name":"RichText包含其他组件","priority":2,"subtitle":" \n使用WidgetSpan来承载普通组件,作为RichText的内容","code":"import 'package:flutter/material.dart';\nclass RichTextWithWidget extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n height: 60,\n alignment: Alignment.center,\n child: Text('暂不支持Web')\n// RichText(\n// text: TextSpan(\n// text: 'hello ',\n// style: TextStyle(color: Colors.black, fontSize: 18),\n// children: [\n// WidgetSpan(\n// child: Image.asset(\n// 'assets/images/icon_head.png',\n// width: 30,\n// ),\n// alignment: PlaceholderAlignment.baseline,\n// baseline: TextBaseline.ideographic),\n// TextSpan(\n// text: ' , welcome to ',\n// style: TextStyle(color: Colors.blue, fontSize: 18),\n// ),\n// WidgetSpan(\n// child: FlutterLogo(),\n// alignment: PlaceholderAlignment.baseline,\n// baseline: TextBaseline.ideographic),\n// TextSpan(\n// text: ' .\\n',\n// ),\n// TextSpan(\n// text: 'focus me on ',\n// style: TextStyle(color: Colors.orange, fontSize: 16),\n// ),\n// TextSpan(\n// text: 'https://github.com/toly1994328',\n// style: TextStyle(\n// color: Colors.blue,\n// fontSize: 18,\n// decoration: TextDecoration.underline),\n// ),\n// TextSpan(\n// text: ' .\\n',\n// ),\n// ],\n// ),\n// ),\n );\n }\n}\n"},{"id":null,"widgetId":94,"name":"Flex垂直方向顺序","priority":4,"subtitle":" \n【verticalDirection】 : 垂直方向顺序 【VerticalDirection】","code":"import 'package:flutter/material.dart';\nclass VerticalDirectionFlex extends StatelessWidget {\n\n final redBox= Container(\n color: Colors.red,\n height: 30,\n width: 40,\n );\n\n final blueBox= Container(\n color: Colors.blue,\n height: 20,\n width: 30,\n );\n\n final greenBox= Container(\n color: Colors.green,\n height: 20,\n width: 20,\n );\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n runSpacing: 5,\n children: VerticalDirection.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 80,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n _buildItem(mode) => Flex(\n direction: Axis.vertical,\n verticalDirection: mode,\n children: [\n blueBox, redBox, greenBox\n ],\n );\n}\n"},{"id":null,"widgetId":94,"name":"Flex水平方向顺序","priority":5,"subtitle":" \n【textDirection】 : 水平方向顺序 【TextDirection】","code":"import 'package:flutter/material.dart';\nclass TextDirectionFlex extends StatelessWidget {\n\n final redBox= Container(\n color: Colors.red,\n height: 30,\n width: 40,\n );\n\n final blueBox= Container(\n color: Colors.blue,\n height: 20,\n width: 30,\n );\n\n final greenBox= Container(\n color: Colors.green,\n height: 20,\n width: 20,\n );\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n runSpacing: 5,\n children: TextDirection.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 80,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n _buildItem(mode) => Flex(\n direction: Axis.horizontal,\n textDirection: mode,\n children: [\n blueBox, redBox, greenBox\n ],\n );\n}"},{"id":null,"widgetId":94,"name":"Flex主轴对齐方式","priority":2,"subtitle":" \n【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】","code":"import 'package:flutter/material.dart';\nclass MainAxisAlignmentFlex extends StatelessWidget {\n\n final redBox= Container(\n color: Colors.red,\n height: 30,\n width: 40,\n );\n\n final blueBox= Container(\n color: Colors.blue,\n height: 20,\n width: 30,\n );\n\n final greenBox= Container(\n color: Colors.green,\n height: 20,\n width: 20,\n );\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n runSpacing: 5,\n children: MainAxisAlignment.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 80,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n _buildItem(mode) => Flex(\n direction: Axis.horizontal,\n mainAxisAlignment: mode,\n children: [\n blueBox, redBox, greenBox\n ],\n );\n}"},{"id":null,"widgetId":94,"name":"Flex的排布方向","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【direction】 : 方向 【Axis】","code":"import 'package:flutter/material.dart';\nclass DirectionFlex extends StatelessWidget {\n\n final redBox= Container(\n color: Colors.red,\n height: 30,\n width: 40,\n );\n\n final blueBox= Container(\n color: Colors.blue,\n height: 20,\n width: 30,\n );\n\n final greenBox= Container(\n color: Colors.green,\n height: 20,\n width: 20,\n );\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: Axis.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 80,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n _buildItem(mode) => Flex(\n direction: mode,\n children: [\n blueBox, redBox, greenBox\n ],\n );\n}"},{"id":null,"widgetId":94,"name":"Flex交叉轴对齐方式","priority":3,"subtitle":" \n【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】","code":"import 'package:flutter/material.dart';\nclass CrossAxisAlignmentFlex extends StatelessWidget {\n\n final redBox= Container(\n color: Colors.red,\n height: 30,\n width: 40,\n );\n\n final blueBox= Container(\n color: Colors.blue,\n height: 20,\n width: 30,\n );\n\n final greenBox= Container(\n color: Colors.green,\n height: 20,\n width: 20,\n );\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n runSpacing: 5,\n children: CrossAxisAlignment.values\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 160,\n height: 80,\n color: Colors.grey.withAlpha(33),\n child: _buildItem(mode)),\n Text(mode.toString().split('.')[1])\n ]))\n .toList());\n }\n\n _buildItem(mode) => Flex(\n direction: Axis.horizontal,\n crossAxisAlignment: mode,\n textBaseline: TextBaseline.alphabetic,\n children: [\n blueBox, redBox, greenBox\n ],\n );\n}"},{"id":null,"widgetId":99,"name":"Flow圆形排布","priority":1,"subtitle":" \n【children】 : 组件列表 【List】\n【delegate】 : 代理 【FlowDelegate】","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass CircleFlow extends StatelessWidget {\n final data = List.generate(\n 16,\n (index) => index.isEven\n ? \"assets/images/icon_head.png\"\n : \"assets/images/wy_300x200.jpg\");\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n height: 300,\n alignment: Alignment.center,\n child: Flow(\n delegate: _CircleFlowDelegate(),\n children: data\n .map((e) => CircleAvatar(backgroundImage: AssetImage(e)))\n .toList(),\n ),\n );\n }\n}\n\nclass _CircleFlowDelegate extends FlowDelegate {\n @override //绘制孩子的方法\n void paintChildren(FlowPaintingContext context) {\n double radius = context.size.shortestSide / 2;\n print(context.getChildSize(0));\n var count = context.childCount;\n var perRad = 2 * pi / count;\n for (int i = 0; i < count; i++) {\n var cSizeX = context.getChildSize(i).width / 2;\n var cSizeY = context.getChildSize(i).height / 2;\n\n var offsetX = (radius - cSizeX) * cos(i * perRad) + radius;\n var offsetY = (radius - cSizeY) * sin(i * perRad) + radius;\n context.paintChild(i,\n transform: Matrix4.translationValues(\n offsetX - cSizeX, offsetY - cSizeY, 0.0));\n }\n }\n\n @override\n bool shouldRepaint(FlowDelegate oldDelegate) {\n return true;\n }\n}\n"},{"id":null,"widgetId":99,"name":"Flow圆形与动画结合","priority":2,"subtitle":" \n通过动画来更改周围组件的位置实现效果","code":"import 'dart:math';\nimport 'package:flutter/material.dart';\nclass BurstFlow extends StatefulWidget {\n static final data = List.generate(\n 16,\n (index) => index.isEven\n ? \"assets/images/icon_head.png\"\n : \"assets/images/wy_300x200.jpg\");\n static final show = Container(\n width: 300,\n height: 300,\n alignment: Alignment.center,\n child: BurstFlow(\n children: data\n .map((e) => CircleAvatar(backgroundImage: AssetImage(e)))\n .toList(),\n menu: CircleAvatar(\n backgroundImage: AssetImage('assets/images/icon_head.png'),\n )));\n\n final List children;\n final Widget menu;\n\n BurstFlow({@required this.children, @required this.menu});\n\n @override\n _BurstFlowState createState() => _BurstFlowState();\n}\n\nclass _BurstFlowState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _controller;\n double _rad = 0.0;\n bool _closed = true;\n\n @override\n void initState() {\n _controller = AnimationController(\n duration: Duration(milliseconds: 1000), vsync: this)\n ..addListener(() => setState(\n () => _rad = (_closed ? (_controller.value) : 1 - _controller.value)))\n ..addStatusListener((status) {\n if (status == AnimationStatus.completed) {\n _closed = !_closed;\n }\n });\n super.initState();\n }\n\n @override\n void dispose() {\n _controller.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Flow(\n delegate: _BurstFlowDelegate(_rad),\n children: [\n ...widget.children,\n InkWell(\n onTap: () {\n _controller.reset();\n _controller.forward();\n },\n child: widget.menu)\n ],\n );\n }\n}\n\nclass _BurstFlowDelegate extends FlowDelegate {\n final double rad;\n\n _BurstFlowDelegate(this.rad);\n\n @override //绘制孩子的方法\n void paintChildren(FlowPaintingContext context) {\n double radius = context.size.shortestSide / 2;\n var count = context.childCount - 1;\n var perRad = 2 * pi / count;\n for (int i = 0; i < count; i++) {\n print(i);\n var cSizeX = context.getChildSize(i).width / 2;\n var cSizeY = context.getChildSize(i).height / 2;\n var offsetX = rad * (radius - cSizeX) * cos(i * perRad) + radius;\n var offsetY = rad * (radius - cSizeY) * sin(i * perRad) + radius;\n context.paintChild(i,\n transform: Matrix4.translationValues(\n offsetX - cSizeX, offsetY - cSizeY, 0.0));\n }\n context.paintChild(context.childCount - 1,\n transform: Matrix4.translationValues(\n radius - context.getChildSize(context.childCount - 1).width / 2,\n radius - context.getChildSize(context.childCount - 1).height / 2,\n 0.0));\n }\n\n @override\n bool shouldRepaint(FlowDelegate oldDelegate) {\n return true;\n }\n}\n"},{"id":null,"widgetId":179,"name":"ListWheelScrollView基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【perspective】 : 透视度 【double】\n【itemExtent】 : item高 【EdgeInsets】\n【onSelectedItemChanged】 : 选中回调 【ValueChanged 】","code":"import 'package:flutter/material.dart';\nclass CustomListWheelScrollView extends StatefulWidget {\n @override\n _CustomListWheelScrollViewState createState() => _CustomListWheelScrollViewState();\n}\n\nclass _CustomListWheelScrollViewState extends State {\n var data = [\n Colors.orange[50],\n Colors.orange[100],\n Colors.orange[200],\n Colors.orange[300],\n Colors.orange[400],\n Colors.orange[500],\n Colors.orange[600],\n Colors.orange[700],\n Colors.orange[800],\n Colors.orange[900],\n ];\n\n Color _color = Colors.blue;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildCircle(),\n Container(\n height: 150,\n width: 300,\n child: ListWheelScrollView(\n perspective: 0.006,\n itemExtent: 50,\n onSelectedItemChanged: (index){\n print('onSelectedItemChanged:$index');\n setState(() => _color=data[index]);\n },\n children: data.map((color) => _buildItem(color)).toList(),\n ),\n ),\n ],\n );\n }\n\n Widget _buildCircle() => Container(\n margin: EdgeInsets.only(bottom: 5),\n width: 30,\n height: 30,\n decoration: BoxDecoration(\n color: _color,\n shape: BoxShape.circle\n ),\n );\n\n Widget _buildItem(Color color) {\n return Container(\n key: ValueKey(color) ,\n alignment: Alignment.center,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":104,"name":"DragTarget基本使用","priority":1,"subtitle":" \n【builder】 : 组件构造器 【DragTargetBuilder】\n【onWillAccept】 : 拖入时 【Function(T)】\n【onAccept】 : 拖拽成功 【Function(T)】\n【onLeave】 : 拖入再脱出 【Function(T)】","code":"import 'package:flutter/material.dart';\nclass CustomDragTarget extends StatefulWidget {\n @override\n _CustomDragTargetState createState() => _CustomDragTargetState();\n}\n\nclass _CustomDragTargetState extends State {\n Color _color = Colors.grey;\n String _info = 'DragTarget';\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Wrap(\n children: _buildColors(),\n spacing: 10,\n ),\n SizedBox(height: 20,),\n _buildDragTarget()\n ],\n ),\n );\n }\n\n List _buildColors() {\n var colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.orange,\n Colors.purple,\n Colors.cyanAccent\n ];\n return colors\n .map(\n (e) => Draggable(\n child: Container(\n width: 30,\n height: 30,\n alignment: Alignment.center,\n child: Text(\n colors.indexOf(e).toString(),\n style: TextStyle(\n color: Colors.white, fontWeight: FontWeight.bold),\n ),\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n ),\n data: e,\n feedback: Container(\n width: 25,\n height: 25,\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n )),\n )\n .toList();\n }\n\n Widget _buildDragTarget() {\n return DragTarget(\n onLeave: (data) => setState(() => _info='onLeave'),\n onAccept: (data) => setState(() {\n _info='onAccept';\n _color = data;\n }),\n onWillAccept: (data) {\n setState(() {\n _info='onWillAccept';\n });\n print(\"onWillAccept: data = $data \");\n return data != null;\n },\n builder: (context, candidateData, rejectedData) => Container(\n width: 150.0,\n height: 50.0,\n color: _color,\n child: Center(\n child: Text(\n _info,\n style: TextStyle(color: Colors.white),\n ),\n )));\n }\n}"},{"id":null,"widgetId":173,"name":"StreamBuilder基本使用","priority":1,"subtitle":" \n【stream】 : 子组件 【Stream】\n【initialData】 : 初始数据 【T】\n【builder】 : 点击事件 【AsyncWidgetBuilder】","code":"import 'dart:async';\nimport 'package:flutter/material.dart';\nclass CustomStreamBuilder extends StatefulWidget {\n @override\n _CustomStreamBuilderState createState() => _CustomStreamBuilderState();\n}\n\nclass _CustomStreamBuilderState extends State {\n CountGenerator _generator = CountGenerator()..increment();\n\n @override\n void dispose() {\n _generator.dispose(); //关闭控制器\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Row(\n mainAxisSize: MainAxisSize.min,\n children: [\n FlatButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n child: Icon(\n Icons.add,\n color: Colors.white,\n ),\n onPressed: () async {\n await _generator.increment();\n },\n ),\n _buildStreamBuilder(),\n FlatButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n child: Icon(\n Icons.remove,\n color: Colors.white,\n ),\n onPressed: () async {\n await _generator.minus();\n },\n ),\n ],\n ),\n );\n }\n\n Widget _buildStreamBuilder() => StreamBuilder(\n stream: _generator.state,\n builder: (BuildContext context, AsyncSnapshot snap) {\n print(snap);\n if (snap.connectionState == ConnectionState.done) {\n return Text('Done');\n }\n if (snap.connectionState == ConnectionState.active) {\n return Text(\n snap.data.toString(),\n style: Theme.of(context).textTheme.display1,\n );\n }\n if (snap.connectionState == ConnectionState.waiting) {\n return CircularProgressIndicator();\n }\n if (snap.hasError) {\n return Text('Error');\n }\n return Container();\n });\n}\n\nclass CountGenerator {\n int _count = 0; //计数器数据\n final StreamController _controller = StreamController(); //控制器\n\n Stream get state => _controller.stream; //获取状态流\n int get count => _count; //获取计数器数据\n\n void dispose() {//关闭控制器\n _controller.close();\n }\n\n Future increment() async {//增加记数方法\n _controller.add(++_count);\n }\n\n Future minus() async {//增加记数方法\n _controller.add(--_count);\n }\n}\n"},{"id":null,"widgetId":57,"name":"AppBar基本使用","priority":1,"subtitle":" \n【leading】 : 左侧组件 【Widget】\n【title】 : 中间组件 【Widget】\n【actions】 : 右侧组件 【List】\n【elevation】 : 影深 【double】\n【shape】 : 形状 【ShapeBorder】\n【backgroundColor】 : 影深 【背景色】\n【centerTitle】 : 中间是否居中 【bool】","code":"import 'package:flutter/material.dart';\nimport '../PopupMenuButton/node1_base.dart';\nclass CustomAppBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return AppBar(\n title: Text('风雅六社'),\n leading: BackButton(),\n backgroundColor: Colors.amber[500],\n elevation: 2,\n centerTitle: true,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n actions: [\n IconButton(\n icon: Icon(Icons.star),\n tooltip: 'like',\n onPressed: () {\n // do nothing\n }),\n CustomPopupMenuButton()\n ],\n );\n }\n}\n"},{"id":null,"widgetId":57,"name":"AppBar与TabBar、TabBarView联用","priority":2,"subtitle":" \n【bottom】 : 底部组件 【PreferredSizeWidget】","code":"import 'package:flutter/material.dart';\nimport '../PopupMenuButton/node1_base.dart';\nclass TabAppBar extends StatefulWidget {\n @override\n _TabAppBarState createState() => _TabAppBarState();\n}\n\nclass _TabAppBarState extends State\n with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n height: 180,\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage(\n \"assets/images/sabar.jpg\",\n ),\n fit: BoxFit.cover)),\n child: _buildAppBar(),\n ),\n Container(\n height: 150, color: Color(0xff916BF0), child: _buildTableBarView())\n ],\n );\n }\n\n Widget _buildAppBar() => AppBar(\n title: Text('风雅六社'),\n elevation: 1,\n leading: BackButton(),\n backgroundColor: Colors.amber[500].withAlpha(33),\n centerTitle: true,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n topRight: Radius.circular(20),\n )),\n actions: [\n IconButton(\n icon: Icon(Icons.star),\n tooltip: 'like',\n onPressed: () {\n // do nothing\n }),\n CustomPopupMenuButton()\n ],\n bottom: TabBar(\n isScrollable: true,\n controller: _tabController,\n indicatorColor: Colors.orangeAccent,\n tabs: tabs.map((e) => Tab(text: e)).toList(),\n ),\n );\n\n Widget _buildTableBarView() => TabBarView(\n controller: _tabController,\n children: tabs\n .map((e) => Center(\n child: Text(\n e,\n style: TextStyle(color: Colors.white, fontSize: 20),\n )))\n .toList());\n}\n"},{"id":null,"widgetId":152,"name":"Ink基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【padding】 : 内边距 【EdgeInsetsGeometry】\n【decoration】 : 装饰 【Decoration】\n【width】 : 宽 【double】\n【height】 : 高 【double】\n【color】 : 颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomInk extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Material(\n color: Colors.orangeAccent,\n child: Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(\n child: Ink(\n padding: EdgeInsets.all(10),\n decoration: BoxDecoration(\n color: Colors.yellow,\n borderRadius: BorderRadius.all(Radius.circular(20))\n ),\n\n width: 200.0,\n height: 100.0,\n child: InkWell(\n onTap: () {\n },\n child: Center(\n child: Text('Hello'),\n )),\n ),\n ),\n ),\n );\n }\n}\n\n"},{"id":null,"widgetId":152,"name":"Ink.image图片水波纹","priority":2,"subtitle":" \n 其中属性与Image组件一致,详见Image组件","code":"import 'package:flutter/material.dart';\nclass InkImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Material(\n color: Colors.grey[800],\n child: Center(\n child: Ink.image(\n image: AssetImage('assets/images/sabar.jpg'),\n fit: BoxFit.cover,\n width: 300.0,\n height: 200.0,\n child: InkWell(\n onTap: () {},\n child: Align(\n alignment: Alignment.topLeft,\n child: Padding(\n padding: const EdgeInsets.all(10.0),\n child: Text('Chaos',\n style: TextStyle(\n fontWeight: FontWeight.w900, color: Colors.black)),\n ),\n )),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":198,"name":"Form基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onChanged】 : 表单变化回调 【VoidCallback】\n【onWillPop】 : 返回回调 【WillPopCallback】","code":"import 'package:flutter/material.dart';\nclass CustomForm extends StatefulWidget {\n @override\n _CustomFormState createState() => _CustomFormState();\n}\n\nclass _CustomFormState extends State {\n GlobalKey _formKey = GlobalKey();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Form(\n onWillPop: () => _willPop(context),\n key: _formKey,\n onChanged: () {\n print('Form---onChanged');\n },\n child:\n Stack(\n alignment: Alignment.centerRight,\n children: [\n Container(\n width: 350,\n child: UnconstrainedBox(\n child: Container(\n width: 200,\n height: 70,\n child: TextFormField(\n style: TextStyle(textBaseline: TextBaseline.alphabetic),\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n labelText: 'username',\n ),\n validator: _validateUsername,\n ),\n ),\n ),\n ),\n Positioned(\n top: 0, right: 0, child: _buildSubmitButton(context)),\n ],\n ),\n ),\n );\n }\n\n String _validateUsername(value) {\n if (value.isEmpty) {\n return '用户名不能为空';\n }\n return null;\n }\n\n RaisedButton _buildSubmitButton(BuildContext context) {\n return RaisedButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: _onSubmit,\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n );\n }\n\n _onSubmit(){\n if (_formKey.currentState.validate()) {\n FocusScope.of(context).requestFocus(FocusNode());\n Navigator.of(context).pop();\n }\n }\n\n Future _willPop(context) async {\n return await showDialog(\n context: context,\n builder: (context) => AlertDialog(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n title: Text('提示'),\n content: Text('你确定要离开此页吗?'),\n actions: [\n FlatButton(\n onPressed: () => Navigator.of(context).pop(true),\n child: Text('确定'),\n ),\n FlatButton(\n onPressed: () => Navigator.of(context).pop(false),\n child: Text('取消'),\n ),\n ],\n ),\n ) ??\n false;\n }\n}\n"},{"id":null,"widgetId":50,"name":"Tooltip基本使用","priority":1,"subtitle":" \n【preferBelow】 : 是否首选下方 【bool】\n【padding】 : 内边距 【EdgeInsetsGeometry】\n【margin】 : 外边距 【EdgeInsetsGeometry】\n【message】 : 消息内容 【String】\n【showDuration】 : 展示时间 【Duration】\n【waitDuration】 : 悬浮出现时间 【Duration】\n【child】 : 孩子 【Widget】","code":"import 'package:flutter/material.dart';\nclass CustomTooltip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Tooltip(\n preferBelow: true,\n padding: EdgeInsets.all(5),\n margin: EdgeInsets.all(5),\n message: \"天王盖地虎\",\n showDuration: Duration(seconds: 3),\n waitDuration: Duration(milliseconds: 200),\n child: Icon(Icons.info_outline),\n );\n }\n}\n"},{"id":null,"widgetId":50,"name":"Tooltip的装饰","priority":2,"subtitle":" \n【decoration】 : 装饰对象 【Decoration】\n【textStyle】 : 文字样式 【double】","code":"import 'package:flutter/material.dart';\nclass DecorationTooltip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Tooltip(\n preferBelow: false,\n padding: EdgeInsets.all(5),\n margin: EdgeInsets.all(2),\n message: \"宝塔镇河妖\",\n textStyle: TextStyle(\n color: Colors.red,\n shadows: [Shadow(color: Colors.white,\n offset: Offset(1, 1))]),\n decoration: BoxDecoration(boxShadow: [\n BoxShadow(\n color: Colors.orangeAccent,\n offset: Offset(1, 1), blurRadius: 8)\n ]),\n child: Icon(Icons.info_outline));\n }\n}\n"},{"id":null,"widgetId":175,"name":"RawMaterialButton高亮和形状","priority":2,"subtitle":" \n【highlightElevation】 : 高亮影深 【double】\n【shape】 : 形状 【ShapeBorder】","code":"import 'package:flutter/material.dart';\nclass ShapeRawMaterialButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Wrap(\n spacing: 20,\n children: [\n RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.green,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Icon(Icons.remove),\n onPressed: ()=>print('onPressed'),\n ),\n RawMaterialButton(\n shape:RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(15))),\n elevation: 0,\n highlightElevation: 0,\n fillColor: Colors.blue,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Text('Push'),\n onPressed: ()=>print('onPressed'),\n ),\n RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.red,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Icon(Icons.add),\n onPressed: ()=>print('onPressed'),\n ),\n\n ],\n ),\n );\n }\n}"},{"id":null,"widgetId":49,"name":"RefreshIndicator基本使用","priority":1,"subtitle":" \n【child】 : 孩子(可滑动) 【Widget】\n【displacement】 : 指示器悬浮高度 【double】\n【color】 : 指示器颜色 【Color】,","code":"import 'package:flutter/material.dart';\nclass CustomRefreshIndicator extends StatefulWidget {\n @override\n _CustomRefreshIndicatorState createState() => _CustomRefreshIndicatorState();\n}\n\nclass _CustomRefreshIndicatorState extends State {\n int _count = 0;\n\n @override\n Widget build(BuildContext context) {\n\n return Container(\n height: 200,\n width: 200,\n child: RefreshIndicator(\n onRefresh: _increment,\n displacement: 20,\n color: Colors.orange,\n backgroundColor: Colors.white,\n child: SingleChildScrollView(\n child: Container(\n alignment: Alignment.center,\n width: 200,\n height: 300,\n color: Colors.blue,\n child: Text('$_count',style: TextStyle(color: Colors.white,fontSize: 40)),\n ),\n ),\n ),\n );\n }\n\n Future _increment() async {\n await Future.delayed(Duration(seconds: 2));\n setState(() {\n _count++;\n });\n }\n}\n"},{"id":null,"widgetId":175,"name":"RawMaterialButton基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【elevation】 : 影深 【double】\n【fillColor】 : 填充色 【Color】\n【splashColor】 : 水波纹色 【Color】\n【textStyle】 : 文字样式 【TextStyle】\n【onLongPress】 : 长按事件 【Function()】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomRawMaterialButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Wrap(\n spacing: 20,\n children: [\n RawMaterialButton(\n elevation: 2,\n fillColor: Colors.green,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Icon(Icons.remove),\n onPressed: ()=>print('onPressed'),\n ),\n RawMaterialButton(\n elevation: 2,\n fillColor: Colors.blue,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Text('Push'),\n onPressed: ()=>print('onPressed'),\n ),\n RawMaterialButton(\n elevation: 2,\n fillColor: Colors.red,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n onLongPress: ()=>print('onLongPress'),\n child: Icon(Icons.add),\n onPressed: ()=>print('onPressed'),\n ),\n\n ],\n ),\n );\n }\n}"},{"id":null,"widgetId":112,"name":"SlideTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【textDirection】 : x轴方向 【TextDirection】\n【position】 : 动画 【Animation】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomSlideTransition extends StatefulWidget {\n @override\n _CustomSlideTransitionState createState() => _CustomSlideTransitionState();\n}\n\nclass _CustomSlideTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n width: MediaQuery.of(context).size.width,\n color: Colors.grey.withAlpha(33),\n height: 100,\n child: SlideTransition(\n textDirection: TextDirection.ltr,\n position: Tween(\n begin: Offset.zero,\n end: Offset(0.2, 0.2),\n ).animate(_ctrl),\n child: Container(\n child: Icon(Icons.android, color: Colors.green, size: 60)),\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":45,"name":"Radio基本使用","priority":1,"subtitle":" \n【value】 : 选钮值 【T】\n【groupValue】 : 当前匹配值 【T】\n【activeColor】 : 激活颜色 【Color】\n【onChanged】 : 改变时回调 【Function(T)】","code":"import 'package:flutter/material.dart';\nclass CustomRadio extends StatefulWidget {\n @override\n _CustomRadioState createState() => _CustomRadioState();\n}\n\nclass _CustomRadioState extends State {\n var data = [1, 2, 3, 4, 5];\n double _value = 1;\n\n @override\n Widget build(BuildContext context) {\n return Row(\n mainAxisSize: MainAxisSize.min,\n children: data\n .map((e) => Radio(\n activeColor: Colors.orangeAccent,\n value: e,\n groupValue: _value,\n onChanged: (v) => setState(() => _value = v)))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":165,"name":"PageView基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【onPageChanged】 : 点击事件 【ValueChanged】","code":"import 'package:flutter/material.dart';\nclass CustomPageView extends StatelessWidget {\n final data = [\n Colors.green[50],\n Colors.green[100],\n Colors.green[200],\n Colors.green[300],\n Colors.green[400],\n Colors.green[500],\n Colors.green[600],\n Colors.green[700],\n Colors.green[800],\n Colors.green[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n child: PageView(\n onPageChanged: (position){\n print(position);\n },\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 90,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white,\n fontSize:24,shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n );\n }\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":165,"name":"PageView控制器简单实用","priority":3,"subtitle":" \n【controller】 : 页面控制器 【PageController】","code":"import 'package:flutter/material.dart';\nclass CtrlPageView extends StatefulWidget {\n @override\n _CtrlPageViewState createState() => _CtrlPageViewState();\n}\n\nclass _CtrlPageViewState extends State {\n final data = [\n Colors.orange[50],\n Colors.orange[100],\n Colors.orange[200],\n Colors.orange[300],\n Colors.orange[400],\n Colors.orange[500],\n Colors.orange[600],\n Colors.orange[700],\n Colors.orange[800],\n Colors.orange[900],\n ];\n\n PageController _controller;\n\n @override\n void dispose() {\n _controller.dispose();\n super.dispose();\n }\n\n @override\n void initState() {\n super.initState();\n _controller=PageController(\n viewportFraction: 0.8,\n initialPage: (data.length/2).round()\n );\n\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n child: PageView(\n controller: _controller,\n onPageChanged: (position) {\n print(position);\n },\n children: data\n .map((color) =>\n Container(\n alignment: Alignment.center,\n width: 90,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white,\n fontSize: 24, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":165,"name":"PageView滑动方向","priority":2,"subtitle":" \n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向 【bool】","code":"import 'package:flutter/material.dart';\nclass DirectionPageView extends StatelessWidget {\n final data = [\n Colors.orange[50],\n Colors.orange[100],\n Colors.orange[200],\n Colors.orange[300],\n Colors.orange[400],\n Colors.orange[500],\n Colors.orange[600],\n Colors.orange[700],\n Colors.orange[800],\n Colors.orange[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n child: PageView(\n scrollDirection: Axis.vertical,\n reverse: true,\n onPageChanged: (position) {\n print(position);\n },\n children: data\n .map((color) =>\n Container(\n alignment: Alignment.center,\n width: 90,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white,\n fontSize: 24, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":60,"name":"BottomNavigationBar基本使用","priority":1,"subtitle":" \n【currentIndex】 : 当前索引 【int】\n【elevation】 : 影深 【double】\n【type】 : 类型*2 【BottomNavigationBarType】\n【fixedColor】 : type为fix的颜色 【Color】\n【backgroundColor】 : 背景色 【Color】\n【iconSize】 : 图标大小 【double】\n【selectedLabelStyle】 : 选中文字样式 【TextStyle】\n【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n【showUnselectedLabels】 : 显示未选中标签 【bool】\n【showSelectedLabels】 : 显示选中标签 【bool】\n【items】 : 条目 【List】\n【onTap】 : 点击事件 【Function(int)】","code":"import 'package:flutter/material.dart';\nclass CustomBottomNavigationBar extends StatefulWidget {\n @override\n _CustomBottomNavigationBarState createState() =>\n _CustomBottomNavigationBarState();\n}\n\nclass _CustomBottomNavigationBarState extends State {\n var _position = 0;\n BottomNavigationBarType _type = BottomNavigationBarType.shifting;\n final iconsMap = {\n //底栏图标\n \"图鉴\": Icons.home, \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite, \"手册\": Icons.class_,\n \"我的\": Icons.account_circle,\n };\n final _colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.purple,\n ];\n\n @override\n Widget build(BuildContext context) {\n return Column(\n crossAxisAlignment: CrossAxisAlignment.end,\n children: [\n _buildOp(),\n _buildBottomNavigationBar(),\n ],\n );\n }\n\n bool get isShifting => _type == BottomNavigationBarType.shifting;\n\n BottomNavigationBar _buildBottomNavigationBar() {\n return BottomNavigationBar(\n onTap: (position) => setState(() => _position = position),\n currentIndex: _position,\n elevation: 1,\n type: _type,\n fixedColor: isShifting ? Colors.white : _colors[_position],\n backgroundColor: Colors.white,\n iconSize: 25,\n selectedLabelStyle: TextStyle(fontWeight: FontWeight.bold),\n showUnselectedLabels: false,\n showSelectedLabels: true,\n items: iconsMap.keys\n .map((key) => BottomNavigationBarItem(\n title: Text(\n key,\n ),\n icon: Icon(iconsMap[key]),\n backgroundColor: _colors[_position]))\n .toList(),\n );\n }\n\n Widget _buildOp() {\n return Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Text(\n _type.toString(),\n style: TextStyle(fontWeight: FontWeight.bold, color: Colors.blue),\n ),\n Switch(\n value: _type == BottomNavigationBarType.shifting,\n onChanged: (b) {\n setState(() => _type = b\n ? BottomNavigationBarType.shifting\n : BottomNavigationBarType.fixed);\n }),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":60,"name":"可结合PageView进行切页","priority":2,"subtitle":" \n在onTap时进行使用控制器进行切页","code":"import 'package:flutter/material.dart';\nclass BottomNavigationBarWithPageView extends StatefulWidget {\n @override\n _BottomNavigationBarWithPageViewState createState() =>\n _BottomNavigationBarWithPageViewState();\n}\n\nclass _BottomNavigationBarWithPageViewState\n extends State {\n var _position = 0;\n final iconsMap = {\n //底栏图标\n \"图鉴\": Icons.home, \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite, \"手册\": Icons.class_,\n \"我的\": Icons.account_circle,\n };\n final _colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.purple,\n ];\n PageController _controller; //页面控制器,初始0\n\n @override\n void initState() {\n _controller = PageController(\n initialPage: _position,\n );\n super.initState();\n }\n\n @override\n void dispose() {\n _controller.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Container(\n color: Colors.orange.withAlpha(88),\n width: MediaQuery.of(context).size.width,\n height: 150,\n child: PageView(\n controller: _controller,\n children: iconsMap.keys\n .map((e) => Center(\n child: Text(\n e,\n style: TextStyle(color: Colors.white, fontSize: 20),\n ),\n ))\n .toList(),\n ),\n ),\n _buildBottomNavigationBar()\n ],\n ),\n );\n }\n\n BottomNavigationBar _buildBottomNavigationBar() {\n return BottomNavigationBar(\n onTap: (position) {\n _controller.jumpToPage(position);\n setState(() => _position = position);\n },\n currentIndex: _position,\n elevation: 1,\n type: BottomNavigationBarType.shifting,\n fixedColor: Colors.white,\n iconSize: 25,\n selectedLabelStyle: TextStyle(fontWeight: FontWeight.bold),\n showUnselectedLabels: false,\n showSelectedLabels: true,\n items: iconsMap.keys\n .map((key) => BottomNavigationBarItem(\n title: Text(\n key,\n ),\n icon: Icon(iconsMap[key]),\n backgroundColor: _colors[_position]))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":59,"name":"TabBarView需要与TabBar联用","priority":1,"subtitle":" \n【controller】 : 控制器 【TabController】\n【children】 : 孩子们 【指示器颜色】\n【physics】 : 表现 【ScrollPhysics】","code":"import 'package:flutter/material.dart';\nclass CustomTabBarView extends StatefulWidget {\n @override\n _CustomTabBarViewState createState() => _CustomTabBarViewState();\n}\n\nclass _CustomTabBarViewState extends State with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n _buildTabBar(),\n Container(\n color: Colors.purple,\n width: MediaQuery.of(context).size.width,\n height: 200,\n child: _buildTableBarView())\n ],\n ),\n );\n }\n\n Widget _buildTabBar() => TabBar(\n onTap: (tab) => print(tab),\n labelStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),\n unselectedLabelStyle: TextStyle(fontSize: 16),\n isScrollable: true,\n controller: _tabController,\n labelColor: Colors.blue,\n indicatorWeight: 3,\n indicatorPadding: EdgeInsets.symmetric(horizontal: 10),\n unselectedLabelColor: Colors.grey,\n indicatorColor: Colors.orangeAccent,\n tabs: tabs.map((e) => Tab(text: e)).toList(),\n );\n\n Widget _buildTableBarView() => TabBarView(\n controller: _tabController,\n children: tabs.map((e) => Center(\n child: Text(e, style: TextStyle(color: Colors.white, fontSize: 20),\n ))).toList());\n}\n"},{"id":null,"widgetId":144,"name":"CupertinoContextMenuAction基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【isDefaultAction】 : 是否默认选中 【bool】\n【trailingIcon】 : 尾部 【bool】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoContextMenuAction extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Container(\n width: 200,\n margin: EdgeInsets.all(5),\n child: CupertinoContextMenuAction(\n trailingIcon: CupertinoIcons.settings,\n isDefaultAction: true,\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n child: Text('张风捷特烈')),\n ),\n Container(\n width: 200,\n margin: EdgeInsets.all(5),\n child: CupertinoContextMenuAction(\n trailingIcon: CupertinoIcons.home,\n isDefaultAction: false,\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n child: Text('百里·巫缨')),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":91,"name":"ScaleTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【scale】 : 动画 【Animation】","code":"import 'package:flutter/material.dart';\nclass CustomScaleTransition extends StatefulWidget {\n @override\n _CustomScaleTransitionState createState() => _CustomScaleTransitionState();\n}\n\nclass _CustomScaleTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 2));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n color: Colors.grey.withAlpha(22),\n width: 100,\n height: 100,\n child: ScaleTransition(\n scale: CurvedAnimation(parent: _ctrl, curve: Curves.linear),\n child: Icon(Icons.android, color: Colors.green, size: 60),\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":53,"name":"SelectableText对齐属性","priority":2,"subtitle":" \n【textAlign】 : 对齐方式*6 【textAlign】\n【textDirection】 : 文字方向*2 【TextDirection】","code":"import 'package:flutter/material.dart';\nclass AlignSelectableText extends StatefulWidget {\n @override\n _AlignSelectableTextState createState() => _AlignSelectableTextState();\n}\n\nclass _AlignSelectableTextState extends State {\n final text =\n \"The [SelectableText] widget displays a string of text with a single style.\"\n \"The string might break across multiple lines or might all be displayed on\"\n \"the same line depending on the layout constraints.\";\n var _textAlign = TextAlign.left;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSelector(),\n SelectableText(\n text,\n style: TextStyle(fontSize: 18, color: Colors.red),\n cursorColor: Colors.green,\n cursorRadius: Radius.circular(3),\n cursorWidth: 5,\n showCursor: true,\n textAlign: _textAlign,\n textDirection: TextDirection.ltr,\n\n autofocus: false,\n ),\n ],\n );\n }\n\n Widget _buildSelector() {\n return Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n Text(\n \"textAlign属性选择:\",\n style: TextStyle(\n fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold),\n ),\n DropdownButton(\n underline: Container(),\n value: _textAlign,\n items: TextAlign.values\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(e.toString()),\n ))\n .toList(),\n onChanged: (e) {\n setState(() {\n _textAlign = e;\n });\n }),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":53,"name":"SelectableText基本使用","priority":1,"subtitle":" \n【入参】 : 显示文字 【String】\n【style】 : 文字样式 【TextStyle】\n【cursorRadius】 : 光标半径 【Radius】\n【cursorColor】 : 光标颜色 【Color】\n【cursorWidth】 : 光标宽度 【double】\n【showCursor】 : 是否显示光标 【bool】\n【autofocus】 : 自动聚焦 【bool】","code":"import 'package:flutter/material.dart';\nclass CustomSelectableText extends StatelessWidget {\n final text = \" 始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时,\"\n \"臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然,\"\n \"技经肯綮之未尝,而况大軱乎!良庖岁更刀,割也;族庖月更刀,折也。\"\n \"今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有间,而刀刃者无厚;\"\n \"以无厚入有间,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。\"\n \"虽然,每至于族,吾见其难为,怵然为戒,视为止,行为迟。动刀甚微,謋然已解,如土委地。\"\n \"提刀而立,为之四顾,为之踌躇满志,善刀而藏之.\";\n\n @override\n Widget build(BuildContext context) {\n return SelectableText(\n text,\n style: TextStyle(fontSize: 18, color: Colors.orange),\n cursorColor: Colors.green,\n cursorRadius: Radius.circular(3),\n cursorWidth: 5,\n showCursor: true,\n autofocus: false,\n );\n }\n}\n"},{"id":null,"widgetId":137,"name":"CupertinoDatePicker基本使用","priority":1,"subtitle":" \n【initialDateTime】 : 初始日期 【DateTime】\n【minimumYear】 : 最小年份 【int】\n【maximumYear】 : 最大年份 【int】\n【onDateTimeChanged】 : 点击回调 【Function(DateTime)】\n【minuteInterval】 : 分钟间隔 【int】\n【use24hFormat】 : 是否是24小时制 【bool】\n【backgroundColor】 : 背景色 【Color】\n【mode】 : 模式*3 【CupertinoDatePickerMode】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoDatePicker extends StatefulWidget {\n @override\n _CustomCupertinoDatePickerState createState() =>\n _CustomCupertinoDatePickerState();\n}\n\nclass _CustomCupertinoDatePickerState extends State {\n DateTime _date = DateTime.now();\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Text(\n '当前日期:${_date.toIso8601String()}',\n style: TextStyle(color: Colors.grey, fontSize: 16),\n ),\n _buildInfoTitle('CupertinoDatePickerMode.dateAndTime'),\n buildPicker(CupertinoDatePickerMode.dateAndTime),\n _buildInfoTitle('CupertinoDatePickerMode.date'),\n buildPicker(CupertinoDatePickerMode.date),\n _buildInfoTitle('CupertinoDatePickerMode.time'),\n buildPicker(CupertinoDatePickerMode.time),\n ],\n );\n }\n\n Container buildPicker(CupertinoDatePickerMode mode) {\n return Container(\n margin: EdgeInsets.all(10),\n height: 150,\n child: CupertinoDatePicker(\n mode: mode,\n initialDateTime: DateTime.now(),\n// maximumDate: DateTime(2018,8,8),\n// minimumDate: DateTime(2030,8,8),\n minimumYear: 2018,\n maximumYear: 2030,\n use24hFormat: false,\n minuteInterval: 1,\n backgroundColor: CupertinoColors.white,\n onDateTimeChanged: (date) {\n print(date);\n setState(() => _date = date);\n },\n ),\n );\n }\n\n Widget _buildInfoTitle(info){\n return Padding(\n padding: const EdgeInsets.only(left: 20,top: 20,bottom: 5),\n child: Text(\n info,\n style: TextStyle(color: Colors.blue, fontSize: 16,fontWeight: FontWeight.bold),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":150,"name":"InkWell其他属性","priority":2,"subtitle":" \n【child】 : 子组件 【Widget】\n【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n【highlightColor】 : 高亮色 【Color】\n【splashColor】 : 水波纹色 【Color】\n【radius】 : 水波半径 【double】","code":"import 'package:flutter/material.dart';\nclass ColorInkWell extends StatefulWidget {\n @override\n _ColorInkWellState createState() => _ColorInkWellState();\n}\n\nclass _ColorInkWellState extends State {\n var _info = 'Push';\n\n @override\n Widget build(BuildContext context) {\n return InkWell(\n onTap: () => {},\n splashColor: Colors.blueAccent,\n highlightColor: Colors.orange,\n onHighlightChanged: (v) =>\n setState(() => _info = 'onHighlightChanged:$v'),\n radius: 50,\n child: Container(\n alignment: Alignment.center,\n width: 180,\n height: 50,\n child: Text(_info),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":150,"name":"InkWell基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onTap】 : 点击事件 【Function()】\n【onDoubleTap】 : 双击事件 【Function()】\n【onTapCancel】 : 点击取消 【Function()】\n【onLongPress】 : 长按事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomInkWell extends StatefulWidget {\n @override\n _CustomInkWellState createState() => _CustomInkWellState();\n}\n\nclass _CustomInkWellState extends State {\n var _info = 'Push';\n\n @override\n Widget build(BuildContext context) {\n return InkWell(\n onTap: () => setState(() => _info = 'onTap'),\n onDoubleTap: () => setState(() => _info = 'onDoubleTap'),\n onLongPress: () => setState(() => _info = 'onLongPress'),\n onTapCancel: () => setState(() => _info = 'onTapCancel'),\n child: Container(\n alignment: Alignment.center,\n width: 120,\n height: 50,\n child: Text(_info),\n ),\n );\n }\n}"},{"id":null,"widgetId":114,"name":"DefaultTextStyleTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【textAlign】 : 文字对齐方式 【TextAlign】\n【softWrap】 : 是否包裹 【bool】\n【maxLines】 : 最大行数 【int】\n【overflow】 : 溢出模式 【TextOverflow】\n【style】 : 动画 【Animation】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomDefaultTextStyleTransition extends StatefulWidget {\n @override\n _CustomDefaultTextStyleTransitionState createState() =>\n _CustomDefaultTextStyleTransitionState();\n}\n\nclass _CustomDefaultTextStyleTransitionState\n extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 100,\n child: DefaultTextStyleTransition(\n textAlign: TextAlign.start,\n softWrap: true,\n maxLines: 1,\n overflow: TextOverflow.ellipsis,\n style: TextStyleTween(\n begin: TextStyle(color: Colors.blue, fontSize: 50, shadows: [\n Shadow(\n offset: Offset(1, 1), color: Colors.black, blurRadius: 3)\n ]),\n end: TextStyle(color: Colors.white, fontSize: 20, shadows: [\n Shadow(\n offset: Offset(1, 1), color: Colors.purple, blurRadius: 3)\n ])).animate(_ctrl),\n child: Text('张风捷特烈'),\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":176,"name":"Dismissible基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【background】 : 左底 【Widget】\n【secondaryBackground】 : 右底 【Widget】\n【key】 : 键 【Key】\n【confirmDismiss】 : 确认回调 【DismissDirectionCallback】\n【onDismissed】 : 消失回调 【DismissDirectionCallback】,","code":"import 'package:flutter/material.dart';\nclass CustomDismissible extends StatefulWidget {\n @override\n _CustomDismissibleState createState() => _CustomDismissibleState();\n}\n\nclass _CustomDismissibleState extends State {\n var data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data.map((color) => _buildItem(color)).toList(),\n ),\n );\n }\n\n Widget _buildItem(Color color) {\n return Dismissible(\n background: Container(\n color: Colors.green,\n alignment: Alignment(-0.9, 0),\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n ),\n secondaryBackground: Container(\n alignment: Alignment(0.9, 0),\n child: Icon(\n Icons.close,\n color: Colors.white,\n ),\n color: Colors.red,\n ),\n key: ValueKey(color),\n onDismissed: (d) {\n data.remove(color);\n },\n confirmDismiss: (e) async {\n if (e == DismissDirection.endToStart) {\n return true;\n } else {\n return false;\n }\n },\n child: Container(\n alignment: Alignment.center,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":115,"name":"RelativePositionedTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【size】 : 左和上的偏移量 【Size】\n【rect】 : 动画 【Animation】\n PositionedTransition组件只能在Stack内起作用","code":"import 'package:flutter/material.dart';\nclass CustomRelativePositionedTransition extends StatefulWidget {\n @override\n _CustomRelativePositionedTransitionState createState() =>\n _CustomRelativePositionedTransitionState();\n}\n\nclass _CustomRelativePositionedTransitionState\n extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 2));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n color: Colors.grey.withAlpha(33),\n width: 200,\n height: 100,\n child: Stack(\n children: [\n RelativePositionedTransition(\n size: Size(200, 100),\n rect: RectTween(\n begin: Rect.fromLTRB(0, 0, 50, 50),\n end: Rect.fromLTRB(0, 0, 50, 50).translate(100, 50),\n ).animate(_ctrl),\n child: Icon(\n Icons.android,\n color: Colors.green,\n size: 50,\n ),\n )\n ],\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":176,"name":"Dismissible基本使用","priority":2,"subtitle":" \n【direction】 : 方向 【DismissDirection】\n【crossAxisEndOffset】 : 偏移 【double】,","code":"import 'package:flutter/material.dart';\nclass DirectionDismissible extends StatefulWidget {\n @override\n _CustomDirectionDismissibleState createState() => _CustomDirectionDismissibleState();\n}\n\nclass _CustomDirectionDismissibleState extends State {\n var data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ListView(\n scrollDirection: Axis.horizontal,\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data.map((color) => _buildItem(color)).toList(),\n ),\n );\n }\n\n Widget _buildItem(Color color) {\n return Dismissible(\n direction: DismissDirection.vertical,\n background: Container(\n color: Colors.green,\n alignment: Alignment( 0,-0.9,),\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n ),\n crossAxisEndOffset: 0.5,\n secondaryBackground: Container(\n alignment: Alignment( 0,0.9,),\n child: Icon(\n Icons.close,\n color: Colors.white,\n ),\n color: Colors.red,\n ),\n key: ValueKey(color),\n onDismissed: (d) {\n data.remove(color);\n },\n confirmDismiss: (e) async {\n print(e);\n if (e == DismissDirection.up) {\n return true;\n } else {\n return false;\n }\n },\n child: Container(\n alignment: Alignment.center,\n width: 80,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":251,"name":"NestedScrollView基本用法","priority":1,"subtitle":" \n【controller】 : 滑动控制器 【ScrollController】\n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向 【bool】\n【physics】 : 滑顶样式 【ScrollPhysics】\n【dragStartBehavior】 : 开始拖动行为 【DragStartBehavior】\n【headerSliverBuilder】 : *头部构造器 【NestedScrollViewHeaderSliversBuilder】\n【body】 : *内容 【Widget】","code":"import 'package:flutter/material.dart';\nclass NestedScrollViewDemo extends StatelessWidget {\n final _tabs = ['风神传', '封妖志', \"幻将录\", \"永恒传说\"];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 200,\n child: Scaffold(\n body: DefaultTabController(\n length: _tabs.length,\n child: NestedScrollView(\n headerSliverBuilder:\n (BuildContext context, bool innerBoxIsScrolled) {\n return [\n SliverOverlapAbsorber(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(\n context),\n sliver: SliverAppBar(\n title: const Text('旷古奇书'),\n pinned: true,\n elevation: 6, //影深\n expandedHeight: 220.0,\n forceElevated: innerBoxIsScrolled, //为true时展开有阴影\n flexibleSpace: FlexibleSpaceBar(\n background: Image.asset(\n \"assets/images/wy_300x200_filter.jpg\",\n fit: BoxFit.cover,\n ),\n ),\n bottom: TabBar(\n tabs: _tabs\n .map((String name) => Tab(text: name,))\n .toList(),\n ),\n ),\n ),\n ];\n },\n body: _buildTabBarView(),\n ),\n ),\n ));\n }\n\n Widget _buildTabBarView() {\n return TabBarView(\n children: _tabs.map((String name) {\n return SafeArea(\n top: false,\n bottom: false,\n child: Builder(\n builder: (BuildContext context) {\n return CustomScrollView(\n key: PageStorageKey(name),\n slivers: [\n SliverOverlapInjector(\n handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),\n ),\n SliverPadding(\n padding: const EdgeInsets.all(8.0),\n sliver: SliverFixedExtentList(\n itemExtent: 48.0,\n delegate: SliverChildBuilderDelegate(\n (BuildContext context, int index) {\n return ListTile(\n title: Text('《$name》 第 $index章'),\n );\n },\n childCount: 50,\n ),\n ),\n ),\n ],\n );\n },\n ),\n );\n }).toList(),\n );\n }\n}\n"},{"id":null,"widgetId":24,"name":"CupertinoButton点击事件","priority":1,"subtitle":"【color】: 颜色 【Color】\n【pressedOpacity】: 按下时透明度 【double】\n【child】: 子组件 【Widget】\n【padding】: 内边距 【EdgeInsetsGeometry】\n【borderRadius】: 圆角半径 【BorderRadius】\n【onPressed】: 点击事件 【Function】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoButton extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var data = {\n CupertinoColors.activeBlue:4.0,\n Colors.blue:6.0,\n CupertinoColors.activeOrange:8.0,\n };\n return Wrap(\n spacing: 20,\n children:data.keys.map((e)=> CupertinoButton(\n padding: EdgeInsets.zero,\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n color: e,\n pressedOpacity: 0.4,\n borderRadius: BorderRadius.all(Radius.circular(data[e])),\n child: Text(\"iOS\"),\n )).toList()\n );\n }\n}\n\n"},{"id":null,"widgetId":61,"name":"BottomAppBar基本用法","priority":1,"subtitle":" \n【elevation】 : 影深 【double】\n【shape】 : 形状 【NotchedShape】\n【notchMargin】 : 间隔距离 【double】\n【color】 : 颜色 【Color】\n【child】 : 孩子 【Widget】","code":"import 'package:flutter/material.dart';\nclass CustomBottomAppBar extends StatefulWidget {\n @override\n _CustomBottomAppBarState createState() => _CustomBottomAppBarState();\n}\n\nclass _CustomBottomAppBarState extends State {\n var _position = 0;\n var _location = FloatingActionButtonLocation.centerDocked;\n final iconsMap = {\n \"图鉴\": Icons.home,\n \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite,\n \"手册\": Icons.class_,\n };\n var activeColor = Colors.blue.withAlpha(240);\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: 180,\n child: Scaffold(\n backgroundColor: Colors.purple.withAlpha(22),\n floatingActionButton: FloatingActionButton(\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n child: Icon(Icons.add),\n ),\n bottomNavigationBar: _buildBottomAppBar(),\n floatingActionButtonLocation: _location,\n body: _buildContent(),\n ),\n );\n }\n\n Widget _buildBottomAppBar() {\n return BottomAppBar(\n elevation: 1,\n shape: CircularNotchedRectangle(),\n notchMargin: 5,\n color: Colors.red,\n child: Row(\n mainAxisAlignment: MainAxisAlignment.spaceAround,\n children: info.asMap().keys.map((i) => _buildChild(i)).toList()\n ..insertAll(isCenter ? 2 : 4, [SizedBox(width: 30)])),\n );\n }\n\n Container _buildContent() {\n return Container(\n alignment: Alignment.center,\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Text(\n '当前页索引:$_position',\n style: TextStyle(color: Colors.blue, fontSize: 18),\n ),\n Switch(\n value: isCenter,\n onChanged: (v) {\n setState(() {\n _location = v\n ? FloatingActionButtonLocation.centerDocked\n : FloatingActionButtonLocation.endDocked;\n });\n }),\n ],\n ),\n );\n }\n\n List get info => iconsMap.keys.toList();\n\n bool get isCenter => _location == FloatingActionButtonLocation.centerDocked;\n\n Widget _buildChild(int i) {\n var active = i == _position;\n return Padding(\n padding: const EdgeInsets.all(8.0),\n child: GestureDetector(\n onTap: () => setState(() => _position = i),\n child: Wrap(\n direction: Axis.vertical,\n alignment: WrapAlignment.center,\n children: [\n Icon(\n iconsMap[info[i]],\n color: active ? activeColor : Colors.white,\n size: 30,\n ),\n Text(info[i],\n style: TextStyle(\n color: active ? activeColor : Colors.white, fontSize: 14)),\n ],\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":153,"name":"RawChip点击效果","priority":1,"subtitle":" \n【label】: 中间组件 【Widget】\n【padding】 : 内边距 【EdgeInsetsGeometry】\n【labelPadding】 : label边距 【EdgeInsetsGeometry】\n【shadowColor】: 阴影色 【Color】\n【avatar】: 左侧组件 【Widget】\n【elevation】: 影深 【double】\n【pressElevation】: 点击时影深 【double】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass PressRawChip extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: RawChip(\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n label: Text('张风捷特烈'),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n elevation: 3,\n pressElevation: 5,\n shadowColor: Colors.orangeAccent,\n onPressed: () => Navigator.of(context).pushNamed('AboutMePage'),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":153,"name":"RawChip选中和删除效果","priority":2,"subtitle":" \n【selected】: 是否选中 【bool】\n【deleteIconColor】: 尾部图标色 【Color】\n【selectedColor】: 选中色 【Color】\n【deleteIcon】: 尾部组件 【Widget】\n【onSelected】: 选中事件 【Function(bool)】\n【onDeleted】 : 尾部事件 【Function()】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass SelectRawChip extends StatefulWidget {\n @override\n _SelectRawChipState createState() => _SelectRawChipState();\n}\n\nclass _SelectRawChipState extends State {\n bool _selected = false;\n @override\n Widget build(BuildContext context) {\n return Container(\n child: RawChip(\n selected: _selected,\n padding: EdgeInsets.all(5),\n labelPadding: EdgeInsets.all(3),\n deleteIconColor: Colors.red,\n selectedColor: Colors.orangeAccent.withAlpha(44),\n label: Text('张风捷特烈'),\n avatar: Image.asset(\"assets/images/icon_head.png\"),\n elevation: 3,\n pressElevation: 5,\n shadowColor: Colors.orangeAccent,\n onSelected: (v)=> setState(() => _selected=v),\n onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'),\n ),\n );\n }\n}"},{"id":null,"widgetId":46,"name":"CircularProgressIndicator基本使用","priority":1,"subtitle":" \n【value】 : 进度 【double】\n【backgroundColor】 : 背景色 【Color】\n【valueColor】 : 进度颜色 【Animation】\n【strokeWidth】 : 线宽 【double】","code":"import 'package:flutter/material.dart';\nclass CustomCircularProgressIndicator extends StatefulWidget {\n @override\n _CustomCircularProgressIndicatorState createState() =>\n _CustomCircularProgressIndicatorState();\n}\n\nclass _CustomCircularProgressIndicatorState\n extends State {\n\n var data = [0.2,0.4,0.6,0.8,null];\n\n @override\n Widget build(BuildContext context) {\n\n return Wrap(\n spacing: 10,\n children:data.map((e)=>Container(\n width: 50,\n height: 50,\n child: CircularProgressIndicator(\n value: e,\n backgroundColor: Colors.grey.withAlpha(33),\n valueColor: AlwaysStoppedAnimation(Colors.orange),\n strokeWidth: 5,\n ),\n )).toList(),\n );\n }\n}\n"},{"id":null,"widgetId":100,"name":"AnimatedCrossFade动画曲线","priority":2,"subtitle":" \n【firstCurve】 : 第一曲线 【Curve】\n【secondCurve】 : 第二曲线 【Curve】\n【sizeCurve】 : 尺寸变化曲线 【CrossFadeState】","code":"import 'package:flutter/material.dart';\nclass CurveAnimatedCrossFade extends StatefulWidget {\n @override\n _CurveAnimatedCrossFadeState createState() => _CurveAnimatedCrossFadeState();\n}\n\nclass _CurveAnimatedCrossFadeState extends State {\n var _crossFadeState = CrossFadeState.showFirst;\n\n bool get isFirst=> _crossFadeState == CrossFadeState.showFirst;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n child: AnimatedCrossFade(\n firstCurve: Curves.easeInCirc,\n secondCurve: Curves.easeInToLinear,\n sizeCurve: Curves.bounceOut,\n firstChild: Container(\n alignment: Alignment.center,\n width: 200,\n height: 80,\n color: Colors.orange ,\n child: FlutterLogo(colors: Colors.blue,size: 50,),\n ),\n secondChild: Container(\n width: 200,\n height: 150,\n alignment: Alignment.center,\n color: Colors.blue,\n child: FlutterLogo(\n textColor: Colors.white,\n colors: Colors.orange,size: 100,style: FlutterLogoStyle.stacked,),\n ),\n duration: Duration(milliseconds: 1000),\n crossFadeState: _crossFadeState,\n ),\n ),\n _buildSwitch(),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(value: isFirst, onChanged: (v){\n setState(() {\n _crossFadeState= v?CrossFadeState.showFirst:CrossFadeState.showSecond;\n });\n });\n}\n"},{"id":null,"widgetId":47,"name":"LinearProgressIndicator基本使用","priority":1,"subtitle":" \n【value】 : 进度 【double】\n【backgroundColor】 : 背景色 【Color】\n【valueColor】 : 进度颜色 【Animation】\n value为null时会不停循环","code":"import 'package:flutter/material.dart';\nclass CustomLinearProgressIndicator extends StatefulWidget {\n @override\n _CustomLinearProgressIndicatorState createState() =>\n _CustomLinearProgressIndicatorState();\n}\n\nclass _CustomLinearProgressIndicatorState\n extends State {\n var data = [0.2, 0.4, 0.6, 0.8, null];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: data\n .map((e) => Container(\n width: 50,\n height: 3,\n child:LinearProgressIndicator(\n value: e,\n backgroundColor: Colors.grey.withAlpha(33),\n valueColor: AlwaysStoppedAnimation(Colors.orange),\n ),\n ))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":100,"name":"AnimatedCrossFade基本使用","priority":1,"subtitle":" \n【firstChild】 : 第一孩子 【Widget】\n【secondChild】 : 第二孩子 【Widget】\n【crossFadeState】 : 显示第几个 【CrossFadeState】\n【duration】 : 时长 【Duration】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedCrossFade extends StatefulWidget {\n @override\n _CustomAnimatedCrossFadeState createState() =>\n _CustomAnimatedCrossFadeState();\n}\n\nclass _CustomAnimatedCrossFadeState extends State {\n var _crossFadeState = CrossFadeState.showFirst;\n\n bool get isFirst => _crossFadeState == CrossFadeState.showFirst;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n child: AnimatedCrossFade(\n firstChild: Container(\n alignment: Alignment.center,\n width: 200,\n height: 150,\n color: Colors.orange,\n child: FlutterLogo(colors: Colors.blue, size: 100,),\n ),\n secondChild: Container(\n width: 200,\n height: 150,\n alignment: Alignment.center,\n color: Colors.blue,\n child: FlutterLogo(\n textColor: Colors.white,\n colors: Colors.orange,\n size: 100,\n style: FlutterLogoStyle.stacked,),\n ),\n duration: Duration(milliseconds: 600),\n\n crossFadeState: _crossFadeState,\n ),\n ),\n _buildSwitch(),\n ],\n\n );\n }\n\n Widget _buildSwitch() =>\n Switch(value: isFirst, onChanged: (v) {\n setState(() {\n _crossFadeState =\n v ? CrossFadeState.showFirst : CrossFadeState.showSecond;\n });\n });\n}"},{"id":null,"widgetId":65,"name":"MaterialApp基本用法","priority":1,"subtitle":" \n【theme】 : 主题 【ThemeData】\n【title】 : 任务栏标题 【String】\n【onGenerateRoute】 : 路由生成器 【RouteFactory】\n【home】 : 主页 【Widget】","code":"import 'package:flutter/material.dart';\nimport '../../../../app/router.dart';\nimport '../../StatefulWidget/Scaffold/node1_base.dart';\nclass CustomMaterialApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 200,\n child: MaterialApp(\n title: 'Flutter Demo',\n onGenerateRoute: Router.generateRoute,\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: CustomScaffold(),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":245,"name":"CupertinoTextField常用样式属性","priority":2,"subtitle":"【style】 : 输入文字样式 【TextStyle】\n【prefix】: 前缀组件 【Widget】\n【prefixMode】: 前缀模式 【OverlayVisibilityMode】\n【suffix】: 后缀组件 【Widget】\n【suffixMode】: 后缀模式 【OverlayVisibilityMode】\n【cursorColor】: 游标颜色 【Color】\n【cursorWidth】: 游标宽度 【double】\n【cursorRadius】: 游标圆角 【Radius】\n【readOnly】: 是否只读 【bool】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CupertinoTextFieldStyle extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child:\n CupertinoTextField(\n style: TextStyle(color: Colors.blue),\n prefix: Icon(CupertinoIcons.add),\n prefixMode: OverlayVisibilityMode.notEditing,\n suffix: Icon(CupertinoIcons.clear),\n suffixMode: OverlayVisibilityMode.editing,\n cursorColor: Colors.purple,\n cursorWidth: 4,\n cursorRadius: Radius.circular(2),\n readOnly: false,\n placeholder: '输入用户名',\n )\n );\n }\n}\n"},{"id":null,"widgetId":245,"name":"CupertinoTextField基础使用","priority":1,"subtitle":"【placeholder】 : 提示文字 【String】\n【showCursor】 : 是否显示游标 【bool】\n【minLines】 : 最小行数 【int】\n【maxLines】 : 最大行数 【int】\n【padding】 : 内边距 【EdgeInsetsGeometry】\n【onChanged】 : 变化监听 【ValueChanged】\n【onTap】: 点击监听 【GestureTapCallback】\n【onSubmitted】: 提交监听 【ValueChanged】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CupertinoTextFieldDemo extends StatefulWidget {\n @override\n _CupertinoTextFieldDemoState createState() => _CupertinoTextFieldDemoState();\n}\n\nclass _CupertinoTextFieldDemoState extends State {\n var _value = '';\n var _color =Colors.black;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Text('输入了:$_value',style: TextStyle(color: _color),),\n CupertinoTextField(\n placeholder: 'Input Name',\n showCursor: true,\n minLines: 1,\n maxLines: 4,\n padding: EdgeInsets.all(8),\n onChanged: _onChanged,\n onTap: _onTap,\n onSubmitted: _onSubmitted,\n ),\n ],\n ),\n );\n }\n\n void _onChanged(String value) {\n setState(() {\n _value = value;\n });\n }\n\n void _onTap() {\n print('----_onTap----');\n setState(() {\n _color=Colors.blue;\n });\n }\n\n void _onSubmitted(String value) {\n print('----_onSubmitted:$value}----');\n setState(() {\n _color=Colors.black;\n });\n }\n\n}\n"},{"id":null,"widgetId":124,"name":"AnimatedDefaultTextStyle基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【textAlign】 : 文字对齐方式 【TextAlign】\n【softWrap】 : 是否包裹 【bool】\n【maxLines】 : 最大行数 【int】\n【overflow】 : 溢出模式 【TextOverflow】\n【style】 : 文字样式 【TextStyle】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedDefaultTextStyle extends StatefulWidget {\n @override\n _CustomAnimatedDefaultTextStyleState createState() =>\n _CustomAnimatedDefaultTextStyleState();\n}\n\nclass _CustomAnimatedDefaultTextStyleState\n extends State {\n final TextStyle start = TextStyle(color: Colors.blue, fontSize: 50, shadows: [\n Shadow(offset: Offset(1, 1), color: Colors.black, blurRadius: 3)\n ]);\n final TextStyle end = TextStyle(color: Colors.white, fontSize: 20, shadows: [\n Shadow(offset: Offset(1, 1), color: Colors.purple, blurRadius: 3)\n ]);\n\n TextStyle _style;\n\n @override\n void initState() {\n _style = start;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n alignment: Alignment.center,\n color: Colors.grey.withAlpha(22),\n width: 300,\n height: 100,\n child: AnimatedDefaultTextStyle(\n textAlign: TextAlign.start,\n softWrap: true,\n maxLines: 1,\n overflow: TextOverflow.ellipsis,\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n style: _style,\n onEnd: () => print('End'),\n child: Text(\n '张风捷特烈',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(\n value: _style == end,\n onChanged: (v) {\n setState(() {\n _style = v ? end : start;\n });\n });\n}\n"},{"id":null,"widgetId":231,"name":"InputDecorator基本使用","priority":1,"subtitle":"【decoration】 : 装饰对象 【InputDecoration】\n【textAlign】 : 文字对齐方式 【TextAlign】\n【child】 : 子组件 【Widget】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass InputDecoratorDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Padding(\n padding: const EdgeInsets.all(8.0),\n child: InputDecorator(\n decoration: InputDecoration(),\n child: EditableText(\n controller: TextEditingController(text:'hello'),\n focusNode: FocusNode(),\n style: TextStyle(fontSize: 12,color: Colors.black),\n cursorColor: Colors.blue,\n backgroundCursorColor: Colors.orange,\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":39,"name":"Checkbox的三态","priority":2,"subtitle":" \n【tristate】 : 是否是三态 【double】\n onChanged时,","code":"import 'package:flutter/material.dart';\nclass TristateCheckBok extends StatefulWidget {\n @override\n _TristateCheckBokState createState() => _TristateCheckBokState();\n}\n\nclass _TristateCheckBokState extends State {\n bool _checked = false;\n final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: colors\n .map((e) =>\n Checkbox(\n value: _checked,\n tristate: true,\n checkColor: Colors.white,\n activeColor: e,\n onChanged: (v) {\n print(v);\n setState(() => _checked = v);\n }))\n .toList(),\n );\n }\n}\n\n"},{"id":null,"widgetId":39,"name":"Checkbox基础用法","priority":1,"subtitle":" \n【value】 : 是否选中 【double】\n【checkColor】: 选中时✔️gou颜色 【Color】\n【activeColor】: 选中时框内颜色 【Color】\n【onChanged】: 状态改变事件 【Function(bool)】,","code":"import 'package:flutter/material.dart';\nclass CustomCheckbox extends StatefulWidget {\n @override\n _CustomCheckboxState createState() => _CustomCheckboxState();\n}\n\nclass _CustomCheckboxState extends State {\n bool _checked = false;\n final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: colors\n .map((e) =>\n Checkbox(\n value: _checked,\n checkColor: Colors.white,\n activeColor: e,\n onChanged: (v) =>\n setState(() => _checked = v)))\n .toList(),\n );\n }\n}\n\n\n"},{"id":null,"widgetId":62,"name":"CupertinoNavigationBar基本用法","priority":1,"subtitle":" \n【leading】 : 左侧组件 【Widget】\n【middle】 : 中间组件 【Widget】\n【trailing】 : 尾部组件 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【padding】 : 内边距 【EdgeInsetsDirectional】\n【border】 : 边线 【Border】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoNavigationBar extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return CupertinoNavigationBar(\n leading: Icon(\n CupertinoIcons.back,\n size: 25,\n color: Colors.blue,\n ),\n middle: Text(\"风雪雅舍\"),\n trailing: Image.asset(\n \"assets/images/icon_head.png\",\n width: 25.0,\n height: 25.0,\n ),\n backgroundColor: Color(0xfff1f1f1),\n padding: EdgeInsetsDirectional.only(start: 10,end: 20),\n border: Border.all(color: Colors.transparent),\n );\n }\n}\n"},{"id":null,"widgetId":41,"name":"CupertinoSwitch基本使用","priority":1,"subtitle":" \n【value】 : 是否选中 【double】\n【activeColor】 : 激活态颜色 【Color】\n【onChanged】 : 切换回调 【Function(double)】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoSwitch extends StatefulWidget {\n @override\n _CustomCupertinoSwitchState createState() => _CustomCupertinoSwitchState();\n}\n\nclass _CustomCupertinoSwitchState extends State {\n final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n\n bool _checked = false;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: colors\n .map((e) => CupertinoSwitch(\n value: _checked,\n activeColor: e,\n onChanged: (v) {\n setState(() => _checked = v);\n }))\n .toList(),\n );\n }\n}\n"},{"id":null,"widgetId":54,"name":"TextField基本用法","priority":1,"subtitle":" \n【controller】 : 控制器 【TextEditingController】\n【style】 : 文字样式 【TextStyle】\n【decoration】 : 装饰线 【InputDecoration】\n【onEditingComplete】 : 输入完成事件 【Function()】\n【onSubmitted】 : 提交事件 【Function(String)】\n【onChanged】 : 输入事件 【Function(String)】","code":"import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nclass CustomTextField extends StatefulWidget {\n @override\n _CustomTextFieldState createState() => _CustomTextFieldState();\n}\n\nclass _CustomTextFieldState extends State {\n final FocusNode _focusNode = FocusNode();\n TextEditingController _controller;\n\n void initState() {\n super.initState();\n _controller = TextEditingController();\n }\n\n @override\n void dispose() {\n _controller.dispose();\n _focusNode.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n child: TextField(\n controller: _controller,\n style: TextStyle(color: Colors.blue),\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n labelText: 'username',\n ),\n onEditingComplete: () {\n print('onEditingComplete');\n },\n onChanged: (v) {\n print('onChanged:' + v);\n },\n onSubmitted: (v) {\n FocusScope.of(context).requestFocus(_focusNode);\n print('onSubmitted:' + v);\n _controller.clear();\n },\n ));\n }\n}\n\n"},{"id":null,"widgetId":54,"name":"TextField行数和cursor","priority":2,"subtitle":" \n【minLines】 : 最小行数 【int】\n【maxLines】 : 最大行数 【int】\n【cursorRadius】 : 光标半径 【Radius】\n【cursorColor】 : 光标颜色 【Color】\n【cursorWidth】 : 光标宽度 【double】\n【showCursor】 : 是否显示光标 【bool】\n【autofocus】 : 自动聚焦 【bool】","code":"import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nclass CursorTextField extends StatefulWidget {\n @override\n _CursorTextFieldState createState() => _CursorTextFieldState();\n}\n\nclass _CursorTextFieldState extends State {\n final FocusNode _focusNode = FocusNode();\n\n @override\n void dispose() {\n _focusNode.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n crossAxisAlignment: CrossAxisAlignment.end,\n children: [\n _buildSubmitBtn(),\n _buildTextField(context),\n ],\n );\n }\n\n Container _buildTextField(BuildContext context) {\n return Container(\n width: 300,\n child: TextField(\n style: TextStyle(color: Colors.blue),\n minLines: 3,\n maxLines: 5,\n cursorColor: Colors.green,\n cursorRadius: Radius.circular(3),\n cursorWidth: 5,\n showCursor: true,\n decoration: InputDecoration(\n contentPadding: EdgeInsets.all(10),\n hintText: \"请输入...\",\n border: OutlineInputBorder(),\n ),\n onChanged: (v) {},\n ),\n );\n }\n\n _buildSubmitBtn() => FlatButton(\n color: Colors.blue,\n child: Text(\n \"提交\",\n style: TextStyle(color: Colors.white, fontSize: 16),\n ),\n onPressed: () => FocusScope.of(context).requestFocus(_focusNode));\n}\n"},{"id":null,"widgetId":54,"name":"decoration的复杂装饰","priority":3,"subtitle":" \nInputDecoration有非常多的装饰点,对应点缀见代码:\nborder: 边线相关\nhelper: 左下角相关提示\ncounter: 右下角相关提示\nprefix: 输入框内部最左侧\nsuffix: 输入框内部最右侧\nlabel: 无焦点时文字\nlabel: 无焦点时文字\nhint: 提示文字相关\nborder: 边线相关","code":"import 'package:flutter/material.dart';\nclass ComplexTextField extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return TextField(\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n focusedBorder: OutlineInputBorder(\n borderSide: BorderSide(color: Colors.blue),\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))),\n enabledBorder: OutlineInputBorder(\n borderSide: BorderSide(color: Colors.deepPurpleAccent),\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(10), bottomLeft: Radius.circular(10))),\n labelText: 'username',\n labelStyle: TextStyle(color: Colors.purple),\n helperText: \"help me\",\n helperStyle: TextStyle(color: Colors.blue),\n\n suffixText: \"suffix\",\n suffixIcon: Icon(Icons.done),\n suffixStyle: TextStyle(color: Colors.green),\n\n counterText: \"counter\",\n counterStyle: TextStyle(color: Colors.orange),\n\n prefixText: \"ID \",\n prefixStyle: TextStyle(color: Colors.blue),\n prefixIcon: Icon(Icons.language),\n\n fillColor: Color(0x110099ee),\n filled: true,\n\n // errorText: \"error\",\n // errorMaxLines: 1,\n // errorStyle: TextStyle(color: Colors.red),\n // errorBorder: UnderlineInputBorder(),\n\n hintText: \"请输入用户名\",\n hintMaxLines: 1,\n hintStyle: TextStyle(color: Colors.black38),\n icon: Icon(Icons.assignment_ind),\n ));\n }\n}\n"},{"id":null,"widgetId":262,"name":"CupertinoSegmentedControl的颜色","priority":2,"subtitle":" \n【unselectedColor】 : 未选中色 【Color】\n【selectedColor】 : 选中色 【Color】\n【pressedColor】 : 按下色 【Color】\n【borderColor】 : 边线色 【Color】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CupertinoSegmentedControlColor extends StatefulWidget {\n @override\n _CupertinoSegmentedControlColorState createState() =>\n _CupertinoSegmentedControlColorState();\n}\n\nclass _CupertinoSegmentedControlColorState\n extends State {\n var _value = 1;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: CupertinoSegmentedControl(\n unselectedColor: Colors.yellow,\n selectedColor: Colors.green,\n pressedColor: Colors.blue,\n borderColor: Colors.red,\n groupValue: _value,\n onValueChanged: _onValueChanged,\n padding: EdgeInsets.only(top: 20),\n children: {\n 1: Padding(\n padding: EdgeInsets.only(left: 20, right: 20),\n child: Text(\"混沌战士\"),\n ),\n 2: Text(\"青眼白龙\"),\n 3: Text(\"黑魔术士\"),\n },\n ),\n );\n }\n\n void _onValueChanged(int value) {\n setState(() {\n _value=value;\n });\n }\n}\n"},{"id":null,"widgetId":262,"name":"基本使用","priority":1,"subtitle":" \n【children】 : 组件Map 【Map】\n【onValueChanged】 : 最小值 【ValueChanged】\n【groupValue】 : 选中值 【T】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CupertinoSegmentedControlDemo extends StatefulWidget {\n @override\n _CupertinoSegmentedControlDemoState createState() =>\n _CupertinoSegmentedControlDemoState();\n}\n\nclass _CupertinoSegmentedControlDemoState\n extends State {\n var _value = 1;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: CupertinoSegmentedControl(\n groupValue: _value,\n onValueChanged: _onValueChanged,\n padding: EdgeInsets.only(top: 20),\n children: {\n 1: Padding(\n padding: EdgeInsets.only(left: 20, right: 20),\n child: Text(\"混沌战士\"),\n ),\n 2: Text(\"青眼白龙\"),\n 3: Text(\"黑魔术士\"),\n },\n ),\n );\n }\n\n void _onValueChanged(int value) {\n setState(() {\n _value=value;\n });\n }\n}\n"},{"id":null,"widgetId":42,"name":"Slider基本使用","priority":1,"subtitle":" \n【value】 : 数值 【double】\n【min】 : 最小值 【double】\n【max】 : 最大值 【double】\n【activeColor】 : 激活颜色 【Color】\n【inactiveColor】 : 非激活颜色 【Color】\n【onChanged】 : 改变时回调 【Function(double)】","code":"import 'package:flutter/material.dart';\nclass CustomSlider extends StatefulWidget {\n @override\n _CustomSliderState createState() => _CustomSliderState();\n}\n\nclass _CustomSliderState extends State {\n double _value = 0.0;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Text('当前值:${_value.toStringAsFixed(1)}'),\n Slider(\n value: _value,\n min: 0.0,\n max: 360.0,\n activeColor: Colors.orangeAccent,\n inactiveColor: Colors.green.withAlpha(99),\n onChanged: (value) {\n setState(() {\n _value = value;\n });\n }),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":42,"name":"Slider的分段与标签","priority":2,"subtitle":" \n【divisions】 : 分段数 【int】\n【label】 : 提示气泡文字 【String】\n【onChangeStart】 : 开始滑动时监听 【Function(double)】\n【onChangeEnd】 : 滑动结束时监听 【Function(double)】","code":"import 'package:flutter/material.dart';\nclass DivisionsSlider extends StatefulWidget {\n @override\n _DivisionsSliderState createState() => _DivisionsSliderState();\n}\n\nclass _DivisionsSliderState extends State {\n double _value = 0.0;\n\n @override\n Widget build(BuildContext context) {\n return Slider(\n value: _value,\n min: 0.0,\n max: 360.0,\n divisions: 10,\n label: '${_value.toStringAsFixed(1)}',\n activeColor: Colors.orangeAccent,\n inactiveColor: Colors.green.withAlpha(99),\n onChangeStart: (value) {\n print('开始滑动:$value');\n },\n onChangeEnd: (value) {\n print('滑动结束:$value');\n },\n onChanged: (value) {\n setState(() {\n _value = value;\n });\n });\n }\n}\n"},{"id":null,"widgetId":157,"name":"CupertinoPageScaffold基本用法","priority":1,"subtitle":" \n【child】 : 内容 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【navigationBar】 : 头部 【ObstructingPreferredSizeWidget】","code":"import 'package:flutter/cupertino.dart';\nclass CustomCupertinoPageScaffold extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 300,\n child: CupertinoPageScaffold(\n navigationBar: CupertinoNavigationBar(\n leading: Icon(CupertinoIcons.reply),\n trailing: Icon(CupertinoIcons.share),\n middle: Text('Flutter Unit'),\n ),\n backgroundColor: CupertinoColors.systemBackground,\n child: Center(\n child: Text('Hello, World!'),\n ),\n ),\n );\n }\n}"},{"id":null,"widgetId":200,"name":"Stepper基本使用","priority":1,"subtitle":" \n【steps】 : 步骤列表 【List】\n【currentStep】 : 当前步骤 【double】\n【onStepTapped】 : 点击回调 【ValueChanged】\n【onStepCancel】 : 上一步回调 【VoidCallback】\n【controlsBuilder】 : 控制器构造 【ControlsWidgetBuilder】","code":"import 'package:flutter/material.dart';\nclass StepperDemo extends StatefulWidget {\n @override\n _StepperDemoState createState() => _StepperDemoState();\n}\n\nclass _StepperDemoState extends State {\n int _position = 0;\n\n final stepsData = {\n \"填写表单\":'请按表单填写个人信息。',\n \"邮箱校验\":'已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。',\n \"注册完成\":'恭喜您,注册完成!',\n };\n\n final steps = [\n Step(\n title: Text(\"填写表单\"),\n content: Container(height: 60, child: Text(\"请按表单填写个人信息\")),\n ),\n Step(title: Text(\"邮箱校验\"), content: Text(\"请对您的账号进行邮箱校验\")),\n Step(title: Text(\"注册完成\"), content: Text(\"恭喜您,注册完成\")),\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Stepper(\n type:StepperType.horizontal,\n currentStep: _position,\n onStepTapped: (index) {\n setState(() {\n _position = index;\n });\n },\n onStepContinue: () {\n setState(() {\n if (_position < 2) {\n _position++;\n }\n });\n },\n onStepCancel: () {\n if (_position > 0) {\n setState(() {\n _position--;\n });\n }\n },\n controlsBuilder: (_,\n {VoidCallback onStepContinue, VoidCallback onStepCancel}) {\n return Row(\n children: [\n RaisedButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: onStepContinue,\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n ),\n RaisedButton(\n color: Colors.red,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: onStepCancel,\n child: Icon(\n Icons.keyboard_backspace,\n color: Colors.white,\n ),\n ),\n ],\n );\n },\n steps: stepsData.keys.map((e){\n bool isActive = stepsData.keys.toList().indexOf(e) ==_position;\n return Step(\n title: Text(e,style: TextStyle(color: isActive?Colors.blue:Colors.black),),\n isActive: isActive,\n state: _getState(stepsData.keys.toList().indexOf(e)),\n content: Container(height: 60, child: Text(stepsData[e])),\n );\n }).toList()),\n );\n }\n _getState(index){\n if(_position==index) return StepState.editing;\n if(_position>index) return StepState.complete;\n return StepState.indexed;\n }\n}\n"},{"id":null,"widgetId":200,"name":"Stepper的方向","priority":2,"subtitle":" \n【type】 : 方向 【StepperType】","code":"import 'package:flutter/material.dart';\nclass VerticalStepper extends StatefulWidget {\n @override\n _VerticalStepperState createState() => _VerticalStepperState();\n}\n\nclass _VerticalStepperState extends State {\n int _position = 0;\n\n final stepsData = {\n \"填写表单\": '请按表单填写个人信息。',\n \"邮箱校验\": '已将邮件发送至您的邮箱,请按照相关指示对您的账号进行邮箱校验。',\n \"注册完成\": '恭喜您,注册完成!',\n };\n\n final steps = [\n Step(\n title: Text(\"填写表单\"),\n content: Container(height: 60, child: Text(\"请按表单填写个人信息\")),\n ),\n Step(title: Text(\"邮箱校验\"), content: Text(\"请对您的账号进行邮箱校验\")),\n Step(title: Text(\"注册完成\"), content: Text(\"恭喜您,注册完成\")),\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Stepper(\n type: StepperType.vertical,\n currentStep: _position,\n onStepTapped: (index) {\n setState(() {\n _position = index;\n });\n },\n onStepContinue: () {\n setState(() {\n if (_position < 2) {\n _position++;\n }\n });\n },\n onStepCancel: () {\n if (_position > 0) {\n setState(() {\n _position--;\n });\n }\n },\n controlsBuilder: (_,\n {VoidCallback onStepContinue, VoidCallback onStepCancel}) {\n return Row(\n children: [\n RaisedButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: onStepContinue,\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n ),\n RaisedButton(\n color: Colors.red,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: onStepCancel,\n child: Icon(\n Icons.keyboard_backspace,\n color: Colors.white,\n ),\n ),\n ],\n );\n },\n steps: stepsData.keys.map((e) {\n bool isActive = stepsData.keys.toList().indexOf(e) == _position;\n return Step(\n title: Text(\n e,\n style: TextStyle(color: isActive ? Colors.blue : Colors.black),\n ),\n isActive: isActive,\n state: _getState(stepsData.keys.toList().indexOf(e)),\n content: Container(height: 60, child: Text(stepsData[e])),\n );\n }).toList()),\n );\n }\n\n _getState(index) {\n if (_position == index) return StepState.editing;\n if (_position > index) return StepState.complete;\n return StepState.indexed;\n }\n}\n"},{"id":null,"widgetId":120,"name":"AnimatedAlign基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【alignment】 : 对齐方式 【AlignmentGeometry】\n【curve】 : 动画曲线 【Duration】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedAlign extends StatefulWidget {\n @override\n _CustomAnimatedAlignState createState() => _CustomAnimatedAlignState();\n}\n\nclass _CustomAnimatedAlignState extends State {\n final Alignment start = Alignment(0, 0);\n final Alignment end = Alignment.bottomRight;\n\n Alignment _alignment;\n\n @override\n void initState() {\n _alignment = start;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: AnimatedAlign(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n alignment: _alignment,\n onEnd: () => print('End'),\n child: Container(\n height: 40,\n width: 80,\n alignment: Alignment.center,\n color: Colors.blue,\n child: Text(\n '张风捷特烈',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n ),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(\n value: _alignment == end,\n onChanged: (v) {\n setState(() {\n _alignment = v ? end : start;\n });\n });\n}\n"},{"id":null,"widgetId":48,"name":"CupertinoActivityIndicator基本使用","priority":1,"subtitle":" \n【animating】 : 是否loading动画 【bool】\n【radius】 : 半径 【double】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoActivityIndicator extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n\n return Wrap(\n spacing: 20,\n children: [\n CupertinoActivityIndicator(\n animating: true,\n radius: 25,\n ),\n CupertinoActivityIndicator(\n animating: false,\n radius: 25,\n )\n ],\n );\n }\n}\n"},{"id":null,"widgetId":123,"name":"AnimatedContainer基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【color】 : 颜色 【Color】\n【width】 : 宽 【double】\n【height】 : 高 【double】\n【alignment】 : 对齐 【AlignmentGeometry】\n【decoration】 : 装饰 【Decoration】\n【constraints】 : 约束 【BoxConstraints】\n【transform】 : 变化 【Matrix4】\n【margin】 : 外边距 【EdgeInsetsGeometry】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedContainer extends StatefulWidget {\n @override\n _CustomAnimatedContainerState createState() =>\n _CustomAnimatedContainerState();\n}\n\nclass _CustomAnimatedContainerState extends State {\n final Decoration startDecoration = BoxDecoration(\n color: Colors.blue,\n image: DecorationImage(\n image: AssetImage('assets/images/wy_200x300.jpg'), fit: BoxFit.cover),\n borderRadius: BorderRadius.all(Radius.circular(20)));\n final Decoration endDecoration = BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/wy_200x300.jpg'), fit: BoxFit.cover),\n color: Colors.orange,\n borderRadius: BorderRadius.all(Radius.circular(50)));\n\n final Alignment startAlignment = Alignment(0, 0);\n final Alignment endAlignment = Alignment.topLeft + Alignment(0.2, 0.2);\n\n final startHeight = 100.0;\n final endHeight = 50.0;\n\n Decoration _decoration;\n double _height;\n Alignment _alignment;\n\n @override\n void initState() {\n _decoration = startDecoration;\n _height = startHeight;\n _alignment=startAlignment;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n AnimatedContainer(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n alignment: _alignment,\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 120,\n child: UnconstrainedBox(\n child: AnimatedContainer(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n decoration: _decoration,\n onEnd: () => print('End'),\n height: _height,\n width: _height,\n ),\n ),\n ),\n ],\n );\n }\n\n Widget _buildSwitch() => Switch(\n value: _height == endHeight,\n onChanged: (v) {\n setState(() {\n _height = v ? endHeight : startHeight;\n _decoration = v ? endDecoration : startDecoration;\n _alignment = v ? endAlignment : startAlignment;\n });\n });\n}\n"},{"id":null,"widgetId":178,"name":"ExpansionPanelList基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【animationDuration】 : 动画时长 【Duration】\n【expansionCallback】 : 展开回调 【List】\n【onPressed】 : 点击事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomExpansionPanelList extends StatefulWidget {\n @override\n _CustomExpansionPanelListState createState() =>\n _CustomExpansionPanelListState();\n}\n\nclass _CustomExpansionPanelListState extends State {\n var data = [\n Colors.red[50],\n Colors.red[100],\n Colors.red[200],\n Colors.red[300],\n Colors.red[400],\n Colors.red[500],\n Colors.red[600],\n Colors.red[700],\n Colors.red[800],\n Colors.red[900],\n ];\n int _position = 0;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n child: ExpansionPanelList(\n children: data.map((color) => _buildItem(color)).toList(),\n animationDuration: Duration(milliseconds: 200),\n expansionCallback: (index, open) {\n setState(() => _position=open?-1:index);\n },\n ),\n );\n }\n\n ExpansionPanel _buildItem(Color color) {\n return ExpansionPanel(\n isExpanded: data.indexOf(color) == _position,\n canTapOnHeader: true,\n headerBuilder: (ctx, index) => Center(\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Container(\n height: 30,\n width: 30,\n decoration:\n BoxDecoration(color: color, shape: BoxShape.circle),\n ),\n Container(\n width: 120,\n alignment: Alignment.center,\n height: 50,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.black),\n ),\n ),\n ],\n ),\n ),\n body: Container(\n alignment: Alignment.center,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n ));\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":44,"name":"RangeSlider基本使用","priority":1,"subtitle":" \n【values】 : 数值 【RangeValues】\n【min】 : 最小值 【double】\n【max】 : 最大值 【double】\n【divisions】 : 分段数 【int】\n【label】 : 提示气泡文字 【String】\n【activeColor】 : 激活颜色 【Color】\n【inactiveColor】 : 非激活颜色 【Color】\n【onChangeStart】 : 开始滑动时监听 【Function(RangeValues)】\n【onChangeEnd】 : 滑动结束时监听 【Function(RangeValues)】\n【onChanged】 : 改变时回调 【Function(RangeValues)】","code":"import 'package:flutter/material.dart';\nclass CustomRangeSlider extends StatefulWidget {\n @override\n _CustomRangeSliderState createState() => _CustomRangeSliderState();\n}\n\nclass _CustomRangeSliderState extends State {\n RangeValues _rangeValues = RangeValues(90, 270);\n\n @override\n Widget build(BuildContext context) {\n return RangeSlider(\n values: _rangeValues,\n divisions: 180,\n min: 0.0,\n max: 360.0,\n labels: RangeLabels(\"${_rangeValues.start.toStringAsFixed(1)}\",\n \"${_rangeValues.end.toStringAsFixed(1)}\"),\n activeColor: Colors.orangeAccent,\n inactiveColor: Colors.green.withAlpha(99),\n onChangeStart: (value) {\n print('开始滑动:$value');\n },\n onChangeEnd: (value) {\n print('滑动结束:$value');\n },\n onChanged: (value) {\n setState(() {\n _rangeValues = value;\n });\n });\n }\n}\n"},{"id":null,"widgetId":136,"name":"YearPicker基本使用","priority":1,"subtitle":" \n【selectedDate】 : 选中日期 【DateTime】\n【firstDate】 : 最前日期限制 【DateTime】\n【lastDate】 : 最后日期限制 【DateTime】\n【onChanged】 : 点击回调 【Function(DateTime)】","code":"import 'package:flutter/material.dart';\nclass CustomYearPicker extends StatefulWidget {\n @override\n _CustomYearPickerState createState() => _CustomYearPickerState();\n}\n\nclass _CustomYearPickerState extends State {\n DateTime _date = DateTime.now();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height:150,\n child: YearPicker(\n selectedDate: _date,\n onChanged: (date) => setState(() => _date = date),\n firstDate: DateTime(2018),\n lastDate: DateTime(2030),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":92,"name":"SizeTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【axis】 : 轴向*2 【Axis】\n【sizeFactor】 : 动画 【Animation】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomSizeTransition extends StatefulWidget {\n @override\n _CustomSizeTransitionState createState() => _CustomSizeTransitionState();\n}\n\nclass _CustomSizeTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Wrap(\n runSpacing: 20,\n children: [\n SizeTransition(\n axis: Axis.horizontal,\n sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear),\n child: Container(\n width: MediaQuery.of(context).size.width,\n color: Colors.orange,\n child: Icon(Icons.android, color: Colors.green, size: 80)),\n ),\n SizeTransition(\n axis: Axis.vertical,\n sizeFactor: CurvedAnimation(parent: _ctrl, curve: Curves.linear),\n child: Container(\n width: MediaQuery.of(context).size.width,\n color: Colors.orange,\n child: Icon(Icons.android, color: Colors.green, size: 80)),\n ),\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":90,"name":"RotationTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【turns】 : 是否消失 【Animation】","code":"import 'package:flutter/material.dart';\nclass CustomRotationTransition extends StatefulWidget {\n @override\n _CustomRotationTransitionState createState() => _CustomRotationTransitionState();\n}\n\nclass _CustomRotationTransitionState extends State with SingleTickerProviderStateMixin{\n\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl= AnimationController(vsync: this,duration: Duration(seconds: 2));\n _ctrl.forward();\n super.initState();\n }\n@override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n color: Colors.grey.withAlpha(22),\n width: 100,\n height: 100,\n child: RotationTransition(\n turns: CurvedAnimation(parent: _ctrl, curve: Curves.linear),\n child: Icon(Icons.android,color: Colors.green,size: 60),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":116,"name":"AnimatedSwitcher基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【switchOutCurve】 : 切出曲线 【Curves】\n【switchInCurve】 : 切入曲线 【Curves】\n【switchInCurve】 : 切入曲线 【Curves】\n【transitionBuilder】 : 动画构造器 【Widget Function(Widget, Animation)】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedSwitcher extends StatefulWidget {\n @override\n _CustomAnimatedSwitcherState createState() => _CustomAnimatedSwitcherState();\n}\n\nclass _CustomAnimatedSwitcherState extends State {\n int _count = 0;\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n _buildMinusBtn(),\n SizedBox(width:80,child: _buildAnimatedSwitcher(context)),\n _buildAddBtn()\n ],\n ),\n );\n }\n\n Widget _buildAnimatedSwitcher(BuildContext context) =>\n AnimatedSwitcher(\n duration: const Duration(milliseconds: 400),\n transitionBuilder: (Widget child, Animation animation) =>\n ScaleTransition(\n child: RotationTransition(turns: animation, child: child),\n scale: animation),\n child: Text(\n '$_count',\n key: ValueKey(_count),\n style: Theme.of(context).textTheme.display3,\n ),\n );\n\n Widget _buildMinusBtn() {\n return MaterialButton(\n padding: EdgeInsets.all(0),\n textColor: Color(0xffFfffff),\n elevation: 3,\n color: Colors.red,\n highlightColor: Color(0xffF88B0A),\n splashColor: Colors.red,\n child: Icon(\n Icons.remove,\n color: Colors.white,\n ),\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: () => setState(() => _count -= 1));\n }\n\n Widget _buildAddBtn() => MaterialButton(\n padding: EdgeInsets.all(0),\n textColor: Color(0xffFfffff),\n elevation: 3,\n color: Colors.blue,\n highlightColor: Color(0xffF88B0A),\n splashColor: Colors.red,\n child: Icon(\n Icons.add,\n color: Colors.white,\n ),\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: () => setState(() => _count += 1));\n}\n"},{"id":null,"widgetId":38,"name":"可从资源文件和网络加载图片","priority":1,"subtitle":" \nImage.asset加载资源图片,","code":"import 'package:flutter/material.dart';\nclass LoadImage extends StatelessWidget {\n final assetsImagePath = \"assets/images/icon_head.png\";\n final assetsGif = \"assets/images/pica.gif\";\n final netImageUrl = \"https://user-gold-cdn.xitu.io/"\n \"/2019/7/24/16c225e78234ec26?\"\n \"imageView2/1/w/1304/h/734/q/85/format/webp/interlace/1\";\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: [\n _loadFromAssets(),\n _loadFromNet(),\n ],\n );\n }\n\n Widget _loadFromAssets() => Wrap(\n spacing: 10,\n children: [\n Image.asset(assetsImagePath, height: 80, width: 80),\n Image.asset(assetsGif, height: 80, width: 80),\n ],\n );\n\n Widget _loadFromNet() => Image.network(netImageUrl, height: 80);\n}\n"},{"id":null,"widgetId":38,"name":"图片颜色及混合模式","priority":4,"subtitle":" \n【color】 : 颜色 【Color】\n【colorBlendMode】: 混合模式*29 【BlendMode】","code":"import 'package:flutter/material.dart';\nclass BlendModeImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: BlendMode.values\n .toList()\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 60,\n height: 60,\n color: Colors.red,\n child: Image(\n image: AssetImage(\"assets/images/icon_head.png\"),\n color: Colors.blue.withAlpha(88),\n colorBlendMode: mode)),\n Text(mode.toString().split(\".\")[1])\n ]))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":38,"name":"图片对齐模式","priority":3,"subtitle":" \n【alignment】 : 颜色 【AlignmentGeometry】\n 常用Alignment类的九个静态常量,但也可定制位置","code":"import 'package:flutter/material.dart';\nclass AlignmentImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var alignment = [\n Alignment.center,\n Alignment.centerLeft,\n Alignment.centerRight,\n Alignment.topCenter,\n Alignment.topLeft,\n Alignment.topRight,\n Alignment.bottomCenter,\n Alignment.bottomLeft,\n Alignment.bottomRight\n ]; //测试数组\n var imgLi = alignment\n .map((alignment) => //生成子Widget列表\n Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 90,\n height: 60,\n color: Colors.grey.withAlpha(88),\n child: Image(\n image: AssetImage(\"assets/images/wy_30x20.jpg\"),\n alignment: alignment,\n )),\n Text(alignment.toString())\n ]))\n .toList();\n var imageAlignment = Wrap(children: imgLi);\n return imageAlignment;\n }\n}"},{"id":null,"widgetId":38,"name":"图片实现局部放大","priority":6,"subtitle":" \n【centerSlice】 : 保留的区域 【Rect】","code":"import 'package:flutter/material.dart';\nclass CenterSliceImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: 300,\n height: 80,\n child: Image.asset(\n \"assets/images/right_chat.png\",\n centerSlice: Rect.fromLTRB(9, 27, 60, 27 + 1.0),\n fit: BoxFit.fill,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":38,"name":"图片重复模式","priority":5,"subtitle":" \n【repeat】 : 重复模式*4 【ImageRepeat】","code":"import 'package:flutter/material.dart';\nclass RepeatImage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: ImageRepeat.values\n .toList()\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 150,\n height: 60,\n color: Colors.red,\n child: Image(\n image: AssetImage(\"assets/images/wy_30x20.jpg\"),\n repeat: mode)),\n Text(mode.toString().split(\".\")[1])\n ]))\n .toList(),\n );\n }\n}"},{"id":null,"widgetId":38,"name":"图片的适应模式","priority":2,"subtitle":" \n【fit】 : 适应模式*7 【BoxFit】,","code":"import 'package:flutter/material.dart';\nclass FitImage extends StatefulWidget {\n @override\n _FitImageState createState() => _FitImageState();\n}\n\nclass _FitImageState extends State {\n bool _smallImage = false;\n\n @override\n Widget build(BuildContext context) {\n var imageLi = BoxFit.values\n .toList()\n .map((mode) => Column(children: [\n Container(\n margin: EdgeInsets.all(5),\n width: 100,\n height: 80,\n color: Colors.grey.withAlpha(88),\n child: Image(\n image: AssetImage(!_smallImage\n ? \"assets/images/wy_300x200.jpg\"\n : \"assets/images/wy_30x20.jpg\"),\n fit: mode)),\n Text(mode.toString().split(\".\")[1])\n ]))\n .toList();\n\n return Wrap(\n children: [...imageLi, _buildSwitch()],\n );\n }\n\n Widget _buildSwitch() {\n return Container(\n alignment: Alignment.center,\n width: 200,\n height: 100,\n child: Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Text(\"使用小图\"),\n Switch(\n value: _smallImage,\n onChanged: (b) => setState(() => _smallImage = b)),\n ],\n ),\n );\n }\n}\n"},{"id":null,"widgetId":351,"name":"constrained属性测试","priority":2,"subtitle":"【constrained】 : 受约束的 【bool】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass InteractiveViewerDemo2 extends StatelessWidget {\n\n Widget build(BuildContext context) {\n const int _rowCount = 20;\n const int _columnCount = 4;\n\n return Container(\n width: 300,\n height: 200,\n child: InteractiveViewer(\n constrained: false,\n scaleEnabled: false,\n child: Table(\n columnWidths: {\n for (int column = 0; column < _columnCount; column += 1)\n column: const FixedColumnWidth(150.0),\n },\n children: buildRows(_rowCount, _columnCount),\n ),\n ),\n );\n }\n\n List buildRows(int rowCount, int columnCount) {\n return [\n for (int row = 0; row < rowCount; row += 1)\n TableRow(\n children: [\n for (int column = 0; column < columnCount; column += 1)\n Container(\n margin: EdgeInsets.all(2),\n height: 50,\n alignment: Alignment.center,\n color: _colorful(row,column),\n child: Text('($row,$column)',style: TextStyle(fontSize: 20,color: Colors.white),),\n ),\n ],\n ),\n ];\n }\n\n final colors = [Colors.red,Colors.yellow,Colors.blue,Colors.green];\n final colors2 = [Colors.yellow,Colors.blue,Colors.green,Colors.red];\n\n _colorful(int row, int column ) => row % 2==0?colors[column]:colors2[column];\n}\n"},{"id":null,"widgetId":351,"name":"InteractiveViewer基本使用","priority":1,"subtitle":"【alignPanAxis】 : 沿轴拖动 【bool】\n【boundaryMargin】 : 边界边距 【EdgeInsets】\n【panEnabled】 : 是否可平移 【bool】\n【scaleEnabled】 : 是否可缩放 【bool】\n【maxScale】 : 最大放大倍数 【double】\n【minScale】 : 最小缩小倍数 【double】\n【onInteractionEnd】 : 交互结束回调 【GestureScaleEndCallback】\n【onInteractionStart】 : 交互开始回调 【GestureScaleStartCallback】\n【onInteractionUpdate】 : 交互更新回调 【GestureScaleUpdateCallback】\n【child】 : 游标颜色 【Widget】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass InteractiveViewerDemo extends StatelessWidget {\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n color: Colors.grey.withAlpha(33),\n child: InteractiveViewer(\n boundaryMargin: EdgeInsets.all(40.0),\n maxScale: 2.5,\n minScale: 0.3,\n panEnabled: true,\n scaleEnabled: true,\n child: Container(\n child: Image.asset('assets/images/caver.jpeg'),\n ),\n onInteractionStart: _onInteractionStart,\n onInteractionUpdate: _onInteractionUpdate,\n onInteractionEnd: _onInteractionEnd,\n ),\n );\n }\n\n void _onInteractionStart(ScaleStartDetails details) {\n print('onInteractionStart----' + details.toString());\n }\n\n void _onInteractionUpdate(ScaleUpdateDetails details) {\n print('onInteractionUpdate----' + details.toString());\n }\n\n void _onInteractionEnd(ScaleEndDetails details) {\n print('onInteractionEnd----' + details.toString());\n }\n}\n"},{"id":null,"widgetId":351,"name":"变换控制器的使用","priority":3,"subtitle":"【transformationController】 : 变换控制器 【TransformationController】","code":"import 'dart:math';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass InteractiveViewerDemo3 extends StatefulWidget {\n @override\n _InteractiveViewerDemo3State createState() => _InteractiveViewerDemo3State();\n}\n\nclass _InteractiveViewerDemo3State extends State\n with SingleTickerProviderStateMixin {\n final TransformationController _transformationController =\n TransformationController();\n Animation _animationReset;\n AnimationController _controllerReset;\n\n void _onAnimateReset() {\n _transformationController.value = _animationReset.value;\n if (!_controllerReset.isAnimating) {\n _animationReset?.removeListener(_onAnimateReset);\n _animationReset = null;\n _controllerReset.reset();\n }\n }\n\n void _animateResetInitialize() {\n _controllerReset.reset();\n _animationReset = Matrix4Tween(\n begin: _transformationController.value,\n end: Matrix4.identity(),\n ).animate(_controllerReset);\n _animationReset.addListener(_onAnimateReset);\n _controllerReset.forward();\n }\n\n void _animateResetStop() {\n _controllerReset.stop();\n _animationReset?.removeListener(_onAnimateReset);\n _animationReset = null;\n _controllerReset.reset();\n }\n\n void _onInteractionStart(ScaleStartDetails details) {\n if (_controllerReset.status == AnimationStatus.forward) {\n _animateResetStop();\n }\n }\n\n @override\n void initState() {\n super.initState();\n _controllerReset = AnimationController(\n vsync: this,\n duration: const Duration(milliseconds: 400),\n );\n }\n\n @override\n void dispose() {\n _controllerReset.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n direction: Axis.vertical,\n spacing: 10,\n crossAxisAlignment: WrapCrossAlignment.center,\n alignment: WrapAlignment.center,\n children: [\n Container(\n height: 150,\n color: Colors.grey.withAlpha(33),\n child: InteractiveViewer(\n boundaryMargin: EdgeInsets.all(40),\n transformationController: _transformationController,\n minScale: 0.1,\n maxScale: 1.8,\n onInteractionStart: _onInteractionStart,\n child: Container(\n child: Image.asset('assets/images/caver.jpeg'),\n ),\n ),\n ),\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n _buildButton(),\n _buildButton2(),\n _buildButton3(),\n ],\n )\n ],\n );\n }\n\n Widget _buildButton() {\n return MaterialButton(\n child: Icon(\n Icons.refresh,\n color: Colors.white,\n ),\n color: Colors.green,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: _animateResetInitialize);\n }\n\n var _x = 0.0;\n\n Widget _buildButton2() {\n return MaterialButton(\n child: Icon(\n Icons.navigate_before,\n color: Colors.white,\n ),\n color: Colors.green,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: () {\n var temp = _transformationController.value.clone();\n temp.translate(_x - 4);\n _transformationController.value = temp;\n });\n }\n\n Widget _buildButton3() {\n return MaterialButton(\n child: Icon(\n Icons.navigate_next,\n color: Colors.white,\n ),\n color: Colors.green,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: () {\n var temp = _transformationController.value.clone();\n temp.translate(_x + 4);\n _transformationController.value = temp;\n });\n }\n}\n"},{"id":null,"widgetId":255,"name":"ValueListenableBuilder基本使用","priority":1,"subtitle":"【builder】: 组件构造器 【ValueWidgetBuilder】\n【valueListenable】: 监听值 【ValueListenable】\n【child】: 子组件 【Widget】","code":"import 'package:flutter/material.dart';\nclass ValueListenableBuilderDemo extends StatelessWidget {\n ValueListenableBuilderDemo({Key key}) : super(key: key);\n\n final ValueNotifier _counter = ValueNotifier(0);\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scaffold(\n appBar: AppBar(title: Text(\"ValueListenableBuilder\")),\n body: Center(\n child: Column(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n Text('You have pushed the button this many times:'),\n ValueListenableBuilder(\n builder: _buildWithValue,\n valueListenable: _counter,\n child: const Text('I am Child!'),\n )\n ],\n ),\n ),\n floatingActionButton: FloatingActionButton(\n child: Icon(Icons.plus_one),\n onPressed: () => _counter.value += 1,\n ),\n ),\n );\n }\n\n Widget _buildWithValue(BuildContext context, int value, Widget child) {\n return Row(\n mainAxisAlignment: MainAxisAlignment.spaceAround,\n children: [\n Text('$value'),\n child,\n ],\n );\n }\n}\n"},{"id":null,"widgetId":177,"name":"ReorderableListView基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【header】 : 头部组件 【Widget】\n【padding】 : 内边距 【EdgeInsets】\n【onReorder】 : 调换时回调 【ReorderCallback】","code":"import 'package:flutter/material.dart';\nclass CustomReorderableListView extends StatefulWidget {\n @override\n _CustomReorderableListViewState createState() => _CustomReorderableListViewState();\n}\n\nclass _CustomReorderableListViewState extends State {\n var data = [\n Colors.yellow[50],\n Colors.yellow[100],\n Colors.yellow[200],\n Colors.yellow[300],\n Colors.yellow[400],\n Colors.yellow[500],\n Colors.yellow[600],\n Colors.yellow[700],\n Colors.yellow[800],\n Colors.yellow[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 250,\n child: ReorderableListView(\n padding: EdgeInsets.all(10),\n header: Container(\n color: Colors.blue,\n alignment: Alignment.center,\n height: 50,\n child: Text('长按拖拽进行换位',style: TextStyle(color: Colors.white),)),\n onReorder: _handleReorder,\n children: data.map((color) => _buildItem(color)).toList(),\n ),\n );\n }\n\n void _handleReorder(int oldIndex, int newIndex) {\n if (oldIndex < newIndex) {\n newIndex -= 1;\n }\n\n setState(() {\n final element = data.removeAt(oldIndex);\n data.insert(newIndex, element);\n });\n\n }\n\n Widget _buildItem(Color color) {\n return Container(\n key: ValueKey(color) ,\n alignment: Alignment.center,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":177,"name":"ReorderableListView滑动方向","priority":2,"subtitle":" \n【scrollDirection】 : 滑动方向 【Axis】\n【reverse】 : 是否反向 【bool】","code":"import 'package:flutter/material.dart';\nclass DirectionReorderableListView extends StatefulWidget {\n @override\n _DirectionReorderableListViewState createState() => _DirectionReorderableListViewState();\n}\n\nclass _DirectionReorderableListViewState extends State {\n var data = [\n Colors.yellow[50],\n Colors.yellow[100],\n Colors.yellow[200],\n Colors.yellow[300],\n Colors.yellow[400],\n Colors.yellow[500],\n Colors.yellow[600],\n Colors.yellow[700],\n Colors.yellow[800],\n Colors.yellow[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: ReorderableListView(\n scrollDirection: Axis.horizontal,\n reverse: false,\n onReorder: _handleReorder,\n children: data.map((color) => _buildItem(color)).toList(),\n ),\n );\n }\n\n void _handleReorder(int oldIndex, int newIndex) {\n if (oldIndex < newIndex) {\n newIndex -= 1;\n }\n\n setState(() {\n final element = data.removeAt(oldIndex);\n data.insert(newIndex, element);\n });\n\n }\n\n Widget _buildItem(Color color) {\n return Container(\n key: ValueKey(color) ,\n alignment: Alignment.center,\n width: 80,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2)\n ]),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":113,"name":"DecoratedBoxTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【position】 : 前/背景色 【DecorationPosition】\n【decoration】 : 动画 【Animation】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomDecoratedBoxTransition extends StatefulWidget {\n @override\n _CustomDecoratedBoxTransitionState createState() =>\n _CustomDecoratedBoxTransitionState();\n}\n\nclass _CustomDecoratedBoxTransitionState\n extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n width: 200,\n height: 100,\n child: DecoratedBoxTransition(\n position: DecorationPosition.background,\n decoration: DecorationTween(\n begin: BoxDecoration(\n color: Colors.greenAccent,\n borderRadius: BorderRadius.all(Radius.circular(50)),\n boxShadow: [\n BoxShadow(\n offset: Offset(1, 1),\n color: Colors.purple,\n blurRadius: 3,\n spreadRadius: 1)\n ]),\n end: BoxDecoration(\n color: Colors.orange,\n borderRadius: BorderRadius.all(Radius.circular(10)),\n boxShadow: [\n BoxShadow(\n offset: Offset(1, 1),\n color: Colors.blue,\n blurRadius: 1,\n spreadRadius: 0)\n ])).animate(_ctrl),\n child: Container(\n child: Icon(Icons.android, color: Colors.white, size: 60)),\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":52,"name":"ExpansionTile基本使用","priority":1,"subtitle":" \n【children】 : 展开内容 【List】\n【leading】 : 头左组件 【Widget】\n【title】 : 头中组件 【Widget】\n【trailing】 : 头尾组件 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【onExpansionChanged】 : 折叠事件 【Function(bool)】\n【initiallyExpanded】 : 是否初始时展开 【bool】","code":"import 'package:flutter/material.dart';\nimport '../../StatelessWidget/RadioListTile/node1_base.dart';\nclass CustomExpansionTile extends StatefulWidget {\n @override\n _CustomExpansionTileState createState() => _CustomExpansionTileState();\n}\n\nclass _CustomExpansionTileState extends State {\n @override\n Widget build(BuildContext context) {\n return ExpansionTile(\n leading: Icon(Icons.star),\n title: Text(\"选择语言\"),\n backgroundColor: Colors.grey.withAlpha(6),\n onExpansionChanged: (value) {\n print('$value');\n },\n initiallyExpanded: false,\n children: [CustomRadioListTile()],\n );\n }\n}\n"},{"id":null,"widgetId":158,"name":"CupertinoTabScaffold基本用法","priority":1,"subtitle":" \n【tabBar】 : 页签条 【CupertinoTabBar】\n【backgroundColor】 : 背景色 【Color】\n【controller】 : 控制器 【CupertinoTabController】\n【tabBuilder】 : 页面构造器 【IndexedWidgetBuilder】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoTabScaffold extends StatefulWidget {\n @override\n _CustomCupertinoTabScaffoldState createState() =>\n _CustomCupertinoTabScaffoldState();\n}\n\nclass _CustomCupertinoTabScaffoldState\n extends State {\n var _position = 0;\n final iconsMap = {\n //底栏图标\n \"图鉴\": Icons.home, \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite, \"手册\": Icons.class_,\n \"我的\": Icons.account_circle,\n };\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 300,\n child: CupertinoTabScaffold(\n backgroundColor: Colors.grey.withAlpha(11),\n tabBar: _buildTabBar(),\n tabBuilder: (_, index) => _buildContent(index)),\n );\n }\n\n CupertinoTabBar _buildTabBar() => CupertinoTabBar(\n currentIndex: _position,\n onTap: (value) => setState(() => _position = value),\n items: iconsMap.keys\n .map((e) => BottomNavigationBarItem(\n icon: Icon(\n iconsMap[e],\n ),\n title: Text(e),\n ))\n .toList(),\n activeColor: Colors.blue,\n inactiveColor: Color(0xff333333),\n backgroundColor: Color(0xfff1f1f1),\n iconSize: 25.0,\n );\n\n _buildContent(int index) => Container(\n alignment: Alignment.center,\n child: Text(iconsMap.keys.toList()[index]),\n );\n}\n"},{"id":null,"widgetId":105,"name":"LongPressDraggable与DragTarget联用","priority":1,"subtitle":" \n【child】 : 孩子 【Widget】\n【feedback】 : 拖拽时的孩子 【Widget】\n【axis】 : 拖动的轴 【Axis】\n【data】 : 数据 【T】\n【onDragStarted】 : 开始拖拽 【Function()】\n【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n【onDragCompleted】 : 拖拽完成 【Function()】\n【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】","code":"import 'package:flutter/material.dart';\nclass CustomLongPressDraggable extends StatefulWidget {\n @override\n _CustomLongPressDraggableState createState() => _CustomLongPressDraggableState();\n}\n\nclass _CustomLongPressDraggableState extends State {\n Color _color = Colors.grey;\n String _info = 'DragTarget';\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Wrap(\n children: _buildColors(),\n spacing: 10,\n ),\n SizedBox(height: 20,),\n _buildDragTarget()\n ],\n ),\n );\n }\n\n List _buildColors() {\n var colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.orange,\n Colors.purple,\n Colors.cyanAccent\n ];\n return colors\n .map(\n (e) => LongPressDraggable(\n onDragStarted: () => setState(() => _info = '开始拖拽'),\n onDragEnd: (d) => setState(() => _info = '结束拖拽'),\n onDragCompleted: () => _info = '拖拽完成',\n onDraggableCanceled: (v, o) => _info = '拖拽取消',\n child: Container(\n width: 30,\n height: 30,\n alignment: Alignment.center,\n child: Text(\n colors.indexOf(e).toString(),\n style: TextStyle(\n color: Colors.white, fontWeight: FontWeight.bold),\n ),\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n ),\n data: e,\n feedback: Container(\n width: 25,\n height: 25,\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n )),\n )\n .toList();\n }\n\n Widget _buildDragTarget() {\n return DragTarget(\n onAccept: (data) => setState(() {\n _info='onAccept';\n _color = data;\n }),\n builder: (context, candidateData, rejectedData) => Container(\n width: 150.0,\n height: 50.0,\n color: _color,\n child: Center(\n child: Text(\n _info,\n style: TextStyle(color: Colors.white),\n ),\n )));\n }\n}\n"},{"id":null,"widgetId":138,"name":"CupertinoTimerPicker基本使用","priority":1,"subtitle":" \n【initialTimerDuration】 : 初始时间 【Duration】\n【minuteInterval】 : 分钟间隔数 【double】\n【secondInterval】 : 秒间隔数 【double】\n【alignment】 : 对齐方式 【AlignmentGeometry】\n【backgroundColor】 : 背景色 【Color】\n【mode】 : 模式*3 【CupertinoTimerPickerMode】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoTimerPicker extends StatefulWidget {\n @override\n _CustomCupertinoTimerPickerState createState() =>\n _CustomCupertinoTimerPickerState();\n}\n\nclass _CustomCupertinoTimerPickerState\n extends State {\n Duration _date = Duration(seconds: 30);\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Text(\n '当前时间:${_date.toString()}',\n style: TextStyle(color: Colors.grey, fontSize: 16),\n ),\n _buildInfoTitle('CupertinoTimerPickerMode.hms'),\n buildPicker(CupertinoTimerPickerMode.hms),\n _buildInfoTitle('CupertinoTimerPickerMode.hm'),\n buildPicker(CupertinoTimerPickerMode.hm),\n _buildInfoTitle('CupertinoTimerPickerMode.ms'),\n buildPicker(CupertinoTimerPickerMode.ms),\n ],\n );\n }\n\n Widget _buildInfoTitle(info) {\n return Padding(\n padding: const EdgeInsets.only(left: 20, top: 20, bottom: 5),\n child: Text(\n info,\n style: TextStyle(\n color: Colors.blue, fontSize: 16, fontWeight: FontWeight.bold),\n ),\n );\n }\n\n Widget buildPicker(CupertinoTimerPickerMode mode) {\n return Container(\n margin: EdgeInsets.all(10),\n height: 150,\n child: CupertinoTimerPicker(\n mode: mode,\n initialTimerDuration: Duration(seconds: 30),\n onTimerDurationChanged: (date) {\n print(date);\n setState(() => _date = date);\n },\n ),\n );\n }\n}\n"},{"id":null,"widgetId":93,"name":"PositionedTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【rect】 : 动画 【Animation】\n PositionedTransition组件只能在Stack内起作用","code":"import 'package:flutter/material.dart';\nclass CustomPositionedTransition extends StatefulWidget {\n @override\n _CustomPositionedTransitionState createState() =>\n _CustomPositionedTransitionState();\n}\n\nclass _CustomPositionedTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 2));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n color: Colors.grey.withAlpha(33),\n width: 200,\n height: 100,\n child: Stack(\n children: [\n PositionedTransition(\n rect: RelativeRectTween(\n begin: RelativeRect.fromLTRB(0, 50, 150, 100),\n end: RelativeRect.fromLTRB(60, 0, 150, -50),\n ).animate(_ctrl),\n child: Icon(\n Icons.android,\n color: Colors.green,\n size: 50,\n ),\n )\n ],\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":103,"name":"Draggable基本使用","priority":1,"subtitle":" \n【child】 : 孩子 【Widget】\n【feedback】 : 拖拽时的孩子 【Widget】\n【axis】 : 拖动的轴 【Axis】","code":"import 'package:flutter/material.dart';\nclass CustomDraggable extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var axis = [null, Axis.vertical, Axis.horizontal];\n return Wrap(\n spacing: 30,\n children: axis\n .map((e) => Draggable(\n axis: e,\n child: Container(\n width: 30,\n height: 30,\n alignment: Alignment.center,\n decoration: BoxDecoration(\n color: Colors.blue, shape: BoxShape.circle),\n ),\n feedback: Container(\n width: 30,\n height: 30,\n decoration: BoxDecoration(\n color: Colors.red, shape: BoxShape.circle),\n ),\n ))\n .toList());\n }\n}"},{"id":null,"widgetId":103,"name":"Draggable其他使用","priority":3,"subtitle":" \n可以根据拖拽来处理一些事件。如删除、查询、弹框等","code":"import 'package:flutter/material.dart';\nclass DeleteDraggable extends StatefulWidget {\n @override\n _DeleteDraggableState createState() => _DeleteDraggableState();\n}\n\nclass _DeleteDraggableState extends State {\n List colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.orange,\n Colors.purple,\n Colors.cyanAccent\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Wrap(\n children: _buildColors(),\n spacing: 10,\n ),\n SizedBox(\n height: 20,\n ),\n _buildDragTarget()\n ],\n ),\n );\n }\n\n Widget _buildDragTarget() {\n return DragTarget(\n onAccept: (data) {\n setState(() {\n colors.removeAt(data);\n });\n },\n onWillAccept: (data) => data != null,\n builder: (context, candidateData, rejectedData) => Container(\n width: 50.0,\n height: 50.0,\n decoration:\n BoxDecoration(color: Colors.red, shape: BoxShape.circle),\n child: Center(\n child: Icon(Icons.delete_sweep, color: Colors.white),\n )));\n }\n\n List _buildColors() => colors\n .map(\n (e) => Draggable(\n child: Container(\n width: 30,\n height: 30,\n alignment: Alignment.center,\n child: Text(\n colors.indexOf(e).toString(),\n style:\n TextStyle(color: Colors.white, fontWeight: FontWeight.bold),\n ),\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n ),\n data: colors.indexOf(e),\n feedback: Container(\n width: 25,\n height: 25,\n decoration: BoxDecoration(\n color: e.withAlpha(100), shape: BoxShape.circle),\n )),\n )\n .toList();\n}\n"},{"id":null,"widgetId":103,"name":"Draggable与DragTarget联用","priority":2,"subtitle":" \n【data】 : 数据 【T】\n【onDragStarted】 : 开始拖拽 【Function()】\n【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n【onDragCompleted】 : 拖拽完成 【Function()】\n【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】\n【onChanged】 : 改变时回调 【Function(T)】","code":"import 'package:flutter/material.dart';\nclass DraggablePage extends StatefulWidget {\n @override\n _DraggablePageState createState() => _DraggablePageState();\n}\n\nclass _DraggablePageState extends State {\n Color _color = Colors.grey;\n String _info = 'DragTarget';\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Wrap(\n children: _buildColors(),\n spacing: 10,\n ),\n SizedBox(\n height: 20,\n ),\n _buildDragTarget()\n ],\n ),\n );\n }\n\n List _buildColors() {\n var colors = [\n Colors.red,\n Colors.yellow,\n Colors.blue,\n Colors.green,\n Colors.orange,\n Colors.purple,\n Colors.cyanAccent\n ];\n return colors\n .map(\n (e) => Draggable(\n onDragStarted: () => setState(() => _info = '开始拖拽'),\n onDragEnd: (d) => setState(() => _info = '结束拖拽'),\n onDragCompleted: () => _info = '拖拽完成',\n onDraggableCanceled: (v, o) => _info = '拖拽取消',\n child: Container(\n width: 30,\n height: 30,\n alignment: Alignment.center,\n child: Text(\n colors.indexOf(e).toString(),\n style: TextStyle(\n color: Colors.white, fontWeight: FontWeight.bold),\n ),\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n ),\n data: e,\n feedback: Container(\n width: 25,\n height: 25,\n decoration: BoxDecoration(color: e, shape: BoxShape.circle),\n )),\n )\n .toList();\n }\n\n Widget _buildDragTarget() {\n return DragTarget(\n onLeave: (data) => print(\"onLeave: data = $data \"),\n onAccept: (data) {\n print(\"onAccept: data = $data \");\n setState(() {\n _color = data;\n });\n },\n onWillAccept: (data) {\n print(\"onWillAccept: data = $data \");\n return data != null;\n },\n builder: (context, candidateData, rejectedData) => Container(\n width: 150.0,\n height: 50.0,\n color: _color,\n child: Center(\n child: Text(\n _info,\n style: TextStyle(color: Colors.white),\n ),\n )));\n }\n}\n"},{"id":null,"widgetId":121,"name":"AnimatedPositioned基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【top】 : 到父顶距离 【double】\n【right】 : 到父右距离 【double】\n【left】 : 到父左距离 【double】\n【bottom】 : 到父底距离 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedPositioned extends StatefulWidget {\n @override\n _CustomAnimatedPositionedState createState() =>\n _CustomAnimatedPositionedState();\n}\n\nclass _CustomAnimatedPositionedState extends State {\n final startTop = 0.0;\n final endTop = 30.0;\n\n var _top = 0.0;\n\n @override\n void initState() {\n _top = startTop;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n color: Colors.grey.withAlpha(33),\n width: 200,\n height: 100,\n child: Stack(\n children: _buildChildren(),\n ),\n ),\n ],\n );\n }\n\n List _buildChildren() => [\n AnimatedPositioned(\n duration: Duration(seconds: 1),\n top: _top,\n left: _top * 4,\n child: Icon(\n Icons.android,\n color: Colors.green,\n size: 50,\n ),\n ),\n AnimatedPositioned(\n duration: Duration(seconds: 1),\n top: 50 - _top,\n left: 150 - _top * 4,\n child: Icon(\n Icons.android,\n color: Colors.red,\n size: 50,\n ),\n )\n ];\n\n Widget _buildSwitch() => Switch(\n value: _top == endTop,\n onChanged: (v) {\n setState(() {\n _top = v ? endTop : startTop;\n });\n });\n}\n"},{"id":null,"widgetId":51,"name":"ExpandIcon基本使用","priority":1,"subtitle":" \n【isExpanded】 : 是否展开 【bool】\n【padding】 : 内边距 【EdgeInsetsGeometry】,\n【size】 : 图标大小 【double】\n【color】 : 不展开时颜色 【Color】\n【expandedColor】 : 展开时颜色 【Color】\n【onPressed】 : 点击事件 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass CustomExpandIcon extends StatefulWidget {\n @override\n _CustomExpandIconState createState() => _CustomExpandIconState();\n}\n\nclass _CustomExpandIconState extends State {\n var _closed = true;\n\n @override\n Widget build(BuildContext context) {\n return ExpandIcon(\n isExpanded: _closed,\n padding: EdgeInsets.all(5),\n size: 30,\n color: Colors.blue,\n expandedColor: Colors.orangeAccent,\n onPressed: (value) => setState(() => _closed = !_closed),\n );\n }\n}\n"},{"id":null,"widgetId":199,"name":"TextFormField基本使用","priority":1,"subtitle":" \n 基本属性和TextField一致,详见之\n【validator】 : 验证函数 【FormFieldValidator 】\n【onFieldSubmitted】 : 提交回调 【ValueChanged】\n【onSaved】 : 表单save时回调 【FormFieldSetter】","code":"import 'package:flutter/material.dart';\nclass CustomTextFormField extends StatefulWidget {\n @override\n _CustomTextFormFieldState createState() => _CustomTextFormFieldState();\n}\n\nclass _CustomTextFormFieldState extends State {\n GlobalKey _formKey = GlobalKey();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Form(\n key: _formKey,\n child:\n Stack(\n alignment: Alignment.centerRight,\n children: [\n Container(\n width: 350,\n child: UnconstrainedBox(\n child: Container(\n width: 200,\n height: 70,\n child: TextFormField(\n style: TextStyle(textBaseline: TextBaseline.alphabetic),\n decoration: InputDecoration(\n border: OutlineInputBorder(),\n labelText: 'username',\n ),\n validator: _validateUsername,\n onFieldSubmitted: _onFieldSubmitted,\n onSaved: _onSaved,\n ),\n ),\n ),\n ),\n Positioned(\n top: 0, right: 0, child: _buildSubmitButton(context)),\n ],\n ),\n ),\n );\n }\n\n String _validateUsername(value) {\n if (value.isEmpty) {\n return '用户名不能为空';\n }\n return null;\n }\n _onSaved(value){\n print('onSaved:'+value);\n }\n\n void _onFieldSubmitted(value) {\n print('onFieldSubmitted:'+value);\n }\n\n RaisedButton _buildSubmitButton(BuildContext context) {\n return RaisedButton(\n color: Colors.blue,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n onPressed: _onSubmit,\n child: Icon(\n Icons.check,\n color: Colors.white,\n ),\n );\n }\n\n _onSubmit(){\n _formKey.currentState.save();\n if (_formKey.currentState.validate()) {\n FocusScope.of(context).requestFocus(FocusNode());\n }\n }\n}"},{"id":null,"widgetId":253,"name":"Scrollable的基本使用","priority":1,"subtitle":"【viewportBuilder】 : 视口构造器 【ViewportBuilder】\n【axisDirection】: 滑动方向 【AxisDirection】\n【controller】: 滑动控制器 【ScrollController】\n【dragStartBehavior】: t拖动行为 【DragStartBehavior】\n【physics】: 滚动现象 【ScrollPhysics】\n【color】: 子组件 【Color】","code":"import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nclass ScrollableDemo extends StatelessWidget {\n final data = List.generate(32, (i) => Color(0xFF6600FF - 2 * i));\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 250,\n child: Scrollable(\n axisDirection: AxisDirection.down,\n physics: BouncingScrollPhysics(),\n dragStartBehavior: DragStartBehavior.start,\n viewportBuilder: (ctx, position) => Viewport(\n cacheExtent: 200,\n cacheExtentStyle: CacheExtentStyle.pixel,\n offset: position,\n slivers: [_buildSliverList()],\n ),\n ),\n );\n }\n\n Widget _buildSliverList() => SliverList(\n delegate: SliverChildBuilderDelegate(\n (_, int index) => Container(\n margin: EdgeInsets.only(top: 1),\n alignment: Alignment.center,\n width: 100,\n height: 60,\n color: data[index],\n child: Text(\n colorString(data[index]),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ),\n childCount: data.length),\n );\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}\n"},{"id":null,"widgetId":40,"name":"Switch基础用法","priority":1,"subtitle":" \n【inactiveThumbColor】 : 未选中小圈颜色 【Color】\n【inactiveTrackColor】 : 未选中滑槽颜色 【Color】\n【activeColor】 : 选中时小圈颜色 【Color】\n【activeTrackColor】 : 选中时滑槽颜色 【Color】\n【onChanged】 : 切换回调 【Function(double)】\"\n onChanged时,回调true、null、false三种状态","code":"import 'package:flutter/material.dart';\nclass CustomSwitch extends StatefulWidget {\n @override\n _CustomSwitchState createState() => _CustomSwitchState();\n}\n\nclass _CustomSwitchState extends State {\n final colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n bool _checked = false;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: colors\n .map((e) =>\n Switch(\n value: _checked,\n inactiveThumbColor: e,\n inactiveTrackColor: Colors.grey.withAlpha(88),\n activeColor: Colors.green,\n activeTrackColor: Colors.orange,\n onChanged: (v) {\n setState(() => _checked = v);\n }))\n .toList(),\n );\n }\n}\n\n"},{"id":null,"widgetId":40,"name":"Switch图片","priority":2,"subtitle":" \n【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】\n【activeThumbImage】 : 选中时滑槽颜色 【ImageProvider】","code":"import 'package:flutter/material.dart';\nclass ImageSwitch extends StatefulWidget {\n @override\n _ImageSwitchState createState() => _ImageSwitchState();\n}\n\nclass _ImageSwitchState extends State {\n final imgs = [\n \"assets/images/head_icon/icon_5.jpg\",\n \"assets/images/head_icon/icon_6.jpg\",\n \"assets/images/head_icon/icon_7.jpg\",\n \"assets/images/head_icon/icon_8.jpg\"];\n bool _checked = false;\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n children: imgs\n .map((e) =>\n Switch(\n value: _checked,\n inactiveThumbImage: AssetImage(e),\n activeThumbImage: AssetImage('assets/images/pica.gif'),\n onChanged: (v) {\n setState(() => _checked = v);\n }))\n .toList(),\n );\n }\n}\n\n"},{"id":null,"widgetId":232,"name":"Navigator基本用法","priority":1,"subtitle":" \n【initialRoute】 : 最初显示路由 【String】\n【onGenerateRoute】 : 路由生成器 【RouteFactory】\n【observers】 : 路由监听器 【List】\n【onPopPage】 : 出栈回调 【PopPageCallback】","code":"import 'package:flutter/material.dart';\nclass NavigatorDemo extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n width: 300,\n child: Navigator(\n onPopPage: _onPopPage,\n initialRoute: '/home-content',\n onGenerateRoute: _onGenerateRoute,\n observers: [TolyNavigatorObservers()],\n ),\n );\n }\n\n Route _onGenerateRoute(RouteSettings settings) {\n switch (settings.name) {\n case '/home-content':\n return MaterialPageRoute(\n builder: (_) => HomeContent(), settings: settings);\n case \"/red\":\n return MaterialPageRoute(builder: (_) => RedPage(), settings: settings);\n case \"/yellow\":\n return MaterialPageRoute(\n builder: (_) => YellowPage(), settings: settings);\n case \"/green\":\n return MaterialPageRoute(\n builder: (_) => GreenPage(), settings: settings);\n default:\n return MaterialPageRoute(\n builder: (_) => HomeContent(), settings: settings);\n }\n }\n\n bool _onPopPage(Route route, result) {\n print('----_onPopPage-----');\n return true;\n }\n}\n\n//路由监听器\nclass TolyNavigatorObservers extends NavigatorObserver {\n @override\n void didPush(Route route, Route previousRoute) {\n print(\n '--didPush:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}');\n }\n\n @override\n void didStopUserGesture() {\n print('--didStopUserGesture:--');\n }\n\n @override\n void didStartUserGesture(Route route, Route previousRoute) {\n print(\n '--didStartUserGesture:--route:--${route.settings}--previousRoute:--${previousRoute.settings}');\n }\n\n @override\n void didReplace({Route newRoute, Route oldRoute}) {\n print(\n '--didReplace:--newRoute:--${newRoute.settings}--oldRoute:--${oldRoute.settings}');\n }\n\n @override\n void didRemove(Route route, Route previousRoute) {\n print(\n '--didRemove:--route:--${route.settings}--previousRoute:--${previousRoute.settings}');\n }\n\n @override\n void didPop(Route route, Route previousRoute) {\n print(\n '--didPop:--route:--${route.settings}--previousRoute:--${previousRoute.settings}');\n }\n}\n\nclass HomeContent extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n Row(\n mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n children: [\n RaisedButton(\n color: Colors.red,\n onPressed: () {\n Navigator.pushNamed(context, '/red');\n },\n ),\n RaisedButton(\n color: Colors.yellow,\n onPressed: () {\n Navigator.pushNamed(context, '/yellow');\n },\n ),\n RaisedButton(\n color: Colors.green,\n onPressed: () {\n Navigator.pushNamed(context, '/green');\n },\n )\n ],\n ),\n ],\n ),\n );\n }\n}\n\nclass RedPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n appBar: AppBar(\n title: Text(\"RedPage\"),\n ),\n body: Container(\n color: Colors.red,\n ),\n );\n }\n}\n\nclass YellowPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n appBar: AppBar(\n title: Text(\"YellowPage\"),\n ),\n body: Container(\n color: Colors.yellow,\n ),\n );\n }\n}\n\nclass GreenPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n appBar: AppBar(\n title: Text(\"GreenPage\"),\n ),\n body: Container(\n color: Colors.green,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":43,"name":"CupertinoSlider基本使用","priority":1,"subtitle":" \n【value】 : 数值 【double】\n【min】 : 最小值 【double】\n【max】 : 最大值 【double】\n【activeColor】 : 激活颜色 【Color】\n【thumbColor】 : 圆形颜色 【Color】\n【divisions】 : 分段数 【int】\n【onChangeStart】 : 开始滑动回调 【Function(double)】\n【onChangeEnd】 : 滑动结束回调 【Function(double)】\n【onChanged】 : 改变时回调 【Function(double)】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoSlider extends StatefulWidget {\n @override\n _CustomCupertinoSliderState createState() => _CustomCupertinoSliderState();\n}\n\nclass _CustomCupertinoSliderState extends State {\n double _value = 0.0;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n mainAxisSize: MainAxisSize.min,\n\n children: [\n Text('当前值:${_value.toStringAsFixed(1)}'),\n CupertinoSlider(\n value: _value,\n divisions: 180,\n min: 0.0,\n max: 360.0,\n activeColor: Colors.green,\n thumbColor: Colors.white,\n onChangeStart: (value) {\n print('开始滑动:$value');\n },\n onChangeEnd: (value) {\n print('滑动结束:$value');\n },\n onChanged: (value) {\n setState(() {\n _value = value;\n });\n }),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":63,"name":"CupertinoTabBar基本用法","priority":1,"subtitle":" \n【currentIndex】 : 当前激活索引 【Widget】\n【items】 : 条目组件 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【inactiveColor】 : 非激活色 【Color】\n【activeColor】 : 激活色 【Color】\n【iconSize】 : 图标大小 【double】\n【border】 : 边线 【Border】\n【onTap】 : 点击事件 【Function(int)】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoTabBar extends StatefulWidget {\n @override\n _CustomCupertinoTabBarState createState() => _CustomCupertinoTabBarState();\n}\n\nclass _CustomCupertinoTabBarState extends State {\n var _position = 0;\n final iconsMap = {\n //底栏图标\n \"图鉴\": Icons.home, \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite, \"手册\": Icons.class_,\n \"我的\": Icons.account_circle,\n };\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildContent(context),\n _buildTabBar(),\n ],\n );\n }\n\n Widget _buildTabBar() {\n return CupertinoTabBar(\n currentIndex: _position,\n onTap: (value) => setState(() => _position = value),\n items: iconsMap.keys\n .map((e) => BottomNavigationBarItem(\n icon: Icon(\n iconsMap[e],\n ),\n title: Text(e),\n ))\n .toList(),\n activeColor: Colors.blue,\n inactiveColor: Color(0xff333333),\n backgroundColor: Color(0xfff1f1f1),\n iconSize: 25.0,\n );\n }\n\n Widget _buildContent(BuildContext context) {\n return Container(\n alignment: Alignment.center,\n width: MediaQuery.of(context).size.width,\n height: 150,\n color: Color(0xffE7F3FC),\n child: Text(\n iconsMap.keys.toList()[_position],\n style: TextStyle(color: Colors.blue, fontSize: 24),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":122,"name":"AnimatedPositionedDirectional基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【top】 : 到父顶距离 【double】\n【end】 : 到父右距离 【double】\n【start】 : 到父左距离 【double】\n【bottom】 : 到父底距离 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedPositionedDirectional extends StatefulWidget {\n @override\n _CustomAnimatedPositionedDirectionalState createState() =>\n _CustomAnimatedPositionedDirectionalState();\n}\n\nclass _CustomAnimatedPositionedDirectionalState\n extends State {\n final startTop = 0.0;\n final endTop = 30.0;\n\n var _top = 0.0;\n\n @override\n void initState() {\n _top = startTop;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n _buildSwitch(),\n Container(\n color: Colors.grey.withAlpha(33),\n width: 200,\n height: 100,\n child: Stack(\n children: _buildChildren(),\n ),\n ),\n ],\n );\n }\n\n List _buildChildren() => [\n AnimatedPositionedDirectional(\n duration: Duration(seconds: 1),\n top: _top,\n start: _top * 4,\n child: Icon(\n Icons.android,\n color: Colors.green,\n size: 50,\n ),\n ),\n AnimatedPositionedDirectional(\n duration: Duration(seconds: 1),\n top: 50 - _top,\n start: 150 - _top * 4,\n child: Icon(\n Icons.android,\n color: Colors.red,\n size: 50,\n ),\n )\n ];\n\n Widget _buildSwitch() => Switch(\n value: _top == endTop,\n onChanged: (v) {\n setState(() {\n _top = v ? endTop : startTop;\n });\n });\n}\n"},{"id":null,"widgetId":293,"name":"MouseRegion基本使用","priority":1,"subtitle":"【onEnter】 : 移入事件 【PointerEnterEventListener】\n【onHover】: 移动事件 【PointerHoverEventListener】\n【onExit】: 移出事件 【PointerExitEventListener】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass MouseRegionDemo extends StatefulWidget {\n @override\n _MouseRegionDemoState createState() => _MouseRegionDemoState();\n}\n\nclass _MouseRegionDemoState extends State {\n int _enterCounter = 0;\n int _exitCounter = 0;\n double x = 0.0;\n double y = 0.0;\n void _incrementEnter(PointerEvent details) {\n setState(() {\n _enterCounter++;\n });\n }\n void _incrementExit(PointerEvent details) {\n setState(() {\n _exitCounter++;\n });\n }\n void _updateLocation(PointerEvent details) {\n setState(() {\n x = details.position.dx;\n y = details.position.dy;\n });\n }\n @override\n Widget build(BuildContext context) {\n return ConstrainedBox(\n constraints: BoxConstraints.tight(Size(300.0, 200.0)),\n child: MouseRegion(\n onEnter: _incrementEnter,\n onHover: _updateLocation,\n onExit: _incrementExit,\n child: Container(\n color: Colors.lightBlueAccent,\n child: Column(\n mainAxisAlignment: MainAxisAlignment.center,\n children: [\n Text('你的鼠标移入移除信息:'),\n Text(\n '$_enterCounter Entries\\n$_exitCounter Exits',\n style: Theme.of(context).textTheme.headline4,\n ),\n Text(\n 'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})',\n ),\n ],\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":244,"name":"EditableText基本使用","priority":1,"subtitle":"【controller】 : 控制器 【TextEditingController】\n【focusNode】 : 焦点 【FocusNode】\n【style】 : 文字样式 【TextStyle】\n【backgroundCursorColor】 : 背景游标颜色 【Color】\n【cursorColor】 : 游标颜色 【Color】\n上面五个是EditableText必须的属性,其他同TextField,此处不再列举。","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass EditableTextDemo extends StatefulWidget {\n @override\n _EditableTextDemoState createState() => _EditableTextDemoState();\n}\n\nclass _EditableTextDemoState extends State {\n final _ctrl = TextEditingController(text:'Hello Flutter Unit!');\n final _node = FocusNode();\n\n @override\n Widget build(BuildContext context) {\n return Padding(\n padding: const EdgeInsets.all(8.0),\n child: EditableText(\n controller: _ctrl,\n focusNode: _node,\n style: TextStyle(fontSize: 16,color: Colors.blue),\n cursorColor: Colors.blue,\n backgroundCursorColor: Colors.orange,\n ),\n );\n }\n}\n"},{"id":null,"widgetId":117,"name":"AnimatedList基本使用","priority":1,"subtitle":" \n【itemBuilder】 : 组件构造器 【AnimatedListItemBuilder】\n【initialItemCount】 : 子组件数量 【int】\n【scrollDirection】 : 滑动方向 【Axis】\n【controller】 : 滑动控制器 【ScrollController】\n【reverse】 : 数据是否反向 【bool】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedList extends StatefulWidget {\n @override\n _CustomAnimatedListState createState() => _CustomAnimatedListState();\n}\n\nclass _CustomAnimatedListState extends State {\n final GlobalKey _listKey = GlobalKey();\n ListModel _list;\n int _selectedItem;\n int _nextItem;\n\n @override\n void initState() {\n super.initState();\n _list = ListModel(\n listKey: _listKey,\n initialItems: [0, 1, 2, 3],\n removedItemBuilder: _buildRemovedItem,\n );\n _nextItem = 4;\n }\n\n Widget _buildItem(\n BuildContext context, int index, Animation animation) {\n return CardItem(\n animation: animation,\n item: _list[index],\n selected: _selectedItem == _list[index],\n onTap: () {\n setState(() {\n _selectedItem = _selectedItem == _list[index] ? null : _list[index];\n });\n },\n );\n }\n\n Widget _buildRemovedItem(\n int item, BuildContext context, Animation animation) {\n return CardItem(\n animation: animation,\n item: item,\n selected: false,\n );\n }\n\n void _insert() {\n final int index =\n _selectedItem == null ? _list.length : _list.indexOf(_selectedItem);\n _list.insert(index, _nextItem++);\n }\n\n void _remove() {\n if (_selectedItem != null) {\n _list.removeAt(_list.indexOf(_selectedItem));\n setState(() {\n _selectedItem = null;\n });\n }\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n color: Colors.grey.withAlpha(33),\n width: MediaQuery.of(context).size.width/2,\n child: Column(\n children: [\n _buildBtn(),\n Container(\n width: MediaQuery.of(context).size.width/2,\n height: 300,\n child: AnimatedList(\n padding: EdgeInsets.all(10.0),\n key: _listKey,\n initialItemCount: _list.length,\n itemBuilder: _buildItem,\n ),\n )\n ],\n ));\n }\n\n Widget _buildBtn() => Row(\n children: [\n IconButton(\n icon: const Icon(\n Icons.add_circle,\n color: Colors.blue,\n ),\n onPressed: _insert,\n ),\n IconButton(\n icon: const Icon(Icons.remove_circle, color: Colors.blue),\n onPressed: _remove,\n ),\n ],\n );\n}\n\nclass ListModel {\n ListModel({\n @required this.listKey,\n @required this.removedItemBuilder,\n Iterable initialItems,\n }) : assert(listKey != null),\n assert(removedItemBuilder != null),\n _items = List.from(initialItems ?? []);\n final GlobalKey listKey;\n final dynamic removedItemBuilder;\n final List _items;\n\n AnimatedListState get _animatedList => listKey.currentState;\n\n void insert(int index, E item) {\n _items.insert(index, item);\n _animatedList.insertItem(index);\n }\n\n E removeAt(int index) {\n final E removedItem = _items.removeAt(index);\n if (removedItem != null) {\n _animatedList.removeItem(index,\n (BuildContext context, Animation animation) =>\n removedItemBuilder(removedItem, context, animation),\n );\n }\n return removedItem;\n }\n\n int get length => _items.length;\n\n E operator [](int index) => _items[index];\n\n int indexOf(E item) => _items.indexOf(item);\n}\n\nclass CardItem extends StatelessWidget {\n const CardItem(\n {Key key,\n @required this.animation,\n this.onTap,\n @required this.item,\n this.selected: false})\n : assert(animation != null),\n assert(item != null && item >= 0),\n assert(selected != null),\n super(key: key);\n final Animation animation;\n final VoidCallback onTap;\n final int item;\n final bool selected;\n\n @override\n Widget build(BuildContext context) {\n return SizeTransition(\n axis: Axis.vertical,\n sizeFactor: animation,\n child: Card(\n child: Container(\n color: Colors.primaries[item % Colors.primaries.length],\n child: CheckboxListTile(\n dense: true,\n title: Text(\n 'Item $item',\n style: TextStyle(color: Colors.white, fontSize: 18),\n ),\n value: selected,\n onChanged: (v) => onTap()),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":149,"name":"InkResponse其他属性","priority":2,"subtitle":" \n【child】 : 子组件 【Widget】\n【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n【highlightColor】 : 高亮色 【Color】\n【splashColor】 : 水波纹色 【Color】\n【radius】 : 水波半径 【double】","code":"import 'package:flutter/material.dart';\nclass ColorInkResponse extends StatefulWidget {\n @override\n _ColorInkResponseState createState() => _ColorInkResponseState();\n}\n\nclass _ColorInkResponseState extends State {\n var _info = 'Push';\n\n @override\n Widget build(BuildContext context) {\n return InkResponse(\n onTap: () => {},\n splashColor: Colors.blueAccent,\n highlightColor: Colors.orange,\n onHighlightChanged: (v) =>\n setState(() => _info = 'onHighlightChanged:$v'),\n radius: 50,\n child: Container(\n alignment: Alignment.center,\n width: 200,\n height: 100,\n child: Text(_info),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":149,"name":"InkResponse基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onTap】 : 点击事件 【Function()】\n【onDoubleTap】 : 双击事件 【Function()】\n【onTapCancel】 : 点击取消 【Function()】\n【onLongPress】 : 长按事件 【Function()】","code":"import 'package:flutter/material.dart';\nclass CustomInkResponse extends StatefulWidget {\n @override\n _CustomInkResponseState createState() => _CustomInkResponseState();\n}\n\nclass _CustomInkResponseState extends State {\n var _info = 'Push';\n\n @override\n Widget build(BuildContext context) {\n return InkResponse(\n onTap: () => setState(() => _info = 'onTap'),\n onDoubleTap: () => setState(() => _info = 'onDoubleTap'),\n onLongPress: () => setState(() => _info = 'onLongPress'),\n onTapCancel: () => setState(() => _info = 'onTapCancel'),\n child: Container(\n alignment: Alignment.center,\n width: 200,\n height: 100,\n child: Text(_info),\n ),\n );\n }\n}"},{"id":null,"widgetId":119,"name":"AnimatedPadding基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【padding】 : 内边距 【EdgeInsetsGeometry】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedPadding extends StatefulWidget {\n @override\n _CustomAnimatedPaddingState createState() => _CustomAnimatedPaddingState();\n}\n\nclass _CustomAnimatedPaddingState extends State {\n final EdgeInsets startPadding = EdgeInsets.all(10);\n final EdgeInsets endPadding = EdgeInsets.all(30);\n\n EdgeInsets _padding;\n\n @override\n void initState() {\n _padding = startPadding;\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Switch(\n value: _padding == endPadding,\n onChanged: (v) {\n setState(() {\n _padding = v ? endPadding : startPadding;\n });\n }),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: AnimatedPadding(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n padding: _padding,\n onEnd: () => print('End'),\n child: Container(\n alignment: Alignment.center,\n color: Colors.blue,\n child: Text(\n '张风捷特烈',\n style: TextStyle(color: Colors.white),\n ),\n ),\n ),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":111,"name":"AlignTransition基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【alignment】 : 对齐动画 【Animation】","code":"import 'package:flutter/material.dart';\nclass CustomAlignTransition extends StatefulWidget {\n @override\n _CustomAlignTransitionState createState() => _CustomAlignTransitionState();\n}\n\nclass _CustomAlignTransitionState extends State\n with SingleTickerProviderStateMixin {\n AnimationController _ctrl;\n\n @override\n void initState() {\n _ctrl = AnimationController(vsync: this, duration: Duration(seconds: 1));\n _ctrl.forward();\n super.initState();\n }\n\n @override\n void dispose() {\n _ctrl.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return GestureDetector(\n onTap: () {\n setState(() {\n _ctrl.reset();\n _ctrl.forward();\n });\n },\n child: Container(\n width: MediaQuery.of(context).size.width,\n color: Colors.grey.withAlpha(33),\n height: 100,\n child: AlignTransition(\n alignment: AlignmentTween(\n begin: Alignment.topLeft, end: Alignment.bottomRight)\n .animate(_ctrl),\n child: Container(\n child: Icon(Icons.android, color: Colors.green, size: 60)),\n ),\n ));\n }\n}\n"},{"id":null,"widgetId":145,"name":"LicensePage基本使用","priority":1,"subtitle":" \n【applicationIcon】 : 左上图标 【Widget】\n【applicationVersion】 : 版本号 【String】\n【applicationName】 : 应用名 【String】\n【applicationLegalese】 : 应用律术 【String】","code":"import 'package:flutter/material.dart';\nclass CustomLicensePage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: 400,\n child: LicensePage(\n applicationIcon: FlutterLogo(),\n applicationVersion: 'v0.0.1',\n applicationName: 'Flutter Unit',\n applicationLegalese: 'Copyright© 2018-2020 张风捷特烈',\n ),\n );\n }\n}\n"},{"id":null,"widgetId":156,"name":"CupertinoApp基本用法","priority":1,"subtitle":" \n【theme】 : 主题 【ThemeData】\n【title】 : 任务栏标题 【String】\n【onGenerateRoute】 : 路由生成器 【RouteFactory】\n【home】 : 主页 【Widget】","code":"import 'package:flutter/cupertino.dart';\nclass CustomCupertinoApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 200,\n child: CupertinoApp(\n title: 'Flutter Demo',\n theme: CupertinoThemeData(\n primaryColor: CupertinoColors.white,\n ),\n home: CupertinoPageScaffold(\n navigationBar: CupertinoNavigationBar(\n leading: Icon(\n CupertinoIcons.reply,\n color: CupertinoColors.black,\n ),\n trailing: Icon(\n CupertinoIcons.share,\n color: CupertinoColors.black,\n ),\n middle: Text('Flutter Unit'),\n ),\n backgroundColor: CupertinoColors.systemBackground,\n child: Center(\n child: Text('Hello, World!'),\n ),\n ),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":64,"name":"Scaffold基本用法","priority":1,"subtitle":" \n【appBar】 : 头部组件 【PreferredSizeWidget】\n【bottomNavigationBar】 : 底部组件 【Widget】\n【drawer】 : 左侧滑组件 【Widget】\n【endDrawer】 : 右侧滑组件 【Widget】\n【body】 : 内容组件 【Widget】\n【backgroundColor】 : 背景色 【Color】\n【floatingActionButton】 : 浮动按钮 【Widget】\n【floatingActionButtonLocation】 : 浮动按钮位置 【FloatingActionButtonLocation】","code":"import 'package:flutter/material.dart';\nimport '../PopupMenuButton/node1_base.dart';\nclass CustomScaffold extends StatefulWidget {\n CustomScaffold({Key key}) : super(key: key);\n\n @override\n State createState() => _CustomScaffoldState();\n}\n\n// AppBar 默认的实例,有状态\nclass _CustomScaffoldState extends State with SingleTickerProviderStateMixin {\n final tabs = ['风画庭', '雨韵舍', '雷鸣殿', '电疾堂', '霜寒阁', '雪月楼'];\n var _position = 0;\n final iconsMap = {\n \"图鉴\": Icons.home,\n \"动态\": Icons.toys,\n \"喜欢\": Icons.favorite,\n \"手册\": Icons.class_,\n \"我的\": Icons.account_circle,\n };\n final _colors = [\n Colors.blue,\n Colors.red,\n Colors.yellow,\n Colors.green,\n Colors.purple,\n ];\n\n TabController _tabController;\n\n @override\n void initState() {\n super.initState();\n _tabController = TabController(vsync: this, length: tabs.length);\n }\n\n @override\n void dispose() {\n _tabController.dispose();\n super.dispose();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n width: MediaQuery.of(context).size.width,\n height: MediaQuery.of(context).size.height - 300,\n child: Scaffold(\n floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,\n floatingActionButton: FloatingActionButton(\n child: Icon(Icons.add),\n onPressed: () {},\n ),\n drawer: _buildLeftDrawer(),\n endDrawer: _buildLeftDrawer(),\n appBar: AppBar(\n title: Text('风雅六社'),\n backgroundColor: Colors.blue,\n centerTitle: true,\n actions: [Icon(Icons.star), CustomPopupMenuButton()],\n bottom: _buildTabBar(),\n ),\n body: _buildTableBarView(),\n bottomNavigationBar: _buildBottomNavigationBar(),\n ),\n );\n }\n\n Drawer _buildLeftDrawer() => Drawer(\n elevation: 1,\n child: Image.asset(\n 'assets/images/sabar.jpg',\n fit: BoxFit.cover,\n ),\n );\n\n Widget _buildTabBar() => TabBar(\n isScrollable: true,\n controller: _tabController,\n indicatorColor: Colors.orangeAccent,\n tabs: tabs.map((e) => Tab(text: e)).toList(),\n );\n\n Widget _buildBottomNavigationBar() => BottomNavigationBar(\n onTap: (position) => setState(() => _position = position),\n currentIndex: _position,\n elevation: 1,\n backgroundColor: Colors.white,\n iconSize: 25,\n selectedLabelStyle: TextStyle(fontWeight: FontWeight.bold),\n showUnselectedLabels: false,\n showSelectedLabels: true,\n items: iconsMap.keys\n .map((key) => BottomNavigationBarItem(\n title: Text(\n key,\n ),\n icon: Icon(iconsMap[key]),\n backgroundColor: _colors[_position]))\n .toList(),\n );\n\n Widget _buildTableBarView() => TabBarView(\n controller: _tabController,\n children: tabs\n .map((e) => Center(\n child: Text(\n e,\n style: TextStyle(color: Colors.blue, fontSize: 20),\n )))\n .toList());\n}\n"},{"id":null,"widgetId":171,"name":"Hero基本使用","priority":1,"subtitle":" \n【tag】 : 标签 【String】,","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomHero extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var hero = Hero(\n //----定义一个Hero,并添加tag标签,此中组件共享\n tag: 'user-head',\n child: ClipRRect(\n borderRadius: BorderRadius.all(Radius.circular(30)),\n child: Image.asset(\n \"assets/images/icon_head.png\",\n width: 60,\n height: 60,\n fit: BoxFit.cover,\n ),\n ),\n );\n\n var container = Container(\n alignment: Alignment(-0.8, -0.8),\n child: hero,\n width: 250,\n height: 250 * 0.618,\n decoration: BoxDecoration(\n gradient: LinearGradient(colors: [\n Colors.red.withAlpha(99),\n Colors.yellow.withAlpha(189),\n Colors.green.withAlpha(88),\n Colors.blue.withAlpha(230)\n ])),\n );\n\n return GestureDetector(\n child: Card(elevation: 5, child: container),\n onTap: () => Navigator.push(\n context,\n Bottom2TopRouter(child: TargetPage(), duration: 1000),\n ),\n );\n }\n\n}\n\nclass TargetPage extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var hero = Hero(\n //----定义一个Hero,为其添加标签,两个标签相同,则可以共享\n tag: 'user-head',\n child: Padding(\n padding: EdgeInsets.all(6.0),\n child: CircleAvatar(\n backgroundColor: Colors.transparent,\n backgroundImage: AssetImage(\n \"assets/images/icon_head.png\",\n ),\n ),\n ),\n );\n\n var touch = InkWell(\n onTap: () {\n Navigator.of(context).pop();\n },\n child: hero,\n );\n\n return Scaffold(\n appBar: AppBar(\n actions: [touch],\n ),\n body: Container(\n decoration: BoxDecoration(\n gradient: LinearGradient(colors: [\n Colors.red.withAlpha(99),\n Colors.yellow.withAlpha(189),\n Colors.green.withAlpha(88),\n Colors.blue.withAlpha(230)\n ])),\n ),\n );\n }\n}\n\n//下--->上\nclass Bottom2TopRouter extends PageRouteBuilder {\n final Widget child;\n final int duration;\n final Curve curve;\n\n Bottom2TopRouter(\n {this.child, this.duration = 500, this.curve = Curves.fastOutSlowIn})\n : super(\n transitionDuration: Duration(milliseconds: duration),\n pageBuilder: (ctx, a1, a2) {\n return child;\n },\n transitionsBuilder: (\n ctx,\n a1,\n a2,\n Widget child,\n ) => SlideTransition(\n position: Tween(\n begin: Offset(0.0, 1.0),\n end: Offset(0.0, 0.0),\n ).animate(CurvedAnimation(parent: a1, curve: curve)),\n child: child));\n}\n"},{"id":null,"widgetId":174,"name":"PopupMenuDivider基本使用","priority":1,"subtitle":" \n【height】 : 高度 【double】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomPopupMenuDivider extends StatelessWidget {\n final map = {\n \"关于\": Icons.info_outline,\n \"帮助\": Icons.help_outline,\n \"问题反馈\": Icons.add_comment,\n };\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n _buildPopupMenuButton(context),\n PopupMenuDivider(),\n ],\n ),\n );\n }\n\n PopupMenuButton _buildPopupMenuButton(BuildContext context) {\n return PopupMenuButton(\n itemBuilder: (context) => [\n ...buildItems().sublist(0, 2),\n PopupMenuDivider(),\n ...buildItems().sublist(2, 3)\n ],\n offset: Offset(0, 50),\n color: Color(0xffF4FFFA),\n elevation: 1,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n onSelected: (e) {\n print(e);\n if (e == '关于') {\n DialogAbout.show(context);\n }\n },\n onCanceled: () => print('onCanceled'),\n );\n }\n\n List> buildItems() {\n return map.keys\n .toList()\n .map((e) => PopupMenuItem(\n value: e,\n child: Wrap(\n spacing: 10,\n children: [\n Icon(\n map[e],\n color: Colors.blue,\n ),\n Text(e),\n ],\n )))\n .toList();\n }\n}\n"},{"id":null,"widgetId":195,"name":"CupertinoScrollbar基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【controller】 : 控制器 【ScrollController】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoScrollbar extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: CupertinoScrollbar(\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":172,"name":"FutureBuilder基本使用","priority":1,"subtitle":" \n【builder】 : 子组件 【AsyncWidgetBuilder】\n【initialData】 : 初始数据 【T】\n【future】 : 异步任务 【Future】","code":"import 'package:flutter/material.dart';\nclass CustomFutureBuilder extends StatefulWidget {\n @override\n _CustomFutureBuilderState createState() => _CustomFutureBuilderState();\n}\n\nclass _CustomFutureBuilderState extends State {\n Future _future;\n\n @override\n void initState() {\n _future = loadData();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: FutureBuilder(\n initialData: 'Load',\n future: _future,\n builder: (ctx, snap) {\n if (snap.connectionState == ConnectionState.done) {\n return Text(snap.data);\n }\n if (snap.connectionState == ConnectionState.waiting) {\n return CircularProgressIndicator();\n }\n if (snap.hasError) {\n return Text('Error');\n }\n return Container();\n }),\n );\n }\n\n Future loadData() async {\n await Future.delayed(Duration(seconds: 2));\n return 'LoadeSuccess';\n }\n}\n"},{"id":null,"widgetId":182,"name":"Overlay基本使用","priority":1,"subtitle":" \n Overlay.of(context).insert插入全局组件","code":"import 'package:flutter/material.dart';\nclass CustomOverlay extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n height: 50,\n child: RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.blue,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n child: Icon(Icons.add),\n onPressed: ()=>showFloating(context),\n ),\n ),\n Container(\n height: 50,\n child: RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.red,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n child: Icon(Icons.remove),\n onPressed: hideFloating,\n ),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":139,"name":"CupertinoPicker基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【offAxisFraction】 : 轴偏移率 【double】\n【squeeze】 : 挤压率 【double】\n【diameterRatio】 : 高与圆柱直径比率 【double】\n【itemExtent】 : 间距 【double】\n【backgroundColor】 : 背景色 【Color】\n【onSelectedItemChanged】 : 选中事件 【Function(int)】","code":"import 'package:flutter/cupertino.dart';\nclass CustomCupertinoPicker extends StatelessWidget {\n final names = [\n 'Java',\n 'Kotlin',\n 'Dart',\n 'Swift',\n 'C++',\n 'Python',\n \"JavaScript\",\n \"PHP\",\n \"Go\",\n \"Object-c\"\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n child: CupertinoPicker(\n backgroundColor: CupertinoColors.systemGrey.withAlpha(33),\n diameterRatio: 1,\n offAxisFraction: 0.4,\n squeeze: 1.5,\n itemExtent: 40,\n onSelectedItemChanged: (position) {\n print('当前条目 ${names[position]}');\n },\n children: names.map((e) => Center(child: Text(e))).toList()),\n );\n }\n}\n"},{"id":null,"widgetId":118,"name":"AnimatedOpacity基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【opacity】 : 透明度 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedOpacity extends StatefulWidget {\n @override\n _CustomAnimatedOpacityState createState() => _CustomAnimatedOpacityState();\n}\n\nclass _CustomAnimatedOpacityState extends State {\n double _opacity = 1.0;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Switch(\n value: _opacity == 0,\n onChanged: (v) {\n setState(() {\n _opacity = v ? 0 : 1.0;\n });\n }),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: AnimatedOpacity(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n opacity: _opacity,\n onEnd: () => print('End'),\n child: Icon(Icons.android, color: Colors.green, size: 60),\n ),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":55,"name":"DropdownButton的样式指定","priority":2,"subtitle":" \n【isDense】 : 是否紧排 【bool】\n【iconSize】 : 图标大小 【double】\n【hint】 : 提示组件 【Widget】\n【iconEnabledColor】 : 图标颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass StyleDropDownButton extends StatefulWidget {\n @override\n _StyleDropDownButtonState createState() => _StyleDropDownButtonState();\n}\n\nclass _StyleDropDownButtonState extends State {\n Color _color = Colors.red ;\n final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n final _info = [\"红色\", \"黄色\", \"蓝色\", \"绿色\"];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Container(\n margin: EdgeInsets.symmetric(horizontal: 20),\n width: 50,\n height: 50,\n color: _color??Colors.transparent,\n ),\n DropdownButton(\n hint: Text('请选择'),\n isDense: true,\n iconSize:20,\n iconEnabledColor:_color??Colors.orange,\n value: _color,\n items: _buildItems(),\n onChanged: (v) => setState(() => _color = v)),\n ],\n );\n }\n\n List> _buildItems() => _colors\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(\n _info[_colors.indexOf(e)],\n style: TextStyle(color: e),\n )))\n .toList();\n}\n"},{"id":null,"widgetId":55,"name":"DropdownButton基本用法","priority":1,"subtitle":" \n【value】 : 当前值 【T】\n【items】 : 下拉选框 【List>】\n【icon】 : 图标 【Widget】\n【elevation】 : 影深 【double】\n【onChanged】 : 选择条目事件 【Function(T)】\n【backgroundColor】 : 背景色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomDropDownButton extends StatefulWidget {\n @override\n _CustomDropDownButtonState createState() => _CustomDropDownButtonState();\n}\n\nclass _CustomDropDownButtonState extends State {\n Color _color = Colors.red;\n final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n final _info = [\"红色\", \"黄色\", \"蓝色\", \"绿色\"];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n margin: EdgeInsets.symmetric(horizontal: 20),\n width: 50,\n height: 50,\n color: _color,\n ),\n DropdownButton(\n value: _color,\n elevation: 1,\n icon: Icon(\n Icons.expand_more,\n size: 20,\n color: _color,\n ),\n items: _buildItems(),\n onChanged: (v) => setState(() => _color = v)),\n ],\n );\n }\n\n List> _buildItems() => _colors\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(\n _info[_colors.indexOf(e)],\n style: TextStyle(color: e),\n )))\n .toList();\n}"},{"id":null,"widgetId":56,"name":"PopupMenuButton基本使用","priority":1,"subtitle":" \n【itemBuilder】 : 构造器 【PopupMenuItemBuilder】\n【offset】 : 偏移 【Offset】\n【color】 : 背景颜色 【Color】\n【shape】 : 形状 【ShapeBorder】\n【elevation】 : 影深 【double】\n【onCanceled】 : 取消事件 【Function()】\n【onSelected】 : 选择事件 【Function(T)】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomPopupMenuButton extends StatefulWidget {\n @override\n _CustomPopupMenuButtonState createState() => _CustomPopupMenuButtonState();\n}\n\nclass _CustomPopupMenuButtonState extends State {\n final map = {\n \"关于\": Icons.info_outline,\n \"帮助\": Icons.help_outline,\n \"问题反馈\": Icons.add_comment,\n };\n\n @override\n Widget build(BuildContext context) {\n return PopupMenuButton(\n itemBuilder: (context) => buildItems(),\n offset: Offset(0, 50),\n color: Color(0xffF4FFFA),\n elevation: 1,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n onSelected: (e) {\n print(e);\n if (e == '关于') {\n DialogAbout.show(context);\n }\n },\n onCanceled: () => print('onCanceled'),\n );\n }\n\n List> buildItems() {\n return map.keys\n .toList()\n .map((e) => PopupMenuItem(\n value: e,\n child: Wrap(\n spacing: 10,\n children: [\n Icon(\n map[e],\n color: Colors.blue,\n ),\n Text(e),\n ],\n )))\n .toList();\n }\n}\n"},{"id":null,"widgetId":160,"name":"Material的shape属性","priority":2,"subtitle":" \n【shape】 : 形状 【ShapeBorder】,","code":"import 'package:flutter/material.dart';\nclass ShapeMaterial extends StatelessWidget {\n\n final shapeMap = {\n 'BorderDirectional': BorderDirectional(\n top: BorderSide(\n color: Colors.white,\n ),\n start: BorderSide(color: Colors.black, width: 15),\n bottom: BorderSide(\n color: Colors.white,\n )),\n 'Border': Border(\n top: BorderSide(width: 5.0, color: Color(0xFFFFDFDFDF)),\n left: BorderSide(width: 5.0, color: Color(0xFFFFDFDFDF)),\n right: BorderSide(width: 5.0, color: Color(0xFFFF7F7F7F)),\n bottom: BorderSide(width: 5.0, color: Color(0xFFFF7F7F7F)),\n ),\n 'Circle': CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n 'RoundedRectangleBorder': RoundedRectangleBorder(\n side: BorderSide(width: 1.0, color: Colors.black),\n borderRadius: BorderRadius.all(Radius.circular(15))),\n 'ContinuousRectangleBorder': ContinuousRectangleBorder(\n side: BorderSide.none,\n borderRadius: BorderRadius.circular(40.0),\n )\n };\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: shapeMap.keys.map((e) => _buildMaterial(e)).toList());\n }\n\n Material _buildMaterial(String type) => Material(\n shadowColor: Colors.blue,\n shape: shapeMap[type],\n color: Colors.orange,\n elevation: 3,\n textStyle: TextStyle(color: Colors.white),\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 60,\n child: Text(\n type,\n ),\n ),\n );\n}\n"},{"id":null,"widgetId":160,"name":"Material基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【type】 : 类型 【MaterialType】\n【elevation】 : 影深 【double】\n【shadowColor】 : 阴影颜色 【Color】\n【color】 : 颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomMaterial extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: MaterialType.values.map((e) => _buildMaterial(e)).toList());\n }\n\n Material _buildMaterial(MaterialType type) => Material(\n shadowColor: Colors.blue,\n type: type,\n color: Colors.orange,\n elevation: 3,\n child: Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n child: Text(\n type.toString().split('.')[1],\n style: TextStyle(color: Colors.black),\n ),\n ),\n );\n}\n"},{"id":null,"widgetId":194,"name":"Scrollbar基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【controller】 : 控制器 【ScrollController】","code":"import 'package:flutter/material.dart';\nclass CustomScrollbar extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scrollbar(\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":170,"name":"WillPopScope使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onWillPop】 : 返回回调 【WillPopCallback】","code":"import 'package:flutter/material.dart';\nclass CustomWillPopScope extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: WillPopScope(child: (BackButton()),\n onWillPop: ()=>_willPop(context)),\n );\n }\n\n Future _willPop(context) async{\n return await showDialog(\n context: context,\n builder: (context) => AlertDialog(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n title: Text('提示'),\n content: Text('你确定要离开此页吗?'),\n actions: [\n FlatButton(\n onPressed: () => Navigator.of(context).pop(true),\n child: Text('确定'),\n ),\n FlatButton(\n onPressed: () => Navigator.of(context).pop(false),\n child: Text('取消'),\n ),\n\n ],\n ),\n ) ?? false;\n\n }\n}\n"},{"id":null,"widgetId":151,"name":"TableRowInkWell基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onTap】 : 点击事件 【Function()】\n【onDoubleTap】 : 双击事件 【Function()】\n【onLongPress】 : 长按事件 【Function()】\n【onHighlightChanged】 : 高亮变化回调 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass CustomTableRowInkWell extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var title = _ItemBean(\"单位称\", \"量纲\", \"单位\", \"单位名称\", \"单位符号\");\n var m = _ItemBean(\"长度\", \"L\", \"1m\", \"米\", \"m\");\n var kg = _ItemBean(\"质量\", \"M\", \"1Kg\", \"千克\", \"Kg\");\n var s = _ItemBean(\"时间\", \"T\", \"1s\", \"秒\", \"s\");\n var a = _ItemBean(\"安培\", \"Ι\", \"1A\", \"安培\", \"A\");\n var k = _ItemBean(\"热力学温度\", \"θ\", \"1K\", \"开尔文\", \"K\");\n var mol = _ItemBean(\"物质的量\", \"N\", \"1mol\", \"摩尔\", \"mol\");\n var cd = _ItemBean(\"发光强度\", \"J\", \"1cd\", \"坎德拉\", \"cd\");\n\n var data = <_ItemBean>[title, m, kg, s, a, k, mol, cd];\n\n return SingleChildScrollView(\n scrollDirection: Axis.horizontal,\n child: Table(\n columnWidths: const {\n 0: FixedColumnWidth(80.0),\n 1: FixedColumnWidth(80.0),\n 2: FixedColumnWidth(80.0),\n 3: FixedColumnWidth(80.0),\n 4: FixedColumnWidth(80.0),\n },\n defaultVerticalAlignment: TableCellVerticalAlignment.middle,\n border: TableBorder.all(\n color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid),\n children: data\n .map((item) => TableRow(children: [\n TableRowInkWell(\n onTap: () => print('onTap'),\n onDoubleTap: () => print('onDoubleTap'),\n onLongPress: () => print('onLongPress'),\n onHighlightChanged: (v) => print('onHighlightChanged:$v'),\n child: Center(\n child: Text(\n item.name,\n style: TextStyle(color: Colors.blue),\n )),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.symbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitSymbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitName)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unit)),\n ),\n ]))\n .toList(),\n ),\n );\n }\n}\n\nclass _ItemBean {\n String name;\n String symbol;\n String unit;\n String unitName;\n String unitSymbol;\n\n _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol);\n}\n\n"},{"id":null,"widgetId":135,"name":"MonthPicker基本使用","priority":1,"subtitle":" \n【selectedDate】 : 选中日期 【DateTime】\n【firstDate】 : 最前日期限制 【DateTime】\n【lastDate】 : 最后日期限制 【DateTime】\n【onChanged】 : 点击回调 【Function(DateTime)】","code":"import 'package:flutter/material.dart';\nclass CustomMonthPicker extends StatefulWidget {\n @override\n _CustomMonthPickerState createState() => _CustomMonthPickerState();\n}\n\nclass _CustomMonthPickerState extends State {\n DateTime _date = DateTime.now();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 350,\n child: MonthPicker(\n selectedDate: _date,\n onChanged: (date) => setState(() => _date = date),\n firstDate: DateTime(2018),\n lastDate: DateTime(2030),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":143,"name":"CupertinoContextMenu基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【actions】 : 行为组件集 【List】\n【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoContextMenu extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: _buildCupertinoContextMenu(context),\n );\n }\n\n final info= ['保存图片','立刻呼叫','添加到收藏夹'];\n\n Widget _buildCupertinoContextMenu(context) => Container(\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/sabar_bar.jpg'),\n fit: BoxFit.cover),\n borderRadius: BorderRadius.all(Radius.circular(50))),\n width: 100,\n height: 100,\n child: CupertinoContextMenu(\n child: Container(\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/sabar_bar.jpg'),\n fit: BoxFit.cover),\n borderRadius: BorderRadius.all(Radius.circular(50))),\n ),\n actions: info.map((e)=>CupertinoContextMenuAction(\n child: Center(child: Text(e)),\n onPressed: () => Navigator.pop(context),\n )).toList())\n );\n}\n"}] \ No newline at end of file diff --git a/assets/data/web/widget.json b/assets/data/web/widget.json new file mode 100644 index 00000000..8dd52f79 --- /dev/null +++ b/assets/data/web/widget.json @@ -0,0 +1 @@ +[{"id":1,"family":0,"name":"Container","nameCN":"容器组件","lever":5,"linkWidget":"74,85,80,78,70,123","info":"用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...","image":"assets/images/widgets/Container.png"},{"id":2,"family":0,"name":"Text","nameCN":"文字组件","lever":5,"linkWidget":"101,324","info":"用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。","image":"assets/images/widgets/Text.png"},{"id":3,"family":0,"name":"Card","nameCN":"卡片组件","lever":3,"linkWidget":"160","info":" 基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。","image":"assets/images/widgets/Card.png"},{"id":4,"family":0,"name":"FlutterLogo","lever":1,"linkWidget":"","nameCN":"Flutter图标","info":"用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。","image":"assets/images/widgets/FlutterLogo.png"},{"id":5,"family":0,"name":"Banner","lever":1,"linkWidget":"","nameCN":"角标组件","info":"用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。","image":"assets/images/widgets/Banner.png"},{"id":6,"family":0,"name":"Icon","lever":2,"linkWidget":"7,30,125","nameCN":"图标组件","info":"用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但是非常用","image":"assets/images/widgets/Icon.png"},{"id":7,"family":0,"name":"ImageIcon","linkWidget":"6,30,125","nameCN":"容器","lever":1,"info":"用于将一个图片变为纯色的组件。可指定大小、颜色。","image":"assets/images/widgets/ImageIcon.png"},{"id":8,"family":0,"name":"FadeInImage","nameCN":"淡入图片","linkWidget":"38","lever":2,"info":"透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。","image":""},{"id":9,"family":0,"name":"CircleAvatar","nameCN":"圆形组件","linkWidget":"","lever":4,"info":"可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。","image":""},{"id":10,"family":0,"name":"Visibility","nameCN":"显隐组件","linkWidget":"71","lever":3,"info":"控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。","image":"assets/images/widgets/Visibility.png"},{"id":11,"family":0,"name":"Chip","nameCN":"小条组件","linkWidget":"12,13,14,15,153","lever":4,"info":"一个横向的圆边小条,可以包含左中右三个组件。可以指定颜色、阴影色和点击事件。","image":"assets/images/widgets/Chip.png"},{"id":12,"family":0,"name":"ChoiceChip","nameCN":"选择小条","lever":3,"linkWidget":"11,13,14,15,153","info":"和Chip组件类似的样式,有一些选择的属性。可以指定选中时的颜色、阴影色和选择事件。","image":"assets/images/widgets/ChoiceChip.png"},{"id":13,"family":0,"name":"ActionChip","nameCN":"事件小条","lever":3,"linkWidget":"11,12,14,15,153","info":"和Chip组件类似的样式,有一些点击的属性。可以指定点击时的阴影深、点击事件。","image":"assets/images/widgets/ActionChip.png"},{"id":14,"family":0,"name":"InputChip","nameCN":"综合小条","linkWidget":"11,12,13,15,153","lever":4,"info":"和Chip组件类似的样式,集成了点击、删除、选择事件为一体。注意:点击事件和选择事件不能同时存在。","image":"assets/images/widgets/InputChip.png"},{"id":15,"family":0,"name":"FilterChip","linkWidget":"11,12,13,14,153","nameCN":"过滤小条","lever":4,"info":"和Chip组件类似的样式,具有选中与否的属性和选中事件。当选中时左侧组件上层会被✔️遮罩。","image":"assets/images/widgets/FilterChip.png"},{"id":16,"family":0,"name":"ListTile","nameCN":"列表瓦片","linkWidget":"162,334","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/ListTile.png"},{"id":17,"family":0,"name":"CheckboxListTile","nameCN":"复选瓦片","linkWidget":"39","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个CheckBox。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/CheckBoxListTile.png"},{"id":18,"family":0,"name":"SwitchListTile","nameCN":"切钮瓦片","linkWidget":"40","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个Switch。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/SwitchListTile.png"},{"id":19,"family":0,"name":"RadioListTile","nameCN":"选钮瓦片","linkWidget":"45","lever":3,"info":"Flutter提供的一个通用列表条目结构,为中右结构,尾部是一个Radio。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/RadioListTile.png"},{"id":20,"family":0,"name":"GridTileBar","nameCN":"网格瓦片头","linkWidget":"21","lever":2,"info":"Flutter提供的一个通用头结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目,相比ListTile而言,属性较少。","image":"assets/images/widgets/GridTileBar.png"},{"id":21,"family":0,"name":"GridTile","nameCN":"网格瓦片","linkWidget":"20","lever":3,"info":"Flutter提供的一个通用列表条目结构,可指定头、尾、子组件,常用于网格列表。","image":"assets/images/widgets/GridTile.png"},{"id":22,"family":0,"name":"UserAccountsDrawerHeader","nameCN":"展示头","linkWidget":"154","lever":3.8,"info":"Flutter提供的一个通用展示结构,相应位置可插入组件,可以很方便地应对特定的条目,常用于Drawer中。","image":"assets/images/widgets/UserAccountsDrawerHeader.png"},{"id":23,"family":0,"name":"MaterialButton","nameCN":"材料按钮","linkWidget":"25,26,27,326,175","lever":4,"info":"基于RawMaterialButton实现的通用Material按钮。可盛放一个子组件,能定义颜色、形状等表现,可接收点击和长按事件。","image":""},{"id":24,"family":1,"name":"CupertinoButton","nameCN":"iOS按钮","linkWidget":"23","lever":3,"info":"iOS风格的按钮。可指定颜色、点击时透明度、内边距、圆角等。可接收点击事件。","image":""},{"id":25,"family":0,"name":"FlatButton","nameCN":"平按钮","linkWidget":"24,26,27,175","lever":3,"info":"无阴影的平按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":26,"family":0,"name":"RaisedButton","nameCN":"浮起按钮","linkWidget":"24,25,27,175","lever":3,"info":"有阴影的浮起按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":27,"family":0,"name":"OutlineButton","nameCN":"线框按钮","linkWidget":"23,24,25,175","lever":3,"info":"边框样式按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":28,"family":0,"name":"FloatingActionButton","nameCN":"浮动按钮","linkWidget":"64","lever":4,"info":"浮动按钮,一般用于Scaffold中,可摆放在特定位置。可盛放一个子组件,接收点击、可定义颜色、形状等。","image":""},{"id":29,"family":0,"name":"ButtonBar","nameCN":"按钮栏","linkWidget":"","lever":3,"info":"接收组件列表,常用于盛放若干个按钮。可指定对齐方式、边距等信息。","image":""},{"id":30,"family":0,"name":"IconButton","nameCN":"图标按钮","linkWidget":"6","lever":2,"info":"可点击的图标按钮,可指定图标信息、内边距、大小、颜色等,接收点击事件。","image":""},{"id":31,"family":0,"name":"BackButton","nameCN":"返回按钮","linkWidget":"30","lever":1,"info":"一个具有返回功能的IconButton,返回图标不可更改。在iOS和Android中表现不同","image":""},{"id":32,"family":0,"name":"CloseButton","nameCN":"关闭按钮","linkWidget":"30","lever":1.0,"info":"一个具有关闭功能的IconButton,关闭图标不可更改。","image":""},{"id":33,"family":0,"name":"ToggleButtons","nameCN":"切换按钮组","linkWidget":"332,262","lever":4,"info":"接收组件列表,可指定边线、圆角、颜色等属性。根据具体逻辑,可以实现多个按钮单选或多选的需求。","image":""},{"id":34,"family":0,"name":"Divider","nameCN":"水平分割线","linkWidget":"35,329","lever":2,"info":"水平分割线,可指定颜色、高度、粗细、左右边距信息,常用与列表的item分割线。","image":""},{"id":35,"family":0,"name":"VerticalDivider","nameCN":"竖直分割线","linkWidget":"34,329","lever":2,"info":"竖直分割线,可指定颜色、宽度、粗细、上下边距信息,常用与列表的item分割线。","image":""},{"id":36,"family":0,"name":"Placeholder","nameCN":"占位组件","linkWidget":"","lever":1,"info":"一个矩形和叉叉的占位组件,可指定颜色、线宽、宽高等属性。","image":""},{"id":37,"family":0,"name":"GridPager","nameCN":"网格线组件","linkWidget":"","lever":2,"info":"可容纳一个组件,在其上绘制网格。可指定颜色、线宽、间距等属性。","image":""},{"id":38,"family":1,"name":"Image","nameCN":"图片组件","linkWidget":"8,87","lever":5,"info":"用于显示一张图片,可以从文件、内存、网络、资源里加载。可以指定适应方式、样式、颜色混合模式、重复模式等","image":""},{"id":39,"family":1,"name":"Checkbox","nameCN":"复选框","linkWidget":"17","lever":4,"info":"复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。","image":""},{"id":40,"family":1,"name":"Switch","nameCN":"切钮","linkWidget":"41,18","lever":4,"info":"切换选钮,常用于配置的切换,可指定小圆颜色、图片,滑槽颜色等,接收状态变化回调。","image":""},{"id":41,"family":1,"name":"CupertinoSwitch","nameCN":"iOS切钮","linkWidget":"40","lever":3,"info":"iOS风格的切换选钮,常用于配置的切换,可指定颜色,接收状态变化回调。","image":""},{"id":42,"family":1,"name":"Slider","nameCN":"滑块","linkWidget":"43,44,331","lever":4,"info":"滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色、分段数及显示的标签,接收进度变化回调。","image":""},{"id":43,"family":1,"name":"CupertinoSlider","linkWidget":"42","nameCN":"iOS滑块","lever":3,"info":"iOS风格的滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色,接收进度变化回调。","image":""},{"id":44,"family":1,"name":"RangeSlider","nameCN":"范围滑块","linkWidget":"42","lever":4,"info":"范围滑块组件,支持两点拖动,获取之间的范围。可指定颜色、分段数及显示的标签,接收进度变化回调。","image":""},{"id":45,"family":1,"name":"Radio","nameCN":"选钮","linkWidget":"19","lever":4,"info":"由于选中和未选择状态的圆钮,多个Radio根据逻辑可以实现单选或多选的需求。可指定颜色,接收状态变化回调。","image":""},{"id":46,"family":1,"name":"CircularProgressIndicator","nameCN":"圆形进度","linkWidget":"47,48","lever":3,"info":"圆形的进度显示,可指定颜色、线宽、进度等属性。value为null时会不停旋转。","image":""},{"id":47,"family":1,"name":"LinearProgressIndicator","nameCN":"水平进度","linkWidget":"46,48","lever":3,"info":"直线型的进度显示,可指定颜色、进度等属性。value为null时会不停旋转。","image":""},{"id":48,"family":1,"name":"CupertinoActivityIndicator","nameCN":"iOS指示器","linkWidget":"46,47","lever":2,"info":"iOS样式的loading显示组件,可指定半径和是否旋转。","image":""},{"id":49,"family":1,"name":"RefreshIndicator","nameCN":"刷新指示器","linkWidget":"","lever":4,"info":"内部嵌套可滑动区域,下滑时会显示刷新图标,松手后可以执行指定的异步方法。可指定颜色、到顶端距离等属性。","image":""},{"id":50,"family":1,"name":"Tooltip","nameCN":"提示工具","linkWidget":"","lever":3,"info":"由于显示提示信息的组件,长按时显示信息。可指定边距、显示时长、文字样式、装饰灯属性。","image":""},{"id":51,"family":1,"name":"ExpandIcon","nameCN":"展开图标","linkWidget":"66,125","lever":1,"info":"一个展开按钮,点击时会自己执行旋转180的动画。可指定颜色、大小、边距,接收点击事件。","image":""},{"id":52,"family":1,"name":"ExpansionTile","nameCN":"展开瓦片","linkWidget":"178","lever":3,"info":"一个通用的展开栏,可在指定的部位安放组件,点击时会折叠显隐下方组件。接收折叠时事件。","image":""},{"id":53,"family":1,"name":"SelectableText","nameCN":"可选择文字","linkWidget":"2","lever":3,"info":"可选择的文字,可以选择、复制。可指定浮标的颜色、大小、文字样式、对齐方式等。","image":""},{"id":54,"family":1,"name":"TextField","nameCN":"输入框","linkWidget":"199","lever":5,"info":"由于输入的组件,拥有复杂的属性。可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。","image":""},{"id":55,"family":1,"name":"DropdownButton","nameCN":"下拉按钮","linkWidget":"181","lever":4,"info":"用于下拉选择的按钮,可指定图标、影深、提示等属性,接收选中变化的事件。","image":""},{"id":56,"family":1,"name":"PopupMenuButton","nameCN":"菜单按钮","linkWidget":"174","lever":4,"info":"弹出菜单栏,可指定偏移、颜色、影深、形状等属性。接收item选中的事件和取消选择事件。","image":""},{"id":57,"family":1,"name":"AppBar","nameCN":"应用头栏","linkWidget":"64","lever":4,"info":"一个应用顶部栏的通用结构,可在指定的部位放置相应的组件,常用于Scaffold组件中。","image":""},{"id":58,"family":1,"name":"TabBar","nameCN":"标签栏","linkWidget":"57,59,148","lever":3,"info":"可滑动和点击标签栏,通常用于AppBar的底部,可与TabBarView联用,实现滑页的效果。","image":""},{"id":59,"family":1,"name":"TabBarView","nameCN":"标签页","linkWidget":"58","lever":2,"info":"通常与TabBar联用,实现滑页的效果。一般不单独使用。","image":""},{"id":60,"family":1,"name":"BottomNavigationBar","nameCN":"底部导航","linkWidget":"61","lever":4,"info":"一个底部导航栏,通常用于Scaffold组件的底部,可指定颜色和模式,接受点击回调,可与PageView实现切页效果。","image":""},{"id":61,"family":1,"name":"BottomAppBar","nameCN":"底部导航","linkWidget":"60","lever":4,"info":"一个可凹嵌的底部导航栏,通常用于Scaffold组件的底部,可指定颜色、影深、形状等属性,可与PageView实现切页效果。","image":""},{"id":62,"family":1,"name":"CupertinoNavigationBar","nameCN":"iOS导航","linkWidget":"","lever":3,"info":"一个iOS风格的应用顶部栏的通用结构,可在指定的部位放置相应的组件。可指定背景色、间距、边线等属性。","image":""},{"id":63,"family":1,"name":"CupertinoTabBar","nameCN":"iOS页签","linkWidget":"158","lever":3,"info":"一个iOS风格的TabBar,通常用于CupertinoTabScaffold。可指定颜色、图标大小、边线等数据。接收item的点击事件。","image":""},{"id":64,"family":1,"name":"Scaffold","nameCN":"脚手架","linkWidget":"57,60,61","lever":4,"info":"一个通用app结构,包括上、下、左、右、中、浮动按钮部位,对应位置可盛放组件。","image":""},{"id":65,"family":1,"name":"MaterialApp","nameCN":"Material应用","linkWidget":"64","lever":5,"info":"Material应用的顶级组件,包含路由生成器、主题、语言、主页等属性。","image":""},{"id":66,"family":2,"name":"ClipOval","nameCN":"椭圆裁剪","linkWidget":"67,68,69","lever":3,"info":"可容纳一个子组件,并将其以宽高为长轴和短轴进行椭圆裁切。","image":""},{"id":67,"family":2,"name":"ClipRect","nameCN":"矩形裁剪","linkWidget":"66,68,69","lever":3,"info":"可容纳一个子组件,并将其进行矩形裁切。可借助SizedBox、Align、AspectRadio等限定组件进行定域。","image":""},{"id":68,"family":2,"name":"ClipRRect","nameCN":"圆角矩形裁剪","linkWidget":"66,67,69","lever":3,"info":"可容纳一个子组件,并将其进行圆角矩形裁剪。指定borderRadius作为边角半径。","image":""},{"id":69,"family":2,"name":"ClipPath","nameCN":"路径裁剪","linkWidget":"66,67,68","lever":5,"info":"可容纳一个子组件,并将其按指定路径进行裁剪。可以自定义路径形状,是一个很灵活的裁剪组件。","image":""},{"id":70,"family":2,"name":"DecoratedBox","nameCN":"装饰盒","linkWidget":"1","lever":4,"info":"可容纳一个子组件,可将其进行装饰。核心属性为decoration,可设置边线、渐变、阴影、背景图等。","image":""},{"id":71,"family":2,"name":"Offstage","nameCN":"消失组件","linkWidget":"10","lever":3,"info":"可容纳一个子组件,可更改其的消失与否。offstage属性为true表示隐藏。","image":""},{"id":72,"family":2,"name":"RotatedBox","nameCN":"旋转盒","linkWidget":"90","lever":2,"info":"可容纳一个子组件,将其沿顺时针旋转quarterTurns*90°。","image":""},{"id":73,"family":2,"name":"Opacity","nameCN":"透明化","linkWidget":"89,118","lever":3,"info":"可容纳一个子组件,将其透明度变为opacity值, opacity在0~1之间。","image":""},{"id":74,"family":2,"name":"Padding","nameCN":"边距组件","linkWidget":"1,191","lever":4,"info":"可容纳一个子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。","image":""},{"id":75,"family":2,"name":"Baseline","nameCN":"基线组件","linkWidget":"2","lever":2,"info":"可容纳一个子组件,通过控制基线高度来控制子组件的位置。一般用于文字组件。","image":""},{"id":76,"family":2,"name":"SizedBox","nameCN":"定尺寸盒","linkWidget":"1","lever":4,"info":"可容纳一个子组件,通过指定宽高限定子组件容身区域。","image":""},{"id":77,"family":2,"name":"AspectRatio","nameCN":"比例盒","linkWidget":"82","lever":3,"info":"可容纳一个子组件,通过指定宽高比aspectRatio,来限定子组件容身区域。","image":""},{"id":78,"family":2,"name":"Transform","nameCN":"变换","linkWidget":"1","lever":4,"info":"可容纳一个子组件,可以通过一个4*4的变换矩阵对子组件进行变换。","image":""},{"id":79,"family":2,"name":"LimitedBox","nameCN":"限制盒","linkWidget":"80","lever":3,"info":"可容纳一个子组件,通过指定最大宽高来限定子组件容身区域。","image":""},{"id":80,"family":2,"name":"ConstrainedBox","nameCN":"约束盒","linkWidget":"1,79,81","lever":3,"info":"可容纳一个子组件,通过指定最大、最小宽高,来限定子组件容身区域。","image":""},{"id":81,"family":2,"name":"UnconstrainedBox","nameCN":"约束盒","linkWidget":"80","lever":3,"info":"可容纳一个子组件,并解除该组件的所有区域约束,展现自我尺寸。","image":""},{"id":82,"family":2,"name":"FractionallySizedBox","nameCN":"分率盒","linkWidget":"77","lever":3,"info":"可容纳一个子组件,指定宽高分率,限定子组件区域为父容器宽高*各分率,及对齐方式alignment。","image":""},{"id":83,"family":2,"name":"OverflowBox","nameCN":"溢出盒","linkWidget":"84","lever":4,"info":"可容纳一个子组件,且子组件允许溢出父组件区域,可以指定宽高的最大最小区域进行限定,拥有对齐属性alignment。","image":""},{"id":84,"family":2,"name":"SizedOverflowBox","nameCN":"尺寸溢出盒","linkWidget":"83","lever":2.8,"info":"可容纳一个子组件,且子组件允许溢出父组件区域,可以通过size属性对子组件进行偏移,拥有对齐属性alignment。","image":""},{"id":85,"family":2,"name":"Align","nameCN":"对齐组件","linkWidget":"1,86,111,120","lever":5,"info":"可容纳一个子组件,可以通过alignment让子组件,定位在父组件宽高的任何指定分率出。","image":""},{"id":86,"family":2,"name":"Center","nameCN":"居中组件","linkWidget":"85","lever":3,"info":"可容纳一个子组件,并使其居中于父组件,是Align组件的一种精简模式。","image":""},{"id":87,"family":2,"name":"FittedBox","nameCN":"适应盒","linkWidget":"38","lever":4,"info":"可容纳一个子组件,使用fit属性决定子组件区域相当于父组件的适应模式,拥有对齐属性alignment。","image":""},{"id":88,"family":2,"name":"ColorFiltered","nameCN":"滤色器","linkWidget":"277,38","lever":5,"info":"可容纳一个子组件,可以并将组件按照29中叠色模式和任意组件混合,强大到我不知道该说什么好。app一键全灰了解一下。","image":""},{"id":89,"family":2,"name":"FadeTransition","nameCN":"透明变换","linkWidget":"73,118","lever":3,"info":"可容纳一个子组件,并使其进行透明度渐变动画,需要提供动画器opacity。","image":""},{"id":90,"family":1,"name":"RotationTransition","nameCN":"旋转变换","linkWidget":"72","lever":3,"info":"可容纳一个子组件,并使其进行旋转动画,需要提供动画器turns,拥有alignment属性。","image":""},{"id":91,"family":1,"name":"ScaleTransition","nameCN":"缩放变换","linkWidget":"","lever":3,"info":"可容纳一个子组件,并使其进行缩放动画,需要提供动画器scale,拥有alignment属性。","image":""},{"id":92,"family":1,"name":"SizeTransition","nameCN":"尺寸变换","linkWidget":"201","lever":3,"info":"可容纳一个子组件,并使其进行尺寸动画,需要提供动画器sizeFactor,可指定尺寸变化轴及轴向的axisAlignment。","image":""},{"id":93,"family":1,"name":"PositionedTransition","nameCN":"位置变换","linkWidget":"97","lever":3,"info":"只能用于Stack中,可容纳一个子组件,让其在两个矩形间进行位置动画,需要提供动画器rect。","image":""},{"id":94,"family":3,"name":"Flex","nameCN":"弹性布局","linkWidget":"95,96,106,107,109","lever":5,"info":"Row和Column的父类,Flutter中最强大的布局方式。可容纳多个组件,可与Spacer、Expended、Flexible组件联用进行灵活布局","image":""},{"id":95,"family":3,"name":"Row","nameCN":"行布局","linkWidget":"94,96","lever":4,"info":"排布方向为横向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。","image":""},{"id":96,"family":3,"name":"Column","nameCN":"列布局","linkWidget":"94,95","lever":4,"info":"排布方向为竖向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。","image":""},{"id":97,"family":3,"name":"Stack","nameCN":"堆叠布局","linkWidget":"94,95,161","lever":5,"info":"可容纳多个组件,以堆叠的方式摆放子组件,后者居上。拥有alignment属性,可与Positioned组件联合使用,精确定位。","image":""},{"id":98,"family":3,"name":"Wrap","nameCN":"包裹布局","linkWidget":"94,95","lever":5,"info":"可容纳多个组件,按照指定方向依次排布,可以很方便处理孩子的间距,当越界时可以自动换行。拥有主轴和交叉轴的对齐方式,比较灵活。","image":""},{"id":99,"family":3,"name":"Flow","nameCN":"流动布局","linkWidget":"98,94","lever":5,"info":"可容纳多个组件, 需要自己制定排布的代理,可以高强度自定义组件的排布,实现普通布局无法达到的效果。布局王者,当之无愧。","image":""},{"id":100,"family":1,"name":"AnimatedCrossFade","nameCN":"组件切换","linkWidget":"116","lever":5,"info":"将两个组件切换时呈现动画效果,可指定动画曲线、时长、对齐方式等属性。是一个非常有用的组件。","image":""},{"id":101,"family":3,"name":"RichText","nameCN":"富文本","linkWidget":"2","lever":5,"info":"可以容纳多种文字样式或各种组件的富文本组件,应用较为广泛。","image":""},{"id":102,"family":0,"name":"DataTable","nameCN":"数据表格","linkWidget":"110","lever":3,"info":"一个表格组件,可以制订逻辑进行点击、修改、排序等操作。","image":""},{"id":103,"family":1,"name":"Draggable","nameCN":"可拖拽组件","linkWidget":"104,105","lever":4,"info":"可以让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。","image":""},{"id":104,"family":1,"name":"DragTarget","nameCN":"拖拽目标","linkWidget":"103,105","lever":4,"info":"一个拖拽的目标区域,可接收Draggable组件的信息。可以获取拖拽时的回调。","image":""},{"id":105,"family":1,"name":"LongPressDraggable","nameCN":"拖拽目标","linkWidget":"103,104","lever":4,"info":"长按时让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。","image":""},{"id":106,"family":5,"name":"Expanded","nameCN":"延展组件","linkWidget":"94,109","lever":4,"info":"父类是Flexible,相当于一个fit类型为tight的Flexible组件。可嵌套孩子利用剩余空间对占位空间进行延展。","image":""},{"id":107,"family":0,"name":"Spacer","nameCN":"空间组件","linkWidget":"94","lever":3,"info":"只能用于Row、Column和Flex布局中,可利用剩余空间进行占位,使用flex属性可以给多个Spacer按比例分配空间。","image":""},{"id":108,"family":5,"name":"Positioned","nameCN":"定位组件","linkWidget":"97,159,121","lever":3,"info":"只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。","image":""},{"id":109,"family":5,"name":"Flexible","nameCN":"灵活组件","linkWidget":"94,106","lever":3,"info":"只能用于只能用于Row、Column和Flex布局中,可嵌套孩子利用剩余空间对占位空间进行延展,也可指定适应类型。","image":""},{"id":110,"family":6,"name":"Table","nameCN":"表格组件","linkWidget":"102","lever":4,"info":"用于展示表格的组件,可指定边线、列宽、文字方向等属性,核心对象类型是TableRow。","image":""},{"id":111,"family":1,"name":"AlignTransition","nameCN":"对齐变换","linkWidget":"85,120","lever":3,"info":"AnimatedWidget的子类,使用Alignment类型的动画器让子组件在两个Alignment对象之间进行过渡动画。","image":""},{"id":112,"family":1,"name":"SlideTransition","nameCN":"滑动变换","linkWidget":"","lever":3,"info":"AnimatedWidget的子类,使用Offset类型的动画器让子组件在两个Offset对象之间进行过渡动画。","image":""},{"id":113,"family":1,"name":"DecoratedBoxTransition","nameCN":"装饰变换","linkWidget":"70","lever":3,"info":"AnimatedWidget的子类,使用Decorated类型的动画器让子组件在两个Decorated对象之间进行过渡动画。","image":""},{"id":114,"family":1,"name":"DefaultTextStyleTransition","nameCN":"文字样式变换","linkWidget":"124,324","lever":3,"info":"AnimatedWidget的子类,使用TextStyle类型的动画器让文字组件在两个TextStyle对象之间进行过渡动画。","image":""},{"id":115,"family":1,"name":"RelativePositionedTransition","nameCN":"矩形位置变换","linkWidget":"70","lever":3,"info":"AnimatedWidget的子类,使用Rect类型的动画器让子组件在两个Rect对象之间进行过渡动画。","image":""},{"id":116,"family":1,"name":"AnimatedSwitcher","nameCN":"动画切换","linkWidget":"100","lever":4,"info":"当子组件变化时执行动画,需要指定子组件的key进行标识。动画方式可以自定义,能指定动画时长、动画曲线等属性。","image":""},{"id":117,"family":1,"name":"AnimatedList","nameCN":"动画列表","linkWidget":"162","lever":3,"info":"强化版的ListView,可以对item进行动画处理。比如在添加、删除是item的动画。","image":""},{"id":118,"family":1,"name":"AnimatedOpacity","nameCN":"透明动画","linkWidget":"89,73","lever":3,"info":"能让子组件进行Opacity(透明度)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":119,"family":1,"name":"AnimatedPadding","nameCN":"边距动画","linkWidget":"74","lever":3,"info":"能让子组件进行Padding(内边距)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":120,"family":1,"name":"AnimatedAlign","nameCN":"对齐动画","linkWidget":"85,111","lever":3,"info":"能让子组件进行Align(对齐)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":121,"family":1,"name":"AnimatedPositioned","nameCN":"定位动画","linkWidget":"108,93,122","lever":3,"info":"能让子组件进行Positioned(定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。","image":""},{"id":122,"family":1,"name":"AnimatedPositionedDirectional","nameCN":"方向定位动画","linkWidget":"121,159","lever":3,"info":"能让子组件进行PositionedDirectional(方向定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。","image":""},{"id":123,"family":1,"name":"AnimatedContainer","nameCN":"容器动画","linkWidget":"1","lever":5,"info":"集合alignment、padding、color、decoration、width、height、constraints、margin、transform于一身,这些属性皆可动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":124,"family":1,"name":"AnimatedDefaultTextStyle","nameCN":"容器动画","linkWidget":"114,324","lever":3,"info":"能让子文字组件进行TextStyle(文字样式)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":125,"family":0,"name":"AnimatedIcon","nameCN":"图标动画","linkWidget":"6","lever":3,"info":"使用AnimatedIcons的图标数据,可以根据一个动画控制器来使图标进行动画效果。可指定图标大小、颜色等。","image":""},{"id":126,"family":0,"name":"Dialog","nameCN":"对话框","linkWidget":"","lever":2,"info":"最简易的对话框面板,包含一个内容组件,可指定影深、背景色、形状等属性。","image":""},{"id":127,"family":0,"name":"AlertDialog","nameCN":"弹出对话框","linkWidget":"129","lever":3,"info":"一个通用的对话框结构,可指定头、中、尾处的组件。拥有标题、内容的文字样式和边距,影深、形状等属性。","image":""},{"id":128,"family":0,"name":"SimpleDialog","nameCN":"简单对话框","linkWidget":"133","lever":3,"info":"一个简单的对话框结构,可指定头、中处的组件。拥有拥有标题、内容的文字样式和边距,影深、形状等属性。常与SimpleDialogOption联用。","image":""},{"id":129,"family":0,"name":"CupertinoAlertDialog","nameCN":"iOS对话框","linkWidget":"127","lever":3,"info":"iOS风格的通用的对话框结构,可指定头、中、尾处的组件。","image":""},{"id":130,"family":0,"name":"AboutDialog","nameCN":"弹出对话框","linkWidget":"193","lever":1,"info":"应用的简介对话框,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表,点击左侧按钮可以跳转到证书页。","image":""},{"id":131,"family":0,"name":"CupertinoActionSheet","nameCN":"iOS行为单","linkWidget":"132","lever":3,"info":"iOS风格的弹出选择结构,可放多的按钮,一般与CupertinoActionSheetAction联用。","image":""},{"id":132,"family":0,"name":"CupertinoActionSheetAction","nameCN":"iOS行为单按键","linkWidget":"131","lever":1,"info":"一个按钮,应用场景很少,通常用于CupertinoActionSheet中,接收点击事件。","image":""},{"id":133,"family":0,"name":"SimpleDialogOption","nameCN":"简单对话框选项","linkWidget":"128","lever":1,"info":"一个按钮,应用场景很少,通常用于SimpleDialog中,接收点击事件。","image":""},{"id":134,"family":0,"name":"DayPicker","nameCN":"日期选择器","linkWidget":"135,136","lever":3,"info":"日期的选择组件,可指定当前日期、选中日期、展示月份等,接收日期选中事件。","image":""},{"id":135,"family":1,"name":"MonthPicker","nameCN":"月份选择器","linkWidget":"134,136","lever":3,"info":"月份的选择组件,自带上下月切换的监听。可指定选择的日期范围、选中日期等,接收日期选中事件。","image":""},{"id":136,"family":1,"name":"YearPicker","nameCN":"年份选择器","linkWidget":"134,135","lever":3,"info":"年份的选择组件,长相比较寒酸。可指定选择的日期范围、选中日期等,接收每份选中事件","image":""},{"id":137,"family":1,"name":"CupertinoDatePicker","nameCN":"iOS日期选择器","linkWidget":"138","lever":3,"info":"高大上的滑滚日期选择器,可指定选择的类型、日期范围等,接收日期选中事件。","image":""},{"id":138,"family":1,"name":"CupertinoTimerPicker","nameCN":"iOS时间选择器","linkWidget":"137","lever":3,"info":"高大上的滑滚时间选择器,可指定选择的类型、初始时间、背景色等,接收时间选中事件。","image":""},{"id":139,"family":1,"name":"CupertinoPicker","nameCN":"iOS选择器","linkWidget":"179","lever":3,"info":"高大上的柱面滑动选择器,精妙十足,可指定很多配置属性,接收滑动时选中事件。","image":""},{"id":140,"family":1,"name":"SnackBar","nameCN":"信息提示条","linkWidget":"141,142","lever":4,"info":"作为组件来说是一个简单的结构组件,可指定形状、影深、背景色等。一般通过ScaffoldState的showSnackBar方法从底部弹出。","image":""},{"id":141,"family":1,"name":"SnackBarAction","nameCN":"信息提示条按钮","linkWidget":"140","lever":1,"info":"一般只用于SnackBar中,接受点击事件。点击一次后该按钮就会被禁用,可以指定颜色和禁用时颜色。","image":""},{"id":142,"family":1,"name":"BottomSheet","nameCN":"底部抽屉","linkWidget":"140","lever":4,"info":"作为组件来说是一个简单的结构组件,可指定形状、影深、背景色、内部组件构造器等。一般通过ScaffoldState的showBottomSheet方法从底部弹出。","image":""},{"id":143,"family":1,"name":"CupertinoContextMenu","nameCN":"ios弹出菜单","linkWidget":"144","lever":5,"info":"一个华丽的iOS风格按钮弹出框,长按时会以动画的形式弹出菜单面板,通常和CupertinoContextMenuAction联用。","image":""},{"id":144,"family":1,"name":"CupertinoContextMenuAction","nameCN":"ios弹出菜单按钮","linkWidget":"143","lever":1,"info":"一般只用于CupertinoContextMenu中的点击按钮。可指定孩子和尾部图标,接收点击事件。","image":""},{"id":145,"family":1,"name":"LicensePage","nameCN":"证书页","linkWidget":"130,193","lever":1,"info":"应用的证书页,可指定应用图标、应用名、应用版本号等信息,其他由Flutter自动生成。","image":""},{"id":146,"family":0,"name":"GestureDetector","nameCN":"手势监听器","linkWidget":"147,150","lever":5,"info":"组件手势事件的检测器,可接受点击、长按、双击,按下、松开、移动等事件,并可以获取触点信息,居家旅行必备组件。","image":""},{"id":147,"family":0,"name":"Listener","nameCN":"事件监听器","linkWidget":"146","lever":3,"info":"组件事件的监听器,可接受按下、松开、移动、取消等事件。较GestureDetector比较原始,可获取的信息也更多。","image":""},{"id":148,"family":0,"name":"Tab","nameCN":"标签","linkWidget":"58","lever":1,"info":"一般用于TabBar中的item,上下结构,可指定图标和一个内容组件。","image":""},{"id":149,"family":1,"name":"InkResponse","nameCN":"水波纹响应","linkWidget":"150,152","lever":1,"info":"水波纹的点击效果,接收点击、双击、长按、取消、高亮变化事件,可指定水波纹颜色、半径、高亮形状等属性。","image":""},{"id":150,"family":1,"name":"InkWell","nameCN":"水波纹","linkWidget":"149,152","lever":4,"info":"InkResponse的子类,基本属性同InkResponse。一个矩形区域的水波纹,可以知道圆角半径,边线形状等。","image":""},{"id":151,"family":1,"name":"TableRowInkWell","nameCN":"表格水波纹","linkWidget":"110","lever":1,"info":"只能用于Table的水波纹,接收点击、双击、长按、高亮变化事件,水波纹会作用于表格的一行。","image":""},{"id":152,"family":1,"name":"Ink","nameCN":"水波","linkWidget":"149,150","lever":3,"info":"使InkWell和InkResponse的水波纹有效,用于绘制图像或其他装饰的Material组件。","image":""},{"id":153,"family":1,"name":"RawChip","nameCN":"原生小条","linkWidget":"11,12,13,14,15","lever":5,"info":"各自Chip组件的始祖,拥有各自Chip表现的能力,支持选中、点击、删除等事件。详见Chip、FilterChip、ActionChip、InputChip、ChoiceChip。","image":""},{"id":154,"family":0,"name":"Drawer","nameCN":"滑页栏","linkWidget":"64,155","lever":2,"info":"一般用于Scaffold中的draw和endDraw属性作为左右的滑页栏,可以容纳一个子组件,能指定影深。","image":""},{"id":155,"family":0,"name":"DrawerHeader","nameCN":"滑页栏","linkWidget":"154","lever":2,"info":"一般用于Drawer中,作为滑页栏的头部。可以指定内外边距、装饰、子组件等属性。","image":""},{"id":156,"family":1,"name":"CupertinoApp","nameCN":"iOS应用","linkWidget":"157,158","lever":4,"info":"iOS风格应用的顶级组件,包含路由生成器、主题、语言、主页等属性。","image":""},{"id":157,"family":1,"name":"CupertinoPageScaffold","nameCN":"iOS页面脚手架","linkWidget":"62","lever":3,"info":"iOS风格的页面布局脚手架结构,可指定顶部的导航栏和页面背景色。","image":""},{"id":158,"family":1,"name":"CupertinoTabScaffold","nameCN":"iOS页签脚手架","linkWidget":"63","lever":3,"info":"iOS风格的页面布局脚手架结构,可指定最底部的导航切换栏可主体内容页。","image":""},{"id":159,"family":0,"name":"PositionedDirectional","nameCN":"方向定位","linkWidget":"108,122","lever":3,"info":"和Positioned组件功能一样,属性名不同。只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。","image":""},{"id":160,"family":1,"name":"Material","nameCN":"材料组件","linkWidget":"3","lever":5,"info":"Material风格组件的领军人物,灵魂核心。可指定颜色、影深、类型、阴影颜色、形状等属性。","image":""},{"id":161,"family":3,"name":"IndexedStack","nameCN":"索引堆叠","linkWidget":"97","lever":4,"info":"Stack组件的子类,可以堆叠多个组件,并通过index来指定展示的组件索引,其余的会被隐藏。","image":""},{"id":162,"family":0,"name":"ListView","nameCN":"列表组件","linkWidget":"16,163","lever":5,"info":"列表显示的领军人物,容纳多个子组件,可以通过builder、separated、custom等构造。有内边距、是否反向、滑动控制器等属性。","image":""},{"id":163,"family":0,"name":"GridView","nameCN":"网格组件","linkWidget":"21,162","lever":5,"info":"容纳多个组件,并以网格的方式。可以通过count、extent、custom、builder等构造。有内边距、是否反向、滑动控制器等属性。","image":""},{"id":164,"family":0,"name":"SingleChildScrollView","nameCN":"单子滑动","linkWidget":"","lever":5,"info":"使一个组件具有滑动的效果,可指定滑动的方向、是否反向、滑动控制器等属性。","image":""},{"id":165,"family":0,"name":"PageView","nameCN":"滑页","linkWidget":"","lever":5,"info":"容纳多个组件页面,可对它们进行滑动切换,可指定滑动的方向、是否反向、滑动控制器等属性。","image":""},{"id":166,"family":2,"name":"CustomPaint","nameCN":"绘制组件","linkWidget":"","lever":5,"info":"通过CustomPainter进行绘制,可实现一些复杂的自定义绘制组件,是Flutter中自定义组件的灵魂人物。","image":""},{"id":167,"family":5,"name":"MediaQuery","nameCN":"媒体查询","linkWidget":"","lever":4,"info":"可通过MediaQuery.of来获取屏幕尺寸、设备密度、文字缩放比例、边距等信息。","image":""},{"id":168,"family":0,"name":"Theme","nameCN":"主题","linkWidget":"65,169","lever":4,"info":"可通过Theme.of获取ThemeData对象。也可以指定主题应用于Theme的后代组件。","image":""},{"id":169,"family":0,"name":"CupertinoTheme","nameCN":"iOS主题","linkWidget":"156,168","lever":3,"info":"可通过CupertinoTheme.of获取CupertinoThemeData对象。也可以指定主题应用于CupertinoTheme的后代组件。","image":""},{"id":170,"family":1,"name":"WillPopScope","nameCN":"返回拦截","linkWidget":"","lever":5,"info":"当一个界面中有WillPopScope组件时,在页面返回时会触发回调,决定是否返回。可用于二次确认退出的场景。","image":""},{"id":171,"family":1,"name":"Hero","nameCN":"共享动画","linkWidget":"28","lever":5,"info":"可指定标签名,两个界面跳转时具有相同标签的组件会进行共享动画。一个界面中不能存在两个同名的Hero标签","image":""},{"id":172,"family":1,"name":"FutureBuilder","nameCN":"异步构造器","linkWidget":"173","lever":5,"info":"可指定一个Future对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。注意该Future对象不能和FutureBuilder同时创建,否则可能过渡刷新。","image":""},{"id":173,"family":1,"name":"StreamBuilder","nameCN":"流构造器","linkWidget":"172","lever":5,"info":"可指定一个stream对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。","image":""},{"id":174,"family":1,"name":"PopupMenuDivider","nameCN":"弹出菜单分割线","linkWidget":"56,34","lever":1,"info":"PopupMenuButton的分割线,一般不单独使用,可指定高度。","image":""},{"id":175,"family":1,"name":"RawMaterialButton","nameCN":"原始按钮","linkWidget":"23,25,26,27","lever":5,"info":"原始的Material按钮,按钮界的幕后大佬,可接受点击、长按、高亮变化事件,可指定颜色、形状。影深、内边距等属性。","image":""},{"id":176,"family":1,"name":"Dismissible","nameCN":"滑动消失","linkWidget":"162","lever":4,"info":"滑动时可显示底部组件,可指定滑动的方向和交叉轴的偏移量。接收确认消失和消失时的回调。","image":""},{"id":177,"family":1,"name":"ReorderableListView","nameCN":"可重排序列表","linkWidget":"162","lever":4,"info":"可以进行长按排序的ListView,可指定滑动方向、是否反向、滑动控制器等属性。","image":""},{"id":178,"family":1,"name":"ExpansionPanelList","nameCN":"展开列表","linkWidget":"52","lever":3,"info":"可展开的列表组件,可根据逻辑来实现单展开或多展开。可指定展开动画时长,接收展开回调","image":""},{"id":179,"family":1,"name":"ListWheelScrollView","nameCN":"滚轮列表","linkWidget":"139","lever":4,"info":"高大上的柱面滑动列表,精妙十足,可指定item高度、透视、挤压等属性,接收滑动时选中事件。","image":""},{"id":180,"family":5,"name":"ScrollConfiguration","nameCN":"ios菜单按钮","linkWidget":"162,163,164","lever":3,"info":"需要包裹一个可滑动的组件,并通过behavior属性控制滑动的效果,可以去除滑动的蓝色阴影等。","image":""},{"id":181,"family":5,"name":"DropdownButtonHideUnderline","nameCN":"下拉按钮隐藏线","linkWidget":"55","lever":1,"info":"用于去除DropdownButton的下划线,本身没有什么应用价值。","image":""},{"id":182,"family":1,"name":"Overlay","nameCN":"悬浮组件","linkWidget":"","lever":5,"info":"可以将组件在全应用中进行悬浮显示,能够添加或移除组件,它们有独立管理的栈。","image":""},{"id":183,"family":4,"name":"CustomScrollView","nameCN":"通用滑动视图","linkWidget":"184,185,188","lever":5,"info":"一个通用的滑动结构,可以指定滑动方向、是否反向、滑动控制器等属性。其中包含的子组件们必须是Sliver家族。","image":""},{"id":184,"family":4,"name":"SliverAppBar","nameCN":"Sliver头部栏","linkWidget":"183,196","lever":4,"info":"Sliver家族的顶部栏通用结构,可以指定左中右组件、收缩空间、影深、固定模式、背景色等属性。","image":""},{"id":185,"family":4,"name":"SliverList","nameCN":"Sliver列表","linkWidget":"183,186,187","lever":5,"info":"Sliver家族的列表组件,通过指定delegate构造子组件。通常用于CustomScrollView中。","image":""},{"id":186,"family":4,"name":"SliverFixedExtentList","nameCN":"Sliver固定延展列表","linkWidget":"183,185,187","lever":3,"info":"Sliver家族的列表组件,通过delegate构造子组件,可以指定item的高度。通常用于CustomScrollView中。","image":""},{"id":187,"family":4,"name":"SliverFillViewport","nameCN":"Sliver填充视图列表","linkWidget":"183,185,186","lever":3,"info":"Sliver家族的列表组件,通过delegate构造子组件,item的高度会填空视口,可以指定是否的分率。","image":""},{"id":188,"family":4,"name":"SliverGird","nameCN":"Sliver网格","linkWidget":"183","lever":4,"info":"Sliver家族的网格列表组件,和GirdView类似,通过count和extent构造。通常用于CustomScrollView中。","image":""},{"id":189,"family":4,"name":"SliverToBoxAdapter","nameCN":"Sliver适配器","linkWidget":"183","lever":4,"info":"可以容纳一个普通的组件,并将其转化成Sliver家族组件的适配器。","image":""},{"id":190,"family":4,"name":"SliverPersistentHeader","nameCN":"Sliver存留头","linkWidget":"183","lever":5,"info":"通常用于CustomScrollView中,可以让一个组件在滑动中停留在顶部,不会滑动消失。","image":""},{"id":191,"family":4,"name":"SliverPadding","nameCN":"Sliver内间距","linkWidget":"74","lever":3,"info":"可容纳一个Sliver家族的子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。","image":""},{"id":192,"family":4,"name":"SliverOpacity","nameCN":"Sliver透明度","linkWidget":"73","lever":3,"info":"可容纳一个Sliver家族的子组件,并通过opacity来指定子组件的透明度。","image":""},{"id":193,"family":0,"name":"AboutListTile","nameCN":"关于应用条目","linkWidget":"130,145","lever":3,"info":"一个点击条目,点击时可以弹出应用相关信息,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表。","image":""},{"id":194,"family":1,"name":"Scrollbar","nameCN":"滑动指示栏","linkWidget":"195,164,162","lever":3,"info":"需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。","image":""},{"id":195,"family":1,"name":"CupertinoScrollbar","nameCN":"iOS滑动指示栏","linkWidget":"194,164,162","lever":3,"info":"iOS风格的滑动指示栏,需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。","image":""},{"id":196,"family":4,"name":"FlexibleSpaceBar","nameCN":"ios菜单按钮","linkWidget":"184","lever":3,"info":"通常用于SliverAppBar中的可伸展区域,可指定标题、标题间距、背景、折叠模式等。","image":""},{"id":197,"family":6,"name":"ErrorWidget","nameCN":"错误组件","linkWidget":"","lever":1,"info":"用于显示一个错误信息的组件,红底黄字,在开发过程中经常看到,一般不使用。","image":""},{"id":198,"family":1,"name":"Form","nameCN":"表单组件","linkWidget":"199","lever":4,"info":"表单组件,可以接收其下的FormField组件的变化回调,通过onWillPop拦截页面返回,通过FormState可对表单字段进行保存或校验。","image":""},{"id":199,"family":1,"name":"TextFormField","nameCN":"文字表单输入","linkWidget":"54,198","lever":4,"info":"和TextField属性基本一致,在其基础上增加字段的校验和提交的回调,FormState的save会触发onSaved回调。","image":""},{"id":200,"family":1,"name":"Stepper","nameCN":"步骤组件","linkWidget":"","lever":5,"info":"步骤组件,可指定一步步的操作,可以自定义步骤的内容,确认和返回的按钮以及步骤排列的方向。","image":""},{"id":201,"family":1,"name":"AnimatedSize","nameCN":"尺寸动画","linkWidget":"92","lever":3,"info":"子组件大小发生变化是,进行动画渐变,可指定时长、对齐方式、曲线、vsync等属性。","image":""},{"id":202,"family":0,"name":"Builder","nameCN":"构造器","linkWidget":"","lever":2,"info":"一个不影响子组件占位空间,不具有显示性的组件,存在的唯一价值是提供当前组件对应元素的上下文。","image":""},{"id":203,"family":0,"name":"OrientationBuilder","nameCN":"方向构造器","linkWidget":"202","lever":2,"info":"能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。","image":""},{"id":204,"family":0,"name":"PreferredSize","nameCN":"优先尺寸","linkWidget":"57,64","lever":2,"info":"实现了PreferredSizeWidget接口,可容纳一个子组件,设置优先尺寸,不会对其子组件施加任何约束。","image":""},{"id":205,"family":0,"name":"TabPageSelector","nameCN":"页签滑动选择器","linkWidget":"206,59","lever":2,"info":"通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。","image":""},{"id":206,"family":0,"name":"TabPageSelectorIndicator","nameCN":"页签指示器","linkWidget":"205","lever":2,"info":"一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。","image":""},{"id":208,"family":0,"name":"Title","nameCN":"应用标题","linkWidget":"65","lever":2,"info":"该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。","image":""},{"id":211,"family":0,"name":"MaterialBanner","nameCN":"横幅组件","linkWidget":"","lever":2,"info":"Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等","image":""},{"id":214,"family":0,"name":"NavigationToolbar","nameCN":"导航工具条","linkWidget":"57","lever":2,"info":"左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。","image":""},{"id":218,"family":0,"name":"CupertinoNavigationBarBackButton","nameCN":"iOS风格返回按钮","linkWidget":"57","lever":2,"info":"Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。","image":""},{"id":231,"family":1,"name":"InputDecorator","nameCN":"输入装饰","linkWidget":"54","lever":2,"info":"在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。","image":""},{"id":232,"family":1,"name":"Navigator","nameCN":"导航器","linkWidget":"65","lever":4,"info":"Navigator用堆栈规则管理一组子组件,可以将子组件切入弹出及监听出入栈事件。MaterialApp路由管理的本源就是使用了Navigator。","image":""},{"id":244,"family":1,"name":"EditableText","nameCN":"可编辑文字","linkWidget":"2,54","lever":2,"info":"可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。","image":""},{"id":245,"family":1,"name":"CupertinoTextField","nameCN":"iOS风格输入框","linkWidget":"54","lever":4,"info":"Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。","image":""},{"id":251,"family":4,"name":"NestedScrollView","nameCN":"嵌套滑动视图","linkWidget":"183","lever":4,"info":"用于多个视图滑动嵌套处理,可以指定头部、滑动控制器、滑动方向等,其中body必须是可滑动类型的组件。","image":""},{"id":253,"family":1,"name":"Scrollable","nameCN":"可滑动组件","linkWidget":"340,349","lever":4,"info":"实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。","image":""},{"id":255,"family":1,"name":"ValueListenableBuilder","nameCN":"监听值构造器","linkWidget":"","lever":5,"info":"可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。","image":""},{"id":262,"family":1,"name":"CupertinoSegmentedControl","nameCN":"iOS多栏切换","linkWidget":"33","lever":4,"info":"iOS风格的多按钮栏,表现和ToggleButtons类似,可指定内边距。","image":""},{"id":263,"family":2,"name":"FractionalTranslation","nameCN":"分度偏移","linkWidget":"","lever":3,"info":"通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。","image":""},{"id":264,"family":2,"name":"RepaintBoundary","nameCN":"重绘边界","linkWidget":"166","lever":5,"info":"为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用","image":""},{"id":277,"family":2,"name":"ShaderMask","nameCN":"着色器遮罩","linkWidget":"88,38","lever":4,"info":"可容纳一个孩子,并通过着色器来对孩子进行着色,可指定混色模式。通常用于组件渐变色处理。","image":""},{"id":278,"family":2,"name":"BackdropFilter","nameCN":"背景滤镜","linkWidget":"88,97,67","lever":4,"info":"可容纳一个孩子,并将背景进行模糊滤镜。可以通过Stack将背景模糊实现组件的模糊效果。","image":""},{"id":279,"family":2,"name":"PhysicalShape","nameCN":"物理形状","linkWidget":"69","lever":4,"info":"可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。","image":""},{"id":285,"family":2,"name":"CustomSingleChildLayout","nameCN":"通用单子布局","linkWidget":"341","lever":3,"info":"可容纳一个子组件,并指定代理类对子组件进行排布。代理类可获取父容器区域和子组件的区域大小,及区域约束情况。","image":""},{"id":287,"family":2,"name":"LayoutBuilder","nameCN":"布局构造器","linkWidget":"","lever":4,"info":"可以检测到父容器的区域大小,并根据父容器的尺寸信息可以完成自定义布局。是一个非常实用的布局组件。","image":""},{"id":292,"family":2,"name":"IgnorePointer","nameCN":"忽视点击","linkWidget":"295,146,149,150","lever":4,"info":"容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身不接受事件。","image":""},{"id":293,"family":1,"name":"MouseRegion","nameCN":"鼠标区域","linkWidget":"","lever":3,"info":"用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。","image":""},{"id":295,"family":2,"name":"AbsorbPointer","nameCN":"吸收点击","linkWidget":"146,149,150,292","lever":4,"info":"容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身接受事件。","image":""},{"id":297,"family":2,"name":"IntrinsicWidth","nameCN":"固有宽","linkWidget":"298","lever":4,"info":"根据子元素的固有宽度度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。","image":""},{"id":298,"family":2,"name":"IntrinsicHeight","nameCN":"固有高","linkWidget":"297","lever":4,"info":"根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。","image":""},{"id":307,"family":4,"name":"SliverOverlapAbsorber","nameCN":"重叠吸收器","linkWidget":"251,308","lever":3,"info":"包裹另一个的sliver,并迫使其布局范围被视为重叠。需要和SliverOverlapInjector联用。","image":""},{"id":308,"family":4,"name":"SliverOverlapInjector","nameCN":"重叠注射器","linkWidget":"251,307","lever":3,"info":"一个sliver,需要和SliverOverlapAbsorber联用,处理视图重叠问题。","image":""},{"id":312,"family":6,"name":"PerformanceOverlay","nameCN":"性能浮层","linkWidget":"65","lever":2,"info":"可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。","image":""},{"id":313,"family":6,"name":"RawImage","nameCN":"原图片","linkWidget":"38","lever":2,"info":"是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。","image":""},{"id":315,"family":5,"name":"LayoutId","nameCN":"布局Id","linkWidget":"341","lever":2,"info":"只能用于CustomMultiChildLayout组件中,为其子组件标识身份。","image":""},{"id":324,"family":5,"name":"DefaultTextStyle","nameCN":"默认字体样式","linkWidget":"2,114,124","lever":3,"info":"可容纳一个孩子,为后代的文字指定默认样式。常用于多个相同文字的样式统一,避免一一设置。","image":""},{"id":325,"family":5,"name":"IconTheme","nameCN":"图标样式","linkWidget":"6","lever":3,"info":"可容纳一个孩子,为后代的图标指定默认样式。常用于多个相同图标的样式统一,避免一一设置。","image":""},{"id":326,"family":5,"name":"ButtonTheme","nameCN":"按钮样式","linkWidget":"23,25,26,27","lever":3,"info":"主要用于为后代的Button类型组件统一设置默认属性,也可以通过该组件获取默认Button的属性。","image":""},{"id":327,"family":5,"name":"MaterialBannerTheme","nameCN":"横幅样式","linkWidget":"211","lever":2,"info":"主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。","image":""},{"id":328,"family":5,"name":"ChipTheme","nameCN":"小条样式","linkWidget":"11,153,12,13,14,15","lever":3,"info":"主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。","image":""},{"id":329,"family":5,"name":"DividerTheme","nameCN":"分割线样式","linkWidget":"34,35","lever":3,"info":"主要用于为后代的Divider类型组件统一设置默认属性,也可以通过该组件获取默认Divider的属性。","image":""},{"id":330,"family":5,"name":"PopupMenuTheme","nameCN":"弹出菜单样式","linkWidget":"56","lever":2,"info":"主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。","image":""},{"id":331,"family":5,"name":"SliderTheme","nameCN":"滑块样式","linkWidget":"42","lever":3,"info":"可容纳一个孩子,为后代的Slider指定默认样式。常用于Slider的样式统一,避免一一设置,也可以对Slider进行样式定制。","image":""},{"id":332,"family":5,"name":"ToggleButtonsTheme","nameCN":"滑块样式","linkWidget":"33","lever":2,"info":"主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。","image":""},{"id":333,"family":5,"name":"TooltipTheme","nameCN":"提示主题","linkWidget":"50","lever":2,"info":"主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。","image":""},{"id":334,"family":5,"name":"ListTileTheme","nameCN":"ListTile主题","linkWidget":"16","lever":2,"info":"主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。","image":""},{"id":338,"family":5,"name":"ButtonBarTheme","nameCN":"按钮条主题","linkWidget":"29","lever":2,"info":"主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。","image":""},{"id":340,"family":3,"name":"Viewport","nameCN":"视口组件","linkWidget":"253,349","lever":1,"info":"通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。","image":""},{"id":341,"family":3,"name":"CustomMultiChildLayout","nameCN":"通用多子布局","linkWidget":"315,285","lever":4,"info":"使用一个代理类对子组件集进行布局控制,子组件必须使用LayoutId组件进行标识。","image":""},{"id":342,"family":3,"name":"ListBody","nameCN":"列表体","linkWidget":"162","lever":1,"info":"将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListView。","image":""},{"id":351,"family":1,"name":"InteractiveViewer","nameCN":"交互视图","linkWidget":"147,146,78","lever":4,"info":"主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。","image":""},{"id":352,"family":0,"name":"CupertinoDialogAction","nameCN":"交互视图","linkWidget":"129","lever":1,"info":" 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。","image":""}] \ No newline at end of file diff --git a/modules/fx_app_env/lib/src/app_env.dart b/modules/fx_app_env/lib/src/app_env.dart new file mode 100644 index 00000000..07d14107 --- /dev/null +++ b/modules/fx_app_env/lib/src/app_env.dart @@ -0,0 +1,8 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-13 +// Contact Me: 1981462002@qq.com + diff --git a/modules/fx_app_env/lib/src/os.dart b/modules/fx_app_env/lib/src/os.dart new file mode 100644 index 00000000..07d14107 --- /dev/null +++ b/modules/fx_app_env/lib/src/os.dart @@ -0,0 +1,8 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-13 +// Contact Me: 1981462002@qq.com + diff --git a/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart b/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart new file mode 100644 index 00000000..a0c1dd63 --- /dev/null +++ b/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart @@ -0,0 +1,92 @@ +import 'dart:convert'; + +import 'package:flutter/services.dart'; +import 'package:storage/storage.dart'; + +import '../model/enums.dart'; +import '../model/node_model.dart'; +import '../model/widget_filter.dart'; +import '../model/widget_model.dart'; +import '../widget_repository.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明 : Widget数据仓库 + +class MemoryWidgetRepository implements WidgetRepository { + + List _widgetCache = []; + List get widgets => _widgetCache; + + MemoryWidgetRepository(); + + Future _initData() async{ + + } + + // Future> loadWidgets(WidgetFamily family) async { + // var result = + // widgets.map(WidgetModel.fromPo).where((element) => element.family == family).toList(); + // result.sort((a, b) => b.lever.compareTo(a.lever)); + // return result; + // } + + + @override + Future> searchWidgets(WidgetFilter args) async { + print(args); + var result = widgets + .map(WidgetModel.fromPo) + .where((element) => + element.name.toLowerCase().contains(args.name.toLowerCase()) || + element.nameCN.toLowerCase().contains(args.name.toLowerCase())) + .toList(); + result.sort((a, b) => b.lever.compareTo(a.lever)); + return result; + } + + @override + Future> loadNode(WidgetModel widgetModel) async { + var str = await rootBundle.loadString('assets/data/node.json'); + var data = json.decode(str) as List; + List nodes = data + .map((e) => NodePo.fromJson(e)) + .toList() + .where((element) => element.widgetId == widgetModel.id) + .map(NodeModel.fromPo) + .toList(); + return nodes; + } + + @override + Future> loadWidget(List id) async { + var data = widgets.where((element) => id.contains(element.id)); + return data.map(WidgetModel.fromPo).toList(); + } + + + + @override + Future> loadLikeWidgets() async{ + return []; + } + + @override + Future queryWidgetByName(String? name) async{ + // TODO: implement queryWidgetByName + throw UnimplementedError(); + } + + @override + Future toggleLike(int id) async {} + + @override + Future total(WidgetFilter args) async { + return 0; + } + + @override + Future collected(int id) async{ + return 0; + } +} diff --git a/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart b/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart new file mode 100644 index 00000000..07d14107 --- /dev/null +++ b/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart @@ -0,0 +1,8 @@ +// Copyright 2014 The 张风捷特烈 . All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Author: 张风捷特烈 +// CreateTime: 2024-07-13 +// Contact Me: 1981462002@qq.com + diff --git a/packages/widget_module/lib/data/exp.dart b/packages/widget_module/lib/data/zone.dart similarity index 100% rename from packages/widget_module/lib/data/exp.dart rename to packages/widget_module/lib/data/zone.dart diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 00000000..e3327a45 --- /dev/null +++ b/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + flutter_unit + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 00000000..04dec196 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "flutter_unit", + "short_name": "flutter_unit", + "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" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/web/splash.gif b/web/splash.gif new file mode 100644 index 0000000000000000000000000000000000000000..7945179a6e1042c4594492e6fd79a3f008ef6623 GIT binary patch literal 340438 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'sgor<^ODR*N;e9*)u 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 z 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

    qcVu~ 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 Bju6Ci|cPf!)aHBu596 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

    Lt@=xZ2~2hElzKr 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 IhzcwHKPeR!$^ZZW literal 0 HcmV?d00001 diff --git a/web/splash.js b/web/splash.js new file mode 100644 index 00000000..e69de29b diff --git a/sqlite3.dll b/windows/libs/sqlite3.dll similarity index 100% rename from sqlite3.dll rename to windows/libs/sqlite3.dll From 65820f441ebf645edbd1db2e44e575e7c9c84f26 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 17 Jul 2024 05:28:51 +0800 Subject: [PATCH 074/149] =?UTF-8?q?web=20=E5=B9=B6=E5=85=A5=E4=B8=BB?= =?UTF-8?q?=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/bloc_wrapper.dart | 16 +++- lib/app_stater/impl/app_start_action.dart | 9 +- lib/app_stater/impl/start_repository.dart | 5 +- modules/fx_app_env/.gitignore | 29 ++++++ modules/fx_app_env/.metadata | 10 ++ modules/fx_app_env/CHANGELOG.md | 3 + modules/fx_app_env/LICENSE | 1 + modules/fx_app_env/README.md | 39 ++++++++ modules/fx_app_env/analysis_options.yaml | 4 + modules/fx_app_env/lib/fx_app_env.dart | 3 + modules/fx_app_env/lib/src/app_env.dart | 47 ++++++++++ modules/fx_app_env/lib/src/os.dart | 40 ++++++++ modules/fx_app_env/pubspec.yaml | 54 +++++++++++ modules/fx_app_env/test/fx_app_env_test.dart | 12 +++ .../views/window_buttons.dart | 2 + .../window/windows_adapter.dart | 7 +- packages/app/lib/app/theme/app_theme.dart | 1 - packages/app/pubspec.yaml | 2 + .../lib/src/gallery_detail_page.dart | 3 +- .../draw_system/lib/src/picture_frame.dart | 3 +- .../lib/src/db_storage/app_db_storage.dart | 24 +---- .../src/db_storage/flutter_db_storage.dart | 42 ++++----- .../src/db_storage/helper/db_open_helper.dart | 23 ----- packages/storage/pubspec.yaml | 5 +- .../blocs/category_bloc/category_bloc.dart | 2 +- .../category_widget_bloc.dart | 2 +- .../liked_widget_bloc/liked_widget_bloc.dart | 2 +- .../widget_detail_bloc.dart | 2 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 6 +- .../data/db_impl/catagory_db_repository.dart | 2 +- .../data/db_impl/widget_db_repository.dart | 2 +- .../memory_impl/memory_node_repository.dart | 88 ++++-------------- .../memory_impl/memory_widget_repository.dart | 87 +++++++++++++++-- packages/widget_module/lib/data/zone.dart | 4 +- .../category_panel/desk_category_page.dart | 2 +- .../category_panel/desk_top_like_panel.dart | 2 +- .../widget_detail/link_widget_buttons.dart | 2 +- .../widget_detail/widget_detail_bar.dart | 2 +- .../widget_detail/widget_detail_page.dart | 36 +++---- .../widget_detail/widget_detail_panel.dart | 2 +- .../desk_ui/widget_panel/desk_search_bar.dart | 2 +- .../widget_panel/desk_widget_model_item.dart | 4 +- .../desk_ui/widget_panel/widget_panel.dart | 2 +- .../mobile/category_page/category_detail.dart | 2 +- .../category_page/category_list_item.dart | 2 +- .../mobile/category_page/category_page.dart | 2 +- .../category_page/edit_category_panel.dart | 2 +- .../category_page/like_widget_page.dart | 2 +- .../category_page/sync/async_button.dart | 2 +- .../category_page/sync/upload_button.dart | 2 +- .../mobile/search_page/app_search_bar.dart | 2 +- .../search_page/standard_search_bar.dart | 2 +- .../search_page/standard_search_page.dart | 2 +- .../widget_detail/category_end_drawer.dart | 2 +- .../collect_widget_list_item.dart | 2 +- .../widget_detail/widget_detail_bar.dart | 2 +- .../widget_detail/widget_detail_page.dart | 50 +++++----- .../widget_detail/widget_detail_panel.dart | 2 +- .../widget_page/phone_widget_content.dart | 2 +- .../widget_page/standard_home_page.dart | 2 +- .../mobile/widget_page/widget_model_item.dart | 2 +- packages/widget_module/lib/widget_module.dart | 2 +- pubspec.lock | 9 +- pubspec.yaml | 4 +- web/index.html | 54 ++++++++++- web/splash.gif | Bin 340438 -> 29295 bytes web/splash.js | 16 ++++ windows/CMakeLists.txt | 3 + 68 files changed, 567 insertions(+), 240 deletions(-) create mode 100644 modules/fx_app_env/.gitignore create mode 100644 modules/fx_app_env/.metadata create mode 100644 modules/fx_app_env/CHANGELOG.md create mode 100644 modules/fx_app_env/LICENSE create mode 100644 modules/fx_app_env/README.md create mode 100644 modules/fx_app_env/analysis_options.yaml create mode 100644 modules/fx_app_env/lib/fx_app_env.dart create mode 100644 modules/fx_app_env/pubspec.yaml create mode 100644 modules/fx_app_env/test/fx_app_env_test.dart diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index 7b05e5a6..70127419 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -2,6 +2,7 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; +import 'package:fx_app_env/fx_app_env.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -24,10 +25,19 @@ class BlocWrapper extends StatefulWidget { } class _BlocWrapperState extends State { - final WidgetRepository repository = const WidgetDbRepository(); + late WidgetRepository repository; - final CategoryBloc categoryBloc = - CategoryBloc(repository: CategoryDbRepository()); + @override + void initState() { + super.initState(); + if(kAppEnv.isWeb){ + repository = MemoryWidgetRepository(); + }else{ + repository = const WidgetDbRepository(); + } + } + + final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); final AuthRepository authRepository = HttpAuthRepository(); @override diff --git a/lib/app_stater/impl/app_start_action.dart b/lib/app_stater/impl/app_start_action.dart index c6aa571d..a1600c39 100644 --- a/lib/app_stater/impl/app_start_action.dart +++ b/lib/app_stater/impl/app_start_action.dart @@ -2,10 +2,11 @@ import 'package:app/app.dart'; import 'package:app_boot_starter/app_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_app_env/fx_app_env.dart'; import 'package:go_router/go_router.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_module/data/exp.dart'; +import 'package:widget_module/data/zone.dart'; class AppStartActionImpl implements AppStartAction { @@ -17,8 +18,10 @@ class AppStartActionImpl implements AppStartAction { HttpUtil.instance.rebase(PathUnit.baseUrl); context.read().init(state); context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); - context.read().add(const EventLoadLikeData()); - context.read().add(const EventLoadCategory()); + if(!kAppEnv.isWeb){ + context.read().add(const EventLoadLikeData()); + context.read().add(const EventLoadCategory()); + } } @override diff --git a/lib/app_stater/impl/start_repository.dart b/lib/app_stater/impl/start_repository.dart index 84b48fc9..76761349 100644 --- a/lib/app_stater/impl/start_repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -5,6 +5,7 @@ import 'package:app/app.dart'; import 'package:app_boot_starter/app_boot_starter.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; +import 'package:fx_app_env/fx_app_env.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; @@ -17,7 +18,7 @@ class AppStartRepositoryImpl implements AppStartRepository { @override Future initApp() async { await SpStorage.instance.initSp(); - await initDb(); + if (!kAppEnv.isWeb) await initDb(); AppConfigPo po = await SpStorage.instance.appConfig.read(); List netConnect = await (Connectivity().checkConnectivity()); AppConfigState state = AppConfigState.fromPo(po); @@ -35,7 +36,6 @@ class AppStartRepositoryImpl implements AppStartRepository { } Future initDb() async { - DbOpenHelper.setupDatabase(); //数据库不存在,执行拷贝 String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, "flutter.db"); @@ -49,7 +49,6 @@ class AppStartRepositoryImpl implements AppStartRepository { print("=====flutter.db 已存在===="); } print('====数据库所在文件夹: $databasesPath======='); - await FlutterDbStorage.instance.initDb(); await AppDbStorage.instance.initDb(); } diff --git a/modules/fx_app_env/.gitignore b/modules/fx_app_env/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/fx_app_env/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/fx_app_env/.metadata b/modules/fx_app_env/.metadata new file mode 100644 index 00000000..8f7b6ac1 --- /dev/null +++ b/modules/fx_app_env/.metadata @@ -0,0 +1,10 @@ +# 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: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + channel: "stable" + +project_type: package diff --git a/modules/fx_app_env/CHANGELOG.md b/modules/fx_app_env/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/fx_app_env/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/fx_app_env/LICENSE b/modules/fx_app_env/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/fx_app_env/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/fx_app_env/README.md b/modules/fx_app_env/README.md new file mode 100644 index 00000000..02fe8eca --- /dev/null +++ b/modules/fx_app_env/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/fx_app_env/analysis_options.yaml b/modules/fx_app_env/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/fx_app_env/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_app_env/lib/fx_app_env.dart b/modules/fx_app_env/lib/fx_app_env.dart new file mode 100644 index 00000000..e380a57a --- /dev/null +++ b/modules/fx_app_env/lib/fx_app_env.dart @@ -0,0 +1,3 @@ +library fx_app_env; + +export 'src/app_env.dart'; \ No newline at end of file diff --git a/modules/fx_app_env/lib/src/app_env.dart b/modules/fx_app_env/lib/src/app_env.dart index 07d14107..ff699603 100644 --- a/modules/fx_app_env/lib/src/app_env.dart +++ b/modules/fx_app_env/lib/src/app_env.dart @@ -6,3 +6,50 @@ // CreateTime: 2024-07-13 // Contact Me: 1981462002@qq.com +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'os.dart'; + +AppEnv kAppEnv = AppEnv(); + +class AppEnv { + late OS _os; + late OSChecker _checker; + + OS get os => _os; + + AppEnv() { + _os = _initOS(); + _checker = OSChecker(os); + } + + OS _initOS() { + if (kIsWeb) return OS.web; + if (Platform.isWindows) return OS.windows; + if (Platform.isMacOS) return OS.macos; + if (Platform.isLinux) return OS.linux; + if (Platform.isIOS) return OS.ios; + if (Platform.isAndroid) return OS.android; + return OS.unknown; + } + + bool get isAndroid => _checker.isAndroid; + + bool get isIos => _checker.isIos; + + bool get isWindows => _checker.isWindows; + + bool get isMacOS => _checker.isMacOS; + + bool get isLinux => _checker.isLinux; + + bool get isWeb => _checker.isWeb; + + bool get isDesktop => _checker.isDesktop; + + bool get isDesktopUI => _checker.isDesktopUI; + + bool get isMobile => _checker.isMobile; +} diff --git a/modules/fx_app_env/lib/src/os.dart b/modules/fx_app_env/lib/src/os.dart index 07d14107..d840fc33 100644 --- a/modules/fx_app_env/lib/src/os.dart +++ b/modules/fx_app_env/lib/src/os.dart @@ -6,3 +6,43 @@ // CreateTime: 2024-07-13 // Contact Me: 1981462002@qq.com +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +enum OS { + android, + ios, + windows, + macos, + linux, + web, + unknown, +} + + +class OSChecker { + bool isAndroid = false; + bool isIos = false; + bool isWindows = false; + bool isMacOS = false; + bool isLinux = false; + bool isWeb = false; + + bool isDesktop = false; + bool isDesktopUI = false; + bool isMobile = false; + + OSChecker(OS os) { + isWeb = os == OS.web; + isAndroid = !isWeb && os == OS.android; + isIos = !isWeb && os == OS.ios; + isWindows = !isWeb && os == OS.windows; + isMacOS = !isWeb && os == OS.macos; + isLinux = !isWeb && os == OS.linux; + + isDesktop = !isWeb && (isMacOS || isWindows || isLinux); + isMobile = !isWeb && (isAndroid || isIos); + isDesktopUI = isWeb || isDesktop; + } +} diff --git a/modules/fx_app_env/pubspec.yaml b/modules/fx_app_env/pubspec.yaml new file mode 100644 index 00000000..65ae63cd --- /dev/null +++ b/modules/fx_app_env/pubspec.yaml @@ -0,0 +1,54 @@ +name: fx_app_env +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.4.3 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_app_env/test/fx_app_env_test.dart b/modules/fx_app_env/test/fx_app_env_test.dart new file mode 100644 index 00000000..7251333f --- /dev/null +++ b/modules/fx_app_env/test/fx_app_env_test.dart @@ -0,0 +1,12 @@ +// import 'package:flutter_test/flutter_test.dart'; +// +// import 'package:fx_app_env/fx_app_env.dart'; +// +// void main() { +// test('adds one to input values', () { +// final calculator = Calculator(); +// expect(calculator.addOne(2), 3); +// expect(calculator.addOne(-7), -6); +// expect(calculator.addOne(0), 1); +// }); +// } diff --git a/packages/app/lib/app/platform_adapter/views/window_buttons.dart b/packages/app/lib/app/platform_adapter/views/window_buttons.dart index 714687ac..e9250711 100644 --- a/packages/app/lib/app/platform_adapter/views/window_buttons.dart +++ b/packages/app/lib/app/platform_adapter/views/window_buttons.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; @@ -12,6 +13,7 @@ class WindowButtons extends StatefulWidget { class _WindowButtonsState extends State { @override Widget build(BuildContext context) { + if(kIsWeb) return SizedBox(); Brightness brightness = Theme.of(context).brightness; return Align( alignment:Alignment.topRight,child: Wrap( diff --git a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart index b208703f..dd6a2396 100644 --- a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart +++ b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart @@ -2,11 +2,13 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:fx_app_env/fx_app_env.dart'; import 'package:window_manager/window_manager.dart'; class WindowsAdapter { static Future setSize() async { + if(kIsWeb) return; if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { //仅对桌面端进行尺寸设置 await windowManager.ensureInitialized(); @@ -39,7 +41,7 @@ class DragToMoveAreaNoDouble extends StatelessWidget { @override Widget build(BuildContext context) { - if(Platform.isAndroid||Platform.isIOS) return child; + if(kAppEnv.isWeb||kAppEnv.isMobile) return child; return GestureDetector( behavior: HitTestBehavior.translucent, onPanStart: (details) { @@ -62,8 +64,7 @@ class DragToMoveWrapper extends StatelessWidget implements PreferredSizeWidget{ @override Widget build(BuildContext context) { - bool isDesk = kIsWeb || Platform.isMacOS||Platform.isWindows||Platform.isLinux; - if(!isDesk) return child; + if(kAppEnv.isWeb||kAppEnv.isMobile) return child; return GestureDetector( behavior: HitTestBehavior.translucent, onDoubleTap: !canDouble?null:() async{ diff --git a/packages/app/lib/app/theme/app_theme.dart b/packages/app/lib/app/theme/app_theme.dart index ac3987aa..2418fed1 100644 --- a/packages/app/lib/app/theme/app_theme.dart +++ b/packages/app/lib/app/theme/app_theme.dart @@ -18,7 +18,6 @@ class AppTheme { statusBarBrightness: Brightness.dark, statusBarIconBrightness: Brightness.light, ); - bool useMaterial3 = (Platform.isAndroid || Platform.isIOS); return ThemeData( scaffoldBackgroundColor: scaffoldBackgroundColor, diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index 2bce3a20..07a04678 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: connectivity_plus: ^6.0.3 window_manager: ^0.3.9 #桌面尺寸 url_launcher: ^6.1.14 # url + fx_app_env: + path: ../../modules/fx_app_env storage: path: ../storage widget_module: diff --git a/packages/draw_system/lib/src/gallery_detail_page.dart b/packages/draw_system/lib/src/gallery_detail_page.dart index b1881c8e..9bf82808 100644 --- a/packages/draw_system/lib/src/gallery_detail_page.dart +++ b/packages/draw_system/lib/src/gallery_detail_page.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:toly_ui/toly_ui.dart'; @@ -182,7 +183,7 @@ class _GalleryDetailPageState extends State { } } - bool isDesk = Platform.isMacOS || Platform.isWindows || Platform.isLinux; + bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; Widget buildTitle(BuildContext context) { diff --git a/packages/draw_system/lib/src/picture_frame.dart b/packages/draw_system/lib/src/picture_frame.dart index 72a98f08..591c2e00 100644 --- a/packages/draw_system/lib/src/picture_frame.dart +++ b/packages/draw_system/lib/src/picture_frame.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'dart:ui'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -124,7 +125,7 @@ class FrameShower extends StatelessWidget { @override Widget build(BuildContext context) { - bool isDesk = Platform.isMacOS || Platform.isWindows || Platform.isLinux; + bool isDesk = kIsWeb||Platform.isMacOS || Platform.isWindows || Platform.isLinux; if (isDesk) { return DeskFrameShower( content: content, diff --git a/packages/storage/lib/src/db_storage/app_db_storage.dart b/packages/storage/lib/src/db_storage/app_db_storage.dart index 82df17f9..e2fcef0f 100644 --- a/packages/storage/lib/src/db_storage/app_db_storage.dart +++ b/packages/storage/lib/src/db_storage/app_db_storage.dart @@ -1,6 +1,4 @@ import 'dart:async'; -import 'dart:io'; - import 'package:storage/storage.dart'; import 'dao/cache_dao.dart'; @@ -30,26 +28,12 @@ class AppDbStorage { if (_database != null) return; String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, name); - - if (Platform.isWindows||Platform.isLinux) { - DatabaseFactory databaseFactory = databaseFactoryFfi; - _database = await databaseFactory.openDatabase( - dbPath, - options: OpenDatabaseOptions( - version: DbUpdater.version, - onCreate: _onCreate, - onUpgrade: _onUpgrade, - onOpen: _onOpen - ), - ); - }else{ - _database = await openDatabase(dbPath, + _database = await openDatabase(dbPath, version: DbUpdater.version , onCreate: _onCreate, - onUpgrade: _onUpgrade, - onOpen: _onOpen, - ); - } + onUpgrade: _onUpgrade, + onOpen: _onOpen, + ); } diff --git a/packages/storage/lib/src/db_storage/flutter_db_storage.dart b/packages/storage/lib/src/db_storage/flutter_db_storage.dart index ef0a6db4..cb08df73 100644 --- a/packages/storage/lib/src/db_storage/flutter_db_storage.dart +++ b/packages/storage/lib/src/db_storage/flutter_db_storage.dart @@ -1,8 +1,7 @@ import 'dart:io'; - - import 'package:artifact/artifact.dart'; +import 'package:flutter/foundation.dart'; import 'package:storage/storage.dart'; import 'helper/db_open_helper.dart'; @@ -11,13 +10,27 @@ import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:path/path.dart' as path; import 'package:sqflite/sqflite.dart'; - class FlutterDbStorage { Database? _database; - FlutterDbStorage._(); + FlutterDbStorage._() { + setupDatabase(); + } + + static FlutterDbStorage? _instance; + + static FlutterDbStorage get instance { + _instance ??= FlutterDbStorage._(); + return _instance!; + } - static FlutterDbStorage instance = FlutterDbStorage._(); + void setupDatabase() { + if (kIsWeb) return; + if (Platform.isWindows || Platform.isWindows) { + sqfliteFfiInit(); + databaseFactory = databaseFactoryFfi; + } + } late WidgetDao _widgetDao; late CategoryDao _categoryDao; @@ -33,7 +46,9 @@ class FlutterDbStorage { NodeDao get nodeDao => _nodeDao; LikeDao get likeDao => _likeDao; + ArticleDao get articleDao => _articleDao; + ColumnizeDao get columnizeDao => _columnizeDao; Database get db => _database!; @@ -42,22 +57,7 @@ class FlutterDbStorage { if (_database != null) return; String databasesPath = await DbOpenHelper.getDbDirPath(); String dbPath = path.join(databasesPath, name); - - if (Platform.isWindows||Platform.isLinux) { - DatabaseFactory databaseFactory = databaseFactoryFfi; - _database = await databaseFactory.openDatabase( - dbPath, - options: OpenDatabaseOptions( - // version: DbUpdater.VERSION, - // onCreate: _onCreate, - // onUpgrade: _onUpgrade, - // onOpen: _onOpen - ), - ); - }else{ - _database = await openDatabase(dbPath); - } - + _database = await openDatabase(dbPath); _widgetDao = WidgetDao(_database!); _categoryDao = CategoryDao(_database!); _nodeDao = NodeDao(_database!); diff --git a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart index 5f5f2ae3..c28277c8 100644 --- a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart +++ b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart @@ -2,33 +2,10 @@ import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; -import 'dart:ffi'; - -import 'package:sqlite3/open.dart'; -import 'package:sqlite3/sqlite3.dart'; -import 'package:path/path.dart'; class DbOpenHelper{ - static void setupDatabase(){ - if(Platform.isWindows){ - String location = Directory.current.path; - _windowsInit(join(location, 'sqlite3.dll')); - } - } - - static void _windowsInit(String path) { - open.overrideFor(OperatingSystem.windows, () { - try { - return DynamicLibrary.open(path); - } catch (e) { - stderr.writeln('Failed to load sqlite3.dll at $path'); - rethrow; - } - }); - sqlite3.openInMemory().dispose(); - } static Future getDbDirPath() async{ Directory appDocDir = await getApplicationDocumentsDirectory(); diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 8a38b331..0b749dc4 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -10,9 +10,8 @@ environment: dependencies: flutter: sdk: flutter - - sqflite: ^2.3.0 # 数据库 - sqflite_common_ffi: ^2.3.1 # 数据库 + sqflite_common_ffi: 2.3.3 + sqflite: ^2.3.3+1 shared_preferences: ^2.2.1 # xml 固化 path_provider: ^2.1.1 # 路径 diff --git a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart index 14bab09d..fa104856 100644 --- a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart +++ b/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart @@ -1,7 +1,7 @@ import 'package:storage/storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/exp.dart'; +import '../../data/zone.dart'; part 'category_event.dart'; diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart b/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart index a2b0d45c..b0d075d5 100644 --- a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart +++ b/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/exp.dart'; +import '../../data/zone.dart'; diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart b/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart index 1ff59bbb..352458a0 100644 --- a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart +++ b/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/exp.dart'; +import '../../data/zone.dart'; diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 1c96552b..bf7866e3 100644 --- a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -1,7 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/exp.dart'; +import '../../data/zone.dart'; part 'widget_detail_state.dart'; diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 7b8357ce..c34079b0 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -5,7 +5,7 @@ import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/exp.dart'; +import '../../data/zone.dart'; part 'widgets_event.dart'; @@ -37,8 +37,8 @@ class WidgetsBloc extends Bloc { filter: filter, operate: LoadOperate.load, )); - } catch (err) { - print(err); + } catch (err,t) { + print("======$err==========$t=============="); emit(WidgetsLoadFailed( err.toString(), filter: filter, diff --git a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart index 8c68bd4a..a200b2df 100644 --- a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:storage/storage.dart'; -import '../exp.dart'; +import '../zone.dart'; diff --git a/packages/widget_module/lib/data/db_impl/widget_db_repository.dart b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart index 7a6e7a46..0018cda4 100644 --- a/packages/widget_module/lib/data/db_impl/widget_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart @@ -1,7 +1,7 @@ import 'package:storage/storage.dart'; -import '../exp.dart'; +import '../zone.dart'; diff --git a/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart b/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart index a0c1dd63..11919387 100644 --- a/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart +++ b/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/services.dart'; import 'package:storage/storage.dart'; @@ -7,86 +8,35 @@ import '../model/enums.dart'; import '../model/node_model.dart'; import '../model/widget_filter.dart'; import '../model/widget_model.dart'; +import '../node_repository.dart'; import '../widget_repository.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com -/// 说明 : Widget数据仓库 +/// 说明 : Node 数据仓库 -class MemoryWidgetRepository implements WidgetRepository { +class MemoryNodeRepository implements NodeRepository { + List? _nodeCache; - List _widgetCache = []; - List get widgets => _widgetCache; - MemoryWidgetRepository(); + MemoryNodeRepository(); - Future _initData() async{ - - } - - // Future> loadWidgets(WidgetFamily family) async { - // var result = - // widgets.map(WidgetModel.fromPo).where((element) => element.family == family).toList(); - // result.sort((a, b) => b.lever.compareTo(a.lever)); - // return result; - // } - - - @override - Future> searchWidgets(WidgetFilter args) async { - print(args); - var result = widgets - .map(WidgetModel.fromPo) - .where((element) => - element.name.toLowerCase().contains(args.name.toLowerCase()) || - element.nameCN.toLowerCase().contains(args.name.toLowerCase())) - .toList(); - result.sort((a, b) => b.lever.compareTo(a.lever)); - return result; + Future initData() async { + if (_nodeCache != null) { + return; + } + ByteData byteData = await rootBundle.load('assets/data/web/node.json'); + String content = utf8.decode(byteData.buffer.asUint8List()); + var data = json.decode(content) as List; + _nodeCache = data.map((e) => NodePo.fromJson(e)).toList(); } @override - Future> loadNode(WidgetModel widgetModel) async { - var str = await rootBundle.loadString('assets/data/node.json'); - var data = json.decode(str) as List; - List nodes = data - .map((e) => NodePo.fromJson(e)) - .toList() - .where((element) => element.widgetId == widgetModel.id) - .map(NodeModel.fromPo) + Future> loadNode(int widgetId) async { + await initData(); + return _nodeCache! + .where((element) => element.widgetId == widgetId) + .map((e) => NodeModel(name: e.name, subtitle: e.subtitle, code: e.code)) .toList(); - return nodes; - } - - @override - Future> loadWidget(List id) async { - var data = widgets.where((element) => id.contains(element.id)); - return data.map(WidgetModel.fromPo).toList(); - } - - - - @override - Future> loadLikeWidgets() async{ - return []; - } - - @override - Future queryWidgetByName(String? name) async{ - // TODO: implement queryWidgetByName - throw UnimplementedError(); - } - - @override - Future toggleLike(int id) async {} - - @override - Future total(WidgetFilter args) async { - return 0; - } - - @override - Future collected(int id) async{ - return 0; } } diff --git a/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart b/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart index 07d14107..ad375a2e 100644 --- a/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart +++ b/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart @@ -1,8 +1,83 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. +import 'dart:convert'; +import 'dart:io'; -// Author: 张风捷特烈 -// CreateTime: 2024-07-13 -// Contact Me: 1981462002@qq.com +import 'package:flutter/services.dart'; +import 'package:storage/storage.dart'; +import '../model/widget_filter.dart'; +import '../model/widget_model.dart'; +import '../widget_repository.dart'; + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明 : Widget 数据仓库 + +class MemoryWidgetRepository implements WidgetRepository { + List? _widgetCache; + + List get widgets => _widgetCache!; + + MemoryWidgetRepository(); + + Future _initData() async { + if (_widgetCache != null) { + return; + } + ByteData byteData = await rootBundle.load('assets/data/web/widget.json'); + String content = utf8.decode(byteData.buffer.asUint8List()); + var data = json.decode(content) as List; + _widgetCache = data.map((e) => WidgetPo.fromJson(e)).toList(); + } + + @override + Future> searchWidgets(WidgetFilter args) async { + await _initData(); + var result = widgets.map(WidgetModel.fromPo).where((e) => checkSearch(e, args)).toList(); + result.sort((a, b) => b.lever.compareTo(a.lever)); + return result; + } + + bool checkSearch(WidgetModel model, WidgetFilter args) { + bool nameMatch = model.name.toLowerCase().contains(args.name.toLowerCase()); + bool nameCNMatch = model.nameCN.toLowerCase().contains(args.name.toLowerCase()); + bool familyMatch = model.family == args.family; + + return nameMatch || nameCNMatch || familyMatch; + } + + @override + Future> loadWidget(List id) async { + await _initData(); + var data = widgets.where((element) => id.contains(element.id)); + return data.map(WidgetModel.fromPo).toList(); + } + + @override + Future> loadLikeWidgets() async { + return []; + } + + @override + Future queryWidgetByName(String? name) async { + await _initData(); + Iterable ret = + widgets.map(WidgetModel.fromPo).where((element) => element.name == name); + if (ret.isNotEmpty) { + return ret.first; + } + return null; + } + + @override + Future toggleLike(int id) async {} + + @override + Future total(WidgetFilter args) async { + return 0; + } + + @override + Future collected(int id) async { + return 0; + } +} diff --git a/packages/widget_module/lib/data/zone.dart b/packages/widget_module/lib/data/zone.dart index 6f2f9a8b..8fe47b61 100644 --- a/packages/widget_module/lib/data/zone.dart +++ b/packages/widget_module/lib/data/zone.dart @@ -2,4 +2,6 @@ export 'category_repository.dart'; export 'node_repository.dart'; export 'widget_repository.dart'; export 'model/model.dart'; -export 'db_impl/db_impl.dart'; \ No newline at end of file +export 'db_impl/db_impl.dart'; +export 'memory_impl/memory_node_repository.dart'; +export 'memory_impl/memory_widget_repository.dart'; \ No newline at end of file diff --git a/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart b/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart index 77d34f9c..e689cdc6 100644 --- a/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart +++ b/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../../mobile/category_page/category_list_item.dart'; import '../../mobile/category_page/delete_category_dialog.dart'; import '../../mobile/category_page/edit_category_panel.dart'; diff --git a/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart b/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart index 130e027d..bcd1d9e8 100644 --- a/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../../mobile/widget_detail/collect_widget_list_item.dart'; import '../../mobile/widget_detail/widget_detail_page.dart'; diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart index ccbee6c0..03242a1b 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart @@ -1,6 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; class LinkWidgetButtons extends StatelessWidget { final List links; diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart index 580faf15..e27bae43 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart @@ -9,7 +9,7 @@ import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; class DeskSliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 4e0acaa6..7e7e38c5 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -1,11 +1,12 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; import 'package:widgets/widgets.dart'; import '../../mobile/widget_detail/category_end_drawer.dart'; @@ -19,6 +20,7 @@ import 'widget_node_panel.dart'; class DeskWidgetDetailPageScope extends StatefulWidget { final WidgetModel? model; final String? widgetName; + const DeskWidgetDetailPageScope({super.key, required this.model, this.widgetName}); @override @@ -28,6 +30,9 @@ class DeskWidgetDetailPageScope extends StatefulWidget { class _DeskWidgetDetailPageScopeState extends State { WidgetModel? _model; + WidgetRepository get widgetRepository => context.read().repository; + NodeRepository get nodeRepository => kIsWeb? MemoryNodeRepository():const NodeDbRepository(); + @override void initState() { super.initState(); @@ -38,10 +43,7 @@ class _DeskWidgetDetailPageScopeState extends State { } void _loadModelByName() async { - _model = await context - .read() - .repository - .queryWidgetByName(widget.widgetName); + _model = await widgetRepository.queryWidgetByName(widget.widgetName); } @override @@ -53,9 +55,9 @@ class _DeskWidgetDetailPageScopeState extends State { return BlocProvider( create: (_) => WidgetDetailBloc( - widgetRepository: const WidgetDbRepository(), - nodeRepository: const NodeDbRepository()) - ..push(_model!), + widgetRepository: widgetRepository, + nodeRepository: nodeRepository, + )..push(_model!), child: DeskWidgetDetailPage( model: widget.model, ), @@ -63,15 +65,13 @@ class _DeskWidgetDetailPageScopeState extends State { } } -class DeskWidgetDetailPage extends StatelessWidget{ +class DeskWidgetDetailPage extends StatelessWidget { final WidgetModel? model; const DeskWidgetDetailPage({Key? key, required this.model}) : super(key: key); @override Widget build(BuildContext context) { - - WidgetDetailBloc bloc = context.watch(); return BlocBuilder( @@ -84,8 +84,8 @@ class DeskWidgetDetailPage extends StatelessWidget{ ); } - Widget linkText(BuildContext context) => Row( - children: [ + Widget linkText(BuildContext context) => Row( + children: [ const Padding( padding: EdgeInsets.only(left: 15, right: 5), child: Icon(Icons.link, color: Colors.blue), @@ -109,7 +109,7 @@ class DeskWidgetDetailPage extends StatelessWidget{ children: [ Expanded( child: DeskWidgetDetailPanel( - model: bloc.currentWidget, + model: bloc.currentWidget, ), ), const SizedBox( @@ -119,7 +119,9 @@ class DeskWidgetDetailPage extends StatelessWidget{ child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), linkText(context), if (state is DetailWithData) LinkWidgetButtons( @@ -148,12 +150,10 @@ class DeskWidgetDetailPage extends StatelessWidget{ return detailBloc.pop(); } - Widget _buildSliverNodeList( - BuildContext context, List nodes, WidgetModel model) { + Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { AppConfigState globalState = BlocProvider.of(context).state; return SliverList( - delegate: SliverChildBuilderDelegate( (_, i) => DeskWidgetNodePanel( codeStyle: globalState.codeStyle, diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index c6346a38..e53b7f53 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:toly_ui/toly_ui.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; class DeskWidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index 71479778..f4bde7b1 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -7,7 +7,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; class DeskSearchBar extends StatefulWidget { diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 411d9ea4..737c1e98 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -5,7 +5,7 @@ import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/views/components/collected_tag.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; import 'package:wrapper/wrapper.dart'; @@ -41,7 +41,7 @@ class DeskWidgetItem extends StatelessWidget { ) ] ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), // margin: child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index 2489906e..fda03363 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -4,7 +4,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; diff --git a/packages/widget_module/lib/views/mobile/category_page/category_detail.dart b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart index 40dc214e..15eb0047 100644 --- a/packages/widget_module/lib/views/mobile/category_page/category_detail.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_detail.dart @@ -8,7 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; /// create by 张风捷特烈 on 2020-04-22 diff --git a/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart b/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart index 708fd470..5147d815 100644 --- a/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart @@ -2,7 +2,7 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/packages/widget_module/lib/views/mobile/category_page/category_page.dart b/packages/widget_module/lib/views/mobile/category_page/category_page.dart index 305bf68d..03752395 100644 --- a/packages/widget_module/lib/views/mobile/category_page/category_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/category_page.dart @@ -8,7 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import 'category_list_item.dart'; diff --git a/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart b/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart index 147520cd..ff9d3609 100644 --- a/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart +++ b/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart @@ -5,7 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; /// create by 张风捷特烈 on 2020-04-23 diff --git a/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart b/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart index 674e3646..c7015d85 100644 --- a/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart +++ b/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart index 1c0ccc50..859d4120 100644 --- a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -10,7 +10,7 @@ import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:storage/storage.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; import 'package:toly_ui/toly_ui.dart'; diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index 18743ce3..c1e10c13 100644 --- a/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -10,7 +10,7 @@ import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:toly_ui/toly_ui.dart'; -import '../../../../data/exp.dart'; +import '../../../../data/zone.dart'; diff --git a/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart index c5fa71e4..0542917d 100644 --- a/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; class AppSearchBar extends StatefulWidget { diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 7c411e87..89a79a6b 100644 --- a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWidget { diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart index 0777df15..013ec39f 100644 --- a/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../widget_page/widget_model_item.dart'; import 'standard_search_bar.dart'; diff --git a/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart b/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart index 5c2a720e..60c5441b 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart @@ -7,7 +7,7 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../widget_page/unit_drawer_header.dart'; diff --git a/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart b/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart index df22313e..2e70491b 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:toly_ui/toly_ui.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; class CollectWidgetListItem extends StatelessWidget { final WidgetModel data; diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart index a923f734..83601239 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart @@ -8,7 +8,7 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; class SliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 3e53b705..6a716c7a 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -1,11 +1,12 @@ import 'dart:io'; import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../../desk_ui/widget_detail/link_widget_buttons.dart'; import 'widget_node_panel.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -16,7 +17,6 @@ import 'category_end_drawer.dart'; import 'widget_detail_bar.dart'; import 'widget_detail_panel.dart'; - // 用于组件详情不需要在一开始就加载 // WidgetDetailBloc 可以在稍后提供 class WidgetDetailPageScope extends StatelessWidget { @@ -26,11 +26,14 @@ class WidgetDetailPageScope extends StatelessWidget { @override Widget build(BuildContext context) { + WidgetRepository widgetRepository = context.read().repository; + NodeRepository nodeRepository = kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); + return BlocProvider( create: (_) => WidgetDetailBloc( - widgetRepository: const WidgetDbRepository(), - nodeRepository: const NodeDbRepository()) - ..push(model), + widgetRepository: widgetRepository, + nodeRepository: nodeRepository, + )..push(model), child: WidgetDetailPage( model: model, ), @@ -49,22 +52,21 @@ class WidgetDetailPage extends StatelessWidget { bool isDark = Theme.of(context).brightness == Brightness.dark; return Scaffold( - backgroundColor: isDark?Colors.black:Colors.white, + backgroundColor: isDark ? Colors.black : Colors.white, endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), body: Builder(builder: (ctx) => _buildContent(ctx, bloc)), ); } - Widget linkText(BuildContext context) => Row( - children: [ - const Padding( - padding: EdgeInsets.only(left: 15, right: 5), - child: Icon(Icons.link, color: Colors.blue), - ), - Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), - ], - ); - + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { DetailState state = bloc.state; @@ -72,9 +74,7 @@ class WidgetDetailPage extends StatelessWidget { onWillPop: () => _whenPop(context), child: CustomScrollView( slivers: [ - SliverWidgetDetailBar( - model: bloc.currentWidget - ), + SliverWidgetDetailBar(model: bloc.currentWidget), SliverToBoxAdapter( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -82,13 +82,16 @@ class WidgetDetailPage extends StatelessWidget { WidgetDetailPanel(model: bloc.currentWidget), linkText(context), if (state is DetailWithData) - LinkWidgetButtons(links: state.links, onSelect: bloc.push,), + LinkWidgetButtons( + links: state.links, + onSelect: bloc.push, + ), const Divider(), ], ), ), if (state is DetailWithData) - _buildSliverNodeList(context,state.nodes, state.widgetModel) + _buildSliverNodeList(context, state.nodes, state.widgetModel) ], )); } @@ -102,8 +105,7 @@ class WidgetDetailPage extends StatelessWidget { return detailBloc.pop(); } - - Widget _buildSliverNodeList(BuildContext context,List nodes, WidgetModel model) { + Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { AppConfigState globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( @@ -119,4 +121,4 @@ class WidgetDetailPage extends StatelessWidget { childCount: nodes.length, )); } -} \ No newline at end of file +} diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart index e8517841..b57c9bb1 100644 --- a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart +++ b/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart @@ -2,7 +2,7 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; class WidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart b/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart index 0b33f5a8..846d2f79 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart @@ -2,7 +2,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import 'widget_model_item.dart'; class PhoneWidgetContent extends StatelessWidget { diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index e399935f..9be24633 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -5,7 +5,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import 'home_drawer.dart'; import 'standard_home_search.dart'; import 'widget_page.dart'; diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart index 66f9c443..c040a994 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart @@ -6,7 +6,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:wrapper/wrapper.dart'; -import '../../../data/exp.dart'; +import '../../../data/zone.dart'; import '../../components/collected_tag.dart'; class StandardWidgetItem extends StatelessWidget { diff --git a/packages/widget_module/lib/widget_module.dart b/packages/widget_module/lib/widget_module.dart index 14aef872..b948b754 100644 --- a/packages/widget_module/lib/widget_module.dart +++ b/packages/widget_module/lib/widget_module.dart @@ -2,4 +2,4 @@ library widget_module; export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; -export 'data/exp.dart'; \ No newline at end of file +export 'data/zone.dart'; \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 686730c5..b1b25850 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,6 +302,13 @@ packages: description: flutter source: sdk version: "0.0.0" + fx_app_env: + dependency: "direct main" + description: + path: "modules/fx_app_env" + relative: true + source: path + version: "0.0.1" fx_go_router_ext: dependency: transitive description: @@ -1075,5 +1082,5 @@ packages: source: hosted version: "6.3.0" sdks: - dart: ">=3.4.0 <4.0.0" + dart: ">=3.4.3 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 04a74b2a..729358c5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,8 @@ dependencies: ## fx 架构 - app 启动器 app_boot_starter: ^1.0.0 - + fx_app_env: + path: modules/fx_app_env ## tolyui tolyui: ^0.0.2+15 @@ -98,6 +99,7 @@ flutter: assets: - assets/images/ - assets/data/ + - assets/data/web/ - assets/images/head_icon/ - assets/images/widgets/ - assets/flutter.db diff --git a/web/index.html b/web/index.html index e3327a45..437e36b3 100644 --- a/web/index.html +++ b/web/index.html @@ -14,7 +14,43 @@ This is a placeholder for base href that will be replaced by the value of the `--base-href` argument provided to `flutter build`. --> - + + @@ -32,7 +68,21 @@ flutter_unit + + - +

    +
    +
    + +
    Flutter Unit Loading...
    +
    +
    +
    + + + + + diff --git a/web/splash.gif b/web/splash.gif index 7945179a6e1042c4594492e6fd79a3f008ef6623..36293e6bb9ce103f39e65a8bcabe109d859efcfc 100644 GIT binary patch literal 29295 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 t!?)N?im}uXeYI^;*r(KRA4@ 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'sgor<^ODR*N;e9*)u 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 z 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

    qcVu~ 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 Bju6Ci|cPf!)aHBu596 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

    Lt@=xZ2~2hElzKr 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 IhzcwHKPeR!$^ZZW diff --git a/web/splash.js b/web/splash.js index e69de29b..84030388 100644 --- a/web/splash.js +++ b/web/splash.js @@ -0,0 +1,16 @@ +window.addEventListener('load', function(ev) { + // Download main.dart.js + _flutter.loader.load({ + {{flutter_js}} + {{flutter_build_config}} + serviceWorker: { + serviceWorkerVersion: {{flutter_service_worker_version}}, + }, + onEntrypointLoaded: function(engineInitializer) { + engineInitializer.initializeEngine().then(function(appRunner) { + document.getElementById("app_splash")?.remove(); + appRunner.runApp(); + }); + } +}); +}) \ No newline at end of file diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 115100c0..d05a061a 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -99,3 +99,6 @@ install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" CONFIGURATIONS Profile;Release COMPONENT Runtime) + +# add libs dll to release +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/libs/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/runner/Release) From 667705c472a470bc081a1bc1f9e7abb85dd6d381 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 12 Aug 2024 06:02:48 +0800 Subject: [PATCH 075/149] update db_storage by fx_dao --- .gitignore | 2 + android/app/build.gradle | 2 +- build_tools/windows/build.iss | 160 ++++++++++++++++++ build_tools/windows/package.bat | 1 + lib/app/bloc_wrapper.dart | 2 +- .../views/data_manage/data_manage_page.dart | 4 +- lib/app_stater/impl/app_start_action.dart | 6 +- lib/app_stater/impl/start_repository.dart | 15 +- lib/main.dart | 6 +- lib/navigation/routers/app_route.dart | 2 +- modules/fx_app_env/pubspec.yaml | 2 +- modules/fx_boot_starter/example/main.dart | 37 ++++ .../example/starter/data/app_state.dart | 5 + .../example/starter/impl/app_fix_action.dart | 19 +++ .../starter/impl/app_start_action.dart | 26 +++ .../starter/impl/start_repository.dart | 29 ++++ .../example/starter/views/error_page.dart | 49 ++++++ .../example/starter/views/splash_page.dart | 14 ++ modules/fx_boot_starter/lib/bloc/bloc.dart | 64 +++++++ modules/fx_boot_starter/lib/bloc/ext.dart | 8 + modules/fx_boot_starter/lib/bloc/state.dart | 33 ++++ .../lib/data/action/app_fix_action.dart | 11 ++ .../lib/data/action/app_start_action.dart | 20 +++ .../fx_boot_starter/lib/data/repository.dart | 10 ++ .../lib/view/app_error_fix_builder.dart | 34 ++++ .../lib/view/app_error_fix_listener.dart | 40 +++++ .../lib/view/app_start_listener.dart | 35 ++++ .../lib/view/app_start_scope.dart | 38 +++++ packages/artifact/lib/artifact.dart | 3 - .../lib/src/articles/bloc/article/bloc.dart | 2 +- .../lib/src/articles/bloc/columnize/bloc.dart | 2 +- .../artifact/lib/src/articles/data/exp.dart | 4 +- .../data/repository/article_repository.dart | 6 +- .../data/repository/columnize_repository.dart | 5 +- .../view/article/article_detail_page.dart | 5 +- .../view/article/column_detail_page.dart | 3 +- .../view/article/columnize_page_view.dart | 3 +- .../articles/view/article/sliver_article.dart | 2 +- packages/artifact/pubspec.yaml | 2 +- packages/storage/lib/src/app_storage.dart | 30 ++++ .../lib/src/db_storage/app_db_storage.dart | 66 -------- packages/storage/lib/src/db_storage/exp.dart | 13 -- .../db_storage/flutter/dao}/article_dao.dart | 19 ++- .../{ => flutter}/dao/category_dao.dart | 44 ++--- .../flutter/dao}/columnize_dao.dart | 22 +-- .../{ => flutter}/dao/like_dao.dart | 19 ++- .../{ => flutter}/dao/node_dao.dart | 29 ++-- .../{ => flutter}/dao/widget_dao.dart | 71 ++++---- .../lib/src/db_storage/flutter/flutter.dart | 16 ++ .../db_storage/flutter/flutter_db_store.dart | 45 +++++ .../db_storage/flutter}/model/article.dart | 0 .../model}/category_po.dart | 0 .../db_storage/flutter}/model/columnize.dart | 0 .../src/db_storage/flutter/model/enums.dart | 13 ++ .../{models => flutter/model}/node_po.dart | 0 .../flutter/model/widget_filter.dart | 48 ++++++ .../{models => flutter/model}/widget_po.dart | 0 .../src/db_storage/flutter_db_storage.dart | 75 -------- .../{ => flutter_unit}/dao/cache_dao.dart | 44 ++--- .../db_storage/flutter_unit/flutter_unit.dart | 2 + .../flutter_unit/flutter_unit_db_store.dart | 30 ++++ .../model}/cache_po.dart | 0 .../src/db_storage/helper/db_open_helper.dart | 28 --- .../storage/lib/src/db_storage/storage.dart | 2 + .../src/db_storage/update/db_migration.dart | 22 --- .../lib/src/db_storage/update/db_updater.dart | 23 --- packages/storage/lib/storage.dart | 3 +- packages/storage/pubspec.yaml | 8 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 1 + .../data/db_impl/catagory_db_repository.dart | 4 +- .../lib/data/db_impl/node_db_repository.dart | 2 +- .../data/db_impl/widget_db_repository.dart | 4 +- .../widget_module/lib/data/model/enums.dart | 26 +-- .../lib/data/model/widget_filter.dart | 96 +++++------ .../lib/data/widget_repository.dart | 2 + .../desk_ui/widget_panel/desk_search_bar.dart | 1 + .../desk_ui/widget_panel/widget_panel.dart | 1 + .../category_page/sync/async_button.dart | 2 +- .../category_page/sync/upload_button.dart | 2 +- .../mobile/search_page/app_search_bar.dart | 1 + .../search_page/standard_search_bar.dart | 1 + .../widget_page/standard_home_page.dart | 1 + packages/widget_module/lib/widget_module.dart | 4 +- packages/widget_module/pubspec.yaml | 2 +- pubspec.lock | 133 ++++++++++----- pubspec.yaml | 12 +- 86 files changed, 1171 insertions(+), 507 deletions(-) create mode 100644 build_tools/windows/build.iss create mode 100644 build_tools/windows/package.bat create mode 100644 modules/fx_boot_starter/example/main.dart create mode 100644 modules/fx_boot_starter/example/starter/data/app_state.dart create mode 100644 modules/fx_boot_starter/example/starter/impl/app_fix_action.dart create mode 100644 modules/fx_boot_starter/example/starter/impl/app_start_action.dart create mode 100644 modules/fx_boot_starter/example/starter/impl/start_repository.dart create mode 100644 modules/fx_boot_starter/example/starter/views/error_page.dart create mode 100644 modules/fx_boot_starter/example/starter/views/splash_page.dart create mode 100644 modules/fx_boot_starter/lib/bloc/bloc.dart create mode 100644 modules/fx_boot_starter/lib/bloc/ext.dart create mode 100644 modules/fx_boot_starter/lib/bloc/state.dart create mode 100644 modules/fx_boot_starter/lib/data/action/app_fix_action.dart create mode 100644 modules/fx_boot_starter/lib/data/action/app_start_action.dart create mode 100644 modules/fx_boot_starter/lib/data/repository.dart create mode 100644 modules/fx_boot_starter/lib/view/app_error_fix_builder.dart create mode 100644 modules/fx_boot_starter/lib/view/app_error_fix_listener.dart create mode 100644 modules/fx_boot_starter/lib/view/app_start_listener.dart create mode 100644 modules/fx_boot_starter/lib/view/app_start_scope.dart create mode 100644 packages/storage/lib/src/app_storage.dart delete mode 100644 packages/storage/lib/src/db_storage/app_db_storage.dart delete mode 100644 packages/storage/lib/src/db_storage/exp.dart rename packages/{artifact/lib/src/articles/data/db => storage/lib/src/db_storage/flutter/dao}/article_dao.dart (86%) rename packages/storage/lib/src/db_storage/{ => flutter}/dao/category_dao.dart (81%) rename packages/{artifact/lib/src/articles/data/db => storage/lib/src/db_storage/flutter/dao}/columnize_dao.dart (79%) rename packages/storage/lib/src/db_storage/{ => flutter}/dao/like_dao.dart (80%) rename packages/storage/lib/src/db_storage/{ => flutter}/dao/node_dao.dart (60%) rename packages/storage/lib/src/db_storage/{ => flutter}/dao/widget_dao.dart (58%) create mode 100644 packages/storage/lib/src/db_storage/flutter/flutter.dart create mode 100644 packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart rename packages/{artifact/lib/src/articles/data => storage/lib/src/db_storage/flutter}/model/article.dart (100%) rename packages/storage/lib/src/db_storage/{models => flutter/model}/category_po.dart (100%) rename packages/{artifact/lib/src/articles/data => storage/lib/src/db_storage/flutter}/model/columnize.dart (100%) create mode 100644 packages/storage/lib/src/db_storage/flutter/model/enums.dart rename packages/storage/lib/src/db_storage/{models => flutter/model}/node_po.dart (100%) create mode 100644 packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart rename packages/storage/lib/src/db_storage/{models => flutter/model}/widget_po.dart (100%) delete mode 100644 packages/storage/lib/src/db_storage/flutter_db_storage.dart rename packages/storage/lib/src/db_storage/{ => flutter_unit}/dao/cache_dao.dart (61%) create mode 100644 packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart create mode 100644 packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart rename packages/storage/lib/src/db_storage/{models => flutter_unit/model}/cache_po.dart (100%) delete mode 100644 packages/storage/lib/src/db_storage/helper/db_open_helper.dart create mode 100644 packages/storage/lib/src/db_storage/storage.dart delete mode 100644 packages/storage/lib/src/db_storage/update/db_migration.dart delete mode 100644 packages/storage/lib/src/db_storage/update/db_updater.dart diff --git a/.gitignore b/.gitignore index 9213b335..cec5398d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ /lib/res/constant/github_client_config.dart # Exceptions to above rules. !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +/build_tools \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index a3efbb85..476d6b77 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.toly1994.flutter_unit" - minSdkVersion 19 + minSdkVersion flutter.minSdkVersion targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/build_tools/windows/build.iss b/build_tools/windows/build.iss new file mode 100644 index 00000000..dd6c9357 --- /dev/null +++ b/build_tools/windows/build.iss @@ -0,0 +1,160 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +; Reference: https://juejin.cn/post/7108928269285589000 +; Document: https://jrsoftware.org/ishelp/ + +#define WindowsProjectDir "..\..\windows" +#define WindowsReleaseDir "..\..\build\windows\x64\runner\Release" +#define OutputDir "..\output" + +#define MyAppName "FlutterUnit" +#define AppPublisher "toly1994.com" +#define MyAppURL "https://www.toly1994.com/" +#define MyAppExeName "flutter_unit.exe" +#define MyAppAssocName MyAppName + " File" + +#define MyAppAssocExt ".myp" +#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt +#ifndef Version + #define Version "1.0.0" +#endif + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{48BCE972-86A2-4CA3-8B0A-A872C0391C84}} +AppName={#MyAppName} +AppVersion={#Version} +AppPublisher={#AppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +;DefaultDirName={autopf}\{#MyAppName} +DefaultDirName={drive:Path}\Software\{#MyAppName} +ChangesAssociations=yes +DisableProgramGroupPage=yes +; Uncomment the following line to run in non administrative install mode (install for current user only.) +;PrivilegesRequired=lowest +OutputDir= {#OutputDir} +OutputBaseFilename={#MyAppName} +SetupIconFile={#WindowsProjectDir}\runner\resources\app_icon.ico +Compression=lzma +SolidCompression=yes +WizardStyle=modern +PrivilegesRequired=admin +UsePreviousAppDir=false + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; +Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; + +[Files] +Source: "{#WindowsReleaseDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#WindowsReleaseDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#WindowsReleaseDir}\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs + +[Registry] +Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue +Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey +Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" +Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" +Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: "" + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon +Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + +[code] +function InitializeSetup(): Boolean; +var + result1: Integer; +begin + ShellExec('', 'cmd.exe', 'cmd /c taskkill /f /im {#MyAppExeName}', '', SW_HIDE, ewWaitUntilTerminated, result1); + Result := True; +end; + +function FileExist(file: string): Boolean; + begin + if (FileExists(file)) then + begin + Result := True; + end + else + begin + Result := False; + end; + end; + +// remove icons cache if necessary +function RemoveIconCache(): Boolean; + var + IconCache: String; + begin + IconCache := ExpandConstant('{localappdata}\IconCache.db'); + if FileExist(IconCache) then + begin + DeleteFile(IconCache); + end; + Result := True; + end; + +procedure InitializeWizard; +var + UserStartMenuPath: String; + CommonStartMenuPath: String; +begin + //// delete directory + // DelTree(ExpandConstant('{app}\platform'), True, True, True); + //// delete file + // DeleteFile(ExpandConstant('{userstartmenu}\Programs\uhomespro.lnk')); + + // MsgBox('App start menu path is: ' + ExpandConstant('{userstartmenu}'), mbError, MB_OK); + Log('App start menu path is: ' + ExpandConstant('{userstartmenu}')); + + // delete start menu link + UserStartMenuPath := ExpandConstant('{userstartmenu}\Programs\uhomespro.lnk'); + if FileExist(UserStartMenuPath) then + begin + DeleteFile(UserStartMenuPath); + end; + CommonStartMenuPath := ExpandConstant('{commonstartmenu}\Programs\uhomespro.lnk'); + if FileExist(CommonStartMenuPath) then + begin + DeleteFile(CommonStartMenuPath); + end; + // remove system icon cache + RemoveIconCache(); + + // ResultStr := RemoveQuotes(ResultStr); + // Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; + +procedure DeinitializeSetup; +var + PreviousProgramInstallPath: String; + PreviousProgramInstallExe: String; + +begin + // clean previous program installed files, call in DeinitializeSetup lifecycle method to avoid system permission error. + PreviousProgramInstallPath := ExpandConstant('C:\Program\{#MyAppName}'); + PreviousProgramInstallExe := ExpandConstant(PreviousProgramInstallPath + '\{#MyAppExeName}'); + Log('The previous program install path is: ' + PreviousProgramInstallPath); + // MsgBox('The previous program install path is: ' + PreviousProgramInstallPath, mbError, MB_OK); + if FileExist(PreviousProgramInstallExe) then + begin + DelTree(PreviousProgramInstallPath, True, True, True); + end; +end; + + + + + diff --git a/build_tools/windows/package.bat b/build_tools/windows/package.bat new file mode 100644 index 00000000..6b745a36 --- /dev/null +++ b/build_tools/windows/package.bat @@ -0,0 +1 @@ +flutter clean && flutter build windows && ISCC.exe "build.iss" /DVersion=3.0.0 && pause \ No newline at end of file diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index 70127419..a0889cb4 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -63,7 +63,7 @@ class _BlocWrapperState extends State { @override void dispose() { categoryBloc.close(); - FlutterDbStorage.instance.closeDb(); + AppStorage().close(); super.dispose(); } } diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index 5e7b3581..f909e2f8 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -90,7 +90,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); + List likeData = await AppStorage().flutter()!.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); @@ -124,7 +124,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); + List likeData = await AppStorage().flutter()!.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/lib/app_stater/impl/app_start_action.dart b/lib/app_stater/impl/app_start_action.dart index a1600c39..839c65c5 100644 --- a/lib/app_stater/impl/app_start_action.dart +++ b/lib/app_stater/impl/app_start_action.dart @@ -1,12 +1,12 @@ import 'package:app/app.dart'; -import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:fx_app_env/fx_app_env.dart'; import 'package:go_router/go_router.dart'; +import 'package:storage/storage.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_module/data/zone.dart'; class AppStartActionImpl implements AppStartAction { @@ -30,7 +30,7 @@ class AppStartActionImpl implements AppStartAction { } @override - void onStartSuccess(BuildContext context) { + void onStartSuccess(BuildContext context,AppConfigState state) { context.go('/widget'); } } diff --git a/lib/app_stater/impl/start_repository.dart b/lib/app_stater/impl/start_repository.dart index 76761349..5bcebf2a 100644 --- a/lib/app_stater/impl/start_repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -2,7 +2,9 @@ import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; -import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; import 'package:fx_app_env/fx_app_env.dart'; @@ -17,6 +19,10 @@ class AppStartRepositoryImpl implements AppStartRepository { /// 返回本地持久化的 AppConfigState 对象 @override Future initApp() async { + WidgetsFlutterBinding.ensureInitialized(); + //滚动性能优化 1.22.0 + GestureBinding.instance.resamplingEnabled = true; + WindowsAdapter.setSize(); await SpStorage.instance.initSp(); if (!kAppEnv.isWeb) await initDb(); AppConfigPo po = await SpStorage.instance.appConfig.read(); @@ -37,8 +43,7 @@ class AppStartRepositoryImpl implements AppStartRepository { Future initDb() async { //数据库不存在,执行拷贝 - String databasesPath = await DbOpenHelper.getDbDirPath(); - String dbPath = path.join(databasesPath, "flutter.db"); + String dbPath = await AppStorage().flutter.dbpath; await SpStorage.instance.initSp(); bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage.instance.spf); @@ -48,9 +53,7 @@ class AppStartRepositoryImpl implements AppStartRepository { } else { print("=====flutter.db 已存在===="); } - print('====数据库所在文件夹: $databasesPath======='); - await FlutterDbStorage.instance.initDb(); - await AppDbStorage.instance.initDb(); + await AppStorage().init(); } Future _doCopyAssetsDb(String dbPath) async { diff --git a/lib/main.dart b/lib/main.dart index a7105db1..927e0abe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -9,9 +9,6 @@ import 'app_stater/impl/app_start_action.dart'; import 'app_stater/impl/start_repository.dart'; void main() { - WidgetsFlutterBinding.ensureInitialized(); - //滚动性能优化 1.22.0 - GestureBinding.instance.resamplingEnabled = true; runApp( AppStartScope( repository: const AppStartRepositoryImpl(), @@ -19,5 +16,4 @@ void main() { child: BlocWrapper(child: FlutterUnit3()), ), ); - WindowsAdapter.setSize(); } diff --git a/lib/navigation/routers/app_route.dart b/lib/navigation/routers/app_route.dart index 039d959e..68c45c91 100644 --- a/lib/navigation/routers/app_route.dart +++ b/lib/navigation/routers/app_route.dart @@ -1,5 +1,5 @@ import 'package:app/app.dart'; -import 'package:app_boot_starter/app_boot_starter.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/modules/fx_app_env/pubspec.yaml b/modules/fx_app_env/pubspec.yaml index 65ae63cd..25258823 100644 --- a/modules/fx_app_env/pubspec.yaml +++ b/modules/fx_app_env/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.4.3 <4.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=1.17.0" dependencies: diff --git a/modules/fx_boot_starter/example/main.dart b/modules/fx_boot_starter/example/main.dart new file mode 100644 index 00000000..af3848e4 --- /dev/null +++ b/modules/fx_boot_starter/example/main.dart @@ -0,0 +1,37 @@ +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:flutter/material.dart'; + +import 'starter/data/app_state.dart'; +import 'starter/impl/app_fix_action.dart'; +import 'starter/impl/app_start_action.dart'; +import 'starter/impl/start_repository.dart'; +import 'starter/views/splash_page.dart'; + +void main() { + runApp( + const AppStartScope( + repository: AppStartRepositoryImpl(), + appStartAction: AppStartActionImpl(), + fixAction: AppFixActionImpl(), + child: MyApp(), + ), + ); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const AppStartListener( + child: SplashPage(), + )); + } +} diff --git a/modules/fx_boot_starter/example/starter/data/app_state.dart b/modules/fx_boot_starter/example/starter/data/app_state.dart new file mode 100644 index 00000000..5d0e3485 --- /dev/null +++ b/modules/fx_boot_starter/example/starter/data/app_state.dart @@ -0,0 +1,5 @@ +class AppState{ + final int modeType; + + AppState(this.modeType); +} \ No newline at end of file diff --git a/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart b/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart new file mode 100644 index 00000000..272283ec --- /dev/null +++ b/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart @@ -0,0 +1,19 @@ +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:flutter/material.dart'; + + + +class AppFixActionImpl implements AppFixAction { + + const AppFixActionImpl(); + + @override + void onFixSuccess(BuildContext context) { + // TODO go fix success + } + + @override + void onFixError(BuildContext context, Object error, StackTrace trace) { + + } +} diff --git a/modules/fx_boot_starter/example/starter/impl/app_start_action.dart b/modules/fx_boot_starter/example/starter/impl/app_start_action.dart new file mode 100644 index 00000000..43d53889 --- /dev/null +++ b/modules/fx_boot_starter/example/starter/impl/app_start_action.dart @@ -0,0 +1,26 @@ +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:flutter/material.dart'; + +import '../data/app_state.dart'; + + + +class AppStartActionImpl implements AppStartAction { + + const AppStartActionImpl(); + + @override + void onLoaded(BuildContext context, int cost, AppState state) { + debugPrint("App启动耗时:$cost ms"); + } + + @override + void onStartError(BuildContext context, Object error, StackTrace trace) { +// TODO go start success + } + + @override + void onStartSuccess(BuildContext context,AppState state) { +// TODO go start success + } +} diff --git a/modules/fx_boot_starter/example/starter/impl/start_repository.dart b/modules/fx_boot_starter/example/starter/impl/start_repository.dart new file mode 100644 index 00000000..141c5947 --- /dev/null +++ b/modules/fx_boot_starter/example/starter/impl/start_repository.dart @@ -0,0 +1,29 @@ +import 'package:fx_boot_starter/data/repository.dart'; + +import '../data/app_state.dart'; + +bool _isErrorDebug = true; + +class AppStartRepositoryImpl implements AppStartRepository { + const AppStartRepositoryImpl(); + + @override + Future initApp() async { + + /// 可以处理异步加载任务 + /// 返回初始化的 AppState + await Future.delayed(const Duration(seconds: 1)); + if (_isErrorDebug) { + // throw "App 初始化异常"; + } + return AppState(0); + } + + @override + Future fixError(Object error, {Object? extra}) async { + await Future.delayed(const Duration(seconds: 1)); + // throw "App 无法修复"; + _isErrorDebug = false; + return; + } +} diff --git a/modules/fx_boot_starter/example/starter/views/error_page.dart b/modules/fx_boot_starter/example/starter/views/error_page.dart new file mode 100644 index 00000000..0058e29c --- /dev/null +++ b/modules/fx_boot_starter/example/starter/views/error_page.dart @@ -0,0 +1,49 @@ +import 'package:fx_boot_starter/fx_boot_starter.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../data/app_state.dart'; + +class ErrorPage extends StatelessWidget { + final String error; + + const ErrorPage({super.key, required this.error}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + direction: Axis.vertical, + spacing: 20, + children: [ + Text("初始化异常:\n$error",textAlign: TextAlign.center,), + Padding( + padding: const EdgeInsets.all(8.0), + child: AppFixErrorBuilder( + shouldFix: (BuildContext context) { + return ElevatedButton( + onPressed: () { + context.fixStartError(); + }, + child: const Text("修复异常"), + ); + }, + loading: (BuildContext context) { + return ElevatedButton( + onPressed: null, + child: CupertinoActivityIndicator(), + ); + }, + error: (BuildContext context) { + return Text('当前应用无法修复\n请联系开发者处理。xxxxxx'); + }, + ), + ) + ], + ), + ), + ); + } +} diff --git a/modules/fx_boot_starter/example/starter/views/splash_page.dart b/modules/fx_boot_starter/example/starter/views/splash_page.dart new file mode 100644 index 00000000..0c3ee920 --- /dev/null +++ b/modules/fx_boot_starter/example/starter/views/splash_page.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class SplashPage extends StatelessWidget { + const SplashPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold( + body: Center( + child: FlutterLogo(), + ), + ); + } +} diff --git a/modules/fx_boot_starter/lib/bloc/bloc.dart b/modules/fx_boot_starter/lib/bloc/bloc.dart new file mode 100644 index 00000000..65302708 --- /dev/null +++ b/modules/fx_boot_starter/lib/bloc/bloc.dart @@ -0,0 +1,64 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../fx_boot_starter.dart'; +import 'state.dart'; + +class AppStartBloc extends Cubit { + final int minStartDurationMs; + + final AppStartRepository repository; + final AppStartAction startAction; + final AppFixAction? fixAction; + + AppStartBloc({ + required this.repository, + required this.startAction, + this.fixAction, + this.minStartDurationMs = 600, + }) : super(const AppStarting()); + + int _timeRecord = 0; + + void startApp() async { + _timeRecord = DateTime.now().millisecondsSinceEpoch; + emit(const AppStarting()); + S data; + try { + /// 处理初始化异步任务 + data = await repository.initApp(); + } catch (e, s) { + emit(AppStartFailed(e, s, FixType.none)); + return; + } + + /// 计算初始化的耗时时长 + int cost = DateTime.now().millisecondsSinceEpoch - _timeRecord; + int waitTime = minStartDurationMs - cost; + if (waitTime > 0) { + /// 说明启动时间小于 [minStartDurationMs], 等待时间差 + emit(AppLoadDone(cost, data)); + await Future.delayed(Duration(milliseconds: waitTime)); + } else { + /// 说明启动时间超过 [minStartDurationMs],给一点预加载的时间 + emit(AppLoadDone(cost, data)); + await Future.delayed(const Duration(milliseconds: 50)); + } + emit( AppStartSuccess(data)); + } + + void fixError() async { + if (state is AppStartFailed) { + AppStartFailed s = state as AppStartFailed; + emit(AppStartFailed(s.error, s.trace, FixType.fixing)); + try { + /// 处理初始化异步任务 + await repository.fixError(s.error, extra: s.trace); + emit(AppStartFailed(s.error, s.trace, FixType.fixed)); + startApp(); + } catch (e, s) { + emit(AppStartFailed(e, s, FixType.fixError)); + return; + } + } + } +} diff --git a/modules/fx_boot_starter/lib/bloc/ext.dart b/modules/fx_boot_starter/lib/bloc/ext.dart new file mode 100644 index 00000000..e5623dd3 --- /dev/null +++ b/modules/fx_boot_starter/lib/bloc/ext.dart @@ -0,0 +1,8 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'bloc.dart'; + +extension FixContext on BuildContext { + void fixStartError() => read>().fixError(); +} diff --git a/modules/fx_boot_starter/lib/bloc/state.dart b/modules/fx_boot_starter/lib/bloc/state.dart new file mode 100644 index 00000000..6f76c866 --- /dev/null +++ b/modules/fx_boot_starter/lib/bloc/state.dart @@ -0,0 +1,33 @@ +sealed class AppStatus { + const AppStatus(); +} + +class AppStarting extends AppStatus { + const AppStarting(); +} + +class AppLoadDone extends AppStatus { + final int cost; + final S data; + const AppLoadDone(this.cost, this.data); +} + +class AppStartSuccess extends AppStatus { + final S data; + const AppStartSuccess(this.data); +} + +enum FixType{ + none, + fixing, + fixed, + fixError, +} + +class AppStartFailed extends AppStatus { + final Object error; + final StackTrace trace; + final FixType fix; + + const AppStartFailed(this.error,this.trace, this.fix); +} diff --git a/modules/fx_boot_starter/lib/data/action/app_fix_action.dart b/modules/fx_boot_starter/lib/data/action/app_fix_action.dart new file mode 100644 index 00000000..b78d1021 --- /dev/null +++ b/modules/fx_boot_starter/lib/data/action/app_fix_action.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +abstract class AppFixAction { + const AppFixAction(); + + /// 初始化修复失败 + void onFixError(BuildContext context, Object error, StackTrace trace); + + /// 初始化修复成功 + void onFixSuccess(BuildContext context); +} diff --git a/modules/fx_boot_starter/lib/data/action/app_start_action.dart b/modules/fx_boot_starter/lib/data/action/app_start_action.dart new file mode 100644 index 00000000..bf7d5491 --- /dev/null +++ b/modules/fx_boot_starter/lib/data/action/app_start_action.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +abstract class AppStartAction { + const AppStartAction(); + + /// 初始化加载失败 + /// 可跳转失败界面, 引导用户处理启动异常 + void onStartError(BuildContext context, Object error, StackTrace trace); + + /// 初始化加载成功 + /// 可在回调中获得异步加载的 App 配置数据处理 + /// 并做一些首页预加载的逻辑 + void onLoaded(BuildContext context, int cost, S state); + + /// 初始化成功,且达到最低延迟毫秒数 + /// 可跳转应用主界面,正常使用应用 + void onStartSuccess(BuildContext context, S state); + + +} \ No newline at end of file diff --git a/modules/fx_boot_starter/lib/data/repository.dart b/modules/fx_boot_starter/lib/data/repository.dart new file mode 100644 index 00000000..ed25df14 --- /dev/null +++ b/modules/fx_boot_starter/lib/data/repository.dart @@ -0,0 +1,10 @@ + +abstract class AppStartRepository { + const AppStartRepository(); + + Future initApp(); + + Future fixError(Object error, {Object? extra}); +} + + diff --git a/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart b/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart new file mode 100644 index 00000000..5ee0e434 --- /dev/null +++ b/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart @@ -0,0 +1,34 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../bloc/bloc.dart'; +import '../bloc/state.dart'; + +class AppFixErrorBuilder extends StatelessWidget { + final WidgetBuilder shouldFix; + final WidgetBuilder loading; + final WidgetBuilder error; + + const AppFixErrorBuilder({ + super.key, + required this.shouldFix, + required this.loading, + required this.error, + }); + + @override + Widget build(BuildContext context) { + return BlocBuilder, AppStatus>(builder: (_,AppStatus state){ + if(state is AppStartFailed){ + if(state.fix==FixType.fixing){ + return loading(context); + } + if(state.fix==FixType.fixError){ + return error(context); + } + } + return shouldFix(context); + }); + } +} diff --git a/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart b/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart new file mode 100644 index 00000000..4c675f66 --- /dev/null +++ b/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../bloc/bloc.dart'; +import '../bloc/state.dart'; +import '../data/action/app_fix_action.dart'; + + + +class AppStartFixListener extends StatelessWidget { + final Widget child; + + const AppStartFixListener({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return BlocListener, AppStatus>( + listenWhen: (p, n) => + (p is AppStartFailed && p.fix == FixType.fixing) && + (n is AppStartFailed), + child: child, + listener: (BuildContext context, AppStatus state) { + if (state is AppStartFailed) { + AppFixAction? action = context.read>().fixAction; + + if (state.fix == FixType.fixed) { + + action?.onFixSuccess(context); + } + if (state.fix == FixType.fixError) { + action?.onFixError(context, state.error, state.trace); + } + } + }, + ); + } +} diff --git a/modules/fx_boot_starter/lib/view/app_start_listener.dart b/modules/fx_boot_starter/lib/view/app_start_listener.dart new file mode 100644 index 00000000..1f212098 --- /dev/null +++ b/modules/fx_boot_starter/lib/view/app_start_listener.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../bloc/bloc.dart'; +import '../bloc/state.dart'; +import '../data/action/app_start_action.dart'; + +class AppStartListener extends StatelessWidget { + final Widget child; + + const AppStartListener({ + super.key, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return BlocListener, AppStatus>( + child: child, + listener: (BuildContext context, AppStatus state) { + AppStartAction action = context.read>().startAction; + if (state is AppLoadDone) { + action.onLoaded(context, state.cost, state.data); + } + if (state is AppStartSuccess) { + action.onStartSuccess(context,state.data); + } + + if (state is AppStartFailed) { + action.onStartError(context,state.error,state.trace); + } + }, + ); + } +} diff --git a/modules/fx_boot_starter/lib/view/app_start_scope.dart b/modules/fx_boot_starter/lib/view/app_start_scope.dart new file mode 100644 index 00000000..fabc8143 --- /dev/null +++ b/modules/fx_boot_starter/lib/view/app_start_scope.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../bloc/bloc.dart'; +import '../data/action/app_fix_action.dart'; +import '../data/action/app_start_action.dart'; +import '../data/repository.dart'; + +class AppStartScope extends StatelessWidget { + final AppStartRepository repository; + final AppStartAction appStartAction; + final AppFixAction? fixAction; + final int minStartDurationMs; + + final Widget child; + + const AppStartScope({ + super.key, + required this.repository, + required this.appStartAction, + required this.child, + this.minStartDurationMs = 600, + this.fixAction, + }); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (BuildContext context) => AppStartBloc( + startAction: appStartAction, + repository: repository, + fixAction: fixAction, + minStartDurationMs: minStartDurationMs, + )..startApp(), + child: child, + ); + } +} diff --git a/packages/artifact/lib/artifact.dart b/packages/artifact/lib/artifact.dart index 0f81dc95..9f64dc6f 100644 --- a/packages/artifact/lib/artifact.dart +++ b/packages/artifact/lib/artifact.dart @@ -3,8 +3,5 @@ library artifact; export 'src/articles/view/artifact_page.dart'; export 'src/articles/view/wrapper/refresh.dart'; -export 'src/articles/data/db/article_dao.dart'; -export 'src/articles/data/db/columnize_dao.dart'; - export 'src/points/exp.dart'; export 'src/articles/view/desk_artifact_page.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/articles/bloc/article/bloc.dart b/packages/artifact/lib/src/articles/bloc/article/bloc.dart index e2215e50..5b93edb4 100644 --- a/packages/artifact/lib/src/articles/bloc/article/bloc.dart +++ b/packages/artifact/lib/src/articles/bloc/article/bloc.dart @@ -1,6 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; -import '../../data/model/article.dart'; import '../../data/repository/article_repository.dart'; class ArticleBloc extends Cubit { diff --git a/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart b/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart index 3b2c3de3..4f16c3ad 100644 --- a/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart +++ b/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart @@ -1,6 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; -import '../../data/model/columnize.dart'; import '../../data/repository/columnize_repository.dart'; class ColumnizeBloc extends Cubit { diff --git a/packages/artifact/lib/src/articles/data/exp.dart b/packages/artifact/lib/src/articles/data/exp.dart index 3ce49787..d8486c55 100644 --- a/packages/artifact/lib/src/articles/data/exp.dart +++ b/packages/artifact/lib/src/articles/data/exp.dart @@ -1,4 +1,2 @@ export 'repository/article_repository.dart'; -export 'repository/columnize_repository.dart'; -export 'model/columnize.dart'; -export 'model/article.dart'; \ No newline at end of file +export 'repository/columnize_repository.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/articles/data/repository/article_repository.dart b/packages/artifact/lib/src/articles/data/repository/article_repository.dart index ca92c311..45fe4d2b 100644 --- a/packages/artifact/lib/src/articles/data/repository/article_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/article_repository.dart @@ -1,17 +1,13 @@ -import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; -import '../exp.dart'; - - // 仓储: 提供数据 class ArticleRepository { const ArticleRepository(); - ArticleDao get dao => FlutterDbStorage.instance.articleDao; + ArticleDao get dao => AppStorage().flutter()!; // 从数据库加载资源 Future> queryByDb(ArticleFilter filter) async { diff --git a/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart index 7ba66680..a1443e61 100644 --- a/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart @@ -1,15 +1,12 @@ -import 'package:artifact/artifact.dart'; import 'package:storage/storage.dart'; -import '../model/columnize.dart'; - // 仓储: 提供数据 class ColumnizeRepository { const ColumnizeRepository(); - ColumnizeDao get dao => FlutterDbStorage.instance.columnizeDao; + ColumnizeDao get dao => AppStorage().flutter()!; // 从数据库加载资源 diff --git a/packages/artifact/lib/src/articles/view/article/article_detail_page.dart b/packages/artifact/lib/src/articles/view/article/article_detail_page.dart index 7d5383c7..ecfdefc1 100644 --- a/packages/artifact/lib/src/articles/view/article/article_detail_page.dart +++ b/packages/artifact/lib/src/articles/view/article/article_detail_page.dart @@ -1,14 +1,11 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:storage/storage.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../../data/exp.dart'; - - - class ArticleDetailPage extends StatefulWidget { final Article article; diff --git a/packages/artifact/lib/src/articles/view/article/column_detail_page.dart b/packages/artifact/lib/src/articles/view/article/column_detail_page.dart index e77620dc..d8cf5fa5 100644 --- a/packages/artifact/lib/src/articles/view/article/column_detail_page.dart +++ b/packages/artifact/lib/src/articles/view/article/column_detail_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import '../../data/exp.dart'; +import 'package:storage/storage.dart'; + import 'sliver_article.dart'; class ColumnDetailPage extends StatelessWidget { diff --git a/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart index 4aaac912..3b2a6c2b 100644 --- a/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart +++ b/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -10,7 +10,8 @@ import 'package:intl/intl.dart'; import '../../bloc/article/bloc.dart'; import '../../bloc/exp.dart'; -import '../../data/model/columnize.dart'; +import 'package:storage/storage.dart'; + import '../../data/repository/article_repository.dart'; import 'column_detail_page.dart'; diff --git a/packages/artifact/lib/src/articles/view/article/sliver_article.dart b/packages/artifact/lib/src/articles/view/article/sliver_article.dart index 6342875d..37353b94 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/packages/artifact/lib/src/articles/view/article/sliver_article.dart @@ -7,7 +7,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../bloc/exp.dart'; -import '../../data/exp.dart'; +import 'package:storage/storage.dart'; import 'article_detail_page.dart'; import 'columnize_page_view.dart'; diff --git a/packages/artifact/pubspec.yaml b/packages/artifact/pubspec.yaml index 00c1bc51..0453cea1 100644 --- a/packages/artifact/pubspec.yaml +++ b/packages/artifact/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ">=3.0.0 <4.0.0" + sdk: '>=3.2.3 <4.0.0' flutter: ">=2.17.0" dependencies: diff --git a/packages/storage/lib/src/app_storage.dart b/packages/storage/lib/src/app_storage.dart new file mode 100644 index 00000000..3d0d9355 --- /dev/null +++ b/packages/storage/lib/src/app_storage.dart @@ -0,0 +1,30 @@ + +import 'package:storage/storage.dart'; + +import 'db_storage/flutter_unit/flutter_unit_db_store.dart'; + +class AppStorage { + + AppStorage._(); + + static AppStorage? _instance; + + factory AppStorage() => _instance ??= AppStorage._(); + + final FlutterDbStore _flutterDb = FlutterDbStore(); + final FlutterUnitDbStore _flutterUnitDb = FlutterUnitDbStore(); + + FlutterDbStore get flutter => _flutterDb; + FlutterUnitDbStore get flutterUnit => _flutterUnitDb; + + Future init() async{ + await _flutterDb.open(); + await _flutterUnitDb.open(); + } + + void close() async{ + await _flutterDb.close(); + await _flutterUnitDb.close(); + } + +} diff --git a/packages/storage/lib/src/db_storage/app_db_storage.dart b/packages/storage/lib/src/db_storage/app_db_storage.dart deleted file mode 100644 index e2fcef0f..00000000 --- a/packages/storage/lib/src/db_storage/app_db_storage.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'dart:async'; -import 'package:storage/storage.dart'; - -import 'dao/cache_dao.dart'; -import 'helper/db_open_helper.dart'; -import 'package:sqflite_common_ffi/sqflite_ffi.dart'; - -import 'package:path/path.dart' as path; -import 'package:sqflite/sqflite.dart'; - -import 'update/db_updater.dart'; - - -class AppDbStorage { - Database? _database; - - AppDbStorage._(); - - static AppDbStorage instance = AppDbStorage._(); - - late CacheDao _cacheDao; - - CacheDao get cacheDao => _cacheDao; - - Database get db => _database!; - - Future initDb({String name = "flutter_unit.db"}) async { - if (_database != null) return; - String databasesPath = await DbOpenHelper.getDbDirPath(); - String dbPath = path.join(databasesPath, name); - _database = await openDatabase(dbPath, - version: DbUpdater.version , - onCreate: _onCreate, - onUpgrade: _onUpgrade, - onOpen: _onOpen, - ); - - } - - DbUpdater updater = DbUpdater(); - - FutureOr _onCreate(Database db, int version) async { - print('数据库创建:flutter_unit....'); - await Future.wait([ - CacheDao.createDb(db), - updater.update(db, 1, DbUpdater.version) - ]); - } - - FutureOr _onOpen(Database db) { - print('数据库打开:flutter_unit....'); - _database = db; - _cacheDao = CacheDao(db); - } - - Future closeDb() async { - await _database?.close(); - _database = null; - } - - FutureOr _onUpgrade(Database db, int oldVersion, int newVersion) async { - print('数据库更新:flutter_unit....$oldVersion -> $newVersion'); - await updater.update(db, oldVersion, newVersion); - } - -} diff --git a/packages/storage/lib/src/db_storage/exp.dart b/packages/storage/lib/src/db_storage/exp.dart deleted file mode 100644 index 3d3c70a9..00000000 --- a/packages/storage/lib/src/db_storage/exp.dart +++ /dev/null @@ -1,13 +0,0 @@ -export 'dao/category_dao.dart'; -export 'dao/like_dao.dart'; -export 'dao/node_dao.dart'; -export 'dao/widget_dao.dart'; -export 'dao/cache_dao.dart'; - -export 'models/category_po.dart'; -export 'models/node_po.dart'; -export 'models/widget_po.dart'; -export 'models/cache_po.dart'; -export 'flutter_db_storage.dart'; -export 'app_db_storage.dart'; -export 'helper/db_open_helper.dart'; \ No newline at end of file diff --git a/packages/artifact/lib/src/articles/data/db/article_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/article_dao.dart similarity index 86% rename from packages/artifact/lib/src/articles/data/db/article_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/article_dao.dart index 9d28944c..a625406d 100644 --- a/packages/artifact/lib/src/articles/data/db/article_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/article_dao.dart @@ -1,19 +1,20 @@ +import 'package:fx_dao/fx_dao.dart'; import 'package:sqflite/sqflite.dart'; import '../model/article.dart'; -class ArticleDao { - final Database database; +class ArticleDao with HasDatabase, DbTable{ + @override + String get createSql => ''; - ArticleDao(this.database); + @override + String get name => 'article'; - // 表名 - static const String kTableName = 'article'; Future insert(Article po) => database.insert( - kTableName, + name, po.toJson(), conflictAlgorithm: ConflictAlgorithm.replace, ); @@ -21,7 +22,7 @@ class ArticleDao { Future insertOrUpdate(Article po) async { bool canUpdate = await shouldUpdate(po.id, po.update); return database.insert( - kTableName, + name, po.toJson(), conflictAlgorithm: canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, @@ -31,7 +32,7 @@ class ArticleDao { /// 当前数据是否需要更新 Future shouldUpdate(int id, int updateAt) async { List> data = await database - .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); // 没有数据,可以更新 if (data.isEmpty) { return true; @@ -59,7 +60,7 @@ class ArticleDao { args.addAll([filter.pageSize,filter.offset]); List> data = await database.rawQuery( - "SELECT * FROM $kTableName $queryArgs", + "SELECT * FROM $name $queryArgs", args, ); diff --git a/packages/storage/lib/src/db_storage/dao/category_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/category_dao.dart similarity index 81% rename from packages/storage/lib/src/db_storage/dao/category_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/category_dao.dart index 669b9d2f..4610b147 100644 --- a/packages/storage/lib/src/db_storage/dao/category_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/category_dao.dart @@ -1,6 +1,8 @@ -import 'package:sqflite/sqflite.dart'; -import '../models/category_po.dart'; +import 'package:fx_dao/fx_dao.dart'; + +import '../model/category_po.dart'; + //""" // CREATE TABLE IF NOT EXISTS category_widget( @@ -15,10 +17,12 @@ import '../models/category_po.dart'; // ); //"""; -class CategoryDao { - final Database db; +class CategoryDao with HasDatabase, DbTable{ + @override + String get createSql => ''; - CategoryDao(this.db); + @override + String get name => 'category'; @@ -28,7 +32,7 @@ class CategoryDao { "INSERT INTO " "category(id,name,color,info,priority,image,created,updated) " "VALUES (?,?,?,?,?,?,?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ category.id, category.name, category.color, @@ -46,7 +50,7 @@ class CategoryDao { "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " "WHERE id = ?"; - return await db.transaction((tran) async => + return await database.transaction((tran) async => await tran.rawUpdate(updateSql, [ widget.name, widget.color, @@ -65,7 +69,7 @@ class CategoryDao { "INSERT INTO " "category_widget(widgetId,categoryId) " "VALUES (?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ widgetId, categoryId, ])); @@ -87,14 +91,14 @@ class CategoryDao { } } addSql += args; - return await db.transaction((tran) async => await tran.rawInsert(addSql)); + return await database.transaction((tran) async => await tran.rawInsert(addSql)); } Future existByName(String name) async { String sql = //插入数据 "SELECT COUNT(name) as count FROM category " "WHERE name = ?"; - List> rawData = await db.rawQuery(sql, [name]); + List> rawData = await database.rawQuery(sql, [name]); if (rawData.isNotEmpty) { return rawData[0]['count'] > 0; } @@ -102,7 +106,7 @@ class CategoryDao { } Future>> queryAll() async { - List> data = await db.rawQuery( + List> data = await database.rawQuery( "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" "FROM category AS c " "LEFT JOIN category_widget AS cw " @@ -113,7 +117,7 @@ class CategoryDao { } Future> categoryWidgetIds(int id) async { - List> data = await db.rawQuery( + List> data = await database.rawQuery( "SELECT categoryId FROM `category_widget`" "WHERE widgetId = ?", [id]); @@ -123,21 +127,21 @@ class CategoryDao { Future deleteCollect(int id) async { - await db.execute( + await database.execute( "DELETE FROM category_widget " "WHERE categoryId = ?", [id]); - return await db.execute( + return await database.execute( "DELETE FROM category " "WHERE id = ?", [id]); } Future clear() async { - await db.execute( + await database.execute( "DELETE FROM category_widget " "WHERE categoryId >0"); - return await db.execute( + return await database.execute( "DELETE FROM category " "WHERE id > 0"); } @@ -147,7 +151,7 @@ class CategoryDao { String deleteSql = //插入数据 "DELETE FROM " "category_widget WHERE categoryId = ? AND widgetId = ? "; - return await db + return await database .transaction((tran) async => await tran.rawInsert(deleteSql, [ categoryId, widgetId, @@ -158,7 +162,7 @@ class CategoryDao { String sql = //插入数据 "SELECT COUNT(id) as count FROM category_widget " "WHERE categoryId = ? AND widgetId = ?"; - List> rawData = await db.rawQuery(sql, [categoryId, widgetId]); + List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); if (rawData.isNotEmpty) { return rawData[0]['count'] > 0; } @@ -184,7 +188,7 @@ class CategoryDao { "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - return await db.rawQuery(querySql,[categoryId]); + return await database.rawQuery(querySql,[categoryId]); } Future> loadCollectWidgetIds(int categoryId) async{ @@ -193,7 +197,7 @@ class CategoryDao { "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - var data = await db.rawQuery(querySql,[categoryId]); + var data = await database.rawQuery(querySql,[categoryId]); return data.map((e) => e["id"] as int).toList(); } } diff --git a/packages/artifact/lib/src/articles/data/db/columnize_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart similarity index 79% rename from packages/artifact/lib/src/articles/data/db/columnize_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart index f3976c50..0500ac21 100644 --- a/packages/artifact/lib/src/articles/data/db/columnize_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart @@ -1,19 +1,21 @@ +import 'package:fx_dao/fx_dao.dart'; import 'package:sqflite/sqflite.dart'; -import '../exp.dart'; +import '../model/columnize.dart'; -class ColumnizeDao { - final Database database; - ColumnizeDao(this.database); - // 表名 - static const String kTableName = 'columnize'; +class ColumnizeDao with HasDatabase, DbTable{ + @override + String get createSql => ''; + + @override + String get name => 'columnize'; Future insert(Columnize po) => database.insert( - kTableName, + name, po.toJson(), conflictAlgorithm: ConflictAlgorithm.replace, ); @@ -21,7 +23,7 @@ class ColumnizeDao { Future insertOrUpdate(Columnize po) async { bool canUpdate = await shouldUpdate(po.id, po.update); return database.insert( - kTableName, + name, po.toJson(), conflictAlgorithm: canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, @@ -31,7 +33,7 @@ class ColumnizeDao { /// 当前数据是否需要更新 Future shouldUpdate(int id, int updateAt) async { List> data = await database - .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); // 没有数据,可以更新 if (data.isEmpty) { return true; @@ -55,7 +57,7 @@ class ColumnizeDao { args.addAll([pageSize, (page - 1) * pageSize]); List> data = await database.rawQuery( - "SELECT * FROM $kTableName $queryArgs", + "SELECT * FROM $name $queryArgs", args, ); diff --git a/packages/storage/lib/src/db_storage/dao/like_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/like_dao.dart similarity index 80% rename from packages/storage/lib/src/db_storage/dao/like_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/like_dao.dart index aa072fc7..92ca842c 100644 --- a/packages/storage/lib/src/db_storage/dao/like_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/like_dao.dart @@ -1,12 +1,15 @@ +import 'package:fx_dao/fx_dao.dart'; import 'package:sqflite/sqflite.dart'; -class LikeDao { - final Database db; +class LikeDao with HasDatabase, DbTable{ + @override + String get createSql => ''; - LikeDao(this.db); + @override + String get name => 'like_widget'; Future> likeWidgetIds() async { - var result = await db.rawQuery("SELECT widget_id FROM like_widget"); + var result = await database.rawQuery("SELECT widget_id FROM like_widget"); var ids = result.map((e) => e['widget_id'] as int).toList(); return ids; } @@ -30,7 +33,7 @@ class LikeDao { if (liked) return 0; } - return await db.rawInsert( + return await database.rawInsert( "INSERT INTO " "like_widget(widget_id) " "VALUES (?);", @@ -43,7 +46,7 @@ class LikeDao { bool liked = await isLiked(widgetId); if (!liked) return; } - await db.execute( + await database.execute( "DELETE FROM like_widget " "WHERE widget_id = ?", [widgetId]); @@ -51,7 +54,7 @@ class LikeDao { // 判断组件是否已 liked Future isLiked(int widgetId) async { - var data = await db.rawQuery( + var data = await database.rawQuery( "Select count(id) as `count` FROM like_widget " "WHERE widget_id = ?", [widgetId]); @@ -61,4 +64,6 @@ class LikeDao { } return false; } + + } diff --git a/packages/storage/lib/src/db_storage/dao/node_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/node_dao.dart similarity index 60% rename from packages/storage/lib/src/db_storage/dao/node_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/node_dao.dart index 3e425869..214c5bc8 100644 --- a/packages/storage/lib/src/db_storage/dao/node_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/node_dao.dart @@ -1,11 +1,18 @@ -import '../models/node_po.dart'; -import 'package:sqflite/sqflite.dart'; +import 'package:fx_dao/fx_dao.dart'; +import 'package:storage/storage.dart'; + +import '../model/node_po.dart'; + +class NodeDao with HasDatabase, DbTable { + + @override + String get createSql => ''; + + @override + String get name => 'node'; -class NodeDao { - final Database db; - NodeDao(this.db); Future insert(NodePo widget) async { //插入方法 @@ -13,7 +20,7 @@ class NodeDao { "INSERT INTO " "node(widgetId,name,priority,subtitle,code) " "VALUES (?,?,?,?,?);"; - return await db.transaction((tran) async => await tran.rawInsert(addSql, [ + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ widget.widgetId, widget.name, widget.priority, @@ -23,17 +30,19 @@ class NodeDao { } Future>> queryAll() async { - //插入方法 - return await db.rawQuery("SELECT * " - "FROM node"); + return await database.rawQuery("SELECT * FROM node"); } //根据 id 查询组件 node Future>> queryById(int id) async { - return await db.rawQuery( + return await database.rawQuery( "SELECT name,subtitle,code " "FROM node " "WHERE widgetId = ? ORDER BY priority", [id]); } + + + + } diff --git a/packages/storage/lib/src/db_storage/dao/widget_dao.dart b/packages/storage/lib/src/db_storage/flutter/dao/widget_dao.dart similarity index 58% rename from packages/storage/lib/src/db_storage/dao/widget_dao.dart rename to packages/storage/lib/src/db_storage/flutter/dao/widget_dao.dart index f9dad8fd..5413aed4 100644 --- a/packages/storage/lib/src/db_storage/dao/widget_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter/dao/widget_dao.dart @@ -1,43 +1,44 @@ -import 'package:sqflite/sqflite.dart'; -import 'package:widget_module/widget_module.dart'; +import 'package:fx_dao/fx_dao.dart'; +import '../model/enums.dart'; +import '../model/widget_filter.dart'; +import '../model/widget_po.dart'; -import '../models/widget_po.dart'; +class WidgetDao with HasDatabase, DbTable { + @override + String get createSql => ''; -class WidgetDao { + @override + String get name => 'widget'; - final Database db; - - WidgetDao(this.db); - - Future insert(WidgetPo widget) async { + Future insert(WidgetPo widget) async { //插入方法 String addSql = //插入数据 "INSERT INTO " "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " "VALUES (?,?,?,?,?,?,?,?);"; - return db.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.id, - widget.name, - widget.nameCN, - widget.deprecated, - widget.family, - widget.lever, - widget.linkWidget, - widget.info - ])); + return database.transaction((tran) async => await tran.rawInsert(addSql, [ + widget.id, + widget.name, + widget.nameCN, + widget.deprecated, + widget.family, + widget.lever, + widget.linkWidget, + widget.info + ])); } Future>> queryAll() async { - return db.rawQuery("SELECT * FROM widget"); + return database.rawQuery("SELECT * FROM widget"); } Future>> queryByFamily(WidgetFamily family) async { - return db.rawQuery( + return database.rawQuery( "SELECT * " - "FROM widget WHERE family = ? ORDER BY lever DESC", + "FROM widget WHERE family = ? ORDER BY lever DESC", [family.index]); } @@ -48,7 +49,7 @@ class WidgetDao { String sql = "SELECT * " "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; - return db.rawQuery(sql, [...ids]); + return database.rawQuery(sql, [...ids]); } Future>> search(WidgetFilter arguments) async { @@ -67,9 +68,9 @@ class WidgetDao { if (arguments.stars.reduce((a, b) => a + b) == -5) { starArg = [1, 2, 3, 4, 5]; } - return db.rawQuery( + return database.rawQuery( "SELECT * " - "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", + "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", ["%$name%", ...familyArg, ...starArg, arguments.pageSize, arguments.offset]); } @@ -80,7 +81,7 @@ class WidgetDao { String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; - List> result = await db.rawQuery(sql,familyArg); + List> result = await database.rawQuery(sql,familyArg); if(result.isNotEmpty){ return result.first['count'] as int ??0; } @@ -88,14 +89,16 @@ class WidgetDao { } - Future?> queryWidgetByName(String name) async{ - String sql = "SELECT * FROM widget WHERE name = ?"; - List> result = await db.rawQuery(sql, [name]); - if(result.isNotEmpty){ - return result.first; - } - return null; - } + Future?> queryWidgetByName(String name) async{ + String sql = "SELECT * FROM widget WHERE name = ?"; + List> result = await database.rawQuery(sql, [name]); + if(result.isNotEmpty){ + return result.first; + } + return null; + } + + } diff --git a/packages/storage/lib/src/db_storage/flutter/flutter.dart b/packages/storage/lib/src/db_storage/flutter/flutter.dart new file mode 100644 index 00000000..21072e88 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter/flutter.dart @@ -0,0 +1,16 @@ +export 'dao/category_dao.dart'; +export 'dao/like_dao.dart'; +export 'dao/node_dao.dart'; +export 'dao/widget_dao.dart'; +export 'dao/article_dao.dart'; +export 'dao/columnize_dao.dart'; + +export 'model/category_po.dart'; +export 'model/node_po.dart'; +export 'model/widget_po.dart'; +export 'model/article.dart'; +export 'model/columnize.dart'; +export 'model/enums.dart'; +export 'model/widget_filter.dart'; + +export 'flutter_db_store.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart b/packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart new file mode 100644 index 00000000..bb9f10a5 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart @@ -0,0 +1,45 @@ +import 'dart:async'; +import 'package:sqflite/sqflite.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:fx_dao/fx_dao.dart'; + +import 'dao/article_dao.dart'; +import 'dao/category_dao.dart'; +import 'dao/columnize_dao.dart'; +import 'dao/like_dao.dart'; +import 'dao/node_dao.dart'; +import 'dao/widget_dao.dart'; + +class FlutterDbStore extends FxDb { + late WidgetDao _widgetStore; + + WidgetDao get widgetStore => _widgetStore; + + @override + String get dbname => 'flutter.db'; + + @override + int get version => 1; + + @override + Future onCreate(Database db, int version) async {} + + @override + void afterOpen(String dbpath) { + super.afterOpen(dbpath); + print("===DbPath:$dbpath=============="); + } + + @override + Iterable<(int, MigrationOperation)> get migrations => []; + + @override + Iterable get tables => [ + WidgetDao(), + LikeDao(), + CategoryDao(), + NodeDao(), + ArticleDao(), + ColumnizeDao(), + ]; +} diff --git a/packages/artifact/lib/src/articles/data/model/article.dart b/packages/storage/lib/src/db_storage/flutter/model/article.dart similarity index 100% rename from packages/artifact/lib/src/articles/data/model/article.dart rename to packages/storage/lib/src/db_storage/flutter/model/article.dart diff --git a/packages/storage/lib/src/db_storage/models/category_po.dart b/packages/storage/lib/src/db_storage/flutter/model/category_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/models/category_po.dart rename to packages/storage/lib/src/db_storage/flutter/model/category_po.dart diff --git a/packages/artifact/lib/src/articles/data/model/columnize.dart b/packages/storage/lib/src/db_storage/flutter/model/columnize.dart similarity index 100% rename from packages/artifact/lib/src/articles/data/model/columnize.dart rename to packages/storage/lib/src/db_storage/flutter/model/columnize.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/enums.dart b/packages/storage/lib/src/db_storage/flutter/model/enums.dart new file mode 100644 index 00000000..37a33388 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter/model/enums.dart @@ -0,0 +1,13 @@ +/// create by 张风捷特烈 on 2020-03-07 +/// contact me by email 1981462002@qq.com +/// 说明: + +enum WidgetFamily { + statelessWidget, + statefulWidget, + singleChildRenderObjectWidget, + multiChildRenderObjectWidget, + sliver, + proxyWidget, + other, +} diff --git a/packages/storage/lib/src/db_storage/models/node_po.dart b/packages/storage/lib/src/db_storage/flutter/model/node_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/models/node_po.dart rename to packages/storage/lib/src/db_storage/flutter/model/node_po.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart b/packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart new file mode 100644 index 00000000..71f36d13 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart @@ -0,0 +1,48 @@ +import 'enums.dart'; + + + +class WidgetFilter { + final String name; + final WidgetFamily? family; + final List stars; + final int page; + final int pageSize; + + const WidgetFilter({ + this.name = '', + this.family, + this.stars = const [-1, -1, -1, -1, -1], + this.page = 1, + this.pageSize = 20, + }); + + int get offset =>pageSize*(page-1); + + WidgetFilter.family( + this.family, { + this.name = '*', + this.page = 1, + this.pageSize = 20, + this.stars = const [1, 2, 3, 4, 5], + }); + + WidgetFilter copyWith({ + String? name, + WidgetFamily? family, + List? stars, + int? page, + }) { + return WidgetFilter( + name: name ?? this.name, + family: family ?? this.family, + stars: stars ?? this.stars, + page: page ?? this.page, + ); + } + + @override + String toString() { + return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; + } +} diff --git a/packages/storage/lib/src/db_storage/models/widget_po.dart b/packages/storage/lib/src/db_storage/flutter/model/widget_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/models/widget_po.dart rename to packages/storage/lib/src/db_storage/flutter/model/widget_po.dart diff --git a/packages/storage/lib/src/db_storage/flutter_db_storage.dart b/packages/storage/lib/src/db_storage/flutter_db_storage.dart deleted file mode 100644 index cb08df73..00000000 --- a/packages/storage/lib/src/db_storage/flutter_db_storage.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'dart:io'; - -import 'package:artifact/artifact.dart'; -import 'package:flutter/foundation.dart'; -import 'package:storage/storage.dart'; - -import 'helper/db_open_helper.dart'; -import 'package:sqflite_common_ffi/sqflite_ffi.dart'; - -import 'package:path/path.dart' as path; -import 'package:sqflite/sqflite.dart'; - -class FlutterDbStorage { - Database? _database; - - FlutterDbStorage._() { - setupDatabase(); - } - - static FlutterDbStorage? _instance; - - static FlutterDbStorage get instance { - _instance ??= FlutterDbStorage._(); - return _instance!; - } - - void setupDatabase() { - if (kIsWeb) return; - if (Platform.isWindows || Platform.isWindows) { - sqfliteFfiInit(); - databaseFactory = databaseFactoryFfi; - } - } - - late WidgetDao _widgetDao; - late CategoryDao _categoryDao; - late NodeDao _nodeDao; - late LikeDao _likeDao; - late ArticleDao _articleDao; - late ColumnizeDao _columnizeDao; - - WidgetDao get widgetDao => _widgetDao; - - CategoryDao get categoryDao => _categoryDao; - - NodeDao get nodeDao => _nodeDao; - - LikeDao get likeDao => _likeDao; - - ArticleDao get articleDao => _articleDao; - - ColumnizeDao get columnizeDao => _columnizeDao; - - Database get db => _database!; - - Future initDb({String name = "flutter.db"}) async { - if (_database != null) return; - String databasesPath = await DbOpenHelper.getDbDirPath(); - String dbPath = path.join(databasesPath, name); - _database = await openDatabase(dbPath); - _widgetDao = WidgetDao(_database!); - _categoryDao = CategoryDao(_database!); - _nodeDao = NodeDao(_database!); - _likeDao = LikeDao(_database!); - _articleDao = ArticleDao(_database!); - _columnizeDao = ColumnizeDao(_database!); - - print('初始化数据库....'); - } - - Future closeDb() async { - await _database?.close(); - _database = null; - } -} diff --git a/packages/storage/lib/src/db_storage/dao/cache_dao.dart b/packages/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart similarity index 61% rename from packages/storage/lib/src/db_storage/dao/cache_dao.dart rename to packages/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart index c19e8d8f..423a28d3 100644 --- a/packages/storage/lib/src/db_storage/dao/cache_dao.dart +++ b/packages/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart @@ -1,17 +1,14 @@ -import 'package:sqflite/sqflite.dart'; -import '../models/cache_po.dart'; +import 'package:fx_dao/fx_dao.dart'; +import 'package:sqflite/sqlite_api.dart'; -class CacheDao { - final Database database; +import '../model/cache_po.dart'; - CacheDao(this.database); - // 表名 - static const String kTableName = 'app_cache'; - - static const String createTable = """ -CREATE TABLE IF NOT EXISTS `$kTableName` ( +class CacheDao with HasDatabase, DbTable{ + @override + String get createSql =>""" +CREATE TABLE IF NOT EXISTS `$name` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `filter` TEXT, `content` TEXT, @@ -20,28 +17,30 @@ CREATE TABLE IF NOT EXISTS `$kTableName` ( `type` INTEGER )"""; - static Future createDb(Database db) => db.execute(createTable); + @override + String get name => 'app_cache'; + Future insert(CachePo po) => database.insert( - kTableName, - po.toJson(), - conflictAlgorithm: ConflictAlgorithm.replace, - ); + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); Future insertOrUpdate(CachePo po) async { bool canUpdate = await shouldUpdate(po.id, po.update); return database.insert( - kTableName, + name, po.toJson(), conflictAlgorithm: - canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, ); } /// 当前数据是否需要更新 Future shouldUpdate(int id, int updateAt) async { List> data = await database - .rawQuery("SELECT `update` FROM $kTableName WHERE id = ?", [id]); + .rawQuery("SELECT `update` FROM $name WHERE id = ?", [id]); // 没有数据,可以更新 if (data.isEmpty) { return true; @@ -67,7 +66,7 @@ CREATE TABLE IF NOT EXISTS `$kTableName` ( args.addAll([pageSize, (page - 1) * pageSize]); List> data = await database.rawQuery( - "SELECT * FROM $kTableName $queryArgs", + "SELECT * FROM $name $queryArgs", args, ); @@ -75,10 +74,3 @@ CREATE TABLE IF NOT EXISTS `$kTableName` ( return result; } } - -// final String id; -// final String title; -// final String content; -// final int type; -// final int create; -// final int update; diff --git a/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart b/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart new file mode 100644 index 00000000..2b1d6a60 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart @@ -0,0 +1,2 @@ +export 'dao/cache_dao.dart'; +export 'model/cache_po.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart b/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart new file mode 100644 index 00000000..b1cf40e9 --- /dev/null +++ b/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart @@ -0,0 +1,30 @@ +import 'package:fx_dao/fx_dao.dart'; +import 'dao/cache_dao.dart'; + + + +class FlutterUnitDbStore extends FxDb { + + @override + Iterable get tables => [ + CacheDao() + ]; + + @override + String get dbname => 'flutter_unit.db'; + + @override + int get version => 1; + + + @override + void afterOpen(String dbpath) { + super.afterOpen(dbpath); + print("====Opend:$dbpath==========="); + } + + @override + Iterable<(int, MigrationOperation)> get migrations => []; + + +} diff --git a/packages/storage/lib/src/db_storage/models/cache_po.dart b/packages/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/models/cache_po.dart rename to packages/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart diff --git a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart b/packages/storage/lib/src/db_storage/helper/db_open_helper.dart deleted file mode 100644 index c28277c8..00000000 --- a/packages/storage/lib/src/db_storage/helper/db_open_helper.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:io'; - -import 'package:path_provider/path_provider.dart'; -import 'package:path/path.dart' as path; - - -class DbOpenHelper{ - - - static Future getDbDirPath() async{ - Directory appDocDir = await getApplicationDocumentsDirectory(); - String dirName = 'databases'; - String dirPath = path.join(appDocDir.path, dirName); - - if(Platform.isAndroid){ - dirPath = path.join(appDocDir.parent.path, dirName); - } - if(Platform.isWindows||Platform.isLinux){ - dirPath = path.join(appDocDir.path, 'FlutterUnit','databases'); - } - - Directory result = Directory(dirPath); - if(!result.existsSync()){ - result.createSync(recursive: true); - } - return dirPath; - } -} \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/storage.dart b/packages/storage/lib/src/db_storage/storage.dart new file mode 100644 index 00000000..2748c119 --- /dev/null +++ b/packages/storage/lib/src/db_storage/storage.dart @@ -0,0 +1,2 @@ +export 'flutter/flutter.dart'; +export 'flutter_unit/flutter_unit.dart'; \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/update/db_migration.dart b/packages/storage/lib/src/db_storage/update/db_migration.dart deleted file mode 100644 index b801ad60..00000000 --- a/packages/storage/lib/src/db_storage/update/db_migration.dart +++ /dev/null @@ -1,22 +0,0 @@ - -import 'package:sqflite/sqflite.dart'; - -typedef MigrationOperation = Future Function(Database database); - -class DbMigration{ - final Map _migrationMap={}; - - void addMigration(int version,MigrationOperation operation){ - _migrationMap[version] = operation; - } - - Future migration(Database database,int oldVersion,int newVersion) async{ - for(int i=0;i<_migrationMap.length;i++){ - int version = _migrationMap.keys.toList()[i]; - MigrationOperation operation = _migrationMap.values.toList()[i]; - if(version=oldVersion){ - await operation(database); - } - } - } -} \ No newline at end of file diff --git a/packages/storage/lib/src/db_storage/update/db_updater.dart b/packages/storage/lib/src/db_storage/update/db_updater.dart deleted file mode 100644 index c7436584..00000000 --- a/packages/storage/lib/src/db_storage/update/db_updater.dart +++ /dev/null @@ -1,23 +0,0 @@ - -import 'package:sqflite/sqflite.dart'; -import 'db_migration.dart'; - -class DbUpdater { - static const version = 1; - - Future update(Database db, int oldVersion, int newVersion) async { - DbMigration dbMigration = DbMigration(); - // dbMigration.addMigration(1, migration_1_2); - // dbMigration.addMigration(2, migration_2_3); - // dbMigration.addMigration(3, migration_3_4); - // dbMigration.addMigration(4, migration_4_5); - // dbMigration.addMigration(5, migration_5_6); - await dbMigration.migration(db, oldVersion, newVersion); - } - - Future migration_1_2(Database database) async { - - } - - -} diff --git a/packages/storage/lib/storage.dart b/packages/storage/lib/storage.dart index 798c6946..3e9dff1f 100644 --- a/packages/storage/lib/storage.dart +++ b/packages/storage/lib/storage.dart @@ -1,5 +1,6 @@ library storage; -export 'src/db_storage/exp.dart'; +export 'src/db_storage/storage.dart'; export 'src/sp_storage/exp.dart'; +export 'src/app_storage.dart'; diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 0b749dc4..978911d4 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.1 <3.0.0' + sdk: '>=3.2.3 <4.0.0' flutter: ">=1.17.0" dependencies: @@ -14,11 +14,7 @@ dependencies: sqflite: ^2.3.3+1 shared_preferences: ^2.2.1 # xml 固化 path_provider: ^2.1.1 # 路径 - - widget_module: - path: ../widget_module - artifact: - path: ../artifact + fx_dao: 0.0.1 dev_dependencies: flutter_test: diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index c34079b0..0c4069c4 100644 --- a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; import '../../data/zone.dart'; diff --git a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart index a200b2df..dce36bf0 100644 --- a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart @@ -13,8 +13,8 @@ import '../zone.dart'; class CategoryDbRepository implements CategoryRepository { - CategoryDao get categoryDao => FlutterDbStorage.instance.categoryDao; - LikeDao get likeDao => FlutterDbStorage.instance.likeDao; + CategoryDao get categoryDao => AppStorage().flutter()!; + LikeDao get likeDao => AppStorage().flutter()!; // CategoryDbRepository({required this.categoryDao,required this.likeDao}); diff --git a/packages/widget_module/lib/data/db_impl/node_db_repository.dart b/packages/widget_module/lib/data/db_impl/node_db_repository.dart index 2d737abe..3eeac0a5 100644 --- a/packages/widget_module/lib/data/db_impl/node_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/node_db_repository.dart @@ -9,7 +9,7 @@ class NodeDbRepository implements NodeRepository{ const NodeDbRepository(); - NodeDao get nodeDao => FlutterDbStorage.instance.nodeDao; + NodeDao get nodeDao => AppStorage().flutter()!; @override Future> loadNode(int widgetId) async{ diff --git a/packages/widget_module/lib/data/db_impl/widget_db_repository.dart b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart index 0018cda4..473ad82e 100644 --- a/packages/widget_module/lib/data/db_impl/widget_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/widget_db_repository.dart @@ -13,8 +13,8 @@ class WidgetDbRepository implements WidgetRepository { const WidgetDbRepository(); - WidgetDao get widgetDao => FlutterDbStorage.instance.widgetDao; - LikeDao get likeDao => FlutterDbStorage.instance.likeDao; + WidgetDao get widgetDao => AppStorage().flutter()!; + LikeDao get likeDao => AppStorage().flutter()!; @override Future> loadLikeWidgets() async { diff --git a/packages/widget_module/lib/data/model/enums.dart b/packages/widget_module/lib/data/model/enums.dart index 37a33388..2f4f720b 100644 --- a/packages/widget_module/lib/data/model/enums.dart +++ b/packages/widget_module/lib/data/model/enums.dart @@ -1,13 +1,13 @@ -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: - -enum WidgetFamily { - statelessWidget, - statefulWidget, - singleChildRenderObjectWidget, - multiChildRenderObjectWidget, - sliver, - proxyWidget, - other, -} +// /// create by 张风捷特烈 on 2020-03-07 +// /// contact me by email 1981462002@qq.com +// /// 说明: +// +// enum WidgetFamily { +// statelessWidget, +// statefulWidget, +// singleChildRenderObjectWidget, +// multiChildRenderObjectWidget, +// sliver, +// proxyWidget, +// other, +// } diff --git a/packages/widget_module/lib/data/model/widget_filter.dart b/packages/widget_module/lib/data/model/widget_filter.dart index 71f36d13..95620a52 100644 --- a/packages/widget_module/lib/data/model/widget_filter.dart +++ b/packages/widget_module/lib/data/model/widget_filter.dart @@ -1,48 +1,48 @@ -import 'enums.dart'; - - - -class WidgetFilter { - final String name; - final WidgetFamily? family; - final List stars; - final int page; - final int pageSize; - - const WidgetFilter({ - this.name = '', - this.family, - this.stars = const [-1, -1, -1, -1, -1], - this.page = 1, - this.pageSize = 20, - }); - - int get offset =>pageSize*(page-1); - - WidgetFilter.family( - this.family, { - this.name = '*', - this.page = 1, - this.pageSize = 20, - this.stars = const [1, 2, 3, 4, 5], - }); - - WidgetFilter copyWith({ - String? name, - WidgetFamily? family, - List? stars, - int? page, - }) { - return WidgetFilter( - name: name ?? this.name, - family: family ?? this.family, - stars: stars ?? this.stars, - page: page ?? this.page, - ); - } - - @override - String toString() { - return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; - } -} +// import 'enums.dart'; +// +// +// +// class WidgetFilter { +// final String name; +// final WidgetFamily? family; +// final List stars; +// final int page; +// final int pageSize; +// +// const WidgetFilter({ +// this.name = '', +// this.family, +// this.stars = const [-1, -1, -1, -1, -1], +// this.page = 1, +// this.pageSize = 20, +// }); +// +// int get offset =>pageSize*(page-1); +// +// WidgetFilter.family( +// this.family, { +// this.name = '*', +// this.page = 1, +// this.pageSize = 20, +// this.stars = const [1, 2, 3, 4, 5], +// }); +// +// WidgetFilter copyWith({ +// String? name, +// WidgetFamily? family, +// List? stars, +// int? page, +// }) { +// return WidgetFilter( +// name: name ?? this.name, +// family: family ?? this.family, +// stars: stars ?? this.stars, +// page: page ?? this.page, +// ); +// } +// +// @override +// String toString() { +// return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; +// } +// } diff --git a/packages/widget_module/lib/data/widget_repository.dart b/packages/widget_module/lib/data/widget_repository.dart index e821962a..78777724 100644 --- a/packages/widget_module/lib/data/widget_repository.dart +++ b/packages/widget_module/lib/data/widget_repository.dart @@ -1,3 +1,5 @@ +import 'package:storage/storage.dart'; + import 'model/model.dart'; /// create by 张风捷特烈 on 2020-03-03 diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index f4bde7b1..ac582abc 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; +import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../../data/zone.dart'; diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index fda03363..f5b0f512 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; +import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../../data/zone.dart'; diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart index 859d4120..6ec5342c 100644 --- a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -90,7 +90,7 @@ class _SyncCategoryButtonState extends State { // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); + List likeData = await AppStorage().flutter()!.likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index c1e10c13..77c4630c 100644 --- a/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -76,7 +76,7 @@ class _UploadCategoryButtonState extends State { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await FlutterDbStorage.instance.likeDao.likeWidgetIds(); + List likeData = await AppStorage().flutter()!.likeWidgetIds(); String json = jsonEncode(loadCategories); diff --git a/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart index 0542917d..e00781a7 100644 --- a/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../data/zone.dart'; diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 89a79a6b..137092af 100644 --- a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../../../data/zone.dart'; diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index 9be24633..42381fc2 100644 --- a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -1,4 +1,5 @@ import 'package:l10n/ext.dart'; +import 'package:storage/storage.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/packages/widget_module/lib/widget_module.dart b/packages/widget_module/lib/widget_module.dart index b948b754..c67cab57 100644 --- a/packages/widget_module/lib/widget_module.dart +++ b/packages/widget_module/lib/widget_module.dart @@ -2,4 +2,6 @@ library widget_module; export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; -export 'data/zone.dart'; \ No newline at end of file +export 'data/zone.dart'; + +export 'package:storage/storage.dart' show WidgetFilter,WidgetFamily; \ No newline at end of file diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index 04359ae5..f272af67 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: path: ../storage toly_ui: path: ../toly_ui - share_plus: ^9.0.0 # 文字分享 + share_plus: ^10.0.1 # 文字分享 components: path: ../components authentication: diff --git a/pubspec.lock b/pubspec.lock index b1b25850..72a303d9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -15,14 +15,6 @@ packages: relative: true source: path version: "0.0.1" - app_boot_starter: - dependency: "direct main" - description: - name: app_boot_starter - sha256: "09c5473dc84d054dc5df86a45f7812b32f81a7d6c9ac02a3a04c7351f28893c9" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.0.0" app_update: dependency: "direct main" description: @@ -42,10 +34,10 @@ packages: dependency: transitive description: name: args - sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.5.0" artifact: dependency: "direct main" description: @@ -135,10 +127,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: @@ -171,6 +163,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.8" + dev_build: + dependency: transitive + description: + name: dev_build + sha256: f526d1fbe68875f6119ffc333f114dfe6aa93ad04439276d53968f7977cc410e + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.0+11" dio: dependency: "direct main" description: @@ -222,10 +222,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45" + sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3" url: "https://pub.flutter-io.cn/" source: hosted - version: "8.0.5" + version: "8.0.7" flutter: dependency: "direct main" description: flutter @@ -309,6 +309,21 @@ packages: relative: true source: path version: "0.0.1" + fx_boot_starter: + dependency: "direct main" + description: + path: "modules/fx_boot_starter" + relative: true + source: path + version: "0.0.1" + fx_dao: + dependency: transitive + description: + name: fx_dao + sha256: df5e2eb94c66e78f737c662d864a1a2067d4712ac03ba884530479c2de2baba3 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" fx_go_router_ext: dependency: transitive description: @@ -382,18 +397,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.flutter-io.cn/" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -438,18 +453,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.flutter-io.cn/" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -510,10 +525,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: @@ -578,6 +593,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.5.1" process: dependency: transitive description: @@ -586,6 +609,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "4.2.4" + process_run: + dependency: transitive + description: + name: process_run + sha256: c917dfb5f7afad4c7485bc00a4df038621248fce046105020cea276d1a87c820 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.1.0" provider: dependency: transitive description: @@ -594,6 +625,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "6.0.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.1.4" r_upgrade: dependency: "direct main" description: @@ -622,18 +661,18 @@ packages: dependency: "direct main" description: name: share_plus - sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 + sha256: "38658034f9f3c29f3b37ab0068db15caea9df2dd70d83e99300991a0d756c2a6" url: "https://pub.flutter-io.cn/" source: hosted - version: "9.0.0" + version: "10.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" + sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" url: "https://pub.flutter-io.cn/" source: hosted - version: "4.0.0" + version: "5.0.0" shared_preferences: dependency: "direct main" description: @@ -727,6 +766,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.3" + sqflite_common_ffi_web: + dependency: transitive + description: + name: sqflite_common_ffi_web + sha256: e9d1cb35a5ff7c43072968ed734e0a1a859564fd2b2c8654e0c6244a57dc82a8 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.4.4" sqlite3: dependency: transitive description: @@ -794,10 +841,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.7.0" + version: "0.7.2" toggle_rotate: dependency: "direct main" description: @@ -920,18 +967,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.flutter-io.cn/" source: hosted - version: "3.1.1" + version: "3.1.2" utils: dependency: "direct main" description: @@ -983,18 +1030,18 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.flutter-io.cn/" source: hosted - version: "14.2.1" + version: "14.2.4" web: - dependency: transitive + dependency: "direct overridden" description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.5.1" + version: "1.0.0" webview_flutter: dependency: "direct main" description: @@ -1081,6 +1128,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.1.2" sdks: dart: ">=3.4.3 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 729358c5..23398686 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,9 +22,10 @@ dependencies: stream_transform: ^2.1.0 ## fx 架构 - app 启动器 - app_boot_starter: ^1.0.0 + fx_boot_starter: 0.0.1 fx_app_env: path: modules/fx_app_env + ## tolyui tolyui: ^0.0.2+15 @@ -49,7 +50,7 @@ dependencies: wrapper: ^1.0.2 url_launcher: ^6.3.0 # url - share_plus: ^9.0.0 # 文字分享 + share_plus: ^10.0.1 # 文字分享 flutter_svg: ^2.0.10+1 intl: ^0.19.0 @@ -57,7 +58,7 @@ dependencies: image: ^4.2.0 flutter_spinkit: ^5.2.1 # loading flutter_markdown: ^0.7.2+1 # markdown - file_picker: ^8.0.5 + file_picker: ^8.0.7 l10n: path: packages/l10n utils: @@ -94,6 +95,11 @@ dev_dependencies: sdk: flutter flutter_lints: ^1.0.0 +dependency_overrides: + fx_boot_starter: + path: modules/fx_boot_starter + web: ^1.0.0 + flutter: uses-material-design: true assets: From 82e00f56bbb086e72281361d6483c6f3a326da97 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 12 Aug 2024 06:03:03 +0800 Subject: [PATCH 076/149] update db_storage by fx_dao --- modules/fx_boot_starter/.gitignore | 29 +++++++++ modules/fx_boot_starter/.metadata | 10 ++++ modules/fx_boot_starter/CHANGELOG.md | 3 + modules/fx_boot_starter/LICENSE | 21 +++++++ modules/fx_boot_starter/README.md | 60 +++++++++++++++++++ modules/fx_boot_starter/analysis_options.yaml | 4 ++ .../fx_boot_starter/lib/fx_boot_starter.dart | 12 ++++ modules/fx_boot_starter/pubspec.yaml | 57 ++++++++++++++++++ .../test/fx_boot_starter_test.dart | 12 ++++ 9 files changed, 208 insertions(+) create mode 100644 modules/fx_boot_starter/.gitignore create mode 100644 modules/fx_boot_starter/.metadata create mode 100644 modules/fx_boot_starter/CHANGELOG.md create mode 100644 modules/fx_boot_starter/LICENSE create mode 100644 modules/fx_boot_starter/README.md create mode 100644 modules/fx_boot_starter/analysis_options.yaml create mode 100644 modules/fx_boot_starter/lib/fx_boot_starter.dart create mode 100644 modules/fx_boot_starter/pubspec.yaml create mode 100644 modules/fx_boot_starter/test/fx_boot_starter_test.dart diff --git a/modules/fx_boot_starter/.gitignore b/modules/fx_boot_starter/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/fx_boot_starter/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/fx_boot_starter/.metadata b/modules/fx_boot_starter/.metadata new file mode 100644 index 00000000..7e6d66ad --- /dev/null +++ b/modules/fx_boot_starter/.metadata @@ -0,0 +1,10 @@ +# 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: "54e66469a933b60ddf175f858f82eaeb97e48c8d" + channel: "stable" + +project_type: package diff --git a/modules/fx_boot_starter/CHANGELOG.md b/modules/fx_boot_starter/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/fx_boot_starter/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/fx_boot_starter/LICENSE b/modules/fx_boot_starter/LICENSE new file mode 100644 index 00000000..fd13a1a8 --- /dev/null +++ b/modules/fx_boot_starter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 张风捷特烈(toly) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/modules/fx_boot_starter/README.md b/modules/fx_boot_starter/README.md new file mode 100644 index 00000000..c870a796 --- /dev/null +++ b/modules/fx_boot_starter/README.md @@ -0,0 +1,60 @@ + +#### ::logic:: + +easy handle app start load future task by implements AppStartRepository +in initApp function, return your AppState. +and fixError to handle start error + +```dart +class AppStartRepositoryImpl implements AppStartRepository { + const AppStartRepositoryImpl(); + + @override + Future initApp() async { + + /// 可以处理异步加载任务 + /// 返回初始化的 AppState + await Future.delayed(const Duration(seconds: 1)); + if (_isErrorDebug) { + // throw "App 初始化异常"; + } + return AppState(0); + } + + @override + Future fixError(Object error, {Object? extra}) async { + await Future.delayed(const Duration(seconds: 1)); + // throw "App 无法修复"; + _isErrorDebug = false; + return; + } +} +``` + +---- + +#### ::listen start action:: + +easy handle app start state by implements AppStartAction + +```dart +class AppStartActionImpl implements AppStartAction { + + const AppStartActionImpl(); + + @override + void onLoaded(BuildContext context, int cost, AppState state) { + debugPrint("App启动耗时:$cost ms"); + } + + @override + void onStartError(BuildContext context, Object error, StackTrace trace) { + // TODO go start success + } + + @override + void onStartSuccess(BuildContext context,AppState) { + // TODO go start success + } +} +``` \ No newline at end of file diff --git a/modules/fx_boot_starter/analysis_options.yaml b/modules/fx_boot_starter/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/fx_boot_starter/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_boot_starter/lib/fx_boot_starter.dart b/modules/fx_boot_starter/lib/fx_boot_starter.dart new file mode 100644 index 00000000..9171b5ce --- /dev/null +++ b/modules/fx_boot_starter/lib/fx_boot_starter.dart @@ -0,0 +1,12 @@ +library fx_boot_starter; + +export 'bloc/bloc.dart'; +export 'bloc/state.dart' hide AppStatus; +export 'bloc/ext.dart'; +export 'data/repository.dart'; +export 'data/action/app_start_action.dart'; +export 'data/action/app_fix_action.dart'; +export 'view/app_start_listener.dart'; +export 'view/app_error_fix_listener.dart'; +export 'view/app_start_scope.dart'; +export 'view/app_error_fix_builder.dart'; \ No newline at end of file diff --git a/modules/fx_boot_starter/pubspec.yaml b/modules/fx_boot_starter/pubspec.yaml new file mode 100644 index 00000000..1768fa38 --- /dev/null +++ b/modules/fx_boot_starter/pubspec.yaml @@ -0,0 +1,57 @@ +name: fx_boot_starter +description: "a app start package to help handle start easy." +version: 0.0.1 +homepage: https://github.com/TolyFx/fx +repository: https://github.com/TolyFx/fx/tree/main/modules/app_boot_starter + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + # 状态管理 + flutter_bloc: 8.1.6 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_boot_starter/test/fx_boot_starter_test.dart b/modules/fx_boot_starter/test/fx_boot_starter_test.dart new file mode 100644 index 00000000..fb559f0d --- /dev/null +++ b/modules/fx_boot_starter/test/fx_boot_starter_test.dart @@ -0,0 +1,12 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:fx_boot_starter/fx_boot_starter.dart'; + +// void main() { +// test('adds one to input values', () { +// final calculator = Calculator(); +// expect(calculator.addOne(2), 3); +// expect(calculator.addOne(-7), -6); +// expect(calculator.addOne(0), 1); +// }); +// } From bf563f1222c1869e1a880efd4b4bb2c59f5cb897 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 12 Aug 2024 06:11:44 +0800 Subject: [PATCH 077/149] update db_storage by fx_dao --- lib/app/views/data_manage/data_manage_page.dart | 4 ++-- .../lib/src/articles/data/repository/article_repository.dart | 2 +- .../src/articles/data/repository/columnize_repository.dart | 2 +- packages/storage/pubspec.yaml | 5 +---- .../lib/data/db_impl/catagory_db_repository.dart | 4 ++-- .../lib/views/mobile/category_page/sync/async_button.dart | 2 +- packages/widget_module/pubspec.yaml | 4 ++-- 7 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart index f909e2f8..75589b6a 100644 --- a/lib/app/views/data_manage/data_manage_page.dart +++ b/lib/app/views/data_manage/data_manage_page.dart @@ -90,7 +90,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await AppStorage().flutter()!.likeWidgetIds(); + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); @@ -124,7 +124,7 @@ class DataManagePage extends StatelessWidget { CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await AppStorage().flutter()!.likeWidgetIds(); + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/packages/artifact/lib/src/articles/data/repository/article_repository.dart b/packages/artifact/lib/src/articles/data/repository/article_repository.dart index 45fe4d2b..49942f08 100644 --- a/packages/artifact/lib/src/articles/data/repository/article_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/article_repository.dart @@ -7,7 +7,7 @@ import 'package:storage/storage.dart'; class ArticleRepository { const ArticleRepository(); - ArticleDao get dao => AppStorage().flutter()!; + ArticleDao get dao => AppStorage().flutter(); // 从数据库加载资源 Future> queryByDb(ArticleFilter filter) async { diff --git a/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart index a1443e61..d55e7090 100644 --- a/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart +++ b/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart @@ -6,7 +6,7 @@ class ColumnizeRepository { const ColumnizeRepository(); - ColumnizeDao get dao => AppStorage().flutter()!; + ColumnizeDao get dao => AppStorage().flutter(); // 从数据库加载资源 diff --git a/packages/storage/pubspec.yaml b/packages/storage/pubspec.yaml index 978911d4..864b3511 100644 --- a/packages/storage/pubspec.yaml +++ b/packages/storage/pubspec.yaml @@ -10,11 +10,8 @@ environment: dependencies: flutter: sdk: flutter - sqflite_common_ffi: 2.3.3 - sqflite: ^2.3.3+1 shared_preferences: ^2.2.1 # xml 固化 - path_provider: ^2.1.1 # 路径 - fx_dao: 0.0.1 + fx_dao: 0.0.1+2 dev_dependencies: flutter_test: diff --git a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart index dce36bf0..8c7b121f 100644 --- a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart +++ b/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart @@ -13,8 +13,8 @@ import '../zone.dart'; class CategoryDbRepository implements CategoryRepository { - CategoryDao get categoryDao => AppStorage().flutter()!; - LikeDao get likeDao => AppStorage().flutter()!; + CategoryDao get categoryDao => AppStorage().flutter(); + LikeDao get likeDao => AppStorage().flutter(); // CategoryDbRepository({required this.categoryDao,required this.likeDao}); diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart index 6ec5342c..3b64bb4f 100644 --- a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart +++ b/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -90,7 +90,7 @@ class _SyncCategoryButtonState extends State { // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await AppStorage().flutter()!.likeWidgetIds(); + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); diff --git a/packages/widget_module/pubspec.yaml b/packages/widget_module/pubspec.yaml index f272af67..3f7ed9b5 100644 --- a/packages/widget_module/pubspec.yaml +++ b/packages/widget_module/pubspec.yaml @@ -16,8 +16,8 @@ dependencies: flutter_star: ^1.0.2 # 星星组件 toggle_rotate: ^1.0.1 wrapper: ^1.0.2 -# widget_repository: -# path: ../widget_repository + artifact: + path: ../artifact storage: path: ../storage toly_ui: From 77f7e64cc82c2ad02ed7174fe5dc04e963ddd64a Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 12 Aug 2024 06:14:14 +0800 Subject: [PATCH 078/149] update db_storage by fx_dao --- build_tools/windows/build.iss | 160 -------------------------------- build_tools/windows/package.bat | 1 - 2 files changed, 161 deletions(-) delete mode 100644 build_tools/windows/build.iss delete mode 100644 build_tools/windows/package.bat diff --git a/build_tools/windows/build.iss b/build_tools/windows/build.iss deleted file mode 100644 index dd6c9357..00000000 --- a/build_tools/windows/build.iss +++ /dev/null @@ -1,160 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -; Reference: https://juejin.cn/post/7108928269285589000 -; Document: https://jrsoftware.org/ishelp/ - -#define WindowsProjectDir "..\..\windows" -#define WindowsReleaseDir "..\..\build\windows\x64\runner\Release" -#define OutputDir "..\output" - -#define MyAppName "FlutterUnit" -#define AppPublisher "toly1994.com" -#define MyAppURL "https://www.toly1994.com/" -#define MyAppExeName "flutter_unit.exe" -#define MyAppAssocName MyAppName + " File" - -#define MyAppAssocExt ".myp" -#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt -#ifndef Version - #define Version "1.0.0" -#endif - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{48BCE972-86A2-4CA3-8B0A-A872C0391C84}} -AppName={#MyAppName} -AppVersion={#Version} -AppPublisher={#AppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -;DefaultDirName={autopf}\{#MyAppName} -DefaultDirName={drive:Path}\Software\{#MyAppName} -ChangesAssociations=yes -DisableProgramGroupPage=yes -; Uncomment the following line to run in non administrative install mode (install for current user only.) -;PrivilegesRequired=lowest -OutputDir= {#OutputDir} -OutputBaseFilename={#MyAppName} -SetupIconFile={#WindowsProjectDir}\runner\resources\app_icon.ico -Compression=lzma -SolidCompression=yes -WizardStyle=modern -PrivilegesRequired=admin -UsePreviousAppDir=false - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; -Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; - -[Files] -Source: "{#WindowsReleaseDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#WindowsReleaseDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#WindowsReleaseDir}\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs - -[Registry] -Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue -Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey -Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" -Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" -Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: "" - -[Icons] -Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" -Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon -Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon - -[Run] -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent - -[code] -function InitializeSetup(): Boolean; -var - result1: Integer; -begin - ShellExec('', 'cmd.exe', 'cmd /c taskkill /f /im {#MyAppExeName}', '', SW_HIDE, ewWaitUntilTerminated, result1); - Result := True; -end; - -function FileExist(file: string): Boolean; - begin - if (FileExists(file)) then - begin - Result := True; - end - else - begin - Result := False; - end; - end; - -// remove icons cache if necessary -function RemoveIconCache(): Boolean; - var - IconCache: String; - begin - IconCache := ExpandConstant('{localappdata}\IconCache.db'); - if FileExist(IconCache) then - begin - DeleteFile(IconCache); - end; - Result := True; - end; - -procedure InitializeWizard; -var - UserStartMenuPath: String; - CommonStartMenuPath: String; -begin - //// delete directory - // DelTree(ExpandConstant('{app}\platform'), True, True, True); - //// delete file - // DeleteFile(ExpandConstant('{userstartmenu}\Programs\uhomespro.lnk')); - - // MsgBox('App start menu path is: ' + ExpandConstant('{userstartmenu}'), mbError, MB_OK); - Log('App start menu path is: ' + ExpandConstant('{userstartmenu}')); - - // delete start menu link - UserStartMenuPath := ExpandConstant('{userstartmenu}\Programs\uhomespro.lnk'); - if FileExist(UserStartMenuPath) then - begin - DeleteFile(UserStartMenuPath); - end; - CommonStartMenuPath := ExpandConstant('{commonstartmenu}\Programs\uhomespro.lnk'); - if FileExist(CommonStartMenuPath) then - begin - DeleteFile(CommonStartMenuPath); - end; - // remove system icon cache - RemoveIconCache(); - - // ResultStr := RemoveQuotes(ResultStr); - // Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); -end; - -procedure DeinitializeSetup; -var - PreviousProgramInstallPath: String; - PreviousProgramInstallExe: String; - -begin - // clean previous program installed files, call in DeinitializeSetup lifecycle method to avoid system permission error. - PreviousProgramInstallPath := ExpandConstant('C:\Program\{#MyAppName}'); - PreviousProgramInstallExe := ExpandConstant(PreviousProgramInstallPath + '\{#MyAppExeName}'); - Log('The previous program install path is: ' + PreviousProgramInstallPath); - // MsgBox('The previous program install path is: ' + PreviousProgramInstallPath, mbError, MB_OK); - if FileExist(PreviousProgramInstallExe) then - begin - DelTree(PreviousProgramInstallPath, True, True, True); - end; -end; - - - - - diff --git a/build_tools/windows/package.bat b/build_tools/windows/package.bat deleted file mode 100644 index 6b745a36..00000000 --- a/build_tools/windows/package.bat +++ /dev/null @@ -1 +0,0 @@ -flutter clean && flutter build windows && ISCC.exe "build.iss" /DVersion=3.0.0 && pause \ No newline at end of file From c054639c4ac2fc99988615abe0809c6ecf2439c3 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 31 Aug 2024 07:52:07 +0800 Subject: [PATCH 079/149] update use fx --- README.md | 2 +- android/app/build.gradle | 2 +- lib/app/bloc_wrapper.dart | 1 - lib/app/views/setting/setting_page.dart | 2 +- lib/app_stater/impl/app_start_action.dart | 1 - lib/app_stater/impl/start_repository.dart | 3 +- .../view/error/app_start_error.dart | 2 +- .../view/splash/standard_unit_splash.dart | 2 +- lib/main.dart | 1 - .../desk/flutter_unit_desk_navigation.dart | 2 +- modules/fx_app_env/.gitignore | 29 -- modules/fx_app_env/.metadata | 10 - modules/fx_app_env/CHANGELOG.md | 3 - modules/fx_app_env/LICENSE | 1 - modules/fx_app_env/README.md | 39 --- modules/fx_app_env/analysis_options.yaml | 4 - modules/fx_app_env/lib/fx_app_env.dart | 3 - modules/fx_app_env/lib/src/app_env.dart | 55 ---- modules/fx_app_env/lib/src/os.dart | 48 --- modules/fx_app_env/pubspec.yaml | 54 ---- modules/fx_app_env/test/fx_app_env_test.dart | 12 - modules/fx_boot_starter/.gitignore | 29 -- modules/fx_boot_starter/.metadata | 10 - modules/fx_boot_starter/CHANGELOG.md | 3 - modules/fx_boot_starter/LICENSE | 21 -- modules/fx_boot_starter/README.md | 60 ---- modules/fx_boot_starter/analysis_options.yaml | 4 - modules/fx_boot_starter/example/main.dart | 37 --- .../example/starter/data/app_state.dart | 5 - .../example/starter/impl/app_fix_action.dart | 19 -- .../starter/impl/app_start_action.dart | 26 -- .../starter/impl/start_repository.dart | 29 -- .../example/starter/views/error_page.dart | 49 ---- .../example/starter/views/splash_page.dart | 14 - modules/fx_boot_starter/lib/bloc/bloc.dart | 64 ---- modules/fx_boot_starter/lib/bloc/ext.dart | 8 - modules/fx_boot_starter/lib/bloc/state.dart | 33 --- .../lib/data/action/app_fix_action.dart | 11 - .../lib/data/action/app_start_action.dart | 20 -- .../fx_boot_starter/lib/data/repository.dart | 10 - .../fx_boot_starter/lib/fx_boot_starter.dart | 12 - .../lib/view/app_error_fix_builder.dart | 34 --- .../lib/view/app_error_fix_listener.dart | 40 --- .../lib/view/app_start_listener.dart | 35 --- .../lib/view/app_start_scope.dart | 38 --- modules/fx_boot_starter/pubspec.yaml | 57 ---- .../test/fx_boot_starter_test.dart | 12 - modules/fx_go_router_ext/.gitignore | 29 -- modules/fx_go_router_ext/.metadata | 10 - modules/fx_go_router_ext/CHANGELOG.md | 3 - modules/fx_go_router_ext/LICENSE | 1 - modules/fx_go_router_ext/README.md | 39 --- .../fx_go_router_ext/analysis_options.yaml | 4 - .../lib/fx_go_router_ext.dart | 7 - .../lib/src/listener/listener.dart | 36 --- .../lib/src/listener/path.dart | 14 - .../fade_page_transitions_builder.dart | 19 -- .../page_route/fade_page_route.dart | 56 ---- .../page_route/slide_page_route.dart | 50 ---- .../page_route/zero_page_route.dart | 36 --- .../src/transition/size_clip_transition.dart | 105 ------- .../cupertino_back_gesture_detector.dart | 277 ------------------ .../slide_page_transition_builder.dart | 33 --- .../lib/src/transition/transition.dart | 7 - modules/fx_go_router_ext/pubspec.yaml | 56 ---- .../test/fx_go_router_ext_test.dart | 0 .../src/finding/view/finding_tool_bar.dart | 2 +- .../lib/src/views/sort/top_bar/sort_bar.dart | 2 +- packages/algorithm/pubspec.yaml | 3 +- packages/app/lib/app.dart | 3 +- .../views/window_buttons.dart | 82 ------ .../window/windows_adapter.dart | 88 ------ packages/app/pubspec.yaml | 5 +- .../points/view/desk_ui/desk_point_page.dart | 2 +- .../view/issues_point/issues_detail.dart | 2 +- .../top_bar/desk_account_top_bar.dart | 2 +- .../top_bar/desk_knowledge_top_bar.dart | 2 +- .../top_bar/desk_simple_top_bar.dart | 2 +- .../project_ui/top_bar/desk_tab_top_bar.dart | 2 +- .../lib/src/desk_widget_top_bar.dart | 2 +- .../widget_detail/widget_detail_bar.dart | 2 +- .../widget_panel/desk_widget_top_bar.dart | 2 +- pubspec.lock | 63 ++-- pubspec.yaml | 11 +- 84 files changed, 64 insertions(+), 1951 deletions(-) delete mode 100644 modules/fx_app_env/.gitignore delete mode 100644 modules/fx_app_env/.metadata delete mode 100644 modules/fx_app_env/CHANGELOG.md delete mode 100644 modules/fx_app_env/LICENSE delete mode 100644 modules/fx_app_env/README.md delete mode 100644 modules/fx_app_env/analysis_options.yaml delete mode 100644 modules/fx_app_env/lib/fx_app_env.dart delete mode 100644 modules/fx_app_env/lib/src/app_env.dart delete mode 100644 modules/fx_app_env/lib/src/os.dart delete mode 100644 modules/fx_app_env/pubspec.yaml delete mode 100644 modules/fx_app_env/test/fx_app_env_test.dart delete mode 100644 modules/fx_boot_starter/.gitignore delete mode 100644 modules/fx_boot_starter/.metadata delete mode 100644 modules/fx_boot_starter/CHANGELOG.md delete mode 100644 modules/fx_boot_starter/LICENSE delete mode 100644 modules/fx_boot_starter/README.md delete mode 100644 modules/fx_boot_starter/analysis_options.yaml delete mode 100644 modules/fx_boot_starter/example/main.dart delete mode 100644 modules/fx_boot_starter/example/starter/data/app_state.dart delete mode 100644 modules/fx_boot_starter/example/starter/impl/app_fix_action.dart delete mode 100644 modules/fx_boot_starter/example/starter/impl/app_start_action.dart delete mode 100644 modules/fx_boot_starter/example/starter/impl/start_repository.dart delete mode 100644 modules/fx_boot_starter/example/starter/views/error_page.dart delete mode 100644 modules/fx_boot_starter/example/starter/views/splash_page.dart delete mode 100644 modules/fx_boot_starter/lib/bloc/bloc.dart delete mode 100644 modules/fx_boot_starter/lib/bloc/ext.dart delete mode 100644 modules/fx_boot_starter/lib/bloc/state.dart delete mode 100644 modules/fx_boot_starter/lib/data/action/app_fix_action.dart delete mode 100644 modules/fx_boot_starter/lib/data/action/app_start_action.dart delete mode 100644 modules/fx_boot_starter/lib/data/repository.dart delete mode 100644 modules/fx_boot_starter/lib/fx_boot_starter.dart delete mode 100644 modules/fx_boot_starter/lib/view/app_error_fix_builder.dart delete mode 100644 modules/fx_boot_starter/lib/view/app_error_fix_listener.dart delete mode 100644 modules/fx_boot_starter/lib/view/app_start_listener.dart delete mode 100644 modules/fx_boot_starter/lib/view/app_start_scope.dart delete mode 100644 modules/fx_boot_starter/pubspec.yaml delete mode 100644 modules/fx_boot_starter/test/fx_boot_starter_test.dart delete mode 100644 modules/fx_go_router_ext/.gitignore delete mode 100644 modules/fx_go_router_ext/.metadata delete mode 100644 modules/fx_go_router_ext/CHANGELOG.md delete mode 100644 modules/fx_go_router_ext/LICENSE delete mode 100644 modules/fx_go_router_ext/README.md delete mode 100644 modules/fx_go_router_ext/analysis_options.yaml delete mode 100644 modules/fx_go_router_ext/lib/fx_go_router_ext.dart delete mode 100644 modules/fx_go_router_ext/lib/src/listener/listener.dart delete mode 100644 modules/fx_go_router_ext/lib/src/listener/path.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart delete mode 100644 modules/fx_go_router_ext/lib/src/transition/transition.dart delete mode 100644 modules/fx_go_router_ext/pubspec.yaml delete mode 100644 modules/fx_go_router_ext/test/fx_go_router_ext_test.dart delete mode 100644 packages/app/lib/app/platform_adapter/views/window_buttons.dart delete mode 100644 packages/app/lib/app/platform_adapter/window/windows_adapter.dart diff --git a/README.md b/README.md index 31504152..003bb476 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ #### 当前Flutter 版本 ``` -Flutter 3.22.0 • channel stable • https://github.com/flutter/flutter.git +Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 Engine • revision f6344b75dc Tools • Dart 3.4.0 • DevTools 2.34.3 diff --git a/android/app/build.gradle b/android/app/build.gradle index 476d6b77..35b52b0f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/lib/app/bloc_wrapper.dart b/lib/app/bloc_wrapper.dart index a0889cb4..8a4b7b0e 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/app/bloc_wrapper.dart @@ -2,7 +2,6 @@ import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; -import 'package:fx_app_env/fx_app_env.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/app/views/setting/setting_page.dart b/lib/app/views/setting/setting_page.dart index a3d164a3..8c164436 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/lib/app/views/setting/setting_page.dart @@ -20,7 +20,7 @@ class SettingPage extends StatelessWidget { const Widget divider = Divider(height: 1); - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Scaffold( appBar: AppBar(title:Text(context.l10n.appSettings)), body: ListView( diff --git a/lib/app_stater/impl/app_start_action.dart b/lib/app_stater/impl/app_start_action.dart index 839c65c5..f69c5de5 100644 --- a/lib/app_stater/impl/app_start_action.dart +++ b/lib/app_stater/impl/app_start_action.dart @@ -2,7 +2,6 @@ import 'package:app/app.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:fx_app_env/fx_app_env.dart'; import 'package:go_router/go_router.dart'; import 'package:storage/storage.dart'; import 'package:utils/utils.dart'; diff --git a/lib/app_stater/impl/start_repository.dart b/lib/app_stater/impl/start_repository.dart index 5bcebf2a..ed7530db 100644 --- a/lib/app_stater/impl/start_repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; -import 'package:fx_app_env/fx_app_env.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; @@ -22,7 +21,7 @@ class AppStartRepositoryImpl implements AppStartRepository { WidgetsFlutterBinding.ensureInitialized(); //滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; - WindowsAdapter.setSize(); + WindowSizeAdapter.setSize(); await SpStorage.instance.initSp(); if (!kAppEnv.isWeb) await initDb(); AppConfigPo po = await SpStorage.instance.appConfig.read(); diff --git a/lib/app_stater/view/error/app_start_error.dart b/lib/app_stater/view/error/app_start_error.dart index e3c04a68..ab3368c9 100644 --- a/lib/app_stater/view/error/app_start_error.dart +++ b/lib/app_stater/view/error/app_start_error.dart @@ -8,7 +8,7 @@ class AppStartErrorPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: DragToMoveWrapper( + appBar: PreferredDragToMoveWrapper( child: AppBar( title: Text("App 启动异常"), actions: [WindowButtons()], diff --git a/lib/app_stater/view/splash/standard_unit_splash.dart b/lib/app_stater/view/splash/standard_unit_splash.dart index 43e81878..22e73ef4 100644 --- a/lib/app_stater/view/splash/standard_unit_splash.dart +++ b/lib/app_stater/view/splash/standard_unit_splash.dart @@ -120,7 +120,7 @@ class SplashTopBar extends StatelessWidget { @override Widget build(BuildContext context) { if(!isDesk) return const SizedBox.shrink(); - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Stack( children: [ Container( diff --git a/lib/main.dart b/lib/main.dart index 927e0abe..31bcc188 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,5 @@ import 'package:app/app.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'app/bloc_wrapper.dart'; diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart index 4f04f6b4..911fbcd9 100644 --- a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart +++ b/lib/navigation/views/desk/flutter_unit_desk_navigation.dart @@ -16,7 +16,7 @@ class FlutterUnitDeskNavigation extends StatelessWidget { return Scaffold( body: Row( children: [ - const DragToMoveAreaNoDouble(child: DeskNavigationRail()), + const DragToMoveWrapper(child: DeskNavigationRail()), Expanded(child: content), ], ), diff --git a/modules/fx_app_env/.gitignore b/modules/fx_app_env/.gitignore deleted file mode 100644 index ac5aa989..00000000 --- a/modules/fx_app_env/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# 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 -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -build/ diff --git a/modules/fx_app_env/.metadata b/modules/fx_app_env/.metadata deleted file mode 100644 index 8f7b6ac1..00000000 --- a/modules/fx_app_env/.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: "761747bfc538b5af34aa0d3fac380f1bc331ec49" - channel: "stable" - -project_type: package diff --git a/modules/fx_app_env/CHANGELOG.md b/modules/fx_app_env/CHANGELOG.md deleted file mode 100644 index 41cc7d81..00000000 --- a/modules/fx_app_env/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/modules/fx_app_env/LICENSE b/modules/fx_app_env/LICENSE deleted file mode 100644 index ba75c69f..00000000 --- a/modules/fx_app_env/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/modules/fx_app_env/README.md b/modules/fx_app_env/README.md deleted file mode 100644 index 02fe8eca..00000000 --- a/modules/fx_app_env/README.md +++ /dev/null @@ -1,39 +0,0 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/modules/fx_app_env/analysis_options.yaml b/modules/fx_app_env/analysis_options.yaml deleted file mode 100644 index a5744c1c..00000000 --- a/modules/fx_app_env/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_app_env/lib/fx_app_env.dart b/modules/fx_app_env/lib/fx_app_env.dart deleted file mode 100644 index e380a57a..00000000 --- a/modules/fx_app_env/lib/fx_app_env.dart +++ /dev/null @@ -1,3 +0,0 @@ -library fx_app_env; - -export 'src/app_env.dart'; \ No newline at end of file diff --git a/modules/fx_app_env/lib/src/app_env.dart b/modules/fx_app_env/lib/src/app_env.dart deleted file mode 100644 index ff699603..00000000 --- a/modules/fx_app_env/lib/src/app_env.dart +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Author: 张风捷特烈 -// CreateTime: 2024-07-13 -// Contact Me: 1981462002@qq.com - -import 'dart:io'; - -import 'package:flutter/foundation.dart'; - -import 'os.dart'; - -AppEnv kAppEnv = AppEnv(); - -class AppEnv { - late OS _os; - late OSChecker _checker; - - OS get os => _os; - - AppEnv() { - _os = _initOS(); - _checker = OSChecker(os); - } - - OS _initOS() { - if (kIsWeb) return OS.web; - if (Platform.isWindows) return OS.windows; - if (Platform.isMacOS) return OS.macos; - if (Platform.isLinux) return OS.linux; - if (Platform.isIOS) return OS.ios; - if (Platform.isAndroid) return OS.android; - return OS.unknown; - } - - bool get isAndroid => _checker.isAndroid; - - bool get isIos => _checker.isIos; - - bool get isWindows => _checker.isWindows; - - bool get isMacOS => _checker.isMacOS; - - bool get isLinux => _checker.isLinux; - - bool get isWeb => _checker.isWeb; - - bool get isDesktop => _checker.isDesktop; - - bool get isDesktopUI => _checker.isDesktopUI; - - bool get isMobile => _checker.isMobile; -} diff --git a/modules/fx_app_env/lib/src/os.dart b/modules/fx_app_env/lib/src/os.dart deleted file mode 100644 index d840fc33..00000000 --- a/modules/fx_app_env/lib/src/os.dart +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Author: 张风捷特烈 -// CreateTime: 2024-07-13 -// Contact Me: 1981462002@qq.com - -import 'dart:io'; - -import 'package:flutter/foundation.dart'; - -enum OS { - android, - ios, - windows, - macos, - linux, - web, - unknown, -} - - -class OSChecker { - bool isAndroid = false; - bool isIos = false; - bool isWindows = false; - bool isMacOS = false; - bool isLinux = false; - bool isWeb = false; - - bool isDesktop = false; - bool isDesktopUI = false; - bool isMobile = false; - - OSChecker(OS os) { - isWeb = os == OS.web; - isAndroid = !isWeb && os == OS.android; - isIos = !isWeb && os == OS.ios; - isWindows = !isWeb && os == OS.windows; - isMacOS = !isWeb && os == OS.macos; - isLinux = !isWeb && os == OS.linux; - - isDesktop = !isWeb && (isMacOS || isWindows || isLinux); - isMobile = !isWeb && (isAndroid || isIos); - isDesktopUI = isWeb || isDesktop; - } -} diff --git a/modules/fx_app_env/pubspec.yaml b/modules/fx_app_env/pubspec.yaml deleted file mode 100644 index 25258823..00000000 --- a/modules/fx_app_env/pubspec.yaml +++ /dev/null @@ -1,54 +0,0 @@ -name: fx_app_env -description: "A new Flutter package project." -version: 0.0.1 -homepage: - -environment: - sdk: '>=3.0.0 <4.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^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 packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, 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 in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_app_env/test/fx_app_env_test.dart b/modules/fx_app_env/test/fx_app_env_test.dart deleted file mode 100644 index 7251333f..00000000 --- a/modules/fx_app_env/test/fx_app_env_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -// import 'package:flutter_test/flutter_test.dart'; -// -// import 'package:fx_app_env/fx_app_env.dart'; -// -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } diff --git a/modules/fx_boot_starter/.gitignore b/modules/fx_boot_starter/.gitignore deleted file mode 100644 index ac5aa989..00000000 --- a/modules/fx_boot_starter/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# 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 -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -build/ diff --git a/modules/fx_boot_starter/.metadata b/modules/fx_boot_starter/.metadata deleted file mode 100644 index 7e6d66ad..00000000 --- a/modules/fx_boot_starter/.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: "54e66469a933b60ddf175f858f82eaeb97e48c8d" - channel: "stable" - -project_type: package diff --git a/modules/fx_boot_starter/CHANGELOG.md b/modules/fx_boot_starter/CHANGELOG.md deleted file mode 100644 index 41cc7d81..00000000 --- a/modules/fx_boot_starter/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/modules/fx_boot_starter/LICENSE b/modules/fx_boot_starter/LICENSE deleted file mode 100644 index fd13a1a8..00000000 --- a/modules/fx_boot_starter/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 张风捷特烈(toly) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/modules/fx_boot_starter/README.md b/modules/fx_boot_starter/README.md deleted file mode 100644 index c870a796..00000000 --- a/modules/fx_boot_starter/README.md +++ /dev/null @@ -1,60 +0,0 @@ - -#### ::logic:: - -easy handle app start load future task by implements AppStartRepository -in initApp function, return your AppState. -and fixError to handle start error - -```dart -class AppStartRepositoryImpl implements AppStartRepository { - const AppStartRepositoryImpl(); - - @override - Future initApp() async { - - /// 可以处理异步加载任务 - /// 返回初始化的 AppState - await Future.delayed(const Duration(seconds: 1)); - if (_isErrorDebug) { - // throw "App 初始化异常"; - } - return AppState(0); - } - - @override - Future fixError(Object error, {Object? extra}) async { - await Future.delayed(const Duration(seconds: 1)); - // throw "App 无法修复"; - _isErrorDebug = false; - return; - } -} -``` - ----- - -#### ::listen start action:: - -easy handle app start state by implements AppStartAction - -```dart -class AppStartActionImpl implements AppStartAction { - - const AppStartActionImpl(); - - @override - void onLoaded(BuildContext context, int cost, AppState state) { - debugPrint("App启动耗时:$cost ms"); - } - - @override - void onStartError(BuildContext context, Object error, StackTrace trace) { - // TODO go start success - } - - @override - void onStartSuccess(BuildContext context,AppState) { - // TODO go start success - } -} -``` \ No newline at end of file diff --git a/modules/fx_boot_starter/analysis_options.yaml b/modules/fx_boot_starter/analysis_options.yaml deleted file mode 100644 index a5744c1c..00000000 --- a/modules/fx_boot_starter/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_boot_starter/example/main.dart b/modules/fx_boot_starter/example/main.dart deleted file mode 100644 index af3848e4..00000000 --- a/modules/fx_boot_starter/example/main.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/material.dart'; - -import 'starter/data/app_state.dart'; -import 'starter/impl/app_fix_action.dart'; -import 'starter/impl/app_start_action.dart'; -import 'starter/impl/start_repository.dart'; -import 'starter/views/splash_page.dart'; - -void main() { - runApp( - const AppStartScope( - repository: AppStartRepositoryImpl(), - appStartAction: AppStartActionImpl(), - fixAction: AppFixActionImpl(), - child: MyApp(), - ), - ); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: ThemeData( - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, - ), - home: const AppStartListener( - child: SplashPage(), - )); - } -} diff --git a/modules/fx_boot_starter/example/starter/data/app_state.dart b/modules/fx_boot_starter/example/starter/data/app_state.dart deleted file mode 100644 index 5d0e3485..00000000 --- a/modules/fx_boot_starter/example/starter/data/app_state.dart +++ /dev/null @@ -1,5 +0,0 @@ -class AppState{ - final int modeType; - - AppState(this.modeType); -} \ No newline at end of file diff --git a/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart b/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart deleted file mode 100644 index 272283ec..00000000 --- a/modules/fx_boot_starter/example/starter/impl/app_fix_action.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/material.dart'; - - - -class AppFixActionImpl implements AppFixAction { - - const AppFixActionImpl(); - - @override - void onFixSuccess(BuildContext context) { - // TODO go fix success - } - - @override - void onFixError(BuildContext context, Object error, StackTrace trace) { - - } -} diff --git a/modules/fx_boot_starter/example/starter/impl/app_start_action.dart b/modules/fx_boot_starter/example/starter/impl/app_start_action.dart deleted file mode 100644 index 43d53889..00000000 --- a/modules/fx_boot_starter/example/starter/impl/app_start_action.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/material.dart'; - -import '../data/app_state.dart'; - - - -class AppStartActionImpl implements AppStartAction { - - const AppStartActionImpl(); - - @override - void onLoaded(BuildContext context, int cost, AppState state) { - debugPrint("App启动耗时:$cost ms"); - } - - @override - void onStartError(BuildContext context, Object error, StackTrace trace) { -// TODO go start success - } - - @override - void onStartSuccess(BuildContext context,AppState state) { -// TODO go start success - } -} diff --git a/modules/fx_boot_starter/example/starter/impl/start_repository.dart b/modules/fx_boot_starter/example/starter/impl/start_repository.dart deleted file mode 100644 index 141c5947..00000000 --- a/modules/fx_boot_starter/example/starter/impl/start_repository.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:fx_boot_starter/data/repository.dart'; - -import '../data/app_state.dart'; - -bool _isErrorDebug = true; - -class AppStartRepositoryImpl implements AppStartRepository { - const AppStartRepositoryImpl(); - - @override - Future initApp() async { - - /// 可以处理异步加载任务 - /// 返回初始化的 AppState - await Future.delayed(const Duration(seconds: 1)); - if (_isErrorDebug) { - // throw "App 初始化异常"; - } - return AppState(0); - } - - @override - Future fixError(Object error, {Object? extra}) async { - await Future.delayed(const Duration(seconds: 1)); - // throw "App 无法修复"; - _isErrorDebug = false; - return; - } -} diff --git a/modules/fx_boot_starter/example/starter/views/error_page.dart b/modules/fx_boot_starter/example/starter/views/error_page.dart deleted file mode 100644 index 0058e29c..00000000 --- a/modules/fx_boot_starter/example/starter/views/error_page.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import '../data/app_state.dart'; - -class ErrorPage extends StatelessWidget { - final String error; - - const ErrorPage({super.key, required this.error}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - direction: Axis.vertical, - spacing: 20, - children: [ - Text("初始化异常:\n$error",textAlign: TextAlign.center,), - Padding( - padding: const EdgeInsets.all(8.0), - child: AppFixErrorBuilder( - shouldFix: (BuildContext context) { - return ElevatedButton( - onPressed: () { - context.fixStartError(); - }, - child: const Text("修复异常"), - ); - }, - loading: (BuildContext context) { - return ElevatedButton( - onPressed: null, - child: CupertinoActivityIndicator(), - ); - }, - error: (BuildContext context) { - return Text('当前应用无法修复\n请联系开发者处理。xxxxxx'); - }, - ), - ) - ], - ), - ), - ); - } -} diff --git a/modules/fx_boot_starter/example/starter/views/splash_page.dart b/modules/fx_boot_starter/example/starter/views/splash_page.dart deleted file mode 100644 index 0c3ee920..00000000 --- a/modules/fx_boot_starter/example/starter/views/splash_page.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter/material.dart'; - -class SplashPage extends StatelessWidget { - const SplashPage({super.key}); - - @override - Widget build(BuildContext context) { - return const Scaffold( - body: Center( - child: FlutterLogo(), - ), - ); - } -} diff --git a/modules/fx_boot_starter/lib/bloc/bloc.dart b/modules/fx_boot_starter/lib/bloc/bloc.dart deleted file mode 100644 index 65302708..00000000 --- a/modules/fx_boot_starter/lib/bloc/bloc.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../fx_boot_starter.dart'; -import 'state.dart'; - -class AppStartBloc extends Cubit { - final int minStartDurationMs; - - final AppStartRepository repository; - final AppStartAction startAction; - final AppFixAction? fixAction; - - AppStartBloc({ - required this.repository, - required this.startAction, - this.fixAction, - this.minStartDurationMs = 600, - }) : super(const AppStarting()); - - int _timeRecord = 0; - - void startApp() async { - _timeRecord = DateTime.now().millisecondsSinceEpoch; - emit(const AppStarting()); - S data; - try { - /// 处理初始化异步任务 - data = await repository.initApp(); - } catch (e, s) { - emit(AppStartFailed(e, s, FixType.none)); - return; - } - - /// 计算初始化的耗时时长 - int cost = DateTime.now().millisecondsSinceEpoch - _timeRecord; - int waitTime = minStartDurationMs - cost; - if (waitTime > 0) { - /// 说明启动时间小于 [minStartDurationMs], 等待时间差 - emit(AppLoadDone(cost, data)); - await Future.delayed(Duration(milliseconds: waitTime)); - } else { - /// 说明启动时间超过 [minStartDurationMs],给一点预加载的时间 - emit(AppLoadDone(cost, data)); - await Future.delayed(const Duration(milliseconds: 50)); - } - emit( AppStartSuccess(data)); - } - - void fixError() async { - if (state is AppStartFailed) { - AppStartFailed s = state as AppStartFailed; - emit(AppStartFailed(s.error, s.trace, FixType.fixing)); - try { - /// 处理初始化异步任务 - await repository.fixError(s.error, extra: s.trace); - emit(AppStartFailed(s.error, s.trace, FixType.fixed)); - startApp(); - } catch (e, s) { - emit(AppStartFailed(e, s, FixType.fixError)); - return; - } - } - } -} diff --git a/modules/fx_boot_starter/lib/bloc/ext.dart b/modules/fx_boot_starter/lib/bloc/ext.dart deleted file mode 100644 index e5623dd3..00000000 --- a/modules/fx_boot_starter/lib/bloc/ext.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'bloc.dart'; - -extension FixContext on BuildContext { - void fixStartError() => read>().fixError(); -} diff --git a/modules/fx_boot_starter/lib/bloc/state.dart b/modules/fx_boot_starter/lib/bloc/state.dart deleted file mode 100644 index 6f76c866..00000000 --- a/modules/fx_boot_starter/lib/bloc/state.dart +++ /dev/null @@ -1,33 +0,0 @@ -sealed class AppStatus { - const AppStatus(); -} - -class AppStarting extends AppStatus { - const AppStarting(); -} - -class AppLoadDone extends AppStatus { - final int cost; - final S data; - const AppLoadDone(this.cost, this.data); -} - -class AppStartSuccess extends AppStatus { - final S data; - const AppStartSuccess(this.data); -} - -enum FixType{ - none, - fixing, - fixed, - fixError, -} - -class AppStartFailed extends AppStatus { - final Object error; - final StackTrace trace; - final FixType fix; - - const AppStartFailed(this.error,this.trace, this.fix); -} diff --git a/modules/fx_boot_starter/lib/data/action/app_fix_action.dart b/modules/fx_boot_starter/lib/data/action/app_fix_action.dart deleted file mode 100644 index b78d1021..00000000 --- a/modules/fx_boot_starter/lib/data/action/app_fix_action.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/material.dart'; - -abstract class AppFixAction { - const AppFixAction(); - - /// 初始化修复失败 - void onFixError(BuildContext context, Object error, StackTrace trace); - - /// 初始化修复成功 - void onFixSuccess(BuildContext context); -} diff --git a/modules/fx_boot_starter/lib/data/action/app_start_action.dart b/modules/fx_boot_starter/lib/data/action/app_start_action.dart deleted file mode 100644 index bf7d5491..00000000 --- a/modules/fx_boot_starter/lib/data/action/app_start_action.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; - -abstract class AppStartAction { - const AppStartAction(); - - /// 初始化加载失败 - /// 可跳转失败界面, 引导用户处理启动异常 - void onStartError(BuildContext context, Object error, StackTrace trace); - - /// 初始化加载成功 - /// 可在回调中获得异步加载的 App 配置数据处理 - /// 并做一些首页预加载的逻辑 - void onLoaded(BuildContext context, int cost, S state); - - /// 初始化成功,且达到最低延迟毫秒数 - /// 可跳转应用主界面,正常使用应用 - void onStartSuccess(BuildContext context, S state); - - -} \ No newline at end of file diff --git a/modules/fx_boot_starter/lib/data/repository.dart b/modules/fx_boot_starter/lib/data/repository.dart deleted file mode 100644 index ed25df14..00000000 --- a/modules/fx_boot_starter/lib/data/repository.dart +++ /dev/null @@ -1,10 +0,0 @@ - -abstract class AppStartRepository { - const AppStartRepository(); - - Future initApp(); - - Future fixError(Object error, {Object? extra}); -} - - diff --git a/modules/fx_boot_starter/lib/fx_boot_starter.dart b/modules/fx_boot_starter/lib/fx_boot_starter.dart deleted file mode 100644 index 9171b5ce..00000000 --- a/modules/fx_boot_starter/lib/fx_boot_starter.dart +++ /dev/null @@ -1,12 +0,0 @@ -library fx_boot_starter; - -export 'bloc/bloc.dart'; -export 'bloc/state.dart' hide AppStatus; -export 'bloc/ext.dart'; -export 'data/repository.dart'; -export 'data/action/app_start_action.dart'; -export 'data/action/app_fix_action.dart'; -export 'view/app_start_listener.dart'; -export 'view/app_error_fix_listener.dart'; -export 'view/app_start_scope.dart'; -export 'view/app_error_fix_builder.dart'; \ No newline at end of file diff --git a/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart b/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart deleted file mode 100644 index 5ee0e434..00000000 --- a/modules/fx_boot_starter/lib/view/app_error_fix_builder.dart +++ /dev/null @@ -1,34 +0,0 @@ - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../bloc/bloc.dart'; -import '../bloc/state.dart'; - -class AppFixErrorBuilder extends StatelessWidget { - final WidgetBuilder shouldFix; - final WidgetBuilder loading; - final WidgetBuilder error; - - const AppFixErrorBuilder({ - super.key, - required this.shouldFix, - required this.loading, - required this.error, - }); - - @override - Widget build(BuildContext context) { - return BlocBuilder, AppStatus>(builder: (_,AppStatus state){ - if(state is AppStartFailed){ - if(state.fix==FixType.fixing){ - return loading(context); - } - if(state.fix==FixType.fixError){ - return error(context); - } - } - return shouldFix(context); - }); - } -} diff --git a/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart b/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart deleted file mode 100644 index 4c675f66..00000000 --- a/modules/fx_boot_starter/lib/view/app_error_fix_listener.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../bloc/bloc.dart'; -import '../bloc/state.dart'; -import '../data/action/app_fix_action.dart'; - - - -class AppStartFixListener extends StatelessWidget { - final Widget child; - - const AppStartFixListener({ - super.key, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return BlocListener, AppStatus>( - listenWhen: (p, n) => - (p is AppStartFailed && p.fix == FixType.fixing) && - (n is AppStartFailed), - child: child, - listener: (BuildContext context, AppStatus state) { - if (state is AppStartFailed) { - AppFixAction? action = context.read>().fixAction; - - if (state.fix == FixType.fixed) { - - action?.onFixSuccess(context); - } - if (state.fix == FixType.fixError) { - action?.onFixError(context, state.error, state.trace); - } - } - }, - ); - } -} diff --git a/modules/fx_boot_starter/lib/view/app_start_listener.dart b/modules/fx_boot_starter/lib/view/app_start_listener.dart deleted file mode 100644 index 1f212098..00000000 --- a/modules/fx_boot_starter/lib/view/app_start_listener.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../bloc/bloc.dart'; -import '../bloc/state.dart'; -import '../data/action/app_start_action.dart'; - -class AppStartListener extends StatelessWidget { - final Widget child; - - const AppStartListener({ - super.key, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return BlocListener, AppStatus>( - child: child, - listener: (BuildContext context, AppStatus state) { - AppStartAction action = context.read>().startAction; - if (state is AppLoadDone) { - action.onLoaded(context, state.cost, state.data); - } - if (state is AppStartSuccess) { - action.onStartSuccess(context,state.data); - } - - if (state is AppStartFailed) { - action.onStartError(context,state.error,state.trace); - } - }, - ); - } -} diff --git a/modules/fx_boot_starter/lib/view/app_start_scope.dart b/modules/fx_boot_starter/lib/view/app_start_scope.dart deleted file mode 100644 index fabc8143..00000000 --- a/modules/fx_boot_starter/lib/view/app_start_scope.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../bloc/bloc.dart'; -import '../data/action/app_fix_action.dart'; -import '../data/action/app_start_action.dart'; -import '../data/repository.dart'; - -class AppStartScope extends StatelessWidget { - final AppStartRepository repository; - final AppStartAction appStartAction; - final AppFixAction? fixAction; - final int minStartDurationMs; - - final Widget child; - - const AppStartScope({ - super.key, - required this.repository, - required this.appStartAction, - required this.child, - this.minStartDurationMs = 600, - this.fixAction, - }); - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (BuildContext context) => AppStartBloc( - startAction: appStartAction, - repository: repository, - fixAction: fixAction, - minStartDurationMs: minStartDurationMs, - )..startApp(), - child: child, - ); - } -} diff --git a/modules/fx_boot_starter/pubspec.yaml b/modules/fx_boot_starter/pubspec.yaml deleted file mode 100644 index 1768fa38..00000000 --- a/modules/fx_boot_starter/pubspec.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: fx_boot_starter -description: "a app start package to help handle start easy." -version: 0.0.1 -homepage: https://github.com/TolyFx/fx -repository: https://github.com/TolyFx/fx/tree/main/modules/app_boot_starter - -environment: - sdk: '>=3.0.0 <4.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - # 状态管理 - flutter_bloc: 8.1.6 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^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 packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, 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 in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_boot_starter/test/fx_boot_starter_test.dart b/modules/fx_boot_starter/test/fx_boot_starter_test.dart deleted file mode 100644 index fb559f0d..00000000 --- a/modules/fx_boot_starter/test/fx_boot_starter_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:fx_boot_starter/fx_boot_starter.dart'; - -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } diff --git a/modules/fx_go_router_ext/.gitignore b/modules/fx_go_router_ext/.gitignore deleted file mode 100644 index ac5aa989..00000000 --- a/modules/fx_go_router_ext/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# 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 -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -build/ diff --git a/modules/fx_go_router_ext/.metadata b/modules/fx_go_router_ext/.metadata deleted file mode 100644 index 7e6d66ad..00000000 --- a/modules/fx_go_router_ext/.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: "54e66469a933b60ddf175f858f82eaeb97e48c8d" - channel: "stable" - -project_type: package diff --git a/modules/fx_go_router_ext/CHANGELOG.md b/modules/fx_go_router_ext/CHANGELOG.md deleted file mode 100644 index 41cc7d81..00000000 --- a/modules/fx_go_router_ext/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/modules/fx_go_router_ext/LICENSE b/modules/fx_go_router_ext/LICENSE deleted file mode 100644 index ba75c69f..00000000 --- a/modules/fx_go_router_ext/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/modules/fx_go_router_ext/README.md b/modules/fx_go_router_ext/README.md deleted file mode 100644 index 02fe8eca..00000000 --- a/modules/fx_go_router_ext/README.md +++ /dev/null @@ -1,39 +0,0 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/modules/fx_go_router_ext/analysis_options.yaml b/modules/fx_go_router_ext/analysis_options.yaml deleted file mode 100644 index a5744c1c..00000000 --- a/modules/fx_go_router_ext/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/modules/fx_go_router_ext/lib/fx_go_router_ext.dart b/modules/fx_go_router_ext/lib/fx_go_router_ext.dart deleted file mode 100644 index 31c88c6a..00000000 --- a/modules/fx_go_router_ext/lib/fx_go_router_ext.dart +++ /dev/null @@ -1,7 +0,0 @@ -library fx_go_router_ext; - -export 'package:go_router/go_router.dart'; - -export 'src/listener/listener.dart'; -export 'src/listener/path.dart'; -export 'src/transition/transition.dart'; \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/listener/listener.dart b/modules/fx_go_router_ext/lib/src/listener/listener.dart deleted file mode 100644 index d0db8c4c..00000000 --- a/modules/fx_go_router_ext/lib/src/listener/listener.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Author: 张风捷特烈 -// CreateTime: 2024-05-25 -// Contact Me: 1981462002@qq.com - -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -mixin RouterChangeListenerMixin on State { - late GoRouterDelegate _delegate; - - String get path => '/${_delegate.currentConfiguration.matches.last.matchedLocation}'; - - @override - void initState() { - super.initState(); - _delegate = GoRouter.of(context).routerDelegate; - _delegate.addListener(_onChange); - } - - @override - void dispose() { - _delegate.removeListener(_onChange); - super.dispose(); - } - - void _onChange() { - RouteMatchBase match = _delegate.currentConfiguration.matches.last; - onChangeRoute("/${match.matchedLocation}"); - } - - void onChangeRoute(String path); -} diff --git a/modules/fx_go_router_ext/lib/src/listener/path.dart b/modules/fx_go_router_ext/lib/src/listener/path.dart deleted file mode 100644 index 89442b5f..00000000 --- a/modules/fx_go_router_ext/lib/src/listener/path.dart +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 The 张风捷特烈 . All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Author: 张风捷特烈 -// CreateTime: 2024-05-25 -// Contact Me: 1981462002@qq.com - -import 'package:go_router/go_router.dart'; - -extension GoRouterPath on GoRouter{ - String get path => '/${routerDelegate.currentConfiguration.matches.last.matchedLocation}'; -} - diff --git a/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart b/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart deleted file mode 100644 index d0e9e3f0..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/fade_page_transitions_builder.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -class FadePageTransitionsBuilder extends PageTransitionsBuilder { - const FadePageTransitionsBuilder(); - - @override - Widget buildTransitions( - PageRoute? route, - BuildContext? context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return FadeTransition( - opacity: animation.drive(CurveTween(curve: Curves.easeIn)), - child: child, - ); - } -} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart deleted file mode 100644 index 01b5015f..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/page_route/fade_page_route.dart +++ /dev/null @@ -1,56 +0,0 @@ -//渐变透明路由动画 -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import '../slide_transition/cupertino_back_gesture_detector.dart'; - - -class FadePageRoute extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve? curve; - - FadePageRoute({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child, - ); - } - - if (curve != null) { - animation = CurvedAnimation( - parent: animation, - curve: curve!, - ); - } - - return FadeTransition( - opacity: Tween(begin: 0.1, end: 1.0).animate(animation), - child: child, - ); - } - - @override - Duration get transitionDuration => duration; - - @override - @protected - bool get hasScopedWillPopCallback { - return false; - } -} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart deleted file mode 100644 index 2cb92871..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/page_route/slide_page_route.dart +++ /dev/null @@ -1,50 +0,0 @@ -//右--->左 -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import '../slide_transition/cupertino_back_gesture_detector.dart'; - - - -class SlidePageRoute extends MaterialPageRoute { - final Widget child; - final Duration duration; - - SlidePageRoute({ - required this.child, - this.duration = const Duration(milliseconds: 300), - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child); - } - final bool linearTransition = isPopGestureInProgress(this); - return CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: linearTransition, - child: child, - ); - } - - @override - Duration get transitionDuration => duration; - - @override - @protected - bool get hasScopedWillPopCallback { - return false; - } -} diff --git a/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart b/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart deleted file mode 100644 index a6c0ca8b..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/page_route/zero_page_route.dart +++ /dev/null @@ -1,36 +0,0 @@ - -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import '../slide_transition/cupertino_back_gesture_detector.dart'; - - -class ZeroPageRoute extends MaterialPageRoute { - final Widget child; - - - ZeroPageRoute({ - required this.child, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child, - ); - } - return child; - } - - @override - Duration get transitionDuration => Duration.zero; -} diff --git a/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart b/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart deleted file mode 100644 index f3fa0f5c..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/size_clip_transition.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; - -class SizeClipTransition extends StatelessWidget { - final Animation animation; - final Animation secondaryAnimation; - final Widget child; - - const SizeClipTransition({ - super.key, - required this.animation, - required this.secondaryAnimation, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return ClipPath( - clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), - child: child, - ); - } -} - -class SizePathClipper extends CustomClipper { - final double progress; - - SizePathClipper(this.progress); - - @override - Path getClip(Size size) { - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCenter( - center: Offset(size.width / 2, size.height / 2), - width: size.width * (1 - progress), - height: size.height, - ); - - return Path() - ..addRect(box) - ..addRect(center) - ..fillType = PathFillType.evenOdd; - } - - @override - bool shouldReclip(covariant SizePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} - -class ScalePathClipper extends CustomClipper { - final double progress; - - ScalePathClipper(this.progress); - - @override - Path getClip(Size size) { - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCenter( - center: Offset(size.width / 2, size.height / 2), - width: size.width * (1 - progress), - height: size.height* (1 - progress), - ); - - return Path() - ..addRect(box) - ..addRect(center) - ..fillType = PathFillType.evenOdd; - } - - @override - bool shouldReclip(covariant ScalePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} - -class CirclePathClipper extends CustomClipper { - final double progress; - - CirclePathClipper(this.progress); - - @override - Path getClip(Size size) { - print('progress:$progress'); - if(progress==0){ - return Path(); - } - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCircle( - center: Offset(size.width , 0), - radius: sqrt(size.width*size.width+size.height*size.height) * (progress), - ); - - Path zone = Path()..addRect(box); - Path cliper = Path()..addOval(center); - - return Path.combine(PathOperation.intersect, zone, cliper ); - } - - @override - bool shouldReclip(covariant CirclePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart deleted file mode 100644 index 53bec7e3..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/slide_transition/cupertino_back_gesture_detector.dart +++ /dev/null @@ -1,277 +0,0 @@ -import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -// The maximum time for a page to get reset to it's original position if the -// user releases a page mid swipe. -const int _kMaxPageBackAnimationTime = 300; // Milliseconds. -const double _kBackGestureWidth = 20.0; -const double _kMinFlingVelocity = 1.0; // Screen widths per second. - -// An eyeballed value for the maximum time it takes for a page to animate forward -// if the user releases a page mid swipe. -const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. - -/// This is the widget side of [CupertinoBackGestureController]. -/// -/// This widget provides a gesture recognizer which, when it determines the -/// route can be closed with a back gesture, creates the controller and -/// feeds it the input from the gesture recognizer. -/// -/// The gesture data is converted from absolute coordinates to logical -/// coordinates by this widget. -/// -/// The type `T` specifies the return type of the route with which this gesture -/// detector is associated. -class CupertinoBackGestureDetector extends StatefulWidget { - const CupertinoBackGestureDetector({ - super.key, - required this.enabledCallback, - required this.onStartPopGesture, - required this.child, - }); - - final Widget child; - - final ValueGetter enabledCallback; - - final ValueGetter> onStartPopGesture; - - @override - _CupertinoBackGestureDetectorState createState() => _CupertinoBackGestureDetectorState(); -} - -class _CupertinoBackGestureDetectorState extends State> { - CupertinoBackGestureController? _backGestureController; - - late HorizontalDragGestureRecognizer _recognizer; - - @override - void initState() { - super.initState(); - _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) - ..onStart = _handleDragStart - ..onUpdate = _handleDragUpdate - ..onEnd = _handleDragEnd - ..onCancel = _handleDragCancel; - } - - @override - void dispose() { - _recognizer.dispose(); - super.dispose(); - } - - void _handleDragStart(DragStartDetails details) { - assert(mounted); - assert(_backGestureController == null); - _backGestureController = widget.onStartPopGesture(); - } - - void _handleDragUpdate(DragUpdateDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController!.dragUpdate(_convertToLogical(details.primaryDelta! / context.size!.width)); - } - - void _handleDragEnd(DragEndDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController!.dragEnd(_convertToLogical(details.velocity.pixelsPerSecond.dx / context.size!.width)); - _backGestureController = null; - } - - void _handleDragCancel() { - assert(mounted); - // This can be called even if start is not called, paired with the "down" event - // that we don't consider here. - _backGestureController?.dragEnd(0.0); - _backGestureController = null; - } - - void _handlePointerDown(PointerDownEvent event) { - if (widget.enabledCallback()) { - _recognizer.addPointer(event); - } - } - - double _convertToLogical(double value) { - switch (Directionality.of(context)) { - case TextDirection.rtl: - return -value; - case TextDirection.ltr: - return value; - } - } - - @override - Widget build(BuildContext context) { - assert(debugCheckHasDirectionality(context)); - // For devices with notches, the drag area needs to be larger on the side - // that has the notch. - double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? - MediaQuery.paddingOf(context).left : - MediaQuery.paddingOf(context).right; - dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); - return Stack( - fit: StackFit.passthrough, - children: [ - widget.child, - PositionedDirectional( - start: 0.0, - width: dragAreaWidth, - top: 0.0, - bottom: 0.0, - child: Listener( - onPointerDown: _handlePointerDown, - behavior: HitTestBehavior.translucent, - ), - ), - ], - ); - } -} - - -class CupertinoBackGestureController { - /// Creates a controller for an iOS-style back gesture. - /// - /// The [navigator] and [controller] arguments must not be null. - CupertinoBackGestureController({ - required this.navigator, - required this.controller, - }) { - navigator.didStartUserGesture(); - } - - final AnimationController controller; - final NavigatorState navigator; - - /// The drag gesture has changed by [fractionalDelta]. The total range of the - /// drag should be 0.0 to 1.0. - void dragUpdate(double delta) { - controller.value -= delta; - } - - /// The drag gesture has ended with a horizontal motion of - /// [fractionalVelocity] as a fraction of screen width per second. - void dragEnd(double velocity) { - // Fling in the appropriate direction. - // AnimationController.fling is guaranteed to - // take at least one frame. - // - // This curve has been determined through rigorously eyeballing native iOS - // animations. - const Curve animationCurve = Curves.fastLinearToSlowEaseIn; - final bool animateForward; - - // If the user releases the page before mid screen with sufficient velocity, - // or after mid screen, we should animate the page out. Otherwise, the page - // should be animated back in. - if (velocity.abs() >= _kMinFlingVelocity) { - animateForward = velocity <= 0; - } else { - animateForward = controller.value > 0.5; - } - - if (animateForward) { - // The closer the panel is to dismissing, the shorter the animation is. - // We want to cap the animation time, but we want to use a linear curve - // to determine it. - final int droppedPageForwardAnimationTime = min( - lerpDouble(_kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!.floor(), - _kMaxPageBackAnimationTime, - ); - controller.animateTo(1.0, duration: Duration(milliseconds: droppedPageForwardAnimationTime), curve: animationCurve); - } else { - // This route is destined to pop at this point. Reuse navigator's pop. - navigator.pop(); - - // The popping may have finished inline if already at the target destination. - if (controller.isAnimating) { - // Otherwise, use a custom popping animation duration and curve. - final int droppedPageBackAnimationTime = lerpDouble(0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!.floor(); - controller.animateBack(0.0, duration: Duration(milliseconds: droppedPageBackAnimationTime), curve: animationCurve); - } - } - - if (controller.isAnimating) { - // Keep the userGestureInProgress in true state so we don't change the - // curve of the page transition mid-flight since CupertinoPageTransition - // depends on userGestureInProgress. - late AnimationStatusListener animationStatusCallback; - animationStatusCallback = (AnimationStatus status) { - navigator.didStopUserGesture(); - controller.removeStatusListener(animationStatusCallback); - }; - controller.addStatusListener(animationStatusCallback); - } else { - navigator.didStopUserGesture(); - } - } -} - -// Called by _CupertinoBackGestureDetector when a pop ("back") drag start -// gesture is detected. The returned controller handles all of the subsequent -// drag events. -CupertinoBackGestureController startPopGesture(PageRoute route) { - return CupertinoBackGestureController( - navigator: route.navigator!, - controller: route.controller!, // protected access - ); -} - -bool isPopGestureEnabled(PageRoute route) { - print( - "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); -// If there's nothing to go back to, then obviously we don't support -// the back gesture. - if (route.isFirst) { - return false; - } -// If the route wouldn't actually pop if we popped it, then the gesture -// would be really confusing (or would skip internal routes), so disallow it. - if (route.willHandlePopInternally) { - return false; - } -// If attempts to dismiss this route might be vetoed such as in a page -// with forms, then do not allow the user to dismiss the route with a swipe. - if (route.hasScopedWillPopCallback) { - return false; - } -// Fullscreen dialogs aren't dismissible by back swipe. - if (route.fullscreenDialog) { - return false; - } -// If we're in an animation already, we cannot be manually swiped. - if (route.animation!.status != AnimationStatus.completed) { - return false; - } -// If we're being popped into, we also cannot be swiped until the pop above -// it completes. This translates to our secondary animation being -// dismissed. - if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { - return false; - } -// If we're in a gesture already, we cannot start another. - if (isPopGestureInProgress(route)) { - return false; - } - -// Looks like a back gesture would be welcome! - return true; -} - -/// True if an iOS-style back swipe pop gesture is currently underway for [route]. -/// -/// This just check the route's [NavigatorState.userGestureInProgress]. -/// -/// See also: -/// -/// * [popGestureEnabled], which returns true if a user-triggered pop gesture -/// would be allowed. -bool isPopGestureInProgress(PageRoute route) { - return route.navigator!.userGestureInProgress; -} diff --git a/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart b/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart deleted file mode 100644 index fd027cd4..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/slide_transition/slide_page_transition_builder.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'cupertino_back_gesture_detector.dart'; - -class SlidePageTransitionsBuilder extends PageTransitionsBuilder { - const SlidePageTransitionsBuilder(); - - @override - Widget buildTransitions( - PageRoute? route, - BuildContext? context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(route!), - onStartPopGesture: () => startPopGesture(route!), - child: child); - } - final bool linearTransition = isPopGestureInProgress(route!); - return CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: linearTransition, - child: child, - ); - } -} \ No newline at end of file diff --git a/modules/fx_go_router_ext/lib/src/transition/transition.dart b/modules/fx_go_router_ext/lib/src/transition/transition.dart deleted file mode 100644 index 3197d3fc..00000000 --- a/modules/fx_go_router_ext/lib/src/transition/transition.dart +++ /dev/null @@ -1,7 +0,0 @@ -export 'size_clip_transition.dart'; -export 'fade_page_transitions_builder.dart'; -export 'slide_transition/slide_page_transition_builder.dart'; -export 'slide_transition/cupertino_back_gesture_detector.dart'; -export 'page_route/fade_page_route.dart'; -export 'page_route/slide_page_route.dart'; -export 'page_route/zero_page_route.dart'; \ No newline at end of file diff --git a/modules/fx_go_router_ext/pubspec.yaml b/modules/fx_go_router_ext/pubspec.yaml deleted file mode 100644 index f74adf65..00000000 --- a/modules/fx_go_router_ext/pubspec.yaml +++ /dev/null @@ -1,56 +0,0 @@ -name: fx_go_router_ext -description: "A new Flutter package project." -version: 0.0.1 -homepage: - -environment: - sdk: '>=3.3.4 <4.0.0' - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - # 路由管理 - go_router: ^14.2.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^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 packages. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your package, 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 in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/fx_go_router_ext/test/fx_go_router_ext_test.dart b/modules/fx_go_router_ext/test/fx_go_router_ext_test.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart b/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart index 695b6b52..f0d30323 100644 --- a/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart +++ b/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart @@ -19,7 +19,7 @@ class FindingToolBar extends StatelessWidget implements PreferredSizeWidget{ String name = state.config.algo.name; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 42, diff --git a/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart b/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart index e9366181..eced896c 100644 --- a/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart +++ b/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart @@ -15,7 +15,7 @@ class DeskSortBar extends StatelessWidget { bool isDark = Theme.of(context).brightness == Brightness.dark; String name = SortStateScope.of(context).config.name; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 42, diff --git a/packages/algorithm/pubspec.yaml b/packages/algorithm/pubspec.yaml index 1f23ba95..d32962a7 100644 --- a/packages/algorithm/pubspec.yaml +++ b/packages/algorithm/pubspec.yaml @@ -13,8 +13,7 @@ dependencies: # tolyui tolyui: ^0.0.2+15 - fx_go_router_ext: - path: ../../modules/fx_go_router_ext + fx_go_router_ext: 0.0.2 components: path: ../components diff --git a/packages/app/lib/app.dart b/packages/app/lib/app.dart index 6f4628d7..142e7ac8 100644 --- a/packages/app/lib/app.dart +++ b/packages/app/lib/app.dart @@ -23,8 +23,7 @@ export 'app/style/shape/coupon_shape_border.dart'; export 'app/style/shape/techno_shape.dart'; export 'app/style/behavior/no_scroll_behavior.dart'; -export 'app/platform_adapter/window/windows_adapter.dart'; -export 'app/platform_adapter/views/window_buttons.dart'; +export 'package:fx_platform_adapter/platform_adapter.dart'; export 'app_config/app_config.dart'; diff --git a/packages/app/lib/app/platform_adapter/views/window_buttons.dart b/packages/app/lib/app/platform_adapter/views/window_buttons.dart deleted file mode 100644 index e9250711..00000000 --- a/packages/app/lib/app/platform_adapter/views/window_buttons.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:window_manager/window_manager.dart'; - -class WindowButtons extends StatefulWidget { - final List? actions; - const WindowButtons({Key? key, this.actions}) : super(key: key); - - @override - State createState() => _WindowButtonsState(); -} - -class _WindowButtonsState extends State { - @override - Widget build(BuildContext context) { - if(kIsWeb) return SizedBox(); - Brightness brightness = Theme.of(context).brightness; - return Align( - alignment:Alignment.topRight,child: Wrap( - spacing: 5, - children: [ - if(widget.actions!=null) - ...widget.actions!, - SizedBox( - width: 30, - height: 30, - child: WindowCaptionButton.minimize( - brightness:brightness, - onPressed: () async { - bool isMinimized = await windowManager.isMinimized(); - if (isMinimized) { - windowManager.restore(); - } else { - windowManager.minimize(); - } - }, - ), - ), - SizedBox( - width: 30, - height: 30, - child: FutureBuilder( - future: windowManager.isMaximized(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.data == true) { - return WindowCaptionButton.unmaximize( - brightness: brightness, - onPressed: () async{ - await windowManager.unmaximize(); - setState(() { - - }); - }, - ); - } - return WindowCaptionButton.maximize( - brightness: brightness, - onPressed: () async{ - await windowManager.maximize(); - setState(() { - - }); - }, - ); - }, - ), - ), - SizedBox( - height: 30, - width: 30, - child: WindowCaptionButton.close( - brightness: brightness, - onPressed: () { - windowManager.close(); - }, - ), - ), - ], - ), - ); - } -} diff --git a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart b/packages/app/lib/app/platform_adapter/window/windows_adapter.dart deleted file mode 100644 index dd6a2396..00000000 --- a/packages/app/lib/app/platform_adapter/window/windows_adapter.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:fx_app_env/fx_app_env.dart'; -import 'package:window_manager/window_manager.dart'; - -class WindowsAdapter { - - static Future setSize() async { - if(kIsWeb) return; - if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) { - //仅对桌面端进行尺寸设置 - await windowManager.ensureInitialized(); - WindowOptions windowOptions = const WindowOptions( - size: Size(920,680), - minimumSize: Size(920/2,690/2), - center: true, - backgroundColor: Colors.transparent, - skipTaskbar: false, - titleBarStyle: TitleBarStyle.hidden, - ); - windowManager.waitUntilReadyToShow(windowOptions, () async { - await windowManager.setTitleBarStyle(TitleBarStyle.hidden,windowButtonVisibility: false); - await windowManager.show(); - await windowManager.focus(); - }); - } - } - -} - - -class DragToMoveAreaNoDouble extends StatelessWidget { - final Widget child; - - const DragToMoveAreaNoDouble({ - Key? key, - required this.child, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - if(kAppEnv.isWeb||kAppEnv.isMobile) return child; - return GestureDetector( - behavior: HitTestBehavior.translucent, - onPanStart: (details) { - windowManager.startDragging(); - }, - child: child, - ); - } -} - -class DragToMoveWrapper extends StatelessWidget implements PreferredSizeWidget{ - final PreferredSizeWidget child; - final bool canDouble; - - const DragToMoveWrapper({ - Key? key, - required this.child, - this.canDouble = false - }) : super(key: key); - - @override - Widget build(BuildContext context) { - if(kAppEnv.isWeb||kAppEnv.isMobile) return child; - return GestureDetector( - behavior: HitTestBehavior.translucent, - onDoubleTap: !canDouble?null:() async{ - bool isMax = await windowManager.isMaximized(); - if(isMax){ - windowManager.unmaximize(); - }else{ - windowManager.maximize(); - - } - }, - onPanStart: (details) { - windowManager.startDragging(); - }, - child: child, - ); - } - - @override - Size get preferredSize => child.preferredSize; -} \ No newline at end of file diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index 07a04678..69d2abad 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -14,10 +14,9 @@ dependencies: equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.2 # xml 固化 connectivity_plus: ^6.0.3 - window_manager: ^0.3.9 #桌面尺寸 url_launcher: ^6.1.14 # url - fx_app_env: - path: ../../modules/fx_app_env + fx_platform_adapter: ^0.0.2 # 平台适配器 + storage: path: ../storage widget_module: diff --git a/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart index f543e69d..c7e330cf 100644 --- a/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart +++ b/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -116,7 +116,7 @@ class SimpleDeskTopBar extends StatelessWidget { bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( height: height, color: isDark? Color(0xff2C3036):Colors.white, diff --git a/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart b/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart index 9f7e2e1b..35c5ac74 100644 --- a/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart +++ b/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart @@ -20,7 +20,7 @@ class IssuesDetailPage extends StatelessWidget { return Scaffold( appBar: PreferredSize( preferredSize: Size(0,kToolbarHeight), - child: DragToMoveAreaNoDouble( + child: DragToMoveWrapper( child: AppBar( centerTitle: false, title: const Text('Flutter 要点集录'), diff --git a/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart index b77e2589..4f562adb 100644 --- a/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart @@ -10,7 +10,7 @@ class DeskAccountTopBar extends StatelessWidget { Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( height: 64, color: isDark ? Color(0xff2C3036) : Colors.white, diff --git a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart index c388aa16..ffe8ed26 100644 --- a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart @@ -39,7 +39,7 @@ class _DeskKnowledgeTabTopBarState extends State bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Stack( children: [ Container( diff --git a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart index cb8d1a79..43538426 100644 --- a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart @@ -10,7 +10,7 @@ class SimpleDeskTopBar extends StatelessWidget { Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( height: 64, color: isDark ? Color(0xff2C3036) : Colors.white, diff --git a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart index c9def73f..ad52487f 100644 --- a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart +++ b/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart @@ -38,7 +38,7 @@ class _DeskTabTopBarState extends State with TickerProviderState bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( height: 64, color: isDark?Color(0xff2C3036):Colors.white, diff --git a/packages/treasure_tools/lib/src/desk_widget_top_bar.dart b/packages/treasure_tools/lib/src/desk_widget_top_bar.dart index eef6b0c0..cd337ba8 100644 --- a/packages/treasure_tools/lib/src/desk_widget_top_bar.dart +++ b/packages/treasure_tools/lib/src/desk_widget_top_bar.dart @@ -30,7 +30,7 @@ class _DeskCodeGenTopBarState extends State with SingleTicke Color themeColor = Theme.of(context).primaryColor; bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( height: 64, color: isDark?Color(0xff2C3036):Colors.white, diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart index e27bae43..5144f7ef 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart @@ -33,7 +33,7 @@ class DeskSliverWidgetDetailBar extends StatelessWidget { iconTheme: IconThemeData(color: isDark?appBarTextColor:Color(0xff696969)), expandedHeight: 120.0, scrolledUnderElevation: 0.5, - flexibleSpace: DragToMoveAreaNoDouble( + flexibleSpace: DragToMoveWrapper( child: DiyFlexibleSpaceBar( centerTitle: false, expandedTitleScale: 2, diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart index 36a144bd..a8908c88 100644 --- a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart +++ b/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart @@ -40,7 +40,7 @@ class _DeskWidgetTopBarState extends State with SingleTickerP Color themeColor = Theme.of(context).primaryColor; bool isDark = Theme.of(context).brightness == Brightness.dark; - return DragToMoveAreaNoDouble( + return DragToMoveWrapper( child: Container( padding: const EdgeInsets.only(left: 20), height: 64, diff --git a/pubspec.lock b/pubspec.lock index 72a303d9..9cae2d51 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,43 +302,46 @@ packages: description: flutter source: sdk version: "0.0.0" - fx_app_env: - dependency: "direct main" - description: - path: "modules/fx_app_env" - relative: true - source: path - version: "0.0.1" fx_boot_starter: dependency: "direct main" description: - path: "modules/fx_boot_starter" - relative: true - source: path + name: fx_boot_starter + sha256: "1498d9689ee12762537c2988470e0d9a6518eeb046671b7b2d377e420f9d6419" + url: "https://pub.flutter-io.cn/" + source: hosted version: "0.0.1" fx_dao: dependency: transitive description: name: fx_dao - sha256: df5e2eb94c66e78f737c662d864a1a2067d4712ac03ba884530479c2de2baba3 + sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.1" + version: "0.0.1+2" fx_go_router_ext: dependency: transitive description: - path: "modules/fx_go_router_ext" - relative: true - source: path - version: "0.0.1" + name: fx_go_router_ext + sha256: "982aa2c7618075fd458ad50b6779578bfdff3376745320d4cb6d2dda31ddabc3" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2" + fx_platform_adapter: + dependency: "direct main" + description: + name: fx_platform_adapter + sha256: "04b954f658e1c380abf11dee93265396147f953f5b02cbf9621c7fddab21f9c3" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2" go_router: dependency: "direct main" description: name: go_router - sha256: cdae1b9c8bd7efadcef6112e81c903662ef2ce105cbd220a04bbb7c3425b5554 + sha256: "2ddb88e9ad56ae15ee144ed10e33886777eb5ca2509a914850a5faa7b52ff459" url: "https://pub.flutter-io.cn/" source: hosted - version: "14.2.0" + version: "14.2.7" http: dependency: transitive description: @@ -872,26 +875,26 @@ packages: dependency: transitive description: name: tolyui_feedback - sha256: "0efc505b83fbb3546344a9c94988938954c11f8680a9ed9e226ff82fe924053d" + sha256: "0d76846141e3ea0d2172d87508f7f6a98a79204611aa0d2519eb5c064d905bf1" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.4+4" + version: "0.3.4+7" tolyui_message: dependency: transitive description: name: tolyui_message - sha256: eb611cc7ed05aac4c962d6f2af2d71e32515f9e17aafbc45b00fe6fcb60db4db + sha256: "4e9046d65d1a5f98f0ebd423815be683c7fbf637caa9e0bf88d83148b42764cb" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.2.1" + version: "0.2.2" tolyui_navigation: dependency: transitive description: name: tolyui_navigation - sha256: "2b1c323962903406370367d2e637a785399a568554c77d87d405da8df33f79cb" + sha256: b18ba71e890313ad0494c3a77754f8df36224dc6201a050bbb14764d22e5c6f4 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.8+6" + version: "0.0.8+9" tolyui_rx_layout: dependency: transitive description: @@ -907,6 +910,14 @@ packages: relative: true source: path version: "0.0.1" + two_dimensional_scrollables: + dependency: "direct main" + description: + name: two_dimensional_scrollables + sha256: "7c3650cc1cc5fa8a9b003e2fd350b049fba1aaa3ed419ad6312ff124bb7a6d38" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.3.1" typed_data: dependency: transitive description: @@ -1100,10 +1111,10 @@ packages: dependency: transitive description: name: window_manager - sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" + sha256: ab8b2a7f97543d3db2b506c9d875e637149d48ee0c6a5cb5f5fd6e0dac463792 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.9" + version: "0.4.2" wrapper: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 23398686..4cd9fb5e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,11 +20,11 @@ dependencies: flutter_bloc: ^8.1.6 # 状态管理 equatable: ^2.0.5 # 相等辅助 stream_transform: ^2.1.0 + two_dimensional_scrollables: ^0.3.1 - ## fx 架构 - app 启动器 - fx_boot_starter: 0.0.1 - fx_app_env: - path: modules/fx_app_env + ## fx 架构 + fx_boot_starter: 0.0.1 # app 启动器 + fx_platform_adapter: 0.0.2 ## tolyui tolyui: ^0.0.2+15 @@ -39,6 +39,7 @@ dependencies: shared_preferences: ^2.2.3 # xml 固化 path_provider: ^2.1.3 # 路径 + dio: ^5.4.3+1 # 网络请求 jwt_decoder: ^2.0.1 # jwt 解析 connectivity_plus: ^6.0.3 @@ -96,8 +97,6 @@ dev_dependencies: flutter_lints: ^1.0.0 dependency_overrides: - fx_boot_starter: - path: modules/fx_boot_starter web: ^1.0.0 flutter: From b079f2b8a458ece726747a80838aaf8772002a9a Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 31 Aug 2024 08:10:10 +0800 Subject: [PATCH 080/149] readme --- README.md | 14 +++++++------- lib/app_stater/impl/start_repository.dart | 2 +- lib/navigation/menus/menu_meta.dart | 23 ----------------------- 3 files changed, 8 insertions(+), 31 deletions(-) delete mode 100644 lib/navigation/menus/menu_meta.dart diff --git a/README.md b/README.md index 003bb476..78f7ee78 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ ### FlutterUnit 全平台下载体验: -| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 | -|------|--------------------------------------------------------------------------------------------------------------|------|------------| -| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) |[flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip) | [flutter_unit](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| -| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| +| 平台类型 | 下载地址 | 相关文章 | +|------|--------------------------------------------------------------------------------------------------------------|------------| +| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) | [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) | [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) | [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip)| [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| Web版 | http://toly1994.com/flutter/ | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| #### Flutter Unit 周边 diff --git a/lib/app_stater/impl/start_repository.dart b/lib/app_stater/impl/start_repository.dart index ed7530db..8635e9c6 100644 --- a/lib/app_stater/impl/start_repository.dart +++ b/lib/app_stater/impl/start_repository.dart @@ -19,7 +19,7 @@ class AppStartRepositoryImpl implements AppStartRepository { @override Future initApp() async { WidgetsFlutterBinding.ensureInitialized(); - //滚动性能优化 1.22.0 + // 滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; WindowSizeAdapter.setSize(); await SpStorage.instance.initSp(); diff --git a/lib/navigation/menus/menu_meta.dart b/lib/navigation/menus/menu_meta.dart deleted file mode 100644 index 34032961..00000000 --- a/lib/navigation/menus/menu_meta.dart +++ /dev/null @@ -1,23 +0,0 @@ - - -import 'package:flutter/material.dart'; - -class MenuMeta { - // 标签 - final String label; - - final String? path; - - // 图标数据 - final IconData icon; - - // 图标颜色 - final Color? color; - - const MenuMeta({ - required this.label, - this.path, - required this.icon, - this.color, - }); -} From 78eccd805e56b235c801eaee96bdc5dbf6aab90a Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 8 Sep 2024 15:52:08 +0800 Subject: [PATCH 081/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analysis_options.yaml | 20 +-- lib/main.dart | 25 +-- lib/stater/boot_start.dart | 21 +++ .../logic}/app_start_action.dart | 0 .../logic/app_start_repository.dart} | 0 .../view/error/app_start_error.dart | 0 .../view/splash/Flutter_unit_splash.dart} | 40 +++-- .../view/splash/flutter_unit_text.dart | 0 lib/{app => structure}/flutter_unit.dart | 5 +- .../navigation/router}/app_route.dart | 4 +- .../navigation/router}/desk_route.dart | 14 +- .../navigation/router}/mobile_route.dart | 11 +- .../flutter_unit_desk_navigation.dart | 0 .../views/desktop}/menu_bar_leading.dart | 0 .../views/desktop}/menu_bar_tail.dart | 0 .../desktop}/theme_model_switch_icon.dart | 0 .../views/desktop}/toly_unit_menu_cell.dart | 0 .../navigation/views/pure_bottom_bar.dart | 0 .../navigation/views/unit_navigation.dart | 0 .../wrapper}/bloc_wrapper.dart | 4 +- .../wrapper}/overlay_tool_wrapper.dart | 0 .../basic_system/app}/.gitignore | 0 .../basic_system}/app/.metadata | 0 .../basic_system/app}/CHANGELOG.md | 0 .../basic_system/app}/LICENSE | 0 .../basic_system/app}/README.md | 0 .../basic_system/app}/analysis_options.yaml | 0 .../basic_system}/app/lib/app.dart | 4 +- .../app/lib/app/action/action.dart | 0 .../basic_system}/app/lib/app/action/url.dart | 0 .../basic_system}/app/lib/app/cons/cons.dart | 0 .../app/lib/app/cons/global_value.dart | 0 .../app/lib/app/cons/path_unit.dart | 0 .../basic_system}/app/lib/app/cons/sp.dart | 0 .../app/lib/app/cons/str_unit.dart | 0 .../app/lib/app/res/toly_icon.dart | 0 .../app/lib/app/router/fade_page_route.dart | 0 .../app/lib/app/router/slide_page_route.dart | 0 .../app/lib/app/router/zero_page_route.dart | 0 .../style/behavior/no_scroll_behavior.dart | 4 +- .../basic_system}/app/lib/app/style/gap.dart | 0 .../app/style/shape/coupon_shape_border.dart | 0 .../app/lib/app/style/shape/techno_shape.dart | 0 .../fade_page_transitions_builder.dart | 0 .../transition/size_clip_transition.dart | 0 .../cupertino_back_gesture_detector.dart | 0 .../slide_page_transition_builder.dart | 0 .../app/lib/app/style/unit_color.dart | 0 .../app/lib/app/style/unit_text_style.dart | 0 .../app/lib/app/theme/app_theme.dart | 0 .../app/lib/app/theme/size_unit.dart | 0 .../app/lib/app_config/app_config.dart | 0 .../app/lib/app_config/bloc/bloc.dart | 0 .../app/lib/app_config/bloc/state.dart | 0 .../lib/app_config/repository/repository.dart | 0 .../app/lib/app_update/bloc/bloc.dart | 0 .../app/lib/app_update/bloc/event.dart | 0 .../app/lib/app_update/bloc/state.dart | 0 .../app/lib/view}/about/about_app_page.dart | 3 +- .../app/lib/view}/about/about_me_page.dart | 0 .../view}/about/version/version_shower.dart | 0 .../app/lib/view}/about/version_info.dart | 0 .../view}/account/desk/desk_account_page.dart | 37 ++-- .../account/desk/sliver_cellection_panel.dart | 0 .../view}/account/desk/sliver_list_panel.dart | 0 .../account/desk/sliver_share_panel.dart | 0 .../lib/view}/account/desk/user_header.dart | 0 .../view}/data_manage/data_manage_page.dart | 0 .../lib/view}/setting/app_style_setting.dart | 0 .../lib/view}/setting/code_style_setting.dart | 0 .../app/lib/view}/setting/font_setting.dart | 0 .../lib/view}/setting/item_style_setting.dart | 0 .../lib/view}/setting/language_setting.dart | 0 .../app/lib/view}/setting/setting_page.dart | 41 ++--- .../view}/setting/theme_color_setting.dart | 0 .../view}/setting/theme_model_setting.dart | 0 .../lib/view}/unit_todo/attr_unit_page.dart | 0 .../lib/view}/unit_todo/layout_unit_page.dart | 0 .../lib/view}/unit_todo/paint_unit_page.dart | 0 .../lib/view}/unit_todo/point_unit_page.dart | 0 modules/basic_system/app/lib/view/view.dart | 13 ++ .../basic_system}/app/pubspec.yaml | 3 +- .../app/test/app_config_test.dart | 0 .../basic_system/app_update}/.gitignore | 0 .../basic_system}/app_update/.metadata | 0 .../basic_system/app_update}/CHANGELOG.md | 0 .../basic_system/app_update}/LICENSE | 0 .../basic_system/app_update}/README.md | 0 .../app_update}/analysis_options.yaml | 0 .../app_update/lib/app_update.dart | 0 .../app_update/lib/bloc/bloc.dart | 0 .../app_update/lib/bloc/event.dart | 0 .../app_update/lib/bloc/state.dart | 0 .../app_update/lib/model/app_info.dart | 0 .../lib/views/app_update_panel.dart | 0 .../lib/views/update_red_point.dart | 0 .../basic_system}/app_update/pubspec.yaml | 2 +- .../app_update/test/app_update_test.dart | 0 .../basic_system/authentication}/.gitignore | 0 .../basic_system}/authentication/.metadata | 0 .../basic_system/authentication}/CHANGELOG.md | 0 .../basic_system/authentication}/LICENSE | 0 .../basic_system/authentication}/README.md | 0 .../authentication}/analysis_options.yaml | 0 .../authentication/lib/authentication.dart | 0 .../lib/blocs/authentic/bloc.dart | 0 .../lib/blocs/authentic/event.dart | 0 .../lib/blocs/authentic/state.dart | 0 .../lib/blocs/register/bloc.dart | 0 .../lib/blocs/register/event.dart | 0 .../lib/blocs/register/state.dart | 0 .../authentication/lib/blocs/user/bloc.dart | 0 .../authentication/lib/blocs/user/state.dart | 0 .../authentication/lib/models/user.dart | 0 .../lib/repository/auth_repository.dart | 0 .../repository/impl/http_auth_repository.dart | 0 .../lib/views/authentic_widget.dart | 0 .../lib/views/mobile/login/login_form.dart | 0 .../lib/views/mobile/login/login_page.dart | 0 .../views/mobile/register/arc_clipper.dart | 0 .../views/mobile/register/register_page.dart | 0 .../lib/views/mobile/register/send_code.dart | 0 .../lib/views/mobile/user/page_item.dart | 0 .../lib/views/mobile/user/support_me.dart | 0 .../views/mobile/user/unit_drawer_header.dart | 0 .../lib/views/mobile/user/user_account.dart | 50 +++--- .../lib/views/mobile/user/user_page.dart | 0 .../basic_system}/authentication/pubspec.yaml | 0 .../test/authentication_test.dart | 0 .../basic_system/components}/.gitignore | 0 .../basic_system}/components/.metadata | 0 .../basic_system/components}/CHANGELOG.md | 0 .../basic_system/components}/LICENSE | 0 .../basic_system/components}/README.md | 0 .../components}/analysis_options.yaml | 0 .../components/lib/components.dart | 0 .../flutter_ui/diy_flexible_space_bar.dart | 0 .../components/lib/flutter_ui/flutter_ui.dart | 0 .../lib/flutter_ui/no_div_expansion_tile.dart | 0 .../lib/flutter_ui/toly_date_picker.dart | 0 .../project_ui/default/empty_search_page.dart | 0 .../lib/project_ui/default/empty_shower.dart | 0 .../lib/project_ui/default/error_page.dart | 0 .../lib/project_ui/default/error_shower.dart | 2 +- .../project_ui/default/loading_shower.dart | 0 .../project_ui/default/no_more_widget.dart | 0 .../components/lib/project_ui/project_ui.dart | 2 +- .../time_line/flutter_unit_time_line.dart | 0 .../time_line/model/time_node.dart | 0 .../top_bar/desk_account_top_bar.dart | 0 .../top_bar/desk_knowledge_top_bar.dart | 4 +- .../top_bar/desk_simple_top_bar.dart | 2 +- .../project_ui/top_bar/desk_tab_top_bar.dart | 8 +- .../lib/project_ui/unit_app_bar.dart | 0 .../project_ui/wrapper/honour_wrapper.dart | 0 .../basic_system}/components/pubspec.yaml | 3 + .../components/test/components_test.dart | 0 .../basic_system/l10n}/.gitignore | 0 .../basic_system}/l10n/.metadata | 0 .../basic_system/l10n}/CHANGELOG.md | 0 .../basic_system/l10n}/LICENSE | 0 .../basic_system/l10n}/README.md | 0 .../basic_system/l10n}/analysis_options.yaml | 0 .../basic_system}/l10n/l10n.yaml | 0 .../basic_system}/l10n/l10n_copy.sh | 0 .../basic_system}/l10n/lib/arb/app_en.arb | 0 .../basic_system}/l10n/lib/arb/app_zh.arb | 0 .../basic_system}/l10n/lib/enum/language.dart | 0 .../basic_system}/l10n/lib/ext.dart | 0 .../l10n/lib/gen_l10n/app_localizations.dart | 0 .../lib/gen_l10n/app_localizations_en.dart | 0 .../lib/gen_l10n/app_localizations_zh.dart | 0 .../basic_system}/l10n/lib/l10n.dart | 0 .../basic_system}/l10n/pubspec.yaml | 0 .../basic_system}/l10n/test/l10n_copy.dart | 0 .../basic_system}/l10n/test/l10n_test.dart | 0 .../basic_system/storage}/.gitignore | 0 .../basic_system/storage}/.metadata | 0 .../basic_system/storage}/CHANGELOG.md | 0 .../basic_system/storage}/LICENSE | 0 .../basic_system/storage}/README.md | 0 .../storage}/analysis_options.yaml | 0 .../storage/lib/src/app_storage.dart | 0 .../db_storage/flutter/dao/article_dao.dart | 0 .../db_storage/flutter/dao/category_dao.dart | 0 .../db_storage/flutter/dao/columnize_dao.dart | 0 .../src/db_storage/flutter/dao/like_dao.dart | 0 .../src/db_storage/flutter/dao/node_dao.dart | 0 .../db_storage/flutter/dao/widget_dao.dart | 0 .../lib/src/db_storage/flutter/flutter.dart | 0 .../db_storage/flutter/flutter_db_store.dart | 0 .../src/db_storage/flutter/model/article.dart | 0 .../db_storage/flutter/model/category_po.dart | 0 .../db_storage/flutter/model/columnize.dart | 0 .../src/db_storage/flutter/model/enums.dart | 0 .../src/db_storage/flutter/model/node_po.dart | 0 .../flutter/model/widget_filter.dart | 0 .../db_storage/flutter/model/widget_po.dart | 0 .../flutter_unit/dao/cache_dao.dart | 0 .../db_storage/flutter_unit/flutter_unit.dart | 0 .../flutter_unit/flutter_unit_db_store.dart | 0 .../flutter_unit/model/cache_po.dart | 0 .../storage/lib/src/db_storage/storage.dart | 0 .../src/sp_storage/cao/app_config_cao.dart | 0 .../storage/lib/src/sp_storage/exp.dart | 0 .../src/sp_storage/models/app_config_po.dart | 0 .../lib/src/sp_storage/sp_storage.dart | 0 .../basic_system}/storage/lib/storage.dart | 0 .../basic_system}/storage/pubspec.yaml | 0 .../storage/test/db_storage_test.dart | 0 .../basic_system/toly_ui}/.gitignore | 0 .../basic_system/toly_ui}/.metadata | 0 .../basic_system/toly_ui}/CHANGELOG.md | 0 .../basic_system/toly_ui}/LICENSE | 0 .../basic_system/toly_ui}/README.md | 0 .../toly_ui}/analysis_options.yaml | 0 .../lib/adapter/platform_view_adapter.dart | 0 .../toly_ui/lib/button/feedback_widget.dart | 0 .../basic_system}/toly_ui/lib/code/code.dart | 0 .../toly_ui/lib/code/code_widget.dart | 0 .../toly_ui/lib/code/high_light_code.dart | 0 .../toly_ui/lib/code/highlighter_style.dart | 0 .../lib/code/language/dart_languge.dart | 0 .../toly_ui/lib/code/language/language.dart | 0 .../decorations/round_rect_rab_indicator.dart | 0 .../lib/default/loading/planet_loading.dart | 0 .../lib/dialog/alert_conform_dialog.dart | 0 .../lib/dialog/delete_message_panel.dart | 0 .../toly_ui/lib/input/edit_panel.dart | 0 .../toly_ui/lib/input/icon_input.dart | 0 .../toly_ui/lib/input/input_button.dart | 0 .../toly_ui/lib/markdown/markdown_widget.dart | 0 .../toly_ui/lib/markdown/md_text_styles.dart | 0 .../lib/markdown/syntax_high_lighter.dart | 0 .../toly_ui/lib/object/windmill.dart | 0 .../lib/popable/drop_selectable_widget.dart | 0 .../toly_ui/lib/selector/burst_menu.dart | 0 .../toly_ui/lib/selector/color_chooser.dart | 0 .../lib/selector/multi_chip_filter.dart | 0 .../sliver_header/sliver_pinned_header.dart | 0 .../lib/sliver_header/sliver_snap_header.dart | 0 .../basic_system}/toly_ui/lib/ti/circle.dart | 0 .../toly_ui/lib/ti/circle_image.dart | 0 .../toly_ui/lib/ti/circle_text.dart | 0 .../toly_ui/lib/ti/color_wrapper.dart | 0 .../toly_ui/lib/ti/math_runner.dart | 0 .../basic_system}/toly_ui/lib/ti/panel.dart | 0 .../basic_system}/toly_ui/lib/ti/tag.dart | 0 .../toly_ui/lib/ti/text_typer.dart | 0 .../toly_ui/lib/ti/toly_switch_list_tile.dart | 0 .../basic_system}/toly_ui/lib/toly_ui.dart | 0 .../basic_system}/toly_ui/pubspec.yaml | 0 .../toly_ui/test/toly_ui_test.dart | 0 .../basic_system/utils}/.gitignore | 0 .../basic_system/utils}/.metadata | 0 .../basic_system/utils}/CHANGELOG.md | 0 .../basic_system/utils}/LICENSE | 0 .../basic_system/utils}/README.md | 0 .../basic_system/utils}/analysis_options.yaml | 0 .../utils/lib/src/color_utils.dart | 0 .../utils/lib/src/convert_man.dart | 0 .../utils/lib/src/http_utils/http_util.dart | 0 .../utils/lib/src/http_utils/http_utils.dart | 0 .../lib/src/http_utils/logs_interceptor.dart | 0 .../src/http_utils/response_interceptor.dart | 0 .../utils/lib/src/http_utils/task_result.dart | 0 .../lib/src/http_utils/token_interceptor.dart | 0 .../utils/lib/src/random_provider.dart | 0 .../basic_system}/utils/lib/src/toast.dart | 0 .../basic_system}/utils/lib/utils.dart | 0 .../basic_system}/utils/pubspec.yaml | 0 .../basic_system/utils}/test/utils_test.dart | 0 .../knowledge_system/algorithm}/.gitignore | 0 .../knowledge_system/algorithm}/.metadata | 0 .../knowledge_system/algorithm}/CHANGELOG.md | 0 .../knowledge_system/algorithm}/LICENSE | 0 .../knowledge_system/algorithm}/README.md | 0 .../algorithm}/analysis_options.yaml | 0 .../algorithm/lib/algorithm.dart | 0 .../lib/src/algorithm/finding/functions.dart | 0 .../algorithm/finding/functions/AStar.dart | 0 .../src/algorithm/finding/functions/BFS.dart | 0 .../algorithm/finding/functions/BestFS.dart | 0 .../src/algorithm/finding/functions/DFS.dart | 0 .../algorithm/finding/functions/dijkstra.dart | 0 .../lib/src/algorithm/sort/functions.dart | 0 .../src/algorithm/sort/functions/bubble.dart | 0 .../algorithm/sort/functions/cocktail.dart | 0 .../src/algorithm/sort/functions/comb.dart | 0 .../src/algorithm/sort/functions/cycle.dart | 0 .../src/algorithm/sort/functions/gnome.dart | 0 .../src/algorithm/sort/functions/heap.dart | 0 .../algorithm/sort/functions/insertion.dart | 0 .../src/algorithm/sort/functions/merge.dart | 0 .../src/algorithm/sort/functions/oddEven.dart | 0 .../algorithm/sort/functions/pigeonHole.dart | 0 .../src/algorithm/sort/functions/quick.dart | 0 .../algorithm/sort/functions/selection.dart | 0 .../src/algorithm/sort/functions/shell.dart | 0 .../lib/src/data_scope/sort_config.dart | 0 .../algorithm/lib/src/data_scope/state.dart | 0 .../finding/data_scope/finding_config.dart | 0 .../src/finding/data_scope/finding_state.dart | 0 .../lib/src/finding/data_scope/position.dart | 0 .../src/finding/data_scope/random_queue.dart | 0 .../algorithm/lib/src/finding/view/board.dart | 0 .../lib/src/finding/view/finding_page.dart | 0 .../src/finding/view/finding_tool_bar.dart | 0 .../lib/src/navigation/menu/algo_menu.dart | 0 .../lib/src/navigation/menu/finding.dart | 0 .../lib/src/navigation/menu/sort.dart | 0 .../lib/src/navigation/router/router.dart | 0 .../navigation/view/algo_desk_navigation.dart | 0 .../src/navigation/view/algo_menu_cell.dart | 0 .../src/navigation/view/algo_menu_tree.dart | 1 - .../algorithm/lib/src/views/algo_page.dart | 0 .../src/views/desktop/desk_algo_panel.dart | 1 - .../lib/src/views/sort/data_painter.dart | 0 .../lib/src/views/sort/sort_page.dart | 0 .../lib/src/views/sort/sort_parper.dart | 0 .../lib/src/views/sort/sort_setting.dart | 0 .../lib/src/views/sort/top_bar/sort_bar.dart | 0 .../src/views/sort/top_bar/sort_button.dart | 1 - .../knowledge_system}/algorithm/pubspec.yaml | 7 +- .../algorithm}/test/utils_test.dart | 0 .../knowledge_system/artifact}/.gitignore | 0 .../knowledge_system/artifact}/.metadata | 0 .../knowledge_system/artifact}/CHANGELOG.md | 0 .../knowledge_system/artifact}/LICENSE | 0 .../knowledge_system/artifact}/README.md | 0 .../artifact}/analysis_options.yaml | 0 .../artifact/lib/artifact.dart | 0 .../lib/src/articles/bloc/article/bloc.dart | 0 .../lib/src/articles/bloc/columnize/bloc.dart | 0 .../artifact/lib/src/articles/bloc/exp.dart | 0 .../artifact/lib/src/articles/data/exp.dart | 0 .../data/repository/article_repository.dart | 0 .../data/repository/columnize_repository.dart | 0 .../view/article/article_detail_page.dart | 0 .../view/article/column_detail_page.dart | 0 .../view/article/columnize_page_view.dart | 0 .../articles/view/article/sliver_article.dart | 24 +-- .../view/article/sliver_columnize.dart | 0 .../article/toly_article_scroll_page.dart | 0 .../lib/src/articles/view/artifact_page.dart | 0 .../view/building/building_panel.dart | 0 .../src/articles/view/desk_artifact_page.dart | 0 .../articles/view/toly_refresh_indicator.dart | 0 .../src/articles/view/wrapper/refresh.dart | 0 .../points/bloc/point_bloc/point_bloc.dart | 0 .../points/bloc/point_bloc/point_event.dart | 0 .../points/bloc/point_bloc/point_state.dart | 0 .../point_comment_bloc.dart | 0 .../point_comment_event.dart | 0 .../point_comment_state.dart | 0 .../src/points/bloc/point_system_bloc.dart | 0 .../lib/src/points/data/api/app_info.dart | 0 .../lib/src/points/data/api/category_api.dart | 0 .../lib/src/points/data/api/issues_api.dart | 0 .../src/points/data/model/github_model.dart | 0 .../src/points/data/model/github_user.dart | 0 .../lib/src/points/data/model/issue.dart | 0 .../src/points/data/model/issue_comment.dart | 0 .../lib/src/points/data/model/license.dart | 0 .../lib/src/points/data/model/repository.dart | 0 .../data/model/repository_permissions.dart | 0 .../artifact/lib/src/points/exp.dart | 0 .../points/view/desk_ui/desk_point_page.dart | 0 .../view/desk_ui/github_repo_panel.dart | 0 .../points/view/issues_point/issue_item.dart | 0 .../view/issues_point/issues_detail.dart | 0 .../view/issues_point/issues_point_page.dart | 0 .../points/view/issues_point/repo_widget.dart | 0 .../knowledge_system}/artifact/pubspec.yaml | 12 +- .../artifact}/test/utils_test.dart | 0 .../knowledge_system/awesome}/.gitignore | 0 .../knowledge_system/awesome}/.metadata | 0 .../knowledge_system/awesome}/CHANGELOG.md | 0 .../knowledge_system/awesome}/LICENSE | 0 .../knowledge_system/awesome}/README.md | 0 .../awesome}/analysis_options.yaml | 0 .../awesome/lib/awesome.dart | 0 .../listenable/change_notifier_01/main.dart | 0 .../notifier/progress_value_notifier.dart | 0 .../page/detail/detail_progress_view.dart | 0 .../page/detail/download_detail.dart | 0 .../page/home/home_page.dart | 0 .../page/home/home_progress_view.dart | 0 .../listenable/change_notifier_02/main.dart | 0 .../notifier/download_data_scope.dart | 0 .../notifier/progress_value_notifier.dart | 0 .../page/detail/detail_progress_view.dart | 0 .../page/detail/download_detail.dart | 0 .../page/home/home_page.dart | 0 .../page/home/home_progress_view.dart | 0 .../knowledge_system}/awesome/pubspec.yaml | 0 .../awesome/test/awesome_test.dart | 0 .../knowledge_system}/layout/.gitignore | 0 .../knowledge_system}/layout/.metadata | 0 .../knowledge_system/layout}/CHANGELOG.md | 0 .../knowledge_system/layout}/LICENSE | 0 .../knowledge_system/layout}/README.md | 0 .../layout}/analysis_options.yaml | 0 .../knowledge_system}/layout/lib/layout.dart | 0 .../layout/lib/src/bloc/display_logic.dart | 0 .../layout/lib/src/bloc/display_state.dart | 0 .../layout/lib/src/data/display_map/base.dart | 0 .../lib/src/data/display_map/display_map.dart | 0 .../lib/src/data/display_map/funny.dart | 0 .../lib/src/data/display_map/multi.dart | 0 .../lib/src/data/model/display_frame.dart | 0 .../lib/src/ext/go_router/listener.dart | 0 .../layout/lib/src/ext/go_router/path.dart | 0 .../lib/src/navigation/menu/base_layout.dart | 0 .../layout/lib/src/navigation/menu/funny.dart | 0 .../lib/src/navigation/menu/layout.dart | 0 .../navigation/menu/menu_repository_impl.dart | 0 .../layout/lib/src/navigation/menu/multi.dart | 0 .../lib/src/navigation/menu/popable.dart | 0 .../lib/src/navigation/menu/scroll.dart | 0 .../lib/src/navigation/router/app_router.dart | 0 .../src/navigation/router/desk_router.dart | 0 .../fade_page_transitions_builder.dart | 0 .../page_route/fade_page_route.dart | 0 .../page_route/slide_page_route.dart | 0 .../page_route/zero_page_route.dart | 0 .../transition/size_clip_transition.dart | 0 .../cupertino_back_gesture_detector.dart | 0 .../slide_page_transition_builder.dart | 0 .../navigation/view/app_desk_navigation.dart | 0 .../src/navigation/view/app_menu_tree.dart | 0 .../lib/src/views/base/align/align_show.dart | 0 .../lib/src/views/base/align/align_show2.dart | 0 .../src/views/base/padding/inner_padding.dart | 0 .../src/views/base/padding/outer_padding.dart | 0 .../views/base/padding/sizedbox_padding.dart | 0 .../base/positioned/positioned_show.dart | 0 .../lib/src/views/base/size/size_display.dart | 0 .../views/base/size/size_loss_by_align.dart | 0 .../base/size/size_tight_constraint.dart | 0 .../views/base/size/size_unconstraint.dart | 0 .../src/views/components/grid_xy_layout.dart | 0 .../src/views/display/layout_playground.dart | 0 .../views/display/playground_bottom_bar.dart | 0 .../src/views/display/playground_top_bar.dart | 0 .../src/views/interest/elevator/elevator.dart | 0 .../layout/lib/src/views/layout_page.dart | 0 .../lib/src/views/multi/flex/column_show.dart | 0 .../lib/src/views/multi/flex/row_show.dart | 0 .../layout/lib/src/views/playground/cons.dart | 0 .../src/views/playground/data/flex_attr.dart | 0 .../src/views/playground/data/stack_attr.dart | 0 .../src/views/playground/data/wrap_attr.dart | 0 .../views/playground/view/display_item.dart | 0 .../playground/view/flex/flex_op_panel.dart | 0 .../playground/view/flex/flex_playground.dart | 0 .../view/form_item/item_selector.dart | 0 .../view/form_item/item_size_input.dart | 0 .../view/form_item/value_input.dart | 0 .../playground/view/stack/stack_op_panel.dart | 0 .../view/stack/stack_playground.dart | 0 .../playground/view/wrap/wrap_op_panel.dart | 0 .../playground/view/wrap/wrap_playground.dart | 0 .../src/views/popable/autocomplete_demo.dart | 0 .../views/popable/dropdown_button_demo.dart | 0 .../src/views/popable/dropdown_menu_demo.dart | 0 .../layout/lib/src/views/test_show.dart | 0 .../knowledge_system}/layout/pubspec.yaml | 0 .../layout/test/layout_test.dart | 0 .../painting_system/draw_system}/.gitignore | 0 .../painting_system/draw_system}/.metadata | 0 .../painting_system/draw_system}/CHANGELOG.md | 0 .../painting_system/draw_system}/LICENSE | 0 .../painting_system/draw_system}/README.md | 0 .../draw_system}/analysis_options.yaml | 0 .../draw_system/lib/draw_system.dart | 0 .../anim/bezier3_player/bezier3_palyer.dart | 0 .../src/anim/bezier3_player/touch_info.dart | 0 .../draw_system/lib/src/anim/circle_halo.dart | 0 .../src/anim/curve_shower/anim_painter.dart | 0 .../anim/curve_shower/curve_anim_shower.dart | 0 .../lib/src/anim/curve_shower/point_data.dart | 0 .../draw_system/lib/src/anim/draw_path.dart | 0 .../draw_system/lib/src/anim/dundun_path.dart | 0 .../anim/rotate_by_point/angle_panter.dart | 0 .../lib/src/anim/rotate_by_point/line.dart | 0 .../anim/rotate_by_point/rotate_by_point.dart | 0 .../lib/src/anim/spring_widget.dart | 0 .../lib/src/art/circle_packing.dart | 0 .../lib/src/art/cubic_disarray.dart | 0 .../lib/src/art/hypnotic_squares.dart | 0 .../draw_system/lib/src/art/joy_division.dart | 0 .../lib/src/art/piet_mondrian.dart | 0 .../draw_system/lib/src/art/tiled_lines.dart | 0 .../lib/src/art/triangular_mesh.dart | 0 .../lib/src/art/un_deux_trois.dart | 0 .../lib/src/base/clock_widget.dart | 0 .../lib/src/base/digital/digital_painter.dart | 0 .../lib/src/base/digital/digital_path.dart | 0 .../lib/src/base/digital/digital_shower.dart | 0 .../lib/src/base/digital/digital_widget.dart | 0 .../lib/src/base/draw_grid_axis.dart | 0 .../lib/src/base/draw_path_fun.dart | 0 .../lib/src/base/draw_picture.dart | 0 .../lib/src/base/n_side/n_side_page.dart | 0 .../lib/src/base/n_side/shape_painter.dart | 0 .../lib/src/base/polar/angle_painter.dart | 0 .../draw_system/lib/src/base/polar/polar.dart | 0 .../src/base/polar/polar_painter_widget.dart | 0 .../draw_system/lib/src/base/windmill.dart | 0 .../lib/src/bloc/gallery_unit/bloc.dart | 0 .../lib/src/desk_ui/desk_frame.dart | 2 +- .../lib/src/desk_ui/desk_gallery_unit.dart | 2 +- .../lib/src/fun/bufeng/bufeng_panel.dart | 2 +- .../lib/src/fun/bufeng/config.dart | 0 .../lib/src/fun/bufeng/painter.dart | 1 - .../draw_system/lib/src/fun/dundun_view.dart | 0 .../lib/src/fun/random_portrait.dart | 0 .../lib/src/fun/stemp/stamp_data.dart | 0 .../lib/src/fun/stemp/stamp_paper.dart | 0 .../lib/src/gallery_card_item.dart | 0 .../lib/src/gallery_detail_page.dart | 0 .../draw_system/lib/src/gallery_factory.dart | 0 .../draw_system/lib/src/gallery_unit.dart | 2 - .../lib/src/particle/out/clock_fx.dart | 0 .../lib/src/particle/out/clock_widget.dart | 0 .../lib/src/particle/out/particle.dart | 0 .../draw_system/lib/src/particle/out/rnd.dart | 0 .../lib/src/particle/random/particle.dart | 0 .../src/particle/random/particle_manage.dart | 0 .../src/particle/random/random_particle.dart | 0 .../lib/src/particle/random/world_render.dart | 0 .../lib/src/particle/split/particle.dart | 0 .../src/particle/split/particle_manage.dart | 0 .../src/particle/split/particle_split.dart | 0 .../lib/src/particle/split/world_render.dart | 0 .../lib/src/particle/split_img/particle.dart | 0 .../particle/split_img/particle_manage.dart | 0 .../src/particle/split_img/split_image.dart | 0 .../src/particle/split_img/world_render.dart | 0 .../draw_system/lib/src/picture_frame.dart | 0 .../draw_system/lib/src/utils/colors.dart | 0 .../draw_system/lib/src/utils/coordinate.dart | 0 .../painting_system}/draw_system/pubspec.yaml | 9 +- .../draw_system/test/draw_system_test.dart | 0 .../tools_system}/treasure_tools/.gitignore | 0 .../tools_system}/treasure_tools/.metadata | 0 .../tools_system/treasure_tools}/CHANGELOG.md | 0 .../tools_system/treasure_tools}/LICENSE | 0 .../tools_system/treasure_tools}/README.md | 0 .../treasure_tools}/analysis_options.yaml | 0 .../treasure_tools/lib/src/bloc/state.dart | 0 .../lib/src/class_generator.dart | 0 .../treasure_tools/lib/src/code_gen_page.dart | 0 .../lib/src/data/task_result.dart | 0 .../lib/src/desk_widget_top_bar.dart | 0 .../src/icon_font_gen/gen_message_action.dart | 0 .../icon_font_gen/icon_font_class_parser.dart | 0 .../icon_font_gen/icon_font_gen_config.dart | 0 .../src/icon_font_gen/icon_font_gen_page.dart | 0 .../treasure_tools/lib/src/model/class.dart | 0 .../treasure_tools/lib/src/model/field.dart | 0 .../lib/src/popable/class_gen_field.dart | 0 .../lib/src/popable/toly_select.dart | 0 .../treasure_tools/lib/src/wrapper.dart | 0 .../treasure_tools/lib/treasure_tools.dart | 0 .../tools_system}/treasure_tools/pubspec.yaml | 6 +- .../test/iconfont_parser_test.dart | 0 .../test/treasure_tools_test.dart | 0 .../treasure_tools/test/yaml_parser_test.dart | 0 .../test/yaml_parser_test2.dart | 0 .../widget_system}/widget_module/.gitignore | 0 .../widget_system}/widget_module/.metadata | 0 .../widget_system}/widget_module/CHANGELOG.md | 0 .../widget_system}/widget_module/LICENSE | 0 .../widget_system}/widget_module/README.md | 0 .../widget_module/analysis_options.yaml | 0 .../widget_module/lib/blocs/blocs.dart | 0 .../blocs/category_bloc/category_bloc.dart | 0 .../blocs/category_bloc/category_event.dart | 0 .../blocs/category_bloc/category_state.dart | 0 .../category_widget_bloc.dart | 0 .../category_widget_event.dart | 0 .../category_widget_state.dart | 0 .../liked_widget_bloc/liked_widget_bloc.dart | 0 .../liked_widget_bloc/liked_widget_event.dart | 0 .../liked_widget_bloc/liked_widget_state.dart | 0 .../widget_detail_bloc.dart | 0 .../widget_detail_state.dart | 0 .../lib/blocs/widgets_bloc/widgets_bloc.dart | 0 .../lib/blocs/widgets_bloc/widgets_event.dart | 0 .../lib/blocs/widgets_bloc/widgets_state.dart | 0 .../lib/data/category_repository.dart | 0 .../data/db_impl/catagory_db_repository.dart | 0 .../lib/data/db_impl/db_impl.dart | 0 .../lib/data/db_impl/node_db_repository.dart | 0 .../data/db_impl/widget_db_repository.dart | 0 .../memory_impl/memory_node_repository.dart | 0 .../memory_impl/memory_widget_repository.dart | 0 .../lib/data/model/category_model.dart | 0 .../widget_module/lib/data/model/enums.dart | 0 .../widget_module/lib/data/model/model.dart | 0 .../lib/data/model/node_model.dart | 0 .../lib/data/model/widget_filter.dart | 0 .../lib/data/model/widget_model.dart | 0 .../lib/data/node_repository.dart | 0 .../lib/data/widget_repository.dart | 0 .../widget_module/lib/data/zone.dart | 0 .../lib/views/components/collected_tag.dart | 0 .../category_panel/desk_category_page.dart | 0 .../category_panel/desk_top_like_panel.dart | 0 .../lib/views/desk_ui/desk_ui.dart | 0 .../widget_detail/link_widget_buttons.dart | 0 .../widget_detail/widget_detail_bar.dart | 0 .../widget_detail/widget_detail_page.dart | 0 .../widget_detail/widget_detail_panel.dart | 0 .../widget_detail/widget_node_panel.dart | 0 .../desk_ui/widget_panel/desk_search_bar.dart | 0 .../widget_panel/desk_widget_model_item.dart | 0 .../widget_panel/desk_widget_top_bar.dart | 0 .../desk_ui/widget_panel/widget_panel.dart | 0 .../mobile/category_page/category_detail.dart | 0 .../category_page/category_list_item.dart | 0 .../mobile/category_page/category_page.dart | 0 .../mobile/category_page/collect_page.dart | 0 .../category_page/delete_category_dialog.dart | 0 .../category_page/edit_category_panel.dart | 0 .../mobile/category_page/empty_category.dart | 0 .../category_page/home_right_drawer.dart | 0 .../category_page/like_widget_page.dart | 0 .../category_page/sync/async_button.dart | 0 .../category_page/sync/category_api.dart | 0 .../category_page/sync/upload_button.dart | 0 .../lib/views/mobile/mobile_ui.dart | 0 .../mobile/search_page/app_search_bar.dart | 0 .../views/mobile/search_page/search_page.dart | 0 .../search_page/standard_search_bar.dart | 0 .../search_page/standard_search_page.dart | 0 .../widget_detail/category_end_drawer.dart | 0 .../collect_widget_list_item.dart | 0 .../widget_detail/widget_detail_bar.dart | 0 .../widget_detail/widget_detail_page.dart | 0 .../widget_detail/widget_detail_panel.dart | 0 .../widget_detail/widget_node_panel.dart | 0 .../views/mobile/widget_page/home_drawer.dart | 0 .../widget_page/phone_widget_content.dart | 0 .../widget_page/standard_home_page.dart | 0 .../widget_page/standard_home_search.dart | 0 .../widget_page/unit_drawer_header.dart | 0 .../mobile/widget_page/widget_list_panel.dart | 0 .../mobile/widget_page/widget_model_item.dart | 0 .../views/mobile/widget_page/widget_page.dart | 0 .../widget_module/lib/widget_module.dart | 0 .../widget_system}/widget_module/pubspec.yaml | 16 +- .../test/widget_module_test.dart | 0 .../widget_system}/widgets/.gitignore | 0 .../widget_system}/widgets/.metadata | 0 .../widget_system}/widgets/CHANGELOG.md | 0 .../widget_system}/widgets/LICENSE | 0 .../widget_system}/widgets/README.md | 0 .../widgets/analysis_options.yaml | 0 .../Column/node1_base.dart | 0 .../CustomMultiChildLayout/node1_base.dart | 0 .../Flex/node1_direction.dart | 0 .../Flex/node2_mainAxisAlignment.dart | 0 .../Flex/node3_crossAxisAlignment.dart | 0 .../Flex/node4_verticalDirection.dart | 0 .../Flex/node5_textDirection.dart | 0 .../Flex/zz_node_play.dart | 0 .../Flow/node1_base.dart | 0 .../Flow/node2_anim.dart | 0 .../IndexedStack/node1_base.dart | 0 .../ListBody/node1_base.dart | 0 .../NestedScrollViewViewport/node1_base.dart | 0 .../RichText/node1_base.dart | 0 .../RichText/node2_widget.dart | 0 .../Row/node1_base.dart | 0 .../ShrinkWrappingViewport/node1_base.dart | 0 .../Stack/node1_base.dart | 0 .../Stack/node2_positioned.dart | 0 .../Viewport/node1_base.dart | 0 .../Wrap/node1_base.dart | 0 .../Wrap/node2_alignment.dart | 0 .../Wrap/node3_crossAxisAlignment.dart | 0 .../Wrap/node4_textDirection.dart | 0 .../Wrap/node5_verticalDirection.dart | 0 .../lib/Other/ErrorWidget/node1_base.dart | 0 .../Other/ListWheelViewport/node1_base.dart | 0 .../ListWheelViewport/node2_perspective.dart | 0 .../ListWheelViewport/node3_magnifier.dart | 0 .../ListWheelViewport/node4_opacity.dart | 0 .../Other/PerformanceOverlay/node1_base.dart | 0 .../lib/Other/RawImage/node1_base.dart | 0 .../node1_base.dart | 0 .../widgets/lib/Other/Table/node1_base.dart | 0 .../ButtonBarTheme/node1_base.dart | 0 .../ProxyWidget/ButtonTheme/node1_base.dart | 0 .../lib/ProxyWidget/ChipTheme/node1_base.dart | 0 .../node1_base.dart | 0 .../DefaultAssetBundle/node1_base.dart | 0 .../DefaultTextStyle/node1_base.dart | 0 .../Directionality/node1_base.dart | 0 .../ProxyWidget/DividerTheme/node1_base.dart | 0 .../node1_base.dart | 0 .../lib/ProxyWidget/Expanded/node1_base.dart | 0 .../lib/ProxyWidget/Flexible/node1_base.dart | 0 .../lib/ProxyWidget/IconTheme/node1_base.dart | 0 .../lib/ProxyWidget/InheritedModel/node1.dart | 0 .../InheritedTheme/node1_base.dart | 0 .../InheritedWidget/node1_base.dart | 0 .../InheritedWidget/node2_use.dart | 0 .../lib/ProxyWidget/KeepAlive/node1_base.dart | 0 .../lib/ProxyWidget/LayoutId/node1_base.dart | 0 .../ProxyWidget/ListTileTheme/node1_base.dart | 0 .../MaterialBannerTheme/node1_base.dart | 0 .../ProxyWidget/MediaQuery/node1_base.dart | 0 .../ParentDataWidget/node1_base.dart | 0 .../PopupMenuTheme/node1_base.dart | 0 .../ProxyWidget/Positioned/node1_base.dart | 0 .../PrimaryScrollController/node1_base.dart | 0 .../ScrollConfiguration/node1_base.dart | 0 .../ProxyWidget/SliderTheme/node1_base.dart | 0 .../ProxyWidget/SliderTheme/node2_diy.dart | 0 .../lib/ProxyWidget/TableCell/node1_base.dart | 0 .../ToggleButtonsTheme/node1_base.dart | 0 .../ProxyWidget/TooltipTheme/node1_base.dart | 0 .../AbsorbPointer/node1_base.dart | 0 .../Align/node1_base.dart | 0 .../Align/node2_other.dart | 0 .../AnimatedSize/node1_base.dart | 0 .../AnnotatedRegion/node1_base.dart | 0 .../AspectRatio/node1_base.dart | 0 .../BackdropFilter/node1_base.dart | 0 .../Baseline/node1_base.dart | 0 .../Center/node1_base.dart | 0 .../ClipOval/node1_base.dart | 0 .../ClipPath/node1_base.dart | 0 .../ClipRRect/node1_base.dart | 0 .../ClipRect/node1_base.dart | 0 .../ColorFiltered/node1_base.dart | 0 .../ColoredBox/node1_base.dart | 0 .../node1_base.dart | 0 .../CompositedTransformTarget/node1_base.dart | 0 .../ConstrainedBox/node1_base.dart | 0 .../node1_base.dart | 0 .../CustomPaint/node1_clock.dart | 0 .../CustomPaint/node2_bezier.dart | 0 .../CustomSingleChildLayout/node1_base.dart | 0 .../CustomSingleChildLayout/node2_offset.dart | 0 .../DecoratedBox/node1_base.dart | 0 .../DecoratedBox/node2_image.dart | 0 .../DecoratedBox/node3_border.dart | 0 .../DecoratedBox/node4_shape.dart | 0 .../DecoratedBox/node5_line.dart | 0 .../DecoratedBox/node6_flutterLogo.dart | 0 .../FadeTransition/node1_base.dart | 0 .../FittedBox/node1_base.dart | 0 .../FractionalTranslation/node1_base.dart | 0 .../FractionallySizedBox/node1_base.dart | 0 .../IgnorePointer/node1_base.dart | 0 .../ImageFiltered/node1_blur.dart | 0 .../ImageFiltered/node2_color.dart | 0 .../ImageFiltered/node3_matrix.dart | 0 .../IntrinsicHeight/node1_base.dart | 0 .../IntrinsicWidth/node1_base.dart | 0 .../LayoutBuilder/node1_base.dart | 0 .../LayoutBuilder/node2_fit.dart | 0 .../LayoutBuilder/node3_expend.dart | 0 .../LimiteBox/node1_base.dart | 0 .../OffStage/node1_base.dart | 0 .../Opacity/node1_base.dart | 0 .../OverflowBox/node1_base.dart | 0 .../Padding/node1_all.dart | 0 .../Padding/node2_only.dart | 0 .../Padding/node3_symmetric.dart | 0 .../PhysicalModel/node1_base.dart | 0 .../PhysicalShape/node1_base.dart | 0 .../RepaintBoundary/main.dart | 0 .../RepaintBoundary/node1_base.dart | 0 .../RepaintBoundary/node2_save.dart | 0 .../RotatedBox/node1_base.dart | 0 .../ShaderMask/node1_radial.dart | 0 .../ShaderMask/node2_linear.dart | 0 .../SizeChangedLayoutNotifier/node1_base.dart | 0 .../SizedBox/node1_base.dart | 0 .../SizedOverflowBox/node1_base.dart | 0 .../Transform/matrix4_shower.dart | 0 .../Transform/node1_skew.dart | 0 .../Transform/node2_translation.dart | 0 .../Transform/node3_scale.dart | 0 .../Transform/node4_rotate.dart | 0 .../Transform/node5_perspective.dart | 0 .../Transform/zz_node_op.dart | 0 .../UnConstrainedBox/node1_base.dart | 0 .../node1_base.dart | 0 .../node1_base.dart | 0 .../Sliver/CustomScrollView/node1_base.dart | 0 .../lib/Sliver/DecoratedSliver/node1.dart | 0 .../Sliver/FlexibleSpaceBar/node1_base.dart | 0 .../Sliver/SliverAnimatedList/node1_base.dart | 0 .../lib/Sliver/SliverAppBar/node1_base.dart | 0 .../SliverConstrainedCrossAxis/node1.dart | 0 .../Sliver/SliverCrossAxisExpanded/node1.dart | 0 .../Sliver/SliverCrossAxisGroup/node1.dart | 0 .../SliverFillRemaining/node1_base.dart | 0 .../Sliver/SliverFillViewport/node1_base.dart | 0 .../SliverFixedExtentList/node1_base.dart | 0 .../lib/Sliver/SliverGrid/node1_base.dart | 0 .../SliverIgnorePointer/node1_base.dart | 0 .../SliverLayoutBuilder/node1_base.dart | 0 .../lib/Sliver/SliverList/node1_base.dart | 0 .../lib/Sliver/SliverMainAxisGroup/node1.dart | 0 .../lib/Sliver/SliverOpacity/node1_base.dart | 0 .../SliverOverlapAbsorber/node1_base.dart | 0 .../SliverOverlapInjector/node1_base.dart | 0 .../lib/Sliver/SliverPadding/node1_base.dart | 0 .../SliverPersistentHeader/node1_base.dart | 0 .../SliverPrototypeExtentList/node1_base.dart | 0 .../Sliver/SliverToBoxAdapter/node1_base.dart | 0 .../SliverWithKeepAliveWidget/node1_base.dart | 0 .../AlignTransition/node1_base.dart | 0 .../AnimatedAlign/node1_base.dart | 0 .../AnimatedBuilder/node1_base.dart | 0 .../AnimatedContainer/node1_base.dart | 0 .../AnimatedCrossFade/node1_base.dart | 0 .../AnimatedCrossFade/node2_curve.dart | 0 .../AnimatedDefaultTextStyle/node1_base.dart | 0 .../AnimatedList/node1_base.dart | 0 .../AnimatedModalBarrier/node1_base.dart | 0 .../AnimatedOpacity/node1_base.dart | 0 .../AnimatedPadding/node1_base.dart | 0 .../AnimatedPhysicalModel/node1_base.dart | 0 .../AnimatedPositioned/node1_base.dart | 0 .../node1_base.dart | 0 .../AnimatedSwitcher/node1_base.dart | 0 .../AnimatedTheme/node1_base.dart | 0 .../lib/StatefulWidget/AppBar/node1_base.dart | 0 .../lib/StatefulWidget/AppBar/node2_tab.dart | 0 .../AutomaticKeepAlive/node1_base.dart | 0 .../BottomAppBar/node1_base.dart | 0 .../BottomNavigationBar/node1_base.dart | 0 .../BottomNavigationBar/node2_page.dart | 0 .../StatefulWidget/Checkbox/node1_base.dart | 0 .../Checkbox/node2_tristate.dart | 0 .../CircularProgressIndicator/node1_base.dart | 0 .../node1_base.dart | 0 .../CupertinoApp/node1_base.dart | 0 .../CupertinoButton/node1_base.dart | 0 .../CupertinoContextMenu/node1_base.dart | 0 .../node1_base.dart | 0 .../CupertinoDatePicker/node1_base.dart | 0 .../CupertinoNavigationBar/node1_base.dart | 0 .../CupertinoPageScaffold/node1_base.dart | 0 .../CupertinoPicker/node1_base.dart | 0 .../CupertinoScrollbar/node1_base.dart | 0 .../CupertinoSegmentedControl/node1_base.dart | 0 .../node2_color.dart | 0 .../CupertinoSlider/node1_base.dart | 0 .../node1_base.dart | 0 .../CupertinoSwitch/node1_base.dart | 0 .../CupertinoTabBar/node1_base.dart | 0 .../CupertinoTabScaffold/node1_base.dart | 0 .../CupertinoTabView/node1_base.dart | 0 .../CupertinoTextField/node1_base.dart | 0 .../CupertinoTextField/node2_style.dart | 0 .../CupertinoTimerPicker/node1_base.dart | 0 .../DateRangePickerDialog/node1_base.dart | 0 .../DateRangePickerDialog/node2_diy.dart | 0 .../toly_date_picker.dart | 0 .../DecoratedBoxTransition/node1_base.dart | 0 .../DefaultTabController/node1_base.dart | 0 .../node1_base.dart | 0 .../Dismissible/node1_base.dart | 0 .../Dismissible/node2_direction.dart | 0 .../StatefulWidget/DragTarget/node1_base.dart | 0 .../StatefulWidget/Draggable/node1_base.dart | 0 .../StatefulWidget/Draggable/node2_data.dart | 0 .../StatefulWidget/Draggable/node3_use.dart | 0 .../DraggableScrollableSheet/node1_base.dart | 0 .../DrawerController/node1_base.dart | 0 .../DropdownButton/node1_base.dart | 0 .../DropdownButton/node2_style.dart | 0 .../DropdownButtonFormField/node1_base.dart | 0 .../DropdownMenu/desc_zh-CN.json | 0 .../StatefulWidget/DropdownMenu/node1.dart | 0 .../StatefulWidget/DropdownMenu/node2.dart | 0 .../StatefulWidget/DropdownMenu/node3.dart | 0 .../EditableText/node1_base.dart | 0 .../ElevatedButton/node1_base.dart | 0 .../ElevatedButton/node2_style.dart | 0 .../StatefulWidget/ExpandIcon/node1_base.dart | 0 .../ExpansionPanelList/node1_base.dart | 0 .../ExpansionTile/node1_base.dart | 0 .../lib/StatefulWidget/Form/node1_base.dart | 0 .../StatefulWidget/FormField/node1_base.dart | 0 .../FutureBuilder/node1_base.dart | 0 .../node1_base.dart | 0 .../lib/StatefulWidget/Hero/node1_base.dart | 0 .../lib/StatefulWidget/Image/node1_base.dart | 0 .../lib/StatefulWidget/Image/node2_fit.dart | 0 .../StatefulWidget/Image/node3_alignment.dart | 0 .../Image/node4_colorBlendMode.dart | 0 .../StatefulWidget/Image/node5_repeat.dart | 0 .../Image/node6_centerSlice.dart | 0 .../lib/StatefulWidget/Ink/node1_base.dart | 0 .../lib/StatefulWidget/Ink/node2_image.dart | 0 .../InkResponse/node1_base.dart | 0 .../InkResponse/node2_color.dart | 0 .../StatefulWidget/InkWell/node1_base.dart | 0 .../StatefulWidget/InkWell/node2_color.dart | 0 .../InputDecorator/node1_base.dart | 0 .../InteractiveViewer/node1_base.dart | 0 .../InteractiveViewer/node2_constrained.dart | 0 .../InteractiveViewer/node3_controller.dart | 0 .../LicensePage/node1_base.dart | 0 .../LinearProgressIndicator/node1_base.dart | 0 .../ListWheelScrollView/node1_base.dart | 0 .../LongPressDraggable/node1_base.dart | 0 .../StatefulWidget/Material/node1_base.dart | 0 .../StatefulWidget/Material/node2_shape.dart | 0 .../MaterialApp/node1_base.dart | 0 .../MergeableMaterial/node1_base.dart | 0 .../MonthPicker/node1_base.dart | 0 .../MouseRegion/node1_base.dart | 0 .../NavigationRail/node1_base.dart | 0 .../NavigationRail/node2_extend.dart | 0 .../NavigationRail/node3_dark.dart | 0 .../StatefulWidget/Navigator/node1_base.dart | 0 .../NestedScrollView/node1_base.dart | 0 .../OutlinedButton/node1_base.dart | 0 .../OutlinedButton/node2_style.dart | 0 .../StatefulWidget/Overlay/node1_base.dart | 0 .../StatefulWidget/PageView/node1_base.dart | 0 .../PageView/node2_direction.dart | 0 .../PageView/node3_controller.dart | 0 .../PaginatedDataTable/node1_base.dart | 0 .../PopupMenuButton/node1_base.dart | 0 .../PopupMenuDivider/node1_base.dart | 0 .../PositionedTransition/node1_base.dart | 0 .../lib/StatefulWidget/Radio/node1_base.dart | 0 .../RangeSlider/node1_base.dart | 0 .../StatefulWidget/RawChip/node1_press.dart | 0 .../StatefulWidget/RawChip/node2_select.dart | 0 .../RawGestureDetector/node1_base.dart | 0 .../RawKeyboardListener/node1_base.dart | 0 .../RawMaterialButton/node1_base.dart | 0 .../RawMaterialButton/node2_shape.dart | 0 .../RefreshIndicator/node1_base.dart | 0 .../node1_base.dart | 0 .../ReorderableListView/node1_base.dart | 0 .../ReorderableListView/node2_direction.dart | 0 .../RotationTransition/node1_base.dart | 0 .../StatefulWidget/Scaffold/node1_base.dart | 0 .../ScaleTransition/node1_base.dart | 0 .../StatefulWidget/Scrollable/node1_base.dart | 0 .../StatefulWidget/Scrollbar/node1_base.dart | 0 .../SelectableText/node1_base.dart | 0 .../SelectableText/node2_align.dart | 0 .../SizeTransition/node1_base.dart | 0 .../SlideTransition/node1_base.dart | 0 .../lib/StatefulWidget/Slider/node1_base.dart | 0 .../StatefulWidget/Slider/node2_lable.dart | 0 .../StatefulBuilder/node1_base.dart | 0 .../StatusTransitionWidget/node1_base.dart | 0 .../StatefulWidget/Stepper/node1_base.dart | 0 .../StatefulWidget/Stepper/node2_type.dart | 0 .../StreamBuilder/node1_base.dart | 0 .../lib/StatefulWidget/Switch/node1_base.dart | 0 .../StatefulWidget/Switch/node2_image.dart | 0 .../StatefulWidget/TabBarView/node1_base.dart | 0 .../TableRowInkWell/node1_base.dart | 0 .../StatefulWidget/TextButton/node1_base.dart | 0 .../TextButton/node2_style.dart | 0 .../StatefulWidget/TextField/node1_base.dart | 0 .../TextField/node2_cursor.dart | 0 .../TextField/node3_decoration.dart | 0 .../TextFormField/node1_base.dart | 0 .../StatefulWidget/Tooltip/node1_base.dart | 0 .../Tooltip/node2_decoration.dart | 0 .../TweenAnimationBuilder/node1_base.dart | 0 .../UniqueWidget/node1_base.dart | 0 .../ValueListenableBuilder/node1_base.dart | 0 .../WidgetInspector/node1_base.dart | 0 .../StatefulWidget/WidgetsApp/node1_base.dart | 0 .../WillPopScope/node1_base.dart | 0 .../StatefulWidget/YearPicker/node1_base.dart | 0 .../AboutDialog/node1_base.dart | 0 .../AboutListTile/node1_base.dart | 0 .../ActionChip/node1_base.dart | 0 .../AlertDialog/node1_base.dart | 0 .../AnimatedIcon/node1_base.dart | 0 .../Autocomplete/node1_base.dart | 0 .../Autocomplete/node2_type.dart | 0 .../BackButton/node1_base.dart | 0 .../BackButtonIcon/node1_base.dart | 0 .../lib/StatelessWidget/Badge/node_1.dart | 0 .../lib/StatelessWidget/Badge/node_2.dart | 0 .../lib/StatelessWidget/Badge/node_3.dart | 0 .../StatelessWidget/Banner/node1_base.dart | 0 .../BottomSheet/node1_base.dart | 0 .../BoxScrollView/node1_base.dart | 0 .../StatelessWidget/Builder/node1_base.dart | 0 .../StatelessWidget/ButtonBar/node1_base.dart | 0 .../ButtonBar/node2_padding.dart | 0 .../lib/StatelessWidget/Card/node1_base.dart | 0 .../lib/StatelessWidget/Card/node2_shape.dart | 0 .../CheckboxListTile/node1_base.dart | 0 .../CheckboxListTile/node2_select.dart | 0 .../CheckboxListTile/node3_dense.dart | 0 .../CheckedModeBanner/node1_base.dart | 0 .../lib/StatelessWidget/Chip/node1_base.dart | 0 .../lib/StatelessWidget/Chip/node2_color.dart | 0 .../StatelessWidget/Chip/node3_delete.dart | 0 .../ChoiceChip/node1_base.dart | 0 .../CircleAvatar/node1_base.dart | 0 .../CloseButton/node1_base.dart | 0 .../CloseButtonIcon/node1_base.dart | 0 .../StatelessWidget/Container/desc_zh-CN.json | 0 .../StatelessWidget/Container/node1_base.dart | 0 .../Container/node2_child.dart | 0 .../Container/node3_alignment.dart | 0 .../Container/node4_decoration.dart | 0 .../Container/node5_transform.dart | 0 .../Container/node6_constraints.dart | 0 .../CupertinoActionSheet/node1_base.dart | 0 .../node1_base.dart | 0 .../CupertinoAlertDialog/node1_base.dart | 0 .../CupertinoDialogAction/no_node1_base.dart | 0 .../CupertinoDialogAction/node1_base.dart | 0 .../node1_base.dart | 0 .../node1_base.dart | 0 .../CupertinoPageTransition/node1_base.dart | 0 .../CupertinoPopupSurface/node1_base.dart | 0 .../CupertinoTheme/node1_base.dart | 0 .../CupertinoTheme/node2_use.dart | 0 .../StatelessWidget/DataTable/node1_base.dart | 0 .../DataTable/node2_operation.dart | 0 .../StatelessWidget/DayPicker/node1_base.dart | 0 .../StatelessWidget/Dialog/node1_base.dart | 0 .../StatelessWidget/Divider/node1_base.dart | 0 .../StatelessWidget/Divider/node2_height.dart | 0 .../node1_base.dart | 0 .../StatelessWidget/Drawer/node1_base.dart | 0 .../DrawerButton/node1_base.dart | 0 .../DrawerButtonIcon/node1_base.dart | 0 .../DrawerHeader/node1_base.dart | 0 .../EndDrawerButton/node1_base.dart | 0 .../EndDrawerButtonIcon/node1_base.dart | 0 .../FadeInImage/node1_base.dart | 0 .../FilterChip/node1_base.dart | 0 .../FlatButton/node1_base.dart | 0 .../FloatingActionButton/node1_base.dart | 0 .../FloatingActionButton/node2_mini.dart | 0 .../FloatingActionButton/node3_shape.dart | 0 .../FlutterLogo/node1_base.dart | 0 .../FlutterLogo/node2_style.dart | 0 .../GestureDetector/node1_base.dart | 0 .../GestureDetector/node2_tap.dart | 0 .../GestureDetector/node3_pan.dart | 0 .../StatelessWidget/GirdView/node1_base.dart | 0 .../GirdView/node2_direction.dart | 0 .../GirdView/node3_extend.dart | 0 .../GirdView/node4_builder.dart | 0 .../StatelessWidget/GridPaper/node1_base.dart | 0 .../GridPaper/node2_divisions.dart | 0 .../StatelessWidget/GridTile/node1_base.dart | 0 .../GridTileBar/node1_base.dart | 0 .../HtmlElementView/node1_base.dart | 0 .../lib/StatelessWidget/Icon/node1_base.dart | 0 .../lib/StatelessWidget/Icon/node2_diy.dart | 0 .../IconButton/node1_base.dart | 0 .../StatelessWidget/ImageIcon/node1_base.dart | 0 .../StatelessWidget/InputChip/node1_base.dart | 0 .../InputChip/node2_select.dart | 0 .../StatelessWidget/ListTile/node1_base.dart | 0 .../ListTile/node2_select.dart | 0 .../StatelessWidget/ListTile/node3_dense.dart | 0 .../StatelessWidget/ListView/node1_base.dart | 0 .../ListView/node2_direction.dart | 0 .../ListView/node3_builder.dart | 0 .../ListView/node4_separated.dart | 0 .../StatelessWidget/Listener/node1_base.dart | 0 .../MaterialBanner/node1_one_btn.dart | 0 .../MaterialBanner/node2_two_btn.dart | 0 .../MaterialButton/node1_base.dart | 0 .../MaterialButton/node2_onLongPress.dart | 0 .../MaterialButton/node3_shape.dart | 0 .../ModalBarrier/node1_base.dart | 0 .../NavigationToolbar/node1_base.dart | 0 .../NotificationListener/node1_base.dart | 0 .../NotificationListener/node2_update.dart | 0 .../OrientationBuilder/node1_base.dart | 0 .../OutlineButton/node1_base.dart | 0 .../PageStorage/node1_base.dart | 0 .../Placeholder/node1_base.dart | 0 .../Placeholder/node2_fallback.dart | 0 .../PositionedDirectional/node1_base.dart | 0 .../PreferredSize/node1_base.dart | 0 .../PreferredSize/node2_adapter.dart | 0 .../RadioListTile/node1_base.dart | 0 .../RadioListTile/node2_dense.dart | 0 .../RaisedButton/node1_base.dart | 0 .../RawMagnifier/node1_base.dart | 0 .../RawMagnifier/node2_shape.dart | 0 .../StatelessWidget/SafeArea/node1_base.dart | 0 .../ScrollView/node1_base.dart | 0 .../SimpleDialog/node1_base.dart | 0 .../SimpleDialogOption/node1_base.dart | 0 .../SingleChildScrollView/node1_base.dart | 0 .../node2_direction.dart | 0 .../StatelessWidget/SnackBar/node1_base.dart | 0 .../SnackBarAction/node1_base.dart | 0 .../StatelessWidget/Spacer/node1_base.dart | 0 .../StatelessWidget/Spacer/node2_flex.dart | 0 .../SwitchListTile/node1_base.dart | 0 .../SwitchListTile/node2_select.dart | 0 .../SwitchListTile/node3_dense.dart | 0 .../lib/StatelessWidget/Tab/node1_base.dart | 0 .../StatelessWidget/TabBar/node1_base.dart | 0 .../TabBar/node2_noShadow.dart | 0 .../TabPageSelector/node1_base.dart | 0 .../TabPageSelectorIndicator/node1_base.dart | 0 .../lib/StatelessWidget/Text/node1_base.dart | 0 .../StatelessWidget/Text/node2_shadows.dart | 0 .../Text/node3_decoration.dart | 0 .../StatelessWidget/Text/node4_textAlign.dart | 0 .../Text/node5_textDirection.dart | 0 .../StatelessWidget/Text/node6_softWrap.dart | 0 .../lib/StatelessWidget/Theme/node1_base.dart | 0 .../lib/StatelessWidget/Theme/node2_use.dart | 0 .../lib/StatelessWidget/Title/node1_base.dart | 0 .../ToggleButtons/node1_single.dart | 0 .../ToggleButtons/node2_color.dart | 0 .../ToggleButtons/node3_multi.dart | 0 .../UserAccountsDrawerHeader/node1_base.dart | 0 .../UserAccountsDrawerHeader/node2_pro.dart | 0 .../VerticalDivider/node1_base.dart | 0 .../VerticalDivider/node2_height.dart | 0 .../Visibility/node1_base.dart | 0 .../Visibility/node2_replacement.dart | 0 .../widgets/lib/exp/other_unit.dart | 0 .../widgets/lib/exp/proxy_unit.dart | 0 .../widgets/lib/exp/render_object_unit.dart | 0 .../widgets/lib/exp/sliver_unit.dart | 0 .../widgets/lib/exp/stateful_unit.dart | 0 .../widgets/lib/exp/stateless_unit.dart | 0 .../widgets/lib/utils/color_utils.dart | 0 .../widgets/lib/utils/dialog_about.dart | 0 .../widgets/lib/utils/pather.dart | 0 .../widget_system}/widgets/lib/widgets.dart | 0 .../widgets/lib/widgets_map.dart | 0 .../widget_system}/widgets/pubspec.yaml | 4 +- .../widgets/test/widgets_test.dart | 0 pubspec.lock | 158 ++++++------------ pubspec.yaml | 84 +++------- 1155 files changed, 277 insertions(+), 377 deletions(-) create mode 100644 lib/stater/boot_start.dart rename lib/{app_stater/impl => stater/logic}/app_start_action.dart (100%) rename lib/{app_stater/impl/start_repository.dart => stater/logic/app_start_repository.dart} (100%) rename lib/{app_stater => stater}/view/error/app_start_error.dart (100%) rename lib/{app_stater/view/splash/standard_unit_splash.dart => stater/view/splash/Flutter_unit_splash.dart} (83%) rename lib/{app_stater => stater}/view/splash/flutter_unit_text.dart (100%) rename lib/{app => structure}/flutter_unit.dart (92%) rename lib/{navigation/routers => structure/navigation/router}/app_route.dart (86%) rename lib/{navigation/routers => structure/navigation/router}/desk_route.dart (86%) rename lib/{navigation/routers => structure/navigation/router}/mobile_route.dart (85%) rename lib/{navigation/views/desk => structure/navigation/views/desktop}/flutter_unit_desk_navigation.dart (100%) rename lib/{navigation/views/desk => structure/navigation/views/desktop}/menu_bar_leading.dart (100%) rename lib/{navigation/views/desk => structure/navigation/views/desktop}/menu_bar_tail.dart (100%) rename lib/{navigation/views/desk => structure/navigation/views/desktop}/theme_model_switch_icon.dart (100%) rename lib/{navigation/views/desk => structure/navigation/views/desktop}/toly_unit_menu_cell.dart (100%) rename lib/{ => structure}/navigation/views/pure_bottom_bar.dart (100%) rename lib/{ => structure}/navigation/views/unit_navigation.dart (100%) rename lib/{app => structure/wrapper}/bloc_wrapper.dart (95%) rename lib/{navigation/views => structure/wrapper}/overlay_tool_wrapper.dart (100%) rename {packages/algorithm => modules/basic_system/app}/.gitignore (100%) rename {packages => modules/basic_system}/app/.metadata (100%) rename {packages/algorithm => modules/basic_system/app}/CHANGELOG.md (100%) rename {packages/algorithm => modules/basic_system/app}/LICENSE (100%) rename {packages/algorithm => modules/basic_system/app}/README.md (100%) rename {packages/algorithm => modules/basic_system/app}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/app/lib/app.dart (93%) rename {packages => modules/basic_system}/app/lib/app/action/action.dart (100%) rename {packages => modules/basic_system}/app/lib/app/action/url.dart (100%) rename {packages => modules/basic_system}/app/lib/app/cons/cons.dart (100%) rename {packages => modules/basic_system}/app/lib/app/cons/global_value.dart (100%) rename {packages => modules/basic_system}/app/lib/app/cons/path_unit.dart (100%) rename {packages => modules/basic_system}/app/lib/app/cons/sp.dart (100%) rename {packages => modules/basic_system}/app/lib/app/cons/str_unit.dart (100%) rename {packages => modules/basic_system}/app/lib/app/res/toly_icon.dart (100%) rename {packages => modules/basic_system}/app/lib/app/router/fade_page_route.dart (100%) rename {packages => modules/basic_system}/app/lib/app/router/slide_page_route.dart (100%) rename {packages => modules/basic_system}/app/lib/app/router/zero_page_route.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/behavior/no_scroll_behavior.dart (63%) rename {packages => modules/basic_system}/app/lib/app/style/gap.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/shape/coupon_shape_border.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/shape/techno_shape.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/transition/fade_page_transitions_builder.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/transition/size_clip_transition.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/unit_color.dart (100%) rename {packages => modules/basic_system}/app/lib/app/style/unit_text_style.dart (100%) rename {packages => modules/basic_system}/app/lib/app/theme/app_theme.dart (100%) rename {packages => modules/basic_system}/app/lib/app/theme/size_unit.dart (100%) rename {packages => modules/basic_system}/app/lib/app_config/app_config.dart (100%) rename {packages => modules/basic_system}/app/lib/app_config/bloc/bloc.dart (100%) rename {packages => modules/basic_system}/app/lib/app_config/bloc/state.dart (100%) rename {packages => modules/basic_system}/app/lib/app_config/repository/repository.dart (100%) rename {packages => modules/basic_system}/app/lib/app_update/bloc/bloc.dart (100%) rename {packages => modules/basic_system}/app/lib/app_update/bloc/event.dart (100%) rename {packages => modules/basic_system}/app/lib/app_update/bloc/state.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/about/about_app_page.dart (98%) rename {lib/app/views => modules/basic_system/app/lib/view}/about/about_me_page.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/about/version/version_shower.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/about/version_info.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/account/desk/desk_account_page.dart (81%) rename {lib/app/views => modules/basic_system/app/lib/view}/account/desk/sliver_cellection_panel.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/account/desk/sliver_list_panel.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/account/desk/sliver_share_panel.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/account/desk/user_header.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/data_manage/data_manage_page.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/app_style_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/code_style_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/font_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/item_style_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/language_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/setting_page.dart (87%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/theme_color_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/setting/theme_model_setting.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/unit_todo/attr_unit_page.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/unit_todo/layout_unit_page.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/unit_todo/paint_unit_page.dart (100%) rename {lib/app/views => modules/basic_system/app/lib/view}/unit_todo/point_unit_page.dart (100%) create mode 100644 modules/basic_system/app/lib/view/view.dart rename {packages => modules/basic_system}/app/pubspec.yaml (96%) rename {packages => modules/basic_system}/app/test/app_config_test.dart (100%) rename {packages/app => modules/basic_system/app_update}/.gitignore (100%) rename {packages => modules/basic_system}/app_update/.metadata (100%) rename {packages/app => modules/basic_system/app_update}/CHANGELOG.md (100%) rename {packages/app => modules/basic_system/app_update}/LICENSE (100%) rename {packages/app => modules/basic_system/app_update}/README.md (100%) rename {packages/app => modules/basic_system/app_update}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/app_update/lib/app_update.dart (100%) rename {packages => modules/basic_system}/app_update/lib/bloc/bloc.dart (100%) rename {packages => modules/basic_system}/app_update/lib/bloc/event.dart (100%) rename {packages => modules/basic_system}/app_update/lib/bloc/state.dart (100%) rename {packages => modules/basic_system}/app_update/lib/model/app_info.dart (100%) rename {packages => modules/basic_system}/app_update/lib/views/app_update_panel.dart (100%) rename {packages => modules/basic_system}/app_update/lib/views/update_red_point.dart (100%) rename {packages => modules/basic_system}/app_update/pubspec.yaml (99%) rename {packages => modules/basic_system}/app_update/test/app_update_test.dart (100%) rename {packages/app_update => modules/basic_system/authentication}/.gitignore (100%) rename {packages => modules/basic_system}/authentication/.metadata (100%) rename {packages/app_update => modules/basic_system/authentication}/CHANGELOG.md (100%) rename {packages/app_update => modules/basic_system/authentication}/LICENSE (100%) rename {packages/app_update => modules/basic_system/authentication}/README.md (100%) rename {packages/app_update => modules/basic_system/authentication}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/authentication/lib/authentication.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/authentic/bloc.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/authentic/event.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/authentic/state.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/register/bloc.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/register/event.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/register/state.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/user/bloc.dart (100%) rename {packages => modules/basic_system}/authentication/lib/blocs/user/state.dart (100%) rename {packages => modules/basic_system}/authentication/lib/models/user.dart (100%) rename {packages => modules/basic_system}/authentication/lib/repository/auth_repository.dart (100%) rename {packages => modules/basic_system}/authentication/lib/repository/impl/http_auth_repository.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/authentic_widget.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/login/login_form.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/login/login_page.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/register/arc_clipper.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/register/register_page.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/register/send_code.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/user/page_item.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/user/support_me.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/user/unit_drawer_header.dart (100%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/user/user_account.dart (91%) rename {packages => modules/basic_system}/authentication/lib/views/mobile/user/user_page.dart (100%) rename {packages => modules/basic_system}/authentication/pubspec.yaml (100%) rename {packages => modules/basic_system}/authentication/test/authentication_test.dart (100%) rename {packages/artifact => modules/basic_system/components}/.gitignore (100%) rename {packages => modules/basic_system}/components/.metadata (100%) rename {packages/artifact => modules/basic_system/components}/CHANGELOG.md (100%) rename {packages/artifact => modules/basic_system/components}/LICENSE (100%) rename {packages/artifact => modules/basic_system/components}/README.md (100%) rename {packages/artifact => modules/basic_system/components}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/components/lib/components.dart (100%) rename {packages => modules/basic_system}/components/lib/flutter_ui/diy_flexible_space_bar.dart (100%) rename {packages => modules/basic_system}/components/lib/flutter_ui/flutter_ui.dart (100%) rename {packages => modules/basic_system}/components/lib/flutter_ui/no_div_expansion_tile.dart (100%) rename {packages => modules/basic_system}/components/lib/flutter_ui/toly_date_picker.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/default/empty_search_page.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/default/empty_shower.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/default/error_page.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/default/error_shower.dart (96%) rename {packages => modules/basic_system}/components/lib/project_ui/default/loading_shower.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/default/no_more_widget.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/project_ui.dart (89%) rename {lib/app/views => modules/basic_system/components/lib/project_ui}/time_line/flutter_unit_time_line.dart (100%) rename {lib/app/views => modules/basic_system/components/lib/project_ui}/time_line/model/time_node.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/top_bar/desk_account_top_bar.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart (95%) rename {packages => modules/basic_system}/components/lib/project_ui/top_bar/desk_simple_top_bar.dart (92%) rename {packages => modules/basic_system}/components/lib/project_ui/top_bar/desk_tab_top_bar.dart (93%) rename {packages => modules/basic_system}/components/lib/project_ui/unit_app_bar.dart (100%) rename {packages => modules/basic_system}/components/lib/project_ui/wrapper/honour_wrapper.dart (100%) rename {packages => modules/basic_system}/components/pubspec.yaml (97%) rename {packages => modules/basic_system}/components/test/components_test.dart (100%) rename {packages/awesome => modules/basic_system/l10n}/.gitignore (100%) rename {packages => modules/basic_system}/l10n/.metadata (100%) rename {packages/authentication => modules/basic_system/l10n}/CHANGELOG.md (100%) rename {packages/authentication => modules/basic_system/l10n}/LICENSE (100%) rename {packages/authentication => modules/basic_system/l10n}/README.md (100%) rename {packages/authentication => modules/basic_system/l10n}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/l10n/l10n.yaml (100%) rename {packages => modules/basic_system}/l10n/l10n_copy.sh (100%) rename {packages => modules/basic_system}/l10n/lib/arb/app_en.arb (100%) rename {packages => modules/basic_system}/l10n/lib/arb/app_zh.arb (100%) rename {packages => modules/basic_system}/l10n/lib/enum/language.dart (100%) rename {packages => modules/basic_system}/l10n/lib/ext.dart (100%) rename {packages => modules/basic_system}/l10n/lib/gen_l10n/app_localizations.dart (100%) rename {packages => modules/basic_system}/l10n/lib/gen_l10n/app_localizations_en.dart (100%) rename {packages => modules/basic_system}/l10n/lib/gen_l10n/app_localizations_zh.dart (100%) rename {packages => modules/basic_system}/l10n/lib/l10n.dart (100%) rename {packages => modules/basic_system}/l10n/pubspec.yaml (100%) rename {packages => modules/basic_system}/l10n/test/l10n_copy.dart (100%) rename {packages => modules/basic_system}/l10n/test/l10n_test.dart (100%) rename {packages/authentication => modules/basic_system/storage}/.gitignore (100%) rename {packages/algorithm => modules/basic_system/storage}/.metadata (100%) rename {packages/awesome => modules/basic_system/storage}/CHANGELOG.md (100%) rename {packages/awesome => modules/basic_system/storage}/LICENSE (100%) rename {packages/awesome => modules/basic_system/storage}/README.md (100%) rename {packages/awesome => modules/basic_system/storage}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/storage/lib/src/app_storage.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/article_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/category_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/like_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/node_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/dao/widget_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/flutter.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/flutter_db_store.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/article.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/category_po.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/columnize.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/enums.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/node_po.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/widget_filter.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter/model/widget_po.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/db_storage/storage.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/sp_storage/cao/app_config_cao.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/sp_storage/exp.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/sp_storage/models/app_config_po.dart (100%) rename {packages => modules/basic_system}/storage/lib/src/sp_storage/sp_storage.dart (100%) rename {packages => modules/basic_system}/storage/lib/storage.dart (100%) rename {packages => modules/basic_system}/storage/pubspec.yaml (100%) rename {packages => modules/basic_system}/storage/test/db_storage_test.dart (100%) rename {packages/draw_system => modules/basic_system/toly_ui}/.gitignore (100%) rename {packages/awesome => modules/basic_system/toly_ui}/.metadata (100%) rename {packages/components => modules/basic_system/toly_ui}/CHANGELOG.md (100%) rename {packages/components => modules/basic_system/toly_ui}/LICENSE (100%) rename {packages/components => modules/basic_system/toly_ui}/README.md (100%) rename {packages/components => modules/basic_system/toly_ui}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/toly_ui/lib/adapter/platform_view_adapter.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/button/feedback_widget.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/code.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/code_widget.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/high_light_code.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/highlighter_style.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/language/dart_languge.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/code/language/language.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/decorations/round_rect_rab_indicator.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/default/loading/planet_loading.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/dialog/alert_conform_dialog.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/dialog/delete_message_panel.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/input/edit_panel.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/input/icon_input.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/input/input_button.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/markdown/markdown_widget.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/markdown/md_text_styles.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/markdown/syntax_high_lighter.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/object/windmill.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/popable/drop_selectable_widget.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/selector/burst_menu.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/selector/color_chooser.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/selector/multi_chip_filter.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/sliver_header/sliver_pinned_header.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/sliver_header/sliver_snap_header.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/circle.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/circle_image.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/circle_text.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/color_wrapper.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/math_runner.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/panel.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/tag.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/text_typer.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/ti/toly_switch_list_tile.dart (100%) rename {packages => modules/basic_system}/toly_ui/lib/toly_ui.dart (100%) rename {packages => modules/basic_system}/toly_ui/pubspec.yaml (100%) rename {packages => modules/basic_system}/toly_ui/test/toly_ui_test.dart (100%) rename {packages/components => modules/basic_system/utils}/.gitignore (100%) rename {packages/artifact => modules/basic_system/utils}/.metadata (100%) rename {packages/draw_system => modules/basic_system/utils}/CHANGELOG.md (100%) rename {packages/draw_system => modules/basic_system/utils}/LICENSE (100%) rename {packages/draw_system => modules/basic_system/utils}/README.md (100%) rename {packages/draw_system => modules/basic_system/utils}/analysis_options.yaml (100%) rename {packages => modules/basic_system}/utils/lib/src/color_utils.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/convert_man.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/http_util.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/http_utils.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/logs_interceptor.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/response_interceptor.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/task_result.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/http_utils/token_interceptor.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/random_provider.dart (100%) rename {packages => modules/basic_system}/utils/lib/src/toast.dart (100%) rename {packages => modules/basic_system}/utils/lib/utils.dart (100%) rename {packages => modules/basic_system}/utils/pubspec.yaml (100%) rename {packages/algorithm => modules/basic_system/utils}/test/utils_test.dart (100%) rename {packages/storage => modules/knowledge_system/algorithm}/.gitignore (100%) rename {packages/storage => modules/knowledge_system/algorithm}/.metadata (100%) rename {packages/l10n => modules/knowledge_system/algorithm}/CHANGELOG.md (100%) rename {packages/l10n => modules/knowledge_system/algorithm}/LICENSE (100%) rename {packages/l10n => modules/knowledge_system/algorithm}/README.md (100%) rename {packages/l10n => modules/knowledge_system/algorithm}/analysis_options.yaml (100%) rename {packages => modules/knowledge_system}/algorithm/lib/algorithm.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions/AStar.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions/BFS.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions/BestFS.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions/DFS.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/bubble.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/cocktail.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/comb.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/cycle.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/gnome.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/heap.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/insertion.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/merge.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/oddEven.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/quick.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/selection.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/algorithm/sort/functions/shell.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/data_scope/sort_config.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/data_scope/state.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/data_scope/finding_config.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/data_scope/finding_state.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/data_scope/position.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/data_scope/random_queue.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/view/board.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/view/finding_page.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/finding/view/finding_tool_bar.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/menu/algo_menu.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/menu/finding.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/menu/sort.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/router/router.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/view/algo_desk_navigation.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/view/algo_menu_cell.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/navigation/view/algo_menu_tree.dart (98%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/algo_page.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/desktop/desk_algo_panel.dart (97%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/data_painter.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/sort_page.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/sort_parper.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/sort_setting.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/top_bar/sort_bar.dart (100%) rename {packages => modules/knowledge_system}/algorithm/lib/src/views/sort/top_bar/sort_button.dart (96%) rename {packages => modules/knowledge_system}/algorithm/pubspec.yaml (92%) rename {packages/artifact => modules/knowledge_system/algorithm}/test/utils_test.dart (100%) rename {packages/utils => modules/knowledge_system/artifact}/.gitignore (100%) rename {packages/utils => modules/knowledge_system/artifact}/.metadata (100%) rename {packages/layout => modules/knowledge_system/artifact}/CHANGELOG.md (100%) rename {packages/layout => modules/knowledge_system/artifact}/LICENSE (100%) rename {packages/layout => modules/knowledge_system/artifact}/README.md (100%) rename {packages/layout => modules/knowledge_system/artifact}/analysis_options.yaml (100%) rename {packages => modules/knowledge_system}/artifact/lib/artifact.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/bloc/article/bloc.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/bloc/columnize/bloc.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/bloc/exp.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/data/exp.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/data/repository/article_repository.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/data/repository/columnize_repository.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/article_detail_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/column_detail_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/columnize_page_view.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/sliver_article.dart (88%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/sliver_columnize.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/artifact_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/building/building_panel.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/desk_artifact_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/toly_refresh_indicator.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/articles/view/wrapper/refresh.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_bloc/point_event.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_bloc/point_state.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/bloc/point_system_bloc.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/api/app_info.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/api/category_api.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/api/issues_api.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/github_model.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/github_user.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/issue.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/issue_comment.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/license.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/repository.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/data/model/repository_permissions.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/exp.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/desk_ui/desk_point_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/issues_point/issue_item.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/issues_point/issues_detail.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/issues_point/issues_point_page.dart (100%) rename {packages => modules/knowledge_system}/artifact/lib/src/points/view/issues_point/repo_widget.dart (100%) rename {packages => modules/knowledge_system}/artifact/pubspec.yaml (89%) rename {packages/utils => modules/knowledge_system/artifact}/test/utils_test.dart (100%) rename {packages/l10n => modules/knowledge_system/awesome}/.gitignore (100%) rename {packages/draw_system => modules/knowledge_system/awesome}/.metadata (100%) rename {packages/storage => modules/knowledge_system/awesome}/CHANGELOG.md (100%) rename {packages/storage => modules/knowledge_system/awesome}/LICENSE (100%) rename {packages/storage => modules/knowledge_system/awesome}/README.md (100%) rename {packages/storage => modules/knowledge_system/awesome}/analysis_options.yaml (100%) rename {packages => modules/knowledge_system}/awesome/lib/awesome.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/main.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/main.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart (100%) rename {packages => modules/knowledge_system}/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart (100%) rename {packages => modules/knowledge_system}/awesome/pubspec.yaml (100%) rename {packages => modules/knowledge_system}/awesome/test/awesome_test.dart (100%) rename {packages => modules/knowledge_system}/layout/.gitignore (100%) rename {packages => modules/knowledge_system}/layout/.metadata (100%) rename {packages/toly_ui => modules/knowledge_system/layout}/CHANGELOG.md (100%) rename {packages/toly_ui => modules/knowledge_system/layout}/LICENSE (100%) rename {packages/toly_ui => modules/knowledge_system/layout}/README.md (100%) rename {packages/toly_ui => modules/knowledge_system/layout}/analysis_options.yaml (100%) rename {packages => modules/knowledge_system}/layout/lib/layout.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/bloc/display_logic.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/bloc/display_state.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/data/display_map/base.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/data/display_map/display_map.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/data/display_map/funny.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/data/display_map/multi.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/data/model/display_frame.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/ext/go_router/listener.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/ext/go_router/path.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/base_layout.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/funny.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/layout.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/menu_repository_impl.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/multi.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/popable.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/menu/scroll.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/app_router.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/desk_router.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/size_clip_transition.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/view/app_desk_navigation.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/navigation/view/app_menu_tree.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/align/align_show.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/align/align_show2.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/padding/inner_padding.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/padding/outer_padding.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/padding/sizedbox_padding.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/positioned/positioned_show.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/size/size_display.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/size/size_loss_by_align.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/size/size_tight_constraint.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/base/size/size_unconstraint.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/components/grid_xy_layout.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/display/layout_playground.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/display/playground_bottom_bar.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/display/playground_top_bar.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/interest/elevator/elevator.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/layout_page.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/multi/flex/column_show.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/multi/flex/row_show.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/cons.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/data/flex_attr.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/data/stack_attr.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/data/wrap_attr.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/display_item.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/flex/flex_op_panel.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/flex/flex_playground.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/form_item/item_selector.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/form_item/item_size_input.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/form_item/value_input.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/stack/stack_op_panel.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/stack/stack_playground.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/playground/view/wrap/wrap_playground.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/popable/autocomplete_demo.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/popable/dropdown_button_demo.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/popable/dropdown_menu_demo.dart (100%) rename {packages => modules/knowledge_system}/layout/lib/src/views/test_show.dart (100%) rename {packages => modules/knowledge_system}/layout/pubspec.yaml (100%) rename {packages => modules/knowledge_system}/layout/test/layout_test.dart (100%) rename {packages/toly_ui => modules/painting_system/draw_system}/.gitignore (100%) rename {packages/toly_ui => modules/painting_system/draw_system}/.metadata (100%) rename {packages/treasure_tools => modules/painting_system/draw_system}/CHANGELOG.md (100%) rename {packages/treasure_tools => modules/painting_system/draw_system}/LICENSE (100%) rename {packages/treasure_tools => modules/painting_system/draw_system}/README.md (100%) rename {packages/treasure_tools => modules/painting_system/draw_system}/analysis_options.yaml (100%) rename {packages => modules/painting_system}/draw_system/lib/draw_system.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/bezier3_player/touch_info.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/circle_halo.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/curve_shower/anim_painter.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/curve_shower/point_data.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/draw_path.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/dundun_path.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/rotate_by_point/line.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/anim/spring_widget.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/circle_packing.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/cubic_disarray.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/hypnotic_squares.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/joy_division.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/piet_mondrian.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/tiled_lines.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/triangular_mesh.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/art/un_deux_trois.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/clock_widget.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/digital/digital_painter.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/digital/digital_path.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/digital/digital_shower.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/digital/digital_widget.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/draw_grid_axis.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/draw_path_fun.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/draw_picture.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/n_side/n_side_page.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/n_side/shape_painter.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/polar/angle_painter.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/polar/polar.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/polar/polar_painter_widget.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/base/windmill.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/bloc/gallery_unit/bloc.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/desk_ui/desk_frame.dart (98%) rename {packages => modules/painting_system}/draw_system/lib/src/desk_ui/desk_gallery_unit.dart (97%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/bufeng/bufeng_panel.dart (97%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/bufeng/config.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/bufeng/painter.dart (97%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/dundun_view.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/random_portrait.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/stemp/stamp_data.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/fun/stemp/stamp_paper.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/gallery_card_item.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/gallery_detail_page.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/gallery_factory.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/gallery_unit.dart (98%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/out/clock_fx.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/out/clock_widget.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/out/particle.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/out/rnd.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/random/particle.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/random/particle_manage.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/random/random_particle.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/random/world_render.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split/particle.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split/particle_manage.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split/particle_split.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split/world_render.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split_img/particle.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split_img/particle_manage.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split_img/split_image.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/particle/split_img/world_render.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/picture_frame.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/utils/colors.dart (100%) rename {packages => modules/painting_system}/draw_system/lib/src/utils/coordinate.dart (100%) rename {packages => modules/painting_system}/draw_system/pubspec.yaml (91%) rename {packages => modules/painting_system}/draw_system/test/draw_system_test.dart (100%) rename {packages => modules/tools_system}/treasure_tools/.gitignore (100%) rename {packages => modules/tools_system}/treasure_tools/.metadata (100%) rename {packages/utils => modules/tools_system/treasure_tools}/CHANGELOG.md (100%) rename {packages/utils => modules/tools_system/treasure_tools}/LICENSE (100%) rename {packages/utils => modules/tools_system/treasure_tools}/README.md (100%) rename {packages/utils => modules/tools_system/treasure_tools}/analysis_options.yaml (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/bloc/state.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/class_generator.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/code_gen_page.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/data/task_result.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/desk_widget_top_bar.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/model/class.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/model/field.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/popable/class_gen_field.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/popable/toly_select.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/src/wrapper.dart (100%) rename {packages => modules/tools_system}/treasure_tools/lib/treasure_tools.dart (100%) rename {packages => modules/tools_system}/treasure_tools/pubspec.yaml (94%) rename {packages => modules/tools_system}/treasure_tools/test/iconfont_parser_test.dart (100%) rename {packages => modules/tools_system}/treasure_tools/test/treasure_tools_test.dart (100%) rename {packages => modules/tools_system}/treasure_tools/test/yaml_parser_test.dart (100%) rename {packages => modules/tools_system}/treasure_tools/test/yaml_parser_test2.dart (100%) rename {packages => modules/widget_system}/widget_module/.gitignore (100%) rename {packages => modules/widget_system}/widget_module/.metadata (100%) rename {packages => modules/widget_system}/widget_module/CHANGELOG.md (100%) rename {packages => modules/widget_system}/widget_module/LICENSE (100%) rename {packages => modules/widget_system}/widget_module/README.md (100%) rename {packages => modules/widget_system}/widget_module/analysis_options.yaml (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/blocs.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_bloc/category_bloc.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_bloc/category_event.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_bloc/category_state.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/widgets_bloc/widgets_event.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/blocs/widgets_bloc/widgets_state.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/category_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/db_impl/catagory_db_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/db_impl/db_impl.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/db_impl/node_db_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/db_impl/widget_db_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/memory_impl/memory_node_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/memory_impl/memory_widget_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/category_model.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/enums.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/model.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/node_model.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/widget_filter.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/model/widget_model.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/node_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/widget_repository.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/data/zone.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/components/collected_tag.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/desk_ui.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/category_detail.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/category_list_item.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/category_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/collect_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/edit_category_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/empty_category.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/home_right_drawer.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/like_widget_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/sync/async_button.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/sync/category_api.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/category_page/sync/upload_button.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/mobile_ui.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/search_page/app_search_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/search_page/search_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/search_page/standard_search_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/search_page/standard_search_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/home_drawer.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/standard_home_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/standard_home_search.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/widget_model_item.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/views/mobile/widget_page/widget_page.dart (100%) rename {packages => modules/widget_system}/widget_module/lib/widget_module.dart (100%) rename {packages => modules/widget_system}/widget_module/pubspec.yaml (86%) rename {packages => modules/widget_system}/widget_module/test/widget_module_test.dart (100%) rename {packages => modules/widget_system}/widgets/.gitignore (100%) rename {packages => modules/widget_system}/widgets/.metadata (100%) rename {packages => modules/widget_system}/widgets/CHANGELOG.md (100%) rename {packages => modules/widget_system}/widgets/LICENSE (100%) rename {packages => modules/widget_system}/widgets/README.md (100%) rename {packages => modules/widget_system}/widgets/analysis_options.yaml (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart (100%) rename {packages => modules/widget_system}/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/ErrorWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/ListWheelViewport/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/ListWheelViewport/node2_perspective.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/ListWheelViewport/node4_opacity.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/PerformanceOverlay/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/RawImage/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Other/Table/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/Directionality/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/Expanded/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/Flexible/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/IconTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/InheritedModel/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/LayoutId/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/Positioned/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/TableCell/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart (100%) rename {packages => modules/widget_system}/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/CustomScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/DecoratedSliver/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverAppBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverFillViewport/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverGrid/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverOpacity/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverPadding/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AppBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AppBar/node2_tab.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Checkbox/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Dismissible/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DragTarget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Draggable/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Draggable/node2_data.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Draggable/node3_use.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DrawerController/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownMenu/node1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownMenu/node2.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/DropdownMenu/node3.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/EditableText/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Form/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/FormField/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Hero/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node2_fit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node3_alignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node5_repeat.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Ink/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Ink/node2_image.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InkResponse/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InkResponse/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InkWell/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InkWell/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/LicensePage/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Material/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Material/node2_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Navigator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Overlay/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PageView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PageView/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PageView/node3_controller.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Radio/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawChip/node1_press.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawChip/node2_select.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Scaffold/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Scrollable/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/SelectableText/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/SelectableText/node2_align.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Slider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Slider/node2_lable.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Stepper/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Stepper/node2_type.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Switch/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Switch/node2_image.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TabBarView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextButton/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextField/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextField/node2_cursor.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextField/node3_decoration.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TextFormField/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Tooltip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatefulWidget/YearPicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ActionChip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/BackButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Badge/node_1.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Badge/node_2.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Badge/node_3.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Banner/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Builder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Card/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Card/node2_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Chip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Chip/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Chip/node3_delete.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CloseButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/desc_zh-CN.json (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node2_child.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node3_alignment.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node4_decoration.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node5_transform.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Container/node6_constraints.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DataTable/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DataTable/node2_operation.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DayPicker/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Dialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Divider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Divider/node2_height.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Drawer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FilterChip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FlatButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GirdView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GirdView/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GirdView/node3_extend.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GirdView/node4_builder.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GridPaper/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GridTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Icon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Icon/node2_diy.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/IconButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/InputChip/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/InputChip/node2_select.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListTile/node2_select.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListTile/node3_dense.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListView/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListView/node3_builder.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ListView/node4_separated.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Listener/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/PageStorage/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Placeholder/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SafeArea/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SnackBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Spacer/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Spacer/node2_flex.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Tab/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/TabBar/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node2_shadows.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node3_decoration.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node4_textAlign.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node5_textDirection.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Text/node6_softWrap.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Theme/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Theme/node2_use.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Title/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Visibility/node1_base.dart (100%) rename {packages => modules/widget_system}/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/other_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/proxy_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/render_object_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/sliver_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/stateful_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/exp/stateless_unit.dart (100%) rename {packages => modules/widget_system}/widgets/lib/utils/color_utils.dart (100%) rename {packages => modules/widget_system}/widgets/lib/utils/dialog_about.dart (100%) rename {packages => modules/widget_system}/widgets/lib/utils/pather.dart (100%) rename {packages => modules/widget_system}/widgets/lib/widgets.dart (100%) rename {packages => modules/widget_system}/widgets/lib/widgets_map.dart (100%) rename {packages => modules/widget_system}/widgets/pubspec.yaml (95%) rename {packages => modules/widget_system}/widgets/test/widgets_test.dart (100%) diff --git a/analysis_options.yaml b/analysis_options.yaml index 2fdeaeb0..3dace6c2 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -10,21 +10,13 @@ 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 file_names: false - # 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 +analyzer: + exclude: + - modules/widget_system/widgets/** + + + diff --git a/lib/main.dart b/lib/main.dart index 31bcc188..1e7e5501 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,18 +1,11 @@ -import 'package:app/app.dart'; -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/material.dart'; +import 'dart:async'; +import 'stater/boot_start.dart'; -import 'app/bloc_wrapper.dart'; -import 'app/flutter_unit.dart'; -import 'app_stater/impl/app_start_action.dart'; -import 'app_stater/impl/start_repository.dart'; - -void main() { - runApp( - AppStartScope( - repository: const AppStartRepositoryImpl(), - appStartAction: const AppStartActionImpl(), - child: BlocWrapper(child: FlutterUnit3()), - ), - ); +void main(List args) { + runZonedGuarded(() => bootStart(args), _globalErrorHandler); } + +void _globalErrorHandler(Object exception, StackTrace trace) async{ + print(trace); + // 可自定义处理全局异常 +} \ No newline at end of file diff --git a/lib/stater/boot_start.dart b/lib/stater/boot_start.dart new file mode 100644 index 00000000..e26f9142 --- /dev/null +++ b/lib/stater/boot_start.dart @@ -0,0 +1,21 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; + +import '../structure/wrapper/bloc_wrapper.dart'; +import '../structure/flutter_unit.dart'; +import 'logic/app_start_action.dart'; +import 'logic/app_start_repository.dart'; + +export 'view/splash/Flutter_unit_splash.dart'; +export 'view/error/app_start_error.dart'; + +void bootStart(List args) { + runApp( + AppStartScope( + repository: const AppStartRepositoryImpl(), + appStartAction: const AppStartActionImpl(), + child: BlocWrapper(child: FlutterUnit3()), + ), + ); +} diff --git a/lib/app_stater/impl/app_start_action.dart b/lib/stater/logic/app_start_action.dart similarity index 100% rename from lib/app_stater/impl/app_start_action.dart rename to lib/stater/logic/app_start_action.dart diff --git a/lib/app_stater/impl/start_repository.dart b/lib/stater/logic/app_start_repository.dart similarity index 100% rename from lib/app_stater/impl/start_repository.dart rename to lib/stater/logic/app_start_repository.dart diff --git a/lib/app_stater/view/error/app_start_error.dart b/lib/stater/view/error/app_start_error.dart similarity index 100% rename from lib/app_stater/view/error/app_start_error.dart rename to lib/stater/view/error/app_start_error.dart diff --git a/lib/app_stater/view/splash/standard_unit_splash.dart b/lib/stater/view/splash/Flutter_unit_splash.dart similarity index 83% rename from lib/app_stater/view/splash/standard_unit_splash.dart rename to lib/stater/view/splash/Flutter_unit_splash.dart index 22e73ef4..2c76c20a 100644 --- a/lib/app_stater/view/splash/standard_unit_splash.dart +++ b/lib/stater/view/splash/Flutter_unit_splash.dart @@ -6,7 +6,6 @@ import 'package:flutter/services.dart'; import 'dart:ui' as ui; - import 'flutter_unit_text.dart'; /// create by 张风捷特烈 on 2020-03-07 @@ -42,7 +41,7 @@ class _SplashBody extends StatelessWidget { return Column( children: [ const SplashTopBar( - leading: Text('Flutter Unit',style: titleStyle), + leading: Text('Flutter Unit', style: titleStyle), logo: CircleAvatar( backgroundImage: AssetImage('assets/images/icon_head.webp'), radius: 14, @@ -102,11 +101,7 @@ class ColorfulText extends StatelessWidget { ); return Text( "U", - style: TextStyle( - fontSize: 26, - height: 1, - fontWeight: FontWeight.bold, - foreground: paint), + style: TextStyle(fontSize: 26, height: 1, fontWeight: FontWeight.bold, foreground: paint), ); } } @@ -115,26 +110,29 @@ class SplashTopBar extends StatelessWidget { final Widget? leading; final Widget? logo; - const SplashTopBar({super.key, this.leading,this.logo}); + const SplashTopBar({super.key, this.leading, this.logo}); @override Widget build(BuildContext context) { - if(!isDesk) return const SizedBox.shrink(); + if (!isDesk) return const SizedBox.shrink(); return DragToMoveWrapper( child: Stack( children: [ Container( alignment: Alignment.topLeft, - padding: const EdgeInsets.symmetric(horizontal: 12.0,vertical: 8), + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8), child: Row( children: [ - if (leading != null) Row( - children: [ - if(logo!=null)logo!, - const SizedBox(width: 8,), - leading!, - ], - ), + if (leading != null) + Row( + children: [ + if (logo != null) logo!, + const SizedBox( + width: 8, + ), + leading!, + ], + ), const Spacer(), const SizedBox( width: 20, @@ -142,10 +140,10 @@ class SplashTopBar extends StatelessWidget { ], ), ), - Positioned( - - right: 0, - child: const WindowButtons()) + const Positioned( + right: 0, + child: WindowButtons(), + ) ], ), ); diff --git a/lib/app_stater/view/splash/flutter_unit_text.dart b/lib/stater/view/splash/flutter_unit_text.dart similarity index 100% rename from lib/app_stater/view/splash/flutter_unit_text.dart rename to lib/stater/view/splash/flutter_unit_text.dart diff --git a/lib/app/flutter_unit.dart b/lib/structure/flutter_unit.dart similarity index 92% rename from lib/app/flutter_unit.dart rename to lib/structure/flutter_unit.dart index 744e2d57..681be0ce 100644 --- a/lib/app/flutter_unit.dart +++ b/lib/structure/flutter_unit.dart @@ -2,12 +2,13 @@ import 'package:algorithm/algorithm.dart'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:flutter_unit/navigation/routers/app_route.dart'; + import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; import 'package:tolyui/tolyui.dart'; +import 'navigation/router/app_route.dart'; + /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: 主程序 diff --git a/lib/navigation/routers/app_route.dart b/lib/structure/navigation/router/app_route.dart similarity index 86% rename from lib/navigation/routers/app_route.dart rename to lib/structure/navigation/router/app_route.dart index 68c45c91..fd6c50fa 100644 --- a/lib/navigation/routers/app_route.dart +++ b/lib/structure/navigation/router/app_route.dart @@ -1,11 +1,9 @@ import 'package:app/app.dart'; +import 'package:flutter_unit/stater/boot_start.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import '../../app_stater/view/error/app_start_error.dart'; -import '../../app_stater/view/splash/standard_unit_splash.dart'; - import 'desk_route.dart'; import 'mobile_route.dart'; diff --git a/lib/navigation/routers/desk_route.dart b/lib/structure/navigation/router/desk_route.dart similarity index 86% rename from lib/navigation/routers/desk_route.dart rename to lib/structure/navigation/router/desk_route.dart index 4c9ce9f3..4fd79248 100644 --- a/lib/navigation/routers/desk_route.dart +++ b/lib/structure/navigation/router/desk_route.dart @@ -1,20 +1,12 @@ -import 'package:algorithm/algorithm.dart'; +import 'package:app/app.dart'; import 'package:artifact/artifact.dart'; import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/views/account/desk/desk_account_page.dart'; -import 'package:flutter_unit/app/views/setting/setting_page.dart'; + import 'package:go_router/go_router.dart'; import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/widget_module.dart'; - -import '../../app/views/about/about_app_page.dart'; -import '../../app/views/about/version_info.dart'; -import '../../app/views/setting/code_style_setting.dart'; -import '../../app/views/setting/font_setting.dart'; -import '../../app/views/setting/theme_color_setting.dart'; -import '../../app/views/setting/theme_model_setting.dart'; -import '../views/desk/flutter_unit_desk_navigation.dart'; +import '../views/desktop/flutter_unit_desk_navigation.dart'; final RouteBase appNavRoute = ShellRoute( builder: (BuildContext context, GoRouterState state, Widget child) { diff --git a/lib/navigation/routers/mobile_route.dart b/lib/structure/navigation/router/mobile_route.dart similarity index 85% rename from lib/navigation/routers/mobile_route.dart rename to lib/structure/navigation/router/mobile_route.dart index 7fba9544..7ea157f0 100644 --- a/lib/navigation/routers/mobile_route.dart +++ b/lib/structure/navigation/router/mobile_route.dart @@ -1,17 +1,10 @@ +import 'package:app/app.dart'; +import 'package:app/view/data_manage/data_manage_page.dart'; import 'package:authentication/authentication.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/widget_module.dart'; -import '../../app/views/about/about_app_page.dart'; -import '../../app/views/about/about_me_page.dart'; -import '../../app/views/about/version_info.dart'; -import '../../app/views/data_manage/data_manage_page.dart'; -import '../../app/views/setting/code_style_setting.dart'; -import '../../app/views/setting/font_setting.dart'; -import '../../app/views/setting/setting_page.dart'; -import '../../app/views/setting/theme_color_setting.dart'; -import '../../app/views/setting/theme_model_setting.dart'; import '../views/unit_navigation.dart'; final List appMobileNavRoute = [ diff --git a/lib/navigation/views/desk/flutter_unit_desk_navigation.dart b/lib/structure/navigation/views/desktop/flutter_unit_desk_navigation.dart similarity index 100% rename from lib/navigation/views/desk/flutter_unit_desk_navigation.dart rename to lib/structure/navigation/views/desktop/flutter_unit_desk_navigation.dart diff --git a/lib/navigation/views/desk/menu_bar_leading.dart b/lib/structure/navigation/views/desktop/menu_bar_leading.dart similarity index 100% rename from lib/navigation/views/desk/menu_bar_leading.dart rename to lib/structure/navigation/views/desktop/menu_bar_leading.dart diff --git a/lib/navigation/views/desk/menu_bar_tail.dart b/lib/structure/navigation/views/desktop/menu_bar_tail.dart similarity index 100% rename from lib/navigation/views/desk/menu_bar_tail.dart rename to lib/structure/navigation/views/desktop/menu_bar_tail.dart diff --git a/lib/navigation/views/desk/theme_model_switch_icon.dart b/lib/structure/navigation/views/desktop/theme_model_switch_icon.dart similarity index 100% rename from lib/navigation/views/desk/theme_model_switch_icon.dart rename to lib/structure/navigation/views/desktop/theme_model_switch_icon.dart diff --git a/lib/navigation/views/desk/toly_unit_menu_cell.dart b/lib/structure/navigation/views/desktop/toly_unit_menu_cell.dart similarity index 100% rename from lib/navigation/views/desk/toly_unit_menu_cell.dart rename to lib/structure/navigation/views/desktop/toly_unit_menu_cell.dart diff --git a/lib/navigation/views/pure_bottom_bar.dart b/lib/structure/navigation/views/pure_bottom_bar.dart similarity index 100% rename from lib/navigation/views/pure_bottom_bar.dart rename to lib/structure/navigation/views/pure_bottom_bar.dart diff --git a/lib/navigation/views/unit_navigation.dart b/lib/structure/navigation/views/unit_navigation.dart similarity index 100% rename from lib/navigation/views/unit_navigation.dart rename to lib/structure/navigation/views/unit_navigation.dart diff --git a/lib/app/bloc_wrapper.dart b/lib/structure/wrapper/bloc_wrapper.dart similarity index 95% rename from lib/app/bloc_wrapper.dart rename to lib/structure/wrapper/bloc_wrapper.dart index 8a4b7b0e..10346fa6 100644 --- a/lib/app/bloc_wrapper.dart +++ b/lib/structure/wrapper/bloc_wrapper.dart @@ -12,15 +12,13 @@ import 'package:widget_module/widget_module.dart'; /// contact me by email 1981462002@qq.com /// 说明: Bloc提供器包裹层 -// final AppStart storage = AppStart(); - class BlocWrapper extends StatefulWidget { final Widget child; const BlocWrapper({Key? key, required this.child}) : super(key: key); @override - _BlocWrapperState createState() => _BlocWrapperState(); + State createState() => _BlocWrapperState(); } class _BlocWrapperState extends State { diff --git a/lib/navigation/views/overlay_tool_wrapper.dart b/lib/structure/wrapper/overlay_tool_wrapper.dart similarity index 100% rename from lib/navigation/views/overlay_tool_wrapper.dart rename to lib/structure/wrapper/overlay_tool_wrapper.dart diff --git a/packages/algorithm/.gitignore b/modules/basic_system/app/.gitignore similarity index 100% rename from packages/algorithm/.gitignore rename to modules/basic_system/app/.gitignore diff --git a/packages/app/.metadata b/modules/basic_system/app/.metadata similarity index 100% rename from packages/app/.metadata rename to modules/basic_system/app/.metadata diff --git a/packages/algorithm/CHANGELOG.md b/modules/basic_system/app/CHANGELOG.md similarity index 100% rename from packages/algorithm/CHANGELOG.md rename to modules/basic_system/app/CHANGELOG.md diff --git a/packages/algorithm/LICENSE b/modules/basic_system/app/LICENSE similarity index 100% rename from packages/algorithm/LICENSE rename to modules/basic_system/app/LICENSE diff --git a/packages/algorithm/README.md b/modules/basic_system/app/README.md similarity index 100% rename from packages/algorithm/README.md rename to modules/basic_system/app/README.md diff --git a/packages/algorithm/analysis_options.yaml b/modules/basic_system/app/analysis_options.yaml similarity index 100% rename from packages/algorithm/analysis_options.yaml rename to modules/basic_system/app/analysis_options.yaml diff --git a/packages/app/lib/app.dart b/modules/basic_system/app/lib/app.dart similarity index 93% rename from packages/app/lib/app.dart rename to modules/basic_system/app/lib/app.dart index 142e7ac8..e1e839f0 100644 --- a/packages/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -27,4 +27,6 @@ export 'package:fx_platform_adapter/platform_adapter.dart'; export 'app_config/app_config.dart'; -export 'app/action/action.dart'; \ No newline at end of file +export 'app/action/action.dart'; + +export 'view/view.dart'; \ No newline at end of file diff --git a/packages/app/lib/app/action/action.dart b/modules/basic_system/app/lib/app/action/action.dart similarity index 100% rename from packages/app/lib/app/action/action.dart rename to modules/basic_system/app/lib/app/action/action.dart diff --git a/packages/app/lib/app/action/url.dart b/modules/basic_system/app/lib/app/action/url.dart similarity index 100% rename from packages/app/lib/app/action/url.dart rename to modules/basic_system/app/lib/app/action/url.dart diff --git a/packages/app/lib/app/cons/cons.dart b/modules/basic_system/app/lib/app/cons/cons.dart similarity index 100% rename from packages/app/lib/app/cons/cons.dart rename to modules/basic_system/app/lib/app/cons/cons.dart diff --git a/packages/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart similarity index 100% rename from packages/app/lib/app/cons/global_value.dart rename to modules/basic_system/app/lib/app/cons/global_value.dart diff --git a/packages/app/lib/app/cons/path_unit.dart b/modules/basic_system/app/lib/app/cons/path_unit.dart similarity index 100% rename from packages/app/lib/app/cons/path_unit.dart rename to modules/basic_system/app/lib/app/cons/path_unit.dart diff --git a/packages/app/lib/app/cons/sp.dart b/modules/basic_system/app/lib/app/cons/sp.dart similarity index 100% rename from packages/app/lib/app/cons/sp.dart rename to modules/basic_system/app/lib/app/cons/sp.dart diff --git a/packages/app/lib/app/cons/str_unit.dart b/modules/basic_system/app/lib/app/cons/str_unit.dart similarity index 100% rename from packages/app/lib/app/cons/str_unit.dart rename to modules/basic_system/app/lib/app/cons/str_unit.dart diff --git a/packages/app/lib/app/res/toly_icon.dart b/modules/basic_system/app/lib/app/res/toly_icon.dart similarity index 100% rename from packages/app/lib/app/res/toly_icon.dart rename to modules/basic_system/app/lib/app/res/toly_icon.dart diff --git a/packages/app/lib/app/router/fade_page_route.dart b/modules/basic_system/app/lib/app/router/fade_page_route.dart similarity index 100% rename from packages/app/lib/app/router/fade_page_route.dart rename to modules/basic_system/app/lib/app/router/fade_page_route.dart diff --git a/packages/app/lib/app/router/slide_page_route.dart b/modules/basic_system/app/lib/app/router/slide_page_route.dart similarity index 100% rename from packages/app/lib/app/router/slide_page_route.dart rename to modules/basic_system/app/lib/app/router/slide_page_route.dart diff --git a/packages/app/lib/app/router/zero_page_route.dart b/modules/basic_system/app/lib/app/router/zero_page_route.dart similarity index 100% rename from packages/app/lib/app/router/zero_page_route.dart rename to modules/basic_system/app/lib/app/router/zero_page_route.dart diff --git a/packages/app/lib/app/style/behavior/no_scroll_behavior.dart b/modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart similarity index 63% rename from packages/app/lib/app/style/behavior/no_scroll_behavior.dart rename to modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart index 84c41938..82e89fe0 100644 --- a/packages/app/lib/app/style/behavior/no_scroll_behavior.dart +++ b/modules/basic_system/app/lib/app/style/behavior/no_scroll_behavior.dart @@ -6,6 +6,6 @@ import 'package:flutter/material.dart'; class NoScrollBehavior extends ScrollBehavior { @override - Widget buildViewportChrome( - BuildContext context, Widget child, AxisDirection axisDirection) => child; + Widget buildOverscrollIndicator( + BuildContext context, Widget child, ScrollableDetails details) => child; } \ No newline at end of file diff --git a/packages/app/lib/app/style/gap.dart b/modules/basic_system/app/lib/app/style/gap.dart similarity index 100% rename from packages/app/lib/app/style/gap.dart rename to modules/basic_system/app/lib/app/style/gap.dart diff --git a/packages/app/lib/app/style/shape/coupon_shape_border.dart b/modules/basic_system/app/lib/app/style/shape/coupon_shape_border.dart similarity index 100% rename from packages/app/lib/app/style/shape/coupon_shape_border.dart rename to modules/basic_system/app/lib/app/style/shape/coupon_shape_border.dart diff --git a/packages/app/lib/app/style/shape/techno_shape.dart b/modules/basic_system/app/lib/app/style/shape/techno_shape.dart similarity index 100% rename from packages/app/lib/app/style/shape/techno_shape.dart rename to modules/basic_system/app/lib/app/style/shape/techno_shape.dart diff --git a/packages/app/lib/app/style/transition/fade_page_transitions_builder.dart b/modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart similarity index 100% rename from packages/app/lib/app/style/transition/fade_page_transitions_builder.dart rename to modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart diff --git a/packages/app/lib/app/style/transition/size_clip_transition.dart b/modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart similarity index 100% rename from packages/app/lib/app/style/transition/size_clip_transition.dart rename to modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart diff --git a/packages/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart similarity index 100% rename from packages/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart rename to modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart diff --git a/packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart b/modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart similarity index 100% rename from packages/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart rename to modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart diff --git a/packages/app/lib/app/style/unit_color.dart b/modules/basic_system/app/lib/app/style/unit_color.dart similarity index 100% rename from packages/app/lib/app/style/unit_color.dart rename to modules/basic_system/app/lib/app/style/unit_color.dart diff --git a/packages/app/lib/app/style/unit_text_style.dart b/modules/basic_system/app/lib/app/style/unit_text_style.dart similarity index 100% rename from packages/app/lib/app/style/unit_text_style.dart rename to modules/basic_system/app/lib/app/style/unit_text_style.dart diff --git a/packages/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart similarity index 100% rename from packages/app/lib/app/theme/app_theme.dart rename to modules/basic_system/app/lib/app/theme/app_theme.dart diff --git a/packages/app/lib/app/theme/size_unit.dart b/modules/basic_system/app/lib/app/theme/size_unit.dart similarity index 100% rename from packages/app/lib/app/theme/size_unit.dart rename to modules/basic_system/app/lib/app/theme/size_unit.dart diff --git a/packages/app/lib/app_config/app_config.dart b/modules/basic_system/app/lib/app_config/app_config.dart similarity index 100% rename from packages/app/lib/app_config/app_config.dart rename to modules/basic_system/app/lib/app_config/app_config.dart diff --git a/packages/app/lib/app_config/bloc/bloc.dart b/modules/basic_system/app/lib/app_config/bloc/bloc.dart similarity index 100% rename from packages/app/lib/app_config/bloc/bloc.dart rename to modules/basic_system/app/lib/app_config/bloc/bloc.dart diff --git a/packages/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart similarity index 100% rename from packages/app/lib/app_config/bloc/state.dart rename to modules/basic_system/app/lib/app_config/bloc/state.dart diff --git a/packages/app/lib/app_config/repository/repository.dart b/modules/basic_system/app/lib/app_config/repository/repository.dart similarity index 100% rename from packages/app/lib/app_config/repository/repository.dart rename to modules/basic_system/app/lib/app_config/repository/repository.dart diff --git a/packages/app/lib/app_update/bloc/bloc.dart b/modules/basic_system/app/lib/app_update/bloc/bloc.dart similarity index 100% rename from packages/app/lib/app_update/bloc/bloc.dart rename to modules/basic_system/app/lib/app_update/bloc/bloc.dart diff --git a/packages/app/lib/app_update/bloc/event.dart b/modules/basic_system/app/lib/app_update/bloc/event.dart similarity index 100% rename from packages/app/lib/app_update/bloc/event.dart rename to modules/basic_system/app/lib/app_update/bloc/event.dart diff --git a/packages/app/lib/app_update/bloc/state.dart b/modules/basic_system/app/lib/app_update/bloc/state.dart similarity index 100% rename from packages/app/lib/app_update/bloc/state.dart rename to modules/basic_system/app/lib/app_update/bloc/state.dart diff --git a/lib/app/views/about/about_app_page.dart b/modules/basic_system/app/lib/view/about/about_app_page.dart similarity index 98% rename from lib/app/views/about/about_app_page.dart rename to modules/basic_system/app/lib/view/about/about_app_page.dart index d0230f79..498b3a10 100644 --- a/lib/app/views/about/about_app_page.dart +++ b/modules/basic_system/app/lib/view/about/about_app_page.dart @@ -2,11 +2,12 @@ /// contact me by email 1981462002@qq.com /// 说明: ... import 'package:app/app.dart'; +import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/views/time_line/flutter_unit_time_line.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; + class AboutAppPage extends StatelessWidget { const AboutAppPage({Key? key}) : super(key: key); diff --git a/lib/app/views/about/about_me_page.dart b/modules/basic_system/app/lib/view/about/about_me_page.dart similarity index 100% rename from lib/app/views/about/about_me_page.dart rename to modules/basic_system/app/lib/view/about/about_me_page.dart diff --git a/lib/app/views/about/version/version_shower.dart b/modules/basic_system/app/lib/view/about/version/version_shower.dart similarity index 100% rename from lib/app/views/about/version/version_shower.dart rename to modules/basic_system/app/lib/view/about/version/version_shower.dart diff --git a/lib/app/views/about/version_info.dart b/modules/basic_system/app/lib/view/about/version_info.dart similarity index 100% rename from lib/app/views/about/version_info.dart rename to modules/basic_system/app/lib/view/about/version_info.dart diff --git a/lib/app/views/account/desk/desk_account_page.dart b/modules/basic_system/app/lib/view/account/desk/desk_account_page.dart similarity index 81% rename from lib/app/views/account/desk/desk_account_page.dart rename to modules/basic_system/app/lib/view/account/desk/desk_account_page.dart index 0b7a5a99..538dbdd8 100644 --- a/lib/app/views/account/desk/desk_account_page.dart +++ b/modules/basic_system/app/lib/view/account/desk/desk_account_page.dart @@ -1,6 +1,5 @@ import 'package:components/components.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app_stater/view/splash/flutter_unit_text.dart'; import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; @@ -39,24 +38,24 @@ class _DeskAccountPageState extends State return Scaffold( body: Column( children: [ - DeskAccountTopBar( - leading: Row( - children: [ - FlutterUnitText( - text: 'Flutter Unit', - color: Theme.of(context).primaryColor, - fontSize: 24, - ), - const SizedBox( - width: 20, - ), - Text( - context.l10n.slogan, - style: TextStyle(color: Colors.grey), - ) - ], - ), - ), + // DeskAccountTopBar( + // leading: Row( + // children: [ + // FlutterUnitText( + // text: 'Flutter Unit', + // color: Theme.of(context).primaryColor, + // fontSize: 24, + // ), + // const SizedBox( + // width: 20, + // ), + // Text( + // context.l10n.slogan, + // style: TextStyle(color: Colors.grey), + // ) + // ], + // ), + // ), Expanded( child: CustomScrollView( slivers: [ diff --git a/lib/app/views/account/desk/sliver_cellection_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_cellection_panel.dart similarity index 100% rename from lib/app/views/account/desk/sliver_cellection_panel.dart rename to modules/basic_system/app/lib/view/account/desk/sliver_cellection_panel.dart diff --git a/lib/app/views/account/desk/sliver_list_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_list_panel.dart similarity index 100% rename from lib/app/views/account/desk/sliver_list_panel.dart rename to modules/basic_system/app/lib/view/account/desk/sliver_list_panel.dart diff --git a/lib/app/views/account/desk/sliver_share_panel.dart b/modules/basic_system/app/lib/view/account/desk/sliver_share_panel.dart similarity index 100% rename from lib/app/views/account/desk/sliver_share_panel.dart rename to modules/basic_system/app/lib/view/account/desk/sliver_share_panel.dart diff --git a/lib/app/views/account/desk/user_header.dart b/modules/basic_system/app/lib/view/account/desk/user_header.dart similarity index 100% rename from lib/app/views/account/desk/user_header.dart rename to modules/basic_system/app/lib/view/account/desk/user_header.dart diff --git a/lib/app/views/data_manage/data_manage_page.dart b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart similarity index 100% rename from lib/app/views/data_manage/data_manage_page.dart rename to modules/basic_system/app/lib/view/data_manage/data_manage_page.dart diff --git a/lib/app/views/setting/app_style_setting.dart b/modules/basic_system/app/lib/view/setting/app_style_setting.dart similarity index 100% rename from lib/app/views/setting/app_style_setting.dart rename to modules/basic_system/app/lib/view/setting/app_style_setting.dart diff --git a/lib/app/views/setting/code_style_setting.dart b/modules/basic_system/app/lib/view/setting/code_style_setting.dart similarity index 100% rename from lib/app/views/setting/code_style_setting.dart rename to modules/basic_system/app/lib/view/setting/code_style_setting.dart diff --git a/lib/app/views/setting/font_setting.dart b/modules/basic_system/app/lib/view/setting/font_setting.dart similarity index 100% rename from lib/app/views/setting/font_setting.dart rename to modules/basic_system/app/lib/view/setting/font_setting.dart diff --git a/lib/app/views/setting/item_style_setting.dart b/modules/basic_system/app/lib/view/setting/item_style_setting.dart similarity index 100% rename from lib/app/views/setting/item_style_setting.dart rename to modules/basic_system/app/lib/view/setting/item_style_setting.dart diff --git a/lib/app/views/setting/language_setting.dart b/modules/basic_system/app/lib/view/setting/language_setting.dart similarity index 100% rename from lib/app/views/setting/language_setting.dart rename to modules/basic_system/app/lib/view/setting/language_setting.dart diff --git a/lib/app/views/setting/setting_page.dart b/modules/basic_system/app/lib/view/setting/setting_page.dart similarity index 87% rename from lib/app/views/setting/setting_page.dart rename to modules/basic_system/app/lib/view/setting/setting_page.dart index 8c164436..b213a4f5 100644 --- a/lib/app/views/setting/setting_page.dart +++ b/modules/basic_system/app/lib/view/setting/setting_page.dart @@ -4,12 +4,7 @@ import 'package:l10n/l10n.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/navigation/views/overlay_tool_wrapper.dart'; - - -import 'app_style_setting.dart'; import 'language_setting.dart'; -import 'theme_model_setting.dart'; class SettingPage extends StatelessWidget { @@ -155,24 +150,24 @@ class SettingPage extends StatelessWidget { }, )); - Widget _buildShowTool(BuildContext context) => - BlocBuilder( - builder: (_, state) => SwitchListTile( - value: state.showOverlayTool, - secondary: Icon( - TolyIcon.icon_layout, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示浮动工具', style: TextStyle(fontSize: 16)), - onChanged: (show) { - if(show){ - OverlayToolWrapper.of(context).showFloating(); - }else{ - OverlayToolWrapper.of(context).hideFloating(); - } - BlocProvider.of(context).switchShowTool(show); - }, - )); + // Widget _buildShowTool(BuildContext context) => + // BlocBuilder( + // builder: (_, state) => SwitchListTile( + // value: state.showOverlayTool, + // secondary: Icon( + // TolyIcon.icon_layout, + // color: Theme.of(context).primaryColor, + // ), + // title: const Text('显示浮动工具', style: TextStyle(fontSize: 16)), + // onChanged: (show) { + // if(show){ + // OverlayToolWrapper.of(context).showFloating(); + // }else{ + // OverlayToolWrapper.of(context).hideFloating(); + // } + // BlocProvider.of(context).switchShowTool(show); + // }, + // )); Widget _nextIcon(BuildContext context) => Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); diff --git a/lib/app/views/setting/theme_color_setting.dart b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart similarity index 100% rename from lib/app/views/setting/theme_color_setting.dart rename to modules/basic_system/app/lib/view/setting/theme_color_setting.dart diff --git a/lib/app/views/setting/theme_model_setting.dart b/modules/basic_system/app/lib/view/setting/theme_model_setting.dart similarity index 100% rename from lib/app/views/setting/theme_model_setting.dart rename to modules/basic_system/app/lib/view/setting/theme_model_setting.dart diff --git a/lib/app/views/unit_todo/attr_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/attr_unit_page.dart similarity index 100% rename from lib/app/views/unit_todo/attr_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/attr_unit_page.dart diff --git a/lib/app/views/unit_todo/layout_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/layout_unit_page.dart similarity index 100% rename from lib/app/views/unit_todo/layout_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/layout_unit_page.dart diff --git a/lib/app/views/unit_todo/paint_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/paint_unit_page.dart similarity index 100% rename from lib/app/views/unit_todo/paint_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/paint_unit_page.dart diff --git a/lib/app/views/unit_todo/point_unit_page.dart b/modules/basic_system/app/lib/view/unit_todo/point_unit_page.dart similarity index 100% rename from lib/app/views/unit_todo/point_unit_page.dart rename to modules/basic_system/app/lib/view/unit_todo/point_unit_page.dart diff --git a/modules/basic_system/app/lib/view/view.dart b/modules/basic_system/app/lib/view/view.dart new file mode 100644 index 00000000..c42f28f1 --- /dev/null +++ b/modules/basic_system/app/lib/view/view.dart @@ -0,0 +1,13 @@ +export 'about/about_app_page.dart'; +export 'about/about_me_page.dart'; +export 'about/version_info.dart'; +export 'account/desk/desk_account_page.dart'; +export 'setting/setting_page.dart'; +export 'setting/app_style_setting.dart'; +export 'setting/font_setting.dart'; +export 'setting/item_style_setting.dart'; +export 'setting/language_setting.dart'; +export 'setting/theme_color_setting.dart'; +export 'setting/code_style_setting.dart'; +export 'setting/theme_model_setting.dart'; +export 'data_manage/data_manage_page.dart'; \ No newline at end of file diff --git a/packages/app/pubspec.yaml b/modules/basic_system/app/pubspec.yaml similarity index 96% rename from packages/app/pubspec.yaml rename to modules/basic_system/app/pubspec.yaml index 69d2abad..bf1c6368 100644 --- a/packages/app/pubspec.yaml +++ b/modules/basic_system/app/pubspec.yaml @@ -2,6 +2,7 @@ name: app description: A new Flutter package project. version: 0.0.1 homepage: +publish_to: none environment: sdk: ">=3.0.0 <4.0.0" @@ -20,7 +21,7 @@ dependencies: storage: path: ../storage widget_module: - path: ../widget_module + path: ../../widget_system/widget_module components: path: ../components toly_ui: diff --git a/packages/app/test/app_config_test.dart b/modules/basic_system/app/test/app_config_test.dart similarity index 100% rename from packages/app/test/app_config_test.dart rename to modules/basic_system/app/test/app_config_test.dart diff --git a/packages/app/.gitignore b/modules/basic_system/app_update/.gitignore similarity index 100% rename from packages/app/.gitignore rename to modules/basic_system/app_update/.gitignore diff --git a/packages/app_update/.metadata b/modules/basic_system/app_update/.metadata similarity index 100% rename from packages/app_update/.metadata rename to modules/basic_system/app_update/.metadata diff --git a/packages/app/CHANGELOG.md b/modules/basic_system/app_update/CHANGELOG.md similarity index 100% rename from packages/app/CHANGELOG.md rename to modules/basic_system/app_update/CHANGELOG.md diff --git a/packages/app/LICENSE b/modules/basic_system/app_update/LICENSE similarity index 100% rename from packages/app/LICENSE rename to modules/basic_system/app_update/LICENSE diff --git a/packages/app/README.md b/modules/basic_system/app_update/README.md similarity index 100% rename from packages/app/README.md rename to modules/basic_system/app_update/README.md diff --git a/packages/app/analysis_options.yaml b/modules/basic_system/app_update/analysis_options.yaml similarity index 100% rename from packages/app/analysis_options.yaml rename to modules/basic_system/app_update/analysis_options.yaml diff --git a/packages/app_update/lib/app_update.dart b/modules/basic_system/app_update/lib/app_update.dart similarity index 100% rename from packages/app_update/lib/app_update.dart rename to modules/basic_system/app_update/lib/app_update.dart diff --git a/packages/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart similarity index 100% rename from packages/app_update/lib/bloc/bloc.dart rename to modules/basic_system/app_update/lib/bloc/bloc.dart diff --git a/packages/app_update/lib/bloc/event.dart b/modules/basic_system/app_update/lib/bloc/event.dart similarity index 100% rename from packages/app_update/lib/bloc/event.dart rename to modules/basic_system/app_update/lib/bloc/event.dart diff --git a/packages/app_update/lib/bloc/state.dart b/modules/basic_system/app_update/lib/bloc/state.dart similarity index 100% rename from packages/app_update/lib/bloc/state.dart rename to modules/basic_system/app_update/lib/bloc/state.dart diff --git a/packages/app_update/lib/model/app_info.dart b/modules/basic_system/app_update/lib/model/app_info.dart similarity index 100% rename from packages/app_update/lib/model/app_info.dart rename to modules/basic_system/app_update/lib/model/app_info.dart diff --git a/packages/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart similarity index 100% rename from packages/app_update/lib/views/app_update_panel.dart rename to modules/basic_system/app_update/lib/views/app_update_panel.dart diff --git a/packages/app_update/lib/views/update_red_point.dart b/modules/basic_system/app_update/lib/views/update_red_point.dart similarity index 100% rename from packages/app_update/lib/views/update_red_point.dart rename to modules/basic_system/app_update/lib/views/update_red_point.dart diff --git a/packages/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml similarity index 99% rename from packages/app_update/pubspec.yaml rename to modules/basic_system/app_update/pubspec.yaml index 23a501dc..7fb4b174 100644 --- a/packages/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -2,7 +2,7 @@ name: app_update description: A new Flutter package project. version: 0.0.1 homepage: - +publish_to: none environment: sdk: '>=2.18.6 <3.0.0' flutter: ">=1.17.0" diff --git a/packages/app_update/test/app_update_test.dart b/modules/basic_system/app_update/test/app_update_test.dart similarity index 100% rename from packages/app_update/test/app_update_test.dart rename to modules/basic_system/app_update/test/app_update_test.dart diff --git a/packages/app_update/.gitignore b/modules/basic_system/authentication/.gitignore similarity index 100% rename from packages/app_update/.gitignore rename to modules/basic_system/authentication/.gitignore diff --git a/packages/authentication/.metadata b/modules/basic_system/authentication/.metadata similarity index 100% rename from packages/authentication/.metadata rename to modules/basic_system/authentication/.metadata diff --git a/packages/app_update/CHANGELOG.md b/modules/basic_system/authentication/CHANGELOG.md similarity index 100% rename from packages/app_update/CHANGELOG.md rename to modules/basic_system/authentication/CHANGELOG.md diff --git a/packages/app_update/LICENSE b/modules/basic_system/authentication/LICENSE similarity index 100% rename from packages/app_update/LICENSE rename to modules/basic_system/authentication/LICENSE diff --git a/packages/app_update/README.md b/modules/basic_system/authentication/README.md similarity index 100% rename from packages/app_update/README.md rename to modules/basic_system/authentication/README.md diff --git a/packages/app_update/analysis_options.yaml b/modules/basic_system/authentication/analysis_options.yaml similarity index 100% rename from packages/app_update/analysis_options.yaml rename to modules/basic_system/authentication/analysis_options.yaml diff --git a/packages/authentication/lib/authentication.dart b/modules/basic_system/authentication/lib/authentication.dart similarity index 100% rename from packages/authentication/lib/authentication.dart rename to modules/basic_system/authentication/lib/authentication.dart diff --git a/packages/authentication/lib/blocs/authentic/bloc.dart b/modules/basic_system/authentication/lib/blocs/authentic/bloc.dart similarity index 100% rename from packages/authentication/lib/blocs/authentic/bloc.dart rename to modules/basic_system/authentication/lib/blocs/authentic/bloc.dart diff --git a/packages/authentication/lib/blocs/authentic/event.dart b/modules/basic_system/authentication/lib/blocs/authentic/event.dart similarity index 100% rename from packages/authentication/lib/blocs/authentic/event.dart rename to modules/basic_system/authentication/lib/blocs/authentic/event.dart diff --git a/packages/authentication/lib/blocs/authentic/state.dart b/modules/basic_system/authentication/lib/blocs/authentic/state.dart similarity index 100% rename from packages/authentication/lib/blocs/authentic/state.dart rename to modules/basic_system/authentication/lib/blocs/authentic/state.dart diff --git a/packages/authentication/lib/blocs/register/bloc.dart b/modules/basic_system/authentication/lib/blocs/register/bloc.dart similarity index 100% rename from packages/authentication/lib/blocs/register/bloc.dart rename to modules/basic_system/authentication/lib/blocs/register/bloc.dart diff --git a/packages/authentication/lib/blocs/register/event.dart b/modules/basic_system/authentication/lib/blocs/register/event.dart similarity index 100% rename from packages/authentication/lib/blocs/register/event.dart rename to modules/basic_system/authentication/lib/blocs/register/event.dart diff --git a/packages/authentication/lib/blocs/register/state.dart b/modules/basic_system/authentication/lib/blocs/register/state.dart similarity index 100% rename from packages/authentication/lib/blocs/register/state.dart rename to modules/basic_system/authentication/lib/blocs/register/state.dart diff --git a/packages/authentication/lib/blocs/user/bloc.dart b/modules/basic_system/authentication/lib/blocs/user/bloc.dart similarity index 100% rename from packages/authentication/lib/blocs/user/bloc.dart rename to modules/basic_system/authentication/lib/blocs/user/bloc.dart diff --git a/packages/authentication/lib/blocs/user/state.dart b/modules/basic_system/authentication/lib/blocs/user/state.dart similarity index 100% rename from packages/authentication/lib/blocs/user/state.dart rename to modules/basic_system/authentication/lib/blocs/user/state.dart diff --git a/packages/authentication/lib/models/user.dart b/modules/basic_system/authentication/lib/models/user.dart similarity index 100% rename from packages/authentication/lib/models/user.dart rename to modules/basic_system/authentication/lib/models/user.dart diff --git a/packages/authentication/lib/repository/auth_repository.dart b/modules/basic_system/authentication/lib/repository/auth_repository.dart similarity index 100% rename from packages/authentication/lib/repository/auth_repository.dart rename to modules/basic_system/authentication/lib/repository/auth_repository.dart diff --git a/packages/authentication/lib/repository/impl/http_auth_repository.dart b/modules/basic_system/authentication/lib/repository/impl/http_auth_repository.dart similarity index 100% rename from packages/authentication/lib/repository/impl/http_auth_repository.dart rename to modules/basic_system/authentication/lib/repository/impl/http_auth_repository.dart diff --git a/packages/authentication/lib/views/authentic_widget.dart b/modules/basic_system/authentication/lib/views/authentic_widget.dart similarity index 100% rename from packages/authentication/lib/views/authentic_widget.dart rename to modules/basic_system/authentication/lib/views/authentic_widget.dart diff --git a/packages/authentication/lib/views/mobile/login/login_form.dart b/modules/basic_system/authentication/lib/views/mobile/login/login_form.dart similarity index 100% rename from packages/authentication/lib/views/mobile/login/login_form.dart rename to modules/basic_system/authentication/lib/views/mobile/login/login_form.dart diff --git a/packages/authentication/lib/views/mobile/login/login_page.dart b/modules/basic_system/authentication/lib/views/mobile/login/login_page.dart similarity index 100% rename from packages/authentication/lib/views/mobile/login/login_page.dart rename to modules/basic_system/authentication/lib/views/mobile/login/login_page.dart diff --git a/packages/authentication/lib/views/mobile/register/arc_clipper.dart b/modules/basic_system/authentication/lib/views/mobile/register/arc_clipper.dart similarity index 100% rename from packages/authentication/lib/views/mobile/register/arc_clipper.dart rename to modules/basic_system/authentication/lib/views/mobile/register/arc_clipper.dart diff --git a/packages/authentication/lib/views/mobile/register/register_page.dart b/modules/basic_system/authentication/lib/views/mobile/register/register_page.dart similarity index 100% rename from packages/authentication/lib/views/mobile/register/register_page.dart rename to modules/basic_system/authentication/lib/views/mobile/register/register_page.dart diff --git a/packages/authentication/lib/views/mobile/register/send_code.dart b/modules/basic_system/authentication/lib/views/mobile/register/send_code.dart similarity index 100% rename from packages/authentication/lib/views/mobile/register/send_code.dart rename to modules/basic_system/authentication/lib/views/mobile/register/send_code.dart diff --git a/packages/authentication/lib/views/mobile/user/page_item.dart b/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart similarity index 100% rename from packages/authentication/lib/views/mobile/user/page_item.dart rename to modules/basic_system/authentication/lib/views/mobile/user/page_item.dart diff --git a/packages/authentication/lib/views/mobile/user/support_me.dart b/modules/basic_system/authentication/lib/views/mobile/user/support_me.dart similarity index 100% rename from packages/authentication/lib/views/mobile/user/support_me.dart rename to modules/basic_system/authentication/lib/views/mobile/user/support_me.dart diff --git a/packages/authentication/lib/views/mobile/user/unit_drawer_header.dart b/modules/basic_system/authentication/lib/views/mobile/user/unit_drawer_header.dart similarity index 100% rename from packages/authentication/lib/views/mobile/user/unit_drawer_header.dart rename to modules/basic_system/authentication/lib/views/mobile/user/unit_drawer_header.dart diff --git a/packages/authentication/lib/views/mobile/user/user_account.dart b/modules/basic_system/authentication/lib/views/mobile/user/user_account.dart similarity index 91% rename from packages/authentication/lib/views/mobile/user/user_account.dart rename to modules/basic_system/authentication/lib/views/mobile/user/user_account.dart index 35eaa599..c60c09dd 100644 --- a/packages/authentication/lib/views/mobile/user/user_account.dart +++ b/modules/basic_system/authentication/lib/views/mobile/user/user_account.dart @@ -32,7 +32,7 @@ class UserAccountPage extends StatelessWidget { backgroundColor: isDark ? null : bgColor, appBar: AppBar( backgroundColor: isDark ? null : sbgColor, - title: Text( + title: const Text( '账号资料', ), ), @@ -49,10 +49,10 @@ class UserAccountPage extends StatelessWidget { child: Row( children: [ Container( - padding: EdgeInsets.only(left: 15), + padding: const EdgeInsets.only(left: 15), width: 120, - child: Text('头像')), - Spacer(), + child: const Text('头像')), + const Spacer(), // AuthUserAvatar( // size: 50, // borderSize: 2, @@ -86,13 +86,13 @@ class UserAccountPage extends StatelessWidget { child: Row( children: [ Container( - padding: EdgeInsets.only(left: 15), + padding: const EdgeInsets.only(left: 15), width: 120, - child: Text('昵称')), - Spacer(), + child: const Text('昵称')), + const Spacer(), Text( performance.username ?? '', - style: TextStyle(color: Colors.grey), + style: const TextStyle(color: Colors.grey), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 12), @@ -112,16 +112,16 @@ class UserAccountPage extends StatelessWidget { child: Row( children: [ Container( - padding: EdgeInsets.only(left: 15), + padding: const EdgeInsets.only(left: 15), width: 120, child: const Text('箴言')), - Spacer(), - Text( + const Spacer(), + const Text( // '${performance.userId}', '海的彼岸,有我未曾见证的风采。', style: TextStyle(color: Colors.grey,fontSize: 12), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), child: Icon( Icons.arrow_forward_ios_sharp, size: 20, @@ -200,16 +200,16 @@ class UserAccountPage extends StatelessWidget { child: Row( children: [ Container( - padding: EdgeInsets.only(left: 15), + padding: const EdgeInsets.only(left: 15), width: 120, child: const Text('账号')), - Spacer(), - Text( + const Spacer(), + const Text( // '${performance.userId}', '******', style: TextStyle(color: Colors.grey,fontSize: 12), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), child: Icon( Icons.arrow_forward_ios_sharp, size: 20, @@ -266,8 +266,8 @@ class UserAccountPage extends StatelessWidget { // ), // if(false) ListTile( - title: Center( - child: const Text( + title: const Center( + child: Text( '删除账号', style: TextStyle( fontSize: 15, @@ -290,7 +290,7 @@ class UserAccountPage extends StatelessWidget { // await Future.delayed(Duration(seconds: 3)); // await context.read().repo.unregister(); // - context.read().add(Logout()); + context.read().add(const Logout()); // Navigator.of(context).pushAndRemoveUntil( // NoAnimRouter(AuthRelation( @@ -394,14 +394,14 @@ class UserItemPanel extends StatelessWidget { children: [ Expanded( child: Container( - padding: EdgeInsets.only(left: 15), child: Text(label)), + padding: const EdgeInsets.only(left: 15), child: Text(label)), ), Text( value, - style: TextStyle(color: Colors.grey), + style: const TextStyle(color: Colors.grey), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), child: Icon( Icons.arrow_forward_ios_sharp, size: 20, diff --git a/packages/authentication/lib/views/mobile/user/user_page.dart b/modules/basic_system/authentication/lib/views/mobile/user/user_page.dart similarity index 100% rename from packages/authentication/lib/views/mobile/user/user_page.dart rename to modules/basic_system/authentication/lib/views/mobile/user/user_page.dart diff --git a/packages/authentication/pubspec.yaml b/modules/basic_system/authentication/pubspec.yaml similarity index 100% rename from packages/authentication/pubspec.yaml rename to modules/basic_system/authentication/pubspec.yaml diff --git a/packages/authentication/test/authentication_test.dart b/modules/basic_system/authentication/test/authentication_test.dart similarity index 100% rename from packages/authentication/test/authentication_test.dart rename to modules/basic_system/authentication/test/authentication_test.dart diff --git a/packages/artifact/.gitignore b/modules/basic_system/components/.gitignore similarity index 100% rename from packages/artifact/.gitignore rename to modules/basic_system/components/.gitignore diff --git a/packages/components/.metadata b/modules/basic_system/components/.metadata similarity index 100% rename from packages/components/.metadata rename to modules/basic_system/components/.metadata diff --git a/packages/artifact/CHANGELOG.md b/modules/basic_system/components/CHANGELOG.md similarity index 100% rename from packages/artifact/CHANGELOG.md rename to modules/basic_system/components/CHANGELOG.md diff --git a/packages/artifact/LICENSE b/modules/basic_system/components/LICENSE similarity index 100% rename from packages/artifact/LICENSE rename to modules/basic_system/components/LICENSE diff --git a/packages/artifact/README.md b/modules/basic_system/components/README.md similarity index 100% rename from packages/artifact/README.md rename to modules/basic_system/components/README.md diff --git a/packages/artifact/analysis_options.yaml b/modules/basic_system/components/analysis_options.yaml similarity index 100% rename from packages/artifact/analysis_options.yaml rename to modules/basic_system/components/analysis_options.yaml diff --git a/packages/components/lib/components.dart b/modules/basic_system/components/lib/components.dart similarity index 100% rename from packages/components/lib/components.dart rename to modules/basic_system/components/lib/components.dart diff --git a/packages/components/lib/flutter_ui/diy_flexible_space_bar.dart b/modules/basic_system/components/lib/flutter_ui/diy_flexible_space_bar.dart similarity index 100% rename from packages/components/lib/flutter_ui/diy_flexible_space_bar.dart rename to modules/basic_system/components/lib/flutter_ui/diy_flexible_space_bar.dart diff --git a/packages/components/lib/flutter_ui/flutter_ui.dart b/modules/basic_system/components/lib/flutter_ui/flutter_ui.dart similarity index 100% rename from packages/components/lib/flutter_ui/flutter_ui.dart rename to modules/basic_system/components/lib/flutter_ui/flutter_ui.dart diff --git a/packages/components/lib/flutter_ui/no_div_expansion_tile.dart b/modules/basic_system/components/lib/flutter_ui/no_div_expansion_tile.dart similarity index 100% rename from packages/components/lib/flutter_ui/no_div_expansion_tile.dart rename to modules/basic_system/components/lib/flutter_ui/no_div_expansion_tile.dart diff --git a/packages/components/lib/flutter_ui/toly_date_picker.dart b/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart similarity index 100% rename from packages/components/lib/flutter_ui/toly_date_picker.dart rename to modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart diff --git a/packages/components/lib/project_ui/default/empty_search_page.dart b/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart similarity index 100% rename from packages/components/lib/project_ui/default/empty_search_page.dart rename to modules/basic_system/components/lib/project_ui/default/empty_search_page.dart diff --git a/packages/components/lib/project_ui/default/empty_shower.dart b/modules/basic_system/components/lib/project_ui/default/empty_shower.dart similarity index 100% rename from packages/components/lib/project_ui/default/empty_shower.dart rename to modules/basic_system/components/lib/project_ui/default/empty_shower.dart diff --git a/packages/components/lib/project_ui/default/error_page.dart b/modules/basic_system/components/lib/project_ui/default/error_page.dart similarity index 100% rename from packages/components/lib/project_ui/default/error_page.dart rename to modules/basic_system/components/lib/project_ui/default/error_page.dart diff --git a/packages/components/lib/project_ui/default/error_shower.dart b/modules/basic_system/components/lib/project_ui/default/error_shower.dart similarity index 96% rename from packages/components/lib/project_ui/default/error_shower.dart rename to modules/basic_system/components/lib/project_ui/default/error_shower.dart index 30165bf3..a13760c0 100644 --- a/packages/components/lib/project_ui/default/error_shower.dart +++ b/modules/basic_system/components/lib/project_ui/default/error_shower.dart @@ -29,7 +29,7 @@ class ErrorShower extends StatelessWidget { )), Text( error, - style:TextStyle( + style:const TextStyle( color: Colors.red, fontSize: 18, ), textAlign: TextAlign.center, diff --git a/packages/components/lib/project_ui/default/loading_shower.dart b/modules/basic_system/components/lib/project_ui/default/loading_shower.dart similarity index 100% rename from packages/components/lib/project_ui/default/loading_shower.dart rename to modules/basic_system/components/lib/project_ui/default/loading_shower.dart diff --git a/packages/components/lib/project_ui/default/no_more_widget.dart b/modules/basic_system/components/lib/project_ui/default/no_more_widget.dart similarity index 100% rename from packages/components/lib/project_ui/default/no_more_widget.dart rename to modules/basic_system/components/lib/project_ui/default/no_more_widget.dart diff --git a/packages/components/lib/project_ui/project_ui.dart b/modules/basic_system/components/lib/project_ui/project_ui.dart similarity index 89% rename from packages/components/lib/project_ui/project_ui.dart rename to modules/basic_system/components/lib/project_ui/project_ui.dart index edf45fcc..ee336a16 100644 --- a/packages/components/lib/project_ui/project_ui.dart +++ b/modules/basic_system/components/lib/project_ui/project_ui.dart @@ -9,4 +9,4 @@ export 'unit_app_bar.dart'; export 'top_bar/desk_simple_top_bar.dart'; export 'top_bar/desk_tab_top_bar.dart'; export 'top_bar/desk_knowledge_top_bar.dart'; -export 'top_bar/desk_account_top_bar.dart'; \ No newline at end of file +export 'time_line/flutter_unit_time_line.dart'; \ No newline at end of file diff --git a/lib/app/views/time_line/flutter_unit_time_line.dart b/modules/basic_system/components/lib/project_ui/time_line/flutter_unit_time_line.dart similarity index 100% rename from lib/app/views/time_line/flutter_unit_time_line.dart rename to modules/basic_system/components/lib/project_ui/time_line/flutter_unit_time_line.dart diff --git a/lib/app/views/time_line/model/time_node.dart b/modules/basic_system/components/lib/project_ui/time_line/model/time_node.dart similarity index 100% rename from lib/app/views/time_line/model/time_node.dart rename to modules/basic_system/components/lib/project_ui/time_line/model/time_node.dart diff --git a/packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_account_top_bar.dart similarity index 100% rename from packages/components/lib/project_ui/top_bar/desk_account_top_bar.dart rename to modules/basic_system/components/lib/project_ui/top_bar/desk_account_top_bar.dart diff --git a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart similarity index 95% rename from packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart rename to modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart index ffe8ed26..5cd2f571 100644 --- a/packages/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_knowledge_top_bar.dart @@ -44,7 +44,7 @@ class _DeskKnowledgeTabTopBarState extends State children: [ Container( height: 64, - color: isDark ? Color(0xff2C3036) : Colors.white, + color: isDark ? const Color(0xff2C3036) : Colors.white, child: Row( children: [ Expanded( @@ -82,7 +82,7 @@ class _DeskKnowledgeTabTopBarState extends State ], ), ), - Positioned(child: WindowButtons()) + const Positioned(child: WindowButtons()) ], ), ); diff --git a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart similarity index 92% rename from packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart rename to modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart index 43538426..5b173b0f 100644 --- a/packages/components/lib/project_ui/top_bar/desk_simple_top_bar.dart +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_simple_top_bar.dart @@ -13,7 +13,7 @@ class SimpleDeskTopBar extends StatelessWidget { return DragToMoveWrapper( child: Container( height: 64, - color: isDark ? Color(0xff2C3036) : Colors.white, + color: isDark ? const Color(0xff2C3036) : Colors.white, child: Row( children: [ if (leading != null) Padding( diff --git a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart b/modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart similarity index 93% rename from packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart rename to modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart index ad52487f..8c05408f 100644 --- a/packages/components/lib/project_ui/top_bar/desk_tab_top_bar.dart +++ b/modules/basic_system/components/lib/project_ui/top_bar/desk_tab_top_bar.dart @@ -41,11 +41,11 @@ class _DeskTabTopBarState extends State with TickerProviderState return DragToMoveWrapper( child: Container( height: 64, - color: isDark?Color(0xff2C3036):Colors.white, + color: isDark?const Color(0xff2C3036):Colors.white, child: Row( children: [ const SizedBox(width: 12,), - BackButton(), + const BackButton(), SizedBox( width: 350, child: TabBar( @@ -68,9 +68,9 @@ class _DeskTabTopBarState extends State with TickerProviderState tabs: widget.tabs.map((String name) => Tab(text: name)).toList(), ), ), - Spacer(), + const Spacer(), const SizedBox(width: 20,), - WindowButtons(), + const WindowButtons(), ], ), ), diff --git a/packages/components/lib/project_ui/unit_app_bar.dart b/modules/basic_system/components/lib/project_ui/unit_app_bar.dart similarity index 100% rename from packages/components/lib/project_ui/unit_app_bar.dart rename to modules/basic_system/components/lib/project_ui/unit_app_bar.dart diff --git a/packages/components/lib/project_ui/wrapper/honour_wrapper.dart b/modules/basic_system/components/lib/project_ui/wrapper/honour_wrapper.dart similarity index 100% rename from packages/components/lib/project_ui/wrapper/honour_wrapper.dart rename to modules/basic_system/components/lib/project_ui/wrapper/honour_wrapper.dart diff --git a/packages/components/pubspec.yaml b/modules/basic_system/components/pubspec.yaml similarity index 97% rename from packages/components/pubspec.yaml rename to modules/basic_system/components/pubspec.yaml index 0073e268..fe2a2273 100644 --- a/packages/components/pubspec.yaml +++ b/modules/basic_system/components/pubspec.yaml @@ -2,6 +2,7 @@ name: components description: A new Flutter package project. version: 0.0.1 homepage: +publish_to: none environment: sdk: '>=2.18.5 <3.0.0' @@ -12,6 +13,8 @@ dependencies: sdk: flutter flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.7.2+1 # markdown + dash_painter: ^1.0.2 + toly_ui: path: ../toly_ui app: diff --git a/packages/components/test/components_test.dart b/modules/basic_system/components/test/components_test.dart similarity index 100% rename from packages/components/test/components_test.dart rename to modules/basic_system/components/test/components_test.dart diff --git a/packages/awesome/.gitignore b/modules/basic_system/l10n/.gitignore similarity index 100% rename from packages/awesome/.gitignore rename to modules/basic_system/l10n/.gitignore diff --git a/packages/l10n/.metadata b/modules/basic_system/l10n/.metadata similarity index 100% rename from packages/l10n/.metadata rename to modules/basic_system/l10n/.metadata diff --git a/packages/authentication/CHANGELOG.md b/modules/basic_system/l10n/CHANGELOG.md similarity index 100% rename from packages/authentication/CHANGELOG.md rename to modules/basic_system/l10n/CHANGELOG.md diff --git a/packages/authentication/LICENSE b/modules/basic_system/l10n/LICENSE similarity index 100% rename from packages/authentication/LICENSE rename to modules/basic_system/l10n/LICENSE diff --git a/packages/authentication/README.md b/modules/basic_system/l10n/README.md similarity index 100% rename from packages/authentication/README.md rename to modules/basic_system/l10n/README.md diff --git a/packages/authentication/analysis_options.yaml b/modules/basic_system/l10n/analysis_options.yaml similarity index 100% rename from packages/authentication/analysis_options.yaml rename to modules/basic_system/l10n/analysis_options.yaml diff --git a/packages/l10n/l10n.yaml b/modules/basic_system/l10n/l10n.yaml similarity index 100% rename from packages/l10n/l10n.yaml rename to modules/basic_system/l10n/l10n.yaml diff --git a/packages/l10n/l10n_copy.sh b/modules/basic_system/l10n/l10n_copy.sh similarity index 100% rename from packages/l10n/l10n_copy.sh rename to modules/basic_system/l10n/l10n_copy.sh diff --git a/packages/l10n/lib/arb/app_en.arb b/modules/basic_system/l10n/lib/arb/app_en.arb similarity index 100% rename from packages/l10n/lib/arb/app_en.arb rename to modules/basic_system/l10n/lib/arb/app_en.arb diff --git a/packages/l10n/lib/arb/app_zh.arb b/modules/basic_system/l10n/lib/arb/app_zh.arb similarity index 100% rename from packages/l10n/lib/arb/app_zh.arb rename to modules/basic_system/l10n/lib/arb/app_zh.arb diff --git a/packages/l10n/lib/enum/language.dart b/modules/basic_system/l10n/lib/enum/language.dart similarity index 100% rename from packages/l10n/lib/enum/language.dart rename to modules/basic_system/l10n/lib/enum/language.dart diff --git a/packages/l10n/lib/ext.dart b/modules/basic_system/l10n/lib/ext.dart similarity index 100% rename from packages/l10n/lib/ext.dart rename to modules/basic_system/l10n/lib/ext.dart diff --git a/packages/l10n/lib/gen_l10n/app_localizations.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart similarity index 100% rename from packages/l10n/lib/gen_l10n/app_localizations.dart rename to modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart diff --git a/packages/l10n/lib/gen_l10n/app_localizations_en.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart similarity index 100% rename from packages/l10n/lib/gen_l10n/app_localizations_en.dart rename to modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart diff --git a/packages/l10n/lib/gen_l10n/app_localizations_zh.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart similarity index 100% rename from packages/l10n/lib/gen_l10n/app_localizations_zh.dart rename to modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart diff --git a/packages/l10n/lib/l10n.dart b/modules/basic_system/l10n/lib/l10n.dart similarity index 100% rename from packages/l10n/lib/l10n.dart rename to modules/basic_system/l10n/lib/l10n.dart diff --git a/packages/l10n/pubspec.yaml b/modules/basic_system/l10n/pubspec.yaml similarity index 100% rename from packages/l10n/pubspec.yaml rename to modules/basic_system/l10n/pubspec.yaml diff --git a/packages/l10n/test/l10n_copy.dart b/modules/basic_system/l10n/test/l10n_copy.dart similarity index 100% rename from packages/l10n/test/l10n_copy.dart rename to modules/basic_system/l10n/test/l10n_copy.dart diff --git a/packages/l10n/test/l10n_test.dart b/modules/basic_system/l10n/test/l10n_test.dart similarity index 100% rename from packages/l10n/test/l10n_test.dart rename to modules/basic_system/l10n/test/l10n_test.dart diff --git a/packages/authentication/.gitignore b/modules/basic_system/storage/.gitignore similarity index 100% rename from packages/authentication/.gitignore rename to modules/basic_system/storage/.gitignore diff --git a/packages/algorithm/.metadata b/modules/basic_system/storage/.metadata similarity index 100% rename from packages/algorithm/.metadata rename to modules/basic_system/storage/.metadata diff --git a/packages/awesome/CHANGELOG.md b/modules/basic_system/storage/CHANGELOG.md similarity index 100% rename from packages/awesome/CHANGELOG.md rename to modules/basic_system/storage/CHANGELOG.md diff --git a/packages/awesome/LICENSE b/modules/basic_system/storage/LICENSE similarity index 100% rename from packages/awesome/LICENSE rename to modules/basic_system/storage/LICENSE diff --git a/packages/awesome/README.md b/modules/basic_system/storage/README.md similarity index 100% rename from packages/awesome/README.md rename to modules/basic_system/storage/README.md diff --git a/packages/awesome/analysis_options.yaml b/modules/basic_system/storage/analysis_options.yaml similarity index 100% rename from packages/awesome/analysis_options.yaml rename to modules/basic_system/storage/analysis_options.yaml diff --git a/packages/storage/lib/src/app_storage.dart b/modules/basic_system/storage/lib/src/app_storage.dart similarity index 100% rename from packages/storage/lib/src/app_storage.dart rename to modules/basic_system/storage/lib/src/app_storage.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/article_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/article_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/category_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/category_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/like_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/like_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/node_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/node_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/dao/widget_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/dao/widget_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter/flutter.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/flutter.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart diff --git a/packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/flutter_db_store.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/article.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/article.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/article.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/article.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/category_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/category_po.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/columnize.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/columnize.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/columnize.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/columnize.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/enums.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/enums.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/node_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/node_po.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/widget_filter.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart diff --git a/packages/storage/lib/src/db_storage/flutter/model/widget_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter/model/widget_po.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart diff --git a/packages/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter_unit/dao/cache_dao.dart diff --git a/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit.dart diff --git a/packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart diff --git a/packages/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart similarity index 100% rename from packages/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart rename to modules/basic_system/storage/lib/src/db_storage/flutter_unit/model/cache_po.dart diff --git a/packages/storage/lib/src/db_storage/storage.dart b/modules/basic_system/storage/lib/src/db_storage/storage.dart similarity index 100% rename from packages/storage/lib/src/db_storage/storage.dart rename to modules/basic_system/storage/lib/src/db_storage/storage.dart diff --git a/packages/storage/lib/src/sp_storage/cao/app_config_cao.dart b/modules/basic_system/storage/lib/src/sp_storage/cao/app_config_cao.dart similarity index 100% rename from packages/storage/lib/src/sp_storage/cao/app_config_cao.dart rename to modules/basic_system/storage/lib/src/sp_storage/cao/app_config_cao.dart diff --git a/packages/storage/lib/src/sp_storage/exp.dart b/modules/basic_system/storage/lib/src/sp_storage/exp.dart similarity index 100% rename from packages/storage/lib/src/sp_storage/exp.dart rename to modules/basic_system/storage/lib/src/sp_storage/exp.dart diff --git a/packages/storage/lib/src/sp_storage/models/app_config_po.dart b/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart similarity index 100% rename from packages/storage/lib/src/sp_storage/models/app_config_po.dart rename to modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart diff --git a/packages/storage/lib/src/sp_storage/sp_storage.dart b/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart similarity index 100% rename from packages/storage/lib/src/sp_storage/sp_storage.dart rename to modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart diff --git a/packages/storage/lib/storage.dart b/modules/basic_system/storage/lib/storage.dart similarity index 100% rename from packages/storage/lib/storage.dart rename to modules/basic_system/storage/lib/storage.dart diff --git a/packages/storage/pubspec.yaml b/modules/basic_system/storage/pubspec.yaml similarity index 100% rename from packages/storage/pubspec.yaml rename to modules/basic_system/storage/pubspec.yaml diff --git a/packages/storage/test/db_storage_test.dart b/modules/basic_system/storage/test/db_storage_test.dart similarity index 100% rename from packages/storage/test/db_storage_test.dart rename to modules/basic_system/storage/test/db_storage_test.dart diff --git a/packages/draw_system/.gitignore b/modules/basic_system/toly_ui/.gitignore similarity index 100% rename from packages/draw_system/.gitignore rename to modules/basic_system/toly_ui/.gitignore diff --git a/packages/awesome/.metadata b/modules/basic_system/toly_ui/.metadata similarity index 100% rename from packages/awesome/.metadata rename to modules/basic_system/toly_ui/.metadata diff --git a/packages/components/CHANGELOG.md b/modules/basic_system/toly_ui/CHANGELOG.md similarity index 100% rename from packages/components/CHANGELOG.md rename to modules/basic_system/toly_ui/CHANGELOG.md diff --git a/packages/components/LICENSE b/modules/basic_system/toly_ui/LICENSE similarity index 100% rename from packages/components/LICENSE rename to modules/basic_system/toly_ui/LICENSE diff --git a/packages/components/README.md b/modules/basic_system/toly_ui/README.md similarity index 100% rename from packages/components/README.md rename to modules/basic_system/toly_ui/README.md diff --git a/packages/components/analysis_options.yaml b/modules/basic_system/toly_ui/analysis_options.yaml similarity index 100% rename from packages/components/analysis_options.yaml rename to modules/basic_system/toly_ui/analysis_options.yaml diff --git a/packages/toly_ui/lib/adapter/platform_view_adapter.dart b/modules/basic_system/toly_ui/lib/adapter/platform_view_adapter.dart similarity index 100% rename from packages/toly_ui/lib/adapter/platform_view_adapter.dart rename to modules/basic_system/toly_ui/lib/adapter/platform_view_adapter.dart diff --git a/packages/toly_ui/lib/button/feedback_widget.dart b/modules/basic_system/toly_ui/lib/button/feedback_widget.dart similarity index 100% rename from packages/toly_ui/lib/button/feedback_widget.dart rename to modules/basic_system/toly_ui/lib/button/feedback_widget.dart diff --git a/packages/toly_ui/lib/code/code.dart b/modules/basic_system/toly_ui/lib/code/code.dart similarity index 100% rename from packages/toly_ui/lib/code/code.dart rename to modules/basic_system/toly_ui/lib/code/code.dart diff --git a/packages/toly_ui/lib/code/code_widget.dart b/modules/basic_system/toly_ui/lib/code/code_widget.dart similarity index 100% rename from packages/toly_ui/lib/code/code_widget.dart rename to modules/basic_system/toly_ui/lib/code/code_widget.dart diff --git a/packages/toly_ui/lib/code/high_light_code.dart b/modules/basic_system/toly_ui/lib/code/high_light_code.dart similarity index 100% rename from packages/toly_ui/lib/code/high_light_code.dart rename to modules/basic_system/toly_ui/lib/code/high_light_code.dart diff --git a/packages/toly_ui/lib/code/highlighter_style.dart b/modules/basic_system/toly_ui/lib/code/highlighter_style.dart similarity index 100% rename from packages/toly_ui/lib/code/highlighter_style.dart rename to modules/basic_system/toly_ui/lib/code/highlighter_style.dart diff --git a/packages/toly_ui/lib/code/language/dart_languge.dart b/modules/basic_system/toly_ui/lib/code/language/dart_languge.dart similarity index 100% rename from packages/toly_ui/lib/code/language/dart_languge.dart rename to modules/basic_system/toly_ui/lib/code/language/dart_languge.dart diff --git a/packages/toly_ui/lib/code/language/language.dart b/modules/basic_system/toly_ui/lib/code/language/language.dart similarity index 100% rename from packages/toly_ui/lib/code/language/language.dart rename to modules/basic_system/toly_ui/lib/code/language/language.dart diff --git a/packages/toly_ui/lib/decorations/round_rect_rab_indicator.dart b/modules/basic_system/toly_ui/lib/decorations/round_rect_rab_indicator.dart similarity index 100% rename from packages/toly_ui/lib/decorations/round_rect_rab_indicator.dart rename to modules/basic_system/toly_ui/lib/decorations/round_rect_rab_indicator.dart diff --git a/packages/toly_ui/lib/default/loading/planet_loading.dart b/modules/basic_system/toly_ui/lib/default/loading/planet_loading.dart similarity index 100% rename from packages/toly_ui/lib/default/loading/planet_loading.dart rename to modules/basic_system/toly_ui/lib/default/loading/planet_loading.dart diff --git a/packages/toly_ui/lib/dialog/alert_conform_dialog.dart b/modules/basic_system/toly_ui/lib/dialog/alert_conform_dialog.dart similarity index 100% rename from packages/toly_ui/lib/dialog/alert_conform_dialog.dart rename to modules/basic_system/toly_ui/lib/dialog/alert_conform_dialog.dart diff --git a/packages/toly_ui/lib/dialog/delete_message_panel.dart b/modules/basic_system/toly_ui/lib/dialog/delete_message_panel.dart similarity index 100% rename from packages/toly_ui/lib/dialog/delete_message_panel.dart rename to modules/basic_system/toly_ui/lib/dialog/delete_message_panel.dart diff --git a/packages/toly_ui/lib/input/edit_panel.dart b/modules/basic_system/toly_ui/lib/input/edit_panel.dart similarity index 100% rename from packages/toly_ui/lib/input/edit_panel.dart rename to modules/basic_system/toly_ui/lib/input/edit_panel.dart diff --git a/packages/toly_ui/lib/input/icon_input.dart b/modules/basic_system/toly_ui/lib/input/icon_input.dart similarity index 100% rename from packages/toly_ui/lib/input/icon_input.dart rename to modules/basic_system/toly_ui/lib/input/icon_input.dart diff --git a/packages/toly_ui/lib/input/input_button.dart b/modules/basic_system/toly_ui/lib/input/input_button.dart similarity index 100% rename from packages/toly_ui/lib/input/input_button.dart rename to modules/basic_system/toly_ui/lib/input/input_button.dart diff --git a/packages/toly_ui/lib/markdown/markdown_widget.dart b/modules/basic_system/toly_ui/lib/markdown/markdown_widget.dart similarity index 100% rename from packages/toly_ui/lib/markdown/markdown_widget.dart rename to modules/basic_system/toly_ui/lib/markdown/markdown_widget.dart diff --git a/packages/toly_ui/lib/markdown/md_text_styles.dart b/modules/basic_system/toly_ui/lib/markdown/md_text_styles.dart similarity index 100% rename from packages/toly_ui/lib/markdown/md_text_styles.dart rename to modules/basic_system/toly_ui/lib/markdown/md_text_styles.dart diff --git a/packages/toly_ui/lib/markdown/syntax_high_lighter.dart b/modules/basic_system/toly_ui/lib/markdown/syntax_high_lighter.dart similarity index 100% rename from packages/toly_ui/lib/markdown/syntax_high_lighter.dart rename to modules/basic_system/toly_ui/lib/markdown/syntax_high_lighter.dart diff --git a/packages/toly_ui/lib/object/windmill.dart b/modules/basic_system/toly_ui/lib/object/windmill.dart similarity index 100% rename from packages/toly_ui/lib/object/windmill.dart rename to modules/basic_system/toly_ui/lib/object/windmill.dart diff --git a/packages/toly_ui/lib/popable/drop_selectable_widget.dart b/modules/basic_system/toly_ui/lib/popable/drop_selectable_widget.dart similarity index 100% rename from packages/toly_ui/lib/popable/drop_selectable_widget.dart rename to modules/basic_system/toly_ui/lib/popable/drop_selectable_widget.dart diff --git a/packages/toly_ui/lib/selector/burst_menu.dart b/modules/basic_system/toly_ui/lib/selector/burst_menu.dart similarity index 100% rename from packages/toly_ui/lib/selector/burst_menu.dart rename to modules/basic_system/toly_ui/lib/selector/burst_menu.dart diff --git a/packages/toly_ui/lib/selector/color_chooser.dart b/modules/basic_system/toly_ui/lib/selector/color_chooser.dart similarity index 100% rename from packages/toly_ui/lib/selector/color_chooser.dart rename to modules/basic_system/toly_ui/lib/selector/color_chooser.dart diff --git a/packages/toly_ui/lib/selector/multi_chip_filter.dart b/modules/basic_system/toly_ui/lib/selector/multi_chip_filter.dart similarity index 100% rename from packages/toly_ui/lib/selector/multi_chip_filter.dart rename to modules/basic_system/toly_ui/lib/selector/multi_chip_filter.dart diff --git a/packages/toly_ui/lib/sliver_header/sliver_pinned_header.dart b/modules/basic_system/toly_ui/lib/sliver_header/sliver_pinned_header.dart similarity index 100% rename from packages/toly_ui/lib/sliver_header/sliver_pinned_header.dart rename to modules/basic_system/toly_ui/lib/sliver_header/sliver_pinned_header.dart diff --git a/packages/toly_ui/lib/sliver_header/sliver_snap_header.dart b/modules/basic_system/toly_ui/lib/sliver_header/sliver_snap_header.dart similarity index 100% rename from packages/toly_ui/lib/sliver_header/sliver_snap_header.dart rename to modules/basic_system/toly_ui/lib/sliver_header/sliver_snap_header.dart diff --git a/packages/toly_ui/lib/ti/circle.dart b/modules/basic_system/toly_ui/lib/ti/circle.dart similarity index 100% rename from packages/toly_ui/lib/ti/circle.dart rename to modules/basic_system/toly_ui/lib/ti/circle.dart diff --git a/packages/toly_ui/lib/ti/circle_image.dart b/modules/basic_system/toly_ui/lib/ti/circle_image.dart similarity index 100% rename from packages/toly_ui/lib/ti/circle_image.dart rename to modules/basic_system/toly_ui/lib/ti/circle_image.dart diff --git a/packages/toly_ui/lib/ti/circle_text.dart b/modules/basic_system/toly_ui/lib/ti/circle_text.dart similarity index 100% rename from packages/toly_ui/lib/ti/circle_text.dart rename to modules/basic_system/toly_ui/lib/ti/circle_text.dart diff --git a/packages/toly_ui/lib/ti/color_wrapper.dart b/modules/basic_system/toly_ui/lib/ti/color_wrapper.dart similarity index 100% rename from packages/toly_ui/lib/ti/color_wrapper.dart rename to modules/basic_system/toly_ui/lib/ti/color_wrapper.dart diff --git a/packages/toly_ui/lib/ti/math_runner.dart b/modules/basic_system/toly_ui/lib/ti/math_runner.dart similarity index 100% rename from packages/toly_ui/lib/ti/math_runner.dart rename to modules/basic_system/toly_ui/lib/ti/math_runner.dart diff --git a/packages/toly_ui/lib/ti/panel.dart b/modules/basic_system/toly_ui/lib/ti/panel.dart similarity index 100% rename from packages/toly_ui/lib/ti/panel.dart rename to modules/basic_system/toly_ui/lib/ti/panel.dart diff --git a/packages/toly_ui/lib/ti/tag.dart b/modules/basic_system/toly_ui/lib/ti/tag.dart similarity index 100% rename from packages/toly_ui/lib/ti/tag.dart rename to modules/basic_system/toly_ui/lib/ti/tag.dart diff --git a/packages/toly_ui/lib/ti/text_typer.dart b/modules/basic_system/toly_ui/lib/ti/text_typer.dart similarity index 100% rename from packages/toly_ui/lib/ti/text_typer.dart rename to modules/basic_system/toly_ui/lib/ti/text_typer.dart diff --git a/packages/toly_ui/lib/ti/toly_switch_list_tile.dart b/modules/basic_system/toly_ui/lib/ti/toly_switch_list_tile.dart similarity index 100% rename from packages/toly_ui/lib/ti/toly_switch_list_tile.dart rename to modules/basic_system/toly_ui/lib/ti/toly_switch_list_tile.dart diff --git a/packages/toly_ui/lib/toly_ui.dart b/modules/basic_system/toly_ui/lib/toly_ui.dart similarity index 100% rename from packages/toly_ui/lib/toly_ui.dart rename to modules/basic_system/toly_ui/lib/toly_ui.dart diff --git a/packages/toly_ui/pubspec.yaml b/modules/basic_system/toly_ui/pubspec.yaml similarity index 100% rename from packages/toly_ui/pubspec.yaml rename to modules/basic_system/toly_ui/pubspec.yaml diff --git a/packages/toly_ui/test/toly_ui_test.dart b/modules/basic_system/toly_ui/test/toly_ui_test.dart similarity index 100% rename from packages/toly_ui/test/toly_ui_test.dart rename to modules/basic_system/toly_ui/test/toly_ui_test.dart diff --git a/packages/components/.gitignore b/modules/basic_system/utils/.gitignore similarity index 100% rename from packages/components/.gitignore rename to modules/basic_system/utils/.gitignore diff --git a/packages/artifact/.metadata b/modules/basic_system/utils/.metadata similarity index 100% rename from packages/artifact/.metadata rename to modules/basic_system/utils/.metadata diff --git a/packages/draw_system/CHANGELOG.md b/modules/basic_system/utils/CHANGELOG.md similarity index 100% rename from packages/draw_system/CHANGELOG.md rename to modules/basic_system/utils/CHANGELOG.md diff --git a/packages/draw_system/LICENSE b/modules/basic_system/utils/LICENSE similarity index 100% rename from packages/draw_system/LICENSE rename to modules/basic_system/utils/LICENSE diff --git a/packages/draw_system/README.md b/modules/basic_system/utils/README.md similarity index 100% rename from packages/draw_system/README.md rename to modules/basic_system/utils/README.md diff --git a/packages/draw_system/analysis_options.yaml b/modules/basic_system/utils/analysis_options.yaml similarity index 100% rename from packages/draw_system/analysis_options.yaml rename to modules/basic_system/utils/analysis_options.yaml diff --git a/packages/utils/lib/src/color_utils.dart b/modules/basic_system/utils/lib/src/color_utils.dart similarity index 100% rename from packages/utils/lib/src/color_utils.dart rename to modules/basic_system/utils/lib/src/color_utils.dart diff --git a/packages/utils/lib/src/convert_man.dart b/modules/basic_system/utils/lib/src/convert_man.dart similarity index 100% rename from packages/utils/lib/src/convert_man.dart rename to modules/basic_system/utils/lib/src/convert_man.dart diff --git a/packages/utils/lib/src/http_utils/http_util.dart b/modules/basic_system/utils/lib/src/http_utils/http_util.dart similarity index 100% rename from packages/utils/lib/src/http_utils/http_util.dart rename to modules/basic_system/utils/lib/src/http_utils/http_util.dart diff --git a/packages/utils/lib/src/http_utils/http_utils.dart b/modules/basic_system/utils/lib/src/http_utils/http_utils.dart similarity index 100% rename from packages/utils/lib/src/http_utils/http_utils.dart rename to modules/basic_system/utils/lib/src/http_utils/http_utils.dart diff --git a/packages/utils/lib/src/http_utils/logs_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/logs_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/logs_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/logs_interceptor.dart diff --git a/packages/utils/lib/src/http_utils/response_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/response_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/response_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/response_interceptor.dart diff --git a/packages/utils/lib/src/http_utils/task_result.dart b/modules/basic_system/utils/lib/src/http_utils/task_result.dart similarity index 100% rename from packages/utils/lib/src/http_utils/task_result.dart rename to modules/basic_system/utils/lib/src/http_utils/task_result.dart diff --git a/packages/utils/lib/src/http_utils/token_interceptor.dart b/modules/basic_system/utils/lib/src/http_utils/token_interceptor.dart similarity index 100% rename from packages/utils/lib/src/http_utils/token_interceptor.dart rename to modules/basic_system/utils/lib/src/http_utils/token_interceptor.dart diff --git a/packages/utils/lib/src/random_provider.dart b/modules/basic_system/utils/lib/src/random_provider.dart similarity index 100% rename from packages/utils/lib/src/random_provider.dart rename to modules/basic_system/utils/lib/src/random_provider.dart diff --git a/packages/utils/lib/src/toast.dart b/modules/basic_system/utils/lib/src/toast.dart similarity index 100% rename from packages/utils/lib/src/toast.dart rename to modules/basic_system/utils/lib/src/toast.dart diff --git a/packages/utils/lib/utils.dart b/modules/basic_system/utils/lib/utils.dart similarity index 100% rename from packages/utils/lib/utils.dart rename to modules/basic_system/utils/lib/utils.dart diff --git a/packages/utils/pubspec.yaml b/modules/basic_system/utils/pubspec.yaml similarity index 100% rename from packages/utils/pubspec.yaml rename to modules/basic_system/utils/pubspec.yaml diff --git a/packages/algorithm/test/utils_test.dart b/modules/basic_system/utils/test/utils_test.dart similarity index 100% rename from packages/algorithm/test/utils_test.dart rename to modules/basic_system/utils/test/utils_test.dart diff --git a/packages/storage/.gitignore b/modules/knowledge_system/algorithm/.gitignore similarity index 100% rename from packages/storage/.gitignore rename to modules/knowledge_system/algorithm/.gitignore diff --git a/packages/storage/.metadata b/modules/knowledge_system/algorithm/.metadata similarity index 100% rename from packages/storage/.metadata rename to modules/knowledge_system/algorithm/.metadata diff --git a/packages/l10n/CHANGELOG.md b/modules/knowledge_system/algorithm/CHANGELOG.md similarity index 100% rename from packages/l10n/CHANGELOG.md rename to modules/knowledge_system/algorithm/CHANGELOG.md diff --git a/packages/l10n/LICENSE b/modules/knowledge_system/algorithm/LICENSE similarity index 100% rename from packages/l10n/LICENSE rename to modules/knowledge_system/algorithm/LICENSE diff --git a/packages/l10n/README.md b/modules/knowledge_system/algorithm/README.md similarity index 100% rename from packages/l10n/README.md rename to modules/knowledge_system/algorithm/README.md diff --git a/packages/l10n/analysis_options.yaml b/modules/knowledge_system/algorithm/analysis_options.yaml similarity index 100% rename from packages/l10n/analysis_options.yaml rename to modules/knowledge_system/algorithm/analysis_options.yaml diff --git a/packages/algorithm/lib/algorithm.dart b/modules/knowledge_system/algorithm/lib/algorithm.dart similarity index 100% rename from packages/algorithm/lib/algorithm.dart rename to modules/knowledge_system/algorithm/lib/algorithm.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/AStar.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions/AStar.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/AStar.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BFS.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions/BFS.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BFS.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BestFS.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions/BestFS.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/BestFS.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/DFS.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions/DFS.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/DFS.dart diff --git a/packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/finding/functions/dijkstra.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/bubble.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/bubble.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/bubble.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cocktail.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/cocktail.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cocktail.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/comb.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/comb.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/comb.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/comb.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cycle.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/cycle.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/cycle.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/gnome.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/gnome.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/gnome.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/heap.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/heap.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/heap.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/heap.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/insertion.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/insertion.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/insertion.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/merge.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/merge.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/merge.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/merge.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/oddEven.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/oddEven.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/oddEven.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/pigeonHole.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/quick.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/quick.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/quick.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/quick.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/selection.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/selection.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/selection.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/selection.dart diff --git a/packages/algorithm/lib/src/algorithm/sort/functions/shell.dart b/modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/shell.dart similarity index 100% rename from packages/algorithm/lib/src/algorithm/sort/functions/shell.dart rename to modules/knowledge_system/algorithm/lib/src/algorithm/sort/functions/shell.dart diff --git a/packages/algorithm/lib/src/data_scope/sort_config.dart b/modules/knowledge_system/algorithm/lib/src/data_scope/sort_config.dart similarity index 100% rename from packages/algorithm/lib/src/data_scope/sort_config.dart rename to modules/knowledge_system/algorithm/lib/src/data_scope/sort_config.dart diff --git a/packages/algorithm/lib/src/data_scope/state.dart b/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart similarity index 100% rename from packages/algorithm/lib/src/data_scope/state.dart rename to modules/knowledge_system/algorithm/lib/src/data_scope/state.dart diff --git a/packages/algorithm/lib/src/finding/data_scope/finding_config.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_config.dart similarity index 100% rename from packages/algorithm/lib/src/finding/data_scope/finding_config.dart rename to modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_config.dart diff --git a/packages/algorithm/lib/src/finding/data_scope/finding_state.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_state.dart similarity index 100% rename from packages/algorithm/lib/src/finding/data_scope/finding_state.dart rename to modules/knowledge_system/algorithm/lib/src/finding/data_scope/finding_state.dart diff --git a/packages/algorithm/lib/src/finding/data_scope/position.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/position.dart similarity index 100% rename from packages/algorithm/lib/src/finding/data_scope/position.dart rename to modules/knowledge_system/algorithm/lib/src/finding/data_scope/position.dart diff --git a/packages/algorithm/lib/src/finding/data_scope/random_queue.dart b/modules/knowledge_system/algorithm/lib/src/finding/data_scope/random_queue.dart similarity index 100% rename from packages/algorithm/lib/src/finding/data_scope/random_queue.dart rename to modules/knowledge_system/algorithm/lib/src/finding/data_scope/random_queue.dart diff --git a/packages/algorithm/lib/src/finding/view/board.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/board.dart similarity index 100% rename from packages/algorithm/lib/src/finding/view/board.dart rename to modules/knowledge_system/algorithm/lib/src/finding/view/board.dart diff --git a/packages/algorithm/lib/src/finding/view/finding_page.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_page.dart similarity index 100% rename from packages/algorithm/lib/src/finding/view/finding_page.dart rename to modules/knowledge_system/algorithm/lib/src/finding/view/finding_page.dart diff --git a/packages/algorithm/lib/src/finding/view/finding_tool_bar.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart similarity index 100% rename from packages/algorithm/lib/src/finding/view/finding_tool_bar.dart rename to modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart diff --git a/packages/algorithm/lib/src/navigation/menu/algo_menu.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/algo_menu.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/menu/algo_menu.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/menu/algo_menu.dart diff --git a/packages/algorithm/lib/src/navigation/menu/finding.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/finding.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/menu/finding.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/menu/finding.dart diff --git a/packages/algorithm/lib/src/navigation/menu/sort.dart b/modules/knowledge_system/algorithm/lib/src/navigation/menu/sort.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/menu/sort.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/menu/sort.dart diff --git a/packages/algorithm/lib/src/navigation/router/router.dart b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/router/router.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart diff --git a/packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_desk_navigation.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/view/algo_desk_navigation.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/view/algo_desk_navigation.dart diff --git a/packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart similarity index 100% rename from packages/algorithm/lib/src/navigation/view/algo_menu_cell.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart diff --git a/packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart similarity index 98% rename from packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart rename to modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart index c6be71f6..512b8169 100644 --- a/packages/algorithm/lib/src/navigation/view/algo_menu_tree.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart @@ -1,4 +1,3 @@ -import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; import 'package:fx_go_router_ext/fx_go_router_ext.dart'; import 'package:tolyui/tolyui.dart'; diff --git a/packages/algorithm/lib/src/views/algo_page.dart b/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart similarity index 100% rename from packages/algorithm/lib/src/views/algo_page.dart rename to modules/knowledge_system/algorithm/lib/src/views/algo_page.dart diff --git a/packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart b/modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart similarity index 97% rename from packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart rename to modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart index 012ebfcf..61a8f6ae 100644 --- a/packages/algorithm/lib/src/views/desktop/desk_algo_panel.dart +++ b/modules/knowledge_system/algorithm/lib/src/views/desktop/desk_algo_panel.dart @@ -5,7 +5,6 @@ // Contact Me: 1981462002@qq.com import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; // class LayoutRouterPage extends StatefulWidget { // LayoutRouterPage({super.key}); diff --git a/packages/algorithm/lib/src/views/sort/data_painter.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/data_painter.dart similarity index 100% rename from packages/algorithm/lib/src/views/sort/data_painter.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/data_painter.dart diff --git a/packages/algorithm/lib/src/views/sort/sort_page.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/sort_page.dart similarity index 100% rename from packages/algorithm/lib/src/views/sort/sort_page.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/sort_page.dart diff --git a/packages/algorithm/lib/src/views/sort/sort_parper.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/sort_parper.dart similarity index 100% rename from packages/algorithm/lib/src/views/sort/sort_parper.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/sort_parper.dart diff --git a/packages/algorithm/lib/src/views/sort/sort_setting.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/sort_setting.dart similarity index 100% rename from packages/algorithm/lib/src/views/sort/sort_setting.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/sort_setting.dart diff --git a/packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_bar.dart similarity index 100% rename from packages/algorithm/lib/src/views/sort/top_bar/sort_bar.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_bar.dart diff --git a/packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart b/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart similarity index 96% rename from packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart rename to modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart index 8fa45022..66af7556 100644 --- a/packages/algorithm/lib/src/views/sort/top_bar/sort_button.dart +++ b/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart @@ -1,4 +1,3 @@ -import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; import 'package:tolyui/tolyui.dart'; diff --git a/packages/algorithm/pubspec.yaml b/modules/knowledge_system/algorithm/pubspec.yaml similarity index 92% rename from packages/algorithm/pubspec.yaml rename to modules/knowledge_system/algorithm/pubspec.yaml index d32962a7..ea61b3e6 100644 --- a/packages/algorithm/pubspec.yaml +++ b/modules/knowledge_system/algorithm/pubspec.yaml @@ -2,6 +2,7 @@ name: algorithm description: algorithm version: 0.0.1 homepage: +publish_to: none environment: sdk: '>=3.0.0 <4.0.0' @@ -16,11 +17,11 @@ dependencies: fx_go_router_ext: 0.0.2 components: - path: ../components + path: ../../basic_system/components toly_ui: - path: ../toly_ui + path: ../../basic_system/toly_ui app: - path: ../app + path: ../../basic_system/app dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/artifact/test/utils_test.dart b/modules/knowledge_system/algorithm/test/utils_test.dart similarity index 100% rename from packages/artifact/test/utils_test.dart rename to modules/knowledge_system/algorithm/test/utils_test.dart diff --git a/packages/utils/.gitignore b/modules/knowledge_system/artifact/.gitignore similarity index 100% rename from packages/utils/.gitignore rename to modules/knowledge_system/artifact/.gitignore diff --git a/packages/utils/.metadata b/modules/knowledge_system/artifact/.metadata similarity index 100% rename from packages/utils/.metadata rename to modules/knowledge_system/artifact/.metadata diff --git a/packages/layout/CHANGELOG.md b/modules/knowledge_system/artifact/CHANGELOG.md similarity index 100% rename from packages/layout/CHANGELOG.md rename to modules/knowledge_system/artifact/CHANGELOG.md diff --git a/packages/layout/LICENSE b/modules/knowledge_system/artifact/LICENSE similarity index 100% rename from packages/layout/LICENSE rename to modules/knowledge_system/artifact/LICENSE diff --git a/packages/layout/README.md b/modules/knowledge_system/artifact/README.md similarity index 100% rename from packages/layout/README.md rename to modules/knowledge_system/artifact/README.md diff --git a/packages/layout/analysis_options.yaml b/modules/knowledge_system/artifact/analysis_options.yaml similarity index 100% rename from packages/layout/analysis_options.yaml rename to modules/knowledge_system/artifact/analysis_options.yaml diff --git a/packages/artifact/lib/artifact.dart b/modules/knowledge_system/artifact/lib/artifact.dart similarity index 100% rename from packages/artifact/lib/artifact.dart rename to modules/knowledge_system/artifact/lib/artifact.dart diff --git a/packages/artifact/lib/src/articles/bloc/article/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart similarity index 100% rename from packages/artifact/lib/src/articles/bloc/article/bloc.dart rename to modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart diff --git a/packages/artifact/lib/src/articles/bloc/columnize/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart similarity index 100% rename from packages/artifact/lib/src/articles/bloc/columnize/bloc.dart rename to modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart diff --git a/packages/artifact/lib/src/articles/bloc/exp.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/exp.dart similarity index 100% rename from packages/artifact/lib/src/articles/bloc/exp.dart rename to modules/knowledge_system/artifact/lib/src/articles/bloc/exp.dart diff --git a/packages/artifact/lib/src/articles/data/exp.dart b/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart similarity index 100% rename from packages/artifact/lib/src/articles/data/exp.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/exp.dart diff --git a/packages/artifact/lib/src/articles/data/repository/article_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart similarity index 100% rename from packages/artifact/lib/src/articles/data/repository/article_repository.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart diff --git a/packages/artifact/lib/src/articles/data/repository/columnize_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart similarity index 100% rename from packages/artifact/lib/src/articles/data/repository/columnize_repository.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart diff --git a/packages/artifact/lib/src/articles/view/article/article_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/article/article_detail_page.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart diff --git a/packages/artifact/lib/src/articles/view/article/column_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/article/column_detail_page.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart diff --git a/packages/artifact/lib/src/articles/view/article/columnize_page_view.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/article/columnize_page_view.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart diff --git a/packages/artifact/lib/src/articles/view/article/sliver_article.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart similarity index 88% rename from packages/artifact/lib/src/articles/view/article/sliver_article.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart index 37353b94..ac6abff2 100644 --- a/packages/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart @@ -18,13 +18,13 @@ class SliverArticlePanel extends StatelessWidget { Widget build(BuildContext context) { ArticleState state = context.watch().state; return switch (state) { - ArticleLoading() => SliverToBoxAdapter( - child: const CupertinoActivityIndicator(), + ArticleLoading() => const SliverToBoxAdapter( + child: CupertinoActivityIndicator(), ), ArticleWithData() => SliverArticle( data: state.data, ), - ArticleFailed() => SliverToBoxAdapter( + ArticleFailed() => const SliverToBoxAdapter( child: Text('error'), ), }; @@ -100,14 +100,14 @@ class ArticlePanel extends StatelessWidget { onTap: ()=>toArticleDetail(context), child: Container( color: Theme.of(context).listTileTheme.tileColor, - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), - margin: EdgeInsets.only(bottom: 6), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: const EdgeInsets.only(bottom: 6), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ - CircleAvatar( + const CircleAvatar( backgroundImage: AssetImage( 'assets/images/icon_head.webp', ), @@ -120,8 +120,8 @@ class ArticlePanel extends StatelessWidget { Expanded( child: Text('${article.username}', style: - TextStyle(color: Color(0xff6A6D76), fontSize: 12))), - Text( + const TextStyle(color: Color(0xff6A6D76), fontSize: 12))), + const Text( '掘金', style: TextStyle(fontSize: 12, color: Color(0xff6A6D76)), ), @@ -132,7 +132,7 @@ class ArticlePanel extends StatelessWidget { child: Text( article.title, maxLines: 2, - style: TextStyle(fontWeight: FontWeight.bold), + style: const TextStyle(fontWeight: FontWeight.bold), ), ), Row( @@ -142,7 +142,7 @@ class ArticlePanel extends StatelessWidget { '${article.subtitle}', maxLines: 4, overflow: TextOverflow.ellipsis, - style: TextStyle( + style: const TextStyle( fontSize: 12, color: Color( 0xffA3A3A3, @@ -165,10 +165,10 @@ class ArticlePanel extends StatelessWidget { ), Row( children: [ - Spacer(), + const Spacer(), Text( '更新时间: ${formatLong.format(DateTime.fromMillisecondsSinceEpoch(article.update, isUtc: true))}', - style: TextStyle( + style: const TextStyle( color: Color( 0xff6A6D76, ), diff --git a/packages/artifact/lib/src/articles/view/article/sliver_columnize.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_columnize.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/article/sliver_columnize.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_columnize.dart diff --git a/packages/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart diff --git a/packages/artifact/lib/src/articles/view/artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/artifact_page.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart diff --git a/packages/artifact/lib/src/articles/view/building/building_panel.dart b/modules/knowledge_system/artifact/lib/src/articles/view/building/building_panel.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/building/building_panel.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/building/building_panel.dart diff --git a/packages/artifact/lib/src/articles/view/desk_artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/desk_artifact_page.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart diff --git a/packages/artifact/lib/src/articles/view/toly_refresh_indicator.dart b/modules/knowledge_system/artifact/lib/src/articles/view/toly_refresh_indicator.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/toly_refresh_indicator.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/toly_refresh_indicator.dart diff --git a/packages/artifact/lib/src/articles/view/wrapper/refresh.dart b/modules/knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart similarity index 100% rename from packages/artifact/lib/src/articles/view/wrapper/refresh.dart rename to modules/knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart diff --git a/packages/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart diff --git a/packages/artifact/lib/src/points/bloc/point_bloc/point_event.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_bloc/point_event.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart diff --git a/packages/artifact/lib/src/points/bloc/point_bloc/point_state.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_bloc/point_state.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart diff --git a/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart diff --git a/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart diff --git a/packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart diff --git a/packages/artifact/lib/src/points/bloc/point_system_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart similarity index 100% rename from packages/artifact/lib/src/points/bloc/point_system_bloc.dart rename to modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart diff --git a/packages/artifact/lib/src/points/data/api/app_info.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/app_info.dart similarity index 100% rename from packages/artifact/lib/src/points/data/api/app_info.dart rename to modules/knowledge_system/artifact/lib/src/points/data/api/app_info.dart diff --git a/packages/artifact/lib/src/points/data/api/category_api.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/category_api.dart similarity index 100% rename from packages/artifact/lib/src/points/data/api/category_api.dart rename to modules/knowledge_system/artifact/lib/src/points/data/api/category_api.dart diff --git a/packages/artifact/lib/src/points/data/api/issues_api.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart similarity index 100% rename from packages/artifact/lib/src/points/data/api/issues_api.dart rename to modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart diff --git a/packages/artifact/lib/src/points/data/model/github_model.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/github_model.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/github_model.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/github_model.dart diff --git a/packages/artifact/lib/src/points/data/model/github_user.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/github_user.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/github_user.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/github_user.dart diff --git a/packages/artifact/lib/src/points/data/model/issue.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/issue.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/issue.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/issue.dart diff --git a/packages/artifact/lib/src/points/data/model/issue_comment.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/issue_comment.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/issue_comment.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/issue_comment.dart diff --git a/packages/artifact/lib/src/points/data/model/license.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/license.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/license.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/license.dart diff --git a/packages/artifact/lib/src/points/data/model/repository.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/repository.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/repository.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/repository.dart diff --git a/packages/artifact/lib/src/points/data/model/repository_permissions.dart b/modules/knowledge_system/artifact/lib/src/points/data/model/repository_permissions.dart similarity index 100% rename from packages/artifact/lib/src/points/data/model/repository_permissions.dart rename to modules/knowledge_system/artifact/lib/src/points/data/model/repository_permissions.dart diff --git a/packages/artifact/lib/src/points/exp.dart b/modules/knowledge_system/artifact/lib/src/points/exp.dart similarity index 100% rename from packages/artifact/lib/src/points/exp.dart rename to modules/knowledge_system/artifact/lib/src/points/exp.dart diff --git a/packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart similarity index 100% rename from packages/artifact/lib/src/points/view/desk_ui/desk_point_page.dart rename to modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart diff --git a/packages/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart similarity index 100% rename from packages/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart rename to modules/knowledge_system/artifact/lib/src/points/view/desk_ui/github_repo_panel.dart diff --git a/packages/artifact/lib/src/points/view/issues_point/issue_item.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart similarity index 100% rename from packages/artifact/lib/src/points/view/issues_point/issue_item.dart rename to modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart diff --git a/packages/artifact/lib/src/points/view/issues_point/issues_detail.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart similarity index 100% rename from packages/artifact/lib/src/points/view/issues_point/issues_detail.dart rename to modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart diff --git a/packages/artifact/lib/src/points/view/issues_point/issues_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart similarity index 100% rename from packages/artifact/lib/src/points/view/issues_point/issues_point_page.dart rename to modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart diff --git a/packages/artifact/lib/src/points/view/issues_point/repo_widget.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/repo_widget.dart similarity index 100% rename from packages/artifact/lib/src/points/view/issues_point/repo_widget.dart rename to modules/knowledge_system/artifact/lib/src/points/view/issues_point/repo_widget.dart diff --git a/packages/artifact/pubspec.yaml b/modules/knowledge_system/artifact/pubspec.yaml similarity index 89% rename from packages/artifact/pubspec.yaml rename to modules/knowledge_system/artifact/pubspec.yaml index 0453cea1..dd05b592 100644 --- a/packages/artifact/pubspec.yaml +++ b/modules/knowledge_system/artifact/pubspec.yaml @@ -15,21 +15,21 @@ dependencies: webview_flutter: ^4.2.4 refresh: ^1.0.1 storage: - path: ../storage + path: ../../basic_system/storage algorithm: path: ../algorithm components: - path: ../components + path: ../../basic_system/components utils: - path: ../utils + path: ../../basic_system/utils layout: path: ../layout app: - path: ../app + path: ../../basic_system/app l10n: - path: ../l10n + path: ../../basic_system/l10n toly_ui: - path: ../toly_ui + path: ../../basic_system/toly_ui dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/utils/test/utils_test.dart b/modules/knowledge_system/artifact/test/utils_test.dart similarity index 100% rename from packages/utils/test/utils_test.dart rename to modules/knowledge_system/artifact/test/utils_test.dart diff --git a/packages/l10n/.gitignore b/modules/knowledge_system/awesome/.gitignore similarity index 100% rename from packages/l10n/.gitignore rename to modules/knowledge_system/awesome/.gitignore diff --git a/packages/draw_system/.metadata b/modules/knowledge_system/awesome/.metadata similarity index 100% rename from packages/draw_system/.metadata rename to modules/knowledge_system/awesome/.metadata diff --git a/packages/storage/CHANGELOG.md b/modules/knowledge_system/awesome/CHANGELOG.md similarity index 100% rename from packages/storage/CHANGELOG.md rename to modules/knowledge_system/awesome/CHANGELOG.md diff --git a/packages/storage/LICENSE b/modules/knowledge_system/awesome/LICENSE similarity index 100% rename from packages/storage/LICENSE rename to modules/knowledge_system/awesome/LICENSE diff --git a/packages/storage/README.md b/modules/knowledge_system/awesome/README.md similarity index 100% rename from packages/storage/README.md rename to modules/knowledge_system/awesome/README.md diff --git a/packages/storage/analysis_options.yaml b/modules/knowledge_system/awesome/analysis_options.yaml similarity index 100% rename from packages/storage/analysis_options.yaml rename to modules/knowledge_system/awesome/analysis_options.yaml diff --git a/packages/awesome/lib/awesome.dart b/modules/knowledge_system/awesome/lib/awesome.dart similarity index 100% rename from packages/awesome/lib/awesome.dart rename to modules/knowledge_system/awesome/lib/awesome.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/main.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/main.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/main.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/main.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/notifier/progress_value_notifier.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/detail_progress_view.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/detail/download_detail.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_page.dart diff --git a/packages/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_01/page/home/home_progress_view.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/main.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/main.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/main.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/main.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/download_data_scope.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/notifier/progress_value_notifier.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/detail_progress_view.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/detail/download_detail.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_page.dart diff --git a/packages/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart b/modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart similarity index 100% rename from packages/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart rename to modules/knowledge_system/awesome/lib/listenable/change_notifier_02/page/home/home_progress_view.dart diff --git a/packages/awesome/pubspec.yaml b/modules/knowledge_system/awesome/pubspec.yaml similarity index 100% rename from packages/awesome/pubspec.yaml rename to modules/knowledge_system/awesome/pubspec.yaml diff --git a/packages/awesome/test/awesome_test.dart b/modules/knowledge_system/awesome/test/awesome_test.dart similarity index 100% rename from packages/awesome/test/awesome_test.dart rename to modules/knowledge_system/awesome/test/awesome_test.dart diff --git a/packages/layout/.gitignore b/modules/knowledge_system/layout/.gitignore similarity index 100% rename from packages/layout/.gitignore rename to modules/knowledge_system/layout/.gitignore diff --git a/packages/layout/.metadata b/modules/knowledge_system/layout/.metadata similarity index 100% rename from packages/layout/.metadata rename to modules/knowledge_system/layout/.metadata diff --git a/packages/toly_ui/CHANGELOG.md b/modules/knowledge_system/layout/CHANGELOG.md similarity index 100% rename from packages/toly_ui/CHANGELOG.md rename to modules/knowledge_system/layout/CHANGELOG.md diff --git a/packages/toly_ui/LICENSE b/modules/knowledge_system/layout/LICENSE similarity index 100% rename from packages/toly_ui/LICENSE rename to modules/knowledge_system/layout/LICENSE diff --git a/packages/toly_ui/README.md b/modules/knowledge_system/layout/README.md similarity index 100% rename from packages/toly_ui/README.md rename to modules/knowledge_system/layout/README.md diff --git a/packages/toly_ui/analysis_options.yaml b/modules/knowledge_system/layout/analysis_options.yaml similarity index 100% rename from packages/toly_ui/analysis_options.yaml rename to modules/knowledge_system/layout/analysis_options.yaml diff --git a/packages/layout/lib/layout.dart b/modules/knowledge_system/layout/lib/layout.dart similarity index 100% rename from packages/layout/lib/layout.dart rename to modules/knowledge_system/layout/lib/layout.dart diff --git a/packages/layout/lib/src/bloc/display_logic.dart b/modules/knowledge_system/layout/lib/src/bloc/display_logic.dart similarity index 100% rename from packages/layout/lib/src/bloc/display_logic.dart rename to modules/knowledge_system/layout/lib/src/bloc/display_logic.dart diff --git a/packages/layout/lib/src/bloc/display_state.dart b/modules/knowledge_system/layout/lib/src/bloc/display_state.dart similarity index 100% rename from packages/layout/lib/src/bloc/display_state.dart rename to modules/knowledge_system/layout/lib/src/bloc/display_state.dart diff --git a/packages/layout/lib/src/data/display_map/base.dart b/modules/knowledge_system/layout/lib/src/data/display_map/base.dart similarity index 100% rename from packages/layout/lib/src/data/display_map/base.dart rename to modules/knowledge_system/layout/lib/src/data/display_map/base.dart diff --git a/packages/layout/lib/src/data/display_map/display_map.dart b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart similarity index 100% rename from packages/layout/lib/src/data/display_map/display_map.dart rename to modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart diff --git a/packages/layout/lib/src/data/display_map/funny.dart b/modules/knowledge_system/layout/lib/src/data/display_map/funny.dart similarity index 100% rename from packages/layout/lib/src/data/display_map/funny.dart rename to modules/knowledge_system/layout/lib/src/data/display_map/funny.dart diff --git a/packages/layout/lib/src/data/display_map/multi.dart b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart similarity index 100% rename from packages/layout/lib/src/data/display_map/multi.dart rename to modules/knowledge_system/layout/lib/src/data/display_map/multi.dart diff --git a/packages/layout/lib/src/data/model/display_frame.dart b/modules/knowledge_system/layout/lib/src/data/model/display_frame.dart similarity index 100% rename from packages/layout/lib/src/data/model/display_frame.dart rename to modules/knowledge_system/layout/lib/src/data/model/display_frame.dart diff --git a/packages/layout/lib/src/ext/go_router/listener.dart b/modules/knowledge_system/layout/lib/src/ext/go_router/listener.dart similarity index 100% rename from packages/layout/lib/src/ext/go_router/listener.dart rename to modules/knowledge_system/layout/lib/src/ext/go_router/listener.dart diff --git a/packages/layout/lib/src/ext/go_router/path.dart b/modules/knowledge_system/layout/lib/src/ext/go_router/path.dart similarity index 100% rename from packages/layout/lib/src/ext/go_router/path.dart rename to modules/knowledge_system/layout/lib/src/ext/go_router/path.dart diff --git a/packages/layout/lib/src/navigation/menu/base_layout.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/base_layout.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/base_layout.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/base_layout.dart diff --git a/packages/layout/lib/src/navigation/menu/funny.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/funny.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/funny.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/funny.dart diff --git a/packages/layout/lib/src/navigation/menu/layout.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/layout.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/layout.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/layout.dart diff --git a/packages/layout/lib/src/navigation/menu/menu_repository_impl.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/menu_repository_impl.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/menu_repository_impl.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/menu_repository_impl.dart diff --git a/packages/layout/lib/src/navigation/menu/multi.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/multi.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/multi.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/multi.dart diff --git a/packages/layout/lib/src/navigation/menu/popable.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/popable.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/popable.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/popable.dart diff --git a/packages/layout/lib/src/navigation/menu/scroll.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart similarity index 100% rename from packages/layout/lib/src/navigation/menu/scroll.dart rename to modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart diff --git a/packages/layout/lib/src/navigation/router/app_router.dart b/modules/knowledge_system/layout/lib/src/navigation/router/app_router.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/app_router.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/app_router.dart diff --git a/packages/layout/lib/src/navigation/router/desk_router.dart b/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/desk_router.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart diff --git a/packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/fade_page_transitions_builder.dart diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/fade_page_route.dart diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/slide_page_route.dart diff --git a/packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/page_route/zero_page_route.dart diff --git a/packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/size_clip_transition.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/size_clip_transition.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/size_clip_transition.dart diff --git a/packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/cupertino_back_gesture_detector.dart diff --git a/packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart b/modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart similarity index 100% rename from packages/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart rename to modules/knowledge_system/layout/lib/src/navigation/router/transition/slide_transition/slide_page_transition_builder.dart diff --git a/packages/layout/lib/src/navigation/view/app_desk_navigation.dart b/modules/knowledge_system/layout/lib/src/navigation/view/app_desk_navigation.dart similarity index 100% rename from packages/layout/lib/src/navigation/view/app_desk_navigation.dart rename to modules/knowledge_system/layout/lib/src/navigation/view/app_desk_navigation.dart diff --git a/packages/layout/lib/src/navigation/view/app_menu_tree.dart b/modules/knowledge_system/layout/lib/src/navigation/view/app_menu_tree.dart similarity index 100% rename from packages/layout/lib/src/navigation/view/app_menu_tree.dart rename to modules/knowledge_system/layout/lib/src/navigation/view/app_menu_tree.dart diff --git a/packages/layout/lib/src/views/base/align/align_show.dart b/modules/knowledge_system/layout/lib/src/views/base/align/align_show.dart similarity index 100% rename from packages/layout/lib/src/views/base/align/align_show.dart rename to modules/knowledge_system/layout/lib/src/views/base/align/align_show.dart diff --git a/packages/layout/lib/src/views/base/align/align_show2.dart b/modules/knowledge_system/layout/lib/src/views/base/align/align_show2.dart similarity index 100% rename from packages/layout/lib/src/views/base/align/align_show2.dart rename to modules/knowledge_system/layout/lib/src/views/base/align/align_show2.dart diff --git a/packages/layout/lib/src/views/base/padding/inner_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/inner_padding.dart similarity index 100% rename from packages/layout/lib/src/views/base/padding/inner_padding.dart rename to modules/knowledge_system/layout/lib/src/views/base/padding/inner_padding.dart diff --git a/packages/layout/lib/src/views/base/padding/outer_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/outer_padding.dart similarity index 100% rename from packages/layout/lib/src/views/base/padding/outer_padding.dart rename to modules/knowledge_system/layout/lib/src/views/base/padding/outer_padding.dart diff --git a/packages/layout/lib/src/views/base/padding/sizedbox_padding.dart b/modules/knowledge_system/layout/lib/src/views/base/padding/sizedbox_padding.dart similarity index 100% rename from packages/layout/lib/src/views/base/padding/sizedbox_padding.dart rename to modules/knowledge_system/layout/lib/src/views/base/padding/sizedbox_padding.dart diff --git a/packages/layout/lib/src/views/base/positioned/positioned_show.dart b/modules/knowledge_system/layout/lib/src/views/base/positioned/positioned_show.dart similarity index 100% rename from packages/layout/lib/src/views/base/positioned/positioned_show.dart rename to modules/knowledge_system/layout/lib/src/views/base/positioned/positioned_show.dart diff --git a/packages/layout/lib/src/views/base/size/size_display.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_display.dart similarity index 100% rename from packages/layout/lib/src/views/base/size/size_display.dart rename to modules/knowledge_system/layout/lib/src/views/base/size/size_display.dart diff --git a/packages/layout/lib/src/views/base/size/size_loss_by_align.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_loss_by_align.dart similarity index 100% rename from packages/layout/lib/src/views/base/size/size_loss_by_align.dart rename to modules/knowledge_system/layout/lib/src/views/base/size/size_loss_by_align.dart diff --git a/packages/layout/lib/src/views/base/size/size_tight_constraint.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_tight_constraint.dart similarity index 100% rename from packages/layout/lib/src/views/base/size/size_tight_constraint.dart rename to modules/knowledge_system/layout/lib/src/views/base/size/size_tight_constraint.dart diff --git a/packages/layout/lib/src/views/base/size/size_unconstraint.dart b/modules/knowledge_system/layout/lib/src/views/base/size/size_unconstraint.dart similarity index 100% rename from packages/layout/lib/src/views/base/size/size_unconstraint.dart rename to modules/knowledge_system/layout/lib/src/views/base/size/size_unconstraint.dart diff --git a/packages/layout/lib/src/views/components/grid_xy_layout.dart b/modules/knowledge_system/layout/lib/src/views/components/grid_xy_layout.dart similarity index 100% rename from packages/layout/lib/src/views/components/grid_xy_layout.dart rename to modules/knowledge_system/layout/lib/src/views/components/grid_xy_layout.dart diff --git a/packages/layout/lib/src/views/display/layout_playground.dart b/modules/knowledge_system/layout/lib/src/views/display/layout_playground.dart similarity index 100% rename from packages/layout/lib/src/views/display/layout_playground.dart rename to modules/knowledge_system/layout/lib/src/views/display/layout_playground.dart diff --git a/packages/layout/lib/src/views/display/playground_bottom_bar.dart b/modules/knowledge_system/layout/lib/src/views/display/playground_bottom_bar.dart similarity index 100% rename from packages/layout/lib/src/views/display/playground_bottom_bar.dart rename to modules/knowledge_system/layout/lib/src/views/display/playground_bottom_bar.dart diff --git a/packages/layout/lib/src/views/display/playground_top_bar.dart b/modules/knowledge_system/layout/lib/src/views/display/playground_top_bar.dart similarity index 100% rename from packages/layout/lib/src/views/display/playground_top_bar.dart rename to modules/knowledge_system/layout/lib/src/views/display/playground_top_bar.dart diff --git a/packages/layout/lib/src/views/interest/elevator/elevator.dart b/modules/knowledge_system/layout/lib/src/views/interest/elevator/elevator.dart similarity index 100% rename from packages/layout/lib/src/views/interest/elevator/elevator.dart rename to modules/knowledge_system/layout/lib/src/views/interest/elevator/elevator.dart diff --git a/packages/layout/lib/src/views/layout_page.dart b/modules/knowledge_system/layout/lib/src/views/layout_page.dart similarity index 100% rename from packages/layout/lib/src/views/layout_page.dart rename to modules/knowledge_system/layout/lib/src/views/layout_page.dart diff --git a/packages/layout/lib/src/views/multi/flex/column_show.dart b/modules/knowledge_system/layout/lib/src/views/multi/flex/column_show.dart similarity index 100% rename from packages/layout/lib/src/views/multi/flex/column_show.dart rename to modules/knowledge_system/layout/lib/src/views/multi/flex/column_show.dart diff --git a/packages/layout/lib/src/views/multi/flex/row_show.dart b/modules/knowledge_system/layout/lib/src/views/multi/flex/row_show.dart similarity index 100% rename from packages/layout/lib/src/views/multi/flex/row_show.dart rename to modules/knowledge_system/layout/lib/src/views/multi/flex/row_show.dart diff --git a/packages/layout/lib/src/views/playground/cons.dart b/modules/knowledge_system/layout/lib/src/views/playground/cons.dart similarity index 100% rename from packages/layout/lib/src/views/playground/cons.dart rename to modules/knowledge_system/layout/lib/src/views/playground/cons.dart diff --git a/packages/layout/lib/src/views/playground/data/flex_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/flex_attr.dart similarity index 100% rename from packages/layout/lib/src/views/playground/data/flex_attr.dart rename to modules/knowledge_system/layout/lib/src/views/playground/data/flex_attr.dart diff --git a/packages/layout/lib/src/views/playground/data/stack_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/stack_attr.dart similarity index 100% rename from packages/layout/lib/src/views/playground/data/stack_attr.dart rename to modules/knowledge_system/layout/lib/src/views/playground/data/stack_attr.dart diff --git a/packages/layout/lib/src/views/playground/data/wrap_attr.dart b/modules/knowledge_system/layout/lib/src/views/playground/data/wrap_attr.dart similarity index 100% rename from packages/layout/lib/src/views/playground/data/wrap_attr.dart rename to modules/knowledge_system/layout/lib/src/views/playground/data/wrap_attr.dart diff --git a/packages/layout/lib/src/views/playground/view/display_item.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/display_item.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/display_item.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/display_item.dart diff --git a/packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_op_panel.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/flex/flex_op_panel.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_op_panel.dart diff --git a/packages/layout/lib/src/views/playground/view/flex/flex_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/flex/flex_playground.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart diff --git a/packages/layout/lib/src/views/playground/view/form_item/item_selector.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_selector.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/form_item/item_selector.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_selector.dart diff --git a/packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_size_input.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/form_item/item_size_input.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/form_item/item_size_input.dart diff --git a/packages/layout/lib/src/views/playground/view/form_item/value_input.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/form_item/value_input.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/form_item/value_input.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/form_item/value_input.dart diff --git a/packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/stack/stack_op_panel.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart diff --git a/packages/layout/lib/src/views/playground/view/stack/stack_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_playground.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/stack/stack_playground.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_playground.dart diff --git a/packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_op_panel.dart diff --git a/packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart similarity index 100% rename from packages/layout/lib/src/views/playground/view/wrap/wrap_playground.dart rename to modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart diff --git a/packages/layout/lib/src/views/popable/autocomplete_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/autocomplete_demo.dart similarity index 100% rename from packages/layout/lib/src/views/popable/autocomplete_demo.dart rename to modules/knowledge_system/layout/lib/src/views/popable/autocomplete_demo.dart diff --git a/packages/layout/lib/src/views/popable/dropdown_button_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_button_demo.dart similarity index 100% rename from packages/layout/lib/src/views/popable/dropdown_button_demo.dart rename to modules/knowledge_system/layout/lib/src/views/popable/dropdown_button_demo.dart diff --git a/packages/layout/lib/src/views/popable/dropdown_menu_demo.dart b/modules/knowledge_system/layout/lib/src/views/popable/dropdown_menu_demo.dart similarity index 100% rename from packages/layout/lib/src/views/popable/dropdown_menu_demo.dart rename to modules/knowledge_system/layout/lib/src/views/popable/dropdown_menu_demo.dart diff --git a/packages/layout/lib/src/views/test_show.dart b/modules/knowledge_system/layout/lib/src/views/test_show.dart similarity index 100% rename from packages/layout/lib/src/views/test_show.dart rename to modules/knowledge_system/layout/lib/src/views/test_show.dart diff --git a/packages/layout/pubspec.yaml b/modules/knowledge_system/layout/pubspec.yaml similarity index 100% rename from packages/layout/pubspec.yaml rename to modules/knowledge_system/layout/pubspec.yaml diff --git a/packages/layout/test/layout_test.dart b/modules/knowledge_system/layout/test/layout_test.dart similarity index 100% rename from packages/layout/test/layout_test.dart rename to modules/knowledge_system/layout/test/layout_test.dart diff --git a/packages/toly_ui/.gitignore b/modules/painting_system/draw_system/.gitignore similarity index 100% rename from packages/toly_ui/.gitignore rename to modules/painting_system/draw_system/.gitignore diff --git a/packages/toly_ui/.metadata b/modules/painting_system/draw_system/.metadata similarity index 100% rename from packages/toly_ui/.metadata rename to modules/painting_system/draw_system/.metadata diff --git a/packages/treasure_tools/CHANGELOG.md b/modules/painting_system/draw_system/CHANGELOG.md similarity index 100% rename from packages/treasure_tools/CHANGELOG.md rename to modules/painting_system/draw_system/CHANGELOG.md diff --git a/packages/treasure_tools/LICENSE b/modules/painting_system/draw_system/LICENSE similarity index 100% rename from packages/treasure_tools/LICENSE rename to modules/painting_system/draw_system/LICENSE diff --git a/packages/treasure_tools/README.md b/modules/painting_system/draw_system/README.md similarity index 100% rename from packages/treasure_tools/README.md rename to modules/painting_system/draw_system/README.md diff --git a/packages/treasure_tools/analysis_options.yaml b/modules/painting_system/draw_system/analysis_options.yaml similarity index 100% rename from packages/treasure_tools/analysis_options.yaml rename to modules/painting_system/draw_system/analysis_options.yaml diff --git a/packages/draw_system/lib/draw_system.dart b/modules/painting_system/draw_system/lib/draw_system.dart similarity index 100% rename from packages/draw_system/lib/draw_system.dart rename to modules/painting_system/draw_system/lib/draw_system.dart diff --git a/packages/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart b/modules/painting_system/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart similarity index 100% rename from packages/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart rename to modules/painting_system/draw_system/lib/src/anim/bezier3_player/bezier3_palyer.dart diff --git a/packages/draw_system/lib/src/anim/bezier3_player/touch_info.dart b/modules/painting_system/draw_system/lib/src/anim/bezier3_player/touch_info.dart similarity index 100% rename from packages/draw_system/lib/src/anim/bezier3_player/touch_info.dart rename to modules/painting_system/draw_system/lib/src/anim/bezier3_player/touch_info.dart diff --git a/packages/draw_system/lib/src/anim/circle_halo.dart b/modules/painting_system/draw_system/lib/src/anim/circle_halo.dart similarity index 100% rename from packages/draw_system/lib/src/anim/circle_halo.dart rename to modules/painting_system/draw_system/lib/src/anim/circle_halo.dart diff --git a/packages/draw_system/lib/src/anim/curve_shower/anim_painter.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/anim_painter.dart similarity index 100% rename from packages/draw_system/lib/src/anim/curve_shower/anim_painter.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/anim_painter.dart diff --git a/packages/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart similarity index 100% rename from packages/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/curve_anim_shower.dart diff --git a/packages/draw_system/lib/src/anim/curve_shower/point_data.dart b/modules/painting_system/draw_system/lib/src/anim/curve_shower/point_data.dart similarity index 100% rename from packages/draw_system/lib/src/anim/curve_shower/point_data.dart rename to modules/painting_system/draw_system/lib/src/anim/curve_shower/point_data.dart diff --git a/packages/draw_system/lib/src/anim/draw_path.dart b/modules/painting_system/draw_system/lib/src/anim/draw_path.dart similarity index 100% rename from packages/draw_system/lib/src/anim/draw_path.dart rename to modules/painting_system/draw_system/lib/src/anim/draw_path.dart diff --git a/packages/draw_system/lib/src/anim/dundun_path.dart b/modules/painting_system/draw_system/lib/src/anim/dundun_path.dart similarity index 100% rename from packages/draw_system/lib/src/anim/dundun_path.dart rename to modules/painting_system/draw_system/lib/src/anim/dundun_path.dart diff --git a/packages/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart similarity index 100% rename from packages/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/angle_panter.dart diff --git a/packages/draw_system/lib/src/anim/rotate_by_point/line.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/line.dart similarity index 100% rename from packages/draw_system/lib/src/anim/rotate_by_point/line.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/line.dart diff --git a/packages/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart b/modules/painting_system/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart similarity index 100% rename from packages/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart rename to modules/painting_system/draw_system/lib/src/anim/rotate_by_point/rotate_by_point.dart diff --git a/packages/draw_system/lib/src/anim/spring_widget.dart b/modules/painting_system/draw_system/lib/src/anim/spring_widget.dart similarity index 100% rename from packages/draw_system/lib/src/anim/spring_widget.dart rename to modules/painting_system/draw_system/lib/src/anim/spring_widget.dart diff --git a/packages/draw_system/lib/src/art/circle_packing.dart b/modules/painting_system/draw_system/lib/src/art/circle_packing.dart similarity index 100% rename from packages/draw_system/lib/src/art/circle_packing.dart rename to modules/painting_system/draw_system/lib/src/art/circle_packing.dart diff --git a/packages/draw_system/lib/src/art/cubic_disarray.dart b/modules/painting_system/draw_system/lib/src/art/cubic_disarray.dart similarity index 100% rename from packages/draw_system/lib/src/art/cubic_disarray.dart rename to modules/painting_system/draw_system/lib/src/art/cubic_disarray.dart diff --git a/packages/draw_system/lib/src/art/hypnotic_squares.dart b/modules/painting_system/draw_system/lib/src/art/hypnotic_squares.dart similarity index 100% rename from packages/draw_system/lib/src/art/hypnotic_squares.dart rename to modules/painting_system/draw_system/lib/src/art/hypnotic_squares.dart diff --git a/packages/draw_system/lib/src/art/joy_division.dart b/modules/painting_system/draw_system/lib/src/art/joy_division.dart similarity index 100% rename from packages/draw_system/lib/src/art/joy_division.dart rename to modules/painting_system/draw_system/lib/src/art/joy_division.dart diff --git a/packages/draw_system/lib/src/art/piet_mondrian.dart b/modules/painting_system/draw_system/lib/src/art/piet_mondrian.dart similarity index 100% rename from packages/draw_system/lib/src/art/piet_mondrian.dart rename to modules/painting_system/draw_system/lib/src/art/piet_mondrian.dart diff --git a/packages/draw_system/lib/src/art/tiled_lines.dart b/modules/painting_system/draw_system/lib/src/art/tiled_lines.dart similarity index 100% rename from packages/draw_system/lib/src/art/tiled_lines.dart rename to modules/painting_system/draw_system/lib/src/art/tiled_lines.dart diff --git a/packages/draw_system/lib/src/art/triangular_mesh.dart b/modules/painting_system/draw_system/lib/src/art/triangular_mesh.dart similarity index 100% rename from packages/draw_system/lib/src/art/triangular_mesh.dart rename to modules/painting_system/draw_system/lib/src/art/triangular_mesh.dart diff --git a/packages/draw_system/lib/src/art/un_deux_trois.dart b/modules/painting_system/draw_system/lib/src/art/un_deux_trois.dart similarity index 100% rename from packages/draw_system/lib/src/art/un_deux_trois.dart rename to modules/painting_system/draw_system/lib/src/art/un_deux_trois.dart diff --git a/packages/draw_system/lib/src/base/clock_widget.dart b/modules/painting_system/draw_system/lib/src/base/clock_widget.dart similarity index 100% rename from packages/draw_system/lib/src/base/clock_widget.dart rename to modules/painting_system/draw_system/lib/src/base/clock_widget.dart diff --git a/packages/draw_system/lib/src/base/digital/digital_painter.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_painter.dart similarity index 100% rename from packages/draw_system/lib/src/base/digital/digital_painter.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_painter.dart diff --git a/packages/draw_system/lib/src/base/digital/digital_path.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_path.dart similarity index 100% rename from packages/draw_system/lib/src/base/digital/digital_path.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_path.dart diff --git a/packages/draw_system/lib/src/base/digital/digital_shower.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_shower.dart similarity index 100% rename from packages/draw_system/lib/src/base/digital/digital_shower.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_shower.dart diff --git a/packages/draw_system/lib/src/base/digital/digital_widget.dart b/modules/painting_system/draw_system/lib/src/base/digital/digital_widget.dart similarity index 100% rename from packages/draw_system/lib/src/base/digital/digital_widget.dart rename to modules/painting_system/draw_system/lib/src/base/digital/digital_widget.dart diff --git a/packages/draw_system/lib/src/base/draw_grid_axis.dart b/modules/painting_system/draw_system/lib/src/base/draw_grid_axis.dart similarity index 100% rename from packages/draw_system/lib/src/base/draw_grid_axis.dart rename to modules/painting_system/draw_system/lib/src/base/draw_grid_axis.dart diff --git a/packages/draw_system/lib/src/base/draw_path_fun.dart b/modules/painting_system/draw_system/lib/src/base/draw_path_fun.dart similarity index 100% rename from packages/draw_system/lib/src/base/draw_path_fun.dart rename to modules/painting_system/draw_system/lib/src/base/draw_path_fun.dart diff --git a/packages/draw_system/lib/src/base/draw_picture.dart b/modules/painting_system/draw_system/lib/src/base/draw_picture.dart similarity index 100% rename from packages/draw_system/lib/src/base/draw_picture.dart rename to modules/painting_system/draw_system/lib/src/base/draw_picture.dart diff --git a/packages/draw_system/lib/src/base/n_side/n_side_page.dart b/modules/painting_system/draw_system/lib/src/base/n_side/n_side_page.dart similarity index 100% rename from packages/draw_system/lib/src/base/n_side/n_side_page.dart rename to modules/painting_system/draw_system/lib/src/base/n_side/n_side_page.dart diff --git a/packages/draw_system/lib/src/base/n_side/shape_painter.dart b/modules/painting_system/draw_system/lib/src/base/n_side/shape_painter.dart similarity index 100% rename from packages/draw_system/lib/src/base/n_side/shape_painter.dart rename to modules/painting_system/draw_system/lib/src/base/n_side/shape_painter.dart diff --git a/packages/draw_system/lib/src/base/polar/angle_painter.dart b/modules/painting_system/draw_system/lib/src/base/polar/angle_painter.dart similarity index 100% rename from packages/draw_system/lib/src/base/polar/angle_painter.dart rename to modules/painting_system/draw_system/lib/src/base/polar/angle_painter.dart diff --git a/packages/draw_system/lib/src/base/polar/polar.dart b/modules/painting_system/draw_system/lib/src/base/polar/polar.dart similarity index 100% rename from packages/draw_system/lib/src/base/polar/polar.dart rename to modules/painting_system/draw_system/lib/src/base/polar/polar.dart diff --git a/packages/draw_system/lib/src/base/polar/polar_painter_widget.dart b/modules/painting_system/draw_system/lib/src/base/polar/polar_painter_widget.dart similarity index 100% rename from packages/draw_system/lib/src/base/polar/polar_painter_widget.dart rename to modules/painting_system/draw_system/lib/src/base/polar/polar_painter_widget.dart diff --git a/packages/draw_system/lib/src/base/windmill.dart b/modules/painting_system/draw_system/lib/src/base/windmill.dart similarity index 100% rename from packages/draw_system/lib/src/base/windmill.dart rename to modules/painting_system/draw_system/lib/src/base/windmill.dart diff --git a/packages/draw_system/lib/src/bloc/gallery_unit/bloc.dart b/modules/painting_system/draw_system/lib/src/bloc/gallery_unit/bloc.dart similarity index 100% rename from packages/draw_system/lib/src/bloc/gallery_unit/bloc.dart rename to modules/painting_system/draw_system/lib/src/bloc/gallery_unit/bloc.dart diff --git a/packages/draw_system/lib/src/desk_ui/desk_frame.dart b/modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart similarity index 98% rename from packages/draw_system/lib/src/desk_ui/desk_frame.dart rename to modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart index 97fa11d7..143c8dbf 100644 --- a/packages/draw_system/lib/src/desk_ui/desk_frame.dart +++ b/modules/painting_system/draw_system/lib/src/desk_ui/desk_frame.dart @@ -45,7 +45,7 @@ class DeskFrameShower extends StatelessWidget { ), Text( "${context.l10n.srcPath} ", - style: TextStyle( + style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.blueAccent), diff --git a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart b/modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart similarity index 97% rename from packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart rename to modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart index 5ffe1b1f..fef1eb29 100644 --- a/packages/draw_system/lib/src/desk_ui/desk_gallery_unit.dart +++ b/modules/painting_system/draw_system/lib/src/desk_ui/desk_gallery_unit.dart @@ -53,7 +53,7 @@ class _DeskGalleryUnitState extends State { SimpleDeskTopBar( leading: Text( 'Flutter ${context.l10n.paintCollection}', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), ), Expanded(child: _buildContent()), diff --git a/packages/draw_system/lib/src/fun/bufeng/bufeng_panel.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart similarity index 97% rename from packages/draw_system/lib/src/fun/bufeng/bufeng_panel.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart index 2366d017..3a534158 100644 --- a/packages/draw_system/lib/src/fun/bufeng/bufeng_panel.dart +++ b/modules/painting_system/draw_system/lib/src/fun/bufeng/bufeng_panel.dart @@ -27,7 +27,7 @@ class _BufengPanelState extends State { alignment: Alignment.topCenter, children: [ Padding( - padding: EdgeInsets.only(top: 10), + padding: const EdgeInsets.only(top: 10), child: CustomPaint( painter: PiPainter(config), size: config.size, diff --git a/packages/draw_system/lib/src/fun/bufeng/config.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/config.dart similarity index 100% rename from packages/draw_system/lib/src/fun/bufeng/config.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/config.dart diff --git a/packages/draw_system/lib/src/fun/bufeng/painter.dart b/modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart similarity index 97% rename from packages/draw_system/lib/src/fun/bufeng/painter.dart rename to modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart index e15cf9eb..3abe7fba 100644 --- a/packages/draw_system/lib/src/fun/bufeng/painter.dart +++ b/modules/painting_system/draw_system/lib/src/fun/bufeng/painter.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'config.dart'; diff --git a/packages/draw_system/lib/src/fun/dundun_view.dart b/modules/painting_system/draw_system/lib/src/fun/dundun_view.dart similarity index 100% rename from packages/draw_system/lib/src/fun/dundun_view.dart rename to modules/painting_system/draw_system/lib/src/fun/dundun_view.dart diff --git a/packages/draw_system/lib/src/fun/random_portrait.dart b/modules/painting_system/draw_system/lib/src/fun/random_portrait.dart similarity index 100% rename from packages/draw_system/lib/src/fun/random_portrait.dart rename to modules/painting_system/draw_system/lib/src/fun/random_portrait.dart diff --git a/packages/draw_system/lib/src/fun/stemp/stamp_data.dart b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_data.dart similarity index 100% rename from packages/draw_system/lib/src/fun/stemp/stamp_data.dart rename to modules/painting_system/draw_system/lib/src/fun/stemp/stamp_data.dart diff --git a/packages/draw_system/lib/src/fun/stemp/stamp_paper.dart b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart similarity index 100% rename from packages/draw_system/lib/src/fun/stemp/stamp_paper.dart rename to modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart diff --git a/packages/draw_system/lib/src/gallery_card_item.dart b/modules/painting_system/draw_system/lib/src/gallery_card_item.dart similarity index 100% rename from packages/draw_system/lib/src/gallery_card_item.dart rename to modules/painting_system/draw_system/lib/src/gallery_card_item.dart diff --git a/packages/draw_system/lib/src/gallery_detail_page.dart b/modules/painting_system/draw_system/lib/src/gallery_detail_page.dart similarity index 100% rename from packages/draw_system/lib/src/gallery_detail_page.dart rename to modules/painting_system/draw_system/lib/src/gallery_detail_page.dart diff --git a/packages/draw_system/lib/src/gallery_factory.dart b/modules/painting_system/draw_system/lib/src/gallery_factory.dart similarity index 100% rename from packages/draw_system/lib/src/gallery_factory.dart rename to modules/painting_system/draw_system/lib/src/gallery_factory.dart diff --git a/packages/draw_system/lib/src/gallery_unit.dart b/modules/painting_system/draw_system/lib/src/gallery_unit.dart similarity index 98% rename from packages/draw_system/lib/src/gallery_unit.dart rename to modules/painting_system/draw_system/lib/src/gallery_unit.dart index ed6c69cc..156e91a9 100644 --- a/packages/draw_system/lib/src/gallery_unit.dart +++ b/modules/painting_system/draw_system/lib/src/gallery_unit.dart @@ -4,11 +4,9 @@ import 'package:app/app.dart'; import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:l10n/l10n.dart'; -import 'bloc/gallery_unit/bloc.dart'; import 'desk_ui/desk_gallery_unit.dart'; import 'gallery_card_item.dart'; import 'gallery_detail_page.dart'; diff --git a/packages/draw_system/lib/src/particle/out/clock_fx.dart b/modules/painting_system/draw_system/lib/src/particle/out/clock_fx.dart similarity index 100% rename from packages/draw_system/lib/src/particle/out/clock_fx.dart rename to modules/painting_system/draw_system/lib/src/particle/out/clock_fx.dart diff --git a/packages/draw_system/lib/src/particle/out/clock_widget.dart b/modules/painting_system/draw_system/lib/src/particle/out/clock_widget.dart similarity index 100% rename from packages/draw_system/lib/src/particle/out/clock_widget.dart rename to modules/painting_system/draw_system/lib/src/particle/out/clock_widget.dart diff --git a/packages/draw_system/lib/src/particle/out/particle.dart b/modules/painting_system/draw_system/lib/src/particle/out/particle.dart similarity index 100% rename from packages/draw_system/lib/src/particle/out/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/out/particle.dart diff --git a/packages/draw_system/lib/src/particle/out/rnd.dart b/modules/painting_system/draw_system/lib/src/particle/out/rnd.dart similarity index 100% rename from packages/draw_system/lib/src/particle/out/rnd.dart rename to modules/painting_system/draw_system/lib/src/particle/out/rnd.dart diff --git a/packages/draw_system/lib/src/particle/random/particle.dart b/modules/painting_system/draw_system/lib/src/particle/random/particle.dart similarity index 100% rename from packages/draw_system/lib/src/particle/random/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/random/particle.dart diff --git a/packages/draw_system/lib/src/particle/random/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/random/particle_manage.dart similarity index 100% rename from packages/draw_system/lib/src/particle/random/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/random/particle_manage.dart diff --git a/packages/draw_system/lib/src/particle/random/random_particle.dart b/modules/painting_system/draw_system/lib/src/particle/random/random_particle.dart similarity index 100% rename from packages/draw_system/lib/src/particle/random/random_particle.dart rename to modules/painting_system/draw_system/lib/src/particle/random/random_particle.dart diff --git a/packages/draw_system/lib/src/particle/random/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/random/world_render.dart similarity index 100% rename from packages/draw_system/lib/src/particle/random/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/random/world_render.dart diff --git a/packages/draw_system/lib/src/particle/split/particle.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle.dart diff --git a/packages/draw_system/lib/src/particle/split/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle_manage.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle_manage.dart diff --git a/packages/draw_system/lib/src/particle/split/particle_split.dart b/modules/painting_system/draw_system/lib/src/particle/split/particle_split.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split/particle_split.dart rename to modules/painting_system/draw_system/lib/src/particle/split/particle_split.dart diff --git a/packages/draw_system/lib/src/particle/split/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/split/world_render.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/split/world_render.dart diff --git a/packages/draw_system/lib/src/particle/split_img/particle.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/particle.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split_img/particle.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/particle.dart diff --git a/packages/draw_system/lib/src/particle/split_img/particle_manage.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/particle_manage.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split_img/particle_manage.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/particle_manage.dart diff --git a/packages/draw_system/lib/src/particle/split_img/split_image.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/split_image.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split_img/split_image.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/split_image.dart diff --git a/packages/draw_system/lib/src/particle/split_img/world_render.dart b/modules/painting_system/draw_system/lib/src/particle/split_img/world_render.dart similarity index 100% rename from packages/draw_system/lib/src/particle/split_img/world_render.dart rename to modules/painting_system/draw_system/lib/src/particle/split_img/world_render.dart diff --git a/packages/draw_system/lib/src/picture_frame.dart b/modules/painting_system/draw_system/lib/src/picture_frame.dart similarity index 100% rename from packages/draw_system/lib/src/picture_frame.dart rename to modules/painting_system/draw_system/lib/src/picture_frame.dart diff --git a/packages/draw_system/lib/src/utils/colors.dart b/modules/painting_system/draw_system/lib/src/utils/colors.dart similarity index 100% rename from packages/draw_system/lib/src/utils/colors.dart rename to modules/painting_system/draw_system/lib/src/utils/colors.dart diff --git a/packages/draw_system/lib/src/utils/coordinate.dart b/modules/painting_system/draw_system/lib/src/utils/coordinate.dart similarity index 100% rename from packages/draw_system/lib/src/utils/coordinate.dart rename to modules/painting_system/draw_system/lib/src/utils/coordinate.dart diff --git a/packages/draw_system/pubspec.yaml b/modules/painting_system/draw_system/pubspec.yaml similarity index 91% rename from packages/draw_system/pubspec.yaml rename to modules/painting_system/draw_system/pubspec.yaml index d0f36408..ece375ee 100644 --- a/packages/draw_system/pubspec.yaml +++ b/modules/painting_system/draw_system/pubspec.yaml @@ -2,6 +2,7 @@ name: draw_system description: "A new Flutter package project." version: 0.0.1 homepage: +publish_to: none environment: sdk: '>=3.2.3 <4.0.0' @@ -11,13 +12,13 @@ dependencies: flutter: sdk: flutter toly_ui: - path: ../toly_ui + path: ../../basic_system/toly_ui l10n: - path: ../l10n + path: ../../basic_system/l10n app: - path: ../app + path: ../../basic_system/app components: - path: ../components + path: ../../basic_system/components dash_painter: ^1.0.2 flutter_bloc: ^8.1.6 # 状态管理 url_launcher: ^6.1.14 # url diff --git a/packages/draw_system/test/draw_system_test.dart b/modules/painting_system/draw_system/test/draw_system_test.dart similarity index 100% rename from packages/draw_system/test/draw_system_test.dart rename to modules/painting_system/draw_system/test/draw_system_test.dart diff --git a/packages/treasure_tools/.gitignore b/modules/tools_system/treasure_tools/.gitignore similarity index 100% rename from packages/treasure_tools/.gitignore rename to modules/tools_system/treasure_tools/.gitignore diff --git a/packages/treasure_tools/.metadata b/modules/tools_system/treasure_tools/.metadata similarity index 100% rename from packages/treasure_tools/.metadata rename to modules/tools_system/treasure_tools/.metadata diff --git a/packages/utils/CHANGELOG.md b/modules/tools_system/treasure_tools/CHANGELOG.md similarity index 100% rename from packages/utils/CHANGELOG.md rename to modules/tools_system/treasure_tools/CHANGELOG.md diff --git a/packages/utils/LICENSE b/modules/tools_system/treasure_tools/LICENSE similarity index 100% rename from packages/utils/LICENSE rename to modules/tools_system/treasure_tools/LICENSE diff --git a/packages/utils/README.md b/modules/tools_system/treasure_tools/README.md similarity index 100% rename from packages/utils/README.md rename to modules/tools_system/treasure_tools/README.md diff --git a/packages/utils/analysis_options.yaml b/modules/tools_system/treasure_tools/analysis_options.yaml similarity index 100% rename from packages/utils/analysis_options.yaml rename to modules/tools_system/treasure_tools/analysis_options.yaml diff --git a/packages/treasure_tools/lib/src/bloc/state.dart b/modules/tools_system/treasure_tools/lib/src/bloc/state.dart similarity index 100% rename from packages/treasure_tools/lib/src/bloc/state.dart rename to modules/tools_system/treasure_tools/lib/src/bloc/state.dart diff --git a/packages/treasure_tools/lib/src/class_generator.dart b/modules/tools_system/treasure_tools/lib/src/class_generator.dart similarity index 100% rename from packages/treasure_tools/lib/src/class_generator.dart rename to modules/tools_system/treasure_tools/lib/src/class_generator.dart diff --git a/packages/treasure_tools/lib/src/code_gen_page.dart b/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart similarity index 100% rename from packages/treasure_tools/lib/src/code_gen_page.dart rename to modules/tools_system/treasure_tools/lib/src/code_gen_page.dart diff --git a/packages/treasure_tools/lib/src/data/task_result.dart b/modules/tools_system/treasure_tools/lib/src/data/task_result.dart similarity index 100% rename from packages/treasure_tools/lib/src/data/task_result.dart rename to modules/tools_system/treasure_tools/lib/src/data/task_result.dart diff --git a/packages/treasure_tools/lib/src/desk_widget_top_bar.dart b/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart similarity index 100% rename from packages/treasure_tools/lib/src/desk_widget_top_bar.dart rename to modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart diff --git a/packages/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart similarity index 100% rename from packages/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/gen_message_action.dart diff --git a/packages/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart similarity index 100% rename from packages/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart diff --git a/packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart similarity index 100% rename from packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_config.dart diff --git a/packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart similarity index 100% rename from packages/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart rename to modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_gen_page.dart diff --git a/packages/treasure_tools/lib/src/model/class.dart b/modules/tools_system/treasure_tools/lib/src/model/class.dart similarity index 100% rename from packages/treasure_tools/lib/src/model/class.dart rename to modules/tools_system/treasure_tools/lib/src/model/class.dart diff --git a/packages/treasure_tools/lib/src/model/field.dart b/modules/tools_system/treasure_tools/lib/src/model/field.dart similarity index 100% rename from packages/treasure_tools/lib/src/model/field.dart rename to modules/tools_system/treasure_tools/lib/src/model/field.dart diff --git a/packages/treasure_tools/lib/src/popable/class_gen_field.dart b/modules/tools_system/treasure_tools/lib/src/popable/class_gen_field.dart similarity index 100% rename from packages/treasure_tools/lib/src/popable/class_gen_field.dart rename to modules/tools_system/treasure_tools/lib/src/popable/class_gen_field.dart diff --git a/packages/treasure_tools/lib/src/popable/toly_select.dart b/modules/tools_system/treasure_tools/lib/src/popable/toly_select.dart similarity index 100% rename from packages/treasure_tools/lib/src/popable/toly_select.dart rename to modules/tools_system/treasure_tools/lib/src/popable/toly_select.dart diff --git a/packages/treasure_tools/lib/src/wrapper.dart b/modules/tools_system/treasure_tools/lib/src/wrapper.dart similarity index 100% rename from packages/treasure_tools/lib/src/wrapper.dart rename to modules/tools_system/treasure_tools/lib/src/wrapper.dart diff --git a/packages/treasure_tools/lib/treasure_tools.dart b/modules/tools_system/treasure_tools/lib/treasure_tools.dart similarity index 100% rename from packages/treasure_tools/lib/treasure_tools.dart rename to modules/tools_system/treasure_tools/lib/treasure_tools.dart diff --git a/packages/treasure_tools/pubspec.yaml b/modules/tools_system/treasure_tools/pubspec.yaml similarity index 94% rename from packages/treasure_tools/pubspec.yaml rename to modules/tools_system/treasure_tools/pubspec.yaml index 0f60e5df..c16ce56a 100644 --- a/packages/treasure_tools/pubspec.yaml +++ b/modules/tools_system/treasure_tools/pubspec.yaml @@ -16,11 +16,11 @@ dependencies: file_picker: ^8.0.5 shared_preferences: ^2.2.2 # xml 固化 utils: - path: ../utils + path: ../../basic_system/utils app: - path: ../app + path: ../../basic_system/app toly_ui: - path: ../toly_ui + path: ../../basic_system/toly_ui dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/treasure_tools/test/iconfont_parser_test.dart b/modules/tools_system/treasure_tools/test/iconfont_parser_test.dart similarity index 100% rename from packages/treasure_tools/test/iconfont_parser_test.dart rename to modules/tools_system/treasure_tools/test/iconfont_parser_test.dart diff --git a/packages/treasure_tools/test/treasure_tools_test.dart b/modules/tools_system/treasure_tools/test/treasure_tools_test.dart similarity index 100% rename from packages/treasure_tools/test/treasure_tools_test.dart rename to modules/tools_system/treasure_tools/test/treasure_tools_test.dart diff --git a/packages/treasure_tools/test/yaml_parser_test.dart b/modules/tools_system/treasure_tools/test/yaml_parser_test.dart similarity index 100% rename from packages/treasure_tools/test/yaml_parser_test.dart rename to modules/tools_system/treasure_tools/test/yaml_parser_test.dart diff --git a/packages/treasure_tools/test/yaml_parser_test2.dart b/modules/tools_system/treasure_tools/test/yaml_parser_test2.dart similarity index 100% rename from packages/treasure_tools/test/yaml_parser_test2.dart rename to modules/tools_system/treasure_tools/test/yaml_parser_test2.dart diff --git a/packages/widget_module/.gitignore b/modules/widget_system/widget_module/.gitignore similarity index 100% rename from packages/widget_module/.gitignore rename to modules/widget_system/widget_module/.gitignore diff --git a/packages/widget_module/.metadata b/modules/widget_system/widget_module/.metadata similarity index 100% rename from packages/widget_module/.metadata rename to modules/widget_system/widget_module/.metadata diff --git a/packages/widget_module/CHANGELOG.md b/modules/widget_system/widget_module/CHANGELOG.md similarity index 100% rename from packages/widget_module/CHANGELOG.md rename to modules/widget_system/widget_module/CHANGELOG.md diff --git a/packages/widget_module/LICENSE b/modules/widget_system/widget_module/LICENSE similarity index 100% rename from packages/widget_module/LICENSE rename to modules/widget_system/widget_module/LICENSE diff --git a/packages/widget_module/README.md b/modules/widget_system/widget_module/README.md similarity index 100% rename from packages/widget_module/README.md rename to modules/widget_system/widget_module/README.md diff --git a/packages/widget_module/analysis_options.yaml b/modules/widget_system/widget_module/analysis_options.yaml similarity index 100% rename from packages/widget_module/analysis_options.yaml rename to modules/widget_system/widget_module/analysis_options.yaml diff --git a/packages/widget_module/lib/blocs/blocs.dart b/modules/widget_system/widget_module/lib/blocs/blocs.dart similarity index 100% rename from packages/widget_module/lib/blocs/blocs.dart rename to modules/widget_system/widget_module/lib/blocs/blocs.dart diff --git a/packages/widget_module/lib/blocs/category_bloc/category_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_bloc/category_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart diff --git a/packages/widget_module/lib/blocs/category_bloc/category_event.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_bloc/category_event.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_event.dart diff --git a/packages/widget_module/lib/blocs/category_bloc/category_state.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_bloc/category_state.dart rename to modules/widget_system/widget_module/lib/blocs/category_bloc/category_state.dart diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_event.dart diff --git a/packages/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart rename to modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_state.dart diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart similarity index 100% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_event.dart diff --git a/packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart rename to modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_state.dart diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart similarity index 100% rename from packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart diff --git a/packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart rename to modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_state.dart diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart similarity index 100% rename from packages/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart rename to modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart similarity index 100% rename from packages/widget_module/lib/blocs/widgets_bloc/widgets_event.dart rename to modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart diff --git a/packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart similarity index 100% rename from packages/widget_module/lib/blocs/widgets_bloc/widgets_state.dart rename to modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart diff --git a/packages/widget_module/lib/data/category_repository.dart b/modules/widget_system/widget_module/lib/data/category_repository.dart similarity index 100% rename from packages/widget_module/lib/data/category_repository.dart rename to modules/widget_system/widget_module/lib/data/category_repository.dart diff --git a/packages/widget_module/lib/data/db_impl/catagory_db_repository.dart b/modules/widget_system/widget_module/lib/data/db_impl/catagory_db_repository.dart similarity index 100% rename from packages/widget_module/lib/data/db_impl/catagory_db_repository.dart rename to modules/widget_system/widget_module/lib/data/db_impl/catagory_db_repository.dart diff --git a/packages/widget_module/lib/data/db_impl/db_impl.dart b/modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart similarity index 100% rename from packages/widget_module/lib/data/db_impl/db_impl.dart rename to modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart diff --git a/packages/widget_module/lib/data/db_impl/node_db_repository.dart b/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart similarity index 100% rename from packages/widget_module/lib/data/db_impl/node_db_repository.dart rename to modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart diff --git a/packages/widget_module/lib/data/db_impl/widget_db_repository.dart b/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart similarity index 100% rename from packages/widget_module/lib/data/db_impl/widget_db_repository.dart rename to modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart diff --git a/packages/widget_module/lib/data/memory_impl/memory_node_repository.dart b/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart similarity index 100% rename from packages/widget_module/lib/data/memory_impl/memory_node_repository.dart rename to modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart diff --git a/packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart b/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart similarity index 100% rename from packages/widget_module/lib/data/memory_impl/memory_widget_repository.dart rename to modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart diff --git a/packages/widget_module/lib/data/model/category_model.dart b/modules/widget_system/widget_module/lib/data/model/category_model.dart similarity index 100% rename from packages/widget_module/lib/data/model/category_model.dart rename to modules/widget_system/widget_module/lib/data/model/category_model.dart diff --git a/packages/widget_module/lib/data/model/enums.dart b/modules/widget_system/widget_module/lib/data/model/enums.dart similarity index 100% rename from packages/widget_module/lib/data/model/enums.dart rename to modules/widget_system/widget_module/lib/data/model/enums.dart diff --git a/packages/widget_module/lib/data/model/model.dart b/modules/widget_system/widget_module/lib/data/model/model.dart similarity index 100% rename from packages/widget_module/lib/data/model/model.dart rename to modules/widget_system/widget_module/lib/data/model/model.dart diff --git a/packages/widget_module/lib/data/model/node_model.dart b/modules/widget_system/widget_module/lib/data/model/node_model.dart similarity index 100% rename from packages/widget_module/lib/data/model/node_model.dart rename to modules/widget_system/widget_module/lib/data/model/node_model.dart diff --git a/packages/widget_module/lib/data/model/widget_filter.dart b/modules/widget_system/widget_module/lib/data/model/widget_filter.dart similarity index 100% rename from packages/widget_module/lib/data/model/widget_filter.dart rename to modules/widget_system/widget_module/lib/data/model/widget_filter.dart diff --git a/packages/widget_module/lib/data/model/widget_model.dart b/modules/widget_system/widget_module/lib/data/model/widget_model.dart similarity index 100% rename from packages/widget_module/lib/data/model/widget_model.dart rename to modules/widget_system/widget_module/lib/data/model/widget_model.dart diff --git a/packages/widget_module/lib/data/node_repository.dart b/modules/widget_system/widget_module/lib/data/node_repository.dart similarity index 100% rename from packages/widget_module/lib/data/node_repository.dart rename to modules/widget_system/widget_module/lib/data/node_repository.dart diff --git a/packages/widget_module/lib/data/widget_repository.dart b/modules/widget_system/widget_module/lib/data/widget_repository.dart similarity index 100% rename from packages/widget_module/lib/data/widget_repository.dart rename to modules/widget_system/widget_module/lib/data/widget_repository.dart diff --git a/packages/widget_module/lib/data/zone.dart b/modules/widget_system/widget_module/lib/data/zone.dart similarity index 100% rename from packages/widget_module/lib/data/zone.dart rename to modules/widget_system/widget_module/lib/data/zone.dart diff --git a/packages/widget_module/lib/views/components/collected_tag.dart b/modules/widget_system/widget_module/lib/views/components/collected_tag.dart similarity index 100% rename from packages/widget_module/lib/views/components/collected_tag.dart rename to modules/widget_system/widget_module/lib/views/components/collected_tag.dart diff --git a/packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart diff --git a/packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart diff --git a/packages/widget_module/lib/views/desk_ui/desk_ui.dart b/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/desk_ui.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_top_bar.dart diff --git a/packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart similarity index 100% rename from packages/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/category_detail.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/category_detail.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/category_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/category_list_item.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/category_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/category_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/collect_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/collect_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/delete_category_dialog.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/edit_category_panel.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/empty_category.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/empty_category.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/empty_category.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/empty_category.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/home_right_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/home_right_drawer.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/home_right_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/home_right_drawer.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/like_widget_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/sync/async_button.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/category_api.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/sync/category_api.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/sync/category_api.dart diff --git a/packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/category_page/sync/upload_button.dart rename to modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart diff --git a/packages/widget_module/lib/views/mobile/mobile_ui.dart b/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/mobile_ui.dart rename to modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart diff --git a/packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/search_page/app_search_bar.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart diff --git a/packages/widget_module/lib/views/mobile/search_page/search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/search_page/search_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/search_page/standard_search_bar.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart diff --git a/packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/search_page/standard_search_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart diff --git a/packages/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/home_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/home_drawer.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/standard_home_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/standard_home_search.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_list_panel.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/widget_model_item.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart diff --git a/packages/widget_module/lib/views/mobile/widget_page/widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart similarity index 100% rename from packages/widget_module/lib/views/mobile/widget_page/widget_page.dart rename to modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart diff --git a/packages/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart similarity index 100% rename from packages/widget_module/lib/widget_module.dart rename to modules/widget_system/widget_module/lib/widget_module.dart diff --git a/packages/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml similarity index 86% rename from packages/widget_module/pubspec.yaml rename to modules/widget_system/widget_module/pubspec.yaml index 3f7ed9b5..3d306b9f 100644 --- a/packages/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -17,24 +17,24 @@ dependencies: toggle_rotate: ^1.0.1 wrapper: ^1.0.2 artifact: - path: ../artifact + path: ../../knowledge_system/artifact storage: - path: ../storage + path: ../../basic_system/storage toly_ui: - path: ../toly_ui + path: ../../basic_system/toly_ui share_plus: ^10.0.1 # 文字分享 components: - path: ../components + path: ../../basic_system/components authentication: - path: ../authentication + path: ../../basic_system/authentication app: - path: ../app + path: ../../basic_system/app l10n: - path: ../l10n + path: ../../basic_system/l10n widgets: path: ../widgets utils: - path: ../utils + path: ../../basic_system/utils go_router: ^14.2.0 dev_dependencies: flutter_test: diff --git a/packages/widget_module/test/widget_module_test.dart b/modules/widget_system/widget_module/test/widget_module_test.dart similarity index 100% rename from packages/widget_module/test/widget_module_test.dart rename to modules/widget_system/widget_module/test/widget_module_test.dart diff --git a/packages/widgets/.gitignore b/modules/widget_system/widgets/.gitignore similarity index 100% rename from packages/widgets/.gitignore rename to modules/widget_system/widgets/.gitignore diff --git a/packages/widgets/.metadata b/modules/widget_system/widgets/.metadata similarity index 100% rename from packages/widgets/.metadata rename to modules/widget_system/widgets/.metadata diff --git a/packages/widgets/CHANGELOG.md b/modules/widget_system/widgets/CHANGELOG.md similarity index 100% rename from packages/widgets/CHANGELOG.md rename to modules/widget_system/widgets/CHANGELOG.md diff --git a/packages/widgets/LICENSE b/modules/widget_system/widgets/LICENSE similarity index 100% rename from packages/widgets/LICENSE rename to modules/widget_system/widgets/LICENSE diff --git a/packages/widgets/README.md b/modules/widget_system/widgets/README.md similarity index 100% rename from packages/widgets/README.md rename to modules/widget_system/widgets/README.md diff --git a/packages/widgets/analysis_options.yaml b/modules/widget_system/widgets/analysis_options.yaml similarity index 100% rename from packages/widgets/analysis_options.yaml rename to modules/widget_system/widgets/analysis_options.yaml diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart diff --git a/packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart similarity index 100% rename from packages/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart diff --git a/packages/widgets/lib/Other/ErrorWidget/node1_base.dart b/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/ErrorWidget/node1_base.dart rename to modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart diff --git a/packages/widgets/lib/Other/ListWheelViewport/node1_base.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/ListWheelViewport/node1_base.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart diff --git a/packages/widgets/lib/Other/ListWheelViewport/node2_perspective.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart similarity index 100% rename from packages/widgets/lib/Other/ListWheelViewport/node2_perspective.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart diff --git a/packages/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart similarity index 100% rename from packages/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart diff --git a/packages/widgets/lib/Other/ListWheelViewport/node4_opacity.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart similarity index 100% rename from packages/widgets/lib/Other/ListWheelViewport/node4_opacity.dart rename to modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart diff --git a/packages/widgets/lib/Other/PerformanceOverlay/node1_base.dart b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/PerformanceOverlay/node1_base.dart rename to modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart diff --git a/packages/widgets/lib/Other/RawImage/node1_base.dart b/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/RawImage/node1_base.dart rename to modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart diff --git a/packages/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart rename to modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart diff --git a/packages/widgets/lib/Other/Table/node1_base.dart b/modules/widget_system/widgets/lib/Other/Table/node1_base.dart similarity index 100% rename from packages/widgets/lib/Other/Table/node1_base.dart rename to modules/widget_system/widgets/lib/Other/Table/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/Directionality/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/Directionality/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/Expanded/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/Expanded/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/Flexible/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/Flexible/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/IconTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/IconTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/InheritedModel/node1.dart rename to modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart diff --git a/packages/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart rename to modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart diff --git a/packages/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/LayoutId/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/LayoutId/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/Positioned/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/Positioned/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart rename to modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart diff --git a/packages/widgets/lib/ProxyWidget/TableCell/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/TableCell/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart diff --git a/packages/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart rename to modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/main.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/matrix4_shower.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/zz_node_op.dart diff --git a/packages/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart similarity index 100% rename from packages/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart diff --git a/packages/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart diff --git a/packages/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart diff --git a/packages/widgets/lib/Sliver/CustomScrollView/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/CustomScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart diff --git a/packages/widgets/lib/Sliver/DecoratedSliver/node1.dart b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart similarity index 100% rename from packages/widgets/lib/Sliver/DecoratedSliver/node1.dart rename to modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart diff --git a/packages/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverAppBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverAppBar/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart rename to modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart diff --git a/packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart rename to modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart diff --git a/packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart rename to modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart diff --git a/packages/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverFillViewport/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverFillViewport/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverGrid/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverGrid/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverList/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart rename to modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart diff --git a/packages/widgets/lib/Sliver/SliverOpacity/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverOpacity/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverPadding/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverPadding/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart diff --git a/packages/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart rename to modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AppBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/AppBar/node2_tab.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AppBar/node2_tab.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart diff --git a/packages/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart rename to modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart diff --git a/packages/widgets/lib/StatefulWidget/Checkbox/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Checkbox/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart diff --git a/packages/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart diff --git a/packages/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart diff --git a/packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart diff --git a/packages/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Dismissible/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Dismissible/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart diff --git a/packages/widgets/lib/StatefulWidget/DragTarget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DragTarget/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Draggable/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node2_data.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Draggable/node2_data.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart diff --git a/packages/widgets/lib/StatefulWidget/Draggable/node3_use.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Draggable/node3_use.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart diff --git a/packages/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DrawerController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DrawerController/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownMenu/node1.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownMenu/node2.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart diff --git a/packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/DropdownMenu/node3.dart rename to modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart diff --git a/packages/widgets/lib/StatefulWidget/EditableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/EditableText/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart diff --git a/packages/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Form/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Form/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/FormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/FormField/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Hero/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Hero/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node2_fit.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node2_fit.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node3_alignment.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node3_alignment.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node5_repeat.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node5_repeat.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart diff --git a/packages/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart diff --git a/packages/widgets/lib/StatefulWidget/Ink/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Ink/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Ink/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Ink/node2_image.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart diff --git a/packages/widgets/lib/StatefulWidget/InkResponse/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InkResponse/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/InkResponse/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InkResponse/node2_color.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart diff --git a/packages/widgets/lib/StatefulWidget/InkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InkWell/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/InkWell/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InkWell/node2_color.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart diff --git a/packages/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart diff --git a/packages/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart rename to modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart diff --git a/packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/LicensePage/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Material/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Material/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Material/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Material/node2_shape.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart diff --git a/packages/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart rename to modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart diff --git a/packages/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart rename to modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart diff --git a/packages/widgets/lib/StatefulWidget/Navigator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Navigator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart rename to modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart diff --git a/packages/widgets/lib/StatefulWidget/Overlay/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Overlay/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/PageView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PageView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/PageView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PageView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart diff --git a/packages/widgets/lib/StatefulWidget/PageView/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PageView/node3_controller.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart diff --git a/packages/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Radio/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Radio/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RawChip/node1_press.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawChip/node1_press.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart diff --git a/packages/widgets/lib/StatefulWidget/RawChip/node2_select.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawChip/node2_select.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart diff --git a/packages/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart diff --git a/packages/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart diff --git a/packages/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Scaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Scaffold/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Scrollable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Scrollable/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/SelectableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/SelectableText/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/SelectableText/node2_align.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/SelectableText/node2_align.dart rename to modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart diff --git a/packages/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Slider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Slider/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Slider/node2_lable.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Slider/node2_lable.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart diff --git a/packages/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Stepper/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Stepper/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Stepper/node2_type.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Stepper/node2_type.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart diff --git a/packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Switch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Switch/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Switch/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Switch/node2_image.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart diff --git a/packages/widgets/lib/StatefulWidget/TabBarView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TabBarView/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/TextButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextButton/node2_style.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart diff --git a/packages/widgets/lib/StatefulWidget/TextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextField/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/TextField/node2_cursor.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextField/node2_cursor.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart diff --git a/packages/widgets/lib/StatefulWidget/TextField/node3_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextField/node3_decoration.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart diff --git a/packages/widgets/lib/StatefulWidget/TextFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TextFormField/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Tooltip/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Tooltip/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart rename to modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart diff --git a/packages/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart diff --git a/packages/widgets/lib/StatefulWidget/YearPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatefulWidget/YearPicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ActionChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ActionChip/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart diff --git a/packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/BackButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_1.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Badge/node_1.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_2.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Badge/node_2.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart diff --git a/packages/widgets/lib/StatelessWidget/Badge/node_3.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Badge/node_3.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart diff --git a/packages/widgets/lib/StatelessWidget/Banner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Banner/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Builder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Builder/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart diff --git a/packages/widgets/lib/StatelessWidget/Card/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Card/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Card/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Card/node2_shape.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart diff --git a/packages/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart diff --git a/packages/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Chip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Chip/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Chip/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Chip/node2_color.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart diff --git a/packages/widgets/lib/StatelessWidget/Chip/node3_delete.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Chip/node3_delete.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart diff --git a/packages/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CloseButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/desc_zh-CN.json rename to modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json diff --git a/packages/widgets/lib/StatelessWidget/Container/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/node2_child.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node2_child.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/node3_alignment.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node3_alignment.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/node4_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node4_decoration.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/node5_transform.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node5_transform.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart diff --git a/packages/widgets/lib/StatelessWidget/Container/node6_constraints.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Container/node6_constraints.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/no_node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart rename to modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart diff --git a/packages/widgets/lib/StatelessWidget/DataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DataTable/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/DataTable/node2_operation.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DataTable/node2_operation.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart diff --git a/packages/widgets/lib/StatelessWidget/DayPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DayPicker/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Dialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Dialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Divider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Divider/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Divider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Divider/node2_height.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart diff --git a/packages/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Drawer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Drawer/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FilterChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FilterChip/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FlatButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FlatButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart diff --git a/packages/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart diff --git a/packages/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart rename to modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart diff --git a/packages/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GirdView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GirdView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GirdView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GirdView/node2_direction.dart diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node3_extend.dart b/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node3_extend.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GirdView/node3_extend.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GirdView/node3_extend.dart diff --git a/packages/widgets/lib/StatelessWidget/GirdView/node4_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node4_builder.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GirdView/node4_builder.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GirdView/node4_builder.dart diff --git a/packages/widgets/lib/StatelessWidget/GridPaper/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GridPaper/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart diff --git a/packages/widgets/lib/StatelessWidget/GridTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GridTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Icon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Icon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Icon/node2_diy.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart diff --git a/packages/widgets/lib/StatelessWidget/IconButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/IconButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/InputChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/InputChip/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/InputChip/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/InputChip/node2_select.dart rename to modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListTile/node2_select.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart diff --git a/packages/widgets/lib/StatelessWidget/ListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListTile/node3_dense.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart diff --git a/packages/widgets/lib/StatelessWidget/ListView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart diff --git a/packages/widgets/lib/StatelessWidget/ListView/node3_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListView/node3_builder.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart diff --git a/packages/widgets/lib/StatelessWidget/ListView/node4_separated.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ListView/node4_separated.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart diff --git a/packages/widgets/lib/StatelessWidget/Listener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Listener/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart diff --git a/packages/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart diff --git a/packages/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart rename to modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart diff --git a/packages/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart rename to modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart diff --git a/packages/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/PageStorage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/PageStorage/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Placeholder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Placeholder/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart diff --git a/packages/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart rename to modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart diff --git a/packages/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart diff --git a/packages/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart rename to modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart diff --git a/packages/widgets/lib/StatelessWidget/SafeArea/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SafeArea/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart diff --git a/packages/widgets/lib/StatelessWidget/SnackBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SnackBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Spacer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Spacer/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Spacer/node2_flex.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Spacer/node2_flex.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart diff --git a/packages/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart rename to modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart diff --git a/packages/widgets/lib/StatelessWidget/Tab/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Tab/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/TabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/TabBar/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart rename to modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart diff --git a/packages/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node2_shadows.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node2_shadows.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node3_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node3_decoration.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node4_textAlign.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node4_textAlign.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node5_textDirection.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node5_textDirection.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart diff --git a/packages/widgets/lib/StatelessWidget/Text/node6_softWrap.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Text/node6_softWrap.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart diff --git a/packages/widgets/lib/StatelessWidget/Theme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Theme/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Theme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Theme/node2_use.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart diff --git a/packages/widgets/lib/StatelessWidget/Title/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Title/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart diff --git a/packages/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart rename to modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart diff --git a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart rename to modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart diff --git a/packages/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart rename to modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart diff --git a/packages/widgets/lib/StatelessWidget/Visibility/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Visibility/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart diff --git a/packages/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart similarity index 100% rename from packages/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart diff --git a/packages/widgets/lib/exp/other_unit.dart b/modules/widget_system/widgets/lib/exp/other_unit.dart similarity index 100% rename from packages/widgets/lib/exp/other_unit.dart rename to modules/widget_system/widgets/lib/exp/other_unit.dart diff --git a/packages/widgets/lib/exp/proxy_unit.dart b/modules/widget_system/widgets/lib/exp/proxy_unit.dart similarity index 100% rename from packages/widgets/lib/exp/proxy_unit.dart rename to modules/widget_system/widgets/lib/exp/proxy_unit.dart diff --git a/packages/widgets/lib/exp/render_object_unit.dart b/modules/widget_system/widgets/lib/exp/render_object_unit.dart similarity index 100% rename from packages/widgets/lib/exp/render_object_unit.dart rename to modules/widget_system/widgets/lib/exp/render_object_unit.dart diff --git a/packages/widgets/lib/exp/sliver_unit.dart b/modules/widget_system/widgets/lib/exp/sliver_unit.dart similarity index 100% rename from packages/widgets/lib/exp/sliver_unit.dart rename to modules/widget_system/widgets/lib/exp/sliver_unit.dart diff --git a/packages/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart similarity index 100% rename from packages/widgets/lib/exp/stateful_unit.dart rename to modules/widget_system/widgets/lib/exp/stateful_unit.dart diff --git a/packages/widgets/lib/exp/stateless_unit.dart b/modules/widget_system/widgets/lib/exp/stateless_unit.dart similarity index 100% rename from packages/widgets/lib/exp/stateless_unit.dart rename to modules/widget_system/widgets/lib/exp/stateless_unit.dart diff --git a/packages/widgets/lib/utils/color_utils.dart b/modules/widget_system/widgets/lib/utils/color_utils.dart similarity index 100% rename from packages/widgets/lib/utils/color_utils.dart rename to modules/widget_system/widgets/lib/utils/color_utils.dart diff --git a/packages/widgets/lib/utils/dialog_about.dart b/modules/widget_system/widgets/lib/utils/dialog_about.dart similarity index 100% rename from packages/widgets/lib/utils/dialog_about.dart rename to modules/widget_system/widgets/lib/utils/dialog_about.dart diff --git a/packages/widgets/lib/utils/pather.dart b/modules/widget_system/widgets/lib/utils/pather.dart similarity index 100% rename from packages/widgets/lib/utils/pather.dart rename to modules/widget_system/widgets/lib/utils/pather.dart diff --git a/packages/widgets/lib/widgets.dart b/modules/widget_system/widgets/lib/widgets.dart similarity index 100% rename from packages/widgets/lib/widgets.dart rename to modules/widget_system/widgets/lib/widgets.dart diff --git a/packages/widgets/lib/widgets_map.dart b/modules/widget_system/widgets/lib/widgets_map.dart similarity index 100% rename from packages/widgets/lib/widgets_map.dart rename to modules/widget_system/widgets/lib/widgets_map.dart diff --git a/packages/widgets/pubspec.yaml b/modules/widget_system/widgets/pubspec.yaml similarity index 95% rename from packages/widgets/pubspec.yaml rename to modules/widget_system/widgets/pubspec.yaml index 4a092edc..c900e345 100644 --- a/packages/widgets/pubspec.yaml +++ b/modules/widget_system/widgets/pubspec.yaml @@ -13,9 +13,9 @@ dependencies: path_provider: ^2.1.3 # 路径 intl: ^0.19.0 app: - path: ../app + path: ../../basic_system/app components: - path: ../components + path: ../../basic_system/components dev_dependencies: flutter_test: diff --git a/packages/widgets/test/widgets_test.dart b/modules/widget_system/widgets/test/widgets_test.dart similarity index 100% rename from packages/widgets/test/widgets_test.dart rename to modules/widget_system/widgets/test/widgets_test.dart diff --git a/pubspec.lock b/pubspec.lock index 9cae2d51..61b5ab80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -4,21 +4,21 @@ packages: algorithm: dependency: "direct main" description: - path: "packages/algorithm" + path: "modules/knowledge_system/algorithm" relative: true source: path version: "0.0.1" app: dependency: "direct main" description: - path: "packages/app" + path: "modules/basic_system/app" relative: true source: path version: "0.0.1" app_update: dependency: "direct main" description: - path: "packages/app_update" + path: "modules/basic_system/app_update" relative: true source: path version: "0.0.1" @@ -41,7 +41,7 @@ packages: artifact: dependency: "direct main" description: - path: "packages/artifact" + path: "modules/knowledge_system/artifact" relative: true source: path version: "0.0.1" @@ -56,7 +56,7 @@ packages: authentication: dependency: "direct main" description: - path: "packages/authentication" + path: "modules/basic_system/authentication" relative: true source: path version: "0.0.1" @@ -103,12 +103,12 @@ packages: components: dependency: "direct main" description: - path: "packages/components" + path: "modules/basic_system/components" relative: true source: path version: "0.0.1" connectivity_plus: - dependency: "direct main" + dependency: transitive description: name: connectivity_plus sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 @@ -148,7 +148,7 @@ packages: source: hosted version: "1.0.5" dash_painter: - dependency: "direct main" + dependency: transitive description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a @@ -172,7 +172,7 @@ packages: source: hosted version: "1.0.0+11" dio: - dependency: "direct main" + dependency: transitive description: name: dio sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" @@ -182,12 +182,12 @@ packages: draw_system: dependency: "direct main" description: - path: "packages/draw_system" + path: "modules/painting_system/draw_system" relative: true source: path version: "0.0.1" equatable: - dependency: "direct main" + dependency: transitive description: name: equatable sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 @@ -219,7 +219,7 @@ packages: source: hosted version: "6.1.4" file_picker: - dependency: "direct main" + dependency: transitive description: name: file_picker sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3" @@ -232,7 +232,7 @@ packages: source: sdk version: "0.0.0" flutter_bloc: - dependency: "direct main" + dependency: transitive description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a @@ -243,17 +243,17 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.4" + version: "2.0.3" flutter_localizations: dependency: "direct main" description: flutter source: sdk version: "0.0.0" flutter_markdown: - dependency: "direct main" + dependency: transitive description: name: flutter_markdown sha256: "85cc6f7daeae537844c92e2d56e2aff61b00095f8f77913b529ea4be12fc45ea" @@ -269,7 +269,7 @@ packages: source: hosted version: "2.0.20" flutter_spinkit: - dependency: "direct main" + dependency: transitive description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 @@ -277,21 +277,13 @@ packages: source: hosted version: "5.2.1" flutter_star: - dependency: "direct main" + dependency: transitive description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.0.10+1" flutter_test: dependency: "direct dev" description: flutter @@ -327,7 +319,7 @@ packages: source: hosted version: "0.0.2" fx_platform_adapter: - dependency: "direct main" + dependency: transitive description: name: fx_platform_adapter sha256: "04b954f658e1c380abf11dee93265396147f953f5b02cbf9621c7fddab21f9c3" @@ -359,7 +351,7 @@ packages: source: hosted version: "4.0.2" image: - dependency: "direct main" + dependency: transitive description: name: image sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" @@ -367,7 +359,7 @@ packages: source: hosted version: "4.2.0" intl: - dependency: "direct main" + dependency: transitive description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf @@ -375,7 +367,7 @@ packages: source: hosted version: "0.19.0" jwt_decoder: - dependency: "direct main" + dependency: transitive description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" @@ -385,14 +377,14 @@ packages: l10n: dependency: "direct main" description: - path: "packages/l10n" + path: "modules/basic_system/l10n" relative: true source: path version: "0.0.1" layout: dependency: "direct main" description: - path: "packages/layout" + path: "modules/knowledge_system/layout" relative: true source: path version: "0.0.1" @@ -424,10 +416,10 @@ packages: dependency: transitive description: name: lints - sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.1" + version: "2.1.1" logging: dependency: transitive description: @@ -493,7 +485,7 @@ packages: source: hosted version: "0.5.0" package_info_plus: - dependency: "direct main" + dependency: transitive description: name: package_info_plus sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 @@ -516,16 +508,8 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.9.0" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.0.1" path_provider: - dependency: "direct main" + dependency: transitive description: name: path_provider sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 @@ -581,7 +565,7 @@ packages: source: hosted version: "5.4.0" platform: - dependency: "direct main" + dependency: transitive description: name: platform sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" @@ -616,10 +600,10 @@ packages: dependency: transitive description: name: process_run - sha256: c917dfb5f7afad4c7485bc00a4df038621248fce046105020cea276d1a87c820 + sha256: "112a77da35be50617ed9e2230df68d0817972f225e7f97ce8336f76b4e601606" url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.0" + version: "1.2.0" provider: dependency: transitive description: @@ -637,7 +621,7 @@ packages: source: hosted version: "2.1.4" r_upgrade: - dependency: "direct main" + dependency: transitive description: name: r_upgrade sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" @@ -645,7 +629,7 @@ packages: source: hosted version: "0.4.2" refresh: - dependency: "direct main" + dependency: transitive description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc @@ -661,7 +645,7 @@ packages: source: hosted version: "0.1.9" share_plus: - dependency: "direct main" + dependency: transitive description: name: share_plus sha256: "38658034f9f3c29f3b37ab0068db15caea9df2dd70d83e99300991a0d756c2a6" @@ -677,7 +661,7 @@ packages: source: hosted version: "5.0.0" shared_preferences: - dependency: "direct main" + dependency: transitive description: name: shared_preferences sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 @@ -746,7 +730,7 @@ packages: source: hosted version: "1.10.0" sqflite: - dependency: "direct main" + dependency: transitive description: name: sqflite sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d @@ -762,7 +746,7 @@ packages: source: hosted version: "2.5.4" sqflite_common_ffi: - dependency: "direct main" + dependency: transitive description: name: sqflite_common_ffi sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" @@ -773,10 +757,10 @@ packages: dependency: transitive description: name: sqflite_common_ffi_web - sha256: e9d1cb35a5ff7c43072968ed734e0a1a859564fd2b2c8654e0c6244a57dc82a8 + sha256: "5178ccee7a65f4737ff29d5a0fced0122805e4127589faee01c36a1b42c27383" url: "https://pub.flutter-io.cn/" source: hosted - version: "0.4.4" + version: "0.4.5+1" sqlite3: dependency: transitive description: @@ -796,7 +780,7 @@ packages: storage: dependency: "direct main" description: - path: "packages/storage" + path: "modules/basic_system/storage" relative: true source: path version: "0.0.1" @@ -808,14 +792,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" - stream_transform: - dependency: "direct main" - description: - name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "2.1.0" string_scanner: dependency: transitive description: @@ -849,7 +825,7 @@ packages: source: hosted version: "0.7.2" toggle_rotate: - dependency: "direct main" + dependency: transitive description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" @@ -859,12 +835,12 @@ packages: toly_ui: dependency: "direct main" description: - path: "packages/toly_ui" + path: "modules/basic_system/toly_ui" relative: true source: path version: "0.0.1" tolyui: - dependency: "direct main" + dependency: transitive description: name: tolyui sha256: f88af1cabd06d0eb2df989abac9bfc37f1ad76d273cc9f8d9109cc163205fe48 @@ -906,18 +882,10 @@ packages: treasure_tools: dependency: "direct main" description: - path: "packages/treasure_tools" + path: "modules/tools_system/treasure_tools" relative: true source: path version: "0.0.1" - two_dimensional_scrollables: - dependency: "direct main" - description: - name: two_dimensional_scrollables - sha256: "7c3650cc1cc5fa8a9b003e2fd350b049fba1aaa3ed419ad6312ff124bb7a6d38" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "0.3.1" typed_data: dependency: transitive description: @@ -927,7 +895,7 @@ packages: source: hosted version: "1.3.1" url_launcher: - dependency: "direct main" + dependency: transitive description: name: url_launcher sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" @@ -993,7 +961,7 @@ packages: utils: dependency: "direct main" description: - path: "packages/utils" + path: "modules/basic_system/utils" relative: true source: path version: "0.0.1" @@ -1005,30 +973,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.7" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.1.11+1" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.1.11+1" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "1.1.11+1" vector_math: dependency: transitive description: @@ -1054,7 +998,7 @@ packages: source: hosted version: "1.0.0" webview_flutter: - dependency: "direct main" + dependency: transitive description: name: webview_flutter sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" @@ -1088,14 +1032,14 @@ packages: widget_module: dependency: "direct main" description: - path: "packages/widget_module" + path: "modules/widget_system/widget_module" relative: true source: path version: "0.0.1" widgets: dependency: "direct main" description: - path: "packages/widgets" + path: "modules/widget_system/widgets" relative: true source: path version: "0.0.1" @@ -1116,7 +1060,7 @@ packages: source: hosted version: "0.4.2" wrapper: - dependency: "direct main" + dependency: transitive description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" @@ -1148,5 +1092,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.4.3 <4.0.0" + dart: ">=3.5.0 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4cd9fb5e..fe21c0a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,85 +16,45 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.4 - - flutter_bloc: ^8.1.6 # 状态管理 - equatable: ^2.0.5 # 相等辅助 - stream_transform: ^2.1.0 - two_dimensional_scrollables: ^0.3.1 - ## fx 架构 fx_boot_starter: 0.0.1 # app 启动器 - fx_platform_adapter: 0.0.2 - - ## tolyui - tolyui: ^0.0.2+15 - - - package_info_plus: ^8.0.0 # 应用包信息 - r_upgrade: ^0.4.2 # 应用升级 - webview_flutter: ^4.8.0 go_router: ^14.2.0 - sqflite: ^2.3.3+1 # 数据库 - sqflite_common_ffi: ^2.3.3 # 数据库 - shared_preferences: ^2.2.3 # xml 固化 - path_provider: ^2.1.3 # 路径 - - - dio: ^5.4.3+1 # 网络请求 - jwt_decoder: ^2.0.1 # jwt 解析 - connectivity_plus: ^6.0.3 - - refresh: ^1.0.1 - toggle_rotate: ^1.0.1 - flutter_star: ^1.0.2 # 星星组件 - dash_painter: ^1.0.2 - wrapper: ^1.0.2 - - url_launcher: ^6.3.0 # url - share_plus: ^10.0.1 # 文字分享 - - flutter_svg: ^2.0.10+1 - intl: ^0.19.0 - platform: ^3.1.0 - image: ^4.2.0 - flutter_spinkit: ^5.2.1 # loading - flutter_markdown: ^0.7.2+1 # markdown - file_picker: ^8.0.7 + l10n: - path: packages/l10n + path: modules/basic_system/l10n + app: + path: modules/basic_system/app utils: - path: packages/utils + path: modules/basic_system/utils + authentication: + path: modules/basic_system/authentication + components: + path: modules/basic_system/components + toly_ui: + path: modules/basic_system/toly_ui storage: - path: packages/storage + path: modules/basic_system/storage + app_update: + path: modules/basic_system/app_update widgets: - path: packages/widgets + path: modules/widget_system/widgets draw_system: - path: packages/draw_system + path: modules/painting_system/draw_system artifact: - path: packages/artifact + path: modules/knowledge_system/artifact algorithm: - path: packages/algorithm - authentication: - path: packages/authentication - app: - path: packages/app - app_update: - path: packages/app_update - components: - path: packages/components - toly_ui: - path: packages/toly_ui + path: modules/knowledge_system/algorithm widget_module: - path: packages/widget_module + path: modules/widget_system/widget_module treasure_tools: - path: packages/treasure_tools + path: modules/tools_system/treasure_tools layout: - path: packages/layout + path: modules/knowledge_system/layout dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.0 dependency_overrides: web: ^1.0.0 From ab5356846d6c960854721fde59c1d6ef4f5bda17 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 9 Sep 2024 06:02:17 +0800 Subject: [PATCH 082/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 2 +- lib/{structure => src}/flutter_unit.dart | 2 +- lib/src/navigation/router/app_route.dart | 24 ++++ .../navigation/router/desk_route.dart | 60 +++------ lib/src/navigation/router/mobile_route.dart | 83 +++++++++++++ .../desktop/flutter_unit_desk_navigation.dart | 0 .../views/desktop/menu_bar_leading.dart | 0 .../views/desktop/menu_bar_tail.dart | 0 .../desktop/theme_model_switch_icon.dart | 0 .../views/desktop/toly_unit_menu_cell.dart | 0 .../views/mobile}/pure_bottom_bar.dart | 0 .../views/mobile}/unit_navigation.dart | 2 +- lib/{ => src}/stater/boot_start.dart | 4 +- .../stater/logic/app_start_action.dart | 0 .../stater/logic/app_start_repository.dart | 0 .../stater/view/error/app_start_error.dart | 0 .../view/splash/Flutter_unit_splash.dart | 16 +-- .../stater/view/splash/flutter_unit_text.dart | 0 .../wrapper/bloc_wrapper.dart | 0 .../wrapper/overlay_tool_wrapper.dart | 0 .../navigation/router/app_route.dart | 34 ------ .../navigation/router/mobile_route.dart | 114 ------------------ pubspec.lock | 10 +- pubspec.yaml | 9 ++ 24 files changed, 150 insertions(+), 210 deletions(-) rename lib/{structure => src}/flutter_unit.dart (98%) create mode 100644 lib/src/navigation/router/app_route.dart rename lib/{structure => src}/navigation/router/desk_route.dart (56%) create mode 100644 lib/src/navigation/router/mobile_route.dart rename lib/{structure => src}/navigation/views/desktop/flutter_unit_desk_navigation.dart (100%) rename lib/{structure => src}/navigation/views/desktop/menu_bar_leading.dart (100%) rename lib/{structure => src}/navigation/views/desktop/menu_bar_tail.dart (100%) rename lib/{structure => src}/navigation/views/desktop/theme_model_switch_icon.dart (100%) rename lib/{structure => src}/navigation/views/desktop/toly_unit_menu_cell.dart (100%) rename lib/{structure/navigation/views => src/navigation/views/mobile}/pure_bottom_bar.dart (100%) rename lib/{structure/navigation/views => src/navigation/views/mobile}/unit_navigation.dart (98%) rename lib/{ => src}/stater/boot_start.dart (85%) rename lib/{ => src}/stater/logic/app_start_action.dart (100%) rename lib/{ => src}/stater/logic/app_start_repository.dart (100%) rename lib/{ => src}/stater/view/error/app_start_error.dart (100%) rename lib/{ => src}/stater/view/splash/Flutter_unit_splash.dart (91%) rename lib/{ => src}/stater/view/splash/flutter_unit_text.dart (100%) rename lib/{structure => src}/wrapper/bloc_wrapper.dart (100%) rename lib/{structure => src}/wrapper/overlay_tool_wrapper.dart (100%) delete mode 100644 lib/structure/navigation/router/app_route.dart delete mode 100644 lib/structure/navigation/router/mobile_route.dart diff --git a/lib/main.dart b/lib/main.dart index 1e7e5501..509a2d61 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'stater/boot_start.dart'; +import 'src/stater/boot_start.dart'; void main(List args) { runZonedGuarded(() => bootStart(args), _globalErrorHandler); diff --git a/lib/structure/flutter_unit.dart b/lib/src/flutter_unit.dart similarity index 98% rename from lib/structure/flutter_unit.dart rename to lib/src/flutter_unit.dart index 681be0ce..9b7add5f 100644 --- a/lib/structure/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -11,7 +11,7 @@ import 'navigation/router/app_route.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com -/// 说明: 主程序 +/// 说明: 应用主程序 class FlutterUnit3 extends StatelessWidget { FlutterUnit3({Key? key}) : super(key: key); diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart new file mode 100644 index 00000000..0ea59955 --- /dev/null +++ b/lib/src/navigation/router/app_route.dart @@ -0,0 +1,24 @@ +import 'package:app/app.dart'; +import 'package:go_router/go_router.dart'; + +import '../../stater/boot_start.dart'; +import 'desk_route.dart'; +import 'mobile_route.dart'; + +final RouteBase deskAppRoute = GoRoute( + path: '/', + redirect: (_, __) => null, + routes: [ + GoRoute( + path: 'splash', + builder: (_, __) => const FlutterUnitSplash(), + ), + GoRoute( + path: 'start_error', + builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), + ), + // isDesk ? : + if (isDesk) appNavRoute, + if (!isDesk) ...appMobileNavRoute + ], +); diff --git a/lib/structure/navigation/router/desk_route.dart b/lib/src/navigation/router/desk_route.dart similarity index 56% rename from lib/structure/navigation/router/desk_route.dart rename to lib/src/navigation/router/desk_route.dart index 4fd79248..c9f8d175 100644 --- a/lib/structure/navigation/router/desk_route.dart +++ b/lib/src/navigation/router/desk_route.dart @@ -15,9 +15,7 @@ final RouteBase appNavRoute = ShellRoute( routes: [ GoRoute( path: 'widget', - builder: (BuildContext context, GoRouterState state) { - return DeskWidgetPanel(); - }, + builder: (_, __) => const DeskWidgetPanel(), routes: [ GoRoute( path: 'detail/:name', @@ -36,27 +34,19 @@ final RouteBase appNavRoute = ShellRoute( ]), GoRoute( path: 'painter', - builder: (BuildContext context, GoRouterState state) { - return GalleryUnit(); - }, - ), GoRoute( + builder: (_,__) => const GalleryUnit(), + ), + GoRoute( path: 'about_app', - builder: (BuildContext context, GoRouterState state) { - return AboutAppPage(); - }, + builder: (_,__) => const AboutAppPage(), ), GoRoute( path: 'knowledge', - builder: (BuildContext context, GoRouterState state) { - // return DeskPointPage(); - return DeskKnowledgePage(); - }, + builder: (_,__) => const DeskKnowledgePage(), ), GoRoute( path: 'collection', - builder: (BuildContext context, GoRouterState state) { - return CollectPageAdapter(); - }, + builder: (_,__) => const CollectPageAdapter(), routes: [ GoRoute( path: 'widgets/:id', @@ -66,59 +56,41 @@ final RouteBase appNavRoute = ShellRoute( if (extra is CategoryModel) { model = extra; } - return CategoryShow( - model: model!, - ); + return CategoryShow(model: model!); }, ), ]), GoRoute( path: 'account', - builder: (BuildContext context, GoRouterState state) { - return DeskAccountPage(); - }, + builder: (_,__) => const DeskAccountPage(), ), GoRoute( path: 'tools', - builder: (BuildContext context, GoRouterState state) { - return CodeGenPage(); - }, + builder: (_,__) => const CodeGenPage(), ), GoRoute( path: 'settings', - builder: (BuildContext context, GoRouterState state) { - return const SettingPage(); - }, + builder: (_,__) => const SettingPage(), routes: [ GoRoute( path: 'dark_mode', - builder: (BuildContext context, GoRouterState state) { - return const ThemeModelSetting(); - }, + builder: (_,__) => const ThemeModelSetting(), ), GoRoute( path: 'code_style', - builder: (BuildContext context, GoRouterState state) { - return const CodeStyleSettingPage(); - }, + builder: (_,__) => const CodeStyleSettingPage(), ), GoRoute( path: 'theme_color', - builder: (BuildContext context, GoRouterState state) { - return const ThemeColorSettingPage(); - }, + builder: (_,__) => const ThemeColorSettingPage(), ), GoRoute( path: 'font_setting', - builder: (BuildContext context, GoRouterState state) { - return const FontSettingPage(); - }, + builder: (_,__) => const FontSettingPage(), ), GoRoute( path: 'version', - builder: (BuildContext context, GoRouterState state) { - return const VersionInfo(); - }, + builder: (_,__) => const VersionInfo(), ), ]) ], diff --git a/lib/src/navigation/router/mobile_route.dart b/lib/src/navigation/router/mobile_route.dart new file mode 100644 index 00000000..c8fa450c --- /dev/null +++ b/lib/src/navigation/router/mobile_route.dart @@ -0,0 +1,83 @@ +import 'package:app/app.dart'; +import 'package:authentication/authentication.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../views/mobile/unit_navigation.dart'; + +final List appMobileNavRoute = [ + GoRoute( + path: 'widget', + builder: (_, __) => const UnitPhoneNavigation(), + routes: [ + GoRoute( + path: 'detail/:name', + builder: (BuildContext context, GoRouterState state) { + Object? extra = state.extra; + WidgetModel? model; + if (extra is WidgetModel) { + model = extra; + } + return WidgetDetailPageScope(model: model!); + }, + ), + ], + ), + GoRoute( + path: 'collection_widgets/:id', + builder: (BuildContext context, GoRouterState state) { + Object? extra = state.extra; + CategoryModel? model; + if (extra is CategoryModel) { + model = extra; + } + return CategoryShow(model: model!); + }, + ), + GoRoute( + path: 'settings', + builder: (_, __) => const SettingPage(), + routes: [ + GoRoute( + path: 'dark_mode', + builder: (_, __) => const ThemeModelSetting(), + ), + GoRoute( + path: 'code_style', + builder: (_, __) => const CodeStyleSettingPage(), + ), + GoRoute( + path: 'theme_color', + builder: (_, __) => const ThemeColorSettingPage(), + ), + GoRoute( + path: 'font_setting', + builder: (_, __) => const FontSettingPage(), + ), + GoRoute( + path: 'version', + builder: (_, __) => const VersionInfo(), + ), + ]), + GoRoute( + path: 'data_manage', + builder: (_, __) => const DataManagePage(), + ), + GoRoute( + path: 'collect', + builder: (_, __) => const CollectPageAdapter(canPop: true), + ), + GoRoute( + path: 'about_app', + builder: (_, __) => const AboutAppPage(), + ), + GoRoute( + path: 'about_me', + builder: (_, __) => const AboutMePage(), + ), + GoRoute( + path: 'support_me', + builder: (_, __) => const SupportMe(), + ), +]; diff --git a/lib/structure/navigation/views/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/views/desktop/flutter_unit_desk_navigation.dart similarity index 100% rename from lib/structure/navigation/views/desktop/flutter_unit_desk_navigation.dart rename to lib/src/navigation/views/desktop/flutter_unit_desk_navigation.dart diff --git a/lib/structure/navigation/views/desktop/menu_bar_leading.dart b/lib/src/navigation/views/desktop/menu_bar_leading.dart similarity index 100% rename from lib/structure/navigation/views/desktop/menu_bar_leading.dart rename to lib/src/navigation/views/desktop/menu_bar_leading.dart diff --git a/lib/structure/navigation/views/desktop/menu_bar_tail.dart b/lib/src/navigation/views/desktop/menu_bar_tail.dart similarity index 100% rename from lib/structure/navigation/views/desktop/menu_bar_tail.dart rename to lib/src/navigation/views/desktop/menu_bar_tail.dart diff --git a/lib/structure/navigation/views/desktop/theme_model_switch_icon.dart b/lib/src/navigation/views/desktop/theme_model_switch_icon.dart similarity index 100% rename from lib/structure/navigation/views/desktop/theme_model_switch_icon.dart rename to lib/src/navigation/views/desktop/theme_model_switch_icon.dart diff --git a/lib/structure/navigation/views/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/views/desktop/toly_unit_menu_cell.dart similarity index 100% rename from lib/structure/navigation/views/desktop/toly_unit_menu_cell.dart rename to lib/src/navigation/views/desktop/toly_unit_menu_cell.dart diff --git a/lib/structure/navigation/views/pure_bottom_bar.dart b/lib/src/navigation/views/mobile/pure_bottom_bar.dart similarity index 100% rename from lib/structure/navigation/views/pure_bottom_bar.dart rename to lib/src/navigation/views/mobile/pure_bottom_bar.dart diff --git a/lib/structure/navigation/views/unit_navigation.dart b/lib/src/navigation/views/mobile/unit_navigation.dart similarity index 98% rename from lib/structure/navigation/views/unit_navigation.dart rename to lib/src/navigation/views/mobile/unit_navigation.dart index c472f730..80fa43b6 100644 --- a/lib/structure/navigation/views/unit_navigation.dart +++ b/lib/src/navigation/views/mobile/unit_navigation.dart @@ -11,7 +11,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; -import '../../navigation/views/pure_bottom_bar.dart'; +import 'pure_bottom_bar.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com diff --git a/lib/stater/boot_start.dart b/lib/src/stater/boot_start.dart similarity index 85% rename from lib/stater/boot_start.dart rename to lib/src/stater/boot_start.dart index e26f9142..3b12e8b3 100644 --- a/lib/stater/boot_start.dart +++ b/lib/src/stater/boot_start.dart @@ -2,8 +2,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; -import '../structure/wrapper/bloc_wrapper.dart'; -import '../structure/flutter_unit.dart'; +import '../flutter_unit.dart'; +import '../wrapper/bloc_wrapper.dart'; import 'logic/app_start_action.dart'; import 'logic/app_start_repository.dart'; diff --git a/lib/stater/logic/app_start_action.dart b/lib/src/stater/logic/app_start_action.dart similarity index 100% rename from lib/stater/logic/app_start_action.dart rename to lib/src/stater/logic/app_start_action.dart diff --git a/lib/stater/logic/app_start_repository.dart b/lib/src/stater/logic/app_start_repository.dart similarity index 100% rename from lib/stater/logic/app_start_repository.dart rename to lib/src/stater/logic/app_start_repository.dart diff --git a/lib/stater/view/error/app_start_error.dart b/lib/src/stater/view/error/app_start_error.dart similarity index 100% rename from lib/stater/view/error/app_start_error.dart rename to lib/src/stater/view/error/app_start_error.dart diff --git a/lib/stater/view/splash/Flutter_unit_splash.dart b/lib/src/stater/view/splash/Flutter_unit_splash.dart similarity index 91% rename from lib/stater/view/splash/Flutter_unit_splash.dart rename to lib/src/stater/view/splash/Flutter_unit_splash.dart index 2c76c20a..ef4d2a21 100644 --- a/lib/stater/view/splash/Flutter_unit_splash.dart +++ b/lib/src/stater/view/splash/Flutter_unit_splash.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'dart:ui' as ui; @@ -16,14 +17,13 @@ class FlutterUnitSplash extends StatelessWidget { @override Widget build(BuildContext context) { - return const AnnotatedRegion( - value: SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarIconBrightness: Brightness.dark, - ), - child: Material( - color: Colors.white, - child: _SplashBody(), + return const AppStartListener( + child: AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: Brightness.dark, + ), + child: Material(color: Colors.white, child: _SplashBody()), ), ); } diff --git a/lib/stater/view/splash/flutter_unit_text.dart b/lib/src/stater/view/splash/flutter_unit_text.dart similarity index 100% rename from lib/stater/view/splash/flutter_unit_text.dart rename to lib/src/stater/view/splash/flutter_unit_text.dart diff --git a/lib/structure/wrapper/bloc_wrapper.dart b/lib/src/wrapper/bloc_wrapper.dart similarity index 100% rename from lib/structure/wrapper/bloc_wrapper.dart rename to lib/src/wrapper/bloc_wrapper.dart diff --git a/lib/structure/wrapper/overlay_tool_wrapper.dart b/lib/src/wrapper/overlay_tool_wrapper.dart similarity index 100% rename from lib/structure/wrapper/overlay_tool_wrapper.dart rename to lib/src/wrapper/overlay_tool_wrapper.dart diff --git a/lib/structure/navigation/router/app_route.dart b/lib/structure/navigation/router/app_route.dart deleted file mode 100644 index fd6c50fa..00000000 --- a/lib/structure/navigation/router/app_route.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:app/app.dart'; -import 'package:flutter_unit/stater/boot_start.dart'; -import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -import 'desk_route.dart'; -import 'mobile_route.dart'; - -final RouteBase deskAppRoute = GoRoute( - path: '/', - redirect: (_, __) => null, - routes: [ - GoRoute( - path: 'splash', - builder: (BuildContext context, GoRouterState state) { - return const AppStartListener( - child: FlutterUnitSplash(), - ); - }, - ), - GoRoute( - path: 'start_error', - builder: (BuildContext context, GoRouterState state) { - return AppStartErrorPage( - error: state.extra, - ); - }, - ), - // isDesk ? : - if (isDesk) appNavRoute, - if (!isDesk) ...appMobileNavRoute - ], -); diff --git a/lib/structure/navigation/router/mobile_route.dart b/lib/structure/navigation/router/mobile_route.dart deleted file mode 100644 index 7ea157f0..00000000 --- a/lib/structure/navigation/router/mobile_route.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:app/app.dart'; -import 'package:app/view/data_manage/data_manage_page.dart'; -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:widget_module/widget_module.dart'; - -import '../views/unit_navigation.dart'; - -final List appMobileNavRoute = [ - GoRoute( - path: 'widget', - builder: (BuildContext context, GoRouterState state) { - return const UnitPhoneNavigation(); - }, - routes: [ - GoRoute( - path: 'detail/:name', - builder: (BuildContext context, GoRouterState state) { - Object? extra = state.extra; - WidgetModel? model; - if (extra is WidgetModel) { - model = extra; - } - return WidgetDetailPageScope( - model: model!, - ); - }, - ), - ]), - GoRoute( - path: 'collection_widgets/:id', - builder: (BuildContext context, GoRouterState state) { - Object? extra= state.extra; - CategoryModel? model; - if(extra is CategoryModel){ - model = extra; - } - return CategoryShow( - model: model!, - ); - }, - ), - GoRoute( - path: 'settings', - builder: (BuildContext context, GoRouterState state) { - return const SettingPage(); - }, - routes: [ - GoRoute( - path: 'dark_mode', - builder: (BuildContext context, GoRouterState state) { - return const ThemeModelSetting(); - }, - ), - GoRoute( - path: 'code_style', - builder: (BuildContext context, GoRouterState state) { - return const CodeStyleSettingPage(); - }, - ), - GoRoute( - path: 'theme_color', - builder: (BuildContext context, GoRouterState state) { - return const ThemeColorSettingPage(); - }, - ), - GoRoute( - path: 'font_setting', - builder: (BuildContext context, GoRouterState state) { - return const FontSettingPage(); - }, - ), - GoRoute( - path: 'version', - builder: (BuildContext context, GoRouterState state) { - return const VersionInfo(); - }, - ), - ]), - GoRoute( - path: 'data_manage', - builder: (BuildContext context, GoRouterState state) { - return const DataManagePage(); - }, - ), - GoRoute( - path: 'collect', - builder: (BuildContext context, GoRouterState state) { - return const CollectPageAdapter( - canPop: true, - ); - }, - ), - - GoRoute( - path: 'about_app', - builder: (BuildContext context, GoRouterState state) { - return const AboutAppPage(); - }, - ), - GoRoute( - path: 'about_me', - builder: (BuildContext context, GoRouterState state) { - return const AboutMePage(); - }, - ), - GoRoute( - path: 'support_me', - builder: (BuildContext context, GoRouterState state) { - return const SupportMe(); - }, - ), -]; diff --git a/pubspec.lock b/pubspec.lock index 61b5ab80..9c88b21a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -108,7 +108,7 @@ packages: source: path version: "0.0.1" connectivity_plus: - dependency: transitive + dependency: "direct main" description: name: connectivity_plus sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 @@ -187,7 +187,7 @@ packages: source: path version: "0.0.1" equatable: - dependency: transitive + dependency: "direct main" description: name: equatable sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 @@ -232,7 +232,7 @@ packages: source: sdk version: "0.0.0" flutter_bloc: - dependency: transitive + dependency: "direct main" description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a @@ -661,7 +661,7 @@ packages: source: hosted version: "5.0.0" shared_preferences: - dependency: transitive + dependency: "direct main" description: name: shared_preferences sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 @@ -840,7 +840,7 @@ packages: source: path version: "0.0.1" tolyui: - dependency: transitive + dependency: "direct main" description: name: tolyui sha256: f88af1cabd06d0eb2df989abac9bfc37f1ad76d273cc9f8d9109cc163205fe48 diff --git a/pubspec.yaml b/pubspec.yaml index fe21c0a6..f57a00ce 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,15 @@ dependencies: fx_boot_starter: 0.0.1 # app 启动器 go_router: ^14.2.0 + flutter_bloc: ^8.1.6 # 状态管理 + equatable: ^2.0.5 # 相等辅助 + + shared_preferences: ^2.2.2 # xml 固化 + connectivity_plus: ^6.0.3 + + # tolyui + tolyui: ^0.0.2+15 + l10n: path: modules/basic_system/l10n app: From c038318ff3caeacba79cbd3dd15069db2bfe8e0c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 9 Sep 2024 06:33:50 +0800 Subject: [PATCH 083/149] sort page --- lib/src/flutter_unit.dart | 30 +++++++------ modules/basic_system/l10n/desiredFileName.txt | 1 + modules/basic_system/l10n/l10n.yaml | 7 ++++ modules/basic_system/l10n/lib/arb/app_en.arb | 1 + modules/basic_system/l10n/lib/arb/app_zh.arb | 1 + .../l10n/lib/gen_l10n/app_localizations.dart | 12 +++++- .../lib/gen_l10n/app_localizations_en.dart | 5 +++ .../lib/gen_l10n/app_localizations_zh.dart | 5 +++ modules/basic_system/l10n/pubspec.yaml | 2 - .../algorithm/lib/algorithm.dart | 10 ++--- .../view/finding_button.dart} | 4 +- .../src/finding/view/finding_tool_bar.dart | 3 +- .../lib/src/navigation/router/router.dart | 3 +- .../src/navigation/view/algo_menu_tree.dart | 11 ++++- .../src/{views => }/sort/data_painter.dart | 0 .../lib/src/{views => }/sort/sort_page.dart | 3 +- .../lib/src/{views => }/sort/sort_parper.dart | 2 +- .../src/{views => }/sort/sort_setting.dart | 0 .../{views => }/sort/top_bar/sort_bar.dart | 15 +++---- .../lib/src/sort/top_bar/sort_button.dart | 42 +++++++++++++++++++ .../lib/src/articles/view/artifact_page.dart | 2 +- .../src/articles/view/desk_artifact_page.dart | 6 +-- 22 files changed, 119 insertions(+), 46 deletions(-) create mode 100644 modules/basic_system/l10n/desiredFileName.txt rename modules/knowledge_system/algorithm/lib/src/{views/sort/top_bar/sort_button.dart => finding/view/finding_button.dart} (94%) rename modules/knowledge_system/algorithm/lib/src/{views => }/sort/data_painter.dart (100%) rename modules/knowledge_system/algorithm/lib/src/{views => }/sort/sort_page.dart (88%) rename modules/knowledge_system/algorithm/lib/src/{views => }/sort/sort_parper.dart (91%) rename modules/knowledge_system/algorithm/lib/src/{views => }/sort/sort_setting.dart (100%) rename modules/knowledge_system/algorithm/lib/src/{views => }/sort/top_bar/sort_bar.dart (86%) create mode 100644 modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 9b7add5f..fe9aa98c 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -27,25 +27,23 @@ class FlutterUnit3 extends StatelessWidget { @override Widget build(BuildContext context) { AppConfigState state = context.watch().state; - return AlgoScope( - child: DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: TolyMessage( + return DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: TolyMessage( + themeMode: state.themeMode, + darkTheme: AppTheme.darkTheme(state), + theme: AppTheme.lightTheme(state), + child: MaterialApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: l10nDelegates, + supportedLocales: l10nLocales, + locale: state.language.locale, themeMode: state.themeMode, darkTheme: AppTheme.darkTheme(state), theme: AppTheme.lightTheme(state), - child: MaterialApp.router( - routerConfig: _router, - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - localizationsDelegates: l10nDelegates, - supportedLocales: l10nLocales, - locale: state.language.locale, - themeMode: state.themeMode, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), - ), ), ), ); diff --git a/modules/basic_system/l10n/desiredFileName.txt b/modules/basic_system/l10n/desiredFileName.txt new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/modules/basic_system/l10n/desiredFileName.txt @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/modules/basic_system/l10n/l10n.yaml b/modules/basic_system/l10n/l10n.yaml index 3f2ff4f7..3419d52f 100644 --- a/modules/basic_system/l10n/l10n.yaml +++ b/modules/basic_system/l10n/l10n.yaml @@ -1,3 +1,10 @@ arb-dir: lib/arb template-arb-file: app_zh.arb output-localization-file: app_localizations.dart + + +synthetic-package: false +output-dir: lib/gen_l10n +output-class: AppLocalizations +nullable-getter: false +untranslated-messages-file: desiredFileName.txt \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_en.arb b/modules/basic_system/l10n/lib/arb/app_en.arb index c73c3fb2..4ed8fe51 100644 --- a/modules/basic_system/l10n/lib/arb/app_en.arb +++ b/modules/basic_system/l10n/lib/arb/app_en.arb @@ -192,5 +192,6 @@ "collection":"Collection", "my":"My", "picture":"pics", + "widgetInn":"Widget Collection", "slogan":"The unity of flutter, The unity of coder." } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_zh.arb b/modules/basic_system/l10n/lib/arb/app_zh.arb index d2d8ede0..7116962e 100644 --- a/modules/basic_system/l10n/lib/arb/app_zh.arb +++ b/modules/basic_system/l10n/lib/arb/app_zh.arb @@ -193,5 +193,6 @@ "collection":"收藏", "my":"我的", "picture":"幅", + "widgetInn":"组件酒肆", "slogan":"Flutter 的联合,编程者的联合" } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart index 54007e7c..36e9ea81 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart @@ -8,6 +8,8 @@ import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; import 'app_localizations_zh.dart'; +// ignore_for_file: type=lint + /// Callers can lookup localized strings with an instance of AppLocalizations /// returned by `AppLocalizations.of(context)`. /// @@ -64,8 +66,8 @@ abstract class AppLocalizations { final String localeName; - static AppLocalizations? of(BuildContext context) { - return Localizations.of(context, AppLocalizations); + static AppLocalizations of(BuildContext context) { + return Localizations.of(context, AppLocalizations)!; } static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); @@ -1173,6 +1175,12 @@ abstract class AppLocalizations { /// **'幅'** String get picture; + /// No description provided for @widgetInn. + /// + /// In zh, this message translates to: + /// **'组件酒肆'** + String get widgetInn; + /// No description provided for @slogan. /// /// In zh, this message translates to: diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart index e1861970..f43fece8 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart @@ -1,5 +1,7 @@ import 'app_localizations.dart'; +// ignore_for_file: type=lint + /// The translations for English (`en`). class AppLocalizationsEn extends AppLocalizations { AppLocalizationsEn([String locale = 'en']) : super(locale); @@ -544,6 +546,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get picture => 'pics'; + @override + String get widgetInn => 'Widget Collection'; + @override String get slogan => 'The unity of flutter, The unity of coder.'; } diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart index 14a6c466..f2f8a20b 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -1,5 +1,7 @@ import 'app_localizations.dart'; +// ignore_for_file: type=lint + /// The translations for Chinese (`zh`). class AppLocalizationsZh extends AppLocalizations { AppLocalizationsZh([String locale = 'zh']) : super(locale); @@ -544,6 +546,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get picture => '幅'; + @override + String get widgetInn => '组件酒肆'; + @override String get slogan => 'Flutter 的联合,编程者的联合'; } diff --git a/modules/basic_system/l10n/pubspec.yaml b/modules/basic_system/l10n/pubspec.yaml index 8ca05064..9b731b29 100644 --- a/modules/basic_system/l10n/pubspec.yaml +++ b/modules/basic_system/l10n/pubspec.yaml @@ -23,8 +23,6 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - generate: true # 自动生成 l10n - # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/modules/knowledge_system/algorithm/lib/algorithm.dart b/modules/knowledge_system/algorithm/lib/algorithm.dart index 51b89c98..8c8957d7 100644 --- a/modules/knowledge_system/algorithm/lib/algorithm.dart +++ b/modules/knowledge_system/algorithm/lib/algorithm.dart @@ -1,10 +1,10 @@ library algorithm; -export 'src/views/sort/sort_parper.dart'; -export 'src/views/sort/top_bar/sort_bar.dart'; -export 'src/views/sort/top_bar/sort_button.dart'; -export 'src/views/sort/sort_setting.dart'; -export 'src/views/sort/sort_page.dart'; +export 'src/sort/sort_parper.dart'; +export 'src/sort/top_bar/sort_bar.dart'; +export 'src/sort/top_bar/sort_button.dart'; +export 'src/sort/sort_setting.dart'; +export 'src/sort/sort_page.dart'; export 'src/data_scope/sort_config.dart'; export 'src/data_scope/state.dart'; diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart similarity index 94% rename from modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart rename to modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart index 66af7556..5b83760f 100644 --- a/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_button.dart +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:tolyui/tolyui.dart'; -import '../../../finding/data_scope/finding_state.dart'; +import '../data_scope/finding_state.dart'; class FindingButton extends StatelessWidget { const FindingButton({super.key}); @@ -39,4 +39,6 @@ class FindingButton extends StatelessWidget { child: Icon(icon, color: color, size: 20), ); } + } + diff --git a/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart index f0d30323..0ffbbeeb 100644 --- a/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart +++ b/modules/knowledge_system/algorithm/lib/src/finding/view/finding_tool_bar.dart @@ -1,5 +1,6 @@ import 'package:algorithm/algorithm.dart'; import 'package:algorithm/src/algorithm/sort/functions.dart'; +import 'package:algorithm/src/finding/view/finding_button.dart'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:toly_ui/toly_ui.dart'; @@ -100,7 +101,7 @@ class SortBar extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - const FindingButton(), + const SortButton(), const SizedBox( width: 10, ), diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart index 61deee81..54f05c1d 100644 --- a/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart @@ -11,6 +11,7 @@ import 'package:algorithm/src/finding/view/finding_page.dart'; import 'package:flutter/material.dart'; import 'package:fx_go_router_ext/fx_go_router_ext.dart'; +import '../../sort/sort_page.dart'; import '../view/algo_desk_navigation.dart'; RouteBase get algoRoutes => GoRoute( @@ -19,7 +20,7 @@ RouteBase get algoRoutes => GoRoute( routes: [ ShellRoute( builder: (BuildContext context, GoRouterState state, Widget child) { - return AppDeskNavigation(content: child); + return AlgoScope(child: AppDeskNavigation(content: child)); }, routes: [ GoRoute( diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart index 512b8169..2cbabc05 100644 --- a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart @@ -1,3 +1,4 @@ +import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; import 'package:fx_go_router_ext/fx_go_router_ext.dart'; import 'package:tolyui/tolyui.dart'; @@ -79,8 +80,14 @@ class _AppMenuTreeState extends State with RouterChangeListenerMixi @override void onChangeRoute(String path) { - FindingState state = FindingStateScope.read(context); - state.changeAlgo(p.basename(path)); + if(path.startsWith('/sort')){ + SortState state = SortStateScope.of(context); + state.config = state.config.copyWith(name: p.basename(path)); + }else{ + FindingState state = FindingStateScope.read(context); + state.changeAlgo(p.basename(path)); + } + _menuMeta = _menuMeta.selectPath(path, singleExpand: true); setState(() {}); } diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/data_painter.dart b/modules/knowledge_system/algorithm/lib/src/sort/data_painter.dart similarity index 100% rename from modules/knowledge_system/algorithm/lib/src/views/sort/data_painter.dart rename to modules/knowledge_system/algorithm/lib/src/sort/data_painter.dart diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/sort_page.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart similarity index 88% rename from modules/knowledge_system/algorithm/lib/src/views/sort/sort_page.dart rename to modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart index 151f6281..99a65dfb 100644 --- a/modules/knowledge_system/algorithm/lib/src/views/sort/sort_page.dart +++ b/modules/knowledge_system/algorithm/lib/src/sort/sort_page.dart @@ -1,6 +1,7 @@ -import 'package:algorithm/algorithm.dart'; import 'package:flutter/material.dart'; +import 'sort_parper.dart'; +import 'sort_setting.dart'; import 'top_bar/sort_bar.dart'; class DeskSortPage extends StatelessWidget{ diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/sort_parper.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart similarity index 91% rename from modules/knowledge_system/algorithm/lib/src/views/sort/sort_parper.dart rename to modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart index a48f8e7e..f1cd8cac 100644 --- a/modules/knowledge_system/algorithm/lib/src/views/sort/sort_parper.dart +++ b/modules/knowledge_system/algorithm/lib/src/sort/sort_parper.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import '../../data_scope/state.dart'; +import '../../algorithm.dart'; import 'data_painter.dart'; class SortPaper extends StatelessWidget{ diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/sort_setting.dart b/modules/knowledge_system/algorithm/lib/src/sort/sort_setting.dart similarity index 100% rename from modules/knowledge_system/algorithm/lib/src/views/sort/sort_setting.dart rename to modules/knowledge_system/algorithm/lib/src/sort/sort_setting.dart diff --git a/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_bar.dart b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart similarity index 86% rename from modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_bar.dart rename to modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart index eced896c..251b90f2 100644 --- a/modules/knowledge_system/algorithm/lib/src/views/sort/top_bar/sort_bar.dart +++ b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_bar.dart @@ -22,25 +22,20 @@ class DeskSortBar extends StatelessWidget { color: isDark ? const Color(0xff2C3036) : Colors.white, child: Row( children: [ - const FindingButton(), + const SortButton(), Spacer(), TolyLink( href: 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart', text: '查看排序源码', hoverColor: Colors.blue, - style: TextStyle(fontSize: 12,fontFamily: '宋体'), + style: TextStyle(fontSize: 12, fontFamily: '宋体'), onTap: jumpURL), const SizedBox(width: 10), TolyAction( tooltip: '设置', - onTap: () { - Scaffold.of(context).openEndDrawer(); - }, - child: const Icon( - Icons.settings, - size: 20, - )), + onTap: Scaffold.of(context).openEndDrawer, + child: const Icon(Icons.settings, size: 20)), ], ), ), @@ -55,7 +50,7 @@ class SortBar extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - const FindingButton(), + const SortButton(), const SizedBox( width: 10, ), diff --git a/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart new file mode 100644 index 00000000..b7103001 --- /dev/null +++ b/modules/knowledge_system/algorithm/lib/src/sort/top_bar/sort_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../../../algorithm.dart'; + +class SortButton extends StatelessWidget { + const SortButton({super.key}); + + @override + Widget build(BuildContext context) { + SortState state = SortStateScope.of(context); + VoidCallback? action; + IconData icon; + String? tip; + Color color; + switch (state.status) { + case SortStatus.none: + icon = Icons.not_started_outlined; + color = Colors.green; + action = state.sort; + tip = '运行'; + break; + case SortStatus.sorting: + icon = Icons.stop_circle_outlined; + color = Colors.grey; + tip = '寻路中'; + action = null; + break; + case SortStatus.sorted: + icon = Icons.refresh; + color = Colors.black; + action = state.reset; + tip = '重置'; + break; + } + return TolyAction( + onTap: action, + tooltip: tip, + child: Icon(icon, color: color, size: 20), + ); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart index d71e3c8e..101e3bac 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/artifact_page.dart @@ -141,7 +141,7 @@ class _ArtifactPageState extends State snap: true, pinned: true, backgroundColor: Colors.white, - leading: _curIndex == 1 ? FindingButton() : null, + leading: _curIndex == 1 ? SortButton() : null, // flexibleSpace: Image.network( // 'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/448d4eb270f44edab0192a1281141954~tplv-k3u1fbpfcp-watermark.image?', diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart index bdafa61c..03370a32 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -52,16 +52,16 @@ class _DeskKnowledgePageState extends State with SingleTicke controller.index = value; }, tabs: [ context.l10n.knowledgeTabLayout, - context.l10n.knowledgeTabToly, context.l10n.knowledgeTabAlgo, + context.l10n.knowledgeTabToly, context.l10n.knowledgeTabPoint, ],), Expanded(child: TabBarView( controller: controller, children: [ LayoutRouterPage(), - TolyArticlesPage(), AlgoRouterPage(), + TolyArticlesPage(), DeskPointPage(), ], )) @@ -134,7 +134,7 @@ class SoreAlgoPage extends StatelessWidget { ), )), Spacer(), - FindingButton(), + SortButton(), const SizedBox(width: 12,), SortSelector(), const SizedBox(width: 12,), From 2c2a3c8192c57620f7b4a1f5c2dd04c1c92a5cf9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 12 Sep 2024 09:21:21 +0800 Subject: [PATCH 084/149] readme en --- README-EN.md | 208 ++++++++++++++++++ lib/src/navigation/router/desk_route.dart | 2 +- lib/src/navigation/router/mobile_route.dart | 2 +- .../desktop/flutter_unit_desk_navigation.dart | 0 .../desktop/menu_bar_leading.dart | 0 .../desktop/menu_bar_tail.dart | 0 .../desktop/theme_model_switch_icon.dart | 0 .../desktop/toly_unit_menu_cell.dart | 0 .../mobile/pure_bottom_bar.dart | 0 .../mobile/unit_navigation.dart | 0 lib/src/wrapper/bloc_wrapper.dart | 3 +- 11 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 README-EN.md rename lib/src/navigation/{views => view}/desktop/flutter_unit_desk_navigation.dart (100%) rename lib/src/navigation/{views => view}/desktop/menu_bar_leading.dart (100%) rename lib/src/navigation/{views => view}/desktop/menu_bar_tail.dart (100%) rename lib/src/navigation/{views => view}/desktop/theme_model_switch_icon.dart (100%) rename lib/src/navigation/{views => view}/desktop/toly_unit_menu_cell.dart (100%) rename lib/src/navigation/{views => view}/mobile/pure_bottom_bar.dart (100%) rename lib/src/navigation/{views => view}/mobile/unit_navigation.dart (100%) diff --git a/README-EN.md b/README-EN.md new file mode 100644 index 00000000..78f7ee78 --- /dev/null +++ b/README-EN.md @@ -0,0 +1,208 @@ + +### FlutterUnit 全平台下载体验: + +| 平台类型 | 下载地址 | 相关文章 | +|------|--------------------------------------------------------------------------------------------------------------|------------| +| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) | [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| +| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) | [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| +| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) | [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| +| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip)| [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| +| Web版 | http://toly1994.com/flutter/ | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| + + +#### Flutter Unit 周边 +- 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487) +- 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) +- 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) +- 🔥 [掘金小册 -《Flutter 手势探索 - 执掌天下》](https://juejin.cn/book/6896378716427911181) +- 🔥 [掘金小册 -《Flutter 动画探索 - 流光幻影》](https://juejin.cn/book/6965102582473687071) +- 🔥 [掘金小册 -《Flutter 滑动探索 - 珠联璧合》](https://juejin.cn/book/6984685333312962573) +- 🔥 [掘金小册 -《Flutter 布局探索 - 薪火相传》](https://juejin.cn/book/7075958265250578469) +- 🔥 [掘金小册 -《Flutter 渲染机制 - 聚沙成塔》](https://juejin.cn/book/6965102582473687071) + +--- + +- [Flutter环境配置](https://github.com/toly1994328/FlutterUnit/issues/22) +- [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41) +- [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point) + + +--- + +#### 当前Flutter 版本 + +``` +Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 +Engine • revision f6344b75dc +Tools • Dart 3.4.0 • DevTools 2.34.3 +``` + +#### 构建命令,产出应用 + +> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi +> iOS 打包应用: flutter build ios +> Windows 打包应用: flutter build windows +> Macos 打包应用: flutter build macos +> Linux 打包应用: flutter build linux +> web 打包应用: flutter build web + +--- + +#### MacOS 桌面版本组件界面 + +![](./doc/screens/macos-2.webp) + +#### Windows 桌面版本组件界面 + +![](./doc/screens/windows-1.png) + + +> 开源不易,请我喝咖啡 ~ + +![](./doc/ewm/coffee1.png) + + + +#### Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=toly1994328/FlutterUnit&type=Date)](https://star-history.com/#toly1994328/FlutterUnit&Date) + +### 一、组件的展示页面 + +#### 1. `300+组件收录` + +> Flutter源码中的可用的组件一共350个左右,纷繁复杂,也没有明确的分类标准 +FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。并`根据个人感觉进行评星 ` +`目前收录组件306个`,每个都有至少一个演示展现和代码展示。 + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6acf7b8a1d~tplv-t2oaga2asx-zoom-1.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad06db455~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad085632b~tplv-t2oaga2asx-image.image) | + +--- + +#### 2. 组件详情页 + +> `213个组件`全部都有详情页。对于重要的组件会详细展现 +一般都会有某个演示对应的组件和属性,尽量做到细致,如果有需要补充,欢迎联系我。 +`最重要的是: 所有的演示展现都是Flutter的组件形成的,而非图片,这就意味着可操作性更高。` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ad8ba98f1~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6afb3841c4~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6afb590185~tplv-t2oaga2asx-image.image) | +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b0ad26b14~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b13d3fb5b~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b15efec19~tplv-t2oaga2asx-image.image)| + +--- + +#### 3. 组件的可操作性 + +> 对一些操作交互的组件或有可操作性的某些组件,`提供操作演示` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b177c5b67~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b21cc116a~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b2486b5a5~tplv-t2oaga2asx-image.image)| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b34887a94~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b3ca09b47~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b3d4e0253~tplv-t2oaga2asx-image.image)| + +--- + +#### 4. 相关组件的关联切换 +> `相关组件通过link to 可以进行切换, 满足你的探索欲。` +如果有的关联未加入,欢迎联系我,对我来说,加个数字就行了。 + +| . | . | . | +|------|------------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b4a4d6005~tplv-t2oaga2asx-image.image)|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b5066fbf0~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b5359b695~tplv-t2oaga2asx-image.image)| + + +--- + +#### 5. 代码的查看和分享 +> 激动人心的是,你可以通过右侧的图标`展开/隐藏 实现下面效果的代码` +并且`支持分享`,如果你想亲自体验,so,easy ! 而且`代码高亮样式可以自定义`。 + + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b6badc1bb~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b6e75653c~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b72cdd78f~tplv-t2oaga2asx-image.image)| + +--- + + +### 二、全局配置 + +#### 1. 颜色主题 +> 只提供八种颜色,可在`右滑菜单页`的`我的主题`配置,`可以拓展` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c2e937170~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c3253c4ec~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c4f97f74d~tplv-t2oaga2asx-image.image) | + +--- + + +#### 2.字体配置 + +> 支持全局字体设置,`可以拓展` + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c5448cb6c~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c55542837~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c5bec6c56~tplv-t2oaga2asx-image.image)| +--- + + +#### 3.item样式设置 + +> 支持item样式设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案` + +| . | . | . | +|------|------------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c7d4b5988~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c8935dfe1~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c8f90d6ec~tplv-t2oaga2asx-image.image)| +--- + +#### 4.代码面板风格设置 + +> 支持代码风格设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案` + +| . | . | +|------|------------| +|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cac86d591~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cac7d5bc7~tplv-t2oaga2asx-image.image)| +![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cb75e5450~tplv-t2oaga2asx-image.image)|![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6cd88c7ff9~tplv-t2oaga2asx-image.image)| + +--- + + + +### 三、搜索与收藏功能 + + +#### 1.搜索功能 + +> 由于Flutter中Widget比较杂乱,不太好分类,所以搜索是非常重要的 +另外可以根据星级进行过滤,支持多选。目前正在考虑根据功能分类,之后会有所完善。 + + +| . | . | . | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c1a355ad3~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c211dfc99~tplv-t2oaga2asx-image.image)| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6c28562ec5~tplv-t2oaga2asx-image.image) | + +--- + +#### 2.收藏功能 + +| 添加收藏集 | 修改收藏集 | 删除收藏集 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b7979f4ae~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6b97f00113~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ba47f3fd2~tplv-t2oaga2asx-image.image) | + +| 长按右菜单滑页 | 长按左菜单滑页 | 详情内长按展示收藏菜单 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6beb370b8b~tplv-t2oaga2asx-image.image) |![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6befe43cd2~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6bfd3cd42f~tplv-t2oaga2asx-image.image) | + +| 删除与数据同步 | 组件加入收藏集 | 收藏集支持多选 | +|------|------------|------------| +| ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6ba47ab64c~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6badf6ee28~tplv-t2oaga2asx-image.image) | ![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/5/3/171dae6bb380c7f5~tplv-t2oaga2asx-image.image) | + +> `FlutterUnit 2.0 `目前基本就是这么多功能,可以在Github中下载打包后的apk玩玩 +希望能对你的Flutter学习有所帮助。 + +--- diff --git a/lib/src/navigation/router/desk_route.dart b/lib/src/navigation/router/desk_route.dart index c9f8d175..c0e0dc91 100644 --- a/lib/src/navigation/router/desk_route.dart +++ b/lib/src/navigation/router/desk_route.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/widget_module.dart'; -import '../views/desktop/flutter_unit_desk_navigation.dart'; +import '../view/desktop/flutter_unit_desk_navigation.dart'; final RouteBase appNavRoute = ShellRoute( builder: (BuildContext context, GoRouterState state, Widget child) { diff --git a/lib/src/navigation/router/mobile_route.dart b/lib/src/navigation/router/mobile_route.dart index c8fa450c..db3dfb0a 100644 --- a/lib/src/navigation/router/mobile_route.dart +++ b/lib/src/navigation/router/mobile_route.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/widget_module.dart'; -import '../views/mobile/unit_navigation.dart'; +import '../view/mobile/unit_navigation.dart'; final List appMobileNavRoute = [ GoRoute( diff --git a/lib/src/navigation/views/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart similarity index 100% rename from lib/src/navigation/views/desktop/flutter_unit_desk_navigation.dart rename to lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart diff --git a/lib/src/navigation/views/desktop/menu_bar_leading.dart b/lib/src/navigation/view/desktop/menu_bar_leading.dart similarity index 100% rename from lib/src/navigation/views/desktop/menu_bar_leading.dart rename to lib/src/navigation/view/desktop/menu_bar_leading.dart diff --git a/lib/src/navigation/views/desktop/menu_bar_tail.dart b/lib/src/navigation/view/desktop/menu_bar_tail.dart similarity index 100% rename from lib/src/navigation/views/desktop/menu_bar_tail.dart rename to lib/src/navigation/view/desktop/menu_bar_tail.dart diff --git a/lib/src/navigation/views/desktop/theme_model_switch_icon.dart b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart similarity index 100% rename from lib/src/navigation/views/desktop/theme_model_switch_icon.dart rename to lib/src/navigation/view/desktop/theme_model_switch_icon.dart diff --git a/lib/src/navigation/views/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart similarity index 100% rename from lib/src/navigation/views/desktop/toly_unit_menu_cell.dart rename to lib/src/navigation/view/desktop/toly_unit_menu_cell.dart diff --git a/lib/src/navigation/views/mobile/pure_bottom_bar.dart b/lib/src/navigation/view/mobile/pure_bottom_bar.dart similarity index 100% rename from lib/src/navigation/views/mobile/pure_bottom_bar.dart rename to lib/src/navigation/view/mobile/pure_bottom_bar.dart diff --git a/lib/src/navigation/views/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart similarity index 100% rename from lib/src/navigation/views/mobile/unit_navigation.dart rename to lib/src/navigation/view/mobile/unit_navigation.dart diff --git a/lib/src/wrapper/bloc_wrapper.dart b/lib/src/wrapper/bloc_wrapper.dart index 10346fa6..6c265bcc 100644 --- a/lib/src/wrapper/bloc_wrapper.dart +++ b/lib/src/wrapper/bloc_wrapper.dart @@ -35,14 +35,13 @@ class _BlocWrapperState extends State { } final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); - final AuthRepository authRepository = HttpAuthRepository(); @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ // 全局 bloc : 维护应用存储状态、更新、认证 - BlocProvider(create: (_) => AuthBloc(repository: authRepository)), + BlocProvider(create: (_) => AuthBloc(repository: HttpAuthRepository())), BlocProvider(create: (_) => AppConfigBloc()), BlocProvider(create: (_) => UpdateBloc()), BlocProvider(create: (_) => UserBloc()), From 6b05714834e19b8cca1fe18b76687dc999994acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 09:43:43 +0800 Subject: [PATCH 085/149] Update README-EN.md --- README-EN.md | 53 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/README-EN.md b/README-EN.md index 78f7ee78..056a0c04 100644 --- a/README-EN.md +++ b/README-EN.md @@ -1,13 +1,41 @@ +

    + +

    +FlutterUnit is a cross-platform experience app, Here, you can fully explore the creativity that Flutter offers. +

    + +

    + + +License: GPL-3.0 +

    + +

    + Download App: + [Android] • + [iOS] • + [MacOS] • + [Windows] • + [Web] +

    -### FlutterUnit 全平台下载体验: +--- + + +#### Flutter Version + +``` +Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 +Engine • revision f6344b75dc +Tools • Dart 3.4.0 • DevTools 2.34.3 +``` -| 平台类型 | 下载地址 | 相关文章 | -|------|--------------------------------------------------------------------------------------------------------------|------------| -| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) | [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) | [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) | [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip)| [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| -| Web版 | http://toly1994.com/flutter/ | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| #### Flutter Unit 周边 @@ -29,15 +57,6 @@ --- -#### 当前Flutter 版本 - -``` -Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 -Engine • revision f6344b75dc -Tools • Dart 3.4.0 • DevTools 2.34.3 -``` - #### 构建命令,产出应用 > Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi From 399b3487a1fe5f7c92725b250b60209773d75b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 09:45:06 +0800 Subject: [PATCH 086/149] Update README.md --- README.md | 53 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 78f7ee78..c3bfe15e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,40 @@ +

    + + FlutterUnit
    +
    + ⭐️ 全平台 Flutter 体验应用 ⭐️
    +

    + +

    +FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flutter 带来的创造力。 +

    + +

    + + +License: GPL-3.0 +

    + +

    + 下载 App: + [Android] • + [iOS] • + [MacOS] • + [Windows] • + [Web] +

    -### FlutterUnit 全平台下载体验: +--- -| 平台类型 | 下载地址 | 相关文章 | -|------|--------------------------------------------------------------------------------------------------------------|------------| -| Android版 | [FlutterUnit.apk](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnit.apk) | [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)| -| iOS版 | [FlutterUnit in AppStore](https://apps.apple.com/cn/app/flutter-unit/id6450545123) | [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)| -| MacOS版 | [FlutterUnitMac.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitMac.zip) | [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)| -| Windows版 | [FlutterUnitWin.zip](https://github.com/toly1994328/FlutterUnit/releases/download/v3.0.0/FlutterUnitWin.zip)| [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)| -| Web版 | http://toly1994.com/flutter/ | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)| +#### Flutter 版本 + +``` +Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 +Engine • revision f6344b75dc +Tools • Dart 3.4.0 • DevTools 2.34.3 +``` #### Flutter Unit 周边 - 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487) @@ -27,17 +53,6 @@ - [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point) ---- - -#### 当前Flutter 版本 - -``` -Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 -Engine • revision f6344b75dc -Tools • Dart 3.4.0 • DevTools 2.34.3 -``` - #### 构建命令,产出应用 > Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi From 3e117d01f22163ef50cf221195179a68ad834f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 12:38:48 +0800 Subject: [PATCH 087/149] Update README.md --- README.md | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c3bfe15e..33ad3f9d 100644 --- a/README.md +++ b/README.md @@ -26,16 +26,36 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut --- +### 环境与构建 #### Flutter 版本 ``` +·]>> flutter --version Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 Engine • revision f6344b75dc Tools • Dart 3.4.0 • DevTools 2.34.3 ``` +#### 构建应用 + +``` +·]>> git clone https://github.com/toly1994328/FlutterUnit.git +·]>> cd FlutterUnit + +Build Android: +·]>> flutter build apk --target-platform --split-per-abi +Build iOS: +·]>> flutter build ios +Build Windows: +·]>> flutter build windows +Build Linux: +·]>> flutter build linux +Build web: +·]>> flutter build web +``` + #### Flutter Unit 周边 - 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487) - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) @@ -52,16 +72,6 @@ Tools • Dart 3.4.0 • DevTools 2.34.3 - [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41) - [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point) - -#### 构建命令,产出应用 - -> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi -> iOS 打包应用: flutter build ios -> Windows 打包应用: flutter build windows -> Macos 打包应用: flutter build macos -> Linux 打包应用: flutter build linux -> web 打包应用: flutter build web - --- #### MacOS 桌面版本组件界面 From 7d6935d0ca0dd106a4c84a168b79a02673136930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 12:39:28 +0800 Subject: [PATCH 088/149] Update README-EN.md --- README-EN.md | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/README-EN.md b/README-EN.md index 056a0c04..bb402410 100644 --- a/README-EN.md +++ b/README-EN.md @@ -1,6 +1,6 @@

    - FlutterUnit
    + FlutterUnit🔖
    ⭐️ All Platform Flutter Experience App ⭐️

    @@ -16,7 +16,7 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the

    - Download App: + Download v3.0.0 : [Android] [iOS][MacOS] • @@ -26,6 +26,7 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the --- +### Env and Build #### Flutter Version @@ -36,9 +37,26 @@ Engine • revision f6344b75dc Tools • Dart 3.4.0 • DevTools 2.34.3 ``` +#### Build Application + +``` +·]>> git clone https://github.com/toly1994328/FlutterUnit.git +·]>> cd FlutterUnit + +Build Android: +·]>> flutter build apk --target-platform --split-per-abi +Build iOS: +·]>> flutter build ios +Build Windows: +·]>> flutter build windows +Build Linux: +·]>> flutter build linux +Build web: +·]>> flutter build web +``` -#### Flutter Unit 周边 +#### My Flutter Books - 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487) - 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750) - 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214) @@ -57,16 +75,6 @@ Tools • Dart 3.4.0 • DevTools 2.34.3 --- -#### 构建命令,产出应用 - -> Android 分架构打包: flutter build apk --target-platform android-arm64 --split-per-abi -> iOS 打包应用: flutter build ios -> Windows 打包应用: flutter build windows -> Macos 打包应用: flutter build macos -> Linux 打包应用: flutter build linux -> web 打包应用: flutter build web - ---- #### MacOS 桌面版本组件界面 From c9319ffa156fced089194819fc41cbd4e8d231f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 12:42:10 +0800 Subject: [PATCH 089/149] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 33ad3f9d..c379ddc7 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut

    - - -License: GPL-3.0 + + +License: GPL-3.0

    From 539208f54e3388251eebf82fb9d9fbc8739e3459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Thu, 12 Sep 2024 12:50:32 +0800 Subject: [PATCH 090/149] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c379ddc7..6b38a07b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ FlutterUnit
    - ⭐️ 全平台 Flutter 体验应用 ⭐️
    + ⭐️ 全平台 Flutter 探索应用 ⭐️

    + + FlutterUnit
    +
    + ⭐️ All Platform Flutter Experience App ⭐️
    +

  • From 9cb63871bc767d5c46fed3373aeca322740e395c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 13 Sep 2024 06:50:15 +0800 Subject: [PATCH 091/149] fix:read me --- doc/screens/preview.webp | Bin 0 -> 90300 bytes .../desk_ui/widget_panel/desk_search_bar.dart | 1 + 2 files changed, 1 insertion(+) create mode 100644 doc/screens/preview.webp diff --git a/doc/screens/preview.webp b/doc/screens/preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..79cf8b0029d9ed208c65565a251c3ad7cf780ba8 GIT binary patch literal 90300 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 YB{Sew&+FJA00000000003Il)u0P<~` { alignment: Alignment.topLeft, child: Material( elevation: 6, + color: Colors.white, borderRadius: BorderRadius.circular(8), shadowColor: Colors.black, child: ConstrainedBox( From 82b753cb3a43cbe071f45979f6596d184b38cf00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Fri, 13 Sep 2024 06:52:43 +0800 Subject: [PATCH 092/149] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6b38a07b..53eaa41d 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut [Web]

    +

    FlutterUnit App

    + --- ### 环境与构建 From 9eaffe2dd1626158c635d7d88537f631119f4765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=A3=8E=E6=8D=B7=E7=89=B9=E7=83=88?= <1981462002@qq.com> Date: Fri, 13 Sep 2024 06:53:24 +0800 Subject: [PATCH 093/149] Update README-EN.md --- README-EN.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README-EN.md b/README-EN.md index bb402410..7f2bf931 100644 --- a/README-EN.md +++ b/README-EN.md @@ -24,8 +24,11 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the [Web]

    +

    FlutterUnit App

    + --- + ### Env and Build #### Flutter Version From 043c2634ba843dde33a5f81409e79d400dbf97a0 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 16 Sep 2024 16:35:18 +0800 Subject: [PATCH 094/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 5 +- lib/src/navigation/router/app_route.dart | 3 +- .../view/app_bloc_provider.dart} | 29 ++--------- lib/src/{stater => starter}/boot_start.dart | 4 +- .../logic/app_start_action.dart | 0 .../logic/app_start_repository.dart | 0 .../view/error/app_start_error.dart | 0 .../view/splash/Flutter_unit_splash.dart | 0 .../view/splash/flutter_unit_text.dart | 0 .../view}/wrapper/overlay_tool_wrapper.dart | 4 +- .../desk_ui/widget_panel/desk_search_bar.dart | 4 -- .../lib/views/widgets_bloc_provider.dart | 51 +++++++++++++++++++ .../widget_module/lib/widget_module.dart | 1 + 13 files changed, 64 insertions(+), 37 deletions(-) rename lib/src/{wrapper/bloc_wrapper.dart => navigation/view/app_bloc_provider.dart} (54%) rename lib/src/{stater => starter}/boot_start.dart (83%) rename lib/src/{stater => starter}/logic/app_start_action.dart (100%) rename lib/src/{stater => starter}/logic/app_start_repository.dart (100%) rename lib/src/{stater => starter}/view/error/app_start_error.dart (100%) rename lib/src/{stater => starter}/view/splash/Flutter_unit_splash.dart (100%) rename lib/src/{stater => starter}/view/splash/flutter_unit_text.dart (100%) rename {lib/src => modules/basic_system/app/lib/view}/wrapper/overlay_tool_wrapper.dart (97%) create mode 100644 modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart diff --git a/lib/main.dart b/lib/main.dart index 509a2d61..7dc4900e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,12 @@ import 'dart:async'; -import 'src/stater/boot_start.dart'; +import 'src/starter/boot_start.dart'; void main(List args) { runZonedGuarded(() => bootStart(args), _globalErrorHandler); } +/// 处理全局异常 void _globalErrorHandler(Object exception, StackTrace trace) async{ print(trace); - // 可自定义处理全局异常 + // 可处理其他逻辑 } \ No newline at end of file diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart index 0ea59955..da79c34e 100644 --- a/lib/src/navigation/router/app_route.dart +++ b/lib/src/navigation/router/app_route.dart @@ -1,7 +1,7 @@ import 'package:app/app.dart'; import 'package:go_router/go_router.dart'; -import '../../stater/boot_start.dart'; +import '../../starter/boot_start.dart'; import 'desk_route.dart'; import 'mobile_route.dart'; @@ -17,7 +17,6 @@ final RouteBase deskAppRoute = GoRoute( path: 'start_error', builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), ), - // isDesk ? : if (isDesk) appNavRoute, if (!isDesk) ...appMobileNavRoute ], diff --git a/lib/src/wrapper/bloc_wrapper.dart b/lib/src/navigation/view/app_bloc_provider.dart similarity index 54% rename from lib/src/wrapper/bloc_wrapper.dart rename to lib/src/navigation/view/app_bloc_provider.dart index 6c265bcc..523b9e12 100644 --- a/lib/src/wrapper/bloc_wrapper.dart +++ b/lib/src/navigation/view/app_bloc_provider.dart @@ -5,36 +5,22 @@ import 'package:draw_system/draw_system.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: Bloc提供器包裹层 -class BlocWrapper extends StatefulWidget { +class AppBlocProvider extends StatefulWidget { final Widget child; - const BlocWrapper({Key? key, required this.child}) : super(key: key); + const AppBlocProvider({Key? key, required this.child}) : super(key: key); @override - State createState() => _BlocWrapperState(); + State createState() => _AppBlocProviderState(); } -class _BlocWrapperState extends State { - late WidgetRepository repository; - - @override - void initState() { - super.initState(); - if(kAppEnv.isWeb){ - repository = MemoryWidgetRepository(); - }else{ - repository = const WidgetDbRepository(); - } - } - - final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); +class _AppBlocProviderState extends State { @override Widget build(BuildContext context) { @@ -46,19 +32,14 @@ class _BlocWrapperState extends State { BlocProvider(create: (_) => UpdateBloc()), BlocProvider(create: (_) => UserBloc()), - BlocProvider(create: (_) => WidgetsBloc(repository: repository)), - BlocProvider(create: (_) => categoryBloc), - BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), - BlocProvider(create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), ], - child: widget.child, + child: WidgetsBlocProvider(child: widget.child), ); } @override void dispose() { - categoryBloc.close(); AppStorage().close(); super.dispose(); } diff --git a/lib/src/stater/boot_start.dart b/lib/src/starter/boot_start.dart similarity index 83% rename from lib/src/stater/boot_start.dart rename to lib/src/starter/boot_start.dart index 3b12e8b3..4be0195f 100644 --- a/lib/src/stater/boot_start.dart +++ b/lib/src/starter/boot_start.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import '../flutter_unit.dart'; -import '../wrapper/bloc_wrapper.dart'; +import '../navigation/view/app_bloc_provider.dart'; import 'logic/app_start_action.dart'; import 'logic/app_start_repository.dart'; @@ -15,7 +15,7 @@ void bootStart(List args) { AppStartScope( repository: const AppStartRepositoryImpl(), appStartAction: const AppStartActionImpl(), - child: BlocWrapper(child: FlutterUnit3()), + child: AppBlocProvider(child: FlutterUnit3()), ), ); } diff --git a/lib/src/stater/logic/app_start_action.dart b/lib/src/starter/logic/app_start_action.dart similarity index 100% rename from lib/src/stater/logic/app_start_action.dart rename to lib/src/starter/logic/app_start_action.dart diff --git a/lib/src/stater/logic/app_start_repository.dart b/lib/src/starter/logic/app_start_repository.dart similarity index 100% rename from lib/src/stater/logic/app_start_repository.dart rename to lib/src/starter/logic/app_start_repository.dart diff --git a/lib/src/stater/view/error/app_start_error.dart b/lib/src/starter/view/error/app_start_error.dart similarity index 100% rename from lib/src/stater/view/error/app_start_error.dart rename to lib/src/starter/view/error/app_start_error.dart diff --git a/lib/src/stater/view/splash/Flutter_unit_splash.dart b/lib/src/starter/view/splash/Flutter_unit_splash.dart similarity index 100% rename from lib/src/stater/view/splash/Flutter_unit_splash.dart rename to lib/src/starter/view/splash/Flutter_unit_splash.dart diff --git a/lib/src/stater/view/splash/flutter_unit_text.dart b/lib/src/starter/view/splash/flutter_unit_text.dart similarity index 100% rename from lib/src/stater/view/splash/flutter_unit_text.dart rename to lib/src/starter/view/splash/flutter_unit_text.dart diff --git a/lib/src/wrapper/overlay_tool_wrapper.dart b/modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart similarity index 97% rename from lib/src/wrapper/overlay_tool_wrapper.dart rename to modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart index 69a57c7f..0e3a3b10 100644 --- a/lib/src/wrapper/overlay_tool_wrapper.dart +++ b/modules/basic_system/app/lib/view/wrapper/overlay_tool_wrapper.dart @@ -1,8 +1,6 @@ import 'package:app/app.dart'; -import 'package:artifact/artifact.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; /// create by 张风捷特烈 on 2020/10/21 /// contact me by email 1981462002@qq.com @@ -165,7 +163,7 @@ class OverlayToolWrapperState extends State } void _toPoint() { - BlocProvider.of(context).add(EventLoadPoint()); + // BlocProvider.of(context).add(EventLoadPoint()); // Navigator.of(context).pushNamed(UnitRouter.point); } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index 0aafc6df..07bebd6f 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -1,7 +1,5 @@ import 'dart:async'; -import 'package:app/app.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; @@ -40,9 +38,7 @@ class _DeskSearchBarState extends State { focusScope.unfocus(); } _controller.clear(); - context.push('/widget/detail/${model.name}',extra: model); - } Future> buildOptions(TextEditingValue textEditingValue) async { diff --git a/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart new file mode 100644 index 00000000..d4b98bbe --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart @@ -0,0 +1,51 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../blocs/blocs.dart'; +import '../widget_module.dart'; + +class WidgetsBlocProvider extends StatefulWidget { + final Widget child; + + const WidgetsBlocProvider({super.key, required this.child}); + + @override + State createState() => _WidgetsBlocProviderState(); +} + +class _WidgetsBlocProviderState extends State { + late WidgetRepository repository; + final CategoryBloc categoryBloc = CategoryBloc(repository: CategoryDbRepository()); + + @override + void initState() { + super.initState(); + if (kAppEnv.isWeb) { + repository = MemoryWidgetRepository(); + } else { + repository = const WidgetDbRepository(); + } + } + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => WidgetsBloc(repository: repository)), + BlocProvider(create: (_) => categoryBloc), + BlocProvider(create: (_) => LikeWidgetBloc(repository: repository)), + BlocProvider( + create: (_) => CategoryWidgetBloc(categoryBloc: categoryBloc)), + ], + child: widget.child, + ); + } + + + @override + void dispose() { + categoryBloc.close(); + super.dispose(); + } +} diff --git a/modules/widget_system/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart index c67cab57..2b7b2295 100644 --- a/modules/widget_system/widget_module/lib/widget_module.dart +++ b/modules/widget_system/widget_module/lib/widget_module.dart @@ -3,5 +3,6 @@ library widget_module; export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; export 'data/zone.dart'; +export 'views/widgets_bloc_provider.dart'; export 'package:storage/storage.dart' show WidgetFilter,WidgetFamily; \ No newline at end of file From 417b13b424735fe5d6e4f2ee58a0dc6a6a8f2c8f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 17 Sep 2024 10:29:17 +0800 Subject: [PATCH 095/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- lib/main.dart | 13 +-- lib/src/flutter_unit.dart | 5 +- lib/src/navigation/router/app_route.dart | 2 +- .../view/desktop/theme_model_switch_icon.dart | 1 - .../view/mobile/pure_bottom_bar.dart | 108 ++++++------------ .../view/mobile/unit_navigation.dart | 57 +++++---- lib/src/starter/boot_start.dart | 21 ---- ..._start_action.dart => fx_application.dart} | 34 ++++-- ..._repository.dart => start_repository.dart} | 22 ++-- .../starter/view/error/app_start_error.dart | 21 +++- .../view/splash/Flutter_unit_splash.dart | 2 +- .../view/splash/flutter_unit_text.dart | 2 +- .../app/lib/app/theme/app_theme.dart | 6 +- .../app/lib/app_config/bloc/bloc.dart | 24 ++-- .../app/lib/app_config/bloc/state.dart | 14 +-- .../lib/view/setting/code_style_setting.dart | 2 +- .../app/lib/view/setting/font_setting.dart | 2 +- .../app/lib/view/setting/setting_page.dart | 10 +- .../lib/view/setting/theme_color_setting.dart | 2 +- .../components/lib/project_ui/project_ui.dart | 3 +- .../lib/project_ui/refresh/refresh.dart | 2 + .../refresh/refresh_config_wrapper.dart} | 2 +- .../refresh}/toly_refresh_indicator.dart | 0 modules/basic_system/components/pubspec.yaml | 3 +- .../algorithm/lib/src/data_scope/state.dart | 2 +- .../lib/src/navigation/router/router.dart | 2 +- .../src/navigation/view/algo_menu_tree.dart | 2 + .../algorithm/lib/src/views/algo_page.dart | 17 +-- .../artifact/lib/artifact.dart | 1 - .../article/toly_article_scroll_page.dart | 1 + .../knowledge_system/artifact/pubspec.yaml | 3 +- .../playground/view/flex/flex_playground.dart | 2 +- .../playground/view/stack/stack_op_panel.dart | 2 +- .../playground/view/wrap/wrap_playground.dart | 2 +- .../widget_detail/widget_detail_page.dart | 2 +- .../widget_detail/widget_detail_page.dart | 2 +- .../views/mobile/widget_page/widget_page.dart | 3 +- .../widget_system/widget_module/pubspec.yaml | 10 +- pubspec.lock | 34 +++--- pubspec.yaml | 2 +- 41 files changed, 207 insertions(+), 242 deletions(-) delete mode 100644 lib/src/starter/boot_start.dart rename lib/src/starter/{logic/app_start_action.dart => fx_application.dart} (56%) rename lib/src/starter/{logic/app_start_repository.dart => start_repository.dart} (84%) create mode 100644 modules/basic_system/components/lib/project_ui/refresh/refresh.dart rename modules/{knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart => basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart} (97%) rename modules/{knowledge_system/artifact/lib/src/articles/view => basic_system/components/lib/project_ui/refresh}/toly_refresh_indicator.dart (100%) diff --git a/.gitignore b/.gitignore index cec5398d..cf3dd2c0 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,6 @@ # Exceptions to above rules. !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -/build_tools \ No newline at end of file +/build_tools +/libs +/pubspec_overrides.yaml diff --git a/lib/main.dart b/lib/main.dart index 7dc4900e..44222857 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,3 @@ -import 'dart:async'; -import 'src/starter/boot_start.dart'; +import 'src/starter/fx_application.dart'; -void main(List args) { - runZonedGuarded(() => bootStart(args), _globalErrorHandler); -} - -/// 处理全局异常 -void _globalErrorHandler(Object exception, StackTrace trace) async{ - print(trace); - // 可处理其他逻辑 -} \ No newline at end of file +void main(List args) => const FxApplication().run(args); diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index fe9aa98c..af941692 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -1,4 +1,3 @@ -import 'package:algorithm/algorithm.dart'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -14,7 +13,7 @@ import 'navigation/router/app_route.dart'; /// 说明: 应用主程序 class FlutterUnit3 extends StatelessWidget { - FlutterUnit3({Key? key}) : super(key: key); + FlutterUnit3({Key? key}) : super(key: key); final GoRouter _router = GoRouter( initialLocation: '/splash', @@ -26,7 +25,7 @@ class FlutterUnit3 extends StatelessWidget { @override Widget build(BuildContext context) { - AppConfigState state = context.watch().state; + AppConfig state = context.watch().state; return DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: TolyMessage( diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart index da79c34e..03e164d9 100644 --- a/lib/src/navigation/router/app_route.dart +++ b/lib/src/navigation/router/app_route.dart @@ -1,7 +1,7 @@ import 'package:app/app.dart'; import 'package:go_router/go_router.dart'; -import '../../starter/boot_start.dart'; +import '../../starter/fx_application.dart'; import 'desk_route.dart'; import 'mobile_route.dart'; diff --git a/lib/src/navigation/view/desktop/theme_model_switch_icon.dart b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart index 912180dc..3d05e3db 100644 --- a/lib/src/navigation/view/desktop/theme_model_switch_icon.dart +++ b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart @@ -1,5 +1,4 @@ import 'package:app/app.dart'; -import 'package:components/components.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/src/navigation/view/mobile/pure_bottom_bar.dart b/lib/src/navigation/view/mobile/pure_bottom_bar.dart index 4d8fbb39..c1350345 100644 --- a/lib/src/navigation/view/mobile/pure_bottom_bar.dart +++ b/lib/src/navigation/view/mobile/pure_bottom_bar.dart @@ -1,86 +1,42 @@ -import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:l10n/ext.dart'; -typedef IndexTapCallback = void Function(int); -typedef IndexLongTapCallback = void Function(BuildContext, int); +class PureBottomBar extends StatelessWidget { + final int currentIndex; + final ValueChanged? onTap; + final List labels; + final List icons; -class PureBottomBar extends StatefulWidget { - final int initPosition; + const PureBottomBar({ + super.key, + this.onTap, + required this.currentIndex, + required this.labels, + required this.icons, + }); - // item 点击事件 - final IndexTapCallback? onItemTap; - - // item 长按事件 - final IndexLongTapCallback? onItemLongTap; - const PureBottomBar( - {Key? key, this.onItemTap, this.onItemLongTap, this.initPosition = 0}) - : super(key: key); - - @override - State createState() => _PureBottomBarState(); -} - -class _PureBottomBarState extends State { - List get bottomBar => [ - context.l10n.homeTabWidget, - context.l10n.homeTabPaint, - context.l10n.homeTabKnowledge, - context.l10n.homeTabTools, - context.l10n.homeTabMine, - ]; - - List get bottomBarIcon => const [ - TolyIcon.icon_layout, - TolyIcon.dingzhi1, - TolyIcon.icon_artifact, - TolyIcon.icon_fast, - TolyIcon.yonghu, - ]; - - int _position = 0; - - @override - void initState() { - super.initState(); - _position = widget.initPosition; - } @override Widget build(BuildContext context) { - return Wrap( - children: [ - // Divider(height: 1,), - BottomNavigationBar( - // backgroundColor: Colors.white, - onTap: (position) { - // checkTokenExpires(); - _position = position; - - widget.onItemTap?.call(_position); - setState(() { - // _controller.jumpToPage(_position); - }); - }, - currentIndex: _position, - - elevation: 3, - // fixedColor: themeColor.activeColor, - type: BottomNavigationBarType.fixed, - iconSize: 22, - selectedItemColor: Theme.of(context).primaryColor, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), - showUnselectedLabels: true, - showSelectedLabels: true, - // backgroundColor: themeColor.itemColor, - items: bottomBar - .asMap() - .keys - .map((index) => BottomNavigationBarItem( - label: bottomBar[index], icon: Icon(bottomBarIcon[index]))) - .toList(), - ), - ], + return BottomNavigationBar( + onTap: onTap, + currentIndex: currentIndex, + elevation: 3, + // fixedColor: themeColor.activeColor, + type: BottomNavigationBarType.fixed, + iconSize: 22, + selectedItemColor: Theme + .of(context) + .primaryColor, + selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), + showUnselectedLabels: true, + showSelectedLabels: true, + // backgroundColor: themeColor.itemColor, + items: labels + .asMap() + .keys + .map((index) => + BottomNavigationBarItem(label: labels[index], icon: Icon(icons[index]))) + .toList(), ); } } diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 80fa43b6..2447b844 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -1,16 +1,17 @@ import 'dart:io'; +import 'package:app/app.dart'; import 'package:app_update/app_update.dart'; import 'package:artifact/artifact.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; - import 'pure_bottom_bar.dart'; /// create by 张风捷特烈 on 2020-04-11 @@ -21,13 +22,13 @@ class UnitPhoneNavigation extends StatefulWidget { const UnitPhoneNavigation({Key? key}) : super(key: key); @override - _UnitPhoneNavigationState createState() => _UnitPhoneNavigationState(); + State createState() => _UnitPhoneNavigationState(); } class _UnitPhoneNavigationState extends State { //页面控制器,初始 0 final PageController _controller = PageController(); - int position = 0; + ValueNotifier position = ValueNotifier(0); // 禁止 PageView 滑动 final ScrollPhysics _neverScroll = const NeverScrollableScrollPhysics(); @@ -35,15 +36,14 @@ class _UnitPhoneNavigationState extends State { @override void initState() { super.initState(); - if (Platform.isAndroid||Platform.isIOS) { - } - BlocProvider.of(context).add(const CheckUpdate(appName: 'FlutterUnit')); - + if (Platform.isAndroid || Platform.isIOS) {} + context.read().add(const CheckUpdate(appName: 'FlutterUnit')); } @override void dispose() { _controller.dispose(); //释放控制器 + position.dispose(); super.dispose(); } @@ -70,17 +70,35 @@ class _UnitPhoneNavigationState extends State { bool get isDark => Theme.of(context).brightness == Brightness.dark; + List get bottomBar => [ + context.l10n.homeTabWidget, + context.l10n.homeTabPaint, + context.l10n.homeTabKnowledge, + context.l10n.homeTabTools, + context.l10n.homeTabMine, + ]; + + List get bottomBarIcon => const [ + TolyIcon.icon_layout, + TolyIcon.dingzhi1, + TolyIcon.icon_artifact, + TolyIcon.icon_fast, + TolyIcon.yonghu, + ]; // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, // 使用 BlocBuilder 构建 Widget _buildBottomNav(BuildContext context) { return Stack( children: [ - PureBottomBar( - initPosition: position, - onItemTap: _onTapBottomNav, - onItemLongTap: _onItemLongTap, - ), + ValueListenableBuilder( + valueListenable: position, + builder: (_, value, __) => PureBottomBar( + currentIndex: value, + onTap: _onTapBottomNav, + labels: bottomBar, + icons: bottomBarIcon, + )), const Positioned(right: 22, top: 8, child: UpdateRedPoint()) ], ); @@ -89,27 +107,16 @@ class _UnitPhoneNavigationState extends State { // 点击底部按钮事件,切换页面 void _onTapBottomNav(int index) { _controller.jumpToPage(index); - position = index; + position.value = index; if (!isDark) { late Color color; if (index != 0) { color = Theme.of(context).primaryColor; - } else { - } + } else {} } if (index == 3) { BlocProvider.of(context).add(const EventLoadLikeData()); } } - - // 两侧 - void _onItemLongTap(BuildContext context, int index) { - if (index == 0) { - Scaffold.of(context).openDrawer(); - } - if (index == 4) { - Scaffold.of(context).openEndDrawer(); - } - } } diff --git a/lib/src/starter/boot_start.dart b/lib/src/starter/boot_start.dart deleted file mode 100644 index 4be0195f..00000000 --- a/lib/src/starter/boot_start.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:fx_boot_starter/fx_boot_starter.dart'; - -import '../flutter_unit.dart'; -import '../navigation/view/app_bloc_provider.dart'; -import 'logic/app_start_action.dart'; -import 'logic/app_start_repository.dart'; - -export 'view/splash/Flutter_unit_splash.dart'; -export 'view/error/app_start_error.dart'; - -void bootStart(List args) { - runApp( - AppStartScope( - repository: const AppStartRepositoryImpl(), - appStartAction: const AppStartActionImpl(), - child: AppBlocProvider(child: FlutterUnit3()), - ), - ); -} diff --git a/lib/src/starter/logic/app_start_action.dart b/lib/src/starter/fx_application.dart similarity index 56% rename from lib/src/starter/logic/app_start_action.dart rename to lib/src/starter/fx_application.dart index f69c5de5..45fe5cbc 100644 --- a/lib/src/starter/logic/app_start_action.dart +++ b/lib/src/starter/fx_application.dart @@ -1,20 +1,31 @@ import 'package:app/app.dart'; -import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:go_router/go_router.dart'; import 'package:storage/storage.dart'; -import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -class AppStartActionImpl implements AppStartAction { +import '../flutter_unit.dart'; +import '../navigation/view/app_bloc_provider.dart'; +import 'start_repository.dart'; + +export 'view/splash/Flutter_unit_splash.dart'; +export 'view/error/app_start_error.dart'; + +class FxApplication with FxStarter { - const AppStartActionImpl(); + const FxApplication(); + + @override + Widget get app => AppBlocProvider(child: FlutterUnit3()); + + @override + AppStartRepository get repository => const FlutterUnitStartRepo(); @override - void onLoaded(BuildContext context, int cost, AppConfigState state) { + void onLoaded(BuildContext context, int cost, AppConfig state) { debugPrint("App启动耗时:$cost ms"); - HttpUtil.instance.rebase(PathUnit.baseUrl); context.read().init(state); context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); if(!kAppEnv.isWeb){ @@ -23,13 +34,20 @@ class AppStartActionImpl implements AppStartAction { } } + @override + void onStartSuccess(BuildContext context, AppConfig state) { + context.go('/widget'); + } + @override void onStartError(BuildContext context, Object error, StackTrace trace) { context.go('/start_error',extra: error); } + @override - void onStartSuccess(BuildContext context,AppConfigState state) { - context.go('/widget'); + void onGlobalError(Object error, StackTrace stack) { + print(error); } } + diff --git a/lib/src/starter/logic/app_start_repository.dart b/lib/src/starter/start_repository.dart similarity index 84% rename from lib/src/starter/logic/app_start_repository.dart rename to lib/src/starter/start_repository.dart index 8635e9c6..c487b559 100644 --- a/lib/src/starter/logic/app_start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; @@ -11,42 +12,34 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; -class AppStartRepositoryImpl implements AppStartRepository { - const AppStartRepositoryImpl(); +class FlutterUnitStartRepo implements AppStartRepository { + const FlutterUnitStartRepo(); /// 初始化 app 的异步任务 /// 返回本地持久化的 AppConfigState 对象 @override - Future initApp() async { + Future initApp() async { WidgetsFlutterBinding.ensureInitialized(); // 滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; WindowSizeAdapter.setSize(); + // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); if (!kAppEnv.isWeb) await initDb(); AppConfigPo po = await SpStorage.instance.appConfig.read(); List netConnect = await (Connectivity().checkConnectivity()); - AppConfigState state = AppConfigState.fromPo(po); + AppConfig state = AppConfig.fromPo(po); if (netConnect.isNotEmpty) { state = state.copyWith(netConnect: netConnect.first); } return state; } - @override - Future fixError(Object error, {Object? extra}) async { - await Future.delayed(const Duration(seconds: 1)); - // throw "App 无法修复"; - return; - } - Future initDb() async { //数据库不存在,执行拷贝 String dbPath = await AppStorage().flutter.dbpath; await SpStorage.instance.initSp(); - bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage.instance.spf); - if (shouldCopy) { await _doCopyAssetsDb(dbPath); } else { @@ -80,8 +73,7 @@ class AppStartRepositoryImpl implements AppStartRepository { } //非 release模式,执行拷贝 - const isPro = bool.fromEnvironment('dart.vm.product'); - if (!isPro) { + if (!kDebugMode) { shouldCopy = true; } diff --git a/lib/src/starter/view/error/app_start_error.dart b/lib/src/starter/view/error/app_start_error.dart index ab3368c9..3c499e53 100644 --- a/lib/src/starter/view/error/app_start_error.dart +++ b/lib/src/starter/view/error/app_start_error.dart @@ -1,5 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:tolyui/basic/basic.dart'; class AppStartErrorPage extends StatelessWidget { final Object? error; @@ -10,12 +11,26 @@ class AppStartErrorPage extends StatelessWidget { return Scaffold( appBar: PreferredDragToMoveWrapper( child: AppBar( - title: Text("App 启动异常"), - actions: [WindowButtons()], + title: const Text("App 启动异常",style: TextStyle(fontFamily: '宋体'),), + actions: const [WindowButtons()], ), ), body: Center( - child: Text(error.toString()), + child: Column( + children: [ + Expanded(child: Center(child: Wrap( + direction: Axis.vertical, + children: [ + const Text('应用启动异常:'), + Text(error.toString(),style: const TextStyle(color: Colors.redAccent),), + ], + ))), + TolyLink(href: 'https://github.com/toly1994328/', text: 'Github 开源地址: FlutterUnit', onTap: (l){}), + const Text("联系邮箱: 1981462002@qq.com"), + const SizedBox(height: 12,), + + ], + ), ), ); } diff --git a/lib/src/starter/view/splash/Flutter_unit_splash.dart b/lib/src/starter/view/splash/Flutter_unit_splash.dart index ef4d2a21..110e0f8e 100644 --- a/lib/src/starter/view/splash/Flutter_unit_splash.dart +++ b/lib/src/starter/view/splash/Flutter_unit_splash.dart @@ -17,7 +17,7 @@ class FlutterUnitSplash extends StatelessWidget { @override Widget build(BuildContext context) { - return const AppStartListener( + return const AppStartListener( child: AnnotatedRegion( value: SystemUiOverlayStyle( statusBarColor: Colors.transparent, diff --git a/lib/src/starter/view/splash/flutter_unit_text.dart b/lib/src/starter/view/splash/flutter_unit_text.dart index 67340101..427cf92e 100644 --- a/lib/src/starter/view/splash/flutter_unit_text.dart +++ b/lib/src/starter/view/splash/flutter_unit_text.dart @@ -16,7 +16,7 @@ class FlutterUnitText extends StatefulWidget { }) : super(key: key); @override - _FlutterUnitTextState createState() => _FlutterUnitTextState(); + State createState() => _FlutterUnitTextState(); } class _FlutterUnitTextState extends State diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index 2418fed1..a705f134 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -10,7 +10,7 @@ import '../style/transition/fade_page_transitions_builder.dart'; import '../style/transition/slide_transition/slide_page_transition_builder.dart'; class AppTheme { - static ThemeData darkTheme(AppConfigState state) { + static ThemeData darkTheme(AppConfig state) { Color scaffoldBackgroundColor = const Color(0xff010201); SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( @@ -61,7 +61,7 @@ class AppTheme { ); } - static ThemeData lightTheme(AppConfigState state) { + static ThemeData lightTheme(AppConfig state) { SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarBrightness: Brightness.light, @@ -69,7 +69,7 @@ class AppTheme { ); return ThemeData( - fontFamily: state.fontFamily, + fontFamily: '宋体', primaryColor: state.themeColor.color, scaffoldBackgroundColor: Color(0xffF3F4F6), useMaterial3: true, diff --git a/modules/basic_system/app/lib/app_config/bloc/bloc.dart b/modules/basic_system/app/lib/app_config/bloc/bloc.dart index b161bc39..8ad80747 100644 --- a/modules/basic_system/app/lib/app_config/bloc/bloc.dart +++ b/modules/basic_system/app/lib/app_config/bloc/bloc.dart @@ -11,12 +11,12 @@ import 'package:storage/storage.dart'; /// contact me by email 1981462002@qq.com /// 说明: 全局信息的bloc -class AppConfigBloc extends Cubit { +class AppConfigBloc extends Cubit { final Connectivity _connectivity = Connectivity(); late StreamSubscription> _subscription; - AppConfigBloc() : super(const AppConfigState()) { + AppConfigBloc() : super(const AppConfig()) { _subscription = _connectivity.onConnectivityChanged.listen(_onNetConnectChange); } @@ -34,7 +34,7 @@ class AppConfigBloc extends Cubit { super.close(); } - void init(AppConfigState state) { + void init(AppConfig state) { emit(state); } @@ -42,61 +42,61 @@ class AppConfigBloc extends Cubit { // 切换字体事件处理 : 固化索引 + 产出新状态 void switchFontFamily(String family) async { - AppConfigState newState = state.copyWith(fontFamily: family); + AppConfig newState = state.copyWith(fontFamily: family); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换语言事件处理 : 固化索引 + 产出新状态 void switchLanguage(Language language) async { - AppConfigState newState = state.copyWith(language: language); + AppConfig newState = state.copyWith(language: language); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换主题色事件处理 : 固化索引 + 产出新状态 void switchThemeColor(ThemeColor color) async { - AppConfigState newState = state.copyWith(themeColor: color); + AppConfig newState = state.copyWith(themeColor: color); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 固化数据 + 产出新状态 void switchShowBg(bool show) async { - AppConfigState newState = state.copyWith(showBackGround: show); + AppConfig newState = state.copyWith(showBackGround: show); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换背景显示事件处理 : 产出新状态 void switchShowOver(bool show) async { - AppConfigState newState = state.copyWith(showPerformanceOverlay: show); + AppConfig newState = state.copyWith(showPerformanceOverlay: show); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换code样式事件处理 : 固化索引 + 产出新状态 void switchCoderTheme(int codeStyleIndex) async { - AppConfigState newState = state.copyWith(codeStyleIndex: codeStyleIndex); + AppConfig newState = state.copyWith(codeStyleIndex: codeStyleIndex); cao.write(newState.toAppConfigPo()); emit(newState); } // 切换item样式事件处理 : 固化索引 + 产出新状态 void changeItemStyle(int index) async { - AppConfigState newState = state.copyWith(itemStyleIndex: index); + AppConfig newState = state.copyWith(itemStyleIndex: index); cao.write(newState.toAppConfigPo()); emit(newState); } void changeThemeMode(ThemeMode style) async { - AppConfigState newState = state.copyWith(themeMode: style); + AppConfig newState = state.copyWith(themeMode: style); cao.write(newState.toAppConfigPo()); emit(newState); } void switchShowTool(bool show) async { - AppConfigState newState = state.copyWith(showOverlayTool: show); + AppConfig newState = state.copyWith(showOverlayTool: show); cao.write(newState.toAppConfigPo()); emit(newState); } diff --git a/modules/basic_system/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart index d3c071b0..5743b832 100644 --- a/modules/basic_system/app/lib/app_config/bloc/state.dart +++ b/modules/basic_system/app/lib/app_config/bloc/state.dart @@ -11,7 +11,7 @@ import 'package:toly_ui/code/code.dart' ; /// contact me by email 1981462002@qq.com /// 说明: 全局状态类 -class AppConfigState extends Equatable { +class AppConfig extends Equatable { /// [fontFamily] 文字字体 final String fontFamily; @@ -41,8 +41,8 @@ class AppConfigState extends Equatable { final Language language; - const AppConfigState({ - this.fontFamily = 'ComicNeue', + const AppConfig({ + this.fontFamily = '宋体', this.language = Language.zh_CN, this.themeColor = ThemeColor.blue, this.themeMode = ThemeMode.system, @@ -68,7 +68,7 @@ class AppConfigState extends Equatable { language, ]; - AppConfigState copyWith({ + AppConfig copyWith({ String? fontFamily, String? dbPath, ThemeColor? themeColor, @@ -81,7 +81,7 @@ class AppConfigState extends Equatable { ThemeMode? themeMode, ConnectivityResult? netConnect, }) => - AppConfigState( + AppConfig( fontFamily: fontFamily ?? this.fontFamily, language: language ?? this.language, themeColor: themeColor ?? this.themeColor, @@ -109,8 +109,8 @@ class AppConfigState extends Equatable { ); // 根据存储的配置信息对象,形成 AppState 状态数据 - factory AppConfigState.fromPo(AppConfigPo po) { - return AppConfigState( + factory AppConfig.fromPo(AppConfigPo po) { + return AppConfig( fontFamily: Cons.kFontFamilySupport[po.fontFamilyIndex], themeColor: ThemeColor.values[po.themeColorIndex], showBackGround: po.showBackGround, diff --git a/modules/basic_system/app/lib/view/setting/code_style_setting.dart b/modules/basic_system/app/lib/view/setting/code_style_setting.dart index 22a7acbf..dba01045 100644 --- a/modules/basic_system/app/lib/view/setting/code_style_setting.dart +++ b/modules/basic_system/app/lib/view/setting/code_style_setting.dart @@ -32,7 +32,7 @@ class Hello { Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(context.l10n.codeHighlightStyle)), - body: BlocBuilder( + body: BlocBuilder( builder: (_, state) => _buildFontCell(context, Cons.codeThemeSupport.keys.toList(), state.codeStyleIndex)), ); diff --git a/modules/basic_system/app/lib/view/setting/font_setting.dart b/modules/basic_system/app/lib/view/setting/font_setting.dart index c746db64..30fed2e1 100644 --- a/modules/basic_system/app/lib/view/setting/font_setting.dart +++ b/modules/basic_system/app/lib/view/setting/font_setting.dart @@ -12,7 +12,7 @@ class FontSettingPage extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( builder: (_, state) =>Scaffold( appBar: AppBar(title: Text('字体设置 - font setting',style: TextStyle(fontFamily:state.fontFamily ),)), body: _buildFontCell( diff --git a/modules/basic_system/app/lib/view/setting/setting_page.dart b/modules/basic_system/app/lib/view/setting/setting_page.dart index b213a4f5..c4f5a9be 100644 --- a/modules/basic_system/app/lib/view/setting/setting_page.dart +++ b/modules/basic_system/app/lib/view/setting/setting_page.dart @@ -27,7 +27,7 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state) { String info = switch(state.themeMode){ ThemeMode.system => context.l10n.followSystem, @@ -48,7 +48,7 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: Text(context.l10n.themeColorSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state)=>Text( state.themeColor.label(context), style: TextStyle(color: state.themeColor.color,fontSize: 12), @@ -65,7 +65,7 @@ class SettingPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), title: Text(context.l10n.fontSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( + subtitle: BlocBuilder( builder: (_,state)=>Text( state.fontFamily,style: TextStyle(fontSize: 12), ), @@ -125,7 +125,7 @@ class SettingPage extends StatelessWidget { // ) Widget _buildShowBg(BuildContext context) => - BlocBuilder( + BlocBuilder( builder: (_, state) => TolySwitchListTile( secondary:Icon( TolyIcon.icon_background, @@ -138,7 +138,7 @@ class SettingPage extends StatelessWidget { ),); Widget _buildShowOver(BuildContext context) => - BlocBuilder( + BlocBuilder( builder: (_, state) => TolySwitchListTile( secondary:Icon( TolyIcon.icon_background, diff --git a/modules/basic_system/app/lib/view/setting/theme_color_setting.dart b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart index 572b060c..e9678054 100644 --- a/modules/basic_system/app/lib/view/setting/theme_color_setting.dart +++ b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart @@ -16,7 +16,7 @@ class ThemeColorSettingPage extends StatelessWidget { return Scaffold( backgroundColor: UnitColor.scaffoldBgLight, appBar: const UnitAppbar(title:'主题色设置'), - body: BlocBuilder( + body: BlocBuilder( builder: (_, state) => _buildCell( context, ThemeColor.values, state.themeColor)), ); diff --git a/modules/basic_system/components/lib/project_ui/project_ui.dart b/modules/basic_system/components/lib/project_ui/project_ui.dart index ee336a16..b27f9641 100644 --- a/modules/basic_system/components/lib/project_ui/project_ui.dart +++ b/modules/basic_system/components/lib/project_ui/project_ui.dart @@ -9,4 +9,5 @@ export 'unit_app_bar.dart'; export 'top_bar/desk_simple_top_bar.dart'; export 'top_bar/desk_tab_top_bar.dart'; export 'top_bar/desk_knowledge_top_bar.dart'; -export 'time_line/flutter_unit_time_line.dart'; \ No newline at end of file +export 'time_line/flutter_unit_time_line.dart'; +export 'refresh/refresh.dart'; \ No newline at end of file diff --git a/modules/basic_system/components/lib/project_ui/refresh/refresh.dart b/modules/basic_system/components/lib/project_ui/refresh/refresh.dart new file mode 100644 index 00000000..fa66aedd --- /dev/null +++ b/modules/basic_system/components/lib/project_ui/refresh/refresh.dart @@ -0,0 +1,2 @@ +export 'refresh_config_wrapper.dart'; +export 'package:refresh/refresh.dart' show SmartRefresher,RefreshController; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart b/modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart similarity index 97% rename from modules/knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart rename to modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart index 64a6c2da..23d5dc36 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/wrapper/refresh.dart +++ b/modules/basic_system/components/lib/project_ui/refresh/refresh_config_wrapper.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:refresh/refresh.dart'; -import '../toly_refresh_indicator.dart'; +import 'toly_refresh_indicator.dart'; class RefreshConfigWrapper extends StatelessWidget { final Widget child; diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/toly_refresh_indicator.dart b/modules/basic_system/components/lib/project_ui/refresh/toly_refresh_indicator.dart similarity index 100% rename from modules/knowledge_system/artifact/lib/src/articles/view/toly_refresh_indicator.dart rename to modules/basic_system/components/lib/project_ui/refresh/toly_refresh_indicator.dart diff --git a/modules/basic_system/components/pubspec.yaml b/modules/basic_system/components/pubspec.yaml index fe2a2273..b36b54c4 100644 --- a/modules/basic_system/components/pubspec.yaml +++ b/modules/basic_system/components/pubspec.yaml @@ -5,7 +5,7 @@ homepage: publish_to: none environment: - sdk: '>=2.18.5 <3.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=1.17.0" dependencies: @@ -14,6 +14,7 @@ dependencies: flutter_spinkit: ^5.2.0 # loading flutter_markdown: ^0.7.2+1 # markdown dash_painter: ^1.0.2 + refresh: ^1.0.1 toly_ui: path: ../toly_ui diff --git a/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart b/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart index a9ea9fc7..a5a4b479 100644 --- a/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart +++ b/modules/knowledge_system/algorithm/lib/src/data_scope/state.dart @@ -46,6 +46,7 @@ class SortState with ChangeNotifier{ status = SortStatus.sorting; notifyListeners(); SortFunction? sortFunction = sortFunctionMap[config.name]; + print(config.name); if(sortFunction!=null){ await sortFunction(data,(arr) async { await Future.delayed(config.duration); @@ -57,7 +58,6 @@ class SortState with ChangeNotifier{ } } -/// Provides the current [SortState] to descendant widgets in the tree. class SortStateScope extends InheritedNotifier { const SortStateScope({ required super.notifier, diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart index 54f05c1d..32c0ea91 100644 --- a/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/router/router.dart @@ -20,7 +20,7 @@ RouteBase get algoRoutes => GoRoute( routes: [ ShellRoute( builder: (BuildContext context, GoRouterState state, Widget child) { - return AlgoScope(child: AppDeskNavigation(content: child)); + return AppDeskNavigation(content: child); }, routes: [ GoRoute( diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart index 2cbabc05..83be03b6 100644 --- a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_tree.dart @@ -83,6 +83,8 @@ class _AppMenuTreeState extends State with RouterChangeListenerMixi if(path.startsWith('/sort')){ SortState state = SortStateScope.of(context); state.config = state.config.copyWith(name: p.basename(path)); + print("=====path:${p.basename(path)}==${state.config.name}======"); + }else{ FindingState state = FindingStateScope.read(context); state.changeAlgo(p.basename(path)); diff --git a/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart b/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart index 40696186..92680610 100644 --- a/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart +++ b/modules/knowledge_system/algorithm/lib/src/views/algo_page.dart @@ -12,6 +12,7 @@ class AlgoScope extends StatelessWidget { @override Widget build(BuildContext context) { + print("=====build======="); return SortStateScope( notifier: SortState(), child: FindingStateScope( @@ -52,13 +53,15 @@ class _AlgoRouterPageState extends State { @override Widget build(BuildContext context) { - return Column( - children: [ - const Divider(), - Expanded( - child: Router.withConfig(config: _router), - ), - ], + return AlgoScope( + child: Column( + children: [ + const Divider(), + Expanded( + child: Router.withConfig(config: _router), + ), + ], + ), ); } } diff --git a/modules/knowledge_system/artifact/lib/artifact.dart b/modules/knowledge_system/artifact/lib/artifact.dart index 9f64dc6f..bccd3eba 100644 --- a/modules/knowledge_system/artifact/lib/artifact.dart +++ b/modules/knowledge_system/artifact/lib/artifact.dart @@ -1,7 +1,6 @@ library artifact; export 'src/articles/view/artifact_page.dart'; -export 'src/articles/view/wrapper/refresh.dart'; export 'src/points/exp.dart'; export 'src/articles/view/desk_artifact_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart index 984fa4f9..d1deb5d0 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/toly_article_scroll_page.dart @@ -1,5 +1,6 @@ import 'package:artifact/artifact.dart'; +import 'package:components/components.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/modules/knowledge_system/artifact/pubspec.yaml b/modules/knowledge_system/artifact/pubspec.yaml index dd05b592..dd30ad2e 100644 --- a/modules/knowledge_system/artifact/pubspec.yaml +++ b/modules/knowledge_system/artifact/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.3 <4.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=2.17.0" dependencies: @@ -13,7 +13,6 @@ dependencies: flutter_bloc: ^8.1.6 # 状态管理 dio: ^5.3.2 # 网络请求 webview_flutter: ^4.2.4 - refresh: ^1.0.1 storage: path: ../../basic_system/storage algorithm: diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart index 0e46956c..07e2db43 100644 --- a/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/flex/flex_playground.dart @@ -49,7 +49,7 @@ class _FlexPlaygroundState extends State { )), const VerticalDivider(), SizedBox( - width: 200, + width: 210, child: FlexOpTool( attr: _attr, onReset: _reset, diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart index 7b6d6d1e..18c1fae9 100644 --- a/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/stack/stack_op_panel.dart @@ -98,7 +98,7 @@ class _StackOpToolState extends State { }, ), ItemSelector( - label: '文章方向:', + label: '文字方向:', subTitle: 'textDirection', selectIndex: widget.attr.textDirection.index, data: TextDirection.values, diff --git a/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart index 4dfb431f..5c7d94e8 100644 --- a/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart +++ b/modules/knowledge_system/layout/lib/src/views/playground/view/wrap/wrap_playground.dart @@ -64,7 +64,7 @@ class _WrapPlaygroundState extends State { )))), const VerticalDivider(), SizedBox( - width: 200, + width: 210, child: WrapOpTool( attr: _attr, onAddBox: _onAddBox, diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 7e7e38c5..c29c773f 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -151,7 +151,7 @@ class DeskWidgetDetailPage extends StatelessWidget { } Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { - AppConfigState globalState = BlocProvider.of(context).state; + AppConfig globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 6a716c7a..80ff4a3c 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -106,7 +106,7 @@ class WidgetDetailPage extends StatelessWidget { } Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { - AppConfigState globalState = BlocProvider.of(context).state; + AppConfig globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => WidgetNodePanel( diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart index 21f40760..02bbd5e8 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart @@ -1,8 +1,7 @@ -import 'package:artifact/artifact.dart'; +import 'package:components/components.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:refresh/refresh.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'widget_list_panel.dart'; diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml index 3d306b9f..14f2602c 100644 --- a/modules/widget_system/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -5,7 +5,7 @@ homepage: publish_to: none environment: - sdk: '>=2.18.5 <3.0.0' + sdk: '>=3.0.0 <4.0.0' flutter: ">=1.17.0" dependencies: @@ -16,13 +16,13 @@ dependencies: flutter_star: ^1.0.2 # 星星组件 toggle_rotate: ^1.0.1 wrapper: ^1.0.2 - artifact: - path: ../../knowledge_system/artifact + share_plus: ^10.0.1 # 文字分享 + go_router: ^14.2.0 + storage: path: ../../basic_system/storage toly_ui: path: ../../basic_system/toly_ui - share_plus: ^10.0.1 # 文字分享 components: path: ../../basic_system/components authentication: @@ -35,7 +35,7 @@ dependencies: path: ../widgets utils: path: ../../basic_system/utils - go_router: ^14.2.0 + dev_dependencies: flutter_test: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index 9c88b21a..0f69da9d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -111,18 +111,18 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 + sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.3" + version: "6.0.5" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb + sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.0" + version: "2.0.1" cross_file: dependency: transitive description: @@ -222,10 +222,10 @@ packages: dependency: transitive description: name: file_picker - sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3" + sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" url: "https://pub.flutter-io.cn/" source: hosted - version: "8.0.7" + version: "8.1.2" flutter: dependency: "direct main" description: flutter @@ -298,10 +298,10 @@ packages: dependency: "direct main" description: name: fx_boot_starter - sha256: "1498d9689ee12762537c2988470e0d9a6518eeb046671b7b2d377e420f9d6419" + sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.1" + version: "0.1.1" fx_dao: dependency: transitive description: @@ -338,10 +338,10 @@ packages: dependency: transitive description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.1" + version: "1.2.2" http_parser: dependency: transitive description: @@ -488,18 +488,18 @@ packages: dependency: transitive description: name: package_info_plus - sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 url: "https://pub.flutter-io.cn/" source: hosted - version: "8.0.0" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.flutter-io.cn/" source: hosted - version: "3.0.0" + version: "3.0.1" path: dependency: transitive description: @@ -765,10 +765,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: b384f598b813b347c5a7e5ffad82cbaff1bec3d1561af267041e66f6f0899295 + sha256: "45f168ae2213201b54e09429ed0c593dc2c88c924a1488d6f9c523a255d567cb" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.3" + version: "2.4.6" stack_trace: dependency: transitive description: @@ -990,7 +990,7 @@ packages: source: hosted version: "14.2.4" web: - dependency: "direct overridden" + dependency: transitive description: name: web sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 diff --git a/pubspec.yaml b/pubspec.yaml index f57a00ce..edaa6f8e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: cupertino_icons: ^1.0.4 ## fx 架构 - fx_boot_starter: 0.0.1 # app 启动器 + fx_boot_starter: 0.1.1 # app 启动器 go_router: ^14.2.0 flutter_bloc: ^8.1.6 # 状态管理 From b1883bc8733fe70a7d9956c0a5bcf7612d282197 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 22 Sep 2024 00:37:41 +0800 Subject: [PATCH 096/149] feature:update widget system parser --- analysis_options.yaml | 2 +- assets/flutter.db | Bin 1376256 -> 1462272 bytes desiredFileName.txt | 1 + l10n.yaml | 10 + lib/src/flutter_unit.dart | 11 +- lib/src/l10n/arb/app_en.arb | 13 ++ lib/src/l10n/arb/app_zh.arb | 13 ++ lib/src/l10n/gen/app_l10n.dart | 189 ++++++++++++++++++ lib/src/l10n/gen/app_l10n_en.dart | 38 ++++ lib/src/l10n/gen/app_l10n_zh.dart | 38 ++++ lib/src/navigation/model/app_tab.dart | 42 ++++ .../desktop/flutter_unit_desk_navigation.dart | 18 +- .../view/mobile/pure_bottom_bar.dart | 61 +++--- .../view/mobile/unit_navigation.dart | 36 +--- .../db_storage/flutter/dao/columnize_dao.dart | 5 - .../Column/desc_zh-CN.json | 26 +++ .../Column/node1_base.dart | 13 -- .../CustomMultiChildLayout/desc_zh-CN.json | 22 ++ .../CustomMultiChildLayout/node1_base.dart | 9 - .../Flex/desc_zh-CN.json | 53 +++++ .../Flex/node1_direction.dart | 9 - .../Flex/node2_mainAxisAlignment.dart | 8 - .../Flex/node3_crossAxisAlignment.dart | 8 - .../Flex/node4_verticalDirection.dart | 8 - .../Flex/node5_textDirection.dart | 8 - .../Flow/desc_zh-CN.json | 29 +++ .../Flow/node1_base.dart | 9 +- .../Flow/node2_anim.dart | 9 +- .../IndexedStack/desc_zh-CN.json | 20 ++ .../IndexedStack/node1_base.dart | 10 - .../ListBody/desc_zh-CN.json | 20 ++ .../ListBody/node1_base.dart | 9 - .../NestedScrollViewViewport/desc_zh-CN.json | 24 +++ .../NestedScrollViewViewport/node1_base.dart | 17 +- .../RichText/desc_zh-CN.json | 26 +++ .../RichText/node1_base.dart | 10 +- .../RichText/node2_widget.dart | 9 +- .../Row/desc_zh-CN.json | 26 +++ .../Row/node1_base.dart | 14 +- .../ShrinkWrappingViewport/desc_zh-CN.json | 26 +++ .../ShrinkWrappingViewport/node1_base.dart | 15 +- .../Stack/desc_zh-CN.json | 33 +++ .../Stack/node1_base.dart | 13 +- .../Stack/node2_positioned.dart | 9 +- .../Viewport/desc_zh-CN.json | 27 +++ .../Viewport/node1_base.dart | 13 -- .../Wrap/desc_zh-CN.json | 52 +++++ .../Wrap/node1_base.dart | 12 +- .../Wrap/node2_alignment.dart | 8 - .../Wrap/node3_crossAxisAlignment.dart | 8 - .../Wrap/node4_textDirection.dart | 8 - .../Wrap/node5_verticalDirection.dart | 8 - .../lib/Other/ErrorWidget/desc_zh-CN.json | 18 ++ .../lib/Other/ErrorWidget/node1_base.dart | 7 - .../Other/ListWheelViewport/desc_zh-CN.json | 52 +++++ .../Other/ListWheelViewport/node1_base.dart | 12 +- .../ListWheelViewport/node2_perspective.dart | 10 +- .../ListWheelViewport/node3_magnifier.dart | 12 +- .../ListWheelViewport/node4_opacity.dart | 10 +- .../Other/PerformanceOverlay/desc_zh-CN.json | 18 ++ .../Other/PerformanceOverlay/node1_base.dart | 8 +- .../lib/Other/RawImage/desc_zh-CN.json | 23 +++ .../lib/Other/RawImage/node1_base.dart | 13 +- .../desc_zh-CN.json | 20 ++ .../node1_base.dart | 11 +- .../widgets/lib/Other/Table/desc_zh-CN.json | 23 +++ .../widgets/lib/Other/Table/node1_base.dart | 13 +- .../ButtonBarTheme/desc_zh-CN.json | 18 ++ .../ButtonBarTheme/node1_base.dart | 8 +- .../ProxyWidget/ButtonTheme/desc_zh-CN.json | 24 +++ .../ProxyWidget/ButtonTheme/node1_base.dart | 8 - .../lib/ProxyWidget/ChipTheme/desc_zh-CN.json | 25 +++ .../lib/ProxyWidget/ChipTheme/node1_base.dart | 8 +- .../desc_zh-CN.json | 18 ++ .../node1_base.dart | 10 +- .../DefaultAssetBundle/desc_zh-CN.json | 20 ++ .../DefaultAssetBundle/node1_base.dart | 11 +- .../DefaultTextStyle/desc_zh-CN.json | 23 +++ .../DefaultTextStyle/node1_base.dart | 8 - .../Directionality/desc_zh-CN.json | 22 ++ .../Directionality/node1_base.dart | 9 +- .../ProxyWidget/DividerTheme/desc_zh-CN.json | 22 ++ .../ProxyWidget/DividerTheme/node1_base.dart | 8 - .../desc_zh-CN.json | 18 ++ .../node1_base.dart | 8 +- .../lib/ProxyWidget/Expanded/desc_zh-CN.json | 22 ++ .../lib/ProxyWidget/Expanded/node1_base.dart | 9 - .../lib/ProxyWidget/Flexible/desc_zh-CN.json | 23 +++ .../lib/ProxyWidget/Flexible/node1_base.dart | 10 - .../lib/ProxyWidget/IconTheme/desc_zh-CN.json | 18 ++ .../lib/ProxyWidget/IconTheme/node1_base.dart | 7 - .../InheritedModel/desc_zh-CN.json | 19 ++ .../lib/ProxyWidget/InheritedModel/node1.dart | 12 +- .../InheritedTheme/desc_zh-CN.json | 66 ++++++ .../InheritedTheme/node1_base.dart | 13 +- .../InheritedWidget/desc_zh-CN.json | 36 ++++ .../InheritedWidget/node1_base.dart | 15 +- .../InheritedWidget/node2_use.dart | 2 + .../lib/ProxyWidget/KeepAlive/desc_zh-CN.json | 20 ++ .../lib/ProxyWidget/KeepAlive/node1_base.dart | 12 +- .../lib/ProxyWidget/LayoutId/desc_zh-CN.json | 19 ++ .../lib/ProxyWidget/LayoutId/node1_base.dart | 9 - .../ProxyWidget/ListTileTheme/desc_zh-CN.json | 18 ++ .../ProxyWidget/ListTileTheme/node1_base.dart | 8 +- .../MaterialBannerTheme/desc_zh-CN.json | 18 ++ .../MaterialBannerTheme/node1_base.dart | 8 +- .../ProxyWidget/MediaQuery/desc_zh-CN.json | 18 ++ .../ProxyWidget/MediaQuery/node1_base.dart | 7 - .../ParentDataWidget/desc_zh-CN.json | 23 +++ .../ParentDataWidget/node1_base.dart | 10 +- .../PopupMenuTheme/desc_zh-CN.json | 18 ++ .../PopupMenuTheme/node1_base.dart | 8 +- .../ProxyWidget/Positioned/desc_zh-CN.json | 26 +++ .../ProxyWidget/Positioned/node1_base.dart | 11 - .../PrimaryScrollController/desc_zh-CN.json | 23 +++ .../PrimaryScrollController/node1_base.dart | 9 +- .../ScrollConfiguration/desc_zh-CN.json | 24 +++ .../ScrollConfiguration/node1_base.dart | 10 +- .../ProxyWidget/SliderTheme/desc_zh-CN.json | 27 +++ .../ProxyWidget/SliderTheme/node1_base.dart | 8 - .../ProxyWidget/SliderTheme/node2_diy.dart | 10 +- .../lib/ProxyWidget/TableCell/desc_zh-CN.json | 19 ++ .../lib/ProxyWidget/TableCell/node1_base.dart | 9 +- .../ToggleButtonsTheme/desc_zh-CN.json | 18 ++ .../ToggleButtonsTheme/node1_base.dart | 8 +- .../ProxyWidget/TooltipTheme/desc_zh-CN.json | 18 ++ .../ProxyWidget/TooltipTheme/node1_base.dart | 8 +- .../AbsorbPointer/desc_zh-CN.json | 25 +++ .../AbsorbPointer/node1_base.dart | 11 +- .../Align/desc_zh-CN.json | 32 +++ .../Align/node1_base.dart | 10 +- .../Align/node2_other.dart | 10 +- .../AnimatedSize/desc_zh-CN.json | 22 ++ .../AnimatedSize/node1_base.dart | 12 -- .../AnnotatedRegion/desc_zh-CN.json | 20 ++ .../AnnotatedRegion/node1_base.dart | 11 +- .../AspectRatio/desc_zh-CN.json | 19 ++ .../AspectRatio/node1_base.dart | 9 +- .../BackdropFilter/desc_zh-CN.json | 24 +++ .../BackdropFilter/node1_base.dart | 10 - .../Baseline/desc_zh-CN.json | 20 ++ .../Baseline/node1_base.dart | 12 +- .../Center/desc_zh-CN.json | 18 ++ .../Center/node1_base.dart | 8 - .../ClipOval/desc_zh-CN.json | 24 +++ .../ClipOval/node1_base.dart | 9 - .../ClipPath/desc_zh-CN.json | 24 +++ .../ClipPath/node1_base.dart | 9 - .../ClipRRect/desc_zh-CN.json | 25 +++ .../ClipRRect/node1_base.dart | 10 - .../ClipRect/desc_zh-CN.json | 24 +++ .../ClipRect/node1_base.dart | 9 - .../ColorFiltered/desc_zh-CN.json | 22 ++ .../ColorFiltered/node1_base.dart | 8 - .../ColoredBox/desc_zh-CN.json | 19 ++ .../ColoredBox/node1_base.dart | 9 +- .../desc_zh-CN.json | 26 +++ .../node1_base.dart | 15 +- .../CompositedTransformTarget/desc_zh-CN.json | 22 ++ .../CompositedTransformTarget/node1_base.dart | 10 +- .../ConstrainedBox/desc_zh-CN.json | 26 +++ .../ConstrainedBox/node1_base.dart | 12 -- .../desc_zh-CN.json | 18 ++ .../node1_base.dart | 9 +- .../CustomPaint/desc_zh-CN.json | 25 +++ .../CustomPaint/node1_clock.dart | 9 +- .../CustomPaint/node2_bezier.dart | 9 +- .../CustomSingleChildLayout/desc_zh-CN.json | 25 +++ .../CustomSingleChildLayout/node1_base.dart | 10 +- .../CustomSingleChildLayout/node2_offset.dart | 8 - .../DecoratedBox/desc_zh-CN.json | 55 +++++ .../DecoratedBox/node1_base.dart | 9 - .../DecoratedBox/node2_image.dart | 9 - .../DecoratedBox/node3_border.dart | 8 +- .../DecoratedBox/node4_shape.dart | 8 +- .../DecoratedBox/node5_line.dart | 8 +- .../DecoratedBox/node6_flutterLogo.dart | 8 +- .../FadeTransition/desc_zh-CN.json | 22 ++ .../FadeTransition/node1_base.dart | 9 - .../FittedBox/desc_zh-CN.json | 20 ++ .../FittedBox/node1_base.dart | 9 - .../FractionalTranslation/desc_zh-CN.json | 19 ++ .../FractionalTranslation/node1_base.dart | 9 +- .../FractionallySizedBox/desc_zh-CN.json | 21 ++ .../FractionallySizedBox/node1_base.dart | 10 - .../IgnorePointer/desc_zh-CN.json | 25 +++ .../IgnorePointer/node1_base.dart | 11 +- .../ImageFiltered/desc_zh-CN.json | 36 ++++ .../ImageFiltered/node1_blur.dart | 9 +- .../ImageFiltered/node2_color.dart | 8 +- .../ImageFiltered/node3_matrix.dart | 8 +- .../IntrinsicHeight/desc_zh-CN.json | 19 ++ .../IntrinsicHeight/node1_base.dart | 8 - .../IntrinsicWidth/desc_zh-CN.json | 19 ++ .../IntrinsicWidth/node1_base.dart | 9 - .../LayoutBuilder/desc_zh-CN.json | 34 ++++ .../LayoutBuilder/node1_base.dart | 7 - .../LayoutBuilder/node2_fit.dart | 10 +- .../LayoutBuilder/node3_expend.dart | 8 +- .../LimitedBox/desc_zh-CN.json | 22 ++ .../{LimiteBox => LimitedBox}/node1_base.dart | 9 - .../OffStage/desc_zh-CN.json | 21 ++ .../OffStage/node1_base.dart | 8 - .../Opacity/desc_zh-CN.json | 22 ++ .../Opacity/node1_base.dart | 9 - .../OverflowBox/desc_zh-CN.json | 23 +++ .../OverflowBox/node1_base.dart | 13 -- .../Padding/desc_zh-CN.json | 37 ++++ .../Padding/node1_all.dart | 10 - .../Padding/node2_only.dart | 8 - .../Padding/node3_symmetric.dart | 8 - .../PhysicalModel/desc_zh-CN.json | 27 +++ .../PhysicalModel/node1_base.dart | 14 +- .../PhysicalShape/desc_zh-CN.json | 23 +++ .../PhysicalShape/node1_base.dart | 13 +- .../RepaintBoundary/desc_zh-CN.json | 26 +++ .../RepaintBoundary/node1_base.dart | 9 +- .../RepaintBoundary/node2_save.dart | 8 +- .../RotatedBox/desc_zh-CN.json | 19 ++ .../RotatedBox/node1_base.dart | 8 - .../ShaderMask/desc_zh-CN.json | 32 +++ .../ShaderMask/node1_radial.dart | 12 +- .../ShaderMask/node2_linear.dart | 9 +- .../SizeChangedLayoutNotifier/desc_zh-CN.json | 18 ++ .../SizeChangedLayoutNotifier/node1_base.dart | 9 +- .../SizedBox/desc_zh-CN.json | 20 ++ .../SizedBox/node1_base.dart | 9 - .../SizedOverflowBox/desc_zh-CN.json | 20 ++ .../SizedOverflowBox/node1_base.dart | 9 - .../Transform/desc_zh-CN.json | 53 +++++ .../Transform/node1_skew.dart | 8 - .../Transform/node2_translation.dart | 9 - .../Transform/node3_scale.dart | 9 - .../Transform/node4_rotate.dart | 9 - .../Transform/node5_perspective.dart | 7 - .../UnConstrainedBox/desc_zh-CN.json | 22 ++ .../UnConstrainedBox/node1_base.dart | 9 - .../desc_zh-CN.json | 27 +++ .../node1_base.dart | 15 +- .../desc_zh-CN.json | 24 +++ .../node1_base.dart | 12 +- .../Sliver/CustomScrollView/desc_zh-CN.json | 25 +++ .../Sliver/CustomScrollView/node1_base.dart | 11 +- .../Sliver/DecoratedSliver/desc_zh-CN.json | 20 ++ .../lib/Sliver/DecoratedSliver/node1.dart | 11 +- .../Sliver/FlexibleSpaceBar/desc_zh-CN.json | 23 +++ .../Sliver/FlexibleSpaceBar/node1_base.dart | 13 +- .../Sliver/SliverAnimatedList/desc_zh-CN.json | 22 ++ .../Sliver/SliverAnimatedList/node1_base.dart | 9 +- .../lib/Sliver/SliverAppBar/desc_zh-CN.json | 33 +++ .../lib/Sliver/SliverAppBar/node1_base.dart | 20 +- .../desc_zh-CN.json | 22 ++ .../SliverConstrainedCrossAxis/node1.dart | 10 +- .../SliverCrossAxisExpanded/desc_zh-CN.json | 22 ++ .../Sliver/SliverCrossAxisExpanded/node1.dart | 10 +- .../SliverCrossAxisGroup/desc_zh-CN.json | 22 ++ .../Sliver/SliverCrossAxisGroup/node1.dart | 9 +- .../SliverFillRemaining/desc_zh-CN.json | 23 +++ .../SliverFillRemaining/node1_base.dart | 10 +- .../Sliver/SliverFillViewport/desc_zh-CN.json | 23 +++ .../Sliver/SliverFillViewport/node1_base.dart | 9 +- .../SliverFixedExtentList/desc_zh-CN.json | 23 +++ .../SliverFixedExtentList/node1_base.dart | 9 +- .../lib/Sliver/SliverGrid/desc_zh-CN.json | 20 ++ .../SliverIgnorePointer/desc_zh-CN.json | 22 ++ .../SliverIgnorePointer/node1_base.dart | 9 +- .../SliverLayoutBuilder/desc_zh-CN.json | 21 ++ .../SliverLayoutBuilder/node1_base.dart | 8 +- .../lib/Sliver/SliverList/desc_zh-CN.json | 22 ++ .../lib/Sliver/SliverList/node1_base.dart | 8 +- .../SliverMainAxisGroup/desc_zh-CN.json | 19 ++ .../lib/Sliver/SliverMainAxisGroup/node1.dart | 10 +- .../lib/Sliver/SliverOpacity/desc_zh-CN.json | 19 ++ .../lib/Sliver/SliverOpacity/node1_base.dart | 9 +- .../SliverOverlapAbsorber/desc_zh-CN.json | 23 +++ .../SliverOverlapAbsorber/node1_base.dart | 9 - .../SliverOverlapInjector/desc_zh-CN.json | 23 +++ .../SliverOverlapInjector/node1_base.dart | 9 - .../lib/Sliver/SliverPadding/desc_zh-CN.json | 19 ++ .../lib/Sliver/SliverPadding/node1_base.dart | 9 +- .../SliverPersistentHeader/desc_zh-CN.json | 20 ++ .../SliverPersistentHeader/node1_base.dart | 11 +- .../SliverPrototypeExtentList/desc_zh-CN.json | 22 ++ .../SliverPrototypeExtentList/node1_base.dart | 10 +- .../Sliver/SliverToBoxAdapter/desc_zh-CN.json | 18 ++ .../Sliver/SliverToBoxAdapter/node1_base.dart | 8 +- .../SliverWithKeepAliveWidget/desc_zh-CN.json | 25 +++ .../SliverWithKeepAliveWidget/node1_base.dart | 12 +- .../AlignTransition/desc_zh-CN.json | 22 ++ .../AlignTransition/node1_base.dart | 10 +- .../AnimatedAlign/desc_zh-CN.json | 26 +++ .../AnimatedAlign/node1_base.dart | 13 +- .../AnimatedBuilder/desc_zh-CN.json | 20 ++ .../AnimatedBuilder/node1_base.dart | 13 +- .../AnimatedContainer/desc_zh-CN.json | 30 +++ .../AnimatedContainer/node1_base.dart | 21 +- .../AnimatedCrossFade/desc_zh-CN.json | 30 +++ .../AnimatedCrossFade/node1_base.dart | 12 -- .../AnimatedCrossFade/node2_curve.dart | 10 - .../AnimatedDefaultTextStyle/desc_zh-CN.json | 29 +++ .../AnimatedDefaultTextStyle/node1_base.dart | 17 +- .../AnimatedList/desc_zh-CN.json | 23 +++ .../AnimatedList/node1_base.dart | 14 +- .../AnimatedModalBarrier/desc_zh-CN.json | 19 ++ .../AnimatedModalBarrier/node1_base.dart | 12 +- .../AnimatedOpacity/desc_zh-CN.json | 25 +++ .../AnimatedOpacity/node1_base.dart | 13 +- .../AnimatedPadding/desc_zh-CN.json | 22 ++ .../AnimatedPadding/node1_base.dart | 13 +- .../AnimatedPhysicalModel/desc_zh-CN.json | 26 +++ .../AnimatedPhysicalModel/node1_base.dart | 17 +- .../AnimatedPositioned/desc_zh-CN.json | 29 +++ .../AnimatedPositioned/node1_base.dart | 16 +- .../desc_zh-CN.json | 28 +++ .../node1_base.dart | 16 +- .../AnimatedSwitcher/desc_zh-CN.json | 23 +++ .../AnimatedSwitcher/node1_base.dart | 13 -- .../AnimatedTheme/desc_zh-CN.json | 22 ++ .../AnimatedTheme/node1_base.dart | 12 +- .../lib/StatefulWidget/AppBar/desc_zh-CN.json | 31 +++ .../lib/StatefulWidget/AppBar/node1_base.dart | 15 +- .../lib/StatefulWidget/AppBar/node2_tab.dart | 9 +- .../AutomaticKeepAlive/desc_zh-CN.json | 26 +++ .../AutomaticKeepAlive/node1_base.dart | 12 +- .../BottomAppBar/desc_zh-CN.json | 22 ++ .../BottomAppBar/node1_base.dart | 12 +- .../BottomNavigationBar/desc_zh-CN.json | 36 ++++ .../BottomNavigationBar/node1_base.dart | 20 +- .../BottomNavigationBar/node2_page.dart | 9 +- .../StatefulWidget/Checkbox/desc_zh-CN.json | 29 +++ .../StatefulWidget/Checkbox/node1_base.dart | 12 +- .../Checkbox/node2_tristate.dart | 13 +- .../CircularProgressIndicator/desc_zh-CN.json | 24 +++ .../CircularProgressIndicator/node1_base.dart | 12 +- .../desc_zh-CN.json | 22 ++ .../node1_base.dart | 10 +- .../CupertinoApp/desc_zh-CN.json | 24 +++ .../CupertinoApp/node1_base.dart | 10 - .../CupertinoButton/desc_zh-CN.json | 23 +++ .../CupertinoButton/node1_base.dart | 14 +- .../CupertinoContextMenu/desc_zh-CN.json | 20 ++ .../CupertinoContextMenu/node1_base.dart | 10 +- .../desc_zh-CN.json | 21 ++ .../node1_base.dart | 12 +- .../CupertinoDatePicker/desc_zh-CN.json | 25 +++ .../CupertinoDatePicker/node1_base.dart | 16 +- .../CupertinoNavigationBar/desc_zh-CN.json | 23 +++ .../CupertinoNavigationBar/node1_base.dart | 14 +- .../CupertinoPageScaffold/desc_zh-CN.json | 20 ++ .../CupertinoPageScaffold/node1_base.dart | 11 +- .../CupertinoPicker/desc_zh-CN.json | 24 +++ .../CupertinoPicker/node1_base.dart | 14 -- .../CupertinoScrollbar/desc_zh-CN.json | 23 +++ .../CupertinoScrollbar/node1_base.dart | 10 +- .../CupertinoSegmentedControl/desc_zh-CN.json | 34 ++++ .../CupertinoSegmentedControl/node1_base.dart | 13 +- .../node2_color.dart | 13 +- .../CupertinoSlider/desc_zh-CN.json | 26 +++ .../CupertinoSlider/node1_base.dart | 17 +- .../desc_zh-CN.json | 26 +++ .../node1_base.dart | 14 +- .../CupertinoSwitch/desc_zh-CN.json | 20 ++ .../CupertinoSwitch/node1_base.dart | 11 +- .../CupertinoTabBar/desc_zh-CN.json | 25 +++ .../CupertinoTabBar/node1_base.dart | 16 +- .../CupertinoTabScaffold/desc_zh-CN.json | 21 ++ .../CupertinoTabScaffold/node1_base.dart | 11 - .../CupertinoTabView/desc_zh-CN.json | 24 +++ .../CupertinoTabView/node1_base.dart | 12 +- .../CupertinoTextField/desc_zh-CN.json | 40 ++++ .../CupertinoTextField/node1_base.dart | 15 +- .../CupertinoTextField/node2_style.dart | 16 +- .../CupertinoTimerPicker/desc_zh-CN.json | 23 +++ .../CupertinoTimerPicker/node1_base.dart | 14 +- .../DateRangePickerDialog/desc_zh-CN.json | 32 +++ .../DateRangePickerDialog/node1_base.dart | 12 +- .../DateRangePickerDialog/node2_diy.dart | 8 +- .../DecoratedBoxTransition/desc_zh-CN.json | 20 ++ .../DecoratedBoxTransition/node1_base.dart | 11 +- .../DefaultTabController/desc_zh-CN.json | 23 +++ .../DefaultTabController/node1_base.dart | 11 +- .../desc_zh-CN.json | 26 +++ .../node1_base.dart | 14 +- .../Dismissible/desc_zh-CN.json | 31 +++ .../Dismissible/node1_base.dart | 13 -- .../Dismissible/node2_direction.dart | 9 - .../StatefulWidget/DragTarget/desc_zh-CN.json | 24 +++ .../StatefulWidget/DragTarget/node1_base.dart | 11 - .../StatefulWidget/Draggable/desc_zh-CN.json | 42 ++++ .../StatefulWidget/Draggable/node1_base.dart | 12 +- .../StatefulWidget/Draggable/node2_data.dart | 14 +- .../StatefulWidget/Draggable/node3_use.dart | 8 - .../DraggableScrollableSheet/desc_zh-CN.json | 25 +++ .../DraggableScrollableSheet/node1_base.dart | 13 +- .../DrawerController/desc_zh-CN.json | 25 +++ .../DrawerController/node1_base.dart | 13 +- .../DropdownButton/desc_zh-CN.json | 33 +++ .../DropdownButton/node1_base.dart | 13 -- .../DropdownButton/node2_style.dart | 12 +- .../DropdownButtonFormField/desc_zh-CN.json | 24 +++ .../DropdownButtonFormField/node1_base.dart | 15 +- .../DropdownMenu/desc_zh-CN.json | 43 +++- .../StatefulWidget/DropdownMenu/node1.dart | 15 +- .../StatefulWidget/DropdownMenu/node2.dart | 19 +- .../StatefulWidget/DropdownMenu/node3.dart | 9 +- .../EditableText/desc_zh-CN.json | 26 +++ .../EditableText/node1_base.dart | 13 +- .../ElevatedButton/desc_zh-CN.json | 34 ++++ .../ElevatedButton/node1_base.dart | 11 +- .../ElevatedButton/node2_style.dart | 12 +- .../StatefulWidget/ExpandIcon/desc_zh-CN.json | 26 +++ .../StatefulWidget/ExpandIcon/node1_base.dart | 14 +- .../ExpansionPanelList/desc_zh-CN.json | 21 ++ .../ExpansionPanelList/node1_base.dart | 12 +- .../ExpansionTile/desc_zh-CN.json | 24 +++ .../ExpansionTile/node1_base.dart | 14 +- .../lib/StatefulWidget/Form/desc_zh-CN.json | 20 ++ .../lib/StatefulWidget/Form/node1_base.dart | 11 +- .../StatefulWidget/FormField/desc_zh-CN.json | 26 +++ .../StatefulWidget/FormField/node1_base.dart | 15 +- .../FutureBuilder/desc_zh-CN.json | 20 ++ .../FutureBuilder/node1_base.dart | 11 +- .../desc_zh-CN.json | 22 ++ .../node1_base.dart | 13 +- .../lib/StatefulWidget/Hero/desc_zh-CN.json | 18 ++ .../lib/StatefulWidget/Hero/node1_base.dart | 8 - .../lib/StatefulWidget/Image/desc_zh-CN.json | 58 ++++++ .../lib/StatefulWidget/Image/node1_base.dart | 13 +- .../lib/StatefulWidget/Image/node2_fit.dart | 7 - .../StatefulWidget/Image/node3_alignment.dart | 8 - .../Image/node4_colorBlendMode.dart | 9 +- .../StatefulWidget/Image/node5_repeat.dart | 7 - .../Image/node6_centerSlice.dart | 12 +- .../lib/StatefulWidget/Ink/desc_zh-CN.json | 33 +++ .../lib/StatefulWidget/Ink/node1_base.dart | 13 +- .../lib/StatefulWidget/Ink/node2_image.dart | 8 +- .../InkResponse/desc_zh-CN.json | 36 ++++ .../InkResponse/node1_base.dart | 11 - .../InkResponse/node2_color.dart | 11 - .../StatefulWidget/InkWell/desc_zh-CN.json | 36 ++++ .../StatefulWidget/InkWell/node1_base.dart | 11 - .../StatefulWidget/InkWell/node2_color.dart | 11 - .../InputDecorator/desc_zh-CN.json | 20 ++ .../InputDecorator/node1_base.dart | 10 +- .../InteractiveViewer/desc_zh-CN.json | 45 +++++ .../InteractiveViewer/node1_base.dart | 17 +- .../InteractiveViewer/node2_constrained.dart | 8 +- .../InteractiveViewer/node3_controller.dart | 8 +- .../LicensePage/desc_zh-CN.json | 24 +++ .../LicensePage/node1_base.dart | 11 +- .../LinearProgressIndicator/desc_zh-CN.json | 24 +++ .../LinearProgressIndicator/node1_base.dart | 12 +- .../ListWheelScrollView/desc_zh-CN.json | 24 +++ .../ListWheelScrollView/node1_base.dart | 11 +- .../LongPressDraggable/desc_zh-CN.json | 28 +++ .../LongPressDraggable/node1_base.dart | 15 +- .../StatefulWidget/Material/desc_zh-CN.json | 29 +++ .../StatefulWidget/Material/node1_base.dart | 13 +- .../StatefulWidget/Material/node2_shape.dart | 9 +- .../MaterialApp/desc_zh-CN.json | 24 +++ .../MaterialApp/node1_base.dart | 13 -- .../MergeableMaterial/desc_zh-CN.json | 22 ++ .../MergeableMaterial/node1_base.dart | 13 +- .../MonthPicker/desc_zh-CN.json | 54 +++++ .../MonthPicker/node1_base.dart | 26 +-- .../MouseRegion/desc_zh-CN.json | 20 ++ .../MouseRegion/node1_base.dart | 10 +- .../NavigationRail/desc_zh-CN.json | 50 +++++ .../NavigationRail/node1_base.dart | 11 +- .../NavigationRail/node2_extend.dart | 11 +- .../NavigationRail/node3_dark.dart | 17 +- .../StatefulWidget/Navigator/desc_zh-CN.json | 21 ++ .../StatefulWidget/Navigator/node1_base.dart | 13 +- .../NestedScrollView/desc_zh-CN.json | 27 +++ .../NestedScrollView/node1_base.dart | 14 -- .../OutlinedButton/desc_zh-CN.json | 34 ++++ .../OutlinedButton/node1_base.dart | 11 +- .../OutlinedButton/node2_style.dart | 12 +- .../StatefulWidget/Overlay/desc_zh-CN.json | 21 ++ .../StatefulWidget/Overlay/node1_base.dart | 9 +- .../StatefulWidget/PageView/desc_zh-CN.json | 34 ++++ .../StatefulWidget/PageView/node1_base.dart | 9 - .../PageView/node2_direction.dart | 9 - .../PageView/node3_controller.dart | 8 - .../PaginatedDataTable/desc_zh-CN.json | 30 +++ .../PaginatedDataTable/node1_base.dart | 20 +- .../PopupMenuButton/desc_zh-CN.json | 24 +++ .../PopupMenuButton/node1_base.dart | 14 -- .../PopupMenuDivider/desc_zh-CN.json | 21 ++ .../PopupMenuDivider/node1_base.dart | 9 +- .../PositionedTransition/desc_zh-CN.json | 20 ++ .../PositionedTransition/node1_base.dart | 11 +- .../lib/StatefulWidget/Radio/desc_zh-CN.json | 21 ++ .../lib/StatefulWidget/Radio/node1_base.dart | 12 +- .../RangeSlider/desc_zh-CN.json | 27 +++ .../RangeSlider/node1_base.dart | 17 +- .../StatefulWidget/RawChip/desc_zh-CN.json | 43 ++++ .../StatefulWidget/RawChip/node1_press.dart | 15 -- .../StatefulWidget/RawChip/node2_select.dart | 13 -- .../RawGestureDetector/desc_zh-CN.json | 20 ++ .../RawGestureDetector/node1_base.dart | 11 +- .../RawKeyboardListener/desc_zh-CN.json | 21 ++ .../RawKeyboardListener/node1_base.dart | 11 +- .../RawMaterialButton/desc_zh-CN.json | 37 ++++ .../RawMaterialButton/node1_base.dart | 15 +- .../RawMaterialButton/node2_shape.dart | 9 - .../RefreshIndicator/desc_zh-CN.json | 20 ++ .../RefreshIndicator/node1_base.dart | 13 +- .../desc_zh-CN.json | 21 ++ .../node1_base.dart | 11 - .../ReorderableListView/desc_zh-CN.json | 29 +++ .../ReorderableListView/node1_base.dart | 12 +- .../ReorderableListView/node2_direction.dart | 9 - .../RotationTransition/desc_zh-CN.json | 19 ++ .../RotationTransition/node1_base.dart | 9 - .../StatefulWidget/Scaffold/desc_zh-CN.json | 29 +++ .../StatefulWidget/Scaffold/node1_base.dart | 16 +- .../ScaleTransition/desc_zh-CN.json | 19 ++ .../ScaleTransition/node1_base.dart | 10 +- .../StatefulWidget/Scrollable/desc_zh-CN.json | 25 +++ .../StatefulWidget/Scrollable/node1_base.dart | 11 - .../StatefulWidget/Scrollbar/desc_zh-CN.json | 23 +++ .../StatefulWidget/Scrollbar/node1_base.dart | 10 +- .../SelectableText/desc_zh-CN.json | 32 +++ .../SelectableText/node1_base.dart | 15 +- .../SelectableText/node2_align.dart | 10 +- .../SizeTransition/desc_zh-CN.json | 20 ++ .../SizeTransition/node1_base.dart | 11 +- .../SlideTransition/desc_zh-CN.json | 20 ++ .../SlideTransition/node1_base.dart | 11 +- .../lib/StatefulWidget/Slider/desc_zh-CN.json | 37 ++++ .../lib/StatefulWidget/Slider/node1_base.dart | 14 +- .../StatefulWidget/Slider/node2_lable.dart | 12 +- .../StatefulBuilder/desc_zh-CN.json | 23 +++ .../StatefulBuilder/node1_base.dart | 9 +- .../StatusTransitionWidget/desc_zh-CN.json | 19 ++ .../StatusTransitionWidget/node1_base.dart | 12 +- .../StatefulWidget/Stepper/desc_zh-CN.json | 29 +++ .../StatefulWidget/Stepper/node1_base.dart | 13 +- .../StatefulWidget/Stepper/node2_type.dart | 8 - .../StreamBuilder/desc_zh-CN.json | 20 ++ .../StreamBuilder/node1_base.dart | 10 - .../lib/StatefulWidget/Switch/desc_zh-CN.json | 34 ++++ .../lib/StatefulWidget/Switch/node1_base.dart | 13 -- .../StatefulWidget/Switch/node2_image.dart | 9 - .../StatefulWidget/TabBarView/desc_zh-CN.json | 20 ++ .../StatefulWidget/TabBarView/node1_base.dart | 10 +- .../TableRowInkWell/desc_zh-CN.json | 22 ++ .../TableRowInkWell/node1_base.dart | 12 -- .../StatefulWidget/TextButton/desc_zh-CN.json | 33 +++ .../StatefulWidget/TextButton/node1_base.dart | 10 +- .../TextButton/node2_style.dart | 11 +- .../StatefulWidget/TextField/desc_zh-CN.json | 52 +++++ .../StatefulWidget/TextField/node1_base.dart | 14 +- .../TextField/node2_cursor.dart | 15 +- .../TextField/node3_decoration.dart | 18 +- .../TextFormField/desc_zh-CN.json | 24 +++ .../TextFormField/node1_base.dart | 12 +- .../StatefulWidget/Tooltip/desc_zh-CN.json | 32 +++ .../StatefulWidget/Tooltip/node1_base.dart | 15 +- .../Tooltip/node2_decoration.dart | 9 - .../TweenAnimationBuilder/desc_zh-CN.json | 23 +++ .../TweenAnimationBuilder/node1_base.dart | 16 +- .../UniqueWidget/desc_zh-CN.json | 18 ++ .../UniqueWidget/node1_base.dart | 10 +- .../ValueListenableBuilder/desc_zh-CN.json | 20 ++ .../ValueListenableBuilder/node1_base.dart | 10 +- .../WidgetInspector/desc_zh-CN.json | 19 ++ .../WidgetInspector/node1_base.dart | 9 +- .../StatefulWidget/WidgetsApp/desc_zh-CN.json | 24 +++ .../StatefulWidget/WidgetsApp/node1_base.dart | 11 +- .../WillPopScope/desc_zh-CN.json | 19 ++ .../WillPopScope/node1_base.dart | 9 - .../StatefulWidget/YearPicker/desc_zh-CN.json | 24 +++ .../StatefulWidget/YearPicker/node1_base.dart | 11 +- .../AboutDialog/desc_zh-CN.json | 22 ++ .../AboutDialog/node1_base.dart | 13 +- .../AboutListTile/desc_zh-CN.json | 26 +++ .../AboutListTile/node1_base.dart | 14 +- .../ActionChip/desc_zh-CN.json | 26 +++ .../ActionChip/node1_base.dart | 11 +- .../AlertDialog/desc_zh-CN.json | 27 +++ .../AlertDialog/node1_base.dart | 19 +- .../AnimatedIcon/desc_zh-CN.json | 21 ++ .../AnimatedIcon/node1_base.dart | 12 +- .../Autocomplete/desc_zh-CN.json | 31 +++ .../Autocomplete/node1_base.dart | 9 +- .../Autocomplete/node2_type.dart | 10 +- .../BackButton/desc_zh-CN.json | 21 ++ .../BackButton/node1_base.dart | 11 +- .../BackButtonIcon/desc_zh-CN.json | 18 ++ .../BackButtonIcon/node1_base.dart | 8 +- .../lib/StatelessWidget/Badge/desc_zh-CN.json | 40 ++++ .../lib/StatelessWidget/Badge/node_1.dart | 11 +- .../lib/StatelessWidget/Badge/node_2.dart | 12 +- .../lib/StatelessWidget/Badge/node_3.dart | 9 +- .../StatelessWidget/Banner/desc_zh-CN.json | 22 ++ .../StatelessWidget/Banner/node1_base.dart | 12 +- .../BottomSheet/desc_zh-CN.json | 22 ++ .../BottomSheet/node1_base.dart | 13 +- .../BoxScrollView/desc_zh-CN.json | 27 +++ .../BoxScrollView/node1_base.dart | 17 +- .../StatelessWidget/Builder/desc_zh-CN.json | 19 ++ .../StatelessWidget/Builder/node1_base.dart | 8 - .../StatelessWidget/ButtonBar/desc_zh-CN.json | 27 +++ .../StatelessWidget/ButtonBar/node1_base.dart | 9 +- .../ButtonBar/node2_padding.dart | 9 +- .../lib/StatelessWidget/Card/desc_zh-CN.json | 31 +++ .../lib/StatelessWidget/Card/node1_base.dart | 12 +- .../lib/StatelessWidget/Card/node2_shape.dart | 11 +- .../CheckboxListTile/desc_zh-CN.json | 37 ++++ .../CheckboxListTile/node1_base.dart | 12 -- .../CheckboxListTile/node2_select.dart | 7 - .../CheckboxListTile/node3_dense.dart | 7 - .../CheckedModeBanner/desc_zh-CN.json | 18 ++ .../CheckedModeBanner/node1_base.dart | 8 +- .../lib/StatelessWidget/Chip/desc_zh-CN.json | 45 +++++ .../lib/StatelessWidget/Chip/node1_base.dart | 10 - .../lib/StatelessWidget/Chip/node2_color.dart | 9 - .../StatelessWidget/Chip/node3_delete.dart | 9 - .../ChoiceChip/desc_zh-CN.json | 27 +++ .../ChoiceChip/node1_base.dart | 11 +- .../CircleAvatar/desc_zh-CN.json | 24 +++ .../CircleAvatar/node1_base.dart | 14 +- .../CloseButton/desc_zh-CN.json | 21 ++ .../CloseButton/node1_base.dart | 11 +- .../CloseButtonIcon/desc_zh-CN.json | 18 ++ .../CloseButtonIcon/node1_base.dart | 8 +- .../StatelessWidget/Container/desc_zh-CN.json | 45 ++++- .../StatelessWidget/Container/node1_base.dart | 10 +- .../Container/node2_child.dart | 10 +- .../Container/node3_alignment.dart | 8 +- .../Container/node4_decoration.dart | 10 +- .../Container/node5_transform.dart | 9 +- .../Container/node6_constraints.dart | 10 +- .../CupertinoActionSheet/desc_zh-CN.json | 21 ++ .../CupertinoActionSheet/node1_base.dart | 11 +- .../desc_zh-CN.json | 20 ++ .../node1_base.dart | 10 +- .../CupertinoAlertDialog/desc_zh-CN.json | 20 ++ .../CupertinoAlertDialog/node1_base.dart | 10 +- .../CupertinoDialogAction/desc_zh-CN.json | 22 ++ .../CupertinoDialogAction/node1_base.dart | 12 +- .../desc_zh-CN.json | 21 ++ .../node1_base.dart | 11 +- .../desc_zh-CN.json | 19 ++ .../node1_base.dart | 9 +- .../CupertinoPageTransition/desc_zh-CN.json | 21 ++ .../CupertinoPageTransition/node1_base.dart | 11 +- .../CupertinoPopupSurface/desc_zh-CN.json | 20 ++ .../CupertinoPopupSurface/node1_base.dart | 12 +- .../CupertinoTheme/desc_zh-CN.json | 28 +++ .../CupertinoTheme/node1_base.dart | 8 +- .../CupertinoTheme/node2_use.dart | 9 +- .../StatelessWidget/DataTable/desc_zh-CN.json | 28 +++ .../StatelessWidget/DataTable/node1_base.dart | 10 +- .../DataTable/node2_operation.dart | 10 - .../StatelessWidget/DayPicker/desc_zh-CN.json | 61 ++++++ .../StatelessWidget/DayPicker/node1_base.dart | 35 +--- .../StatelessWidget/Dialog/desc_zh-CN.json | 21 ++ .../StatelessWidget/Dialog/node1_base.dart | 13 +- .../StatelessWidget/Divider/desc_zh-CN.json | 31 +++ .../StatelessWidget/Divider/node1_base.dart | 10 +- .../StatelessWidget/Divider/node2_height.dart | 10 +- .../desc_zh-CN.json | 19 ++ .../node1_base.dart | 9 +- .../StatelessWidget/Drawer/desc_zh-CN.json | 22 ++ .../StatelessWidget/Drawer/node1_base.dart | 10 +- .../DrawerButton/desc_zh-CN.json | 23 +++ .../DrawerButton/node1_base.dart | 10 +- .../DrawerButtonIcon/desc_zh-CN.json | 18 ++ .../DrawerButtonIcon/node1_base.dart | 8 +- .../DrawerHeader/desc_zh-CN.json | 21 ++ .../DrawerHeader/node1_base.dart | 11 - .../EndDrawerButton/desc_zh-CN.json | 23 +++ .../EndDrawerButton/node1_base.dart | 10 +- .../EndDrawerButtonIcon/desc_zh-CN.json | 18 ++ .../EndDrawerButtonIcon/node1_base.dart | 8 +- .../FadeInImage/desc_zh-CN.json | 28 +++ .../FadeInImage/node1_base.dart | 18 +- .../FilterChip/desc_zh-CN.json | 27 +++ .../FilterChip/node1_base.dart | 11 +- .../FlatButton/desc_zh-CN.json | 58 ++++++ .../FlatButton/node1_base.dart | 26 --- .../FloatingActionButton/desc_zh-CN.json | 37 ++++ .../FloatingActionButton/node1_base.dart | 13 +- .../FloatingActionButton/node2_mini.dart | 8 +- .../FloatingActionButton/node3_shape.dart | 8 +- .../FlutterLogo/desc_zh-CN.json | 27 +++ .../FlutterLogo/node1_base.dart | 9 +- .../FlutterLogo/node2_style.dart | 9 +- .../GestureDetector/desc_zh-CN.json | 44 ++++ .../GestureDetector/node1_base.dart | 15 -- .../GestureDetector/node2_tap.dart | 10 - .../GestureDetector/node3_pan.dart | 12 -- .../StatelessWidget/GridPaper/desc_zh-CN.json | 30 +++ .../StatelessWidget/GridPaper/node1_base.dart | 9 - .../GridPaper/node2_divisions.dart | 11 +- .../StatelessWidget/GridTile/desc_zh-CN.json | 20 ++ .../StatelessWidget/GridTile/node1_base.dart | 9 - .../GridTileBar/desc_zh-CN.json | 22 ++ .../GridTileBar/node1_base.dart | 11 - .../StatelessWidget/GridView/desc_zh-CN.json | 53 +++++ .../{GirdView => GridView}/node1_base.dart | 0 .../node2_direction.dart | 0 .../{GirdView => GridView}/node3_extend.dart | 6 +- .../{GirdView => GridView}/node4_builder.dart | 0 .../HtmlElementView/desc_zh-CN.json | 19 ++ .../HtmlElementView/node1_base.dart | 10 +- .../lib/StatelessWidget/Icon/desc_zh-CN.json | 31 +++ .../lib/StatelessWidget/Icon/node1_base.dart | 9 - .../lib/StatelessWidget/Icon/node2_diy.dart | 7 - .../IconButton/desc_zh-CN.json | 22 ++ .../IconButton/node1_base.dart | 12 +- .../StatelessWidget/ImageIcon/desc_zh-CN.json | 24 +++ .../StatelessWidget/ImageIcon/node1_base.dart | 10 +- .../StatelessWidget/InputChip/desc_zh-CN.json | 33 +++ .../StatelessWidget/InputChip/node1_base.dart | 9 +- .../InputChip/node2_select.dart | 9 +- .../StatelessWidget/ListTile/desc_zh-CN.json | 41 ++++ .../StatelessWidget/ListTile/node1_base.dart | 12 -- .../ListTile/node2_select.dart | 8 - .../StatelessWidget/ListTile/node3_dense.dart | 7 - .../StatelessWidget/ListView/desc_zh-CN.json | 46 +++++ .../StatelessWidget/ListView/node1_base.dart | 10 +- .../ListView/node2_direction.dart | 10 - .../ListView/node3_builder.dart | 9 - .../ListView/node4_separated.dart | 8 - .../StatelessWidget/Listener/desc_zh-CN.json | 22 ++ .../StatelessWidget/Listener/node1_base.dart | 12 -- .../MaterialBanner/desc_zh-CN.json | 32 +++ .../MaterialBanner/node1_one_btn.dart | 12 -- .../MaterialBanner/node2_two_btn.dart | 10 +- .../MaterialButton/desc_zh-CN.json | 47 +++++ .../MaterialButton/node1_base.dart | 15 -- .../MaterialButton/node2_onLongPress.dart | 8 - .../MaterialButton/node3_shape.dart | 7 - .../ModalBarrier/desc_zh-CN.json | 19 ++ .../ModalBarrier/node1_base.dart | 12 +- .../NavigationToolbar/desc_zh-CN.json | 22 ++ .../NavigationToolbar/node1_base.dart | 12 +- .../NotificationListener/desc_zh-CN.json | 25 +++ .../NotificationListener/node1_base.dart | 8 +- .../NotificationListener/node2_update.dart | 8 +- .../OrientationBuilder/desc_zh-CN.json | 18 ++ .../OrientationBuilder/node1_base.dart | 8 +- .../OutlineButton/desc_zh-CN.json | 60 ++++++ .../OutlineButton/node1_base.dart | 28 --- .../PageStorage/desc_zh-CN.json | 23 +++ .../PageStorage/node1_base.dart | 10 +- .../Placeholder/desc_zh-CN.json | 28 +++ .../Placeholder/node1_base.dart | 9 +- .../Placeholder/node2_fallback.dart | 10 +- .../PositionedDirectional/desc_zh-CN.json | 25 +++ .../PositionedDirectional/node1_base.dart | 11 - .../PreferredSize/desc_zh-CN.json | 28 +++ .../PreferredSize/node1_base.dart | 8 +- .../PreferredSize/node2_adapter.dart | 8 +- .../RadioListTile/desc_zh-CN.json | 32 +++ .../RadioListTile/node1_base.dart | 13 -- .../RadioListTile/node2_dense.dart | 8 - .../RaisedButton/desc_zh-CN.json | 60 ++++++ .../RaisedButton/node1_base.dart | 31 +-- .../RawMagnifier/desc_zh-CN.json | 29 +++ .../RawMagnifier/node1_base.dart | 11 - .../RawMagnifier/node2_shape.dart | 9 +- .../StatelessWidget/SafeArea/desc_zh-CN.json | 22 ++ .../StatelessWidget/SafeArea/node1_base.dart | 13 +- .../ScrollView/desc_zh-CN.json | 29 +++ .../ScrollView/node1_base.dart | 16 +- .../SimpleDialog/desc_zh-CN.json | 24 +++ .../SimpleDialog/node1_base.dart | 16 +- .../SimpleDialogOption/desc_zh-CN.json | 19 ++ .../SimpleDialogOption/node1_base.dart | 9 +- .../SingleChildScrollView/desc_zh-CN.json | 27 +++ .../SingleChildScrollView/node1_base.dart | 8 - .../node2_direction.dart | 8 - .../StatelessWidget/SnackBar/desc_zh-CN.json | 27 +++ .../StatelessWidget/SnackBar/node1_base.dart | 15 +- .../SnackBarAction/desc_zh-CN.json | 21 ++ .../SnackBarAction/node1_base.dart | 12 +- .../StatelessWidget/Spacer/desc_zh-CN.json | 25 +++ .../StatelessWidget/Spacer/node1_base.dart | 8 - .../StatelessWidget/Spacer/node2_flex.dart | 8 - .../SwitchListTile/desc_zh-CN.json | 41 ++++ .../SwitchListTile/node1_base.dart | 15 +- .../SwitchListTile/node2_select.dart | 10 +- .../SwitchListTile/node3_dense.dart | 8 +- .../lib/StatelessWidget/Tab/desc_zh-CN.json | 21 ++ .../lib/StatelessWidget/Tab/node1_base.dart | 11 - .../StatelessWidget/TabBar/desc_zh-CN.json | 37 ++++ .../StatelessWidget/TabBar/node1_base.dart | 16 -- .../TabBar/node2_noShadow.dart | 8 - .../TabPageSelector/desc_zh-CN.json | 24 +++ .../TabPageSelector/node1_base.dart | 10 - .../TabPageSelectorIndicator/desc_zh-CN.json | 20 ++ .../TabPageSelectorIndicator/node1_base.dart | 11 +- .../lib/StatelessWidget/Text/desc_zh-CN.json | 72 +++++++ .../lib/StatelessWidget/Text/node1_base.dart | 14 -- .../StatelessWidget/Text/node2_shadows.dart | 9 - .../Text/node3_decoration.dart | 12 -- .../StatelessWidget/Text/node4_textAlign.dart | 9 - .../Text/node5_textDirection.dart | 10 - .../StatelessWidget/Text/node6_softWrap.dart | 10 - .../lib/StatelessWidget/Theme/desc_zh-CN.json | 29 +++ .../lib/StatelessWidget/Theme/node1_base.dart | 9 +- .../lib/StatelessWidget/Theme/node2_use.dart | 8 - .../lib/StatelessWidget/Title/desc_zh-CN.json | 20 ++ .../lib/StatelessWidget/Title/node1_base.dart | 10 +- .../ToggleButtons/desc_zh-CN.json | 43 ++++ .../ToggleButtons/node1_single.dart | 11 - .../ToggleButtons/node2_color.dart | 11 - .../ToggleButtons/node3_multi.dart | 7 - .../UserAccountsDrawerHeader/desc_zh-CN.json | 31 +++ .../UserAccountsDrawerHeader/node1_base.dart | 10 - .../UserAccountsDrawerHeader/node2_pro.dart | 10 - .../VerticalDivider/desc_zh-CN.json | 31 +++ .../VerticalDivider/node1_base.dart | 8 - .../VerticalDivider/node2_height.dart | 9 - .../Visibility/desc_zh-CN.json | 27 +++ .../Visibility/node1_base.dart | 9 - .../Visibility/node2_replacement.dart | 7 - .../widgets/lib/exp/render_object_unit.dart | 2 +- .../widgets/lib/exp/stateless_unit.dart | 8 +- 824 files changed, 9590 insertions(+), 4879 deletions(-) create mode 100644 desiredFileName.txt create mode 100644 l10n.yaml create mode 100644 lib/src/l10n/arb/app_en.arb create mode 100644 lib/src/l10n/arb/app_zh.arb create mode 100644 lib/src/l10n/gen/app_l10n.dart create mode 100644 lib/src/l10n/gen/app_l10n_en.dart create mode 100644 lib/src/l10n/gen/app_l10n_zh.dart create mode 100644 lib/src/navigation/model/app_tab.dart create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json rename modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/{LimiteBox => LimitedBox}/node1_base.dart (82%) create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json rename modules/widget_system/widgets/lib/StatelessWidget/{GirdView => GridView}/node1_base.dart (100%) rename modules/widget_system/widgets/lib/StatelessWidget/{GirdView => GridView}/node2_direction.dart (100%) rename modules/widget_system/widgets/lib/StatelessWidget/{GirdView => GridView}/node3_extend.dart (90%) rename modules/widget_system/widgets/lib/StatelessWidget/{GirdView => GridView}/node4_builder.dart (100%) create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json diff --git a/analysis_options.yaml b/analysis_options.yaml index 3dace6c2..632bf60b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -16,7 +16,7 @@ linter: analyzer: exclude: - - modules/widget_system/widgets/** +# - modules/widget_system/widgets/** diff --git a/assets/flutter.db b/assets/flutter.db index 2f32f67d47fc0d97ddd100f42473039880840cc3..5593b9422c4e4e1e70f05449a8b01d99919e6e33 100644 GIT binary patch delta 106567 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 Z+(<&W0o=tttTb>)R+!|&Y|3WSzW~q@EN=h+ delta 55773 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 O2Z|4f4(context, AppL10n)!; + } + + static const LocalizationsDelegate delegate = _AppL10nDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('zh') + ]; + + /// No description provided for @deskTabWidgets. + /// + /// In zh, this message translates to: + /// **'组件集录'** + String get deskTabWidgets; + + /// No description provided for @deskTabPainter. + /// + /// In zh, this message translates to: + /// **'绘制集录'** + String get deskTabPainter; + + /// No description provided for @deskTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识集锦'** + String get deskTabKnowledge; + + /// No description provided for @deskTabTools. + /// + /// In zh, this message translates to: + /// **'工具宝箱'** + String get deskTabTools; + + /// No description provided for @deskTabMine. + /// + /// In zh, this message translates to: + /// **'应用信息'** + String get deskTabMine; + + /// No description provided for @mobileTabWidgets. + /// + /// In zh, this message translates to: + /// **'组件'** + String get mobileTabWidgets; + + /// No description provided for @mobileTabPainter. + /// + /// In zh, this message translates to: + /// **'绘制'** + String get mobileTabPainter; + + /// No description provided for @mobileTabKnowledge. + /// + /// In zh, this message translates to: + /// **'知识'** + String get mobileTabKnowledge; + + /// No description provided for @mobileTabTools. + /// + /// In zh, this message translates to: + /// **'工具'** + String get mobileTabTools; + + /// No description provided for @mobileTabMine. + /// + /// In zh, this message translates to: + /// **'我的'** + String get mobileTabMine; +} + +class _AppL10nDelegate extends LocalizationsDelegate { + const _AppL10nDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppL10n(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode); + + @override + bool shouldReload(_AppL10nDelegate old) => false; +} + +AppL10n lookupAppL10n(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return AppL10nEn(); + case 'zh': return AppL10nZh(); + } + + throw FlutterError( + 'AppL10n.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/lib/src/l10n/gen/app_l10n_en.dart b/lib/src/l10n/gen/app_l10n_en.dart new file mode 100644 index 00000000..fa71578d --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_en.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppL10nEn extends AppL10n { + AppL10nEn([String locale = 'en']) : super(locale); + + @override + String get deskTabWidgets => 'Widgets'; + + @override + String get deskTabPainter => 'Painter'; + + @override + String get deskTabKnowledge => 'Knowledge'; + + @override + String get deskTabTools => 'Treasure'; + + @override + String get deskTabMine => 'About'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Painter'; + + @override + String get mobileTabKnowledge => 'Knowledge'; + + @override + String get mobileTabTools => 'Treasure'; + + @override + String get mobileTabMine => 'Mine'; +} diff --git a/lib/src/l10n/gen/app_l10n_zh.dart b/lib/src/l10n/gen/app_l10n_zh.dart new file mode 100644 index 00000000..6c2e1bbb --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_zh.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class AppL10nZh extends AppL10n { + AppL10nZh([String locale = 'zh']) : super(locale); + + @override + String get deskTabWidgets => '组件集录'; + + @override + String get deskTabPainter => '绘制集录'; + + @override + String get deskTabKnowledge => '知识集锦'; + + @override + String get deskTabTools => '工具宝箱'; + + @override + String get deskTabMine => '应用信息'; + + @override + String get mobileTabWidgets => '组件'; + + @override + String get mobileTabPainter => '绘制'; + + @override + String get mobileTabKnowledge => '知识'; + + @override + String get mobileTabTools => '工具'; + + @override + String get mobileTabMine => '我的'; +} diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart new file mode 100644 index 00000000..d6024a2c --- /dev/null +++ b/lib/src/navigation/model/app_tab.dart @@ -0,0 +1,42 @@ +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; +import 'package:tolyui/tolyui.dart'; + +enum AppTab { + widgets('/widget', TolyIcon.icon_layout), + painter('/painter', TolyIcon.dingzhi1), + knowledge('/knowledge', TolyIcon.icon_artifact), + tools('/tools', TolyIcon.icon_fast), + mine('/account', TolyIcon.yonghu); + + final IconData icon; + final String path; + + const AppTab(this.path, this.icon); + + String label(AppL10n l10n) { + if (kAppEnv.isDesktopUI) { + return switch (this) { + AppTab.widgets => l10n.deskTabWidgets, + AppTab.painter => l10n.deskTabPainter, + AppTab.knowledge => l10n.deskTabKnowledge, + AppTab.tools => l10n.deskTabTools, + AppTab.mine => l10n.deskTabMine, + }; + } + return switch (this) { + AppTab.widgets => l10n.mobileTabWidgets, + AppTab.painter => l10n.mobileTabPainter, + AppTab.knowledge => l10n.mobileTabKnowledge, + AppTab.tools => l10n.mobileTabTools, + AppTab.mine => l10n.mobileTabMine, + }; + } + + MenuMeta menu(AppL10n l10n) => MenuMeta( + label: label(l10n), + icon: icon, + router: path, + ); +} diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart index 911fbcd9..a37ff4c9 100644 --- a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -1,7 +1,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; +import 'package:flutter_unit/src/navigation/model/app_tab.dart'; import 'package:go_router/go_router.dart'; -import 'package:l10n/l10n.dart'; import 'package:tolyui_navigation/tolyui_navigation.dart'; import 'menu_bar_leading.dart'; import 'menu_bar_tail.dart'; @@ -55,19 +56,8 @@ class _DeskNavigationRailState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - String widget = context.l10n.widgetCollection; - String canvas = context.l10n.paintCollection; - String knowledge = context.l10n.knowledgeCollection; - String treasure = context.l10n.treasureTools; - String account = context.l10n.homeAccount; - - deskNavBarMenus = [ - MenuMeta(label: widget, icon: TolyIcon.icon_layout, router: '/widget'), - MenuMeta(label: canvas, icon: Icons.palette, router: '/painter'), - MenuMeta(label: knowledge, icon: TolyIcon.icon_artifact, router: '/knowledge'), - MenuMeta(label: treasure, icon: TolyIcon.icon_fast, router: '/tools'), - MenuMeta(label: account, icon: Icons.person, router: '/account'), - ]; + AppL10n l10n = AppL10n.of(context); + deskNavBarMenus = AppTab.values.map((e)=>e.menu(l10n)).toList(); } final RegExp _segReg = RegExp(r'/\w+'); diff --git a/lib/src/navigation/view/mobile/pure_bottom_bar.dart b/lib/src/navigation/view/mobile/pure_bottom_bar.dart index c1350345..608cf6dd 100644 --- a/lib/src/navigation/view/mobile/pure_bottom_bar.dart +++ b/lib/src/navigation/view/mobile/pure_bottom_bar.dart @@ -1,42 +1,49 @@ import 'package:flutter/material.dart'; +import '../../../l10n/gen/app_l10n.dart'; +import '../../model/app_tab.dart'; + class PureBottomBar extends StatelessWidget { - final int currentIndex; final ValueChanged? onTap; - final List labels; - final List icons; + final AppTab activeTab; + const PureBottomBar({ super.key, this.onTap, - required this.currentIndex, - required this.labels, - required this.icons, + required this.activeTab, + // required this.labels, + // required this.icons, }); - @override Widget build(BuildContext context) { + AppL10n l10n = AppL10n.of(context); return BottomNavigationBar( - onTap: onTap, - currentIndex: currentIndex, - elevation: 3, - // fixedColor: themeColor.activeColor, - type: BottomNavigationBarType.fixed, - iconSize: 22, - selectedItemColor: Theme - .of(context) - .primaryColor, - selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), - showUnselectedLabels: true, - showSelectedLabels: true, - // backgroundColor: themeColor.itemColor, - items: labels - .asMap() - .keys - .map((index) => - BottomNavigationBarItem(label: labels[index], icon: Icon(icons[index]))) - .toList(), - ); + onTap: onTap, + currentIndex: activeTab.index, + elevation: 3, + // fixedColor: themeColor.activeColor, + type: BottomNavigationBarType.fixed, + iconSize: 22, + selectedItemColor: Theme.of(context).primaryColor, + selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold), + showUnselectedLabels: true, + showSelectedLabels: true, + // backgroundColor: themeColor.itemColor, + items: AppTab.values + .map((AppTab tab) => BottomNavigationBarItem( + label: tab.label(l10n), + icon: Icon(tab.icon), + )) + .toList() + + // labels + // .asMap() + // .keys + // .map((index) => + // + // .toList(), + ); } } diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 2447b844..943d15cf 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -7,6 +7,7 @@ import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/src/navigation/model/app_tab.dart'; import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -28,7 +29,7 @@ class UnitPhoneNavigation extends StatefulWidget { class _UnitPhoneNavigationState extends State { //页面控制器,初始 0 final PageController _controller = PageController(); - ValueNotifier position = ValueNotifier(0); + ValueNotifier _activeTab = ValueNotifier(AppTab.widgets); // 禁止 PageView 滑动 final ScrollPhysics _neverScroll = const NeverScrollableScrollPhysics(); @@ -43,7 +44,7 @@ class _UnitPhoneNavigationState extends State { @override void dispose() { _controller.dispose(); //释放控制器 - position.dispose(); + _activeTab.dispose(); super.dispose(); } @@ -70,21 +71,6 @@ class _UnitPhoneNavigationState extends State { bool get isDark => Theme.of(context).brightness == Brightness.dark; - List get bottomBar => [ - context.l10n.homeTabWidget, - context.l10n.homeTabPaint, - context.l10n.homeTabKnowledge, - context.l10n.homeTabTools, - context.l10n.homeTabMine, - ]; - - List get bottomBarIcon => const [ - TolyIcon.icon_layout, - TolyIcon.dingzhi1, - TolyIcon.icon_artifact, - TolyIcon.icon_fast, - TolyIcon.yonghu, - ]; // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, // 使用 BlocBuilder 构建 @@ -92,12 +78,9 @@ class _UnitPhoneNavigationState extends State { return Stack( children: [ ValueListenableBuilder( - valueListenable: position, + valueListenable: _activeTab, builder: (_, value, __) => PureBottomBar( - currentIndex: value, - onTap: _onTapBottomNav, - labels: bottomBar, - icons: bottomBarIcon, + onTap: _onTapBottomNav, activeTab: value, )), const Positioned(right: 22, top: 8, child: UpdateRedPoint()) ], @@ -107,14 +90,7 @@ class _UnitPhoneNavigationState extends State { // 点击底部按钮事件,切换页面 void _onTapBottomNav(int index) { _controller.jumpToPage(index); - position.value = index; - if (!isDark) { - late Color color; - if (index != 0) { - color = Theme.of(context).primaryColor; - } else {} - } - + _activeTab.value = AppTab.values[index]; if (index == 3) { BlocProvider.of(context).add(const EventLoadLikeData()); } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart index 0500ac21..90a16b61 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart @@ -1,12 +1,7 @@ import 'package:fx_dao/fx_dao.dart'; -import 'package:sqflite/sqflite.dart'; import '../model/columnize.dart'; - - - - class ColumnizeDao with HasDatabase, DbTable{ @override String get createSql => ''; diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json new file mode 100644 index 00000000..b3f47f79 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "列布局", + "info": "排布方向为竖向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Column基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart index d35167f9..3192da8c 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart @@ -1,19 +1,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 96, -// "name": 'Column基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n" -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n" -// "【textBaseline】 : 文字基线 【TextBaseline】\n" -// "【verticalDirection】 : 竖直方向 【VerticalDirection】\n" -// "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】", -// } class CustomColumn extends StatelessWidget { const CustomColumn({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json new file mode 100644 index 00000000..9590d8d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "通用多子布局", + "info": "使用一个代理类对子组件集进行布局控制,子组件必须使用LayoutId组件进行标识。", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomMultiChildLayout基本使用", + "desc": [ + "【children】 : 子组件集 【List】", + "【delegate】 : 布局代理 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart index 04ac3426..965f3ce0 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/6 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 341, -// "name": 'CustomMultiChildLayout基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件集 【List】\n" -// "【delegate】 : 布局代理 【MultiChildLayoutDelegate】", -// } class CustomMultiChildLayoutDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json new file mode 100644 index 00000000..a117a24f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "弹性布局", + "info": "Row和Column的父类,Flutter中最强大的布局方式。可容纳多个组件,可与Spacer、Expended、Flexible组件联用进行灵活布局", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node1_direction.dart", + "name": "Flex的排布方向", + "desc": [ + "【children】 : 组件列表 【List】", + "【direction】 : 方向 【Axis】" + ] + }, + { + "file": "node2_mainAxisAlignment.dart", + "name": "Flex主轴对齐方式", + "desc": [ + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Flex交叉轴对齐方式", + "desc": [ + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_verticalDirection.dart", + "name": "Flex垂直方向顺序", + "desc": [ + "【verticalDirection】 : 垂直方向顺序 【VerticalDirection】" + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Flex水平方向顺序", + "desc": [ + "【textDirection】 : 水平方向顺序 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart index b740fea9..9e71c71b 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 94, -// "name": 'Flex的排布方向', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【direction】 : 方向 【Axis】", -// } class DirectionFlex extends StatelessWidget { DirectionFlex({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart index 15f2a22b..bf0be812 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 94, -// "name": 'Flex主轴对齐方式', -// "priority": 2, -// "subtitle": -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", -// } class MainAxisAlignmentFlex extends StatelessWidget { MainAxisAlignmentFlex({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart index 9071792b..4bb82235 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 94, -// "name": 'Flex交叉轴对齐方式', -// "priority": 3, -// "subtitle": -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", -// } class CrossAxisAlignmentFlex extends StatelessWidget { CrossAxisAlignmentFlex({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart index e3b2c6fe..912c7888 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 94, -// "name": 'Flex垂直方向顺序', -// "priority": 4, -// "subtitle": -// "【verticalDirection】 : 垂直方向顺序 【VerticalDirection】", -// } class VerticalDirectionFlex extends StatelessWidget { VerticalDirectionFlex({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart index e0abf3fb..b84de742 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 94, -// "name": 'Flex水平方向顺序', -// "priority": 5, -// "subtitle": -// "【textDirection】 : 水平方向顺序 【TextDirection】", -// } class TextDirectionFlex extends StatelessWidget { TextDirectionFlex({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json new file mode 100644 index 00000000..3e80aece --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "流动布局", + "info": "可容纳多个组件, 需要自己制定排布的代理,可以高强度自定义组件的排布,实现普通布局无法达到的效果。布局王者,当之无愧。", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flow圆形排布", + "desc": [ + "【children】 : 组件列表 【List】", + "【delegate】 : 代理 【FlowDelegate】" + ] + }, + { + "file": "node2_anim.dart", + "name": "Flow圆形与动画结合", + "desc": [ + "通过动画来更改周围组件的位置实现效果" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart index 585c2636..295349b1 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 99, -// "name": 'Flow圆形排布', -// "priority": 1, -// "subtitle": "【children】 : 组件列表 【List】\n" -// "【delegate】 : 代理 【FlowDelegate】", -// } + class CircleFlow extends StatelessWidget { CircleFlow({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart index 3ed205ee..a0af7cdc 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart @@ -3,14 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 99, -// "name": 'Flow圆形与动画结合', -// "priority": 2, -// "subtitle": -// "通过动画来更改周围组件的位置实现效果", -// } + class BurstFlow extends StatefulWidget { static final data = List.generate( diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json new file mode 100644 index 00000000..c3d9fe37 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "索引堆叠", + "info": "Stack组件的子类,可以堆叠多个组件,并通过index来指定展示的组件索引,其余的会被隐藏。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStack基本使用", + "desc": [ + "【children】 : 子组件列表 【Lis】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【index】 : 当前显示组件 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart index 0ce56b2f..b703c1ef 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 161, -// "name": 'IndexedStack基本使用', -// "priority":1 , -// "subtitle": -// "【children】 : 子组件列表 【Lis】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【index】 : 当前显示组件 【int】", -// } class CustomIndexedStack extends StatefulWidget { const CustomIndexedStack({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json new file mode 100644 index 00000000..f870d8fe --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "列表体", + "info": "将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListView。", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView的基本使用", + "desc": [ + "【mainAxis】 : 主轴方向 【Axis】", + "【reverse】: 是否反向 【bool】", + "【children】: 子组件集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart index ef5cda55..1529b12a 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/2 /// contact me by email 1981462002@qq.com -/// 说明: 342 ListBody 列表体 将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListVIew。 -// { -// "widgetId": 342, -// "name": "ListView的基本使用", -// "priority": 1, -// "subtitle": "【mainAxis】 : 主轴方向 【Axis】\n" -// "【reverse】: 是否反向 【bool】\n" -// "【children】: 子组件集 【List】", -// } class ListBodyDemo extends StatelessWidget { const ListBodyDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json new file mode 100644 index 00000000..ef14cc74 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "嵌套滑动视口", + "info": "在 NestedScrollView 中使用的视口,该视口持有 SliverOverlapAbsorberHandle,会在视口需要重新计算布局时通知它。例如,当滚动它时。", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 介绍", + "desc": [ + "【offset】 : *偏移 【ViewportOffset】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【crossAxisDirection】 : 交叉轴向 【AxisDirection】", + "【slivers】 : 子组件 【List】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【anchor】 : 锚点 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart index 9d98f3b5..5da8f860 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 344 NestedScrollViewViewport 嵌套滑动视口 -/// 在 NestedScrollView 中使用的视口,该视口持有 SliverOverlapAbsorberHandle,会在视口需要重新计算布局时通知它。例如,当滚动它时。 -/// -// { -// "widgetId": 344, -// "name": 'NestedScrollViewViewport 介绍', -// "priority": 1, -// "subtitle": -// "【offset】 : *偏移 【ViewportOffset】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【crossAxisDirection】 : 交叉轴向 【AxisDirection】\n" -// "【slivers】 : 子组件 【List】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【anchor】 : 锚点 【double】", -// } + class NestedScrollViewViewportDemo extends StatelessWidget { const NestedScrollViewViewportDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json new file mode 100644 index 00000000..6f1447ba --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "富文本", + "info": "可以容纳多种文字样式或各种组件的富文本组件,应用较为广泛。", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichText基本使用", + "desc": [ + "【text】 : 文字 【TextSpan】", + " 其他属性与Text相同,详见之。" + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText包含其他组件", + "desc": [ + "使用WidgetSpan来承载普通组件,作为RichText的内容" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart index 6c547777..7e24b821 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node1_base.dart @@ -4,15 +4,7 @@ import '../../utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 101, -// "name": 'RichText基本使用', -// "priority": 1, -// "subtitle": -// "【text】 : 文字 【TextSpan】\n" -// " 其他属性与Text相同,详见之。", -// } + class CustomRichText extends StatelessWidget { const CustomRichText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart index abe81349..dc9c9320 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/node2_widget.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 101, -// "name": 'RichText包含其他组件', -// "priority": 2, -// "subtitle": -// "使用WidgetSpan来承载普通组件,作为RichText的内容", -// } + class RichTextWithWidget extends StatelessWidget { const RichTextWithWidget({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json new file mode 100644 index 00000000..0221c6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "行布局", + "info": "排布方向为横向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Row基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart index aeae4429..dc090a77 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 95, -// "name": 'Row基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】\n" -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】\n" -// "【textBaseline】 : 文字基线 【TextBaseline】\n" -// "【verticalDirection】 : 竖直方向 【VerticalDirection】\n" -// "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】", -// } + class CustomRow extends StatelessWidget { const CustomRow({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json new file mode 100644 index 00000000..0939d13f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "收缩包围视图", + "info": "和 ScrollView 的 shrinkWrap 属性之间关联。ShrinkWrappingViewport 在主轴上调整自身的大小以适应它的子节点,在无边界约束的情况下使用。", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 介绍", + "desc": [ + "【offset】 : *偏移 【ViewportOffset】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【crossAxisDirection】 : 交叉轴向 【AxisDirection】", + "【slivers】 : 子组件 【List】", + "【clipBehavior】 : 裁剪行为 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart index 0580f29e..152e603f 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 343 ShrinkWrappingViewport 收缩包围视图 -/// 和 ScrollView 的 shrinkWrap 属性之间关联。ShrinkWrappingViewport 在主轴上调整自身的大小以适应它的子节点,在无边界约束的情况下使用。 -/// -// { -// "widgetId": 343, -// "name": 'NestedScrollViewViewport 介绍', -// "priority": 1, -// "subtitle": -// "【offset】 : *偏移 【ViewportOffset】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【crossAxisDirection】 : 交叉轴向 【AxisDirection】\n" -// "【slivers】 : 子组件 【List】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】", -// } + class ShrinkWrappingViewportDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json new file mode 100644 index 00000000..db057f07 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "堆叠布局", + "info": "可容纳多个组件,以堆叠的方式摆放子组件,后者居上。拥有alignment属性,可与Positioned组件联合使用,精确定位。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stack基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【textDirection】 : 孩子排布方向 【MainAxisAlignment】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【overflow】 : 溢出模式 【Overflow】", + "【fit】 : 适应模式 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Stack和Positioned结合使用", + "desc": [ + "Positioned组件只能用与Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart index c1fdee43..8304e309 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 97, -// "name": 'Stack基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【textDirection】 : 孩子排布方向 【MainAxisAlignment】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【overflow】 : 溢出模式 【Overflow】\n" -// "【fit】 : 适应模式 【StackFit】", -// } + class CustomStack extends StatelessWidget { const CustomStack({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart index c4a3985e..6ed8b5f0 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/node2_positioned.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 97, -// "name": 'Stack和Positioned结合使用', -// "priority": 2, -// "subtitle": -// "Positioned组件只能用与Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", -// } + class PositionedStack extends StatelessWidget { const PositionedStack({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json new file mode 100644 index 00000000..1837dac2 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "视口组件", + "info": "通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewport的基本使用", + "desc": [ + "【offset】 : *视口偏移量 【ViewportOffset】", + "【cacheExtentStyle】: 预加载类型 【CacheExtentStyle】", + "【cacheExtent】: 预加载量 【double】", + "【axisDirection】: 滑动方向 【AxisDirection】", + "【slivers】: 子Sliver组件集 【List】", + "【anchor】: 锚点 【double】", + "可以运行这些代码,查看ColorItem的构建情况,128个色条并非一次性全部构建。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart index 0cbbb1e1..24020556 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart @@ -4,20 +4,7 @@ import 'package:flutter/rendering.dart'; /// create by 张风捷特烈 on 2020/8/2 /// contact me by email 1981462002@qq.com -/// 说明: 340 Viewport 视口组件 通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。 -// { -// "widgetId": 340, -// "name": "Viewport的基本使用", -// "priority": 1, -// "subtitle": "【offset】 : *视口偏移量 【ViewportOffset】\n" -// "【cacheExtentStyle】: 预加载类型 【CacheExtentStyle】\n" -// "【cacheExtent】: 预加载量 【double】\n" -// "【axisDirection】: 滑动方向 【AxisDirection】\n" -// "【slivers】: 子Sliver组件集 【List】\n" -// "【anchor】: 锚点 【double】\n" -// "可以运行这些代码,查看ColorItem的构建情况,128个色条并非一次性全部构建。", -// } class ViewportDemo extends StatelessWidget { ViewportDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json new file mode 100644 index 00000000..98459ac5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "包裹布局", + "info": "可容纳多个组件,按照指定方向依次排布,可以很方便处理孩子的间距,当越界时可以自动换行。拥有主轴和交叉轴的对齐方式,比较灵活。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrap的基础用法", + "desc": [ + "【children】 : 组件列表 【List】", + "【spacing】 : 主轴条目间距 【double】", + "【runSpacing】 : 交叉轴条目间距 【double】", + "【direction】 : 主轴对齐 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap的alignment属性", + "desc": [ + "【alignment】 : 主轴对齐 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap的crossAxisAlignment属性", + "desc": [ + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap的textDirection属性", + "desc": [ + "【textDirection】 : 文字方向 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap的verticalDirection属性", + "desc": [ + "【verticalDirection】 : 竖直方向 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart index 894e2f71..f17bd199 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的基础用法', -// "priority": 1, -// "subtitle": -// "【children】 : 组件列表 【List】\n" -// "【spacing】 : 主轴条目间距 【double】\n" -// "【runSpacing】 : 交叉轴条目间距 【double】\n" -// "【direction】 : 主轴对齐 【Axis】", -// } + class DirectionWrap extends StatelessWidget { DirectionWrap({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart index b37f59d8..50a6d236 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的alignment属性', -// "priority": 2, -// "subtitle": -// "【alignment】 : 主轴对齐 【WrapAlignment】", -// } class WrapAlignmentWrap extends StatelessWidget { WrapAlignmentWrap({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart index 90b61ca9..8cd9cdbf 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的crossAxisAlignment属性', -// "priority": 3, -// "subtitle": -// "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", -// } class CrossAxisAlignmentWrap extends StatelessWidget { CrossAxisAlignmentWrap({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart index 252839c4..b969f913 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的textDirection属性', -// "priority": 4, -// "subtitle": -// "【textDirection】 : 文字方向 【TextDirection】", -// } class TextDirectionWrap extends StatelessWidget { TextDirectionWrap({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart index d8ea28ba..085524f4 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 98, -// "name": 'Wrap的verticalDirection属性', -// "priority": 5, -// "subtitle": -// "【verticalDirection】 : 竖直方向 【VerticalDirection】", -// } class VerticalDirectionWrap extends StatelessWidget { VerticalDirectionWrap({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json new file mode 100644 index 00000000..f96ff1ac --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "错误组件", + "info": "用于显示一个错误信息的组件,红底黄字,在开发过程中经常看到,一般不使用。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidget基本使用", + "desc": [ + "入参 : 显示信息 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart b/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart index 601771c7..55c38f3f 100644 --- a/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 197, -// "name": 'ErrorWidget基本使用', -// "priority": 1, -// "subtitle": "入参 : 显示信息 【Object】", -// } class ErrorWidgetDemo extends StatelessWidget { const ErrorWidgetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json new file mode 100644 index 00000000..fb86f4ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "列表滚轮视口", + "info": "一个将孩子列表显示在柱状滚轮上的视口,是 ListWheelScrollView、CupertinoPicker 的底层依赖", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport 简单使用", + "desc": [ + "【itemExtent】 : 轴向item尺寸 【double】", + "【offset】 : 视口偏移 【ViewportOffset】", + "【childDelegate】 : 孩子代理构造器 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport 透视效果", + "desc": [ + "【perspective】 : 透视参数 【double】", + "【squeeze】 : 挤压值 【double】", + "【diameterRatio】 : 直径分率 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport 放大", + "desc": [ + "【useMagnifier】 : 是否放大 【bool】", + "【magnification】 : 放大比例 【double】", + "【clipBehavior】 : 剪裁行为 【Clip】", + "【renderChildrenOutsideViewport】 : 出视野是否渲染 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "偏移和透明度", + "desc": [ + "【offAxisFraction】 : 轴中心偏移比 【double】", + "【overAndUnderCenterOpacity】 : 放大器之外的透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart index 318c99be..1d82ea01 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 291 ListWheelViewport 列表滚轮视口 一个将孩子列表显示在柱状滚轮上的视口,是 ListWheelScrollView、CupertinoPicker 的底层依赖。 -/// link 179,139,137,253 -/// -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 简单使用', -// "priority": 1, -// "subtitle": "【itemExtent】 : 轴向item尺寸 【double】\n" -// "【offset】 : 视口偏移 【ViewportOffset】\n" -// "【childDelegate】 : 孩子代理构造器 【ListWheelChildDelegate】", -// } + class ListWheelViewportDemo extends StatelessWidget { ListWheelViewportDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart index f4507cf9..c61d48a5 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 透视效果', -// "priority": 2, -// "subtitle": "【perspective】 : 透视参数 【double】\n" -// "【squeeze】 : 挤压值 【double】\n" -// "【diameterRatio】 : 直径分率 【double】", -// } + class ListWheelViewportDemo2 extends StatelessWidget { ListWheelViewportDemo2({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart index 5aa08c63..4e210338 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 291, -// "name": 'ListWheelViewport 放大', -// "priority": 3, -// "subtitle": "【useMagnifier】 : 是否放大 【bool】\n" -// "【magnification】 : 放大比例 【double】\n" -// "【clipBehavior】 : 剪裁行为 【Clip】\n" -// "【renderChildrenOutsideViewport】 : 出视野是否渲染 【bool】", -// } + class ListWheelViewportDemo3 extends StatelessWidget { ListWheelViewportDemo3({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart index b8563352..a818045c 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 291, -// "name": '偏移和透明度', -// "priority": 4, -// "subtitle": "【offAxisFraction】 : 轴中心偏移比 【double】\n" -// "【overAndUnderCenterOpacity】 : 放大器之外的透明度 【double】", -// } + class ListWheelViewportDemo4 extends StatelessWidget { ListWheelViewportDemo4({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json new file mode 100644 index 00000000..8618b7b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "性能浮层", + "info": "可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlay基本使用", + "desc": [ + "使用PerformanceOverlay.allEnabled可以开始所有的监测项。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart index 7362c0d1..831fb7fa 100644 --- a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/node1_base.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 312 PerformanceOverlay 性能浮层 6 可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。 -// { -// "widgetId": 312, -// "name": "PerformanceOverlay基本使用", -// "priority": 1, -// "subtitle": "使用PerformanceOverlay.allEnabled可以开始所有的监测项。", -// } + class PerformanceOverlayDemo extends StatelessWidget { const PerformanceOverlayDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json new file mode 100644 index 00000000..b4b22089 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "原图片", + "info": "是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImage基本使用", + "desc": [ + "【image】 : 图片 【ui.Image】", + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【isAntiAlias】: 是否抗锯齿 【bool】", + "【filterQuality】: 过滤质量 【FilterQuality】", + "很多属性同Image,详见之." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart b/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart index c33cfcbf..6c6512e6 100644 --- a/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/RawImage/node1_base.dart @@ -8,18 +8,7 @@ import 'package:flutter/services.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 313 RawImage 6 是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。 -// { -// "widgetId": 313, -// "name": "RawImage基本使用", -// "priority": 1, -// "subtitle": "【image】 : 图片 【ui.Image】\n" -// "【width】 : 宽 【int】\n" -// "【height】: 高 【int】\n" -// "【isAntiAlias】: 是否抗锯齿 【bool】\n" -// "【filterQuality】: 过滤质量 【FilterQuality】\n" -// "很多属性同Image,详见之.", -// } + class RawImageDemo extends StatefulWidget { const RawImageDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json new file mode 100644 index 00000000..4a6c2a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "根组件", + "info": "RenderObject 和 Element 树的桥梁。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 介绍", + "desc": [ + "【container】 : 渲染对象 【RenderObjectWithChildMixin】", + "【child】 : 子组件 【Widget】", + "【debugShortDescription】 : 调试简介 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart index f82eb1c6..fa146192 100644 --- a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/node1_base.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 289 RenderObjectToWidgetAdapter 根组件 RenderObject 和 Element 树的桥梁。 -/// -// { -// "widgetId": 289, -// "name": 'RenderObjectToWidgetAdapter 介绍', -// "priority": 1, -// "subtitle": "【container】 : 渲染对象 【RenderObjectWithChildMixin】\n" -// "【child】 : 子组件 【Widget】\n" -// "【debugShortDescription】 : 调试简介 【String】", -// } + class RenderObjectToWidgetAdapterDemo extends StatelessWidget { const RenderObjectToWidgetAdapterDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json b/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json new file mode 100644 index 00000000..25a10b9d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "表格组件", + "info": "用于展示表格的组件,可指定边线、列宽、文字方向等属性,核心对象类型是TableRow。", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Table基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【columnWidths】 : 列宽 【Map】", + "【defaultColumnWidth】 : 默认列宽 【TableColumnWidth】", + "【border】 : 边线 【TableBorder】", + "【textDirection】 : 文字方向 【TextDirection】", + "【defaultVerticalAlignment】 : 单元格竖直方向对齐模式 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/node1_base.dart b/modules/widget_system/widgets/lib/Other/Table/node1_base.dart index 4f6d0c78..6e12bbfb 100644 --- a/modules/widget_system/widgets/lib/Other/Table/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/Table/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 110, -// "name": 'Table基本使用', -// "priority": 1, -// "subtitle": "【children】 : 组件列表 【List】\n" -// "【columnWidths】 : 列宽 【Map】\n" -// "【defaultColumnWidth】 : 默认列宽 【TableColumnWidth】\n" -// "【border】 : 边线 【TableBorder】\n" -// "【textDirection】 : 文字方向 【TextDirection】\n" -// "【defaultVerticalAlignment】 : 单元格竖直方向对齐模式 【TableCellVerticalAlignment】", -// } + class CustomTable extends StatelessWidget { const CustomTable({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json new file mode 100644 index 00000000..bcb82e0d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "按钮条主题", + "info": "主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarTheme基本使用", + "desc": [ + "可指定ButtonBarThemeData数据属性为【后代】的ButtonBar组件设置默认样式,如对齐方式、样式、边距等。也可以用ButtonBarTheme.of获取ButtonBar的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart index 0f0f91e2..1d3eb600 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 338 ButtonBarTheme 5 主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。 -// { -// "widgetId": 338, -// "name": "ButtonBarTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ButtonBarThemeData数据属性为【后代】的ButtonBar组件设置默认样式,如对齐方式、样式、边距等。也可以用ButtonBarTheme.of获取ButtonBar的主题属性。", -// } + class ButtonBarThemeDemo extends StatelessWidget { const ButtonBarThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json new file mode 100644 index 00000000..57fc08ce --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "按钮样式", + "info": "主要用于为后代的Button类型组件统一设置默认属性,也可以通过该组件获取默认Button的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme使用", + "desc": [ + "属性参数同MaterialButton,可以通过ButtonTheme.of获取按钮主题数据,\"", + "也可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart index 9aa327e0..4adfd83c 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 326, -// "name": 'ButtonTheme使用', -// "priority": 1, -// "subtitle": "属性参数同MaterialButton,可以通过ButtonTheme.of获取按钮主题数据," -// "也可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。", -// } class ButtonThemeDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json new file mode 100644 index 00000000..6091b013 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "小条样式", + "info": "主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipTheme基本使用", + "desc": [ + "可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart index aa1ca824..29e8f385 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/20 /// contact me by email 1981462002@qq.com -/// 说明: 328 ChipTheme 主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。 -// { -// "widgetId": 328, -// "name": 'ChipTheme基本使用', -// "priority": 1, -// "subtitle": "可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。", -// } + class ChipThemeDemo extends StatelessWidget { const ChipThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json new file mode 100644 index 00000000..361c2720 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "用户接口等级", + "info": "ios 中的概念,内容可视级别 UIUserInterfaceLevel ,分为 base 和 elevated。作为一个 InheritedWidget ,主要就是共享该数据。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 介绍", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) 可以获取 CupertinoUserInterfaceLevelData 数据。也可以使用该组件设置该数据与子树共享。关于数据原图详见: https:developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart index b13045c8..f424aa65 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: 337 CupertinoUserInterfaceLevel 用户接口等级 -/// ios 中的概念,内容可视级别 UIUserInterfaceLevel ,分为 base 和 elevated。作为一个 InheritedWidget ,主要就是共享该数据。 - -// { -// "widgetId": 337, -// "name": 'CupertinoUserInterfaceLevel 介绍', -// "priority": 1, -// "subtitle": "CupertinoUserInterfaceLevel.of(context) 可以获取 CupertinoUserInterfaceLevelData 数据。也可以使用该组件设置该数据与子树共享。关于数据原图详见: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel", -// } + class CupertinoUserInterfaceLevelDemo extends StatelessWidget { const CupertinoUserInterfaceLevelDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json new file mode 100644 index 00000000..de0c341c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "默认资源包", + "info": "一个 InheritedWidget,设置 AssetBundle 对象后,该节点后的节点上下文可以通过 DefaultAssetBundle.of(context) 获取 AssetBundle 对象用于访问资源文件。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle 介绍", + "desc": [ + "【bundle】 : *资源包 【AssetBundle】", + "【child】 : *子组件 【Widget】", + "我们可以定义自己的 DefaultAssetBundle 来供后续节点使用,也可以直接使用默认的。该案例演示通过框架提供的 DefaultAssetBundle 加载一张资源图片进行显示。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart index 0c25dca1..b9590d86 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/node1_base.dart @@ -3,16 +3,7 @@ import 'package:flutter/services.dart'; import 'dart:ui' as ui; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: 320 DefaultAssetBundle 默认资源包 -/// 一个 InheritedWidget,设置 AssetBundle 对象后,该节点后的节点上下文可以通过 DefaultAssetBundle.of(context) 获取 AssetBundle 对象用于访问资源文件。 -// { -// "widgetId": 320, -// "name": 'DefaultAssetBundle 介绍', -// "priority": 1, -// "subtitle": "【bundle】 : *资源包 【AssetBundle】\n" -// "【child】 : *子组件 【Widget】\n" -// "我们可以定义自己的 DefaultAssetBundle 来供后续节点使用,也可以直接使用默认的。该案例演示通过框架提供的 DefaultAssetBundle 加载一张资源图片进行显示。", -// } + class DefaultAssetBundleDemo extends StatefulWidget { const DefaultAssetBundleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json new file mode 100644 index 00000000..4f51e037 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "默认字体样式", + "info": "可容纳一个孩子,为后代的文字指定默认样式。常用于多个相同文字的样式统一,避免一一设置。", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle使用", + "desc": [ + "各属性同Text,详见之。", + "其功能是: 设置默认的文字样式应用于【后代组件】,注意后代组件也可以指定自身的样式" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart index 28d297ce..47fc30a2 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 324, -// "name": 'DefaultTextStyle使用', -// "priority": 1, -// "subtitle": "各属性同Text,详见之。\n" -// "其功能是: 设置默认的文字样式应用于【后代组件】,注意后代组件也可以指定自身的样式", -// } class DefaultTextStyleDemo extends StatelessWidget { const DefaultTextStyleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json new file mode 100644 index 00000000..a05c445f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "定向性", + "info": "为后代改变有textDirection属性的组件统一设置属性值,也可以通过Directionality.of(context)获取当前textDirection默认属性。", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionality基本使用", + "desc": [ + "【textDirection】 : 文字排列方向 【TextDirection】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart index 734e9e74..ad9e15eb 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: 319 Directionality 定向性 为后代改变有textDirection属性的组件统一设置属性值,也可以通过Directionality.of(context)获取当前textDirection默认属性。 -// { -// "widgetId": 319, -// "name": "Directionality基本使用", -// "priority": 1, -// "subtitle": "【textDirection】 : 文字排列方向 【TextDirection】\n" -// "【child】 : 子组件 【Widget】", -// } + class DirectionalityDemo extends StatefulWidget { const DirectionalityDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json new file mode 100644 index 00000000..14fdb4f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "分割线样式", + "info": "主要用于为后代的Divider类型组件统一设置默认属性,也可以通过该组件获取默认Divider的属性。", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme使用", + "desc": [ + "属性参数与Divider类似,可以通过DividerTheme.of获取分割线主题数据,\"", + "也可以为DividerTheme【后代】的分割线设置默认样式,包括颜色、粗细、高度等。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart index 93c10205..e7ebf6bc 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 329, -// "name": 'DividerTheme使用', -// "priority": 1, -// "subtitle": "属性参数与Divider类似,可以通过DividerTheme.of获取分割线主题数据," -// "也可以为DividerTheme【后代】的分割线设置默认样式,包括颜色、粗细、高度等。", -// } class DividerThemeDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json new file mode 100644 index 00000000..d1efe39b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "下拉按钮隐藏线", + "info": "用于去除DropdownButton的下划线,本身没有什么应用价值。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline使用", + "desc": [ + "【child】 : 子组件 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart index eec57a57..b650621f 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 181, -// "name": 'DropDownButtonHideUnderline使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n", -// } + class CustomDropDownButtonHideUnderline extends StatefulWidget { const CustomDropDownButtonHideUnderline({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json new file mode 100644 index 00000000..c6ddf83a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "延展组件", + "info": "父类是Flexible,相当于一个fit类型为tight的Flexible组件。可嵌套孩子利用剩余空间对占位空间进行延展。", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expanded基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart index fbf56eda..b642cf5b 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/node1_base.dart @@ -3,16 +3,7 @@ import 'package:widgets/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 106, -// "name": 'Expanded基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【flex】 : 剩余空间分配占比 【int】", -// } class CustomExpended extends StatefulWidget { const CustomExpended({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json new file mode 100644 index 00000000..4c7ff0ad --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "灵活组件", + "info": "只能用于只能用于Row、Column和Flex布局中,可嵌套孩子利用剩余空间对占位空间进行延展,也可指定适应类型。", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexible基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【fit】 : 适应模式*2 【FlexFit】", + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart index 4e3bc43a..39fd82d7 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 109, -// "name": 'Flexible基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【fit】 : 适应模式*2 【FlexFit】\n" -// "【flex】 : 剩余空间分配占比 【int】", -// } class CustomFlexible extends StatefulWidget { const CustomFlexible({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json new file mode 100644 index 00000000..945968e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "图标样式", + "info": "可容纳一个孩子,为后代的图标指定默认样式。常用于多个相同图标的样式统一,避免一一设置。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme使用", + "desc": [ + "可以通过IconTheme.of获取图标主题数据,也可以为IconTheme【后代】的图标组件设置默认样式,包括颜色、透明度、尺寸。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart index fe55c057..19a60976 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 325, -// "name": 'IconTheme使用', -// "priority": 1, -// "subtitle": "可以通过IconTheme.of获取图标主题数据,也可以为IconTheme【后代】的图标组件设置默认样式,包括颜色、透明度、尺寸。", -// } class IconThemeDemo extends StatelessWidget { const IconThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json new file mode 100644 index 00000000..8e6062c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "共享模型", + "info": "它是 InheritedWidget 抽象子类,通过 context 向子树传递数据,并通过 Aspect 方面控制依赖通知的粒度。", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "下面是一个自定义 InheritedModel,实现数据的子树共享;并且定义颜色和数值两个方面,控制依赖通知的粒度。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart index db3c2973..a3e32265 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 336 InheritedModel 共享模型 -/// 它是 InheritedWidget 抽象子类,通过 context 向子树传递数据,并通过 Aspect 方面控制依赖通知的粒度。 -/// link: 346 -/// -// { -// "widgetId": 336, -// "name": 'InheritedModel 使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "下面是一个自定义 InheritedModel,实现数据的子树共享;\n并且定义颜色和数值两个方面,控制依赖通知的粒度。", -// } + class InheritedModelDemo extends StatefulWidget { const InheritedModelDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json new file mode 100644 index 00000000..c300aa9e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_zh-CN.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "传承主题", + "info": "它是抽象类,有非常多的 XXXTheme 相关子类,用于定义颜色、文字样式等属性,在子树中共享这些属性。", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 介绍", + "desc": [ + "InheritedTheme.capture 可以抓取上层主题,获取 CapturedThemes 对象,通过该对象 wrap 方法可以跨路由使用抓到的主题。", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart index 2a217591..3018d341 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart @@ -2,17 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 345 InheritedTheme 传承主题 -/// 它是抽象类,有非常多的 XXXTheme 相关子类,用于定义颜色、文字样式等属性,在子树中共享这些属性。 -/// link 324,326,328,329 -/// -// { -// "widgetId": 345, -// "name": 'InheritedTheme 介绍', -// "priority": 1, -// "subtitle": -// "InheritedTheme.capture 可以抓取上层主题,获取 CapturedThemes 对象,通过该对象 wrap 方法可以跨路由使用抓到的主题。", -// } class InheritedThemeDemo extends StatelessWidget { const InheritedThemeDemo({Key? key}) : super(key: key); @@ -60,4 +49,4 @@ class TestBody extends StatelessWidget { // ), // ); } -} +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json new file mode 100644 index 00000000..8b8f53f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "传承组件", + "info": "该类是抽象类,作用是可以在本上下文存储数据,在其后续节点的上下文中共享该数据。有很多实现类,包括各种主题组件、MediaQuery等。", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Column基本使用", + "desc": [ + "【children】 : 组件列表 【List】", + "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】", + "【textBaseline】 : 文字基线 【TextBaseline】", + "【verticalDirection】 : 竖直方向 【VerticalDirection】", + "【mainAxisSize】 : 主轴尺寸 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget 案例", + "desc": [ + "下面是通过一个颜色计数器项目展示 InheritedWidget 组件的使用。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart index 9f0350cd..631e6911 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/9/21 +/// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: 346 InheritedWidget 传承组件 -/// 该类是抽象类,作用是可以在本上下文存储数据,在其后续节点的上下文中共享该数据。有很多实现类,包括各种主题组件、MediaQuery等。 -/// link: 167,319,328,324,331 -/// -// { -// "widgetId": 346, -// "name": 'InheritedWidget 使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "下面是一个简单的自定义 InheritedWidget,实现信息的子树共享。", -// } + class InheritedWidgetDemo extends StatelessWidget { final String info = diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart index 7b132ccf..c43ec1da 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com class InheritedCounter extends InheritedWidget { const InheritedCounter({ diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json new file mode 100644 index 00000000..09a06bbb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "保活", + "info": "在懒加载的列表中,孩子的状态是否需要保活。是 AutomaticKeepAlive 的底层实现,一般不单独使用。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 介绍", + "desc": [ + "【child】 : *子组件 【Widget】", + "【keepAlive】 : *是否保活 【bool】", + "在 flutter 框架层中,只用于 AutomaticKeepAlive 中,源码中也说很少单独使用它。该示例展示出 ListView 条目的状态保活。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart index c302cc19..192a561a 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 316 KeepAlive 保活 在懒加载的列表中,孩子的状态是否需要保活。是 AutomaticKeepAlive 的底层实现,一般不单独使用。 -/// link 239 -/// -// { -// "widgetId": 316, -// "name": 'KeepAlive 介绍', -// "priority": 1, -// "subtitle": "【child】 : *子组件 【Widget】\n" -// "【keepAlive】 : *是否保活 【bool】\n" -// "在 flutter 框架层中,只用于 AutomaticKeepAlive 中,源码中也说很少单独使用它。该示例展示出 ListView 条目的状态保活。", -// } + class KeepAliveDemo extends StatelessWidget { KeepAliveDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json new file mode 100644 index 00000000..b9799fb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "布局Id", + "info": "只能用于CustomMultiChildLayout组件中,为其子组件标识身份。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId使用场景", + "desc": [ + "【id】 : 标识id 【Object】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart index 0e9c48ca..ce6b3179 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/6 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 315, -// "name": 'LayoutId使用场景', -// "priority": 1, -// "subtitle": -// "【id】 : 标识id 【Object】\n" -// "【child】 : 子组件 【Widget】", -// } class LayoutIdDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json new file mode 100644 index 00000000..644f3b48 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile主题", + "info": "主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileTheme基本使用", + "desc": [ + "可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart index f18b56c1..a0537638 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 334 ListTileTheme 主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。 -// { -// "widgetId": 334, -// "name": "ListTileTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。", -// } + class ListTileThemeDemo extends StatelessWidget { const ListTileThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json new file mode 100644 index 00000000..63929b44 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "横幅样式", + "info": "主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerTheme基本使用", + "desc": [ + "可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart index a6a11a32..1a4d83d9 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 327 MaterialBannerTheme 主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。 -// { -// "widgetId": 327, -// "name": "MaterialBannerTheme基本使用", -// "priority": 1, -// "subtitle": "可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。", -// } + class MaterialBannerThemeDemo extends StatelessWidget { const MaterialBannerThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json new file mode 100644 index 00000000..ffb9a6ef --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "媒体查询", + "info": "可通过MediaQuery.of来获取屏幕尺寸、设备密度、文字缩放比例、边距等信息。", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery获取数据信息", + "desc": [ + "MediaQuery.of(context)可以获取MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart index eaf5474f..9bf69e27 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 167, -// "name": 'MediaQuery获取数据信息', -// "priority": 1, -// "subtitle": "MediaQuery.of(context)可以获取MediaQueryData", -// } class CustomMediaQuery extends StatelessWidget { const CustomMediaQuery({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json new file mode 100644 index 00000000..486af92d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "父数据组件", + "info": "抽象类,用于将 ParentData 信息挂钩到 RenderObjectWidget 子组件上。其子类有 Positioned、Flexible、Expanded等,这些组件只能用于特定的组件之下。", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 介绍", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart index 76ca7bf2..04ff5a95 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 347 ParentDataWidget 父数据组件 -/// 抽象类,用于将 ParentData 信息挂钩到 RenderObjectWidget 子组件上。其子类有 Positioned、Flexible、Expanded等,这些组件只能用于特定的组件之下。 -/// -// { -// "widgetId": 347, -// "name": 'ParentDataWidget 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } + class ParentDataWidgetDemo extends StatelessWidget { const ParentDataWidgetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json new file mode 100644 index 00000000..9158c8ee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "弹出菜单样式", + "info": "主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuTheme基本使用", + "desc": [ + "可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart index 96f01b2f..3006a6ec 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 330 PopupMenuTheme 主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。 -// { -// "widgetId": 330, -// "name": "PopupMenuTheme基本使用", -// "priority": 1, -// "subtitle": "可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。", -// } + class PopupMenuThemeDemo extends StatelessWidget { const PopupMenuThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json new file mode 100644 index 00000000..75ba8c78 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "定位组件", + "info": "只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positioned基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【top】 : 到父顶距离 【double】", + "【right】 : 到父右距离 【double】", + "【left】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart index 99b7c853..c59c04c4 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 108, -// "name": 'Positioned基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【right】 : 到父右距离 【double】\n" -// "【left】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } class CustomPositioned extends StatelessWidget { const CustomPositioned({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json new file mode 100644 index 00000000..1e77d574 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "初始滑动控制器", + "info": "它是 InheritedWidget 子类,通过 context 向子树中的可滑动视图提供默认的 ScrollController 对象。", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 介绍", + "desc": [ + "【controller】 : 滑动控制器 【ScrollController】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart index 02dff47f..076ac8db 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/node1_base.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/3/31 /// contact me by email 1981462002@qq.com /// -/// 说明: 335 PrimaryScrollController 5 初始滑动控制器 它是 InheritedWidget 子类,通过 context 向子树中的可滑动视图提供默认的 ScrollController 对象。 -// { -// "widgetId": 335, -// "name": 'PrimaryScrollController 介绍', -// "priority": 1, -// "subtitle": "【controller】 : 滑动控制器 【ScrollController】\n" -// "【child】 : 子组件 【Widget】", -// } + class PrimaryScrollControllerDemo extends StatelessWidget { const PrimaryScrollControllerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json new file mode 100644 index 00000000..17e990a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "ios菜单按钮", + "info": "需要包裹一个可滑动的组件,并通过behavior属性控制滑动的效果,可以去除滑动的蓝色阴影等。", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfiguration基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【behavior】 : 滑动行为 【ScrollBehavior】", + " 可以使用ScrollConfiguration让ListView无蓝色阴影" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart index e63f3f60..61fb0e66 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 180, -// "name": 'ScrollConfiguration基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【behavior】 : 滑动行为 【ScrollBehavior】\n" -// " 可以使用ScrollConfiguration让ListView无蓝色阴影", -// } + class CustomScrollConfiguration extends StatelessWidget { CustomScrollConfiguration({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json new file mode 100644 index 00000000..b027fa96 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "滑块样式", + "info": "可容纳一个孩子,为后代的Slider指定默认样式。常用于Slider的样式统一,避免一一设置,也可以对Slider进行样式定制。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme使用", + "desc": [ + "可通过SliderTheme.of获取Slider主题数据对象,其中包含大量属性用于对Slider的设定。\"", + "可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。" + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme对Slider的样式定制", + "desc": [ + "通过thumbShape和valueIndicatorShape可以对Slider进行样式定制。\"", + "注: 本例参考flutter-gallery中的SlideDemo" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart index 75a7a833..ecf42093 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 331, -// "name": 'SliderTheme使用', -// "priority": 1, -// "subtitle": "可通过SliderTheme.of获取Slider主题数据对象,其中包含大量属性用于对Slider的设定。" -// "可以为ButtonTheme【后代】的按钮组件设置默认样式,包括颜色、形状、尺寸等。", -// } class SliderThemeDemo extends StatefulWidget { const SliderThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart index 68c0104d..9681384c 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/node2_diy.dart @@ -4,15 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 331, -// "name": 'SliderTheme对Slider的样式定制', -// "priority": 2, -// "subtitle": "通过thumbShape和valueIndicatorShape可以对Slider进行样式定制。" -// "注: 本例参考flutter-gallery中的SlideDemo", -// } + class DIYSliderTheme extends StatefulWidget { const DIYSliderTheme({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json new file mode 100644 index 00000000..ec9d663d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "表室", + "info": "必须在 Table 组件的后代中使用,用于控制表孩子的竖直方向对齐方式,并没是什么太大的作用。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCell基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【verticalAlignment】 : 竖直对齐方式 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart index 3d409381..cd9dce2c 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 317 TableCell 表室 必须在 Table 组件的后代中使用,用于控制表孩子的竖直方向对齐方式,并没是什么太大的作用。 -// { -// "widgetId": 317, -// "name": 'TableCell基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【verticalAlignment】 : 竖直对齐方式 【TableCellVerticalAlignment】", -// } + class TableCellDemo extends StatelessWidget { const TableCellDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json new file mode 100644 index 00000000..001beb48 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "滑块样式", + "info": "主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsTheme基本使用", + "desc": [ + "可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart index e43562d4..715cea36 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 332 ToggleButtonsTheme 主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。 -// { -// "widgetId": 332, -// "name": "ToggleButtonsTheme基本使用", -// "priority": 1, -// "subtitle": "可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。", -// } + class ToggleButtonsThemeDemo extends StatelessWidget { const ToggleButtonsThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json new file mode 100644 index 00000000..ad727ade --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "提示主题", + "info": "主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipTheme基本使用", + "desc": [ + "可指定TooltipThemeData数据属性为【后代】的Tooltip组件设置默认样式,如装饰、文字样式、显示时长、边距等。也可以用TooltipTheme.of获取Tooltip的主题属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart index 931a1773..0ef30903 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 333 TooltipTheme 5 主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。 -// { -// "widgetId": 333, -// "name": "TooltipTheme基本使用", -// "priority": 1, -// "subtitle": "可指定TooltipThemeData数据属性为【后代】的Tooltip组件设置默认样式,如装饰、文字样式、显示时长、边距等。也可以用TooltipTheme.of获取Tooltip的主题属性。", -// } + class TooltipThemeDemo extends StatelessWidget { const TooltipThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json new file mode 100644 index 00000000..e17289d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "吸收点击", + "info": "容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身接受事件。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【absorbing】 : 是否吸收事件 【bool】", + "如下,Switch选中时absorbing为true,按钮事件将被吸收,无法点击。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart index e0c7edc8..efca1c01 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 295, -// "name": 'AbsorbPointer基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【absorbing】 : 是否吸收事件 【bool】\n" -// "如下,Switch选中时absorbing为true,按钮事件将被吸收,无法点击。", -// } + class CustomAbsorbPointer extends StatefulWidget { const CustomAbsorbPointer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json new file mode 100644 index 00000000..ba46195d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "对齐组件", + "info": "可容纳一个子组件,可以通过alignment让子组件,定位在父组件宽高的任何指定分率出。", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Align基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Align其他用法", + "desc": [ + "由于Alignment对象可指定在父容器中宽高的分率位置", + "可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart index a7f2e434..5e6ae234 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 85, -// "name": 'Align基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } + class CustomAlign extends StatelessWidget { const CustomAlign({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart index c8751eea..3983e6fe 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/node2_other.dart @@ -3,15 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 85, -// "name": 'Align其他用法', -// "priority": 2, -// "subtitle": -// "由于Alignment对象可指定在父容器中宽高的分率位置\n" -// "可以使用Align实现一些复杂的排布需求,比如按指定的数学方程变化位置", -// } + class Ball extends StatelessWidget { const Ball({ Key? key, diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json new file mode 100644 index 00000000..b5559c1f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "尺寸动画", + "info": "子组件大小发生变化时,进行动画渐变,可指定时长、对齐方式、曲线、vsync等属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSize基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【curve】 : 动画曲线 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart index 721d122f..deb0e60d 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 201, -// "name": 'AnimatedSize基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【vsync】 : vsync 【TickerProvider】", -// } class CustomAnimatedSize extends StatefulWidget { const CustomAnimatedSize({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json new file mode 100644 index 00000000..f8aee6e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "标注区域", + "info": "有一个泛型,源码中仅在 app_bar, nav_bar 中使用该组件改变状态量、导航栏样式,泛型通常为 SystemUiOverlayStyle。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion改变状态量样式", + "desc": [ + "【value】 : 值 【T】", + "【sized】 : 是否提供大小 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart index a9c5b695..1b518dbf 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/node1_base.dart @@ -3,16 +3,7 @@ import 'package:flutter/services.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 288 AnnotatedRegion 有一个泛型,源码中仅适用该组件改变状态量、导航栏样式,泛型通常为SystemUiOverlayStyle。 -// { -// "widgetId": 288, -// "name": 'AnnotatedRegion改变状态量样式', -// "priority": 1, -// "subtitle": -// "【value】 : 值 【T】\n" -// "【sized】 : 是否提供大小 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } + class AnnotatedRegionDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json new file mode 100644 index 00000000..89fffc05 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "比例盒", + "info": "可容纳一个子组件,通过指定宽高比aspectRatio,来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatio基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【aspectRatio】 : 宽高比例 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart index 44e61d9d..eb74f52e 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 77, -// "name": 'AspectRatio基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【aspectRatio】 : 宽高比例 【double】", -// } + class CustomAspectRatio extends StatefulWidget { const CustomAspectRatio({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json new file mode 100644 index 00000000..c3403a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "背景滤镜", + "info": "可容纳一个孩子,并将背景进行模糊滤镜。可以通过Stack将背景模糊实现组件的模糊效果。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilter基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【filter】 : 过滤器 【ImageFilter】", + "ImageFilter.blur可以实现高斯模糊,指定x,y模糊因子。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart index 59154a5d..3cddf48a 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/node1_base.dart @@ -4,18 +4,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 278, -// "name": 'BackdropFilter基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【filter】 : 过滤器 【ImageFilter】\n" -// "ImageFilter.blur可以实现高斯模糊,指定x,y模糊因子。", -// } - class CustomBackdropFilter extends StatefulWidget { const CustomBackdropFilter({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json new file mode 100644 index 00000000..387bf89f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "基线组件", + "info": "可容纳一个子组件,通过控制基线高度来控制子组件的位置。一般用于文字组件。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baseline基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【baseline】 : 基线位置 【double】", + "【baselineType】 : 基线类型 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart index 202321f6..f418a548 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 75, -// "name": 'Baseline基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【baseline】 : 基线位置 【double】\n" -// "【baselineType】 : 基线类型 【TextBaseline】", -// } + class CustomBaseline extends StatefulWidget { const CustomBaseline({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json new file mode 100644 index 00000000..b3e2a548 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "居中组件", + "info": "可容纳一个子组件,并使其居中于父组件,是Align组件的一种精简模式。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Center基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart index ff9fbfa6..7a753a4b 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 86, -// "name": 'Center基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】", -// } class CustomCenter extends StatelessWidget { const CustomCenter({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json new file mode 100644 index 00000000..ff1be8e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "椭圆裁剪", + "info": "可容纳一个子组件,并将其以宽高为长轴和短轴进行椭圆裁切。", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOval基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart index 83b9626f..71028125 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 66, -// "name": 'ClipOval基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } class CustomClipOval extends StatelessWidget { const CustomClipOval({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json new file mode 100644 index 00000000..c913d438 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "路径裁剪", + "info": "可容纳一个子组件,并将其按指定路径进行裁剪。可以自定义路径形状,是一个很灵活的裁剪组件。", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPath基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart index f8362740..f2c5e67f 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/node1_base.dart @@ -3,16 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 69, -// "name": 'ClipPath基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } class CustomClipPath extends StatelessWidget { const CustomClipPath({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json new file mode 100644 index 00000000..79edf1a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "圆角矩形裁剪", + "info": "可容纳一个子组件,并将其进行圆角矩形裁剪。指定borderRadius作为边角半径。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRect基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【borderRadius】 : 边线半径 【BorderRadius】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart index 7ec3a067..afd15096 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 68, -// "name": 'ClipRRect基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【borderRadius】 : 边线半径 【BorderRadius】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } class CustomClipRRect extends StatelessWidget { const CustomClipRRect({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json new file mode 100644 index 00000000..6ed05fa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "矩形裁剪", + "info": "可容纳一个子组件,并将其进行矩形裁切。可借助SizedBox、Align、AspectRadio等限定组件进行定域。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRect基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【clipper】 : 裁剪器 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart index b4bfe95f..c0b4698d 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 67, -// "name": 'ClipRect基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【clipper】 : 裁剪器 【CustomClipper】", -// } class CustomClipRect extends StatelessWidget { const CustomClipRect({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json new file mode 100644 index 00000000..05a6ea0c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "滤色器", + "info": "可容纳一个子组件,可以并将组件按照29中叠色模式和任意组件混合,强大到我不知道该说什么好。app一键全灰了解一下。", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFiltered基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【colorFilter】 : 滤色器 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart index c6f758f4..934aa597 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart @@ -3,15 +3,7 @@ import 'package:widgets/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 88, -// "name": 'ColorFiltered基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【colorFilter】 : 滤色器 【ColorFilter】", -// } class CustomColorFiltered extends StatefulWidget { const CustomColorFiltered({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json new file mode 100644 index 00000000..590fc2ff --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "颜色盒", + "info": "在子组件的布局区域上绘制指定颜色,然后将子组件绘制在背景色上。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBox基本使用", + "desc": [ + "【color】 : 组件 【Color】", + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart index ea3c4d3b..714effeb 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 267 ColoredBox 在子组件的布局区域上绘制颜色,然后子组件绘制在背景色上。 -// { -// "widgetId": 267, -// "name": 'ColoredBox基本使用', -// "priority": 1, -// "subtitle": "【color】 : 组件 【Color】\n" -// "【child】 : 组件 【Widget】", -// } + class ColoredBoxDemo extends StatelessWidget { const ColoredBoxDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json new file mode 100644 index 00000000..174d72c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "合成变换跟随者", + "info": "一般与 CompositedTransformTarget 组件联合使用,可以使 Overlay 伴随目标变换。", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【link】 : 链接 【LayerLink】", + "【offset】 : 偏移 【Offset】", + "【targetAnchor】 : 目标锚点 【Alignment】", + "【followerAnchor】 : 伴随者锚点 【Alignment】", + "【showWhenUnlinked】 : 为链接是否显示 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart index 81da1614..e18ed3c2 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/node1_base.dart @@ -5,20 +5,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/3/31 /// contact me by email 1981462002@qq.com /// -/// 说明: 265 CompositedTransformFollower 2 合成变换跟随者,一般与 CompositedTransformTarget 组件联合使用,可以使 Overlay 伴随目标变换。 -// { -// "widgetId": 265, -// "name": "基本使用", -// "name": "CompositedTransformFollower 使用", -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【link】 : 链接 【LayerLink】\n" -// "【offset】 : 偏移 【Offset】\n" -// "【targetAnchor】 : 目标锚点 【Alignment】\n" -// "【followerAnchor】 : 伴随者锚点 【Alignment】\n" -// "【showWhenUnlinked】 : 为链接是否显示 【bool】", -// } + class CompositedTransformFollowerDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json new file mode 100644 index 00000000..8bc37647 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "合成变换目标", + "info": "一般与 CompositedTransformFollower 组件联合使用,可以使 Overlay 伴随目标变换。", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget 使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【link】 : 链接 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart index 78c31169..57ef07e6 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/node1_base.dart @@ -5,15 +5,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/3/31 /// contact me by email 1981462002@qq.com /// -/// 说明: 266 CompositedTransformTarget 2 合成变换目标,一般与 CompositedTransformFollower 组件联合使用,可以使 Overlay 伴随目标变换。 -// { -// "widgetId": 266, -// "name": "CompositedTransformTarget 使用", -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【link】 : 链接 【LayerLink】", -// } + class CompositedTransformTargetDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json new file mode 100644 index 00000000..05755076 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "约束盒", + "info": "可容纳一个子组件,通过指定最大、最小宽高,来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraints基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【minWidth】 : 最小宽 【double】", + "【minHeight】 : 最小高 【double】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart index e0be072e..59a656e6 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 80, -// "name": 'BoxConstraints基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【minWidth】 : 最小宽 【double】\n" -// "【minHeight】 : 最小高 【double】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】", -// } class CustomConstrainedBox extends StatefulWidget { const CustomConstrainedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json new file mode 100644 index 00000000..c1cf4999 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "ios文字选择工具条", + "info": "对文本选择做出响应的 ios 风格的工具栏", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "该组件无法使用", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart index d2c648f3..aebf20b3 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 299 CupertinoTextSelectionToolbar 对文本选择做出响应的 ios 风格的工具栏。 -// { -// "widgetId": 299, -// "name": '该组件无法使用', -// "priority": 1, -// "subtitle": -// "【-】 : - 【-】", -// } + class CupertinoTextSelectionToolbarDemo extends StatelessWidget { const CupertinoTextSelectionToolbarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json new file mode 100644 index 00000000..c950ad8e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "绘制组件", + "info": "通过CustomPainter进行绘制,可实现一些复杂的自定义绘制组件,是Flutter中自定义组件的灵魂人物。", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint绘线图形", + "desc": [ + "【painter】 : 绘画器 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint绘线贝塞尔曲线", + "desc": [ + "Flutter也支持贝塞尔曲线等复杂绘制。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart index 92deaabe..df2cdebf 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node1_clock.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 166, -// "name": 'CustomPaint绘线图形', -// "priority": 1, -// "subtitle": -// "【painter】 : 绘画器 【CustomPainter】", -// } + class ClockPage extends StatelessWidget { const ClockPage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart index 24835a5e..d59250e6 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/node2_bezier.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 166, -// "name": 'CustomPaint绘线贝塞尔曲线', -// "priority": 2, -// "subtitle": " Flutter也支持贝塞尔曲线等复杂绘制。", -// } + class PlayBezier3Page extends StatefulWidget { const PlayBezier3Page({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json new file mode 100644 index 00000000..d45b2202 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "通用单子布局", + "info": "可容纳一个子组件,并指定代理类对子组件进行排布。代理类可获取父容器区域和子组件的区域大小,及区域约束情况。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayout基本使用", + "desc": [ + "【delegate】 : 代理 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayout的偏移使用", + "desc": [ + "可以利用代理的偏移能力,对子组件进行偏移定位。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart index 4f612fd0..6295eac5 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/3 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 285, -// "name": 'CustomSingleChildLayout基本使用', -// "priority": 1, -// "subtitle": -// "【delegate】 : 代理 【SingleChildLayoutDelegate】", -// } + class CustomSingleChildLayoutDemo extends StatelessWidget { const CustomSingleChildLayoutDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart index f43a815c..cfa45dbc 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/node2_offset.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 285, -// "name": 'CustomSingleChildLayout的偏移使用', -// "priority": 2, -// "subtitle": -// "可以利用代理的偏移能力,对子组件进行偏移定位。", -// } class OffSetWidgetDemo extends StatelessWidget { const OffSetWidgetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json new file mode 100644 index 00000000..1a57df64 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_zh-CN.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "装饰盒", + "info": "可容纳一个子组件,可将其进行装饰。核心属性为decoration,可设置边线、渐变、阴影、背景图等。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBox基本使用", + "desc": [ + "【decoration】 : 装饰对象 【Decoration】", + "【position】 : 前景色(左)/后景色(右) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBox形状和图片装饰", + "desc": [ + "【shape】 : 形状 【BoxShape】", + "【image】 : 背景图片 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBox边线装饰", + "desc": [ + "【border】 : 边线 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBox形状装饰", + "desc": [ + "通过ShapeDecoration对象可指定边线形状," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBox底线装饰", + "desc": [ + "通过UnderlineTabIndicator对象可指定底线," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration装饰", + "desc": [ + "通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart index 180c3f95..bfd90d69 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox基本使用', -// "priority": 1, -// "subtitle": -// "【decoration】 : 装饰对象 【Decoration】\n" -// "【position】 : 前景色(左)/后景色(右) 【DecorationPosition】", -// } class BoxDecorationDemo extends StatelessWidget { const BoxDecorationDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart index 0170ed81..850cfb04 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox形状和图片装饰', -// "priority": 2, -// "subtitle": -// "【shape】 : 形状 【BoxShape】\n" -// "【image】 : 背景图片 【DecorationImage】\n", -// } class ShapeImageDemo extends StatelessWidget { const ShapeImageDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart index 81a6dc1e..a1aec5cd 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox边线装饰', -// "priority": 3, -// "subtitle": "【border】 : 边线 【BoxBorder】\n", -// } + class BorderDemo extends StatelessWidget { const BorderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart index c7fe0d74..14000014 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox形状装饰', -// "priority": 4, -// "subtitle": "通过ShapeDecoration对象可指定边线形状\n", -// } + class ShapeDecorationDemo extends StatelessWidget { const ShapeDecorationDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart index 4befaeee..95ed6d9f 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'DecoratedBox底线装饰', -// "priority": 5, -// "subtitle": "通过UnderlineTabIndicator对象可指定底线\n", -// } + class UnderlineTabIndicatorDemo extends StatelessWidget { const UnderlineTabIndicatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart index 665dd42a..644f732a 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 70, -// "name": 'FlutterLogoDecoration装饰', -// "priority": 6, -// "subtitle": "通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用)\n", -// } + class FlutterLogoDecorationDemo extends StatelessWidget { const FlutterLogoDecorationDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json new file mode 100644 index 00000000..540920f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "透明变换", + "info": "可容纳一个子组件,并使其进行透明度渐变动画,需要提供动画器opacity。", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【opacity】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart index eacfaad2..83332841 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 89, -// "name": 'FadeTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【opacity】 : 动画 【Animation】", -// } class CustomFadeTransition extends StatefulWidget { const CustomFadeTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json new file mode 100644 index 00000000..3304f774 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "适应盒", + "info": "可容纳一个子组件,使用fit属性决定子组件区域相当于父组件的适应模式,拥有对齐属性alignment。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【fit】 : 适应模式 【BoxFit】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart index b5b3ab73..8eeabb96 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 87, -// "name": 'FittedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【fit】 : 适应模式 【BoxFit】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } class CustomFittedBox extends StatefulWidget { const CustomFittedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json new file mode 100644 index 00000000..e04c12b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "分度偏移", + "info": "通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslation基本使用", + "desc": [ + "【translation】 : 偏移分度值 【Offset】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart index 997bf1a1..76789681 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 263 FractionalTranslation 通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。 -// { -// "widgetId": 263, -// "name": "FractionalTranslation基本使用", -// "priority": 1, -// "subtitle": "【translation】 : 偏移分度值 【Offset】\n" -// "【child】: 子组件 【Widget】", -// } + class FractionalTranslationDemo extends StatefulWidget { const FractionalTranslationDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json new file mode 100644 index 00000000..fd62f807 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "分率盒", + "info": "可容纳一个子组件,指定宽高分率,限定子组件区域为父容器宽高*各分率,及对齐方式alignment。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【widthFactor】 : 宽分率 【double】", + "【heightFactor】 : 高分率 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart index 0485ab65..66b97ef3 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 82, -// "name": 'FractionallySizedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【widthFactor】 : 宽分率 【double】\n" -// "【heightFactor】 : 高分率 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } class CustomFractionallySizedBox extends StatefulWidget { const CustomFractionallySizedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json new file mode 100644 index 00000000..19964c2b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "忽视点击", + "info": "容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身不接受事件。", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【ignoring】 : 是否忽视事件 【bool】", + "如下,Switch选中时ignoring为true,按钮事件将被锁定,无法点击。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart index b819a2be..699d88a7 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 292, -// "name": 'IgnorePointer基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【ignoring】 : 是否忽视事件 【bool】\n" -// "如下,Switch选中时ignoring为true,按钮事件将被锁定,无法点击。", -// } + class CustomIgnorePointer extends StatefulWidget { const CustomIgnorePointer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json new file mode 100644 index 00000000..8e82b476 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "图像滤镜", + "info": "通过 ImageFilter 图像滤镜,可以对任意组件进行特效处理,包括但不限于高斯模糊、颜色滤镜、变换等。", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter 高斯模糊", + "desc": [ + "【imageFilter】 : 图像滤镜 【ImageFilter】", + "【child】 : 子组件 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter 滤色效果", + "desc": [ + "通过 ColorFilter 对象实现颜色滤镜。" + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 变换效果", + "desc": [ + "通过 ImageFilter.matrix 构造,进行矩阵变换,但比较鸡肋。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart index 738743f7..d6132adc 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart @@ -3,14 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/04/23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 高斯模糊', -// "priority": 1, -// "subtitle": "【imageFilter】 : 图像滤镜 【ImageFilter】\n" -// "【child】 : 子组件 【Widget】", -// } + class ImageFilteredBlur extends StatefulWidget { const ImageFilteredBlur({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart index d4b11d7a..0ac1d653 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart @@ -3,13 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/04/23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 滤色效果', -// "priority": 2, -// "subtitle": "通过 ColorFilter 对象实现颜色滤镜。", -// } + class ImageFilteredColor extends StatefulWidget { const ImageFilteredColor({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart index 92344b7b..56d9ea89 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart @@ -5,13 +5,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/04/23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 357, -// "name": 'ImageFilter 变换效果', -// "priority": 3, -// "subtitle": "通过 ImageFilter.matrix 构造,进行矩阵变换,但比较鸡肋。", -// } + class ImageFilteredMatrix extends StatefulWidget { const ImageFilteredMatrix({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json new file mode 100644 index 00000000..71305b0a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "固有高", + "info": "根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeight基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart index d429de38..68e9dbde 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: 298 IntrinsicHeight 根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。 -// { -// "widgetId": 298, -// "name": 'IntrinsicHeight基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。", -// } class IntrinsicHeightDemo extends StatefulWidget { const IntrinsicHeightDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json new file mode 100644 index 00000000..7bce5535 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "固有宽", + "info": "根据子元素的固有宽度度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidth基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart index 1a3e5130..823cdb9d 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 297, -// "name": 'IntrinsicWidth基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。", -// } class IntrinsicWidthDemo extends StatefulWidget { const IntrinsicWidthDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json new file mode 100644 index 00000000..2763c28d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "布局构造器", + "info": "可以检测到父容器的区域大小,并根据父容器的尺寸信息可以完成自定义布局。是一个非常实用的布局组件。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilder基本认识", + "desc": [ + "【builder】 : 布局构造器 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilder的适应布局", + "desc": [ + "可以根据区域的大小进行组件展示设计。\"", + "比如在不同的宽度区域显示不同的布局结构。\"", + "毕竟很多地方不容易获取父组件区域,使用LayoutBuilder就会非常爽口。" + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilder的展开使用", + "desc": [ + "使用TextPainter来检测文字的行数,实现展开或收起功能。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart index 4fb1a7da..367af2cf 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 287, -// "name": 'LayoutBuilder基本认识', -// "priority": 1, -// "subtitle": "【builder】 : 布局构造器 【LayoutWidgetBuilder】", -// } class CustomLayoutBuilder extends StatelessWidget { const CustomLayoutBuilder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart index 4ee2ab4d..118b09eb 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 287, -// "name": 'LayoutBuilder的适应布局', -// "priority": 2, -// "subtitle": "可以根据区域的大小进行组件展示设计。" -// "比如在不同的宽度区域显示不同的布局结构。" -// "毕竟很多地方不容易获取父组件区域,使用LayoutBuilder就会非常爽口。", -// } + class FitByLayoutBuilder extends StatefulWidget { const FitByLayoutBuilder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart index 40921327..33c13c01 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 287, -// "name": 'LayoutBuilder的展开使用', -// "priority": 3, -// "subtitle": "使用TextPainter来检测文字的行数,实现展开或收起功能。", -// } + class SimpleExpandableText extends StatefulWidget { const SimpleExpandableText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json new file mode 100644 index 00000000..0aa3bf62 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "限制盒", + "info": "可容纳一个子组件,通过指定最大宽高来限定子组件容身区域。", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart similarity index 82% rename from modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart rename to modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart index f2889afc..47173673 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimiteBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 79, -// "name": 'LimitedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】", -// } class CustomLimitedBox extends StatefulWidget { const CustomLimitedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json new file mode 100644 index 00000000..17c804f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "消失组件", + "info": "可容纳一个子组件,可更改其的消失与否。offstage属性为true表示隐藏。", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【offstage】 : 是否消失 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart index 7565ecb6..ca83cc16 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 71, -// "name": 'Offstage基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【offstage】 : 是否消失 【bool】", -// } class CustomOffstage extends StatefulWidget { const CustomOffstage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json new file mode 100644 index 00000000..9f558e9c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "透明化", + "info": "可容纳一个子组件,将其透明度变为opacity值, opacity在0~1之间。", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacity基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【opacity】 : 透明度0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart index 41baec52..798c891c 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 73, -// "name": 'Opacity基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【opacity】 : 透明度0~1 【double】", -// } class CustomOpacity extends StatefulWidget { const CustomOpacity({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json new file mode 100644 index 00000000..c3c55dc8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "溢出盒", + "info": "可容纳一个子组件,且子组件允许溢出父组件区域,可以指定宽高的最大最小区域进行限定,拥有对齐属性alignment。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【minWidth】 : 最小宽 【double】", + "【minHeight】 : 最小高 【double】", + "【maxHeight】 : 最大高 【double】", + "【maxWidth】 : 最大宽 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart index 145f001e..cbca2dea 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/node1_base.dart @@ -1,20 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 83, -// "name": 'OverflowBox基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【minWidth】 : 最小宽 【double】\n" -// "【minHeight】 : 最小高 【double】\n" -// "【maxHeight】 : 最大高 【double】\n" -// "【maxWidth】 : 最大宽 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } class CustomOverflowBox extends StatefulWidget { const CustomOverflowBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json new file mode 100644 index 00000000..6c2cb52a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "边距组件", + "info": "可容纳一个子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding四面等边距", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【padding】 : 内四边距 【EdgeInsetsGeometry】\"", + "EdgeInsets.all用来限定相同的四边边距" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding单独边距边距", + "desc": [ + "EdgeInsets.only用来限定相同的四边边距" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding方向边距", + "desc": [ + "EdgeInsets.symmetric用来限定水平和竖直方向的边距" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart index aee7c3e9..ee5f54a7 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node1_all.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 74, -// "name": 'Padding四面等边距', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【padding】 : 内四边距 【EdgeInsetsGeometry】" -// "EdgeInsets.all用来限定相同的四边边距", -// } class PaddingAll extends StatelessWidget { const PaddingAll({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart index 9ede5684..2ee74a2c 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node2_only.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 74, -// "name": 'Padding单独边距边距', -// "priority": 2, -// "subtitle": -// "EdgeInsets.only用来限定相同的四边边距", -// } class PaddingOnly extends StatelessWidget { const PaddingOnly({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart index a692b1f7..db66db53 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 74, -// "name": 'Padding方向边距', -// "priority": 3, -// "subtitle": -// "EdgeInsets.symmetric用来限定水平和竖直方向的边距", -// } class PaddingSymmetric extends StatelessWidget { const PaddingSymmetric({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json new file mode 100644 index 00000000..1b02584c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "物理模块", + "info": "可以让子组件按照圆形、方行进行剪裁,并且可以指定背景色、圆角、影深、阴影颜色、剪切行为。", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModel基本使用", + "desc": [ + "【clipBehavior】 : 裁剪行为 【Clip】", + "【borderRadius】 : 圆角 【BorderRadius】", + "【child】 : 子组件 【Widget】", + "【elevation】 : 阴影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【shape】 : 形状 【BoxShape】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart index 9e91a181..716ec9ff 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: 296 PhysicalModel 物理模块 可以让子组件按照圆形、方行进行剪裁,并且可以指定背景色、圆角、影深、阴影颜色、剪切行为。 -// { -// "widgetId": 296, -// "name": "PhysicalModel基本使用", -// "priority": 1, -// "subtitle": "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【borderRadius】 : 圆角 【BorderRadius】\n" -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 阴影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【shape】 : 形状 【BoxShape】\n" -// "【color】: 颜色 【Color】", -// } + class PhysicalModelDemo extends StatelessWidget{ const PhysicalModelDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json new file mode 100644 index 00000000..d09a1683 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "物理形状", + "info": "可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShape基本使用", + "desc": [ + "【clipper】 : 裁剪器 【CustomClipper】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【child】 : 子组件 【Widget】", + "【elevation】 : 阴影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart index ee4e255b..e2f4e872 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart @@ -3,18 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 279 PhysicalShape 物理形状 可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。 -// { -// "widgetId": 279, -// "name": "PhysicalShape基本使用", -// "priority": 1, -// "subtitle": "【clipper】 : 裁剪器 【CustomClipper】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 阴影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【color】: 颜色 【Color】", -// } + class PhysicalShapeDemo extends StatelessWidget { const PhysicalShapeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json new file mode 100644 index 00000000..b2ee37a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "重绘边界", + "info": "为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundary基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "比如上面的绘制视图,即使shouldRepaint为false,在滑动中会也会不断执行paint方法,使用RepaintBoundary可以避免不必要的绘制。" + ] + }, + { + "file": "node2_save.dart", + "name": "保存Widget成为图片", + "desc": [ + "通过RenderRepaintBoundary可以获取子组件的Image信息,从而获取字节保存为图片文件。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart index 3bb29b5d..f26bf1f0 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node1_base.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 264 RepaintBoundary 重绘边界 为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用。 -// { -// "widgetId": 264, -// "name": "RepaintBoundary基本使用", -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "比如上面的绘制视图,即使shouldRepaint为false,在滑动中会也会不断执行paint方法,使用RepaintBoundary可以避免不必要的绘制。", -// } + class RepaintBoundaryDemo extends StatelessWidget{ const RepaintBoundaryDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart index 953203af..97430942 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart @@ -8,13 +8,7 @@ import 'node1_base.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 264, -// "name": "保存Widget成为图片", -// "priority": 2, -// "subtitle": "通过RenderRepaintBoundary可以获取子组件的Image信息,从而获取字节保存为图片文件。", -// } + class RepaintBoundarySave extends StatelessWidget { final GlobalKey _globalKey = GlobalKey(); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json new file mode 100644 index 00000000..87b81cb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "旋转盒", + "info": "可容纳一个子组件,将其沿顺时针旋转quarterTurns*90°。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【quarterTurns】 : 旋转多少个90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart index 14a53292..622d17f5 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 72, -// "name": 'RotatedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【quarterTurns】 : 旋转多少个90° 【int】", -// } class CustomRotatedBox extends StatefulWidget { const CustomRotatedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json new file mode 100644 index 00000000..35722682 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "着色器遮罩", + "info": "可容纳一个孩子,并通过着色器来对孩子进行着色,可指定混色模式。通常用于组件渐变色处理。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "径向渐变着色", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【shaderCallback】 : 着色器回调 【ShaderCallback】", + "【blendMode】 : 混色模式 【BlendMode】", + " 通过RadialGradient#createShader创建径向渐变着色器。" + ] + }, + { + "file": "node2_linear.dart", + "name": "线性渐变着色", + "desc": [ + "通过LinearGradient#createShader创建线性渐变着色器", + "着色器相关知识详见【绘制专辑】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart index 5a55953c..7f9bda4c 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 277, -// "name": '径向渐变着色', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【shaderCallback】 : 着色器回调 【ShaderCallback】\n" -// "【blendMode】 : 混色模式 【BlendMode】\n" -// " 通过RadialGradient#createShader创建径向渐变着色器。", -// } + class RadialShaderMask extends StatelessWidget { const RadialShaderMask({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart index 8bf54085..2a96d7b3 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 277, -// "name": '线性渐变着色', -// "priority": 2, -// "subtitle": "通过LinearGradient#createShader创建线性渐变着色器\n" -// "着色器相关知识详见【绘制专辑】", -// } + class LinearShaderMask extends StatelessWidget { const LinearShaderMask({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json new file mode 100644 index 00000000..8cc2e40a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "尺寸变化通告", + "info": "使用 SizeChangedLayoutNotifier 可以在子组件布局区域发生变化后,发出通知。使用NotificationListener可以进行监听。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart index 3e5c2d14..4dd5fe89 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 294 SizeChangedLayoutNotifier 尺寸变化通告 使用 SizeChangedLayoutNotifier 可以在子组件布局区域发生变化后,发出通知。使用NotificationListener可以进行监听。 -// { -// "widgetId": 294, -// "name": '基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 组件 【Widget】", -// } + class SizeChangedLayoutNotifierDemo extends StatefulWidget { const SizeChangedLayoutNotifierDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json new file mode 100644 index 00000000..825a2c2a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "定尺寸盒", + "info": "可容纳一个子组件,通过指定宽高限定子组件容身区域。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart index 09f29525..3147a97f 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 76, -// "name": 'SizedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】", -// } class CustomSizedBox extends StatelessWidget { const CustomSizedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json new file mode 100644 index 00000000..e0bb0279 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "尺寸溢出盒", + "info": "可容纳一个子组件,且子组件允许溢出父组件区域,可以通过size属性对子组件进行偏移,拥有对齐属性alignment。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【size】 : 尺寸偏移 【Size】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart index 6cd73dab..8270a626 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 84, -// "name": 'SizedOverflowBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【size】 : 尺寸偏移 【Size】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } class CustomSizedOverflowBox extends StatefulWidget { const CustomSizedOverflowBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json new file mode 100644 index 00000000..74a4da8c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "变换", + "info": "可容纳一个子组件,可以通过一个4*4的变换矩阵对子组件进行变换。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "斜切变换skew", + "desc": [ + "斜切x由R0C1数控制,入参为弧度值,表示斜切角度", + "斜切y由R1C0数控制,入参为弧度值,表示斜切角度" + ] + }, + { + "file": "node2_translation.dart", + "name": "平移变换translationValues", + "desc": [ + "平移x由R0C3数控制,入参为数值,表示平移长度", + "平移y由R1C3数控制,入参为数值,表示平移长度", + "平移z由R2C3数控制,入参为数值,表示平移长度" + ] + }, + { + "file": "node3_scale.dart", + "name": "缩放变换diagonal3Values", + "desc": [ + "缩放x由R0C0数控制,入参为数值,表示缩放分率", + "缩放y由R1C2数控制,入参为数值,表示缩放分率", + "缩放z由R2C2数控制,入参为数值,表示缩放分率" + ] + }, + { + "file": "node4_rotate.dart", + "name": "旋转变换rotation", + "desc": [ + "x旋转由R1C1、R1C2、R2C1、R2C2控制,入参表示弧度", + "y旋转由R0C0、R0C2、R2C0、R2C2控制,入参表示弧度", + "z旋转由R0C0、R0C1、R1C0、R1C1控制," + ] + }, + { + "file": "node5_perspective.dart", + "name": "透视变换rotation", + "desc": [ + "由R3C1、R3C2、R3C3控制透视" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart index 1743e757..6fd4a91f 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node1_skew.dart @@ -5,15 +5,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '斜切变换skew', -// "priority": 1, -// "subtitle": "斜切x由R0C1数控制,入参为弧度值,表示斜切角度\n" -// "斜切y由R1C0数控制,入参为弧度值,表示斜切角度", -// } class SkewTransform extends StatefulWidget { const SkewTransform({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart index b560fb3f..0c67ffa1 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node2_translation.dart @@ -4,16 +4,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '平移变换translationValues', -// "priority": 2, -// "subtitle": "平移x由R0C3数控制,入参为数值,表示平移长度\n" -// "平移y由R1C3数控制,入参为数值,表示平移长度\n" -// "平移z由R2C3数控制,入参为数值,表示平移长度", -// } class TranslationTransform extends StatefulWidget { const TranslationTransform({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart index dc292ede..9d0e9a0c 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node3_scale.dart @@ -3,16 +3,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '缩放变换diagonal3Values', -// "priority": 3, -// "subtitle": "缩放x由R0C0数控制,入参为数值,表示缩放分率\n" -// "缩放y由R1C2数控制,入参为数值,表示缩放分率\n" -// "缩放z由R2C2数控制,入参为数值,表示缩放分率", -// } class ScaleTransform extends StatefulWidget { const ScaleTransform({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart index ac251ab2..569d2d28 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node4_rotate.dart @@ -6,16 +6,7 @@ import 'matrix4_shower.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '旋转变换rotation', -// "priority": 4, -// "subtitle": "x旋转由R1C1、R1C2、R2C1、R2C2控制,入参表示弧度\n" -// "y旋转由R0C0、R0C2、R2C0、R2C2控制,入参表示弧度\n" -// "z旋转由R0C0、R0C1、R1C0、R1C1控制,入参表示弧度\n" -// } class RotateTransform extends StatefulWidget { const RotateTransform({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart index 1875ee5e..09890b82 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/node5_perspective.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 78, -// "name": '透视变换rotation', -// "priority": 5, -// "subtitle": "由R3C1、R3C2、R3C3控制透视", -// } class R3C2 extends StatefulWidget { const R3C2({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json new file mode 100644 index 00000000..77714ac3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "无约束盒", + "info": "可容纳一个子组件,并解除该组件的所有区域约束,展现自我尺寸。", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBox基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【constrainedAxis】 : 仍受约束的轴*2 【Axis】", + "【alignment】 : 对齐方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart index b92505bf..e2d622f1 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 81, -// "name": 'UnConstrainedBox基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【constrainedAxis】 : 仍受约束的轴*2 【Axis】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】", -// } class CustomUnConstrainedBox extends StatefulWidget { const CustomUnConstrainedBox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..4182f302 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver导航条", + "info": "iOS11中导航条效果,展开时largeTitle显示,列表上滑后不显示,如果middle为空,largeTitle会以小字号作为middle。", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "导航条基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】 : 中间组件 【Widget】", + "【trailing】 : 尾部组件 【Widget】", + "【largeTitle】 : 底部折展组件 【Widget】", + "【border】 : 边线 【Border】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart index bd419ea8..48f3e2dd 100644 --- a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart @@ -3,20 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 302 CupertinoSliverNavigationBar Sliver导航条 iOS11中导航条效果,展开时largeTitle显示,列表上滑后不显示,如果middle为空,largeTitle会以小字号作为middle。 -// { -// "widgetId": 302, -// "name": '导航条基本使用', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【middle】 : 中间组件 【Widget】\n" -// "【trailing】 : 尾部组件 【Widget】\n" -// "【largeTitle】 : 底部折展组件 【Widget】\n" -// "【border】 : 边线 【Border】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsDirectional】", -// } + class CupertinoSliverNavigationBarDemo extends StatelessWidget { CupertinoSliverNavigationBarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json new file mode 100644 index 00000000..c8ba82c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver刷新控制器", + "info": "iOS风格的下拉刷新控制器,可执行异步刷新方法、自定义控制器组件、指示器停留高度和触发加载的滑动高度。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "刷新控制器基本使用", + "desc": [ + "【refreshIndicatorExtent】 : 加载中指示器高度 【double】", + "【refreshTriggerPullDistance】 : 触发加载的滑动高度 【double】", + "【onRefresh】 : 下拉事件 【RefreshCallback】", + "【builder】 : 指示器构造器 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart index edf3fb4d..47975d7c 100644 --- a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/node1_base.dart @@ -5,17 +5,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 303 CupertinoSliverRefreshControl Sliver刷新控制器 iOS风格的下拉刷新控制器,可执行异步刷新方法、自定义控制器组件、指示器停留高度和触发加载的滑动高度。 -// { -// "widgetId": 303, -// "name": '刷新控制器基本使用', -// "priority": 1, -// "subtitle": -// "【refreshIndicatorExtent】 : 加载中指示器高度 【double】\n" -// "【refreshTriggerPullDistance】 : 触发加载的滑动高度 【double】\n" -// "【onRefresh】 : 下拉事件 【RefreshCallback】\n" -// "【builder】 : 指示器构造器 【RefreshControlIndicatorBuilder】", -// } + class CupertinoSliverRefreshControlDemo extends StatefulWidget { const CupertinoSliverRefreshControlDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json new file mode 100644 index 00000000..5bbfabdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "通用滑动视图", + "info": "一个通用的滑动结构,可以指定滑动方向、是否反向、滑动控制器等属性。其中包含的子组件们必须是Sliver家族。", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollView基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】", + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart index 8c1ec6d2..4f8b8043 100644 --- a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 183, -// "name": 'CustomScrollView基本使用', -// "priority": 1, -// "subtitle": "【slivers】 : 子组件列表 【List】\n" -// "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【controller】 : 控制器 【ScrollController】", -// } + class CustomScrollViewDemo extends StatelessWidget { CustomScrollViewDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json new file mode 100644 index 00000000..ea9dfa29 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "装饰滑片", + "info": "该组件应用于滑动视口中,可以包裹一个子 Sliver 组件,为其添加 Decoration 装饰效果。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver 基本使用", + "desc": [ + "【sliver】 : 孩子组件 【Widget?】", + "【decoration】 : 装饰对象 【Decoration】", + "【position】 : 装饰位置 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart index cbeb023a..85379eae 100644 --- a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/node1.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/8/18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 209, -// "name": 'DecoratedSliver 基本使用', -// "priority": 1, -// "subtitle": -// "【sliver】 : 孩子组件 【Widget?】\n" -// "【decoration】 : 装饰对象 【Decoration】\n" -// "【position】 : 装饰位置 【DecorationPosition】", -// } + class DecorationSliverDemo extends StatelessWidget { const DecorationSliverDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json new file mode 100644 index 00000000..af842005 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "伸展空间栏", + "info": "通常用于SliverAppBar中的可伸展区域,可指定标题、标题间距、背景、折叠模式等。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBar基本使用", + "desc": [ + "【title】 : 标题组件 【Widget】", + "【titlePadding】 : 标题间距 【EdgeInsetsGeometry】", + "【collapseMode】 : 折叠模式 【CollapseMode】", + "【stretchModes】 : 延伸模式 【List】", + "【background】 : 背景组件 【Widget】", + "【centerTitle】 : 是否居中 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart index 4e459881..ba83d7a5 100644 --- a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 196, -// "name": 'FlexibleSpaceBar基本使用', -// "priority": 1, -// "subtitle": "【title】 : 标题组件 【Widget】\n" -// "【titlePadding】 : 标题间距 【EdgeInsetsGeometry】\n" -// "【collapseMode】 : 折叠模式 【CollapseMode】\n" -// "【stretchModes】 : 延伸模式 【List】\n" -// "【background】 : 背景组件 【Widget】\n" -// "【centerTitle】 : 是否居中 【bool】", -// } + class FlexibleSpaceBarDemo extends StatelessWidget { FlexibleSpaceBarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json new file mode 100644 index 00000000..3e96db1f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver动画列表", + "info": "在插入或删除项目时使其有动画效果的sliver组件。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList基本使用", + "desc": [ + "【itemBuilder】 : item构造器 【AnimatedListItemBuilder】", + "【initialItemCount】 : 初始item个数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart index a039aec7..033918cb 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/node1_base.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 301 SliverAnimatedList Sliver动画列表 在插入或删除项目时使其有动画效果的sliver组件。 -// { -// "widgetId": 301, -// "name": 'SliverAnimatedList基本使用', -// "priority": 1, -// "subtitle": "【itemBuilder】 : item构造器 【AnimatedListItemBuilder】\n" -// "【initialItemCount】 : 初始item个数 【int】", -// } + class SliverAnimatedListDemo extends StatefulWidget { const SliverAnimatedListDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json new file mode 100644 index 00000000..04ea3ea5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver头部栏", + "info": "Sliver家族的顶部栏通用结构,可以指定左中右组件、收缩空间、影深、固定模式、背景色等属性。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【title】 : 中间组件 【Widget】", + "【actions】 : 尾部组件列表 【List】", + "【floating】 : 是否浮动 【bool】", + "【pinned】 : 是否顶部停留 【bool】", + "【snap】 : 是否半收展 【bool】", + "【bottom】 : 底部组件 【PreferredSizeWidget】", + "【expandedHeight】 : 延展高度 【double】", + "【elevation】 : 影深 【double】", + "【flexibleSpace】 : 延展空间 【FlexibleSpaceBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : 控制器 【ScrollController】", + " snap为true时必需floating为true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart index ffe8d780..12cff8d3 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/node1_base.dart @@ -2,25 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 184, -// "name": 'SliverAppBar基本使用', -// "priority": 1, -// "subtitle": "【leading】 : 左侧组件 【Widget】\n" -// "【title】 : 中间组件 【Widget】\n" -// "【actions】 : 尾部组件列表 【List】\n" -// "【floating】 : 是否浮动 【bool】\n" -// "【pinned】 : 是否顶部停留 【bool】\n" -// "【snap】 : 是否半收展 【bool】\n" -// "【bottom】 : 底部组件 【PreferredSizeWidget】\n" -// "【expandedHeight】 : 延展高度 【double】\n" -// "【elevation】 : 影深 【double】\n" -// "【flexibleSpace】 : 延展空间 【FlexibleSpaceBar】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【controller】 : 控制器 【ScrollController】\n" -// " snap为true时必需floating为true", -// } + class SliverAppBarDemo extends StatefulWidget { const SliverAppBarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json new file mode 100644 index 00000000..1e66edb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "交叉轴尺寸约束滑片", + "info": "为一个 Sliver 组件在交叉轴方向上,指定尺寸大小来限制滑片尺寸。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 基本使用", + "desc": [ + "【maxExtent】 : 大小 【double】", + "【sliver】 : 子组件 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart index e49d2c39..b591d991 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/node1.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/8/18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 270, -// "name": 'SliverConstrainedCrossAxis 基本使用', -// "priority": 1, -// "subtitle": -// "【maxExtent】 : 大小 【double】\n" -// "【sliver】 : 子组件 【Widget?】", -// } + class SliverConstrainedCrossAxisDemo extends StatelessWidget { const SliverConstrainedCrossAxisDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json new file mode 100644 index 00000000..be048a2e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "交叉轴延展滑片", + "info": "为一个 Sliver 组件在交叉轴方向上,指定 flex 占比来限制滑片尺寸。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 基本使用", + "desc": [ + "【flex】 : 占比 【int】", + "【sliver】 : 子组件 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart index 2ff5359e..419af803 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/node1.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/8/18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 271, -// "name": 'SliverCrossAxisExpanded 基本使用', -// "priority": 1, -// "subtitle": -// "【flex】 : 占比 【int】\n" -// "【sliver】 : 子组件 【Widget?】", -// } + class SliverCrossAxisExpandedDemo extends StatelessWidget { const SliverCrossAxisExpandedDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json new file mode 100644 index 00000000..a6d2cc9f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "交叉轴滑片组", + "info": "可以容纳多个 Sliver 组件,让它们在滑动的交叉主轴方向上视为一组。", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart index 954accbc..3533f0f6 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/node1.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/8/18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 269, -// "name": 'SliverCrossAxisGroup 基本使用', -// "priority": 1, -// "subtitle": -// "【slivers】 : 子组件列表 【List】", -// } + class SliverCrossAxisGroupDemo extends StatelessWidget { const SliverCrossAxisGroupDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json new file mode 100644 index 00000000..19bbb668 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver填补剩余", + "info": "一个包含单个box子元素的sliver,它填充了视窗中的剩余空间。可指定两个bool值控制滑动效果,如下示例,自己体会。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining基本使用", + "desc": [ + "【hasScrollBody】 : 是否具有滚动主体 【bool】", + "【fillOverscroll】 : 是否可填充滚动区域 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart index f4428881..e3a0edf5 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 306 SliverFillRemaining Sliver填补剩余 一个包含单个box子元素的sliver,它填充了视窗中的剩余空间。 -// { -// "widgetId": 306, -// "name": 'SliverFillRemaining基本使用', -// "priority": 1, -// "subtitle": "【hasScrollBody】 : 是否具有滚动主体 【bool】\n" -// "【fillOverscroll】 : 是否可填充滚动区域 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } + class SliverFillRemainingDemo extends StatefulWidget { const SliverFillRemainingDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json new file mode 100644 index 00000000..f1079775 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver填充视图列表", + "info": "Sliver家族的列表组件,通过delegate构造子组件,item的高度会填空视口,可以指定是否的分率。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewport基本使用", + "desc": [ + "【viewportFraction】 : 视口分率 【double】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart index a609de57..f8ce2d42 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 187, -// "name": 'SliverFillViewport基本使用', -// "priority": 1, -// "subtitle": "【viewportFraction】 : 视口分率 【double】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } + class SliverFillViewportDemo extends StatefulWidget { const SliverFillViewportDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json new file mode 100644 index 00000000..cc974701 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver固定延展列表", + "info": "Sliver家族的列表组件,通过delegate构造子组件,可以指定item的高度。通常用于CustomScrollView中。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList基本使用", + "desc": [ + "【itemExtent】 : 主轴方向强迫长度 【double】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart index ebcf3bbf..11efccb2 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 186, -// "name": 'SliverFixedExtentList基本使用', -// "priority": 1, -// "subtitle": "【itemExtent】 : 主轴方向强迫长度 【double】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } + class SliverFixedExtentListDemo extends StatefulWidget { const SliverFixedExtentListDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json new file mode 100644 index 00000000..0a409789 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver网格", + "info": "Sliver家族的网格列表组件,和GirdView类似,通过count和extent构造。通常用于CustomScrollView中。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList基本使用", + "desc": [ + "SliverGrid.count 指定轴向数量构造", + "SliverGrid.extent 指定轴向长度构造", + "属性特征同GridView,可详见之" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json new file mode 100644 index 00000000..b3273228 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver忽略事件", + "info": "可以包裹一个sliver组件,通过ignoring来控制该sliver组件是否可以响应事件。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointer基本使用", + "desc": [ + "【sliver】 : sliver组件 【Widget】", + "【ignoring】 : 是否忽略事件 【bool】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart index 0efb5c3f..28123a77 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/node1_base.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 305 SliverIgnorePointer Sliver忽略事件 可以包裹一个sliver组件,通过ignoring来控制该sliver组件是否可以响应事件。 -// { -// "widgetId": 305, -// "name": 'SliverIgnorePointer基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : sliver组件 【Widget】\n" -// "【ignoring】 : 是否忽略事件 【bool】\n", -// } + class SliverIgnorePointerDemo extends StatefulWidget { const SliverIgnorePointerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json new file mode 100644 index 00000000..4e8ad40a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver布局构造器", + "info": "Sliver家族一员,在滑动过程中可以通过回调出的 SliverConstraints 对象进行子组件的构造。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilder基本使用", + "desc": [ + "【builder】 : 组件构造器 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart index 7e36248d..88ec65aa 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/node1_base.dart @@ -4,13 +4,7 @@ import 'package:flutter/rendering.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 304 SliverLayoutBuilder Sliver布局构造器 Sliver家族一员,在滑动过程中可以通过回调出的 SliverConstraints 对象进行子组件的构造。 -// { -// "widgetId": 304, -// "name": 'SliverLayoutBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】 : 组件构造器 【SliverLayoutWidgetBuilder】", -// } + class SliverLayoutBuilderDemo extends StatefulWidget { const SliverLayoutBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json new file mode 100644 index 00000000..6b776f33 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver列表", + "info": "Sliver家族的列表组件,通过指定delegate构造子组件。通常用于CustomScrollView中。", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList基本使用", + "desc": [ + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart index 1be3ef68..99a7f78f 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 185, -// "name": 'SliverList基本使用', -// "priority": 1, -// "subtitle": "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } + class SliverListDemo extends StatelessWidget { SliverListDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json new file mode 100644 index 00000000..7abcc8f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "主轴滑片组", + "info": "可以容纳多个 Sliver 组件,让它们在滑动的主轴方向上视为一组。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子组件列表 【List】", + "可结合 SliverPersistentHeader 实现分组,标题吸顶效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart index 0126e889..5675f9e0 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/node1.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/8/18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 268, -// "name": 'SliverMainAxisGroup 基本使用', -// "priority": 1, -// "subtitle": -// "【slivers】 : 子组件列表 【List】\n" -// "可结合 SliverPersistentHeader 实现分组,标题吸顶效果。", -// } + class ItemData { final String groupName; final List users; diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json new file mode 100644 index 00000000..7aa31a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver透明度", + "info": "可容纳一个Sliver家族的子组件,并通过opacity来指定子组件的透明度。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacity基本使用", + "desc": [ + "【opacity】 : 透明度 【double】", + "【sliver】 : 子组件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart index 0bd0136f..b286e18e 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 192, -// "name": 'SliverOpacity基本使用', -// "priority": 1, -// "subtitle": "【opacity】 : 透明度 【double】\n" -// "【sliver】 : 子组件 【Function()】", -// } + class SliverOpacityDemo extends StatelessWidget { SliverOpacityDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json new file mode 100644 index 00000000..7ced3355 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "重叠吸收器", + "info": "包裹另一个的sliver,并迫使其布局范围被视为重叠。需要和SliverOverlapInjector联用。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorber基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart index 8b1ea2c0..5373277f 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 307, -// "name": 'SliverOverlapAbsorber基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。", -// } class SliverOverlapAbsorberDemo extends StatelessWidget { const SliverOverlapAbsorberDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json new file mode 100644 index 00000000..519e019d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "重叠注射器", + "info": "一个sliver,需要和SliverOverlapAbsorber联用,处理视图重叠问题。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjector基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【handle】 : *处理器 【SliverOverlapAbsorberHandle】", + "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart index 4bd83083..51daa157 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 308, -// "name": 'SliverOverlapInjector基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【handle】 : *处理器 【SliverOverlapAbsorberHandle】\n" -// "如果不使用SliverOverlapAbsorber和SliverOverlapInjector组件,NestedScrollView的内容会和头部栏重叠。", -// } class SliverOverlapInjectorDemo extends StatelessWidget { const SliverOverlapInjectorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json new file mode 100644 index 00000000..e4bd9cbc --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver内间距", + "info": "可容纳一个Sliver家族的子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPadding基本使用", + "desc": [ + "【sliver】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart index 88343772..d7dd874d 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 191, -// "name": 'SliverPadding基本使用', -// "priority": 1, -// "subtitle": "【sliver】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class SliverPaddingDemo extends StatelessWidget { SliverPaddingDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json new file mode 100644 index 00000000..14433161 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Sliver存留头", + "info": "通常用于CustomScrollView中,可以让一个组件在滑动中停留在顶部,不会滑动消失。", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeader基本使用", + "desc": [ + "【delegate】 : 代理 【SliverPersistentHeaderDelegate】", + "【floating】 : 是否浮动 【bool】", + "【pinned】 : 是否顶部停留 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart index bed043a1..5c84cc71 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 190, -// "name": 'SliverPersistentHeader基本使用', -// "priority": 1, -// "subtitle": -// "【delegate】 : 代理 【SliverPersistentHeaderDelegate】\n" -// "【floating】 : 是否浮动 【bool】\n" -// "【pinned】 : 是否顶部停留 【bool】", -// } + class SliverPersistentHeaderDemo extends StatelessWidget { SliverPersistentHeaderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json new file mode 100644 index 00000000..4a5ffaf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver原型延伸列表", + "info": "其中prototypeItem属性是Widget,它负责约束主轴方向上item尺寸,但不会显示出来。delegate接受一个SliverChildDelegate完成item的创建。", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentList基本使用", + "desc": [ + "【prototypeItem】 : 主轴方向尺寸组件 【Widget】", + "【delegate】 : 孩子代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart index c2879864..04deb557 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 314 SliverPrototypeExtentList Sliver原型延伸列表 其中prototypeItem属性是一个Widget,该Widget负责在主轴方向上约束item尺寸,但会不显示出来。delegate接受一个SliverChildDelegate完成item的创建。 -// { -// "widgetId": 314, -// "name": 'SliverPrototypeExtentList基本使用', -// "priority": 1, -// "subtitle": -// "【prototypeItem】 : 主轴方向尺寸组件 【Widget】\n" -// "【delegate】 : 孩子代理 【SliverChildDelegate】", -// } + class SliverPrototypeExtentListDemo extends StatefulWidget { const SliverPrototypeExtentListDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json new file mode 100644 index 00000000..10aef0b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver适配器", + "info": "可以容纳一个普通的组件,并将其转化成Sliver家族组件的适配器。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapter基本使用", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart index ea283965..4ecd217e 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 189, -// "name": 'SliverToBoxAdapter基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } + class SliverToBoxAdapterDemo extends StatelessWidget { SliverToBoxAdapterDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json new file mode 100644 index 00000000..801ceb7f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver保活容器", + "info": "它是抽象类,不能单独使用。只有其子类才可以容纳 KeepAlive 的孩子.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 介绍", + "desc": [ + "【key】 : 键 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart index 1e2ddc30..e079ddc3 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 348 SliverWithKeepAliveWidget Sliver保活容器 -/// 它是抽象类,不能单独使用。只有其子类才可以容纳 KeepAlive 的孩子。 -/// link 316,239,188,185,314,186 -/// -// { -// "widgetId": 348, -// "name": 'SliverWithKeepAliveWidget 介绍', -// "priority": 1, -// "subtitle": -// "【key】 : 键 【Key】", -// } + class SliverWithKeepAliveWidgetDemo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json new file mode 100644 index 00000000..8d6d6db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "对齐变换", + "info": "AnimatedWidget的子类,使用Alignment类型的动画器让子组件在两个Alignment对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【alignment】 : 对齐动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart index 6a692e58..daf4201f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 111, -// "name": 'AlignTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【alignment】 : 对齐动画 【Animation】", -// } + class CustomAlignTransition extends StatefulWidget { const CustomAlignTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json new file mode 100644 index 00000000..f5ff4946 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "对齐动画", + "info": "能让子组件进行Align(对齐)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlign基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【curve】 : 动画曲线 【Duration】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart index b51d8614..6005ec16 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 120, -// "name": 'AnimatedAlign基本使用', -// "priority": 1, -// "subtitle": "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CustomAnimatedAlign extends StatefulWidget { const CustomAnimatedAlign({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json new file mode 100644 index 00000000..afc38032 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "动画构造器", + "info": "通过 builder 使动画对应的节点变为局部更新,并且可避免子组件刷新,减少构建的时间,提高动画性能。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 使用案例", + "desc": [ + "【animation】 : *可监听对象 【Listenable】", + "【builder】 : *组件构造器 【TransitionBuilder】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart index 2f616934..ea7fe567 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/node1_base.dart @@ -4,18 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 228 AnimatedBuilder 动画构造器 -/// 通过 builder 使动画对应的节点变为局部更新,并且可避免子组件刷新,减少构建的时间,提高动画性能。 -/// -// { -// "widgetId": 228, -// "name": 'AnimatedBuilder 使用案例', -// "priority": 1, -// "subtitle": -// "【animation】 : *可监听对象 【Listenable】\n" -// "【builder】 : *组件构造器 【TransitionBuilder】\n" -// "【child】 : 子组件 【Widget】", -// } + class AnimatedBuilderDemo extends StatefulWidget { const AnimatedBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json new file mode 100644 index 00000000..dbec27ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "容器动画", + "info": "集合alignment、padding、color、decoration、width、height、constraints、margin、transform于一身,这些属性皆可动画,可指定时长和曲线,有动画结束事件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainer基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【color】 : 颜色 【Color】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】", + "【alignment】 : 对齐 【AlignmentGeometry】", + "【decoration】 : 装饰 【Decoration】", + "【constraints】 : 约束 【BoxConstraints】", + "【transform】 : 变化 【Matrix4】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart index 274cb01f..e65689a2 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/node1_base.dart @@ -2,26 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 123, -// "name": 'AnimatedContainer基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【color】 : 颜色 【Color】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】\n" -// "【alignment】 : 对齐 【AlignmentGeometry】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【constraints】 : 约束 【BoxConstraints】\n" -// "【transform】 : 变化 【Matrix4】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CustomAnimatedContainer extends StatefulWidget { const CustomAnimatedContainer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json new file mode 100644 index 00000000..1c069585 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "组件切换", + "info": "将两个组件切换时呈现动画效果,可指定动画曲线、时长、对齐方式等属性。是一个非常有用的组件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFade基本使用", + "desc": [ + "【firstChild】 : 第一孩子 【Widget】", + "【secondChild】 : 第二孩子 【Widget】", + "【crossFadeState】 : 显示第几个 【CrossFadeState】", + "【duration】 : 时长 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFade动画曲线", + "desc": [ + "【firstCurve】 : 第一曲线 【Curve】", + "【secondCurve】 : 第二曲线 【Curve】", + "【sizeCurve】 : 尺寸变化曲线 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart index 766d12fa..627d7861 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-20 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 100, -// "name": 'AnimatedCrossFade基本使用', -// "priority": 1, -// "subtitle": -// "【firstChild】 : 第一孩子 【Widget】\n" -// "【secondChild】 : 第二孩子 【Widget】\n" -// "【crossFadeState】 : 显示第几个 【CrossFadeState】\n" -// "【duration】 : 时长 【Duration】", -// } class CustomAnimatedCrossFade extends StatefulWidget { const CustomAnimatedCrossFade({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart index eab90617..946798ae 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/node2_curve.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-20 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 100, -// "name": 'AnimatedCrossFade动画曲线', -// "priority": 2, -// "subtitle": -// "【firstCurve】 : 第一曲线 【Curve】\n" -// "【secondCurve】 : 第二曲线 【Curve】\n" -// "【sizeCurve】 : 尺寸变化曲线 【CrossFadeState】", -// } class CurveAnimatedCrossFade extends StatefulWidget { const CurveAnimatedCrossFade({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json new file mode 100644 index 00000000..0f48f68e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "容器动画", + "info": "能让子文字组件进行TextStyle(文字样式)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyle基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【softWrap】 : 是否包裹 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : 溢出模式 【TextOverflow】", + "【style】 : 文字样式 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart index 71ccd188..5923a1f9 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 124, -// "name": 'AnimatedDefaultTextStyle基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【softWrap】 : 是否包裹 【bool】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【overflow】 : 溢出模式 【TextOverflow】\n" -// "【style】 : 文字样式 【TextStyle】", -// } + class CustomAnimatedDefaultTextStyle extends StatefulWidget { const CustomAnimatedDefaultTextStyle({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json new file mode 100644 index 00000000..0553e92f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "动画列表", + "info": "强化版的ListView,可以对item进行动画处理。比如在添加、删除是item的动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedList基本使用", + "desc": [ + "【itemBuilder】 : 组件构造器 【AnimatedListItemBuilder】", + "【initialItemCount】 : 子组件数量 【int】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【controller】 : 滑动控制器 【ScrollController】", + "【reverse】 : 数据是否反向 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart index 05730467..bbc7682c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 117, -// "name": 'AnimatedList基本使用', -// "priority": 1, -// "subtitle": "【itemBuilder】 : 组件构造器 【AnimatedListItemBuilder】\n" -// "【initialItemCount】 : 子组件数量 【int】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【controller】 : 滑动控制器 【ScrollController】\n" -// "【reverse】 : 数据是否反向 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CustomAnimatedList extends StatefulWidget { const CustomAnimatedList({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json new file mode 100644 index 00000000..7697738b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "动画屏障模", + "info": "内部依赖 ModalBarrier 实现,功能一致,只不过该组件可以传入一个颜色动画,进行过渡展现。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 介绍", + "desc": [ + "【dismissible】 : 点击是否返回 【bool】", + "【color】 : 颜色 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart index 99289c48..a01d1d7b 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: 227 AnimatedModalBarrier 动画屏障模 -/// 内部依赖 ModalBarrier 实现,功能一致,只不过该组件可以传入一个颜色动画,进行过渡展现。 -/// link: 212 -// { -// "widgetId": 227, -// "name": 'AnimatedModalBarrier 介绍', -// "priority": 1, -// "subtitle": -// "【dismissible】 : 点击是否返回 【bool】\n" -// "【color】 : 颜色 【Animation】", -// } + class AnimatedModalBarrierDemo extends StatefulWidget { const AnimatedModalBarrierDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json new file mode 100644 index 00000000..4939396b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "透明动画", + "info": "能让子组件进行Opacity(透明度)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacity基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【opacity】 : 透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart index f22efe95..8bc2cba6 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 118, -// "name": 'AnimatedOpacity基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【opacity】 : 透明度 【double】", -// } + class CustomAnimatedOpacity extends StatefulWidget { const CustomAnimatedOpacity({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json new file mode 100644 index 00000000..0b7eafc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "边距动画", + "info": "能让子组件进行Padding(内边距)动画,可指定时长和曲线,有动画结束事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPadding基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart index 0fb58e3e..000ae15e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 119, -// "name": 'AnimatedPadding基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CustomAnimatedPadding extends StatefulWidget { const CustomAnimatedPadding({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json new file mode 100644 index 00000000..12cf3594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "物理模块动画", + "info": "相关属性变化时具有动画效果的PhysicalModel组件,本质是PhysicalModel和动画结合的产物。可指定阴影、影深、圆角、动画时长、结束回调等属性。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModel基本使用", + "desc": [ + "【color】 : 背景色 【Color】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【shape】 : 形状 【BoxShape】", + "【elevation】 : 影深 【double】", + "【borderRadius】 : 圆角 【BorderRadius】", + "【shadowColor】 : 阴影色 【Color】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart index f9e67124..c96a4f6e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: 225 相关属性变化时具有动画效果的PhysicalModel组件,本质是PhysicalModel和动画结合的产物。可指定阴影、影深、圆角、动画时长、结束回调等属性。 -// { -// "widgetId": 225 , -// "name": 'AnimatedPhysicalModel基本使用', -// "priority": 1, -// "subtitle": -// "【color】 : 背景色 【Color】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【shape】 : 形状 【BoxShape】\n" -// "【elevation】 : 影深 【double】\n" -// "【borderRadius】 : 圆角 【BorderRadius】\n" -// "【shadowColor】 : 阴影色 【Color】\n" -// "【child】 : 子组件 【Widget】", -// } + class AnimatedPhysicalModelDemo extends StatefulWidget { const AnimatedPhysicalModelDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json new file mode 100644 index 00000000..4fe0c26f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "定位动画", + "info": "能让子组件进行Positioned(定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositioned基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【top】 : 到父顶距离 【double】", + "【right】 : 到父右距离 【double】", + "【left】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart index 3e1f4343..65885b9e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 121, -// "name": 'AnimatedPositioned基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【right】 : 到父右距离 【double】\n" -// "【left】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } + class CustomAnimatedPositioned extends StatefulWidget { const CustomAnimatedPositioned({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json new file mode 100644 index 00000000..585f8084 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "方向定位动画", + "info": "能让子组件进行PositionedDirectional(方向定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【top】 : 到父顶距离 【double】", + "【end】 : 到父右距离 【double】", + "【start】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart index 9b9f320b..558c62ce 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 122, -// "name": 'AnimatedPositionedDirectional基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【end】 : 到父右距离 【double】\n" -// "【start】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } + class CustomAnimatedPositionedDirectional extends StatefulWidget { const CustomAnimatedPositionedDirectional({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json new file mode 100644 index 00000000..6b783f19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "动画切换", + "info": "当子组件变化时执行动画,需要指定子组件的key进行标识。动画方式可以自定义,能指定动画时长、动画曲线等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcher基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【switchOutCurve】 : 切出曲线 【Curves】", + "【switchInCurve】 : 切入曲线 【Curves】", + "【switchInCurve】 : 切入曲线 【Curves】", + "【transitionBuilder】 : 动画构造器 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart index ebd9e8ec..dd7f8164 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 116, -// "name": 'AnimatedSwitcher基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【switchOutCurve】 : 切出曲线 【Curves】\n" -// "【switchInCurve】 : 切入曲线 【Curves】\n" -// "【switchInCurve】 : 切入曲线 【Curves】\n" -// "【transitionBuilder】 : 动画构造器 【Widget Function(Widget, Animation)】", -// } class CustomAnimatedSwitcher extends StatefulWidget { const CustomAnimatedSwitcher({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json new file mode 100644 index 00000000..65224b21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "动画主题", + "info": "主题变化时具有动画效果的组件,本质是Theme组件和动画结合的产物。可指定ThemeData、动画时长、曲线、结束回调等。相当于增强版的Theme组件。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedTheme基本使用", + "desc": [ + "【data】 : 主题数据 【ThemeData】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart index a6e7fa88..eda0d045 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: 224 主题变化时具有动画效果的组件,本质是Theme组件和动画结合的产物。可指定ThemeData、动画时长、曲线、结束回调等。相当于增强版的Theme组件。 -// { -// "widgetId": 224 , -// "name": 'AnimatedTheme基本使用', -// "priority": 1, -// "subtitle": "【data】 : 主题数据 【ThemeData】\n" -// "【duration】 : 动画时长 【Duration】\n" -// "【onEnd】 : 动画结束回调 【Function()】\n" -// "【curve】 : 动画曲线 【Duration】\n" -// "【child】 : 子组件 【Widget】", -// } + class AnimatedThemeDemo extends StatefulWidget { const AnimatedThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json new file mode 100644 index 00000000..1ab0dc10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "应用头栏", + "info": "一个应用顶部栏的通用结构,可在指定的部位放置相应的组件,常用于Scaffold组件中。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【title】 : 中间组件 【Widget】", + "【actions】 : 右侧组件 【List】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【backgroundColor】 : 影深 【背景色】", + "【centerTitle】 : 中间是否居中 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBar与TabBar、TabBarView联用", + "desc": [ + "【bottom】 : 底部组件 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart index 35e450fe..1b86573e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node1_base.dart @@ -4,20 +4,7 @@ import '../PopupMenuButton/node1_base.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 57, -// "name": 'AppBar基本使用', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【title】 : 中间组件 【Widget】\n" -// "【actions】 : 右侧组件 【List】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【backgroundColor】 : 影深 【背景色】\n" -// "【centerTitle】 : 中间是否居中 【bool】", -// } + class CustomAppBar extends StatelessWidget { const CustomAppBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart index 29301e14..5eaf703f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/node2_tab.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; import '../PopupMenuButton/node1_base.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 57, -// "name": 'AppBar与TabBar、TabBarView联用', -// "priority": 2, -// "subtitle": -// "【bottom】 : 底部组件 【PreferredSizeWidget】", -// } + class TabAppBar extends StatefulWidget { const TabAppBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json new file mode 100644 index 00000000..630f8742 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "自动保活", + "info": "在懒加载的列表中,允许子树请求保持状态,单独使用无效果,需要配合 KeepAliveNotification 使用。", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "在 ListView、SliverList、GridView、SliverGrid、PageView、TabBarView 等列表、切页组件源码中都有使用到 AutomaticKeepAlive 组件。在保活某个 State 时,可以使用 AutomaticKeepAliveClientMixin 进行操作,它是对 KeepAliveNotification 使用的一个简易封装。该示例展示出 ListView 条目的状态保活。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart index 2af44f57..1e82c6fe 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 239 AutomaticKeepAlive 自动保活 在懒加载的列表中,允许子树请求保持状态,单独使用无效果,需要配合 KeepAliveNotification 使用。 -/// link 59,162,163,165,185,188 -/// -// { -// "widgetId": 239, -// "name": 'AutomaticKeepAlive 介绍', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "在 ListView、SliverList、GridView、SliverGrid、PageView、TabBarView 等列表、切页组件源码中都有使用到 AutomaticKeepAlive 组件。在保活某个 State 时,可以使用 AutomaticKeepAliveClientMixin 进行操作,它是对 KeepAliveNotification 使用的一个简易封装。该示例展示出 ListView 条目的状态保活。", -// } + class AutomaticKeepAliveDemo extends StatelessWidget { AutomaticKeepAliveDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json new file mode 100644 index 00000000..e367a9f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "底部导航", + "info": "一个可凹嵌的底部导航栏,通常用于Scaffold组件的底部,可指定颜色、影深、形状等属性,可与PageView实现切页效果。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBar基本用法", + "desc": [ + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【NotchedShape】", + "【notchMargin】 : 间隔距离 【double】", + "【color】 : 颜色 【Color】", + "【child】 : 孩子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart index c65adf68..f0478b4e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/node1_base.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 61, -// "name": 'BottomAppBar基本用法', -// "priority": 1, -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【NotchedShape】\n" -// "【notchMargin】 : 间隔距离 【double】\n" -// "【color】 : 颜色 【Color】\n" -// "【child】 : 孩子 【Widget】", -// } + class CustomBottomAppBar extends StatefulWidget { const CustomBottomAppBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..2582fb6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "底部导航", + "info": "一个底部导航栏,通常用于Scaffold组件的底部,可指定颜色和模式,接受点击回调,可与PageView实现切页效果。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBar基本使用", + "desc": [ + "【currentIndex】 : 当前索引 【int】", + "【elevation】 : 影深 【double】", + "【type】 : 类型*2 【BottomNavigationBarType】", + "【fixedColor】 : type为fix的颜色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【iconSize】 : 图标大小 【double】", + "【selectedLabelStyle】 : 选中文字样式 【TextStyle】", + "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】", + "【showUnselectedLabels】 : 显示未选中标签 【bool】", + "【showSelectedLabels】 : 显示选中标签 【bool】", + "【items】 : 条目 【List】", + "【onTap】 : 点击事件 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "可结合PageView进行切页", + "desc": [ + "在onTap时进行使用控制器进行切页" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart index 4d706211..ca5caa22 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node1_base.dart @@ -1,25 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 60, -// "name": 'BottomNavigationBar基本使用', -// "priority": 1, -// "subtitle": -// "【currentIndex】 : 当前索引 【int】\n" -// "【elevation】 : 影深 【double】\n" -// "【type】 : 类型*2 【BottomNavigationBarType】\n" -// "【fixedColor】 : type为fix的颜色 【Color】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【selectedLabelStyle】 : 选中文字样式 【TextStyle】\n" -// "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n" -// "【showUnselectedLabels】 : 显示未选中标签 【bool】\n" -// "【showSelectedLabels】 : 显示选中标签 【bool】\n" -// "【items】 : 条目 【List】\n" -// "【onTap】 : 点击事件 【Function(int)】", -// } + class CustomBottomNavigationBar extends StatefulWidget { const CustomBottomNavigationBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart index c1b4e46c..e3b0ba15 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/node2_page.dart @@ -1,14 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com -/// 详情: -// { -// "widgetId": 60, -// "name": '可结合PageView进行切页', -// "priority": 2, -// "subtitle": -// "在onTap时进行使用控制器进行切页", -// } + class BottomNavigationBarWithPageView extends StatefulWidget { const BottomNavigationBarWithPageView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json new file mode 100644 index 00000000..8e387049 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "复选框", + "info": "复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Checkbox基础用法", + "desc": [ + "【value】 : 是否选中 【double】", + "【checkColor】: 选中时✔️gou颜色 【Color】", + "【activeColor】: 选中时框内颜色 【Color】", + "【onChanged】: 状态改变事件 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Checkbox的三态", + "desc": [ + "【tristate】 : 是否是三态 【double】", + " onChanged时," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart index 9ef6fab7..70988aea 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 39, -// "name": 'Checkbox基础用法', -// "priority": 1, -// "subtitle": -// "【value】 : 是否选中 【double】\n" -// "【checkColor】: 选中时✔️gou颜色 【Color】\n" -// "【activeColor】: 选中时框内颜色 【Color】\n" -// "【onChanged】: 状态改变事件 【Function(bool)】\n", -// } + class CustomCheckbox extends StatefulWidget { const CustomCheckbox({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart index 5ed15472..e0d55bd0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/node2_tristate.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com -/// 说明: -/// { -// "widgetId": 39, -// "name": 'Checkbox的三态', -// "priority": 2, -// "subtitle": -// "【tristate】 : 是否是三态 【double】\n" -// " onChanged时,回调true、null、false三种状态" -// } + class TristateCheckBok extends StatefulWidget { const TristateCheckBok({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json new file mode 100644 index 00000000..eb7776e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "圆形进度", + "info": "圆形的进度显示,可指定颜色、线宽、进度等属性。value为null时会不停旋转。", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicator基本使用", + "desc": [ + "【value】 : 进度 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 进度颜色 【Animation】", + "【strokeWidth】 : 线宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart index 302ffe7c..9a462969 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 46, -// "name": 'CircularProgressIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 进度 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【valueColor】 : 进度颜色 【Animation】\n" -// "【strokeWidth】 : 线宽 【double】", -// } + class CustomCircularProgressIndicator extends StatefulWidget { const CustomCircularProgressIndicator({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json new file mode 100644 index 00000000..afbc40be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS指示器", + "info": "iOS样式的loading显示组件,可指定半径和是否旋转。", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicator基本使用", + "desc": [ + "【animating】 : 是否loading动画 【bool】", + "【radius】 : 半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart index a3061e0e..29ccfb86 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 48, -// "name": 'CupertinoActivityIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【animating】 : 是否loading动画 【bool】\n" -// "【radius】 : 半径 【double】", -// } + class CustomCupertinoActivityIndicator extends StatelessWidget { const CustomCupertinoActivityIndicator({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json new file mode 100644 index 00000000..7cff756f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS应用", + "info": "iOS风格应用的顶级组件,包含路由生成器、主题、语言、主页等属性。", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoApp基本用法", + "desc": [ + "【theme】 : 主题 【ThemeData】", + "【title】 : 任务栏标题 【String】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【home】 : 主页 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart index eb710ee7..cf3ffb9c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020-03-17 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 156, -// "name": 'CupertinoApp基本用法', -// "priority": 1, -// "subtitle": "【theme】 : 主题 【ThemeData】\n" -// "【title】 : 任务栏标题 【String】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【home】 : 主页 【Widget】", -// } class CustomCupertinoApp extends StatelessWidget { const CustomCupertinoApp({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json new file mode 100644 index 00000000..97b0cf66 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS按钮", + "info": "iOS风格的按钮。可指定颜色、点击时透明度、内边距、圆角等。可接收点击事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【pressedOpacity】: 按下时透明度 【double】", + "【child】: 子组件 【Widget】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【borderRadius】: 圆角半径 【BorderRadius】", + "【onPressed】: 点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart index 0958538a..5cb83d6c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart @@ -1,18 +1,6 @@ /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 24, -// "priority": 1, -// "name": "CupertinoButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【pressedOpacity】: 按下时透明度 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【borderRadius】: 圆角半径 【BorderRadius】\n" -// "【onPressed】: 点击事件 【Function】", -// } + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json new file mode 100644 index 00000000..ead54490 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios弹出菜单", + "info": "一个华丽的iOS风格按钮弹出框,长按时会以动画的形式弹出菜单面板,通常和CupertinoContextMenuAction联用。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenu基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【actions】 : 行为组件集 【List】", + "【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart index c4c99809..2c1325b2 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 143, -// "name": 'CupertinoContextMenu基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【actions】 : 行为组件集 【List】\n" -// "【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】", -// } + class CustomCupertinoContextMenu extends StatelessWidget { const CustomCupertinoContextMenu({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json new file mode 100644 index 00000000..a510198e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios弹出菜单按钮", + "info": "一般只用于CupertinoContextMenu中的点击按钮。可指定孩子和尾部图标,接收点击事件。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【trailingIcon】 : 尾部 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart index f8cdf6eb..b2088273 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/node1_base.dart @@ -1,16 +1,6 @@ /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 144, -// "name": 'CupertinoContextMenuAction基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【trailingIcon】 : 尾部 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + import 'package:flutter/cupertino.dart'; class CustomCupertinoContextMenuAction extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json new file mode 100644 index 00000000..fee41db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS日期选择器", + "info": "高大上的滑滚日期选择器,可指定选择的类型、日期范围等,接收日期选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePicker基本使用", + "desc": [ + "【initialDateTime】 : 初始日期 【DateTime】", + "【minimumYear】 : 最小年份 【int】", + "【maximumYear】 : 最大年份 【int】", + "【onDateTimeChanged】 : 点击回调 【Function(DateTime)】", + "【minuteInterval】 : 分钟间隔 【int】", + "【use24hFormat】 : 是否是24小时制 【bool】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : 模式*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart index bcad7d5e..60cbd0cd 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/node1_base.dart @@ -3,21 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 137, -// "name": 'CupertinoDatePicker基本使用', -// "priority": 1, -// "subtitle": -// "【initialDateTime】 : 初始日期 【DateTime】\n" -// "【minimumYear】 : 最小年份 【int】\n" -// "【maximumYear】 : 最大年份 【int】\n" -// "【onDateTimeChanged】 : 点击回调 【Function(DateTime)】\n" -// "【minuteInterval】 : 分钟间隔 【int】\n" -// "【use24hFormat】 : 是否是24小时制 【bool】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【mode】 : 模式*3 【CupertinoDatePickerMode】", -// } + class CustomCupertinoDatePicker extends StatefulWidget { const CustomCupertinoDatePicker({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json new file mode 100644 index 00000000..a4c3cf06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS导航", + "info": "一个iOS风格的应用顶部栏的通用结构,可在指定的部位放置相应的组件。可指定背景色、间距、边线等属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar基本用法", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】 : 中间组件 【Widget】", + "【trailing】 : 尾部组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsDirectional】", + "【border】 : 边线 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart index ee39ef3e..d0abec83 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 62, -// "name": 'CupertinoNavigationBar基本用法', -// "priority": 1, -// "subtitle": -// "【leading】 : 左侧组件 【Widget】\n" -// "【middle】 : 中间组件 【Widget】\n" -// "【trailing】 : 尾部组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsDirectional】\n" -// "【border】 : 边线 【Border】", -// } + class CustomCupertinoNavigationBar extends StatelessWidget { const CustomCupertinoNavigationBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json new file mode 100644 index 00000000..1636363b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS页面脚手架", + "info": "iOS风格的页面布局脚手架结构,可指定顶部的导航栏和页面背景色。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold基本用法", + "desc": [ + "【child】 : 内容 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【navigationBar】 : 头部 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart index 54ad2ec1..d0950a29 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 157, -// "name": 'CupertinoPageScaffold基本用法', -// "priority": 1, -// "subtitle": -// "【child】 : 内容 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【navigationBar】 : 头部 【ObstructingPreferredSizeWidget】", -// } + class CustomCupertinoPageScaffold extends StatelessWidget { const CustomCupertinoPageScaffold({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json new file mode 100644 index 00000000..f04bba12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS选择器", + "info": "高大上的柱面滑动选择器,精妙十足,可指定很多配置属性,接收滑动时选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【offAxisFraction】 : 轴偏移率 【double】", + "【squeeze】 : 挤压率 【double】", + "【diameterRatio】 : 高与圆柱直径比率 【double】", + "【itemExtent】 : 间距 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【onSelectedItemChanged】 : 选中事件 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart index 20bcb53e..e00bb758 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 139, -// "name": 'CupertinoPicker基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【offAxisFraction】 : 轴偏移率 【double】\n" -// "【squeeze】 : 挤压率 【double】\n" -// "【diameterRatio】 : 高与圆柱直径比率 【double】\n" -// "【itemExtent】 : 间距 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【onSelectedItemChanged】 : 选中事件 【Function(int)】", -// } class CustomCupertinoPicker extends StatelessWidget { const CustomCupertinoPicker({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json new file mode 100644 index 00000000..861998d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS滑动指示栏", + "info": "iOS风格的滑动指示栏,需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbar基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart index e5a33283..03421687 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 195, -// "name": 'CupertinoScrollbar基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【controller】 : 控制器 【ScrollController】", -// } + class CustomCupertinoScrollbar extends StatelessWidget { CustomCupertinoScrollbar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json new file mode 100644 index 00000000..ae97e64e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS多栏切换", + "info": "iOS风格的多按钮栏,表现和ToggleButtons类似,可指定内边距、选中色、边线色等属性。", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS页签基本使用", + "desc": [ + "【children】 : 组件Map 【Map】", + "【onValueChanged】 : 值改变回调 【ValueChanged】", + "【groupValue】 : 选中值 【T】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControl的颜色", + "desc": [ + "【unselectedColor】 : 未选中色 【Color】", + "【selectedColor】 : 选中色 【Color】", + "【pressedColor】 : 按下色 【Color】", + "【borderColor】 : 边线色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart index e2cd73a6..357ecb5e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/cupertino.dart'; /// create by 张风捷特烈 on 2020/6/30 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 262, -// "name": 'iOS页签基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件Map 【Map】\n" -// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" -// "【groupValue】 : 选中值 【T】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CupertinoSegmentedControlDemo extends StatefulWidget { const CupertinoSegmentedControlDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart index db59addf..1a5098ed 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/node2_color.dart @@ -3,18 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/30 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 262, -// "name": 'CupertinoSegmentedControl的颜色', -// "priority": 2, -// "subtitle": -// "【unselectedColor】 : 未选中色 【Color】\n" -// "【selectedColor】 : 选中色 【Color】\n" -// "【pressedColor】 : 按下色 【Color】\n" -// "【borderColor】 : 边线色 【Color】", -// } + class CupertinoSegmentedControlColor extends StatefulWidget { const CupertinoSegmentedControlColor({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json new file mode 100644 index 00000000..09a46305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS滑块", + "info": "iOS风格的滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色,接收进度变化回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSlider基本使用", + "desc": [ + "【value】 : 数值 【double】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【activeColor】 : 激活颜色 【Color】", + "【thumbColor】 : 圆形颜色 【Color】", + "【divisions】 : 分段数 【int】", + "【onChangeStart】 : 开始滑动回调 【Function(double)】", + "【onChangeEnd】 : 滑动结束回调 【Function(double)】", + "【onChanged】 : 改变时回调 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart index fc08892c..b115de46 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 43, -// "name": 'CupertinoSlider基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 数值 【double】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【thumbColor】 : 圆形颜色 【Color】\n" -// "【divisions】 : 分段数 【int】\n" -// "【onChangeStart】 : 开始滑动回调 【Function(double)】\n" -// "【onChangeEnd】 : 滑动结束回调 【Function(double)】\n" -// "【onChanged】 : 改变时回调 【Function(double)】", -// } + class CustomCupertinoSlider extends StatefulWidget { const CustomCupertinoSlider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json new file mode 100644 index 00000000..cac065fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS滑动页签", + "info": "iOS风格的滑动页签,支持点击、滑动切换。可指定页签颜色、背景色、边距等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS滑动页签基本使用", + "desc": [ + "【children】 : 组件Map 【Map】", + "【onValueChanged】 : 值改变回调 【ValueChanged】", + "【groupValue】 : 选中值 【T】", + "【thumbColor】 : 选中色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart index ca98d299..088ae395 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/node1_base.dart @@ -3,19 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 256 CupertinoSlidingSegmentedControl iOS滑动页签 iOS风格的滑动页签,支持点击、滑动切换。可指定页签颜色、背景色、边距等属性。 -// { -// "widgetId": 256, -// "name": 'iOS滑动页签基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 组件Map 【Map】\n" -// "【onValueChanged】 : 值改变回调 【ValueChanged】\n" -// "【groupValue】 : 选中值 【T】\n" -// "【thumbColor】 : 选中色 【Color】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CupertinoSlidingSegmentedControlDemo extends StatefulWidget { const CupertinoSlidingSegmentedControlDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json new file mode 100644 index 00000000..b07fe449 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS切钮", + "info": "iOS风格的切换选钮,常用于配置的切换,可指定颜色,接收状态变化回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitch基本使用", + "desc": [ + "【value】 : 是否选中 【double】", + "【activeColor】 : 激活态颜色 【Color】", + "【onChanged】 : 切换回调 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart index 2a72e9c4..db405538 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -/// { -// "widgetId": 41, -// "name": 'CupertinoSwitch基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 是否选中 【double】\n" -// "【activeColor】 : 激活态颜色 【Color】\n" -// "【onChanged】 : 切换回调 【Function(double)】", -// } + class CustomCupertinoSwitch extends StatefulWidget { const CustomCupertinoSwitch({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json new file mode 100644 index 00000000..323d78bd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS页签", + "info": "一个iOS风格的TabBar,通常用于CupertinoTabScaffold。可指定颜色、图标大小、边线等数据。接收item的点击事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBar基本用法", + "desc": [ + "【currentIndex】 : 当前激活索引 【Widget】", + "【items】 : 条目组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【inactiveColor】 : 非激活色 【Color】", + "【activeColor】 : 激活色 【Color】", + "【iconSize】 : 图标大小 【double】", + "【border】 : 边线 【Border】", + "【onTap】 : 点击事件 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart index 218c5c74..523ee617 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 63, -// "name": 'CupertinoTabBar基本用法', -// "priority": 1, -// "subtitle": -// "【currentIndex】 : 当前激活索引 【Widget】\n" -// "【items】 : 条目组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【inactiveColor】 : 非激活色 【Color】\n" -// "【activeColor】 : 激活色 【Color】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【border】 : 边线 【Border】\n" -// "【onTap】 : 点击事件 【Function(int)】", -// } + class CustomCupertinoTabBar extends StatefulWidget { const CustomCupertinoTabBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json new file mode 100644 index 00000000..3f8ee2ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS页签脚手架", + "info": "iOS风格的页面布局脚手架结构,可指定最底部的导航切换栏可主体内容页。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold基本用法", + "desc": [ + "【tabBar】 : 页签条 【CupertinoTabBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : 控制器 【CupertinoTabController】", + "【tabBuilder】 : 页面构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart index 715b0fd5..8092538f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/node1_base.dart @@ -3,18 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 158, -// "name": 'CupertinoTabScaffold基本用法', -// "priority": 1, -// "subtitle": -// "【tabBar】 : 页签条 【CupertinoTabBar】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【controller】 : 控制器 【CupertinoTabController】\n" -// "【tabBuilder】 : 页面构造器 【IndexedWidgetBuilder】", -// } class CustomCupertinoTabScaffold extends StatefulWidget { const CustomCupertinoTabScaffold({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json new file mode 100644 index 00000000..927e90f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino页面", + "info": "可以像 MaterialApp 一样维护一个路由栈。通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabView基本使用", + "desc": [ + "【builder】 : 主页构造器 【WidgetBuilder】", + "【navigatorObservers】 : 路由监听器 【List】", + "【routes】 : 路由映射 【Map】", + "【onGenerateRoute】 : 路由工厂 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart index 5ecde41f..511a70d7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/node1_base.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 229 CupertinoTabView Cupertino页面 CupertinoTabView 可以像 MaterialApp 一样维护一个路由栈。通过 routes 、onGenerateRoute 来构建路由,可以通过 navigatorObservers 监听路由。 -// { -// "widgetId": 229, -// "name": 'CupertinoTabView基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 主页构造器 【WidgetBuilder】\n" -// "【navigatorObservers】 : 路由监听器 【List】\n" -// "【routes】 : 路由映射 【Map】\n" -// "【onGenerateRoute】 : 路由工厂 【RouteFactory】", -// } + class CupertinoTabViewDemo extends StatelessWidget { const CupertinoTabViewDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json new file mode 100644 index 00000000..a7141373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_zh-CN.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS风格输入框", + "info": "Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextField基础使用", + "desc": [ + "【placeholder】 : 提示文字 【String】", + "【showCursor】 : 是否显示游标 【bool】", + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【onChanged】 : 变化监听 【ValueChanged】", + "【onTap】: 点击监听 【GestureTapCallback】", + "【onSubmitted】: 提交监听 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextField常用样式属性", + "desc": [ + "【style】 : 输入文字样式 【TextStyle】", + "【prefix】: 前缀组件 【Widget】", + "【prefixMode】: 前缀模式 【OverlayVisibilityMode】", + "【suffix】: 后缀组件 【Widget】", + "【suffixMode】: 后缀模式 【OverlayVisibilityMode】", + "【cursorColor】: 游标颜色 【Color】", + "【cursorWidth】: 游标宽度 【double】", + "【cursorRadius】: 游标圆角 【Radius】", + "【readOnly】: 是否只读 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart index 2b8eba39..085ec04e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node1_base.dart @@ -3,20 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 -// { -// "widgetId": 245, -// "name": "CupertinoTextField基础使用", -// "priority": 1, -// "subtitle": "【placeholder】 : 提示文字 【String】\n" -// "【showCursor】 : 是否显示游标 【bool】\n" -// "【minLines】 : 最小行数 【int】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【onChanged】 : 变化监听 【ValueChanged】\n" -// "【onTap】: 点击监听 【GestureTapCallback】\n" -// "【onSubmitted】: 提交监听 【ValueChanged】", -// } + class CupertinoTextFieldDemo extends StatefulWidget { const CupertinoTextFieldDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart index 4d30c68e..d1fb7c1d 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/node2_style.dart @@ -3,21 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 -// { -// "widgetId": 245, -// "name": 'CupertinoTextField常用样式属性', -// "priority": 2, -// "subtitle": "【style】 : 输入文字样式 【TextStyle】\n" -// "【prefix】: 前缀组件 【Widget】\n" -// "【prefixMode】: 前缀模式 【OverlayVisibilityMode】\n" -// "【suffix】: 后缀组件 【Widget】\n" -// "【suffixMode】: 后缀模式 【OverlayVisibilityMode】\n" -// "【cursorColor】: 游标颜色 【Color】\n" -// "【cursorWidth】: 游标宽度 【double】\n" -// "【cursorRadius】: 游标圆角 【Radius】\n" -// "【readOnly】: 是否只读 【bool】", -// } + class CupertinoTextFieldStyle extends StatelessWidget { const CupertinoTextFieldStyle({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json new file mode 100644 index 00000000..68f83bca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS时间选择器", + "info": "高大上的滑滚时间选择器,可指定选择的类型、初始时间、背景色等,接收时间选中事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPicker基本使用", + "desc": [ + "【initialTimerDuration】 : 初始时间 【Duration】", + "【minuteInterval】 : 分钟间隔数 【double】", + "【secondInterval】 : 秒间隔数 【double】", + "【alignment】 : 对齐方式 【AlignmentGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : 模式*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart index c6f39da1..7c159ab8 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/node1_base.dart @@ -3,19 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 138, -// "name": 'CupertinoTimerPicker基本使用', -// "priority": 1, -// "subtitle": -// "【initialTimerDuration】 : 初始时间 【Duration】\n" -// "【minuteInterval】 : 分钟间隔数 【double】\n" -// "【secondInterval】 : 秒间隔数 【double】\n" -// "【alignment】 : 对齐方式 【AlignmentGeometry】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【mode】 : 模式*3 【CupertinoTimerPickerMode】", -// } + class CustomCupertinoTimerPicker extends StatefulWidget { const CustomCupertinoTimerPicker({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json new file mode 100644 index 00000000..369c54cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "日期范围", + "info": "Material 风格的日期范围选择器,支持日历选择和输入选择。", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 基本使用", + "desc": [ + "【firstDate】 : 最早日期 【DateTime】", + "【lastDate】 : 最晚日期 【DateTime】", + "【initialDateRange】 : 初始范围 【DateTimeRange?】", + "【saveText】 : 保存文字 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "魔改 DateRangePickerDialog", + "desc": [ + "修改 DateRangePickerDialog 源码,使得月份条目显示数值背景。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart index 70ff91d8..7ebc070e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node1_base.dart @@ -4,17 +4,7 @@ import 'package:intl/intl.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 339, -// "name": 'DateRangePickerDialog 基本使用', -// "priority": 1, -// "subtitle": -// "【firstDate】 : 最早日期 【DateTime】\n" -// "【lastDate】 : 最晚日期 【DateTime】\n" -// "【initialDateRange】 : 初始范围 【DateTimeRange?】\n" -// "【saveText】 : 保存文字 【String?】", -// } + class DateRangePickerDialogDemo extends StatefulWidget { const DateRangePickerDialogDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart index 1bbd1c87..ddd5be20 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/node2_diy.dart @@ -5,13 +5,7 @@ import 'toly_date_picker.dart' as toly; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 339, -// "name": '魔改 DateRangePickerDialog', -// "priority": 2, -// "subtitle": "修改 DateRangePickerDialog 源码,使得月份条目显示数值背景。", -// } + class DiyDateRangePickerDialogDemo extends StatefulWidget { const DiyDateRangePickerDialogDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json new file mode 100644 index 00000000..6731cee6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "装饰变换", + "info": "AnimatedWidget的子类,使用Decorated类型的动画器让子组件在两个Decorated对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【position】 : 前/背景色 【DecorationPosition】", + "【decoration】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart index 9f5defef..1eced443 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 113, -// "name": 'DecoratedBoxTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【position】 : 前/背景色 【DecorationPosition】\n" -// "【decoration】 : 动画 【Animation】", -// } + class CustomDecoratedBoxTransition extends StatefulWidget { const CustomDecoratedBoxTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json new file mode 100644 index 00000000..51d6dc7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "默认页签控制器", + "info": "在使用 TabBar 和 TabBarView 时,需要同一个控制器实现页签和页面的控制。DefaultTabController 会在未指定控制器时提供默认控制器,简化使用。", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabController基本使用", + "desc": [ + "【length】 : 页签数量 【int】", + "【initialIndex】 : 初始页签索引 【int】", + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart index 41e708eb..3e04b515 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 230 DefaultTabController 默认Tab控制器 在使用TabBar和TabBarView时,需要同一个控制器实现页签和页面的控制。DefaultTabController会在未指定控制器时提供默认控制器,简化使用。 -// { -// "widgetId": 230, -// "name": 'DefaultTabController基本使用', -// "priority": 1, -// "subtitle": -// "【length】 : 页签数量 【int】\n" -// "【initialIndex】 : 初始页签索引 【int】\n" -// "【child】 : 组件 【Widget】", -// } + class DefaultTabControllerDemo extends StatelessWidget { final List tabs = const [ diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json new file mode 100644 index 00000000..bd6649d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "文字样式变换", + "info": "AnimatedWidget的子类,使用TextStyle类型的动画器让文字组件在两个TextStyle对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【softWrap】 : 是否包裹 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : 溢出模式 【TextOverflow】", + "【style】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart index 8d8ef77c..da7853e0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 114, -// "name": 'DefaultTextStyleTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【softWrap】 : 是否包裹 【bool】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【overflow】 : 溢出模式 【TextOverflow】\n" -// "【style】 : 动画 【Animation】", -// } + class CustomDefaultTextStyleTransition extends StatefulWidget { const CustomDefaultTextStyleTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json new file mode 100644 index 00000000..f4f9ae05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "滑动消失", + "info": "滑动时可显示底部组件,可指定滑动的方向和交叉轴的偏移量。接收确认消失和消失时的回调。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissible基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【background】 : 左底 【Widget】", + "【secondaryBackground】 : 右底 【Widget】", + "【key】 : 键 【Key】", + "【confirmDismiss】 : 确认回调 【DismissDirectionCallback】", + "【onDismissed】 : 消失回调 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissible基本使用", + "desc": [ + "【direction】 : 方向 【DismissDirection】", + "【crossAxisEndOffset】 : 偏移 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart index aba2c84c..06622ddd 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 176, -// "name": 'Dismissible基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【background】 : 左底 【Widget】\n" -// "【secondaryBackground】 : 右底 【Widget】\n" -// "【key】 : 键 【Key】\n" -// "【confirmDismiss】 : 确认回调 【DismissDirectionCallback】\n" -// "【onDismissed】 : 消失回调 【DismissDirectionCallback】\n", -// } class CustomDismissible extends StatefulWidget { const CustomDismissible({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart index 585169ac..66ee53a0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/node2_direction.dart @@ -3,16 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 176, -// "name": 'Dismissible基本使用', -// "priority": 2, -// "subtitle": "【direction】 : 方向 【DismissDirection】\n" -// "【crossAxisEndOffset】 : 偏移 【double】\n", -// } class DirectionDismissible extends StatefulWidget { const DirectionDismissible({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json new file mode 100644 index 00000000..6f1036ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "拖拽目标", + "info": "一个拖拽的目标区域,可接收Draggable组件的信息。可以获取拖拽时的回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTarget基本使用", + "desc": [ + "【builder】 : 组件构造器 【DragTargetBuilder】", + "【onWillAccept】 : 拖入时 【Function(T)】", + "【onAccept】 : 拖拽成功 【Function(T)】", + "【onLeave】 : 拖入再脱出 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart index 41a1aa1e..75616022 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 104, -// "name": 'DragTarget基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【DragTargetBuilder】\n" -// "【onWillAccept】 : 拖入时 【Function(T)】\n" -// "【onAccept】 : 拖拽成功 【Function(T)】\n" -// "【onLeave】 : 拖入再脱出 【Function(T)】", -// } class CustomDragTarget extends StatefulWidget { const CustomDragTarget({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json new file mode 100644 index 00000000..4ab0f12d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_zh-CN.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "可拖拽组件", + "info": "可以让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggable基本使用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【feedback】 : 拖拽时的孩子 【Widget】", + "【axis】 : 拖动的轴 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Draggable与DragTarget联用", + "desc": [ + "【data】 : 数据 【T】", + "【onDragStarted】 : 开始拖拽 【Function()】", + "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】", + "【onDragCompleted】 : 拖拽完成 【Function()】", + "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggable其他使用", + "desc": [ + "可以根据拖拽来处理一些事件。如删除、查询、弹框等" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart index 98da9750..0f74ab70 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 103, -// "name": 'Draggable基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子 【Widget】\n" -// "【feedback】 : 拖拽时的孩子 【Widget】\n" -// "【axis】 : 拖动的轴 【Axis】", -// } + class CustomDraggable extends StatelessWidget { const CustomDraggable({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart index 907f4583..d8bfd4d4 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node2_data.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 103, -// "name": 'Draggable与DragTarget联用', -// "priority": 2, -// "subtitle": -// "【data】 : 数据 【T】\n" -// "【onDragStarted】 : 开始拖拽 【Function()】\n" -// "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n" -// "【onDragCompleted】 : 拖拽完成 【Function()】\n" -// "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】\n" -// "【onChanged】 : 改变时回调 【Function(T)】", -// } + class DraggablePage extends StatefulWidget { const DraggablePage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart index ef946daa..6f2a09f6 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/node3_use.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 103, -// "name": 'Draggable其他使用', -// "priority": 3, -// "subtitle": -// "可以根据拖拽来处理一些事件。如删除、查询、弹框等", -// } class DeleteDraggable extends StatefulWidget { const DeleteDraggable({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json new file mode 100644 index 00000000..a49c47d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "拖滑页", + "info": "可拖动和滑动的Sheet,可指定最大、最小、最初的分度现在滑动范围。构造器builder需要返回一个可滑动组件。", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheet基本使用", + "desc": [ + "【initialChildSize】 : 初始分度 【double】", + "【minChildSize】 : 最小分度 【double】", + "【maxChildSize】 : 最大分度 【double】", + "【builder】 : 滑动组件构造器 【ScrollableWidgetBuilder】", + "【expand】 : 是否延展 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart index 2a4be825..6a93804e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 252 DraggableScrollableSheet 拖滑页 可拖动和滑动的Sheet,可指定最大、最小、最初的分度现在滑动范围。构造器builder需要返回一个可滑动组件。 -// { -// "widgetId": 252, -// "name": 'DraggableScrollableSheet基本使用', -// "priority": 1, -// "subtitle": -// "【initialChildSize】 : 初始分度 【double】\n" -// "【minChildSize】 : 最小分度 【double】\n" -// "【maxChildSize】 : 最大分度 【double】\n" -// "【builder】 : 滑动组件构造器 【ScrollableWidgetBuilder】\n" -// "【expand】 : 是否延展 【bool】", -// } + class DraggableScrollableSheetDemo extends StatelessWidget { const DraggableScrollableSheetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json new file mode 100644 index 00000000..2f3c9a12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS滑动页签", + "info": "为 Drawer 组件提供交互行为,一般很少使用。在 Scaffold 组件源码中有使用场景。", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerController基本使用", + "desc": [ + "【drawerCallback】 : 事件回调 【DrawerCallback】", + "【enableOpenDragGesture】 : 是否侧边滑开 【bool】", + "【alignment】 : 对齐方式 【DrawerAlignment】", + "【scrimColor】 : 背景颜色 【Color】", + "【child】 : Drawer组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart index e0dc5d67..f29d10ca 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/node1_base.dart @@ -3,18 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 257 DrawerController 为 Drawer 组件提供交互行为,一般很少使用。在 Scaffold 组件源码中有使用场景。 -// { -// "widgetId": 257, -// "name": 'DrawerController基本使用', -// "priority": 1, -// "subtitle": -// "【drawerCallback】 : 事件回调 【DrawerCallback】\n" -// "【enableOpenDragGesture】 : 是否侧边滑开 【bool】\n" -// "【alignment】 : 对齐方式 【DrawerAlignment】\n" -// "【scrimColor】 : 背景颜色 【Color】\n" -// "【child】 : Drawer组件 【Widget】", -// } + class DrawerControllerDemo extends StatefulWidget { const DrawerControllerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json new file mode 100644 index 00000000..3acb5df2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "下拉按钮", + "info": "用于下拉选择的按钮,可指定图标、影深、提示等属性,接收选中变化的事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButton基本用法", + "desc": [ + "【value】 : 当前值 【T】", + "【items】 : 下拉选框 【List>】", + "【icon】 : 图标 【Widget】", + "【elevation】 : 影深 【double】", + "【onChanged】 : 选择条目事件 【Function(T)】", + "【backgroundColor】 : 背景色 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButton的样式指定", + "desc": [ + "【isDense】 : 是否紧排 【bool】", + "【iconSize】 : 图标大小 【double】", + "【hint】 : 提示组件 【Widget】", + "【iconEnabledColor】 : 图标颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart index 3f5b6b33..7126a49c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 55, -// "name": 'DropdownButton基本用法', -// "priority": 1, -// "subtitle": -// "【value】 : 当前值 【T】\n" -// "【items】 : 下拉选框 【List>】\n" -// "【icon】 : 图标 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【onChanged】 : 选择条目事件 【Function(T)】\n" -// "【backgroundColor】 : 背景色 【Color】", -// } class CustomDropDownButton extends StatefulWidget { const CustomDropDownButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart index b8587aad..a5ce7c1f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/node2_style.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 55, -// "name": 'DropdownButton的样式指定', -// "priority": 2, -// "subtitle": -// "【isDense】 : 是否紧排 【bool】\n" -// "【iconSize】 : 图标大小 【double】\n" -// "【hint】 : 提示组件 【Widget】\n" -// "【iconEnabledColor】 : 图标颜色 【Color】", -// } + class StyleDropDownButton extends StatefulWidget { const StyleDropDownButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json new file mode 100644 index 00000000..9b42b54b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "表单下拉框", + "info": "底层依赖 DropdownButton 实现,所以基本属性类似。但拥有 FormField 的特性,可以回调 onSaved、validator 方法。", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "表单下拉框简单使用", + "desc": [ + "【items】 : 子组件列表 【List>】", + "【validator】 : 表单验证回调 【FormFieldValidator】", + "【onSaved】 : 表单保存回调 【FormFieldSetter】", + "其他属性详见 DropdownButton,表单校验特性详见 FormField。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart index 8785f98b..63014bca 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 223 DropdownButtonFormField 表单下拉框 -/// 底层依赖 DropdownButton 实现,所以基本属性类似。但拥有 FormField 的特性,可以回调 onSaved、validator 方法。 -/// link: 55,222 -/// -// { -// "widgetId": 223, -// "name": '表单下拉框简单使用', -// "priority": 1, -// "subtitle": -// "【items】 : 子组件列表 【List>】\n" -// "【validator】 : 表单验证回调 【FormFieldValidator】\n" -// "【onSaved】 : 表单保存回调 【FormFieldSetter】\n" -// "其他属性详见 DropdownButton,表单校验特性详见 FormField。", -// } + class DropdownButtonFormFieldDemo extends StatefulWidget { const DropdownButtonFormFieldDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json index 6b0653de..047ff7ab 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_zh-CN.json @@ -1,13 +1,46 @@ { - "id": 1, + "id": 370, "name": "DropdownMenu", "localName": "下拉菜单", "info": "下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。", "lever": 4, "family": 1, - "linkWidget": [55, 54], + "linkIds": [], "nodes": [ - + { + "file": "node1.dart", + "name": "下拉菜单的简单使用", + "desc": [ + "【dropdownMenuEntries】 : 菜单条目列表 【List>】", + "【initialSelection】 : 表单验证回调 【T?】", + "【onSelected】 : 表单保存回调 【ValueChanged?】", + "【menuHeight】 : 菜单高度 【double】", + "【width】 : 输入框宽度 【double】" + ] + }, + { + "file": "node2.dart", + "name": "下拉菜单样式设置", + "desc": [ + "【controller】 : 文字输入控制器 【TextEditingController?】", + "【label】 : 输入框标签 【Widget?】", + "【textStyle】 : 输入框文字样式 【TextStyle?】", + "【inputDecorationTheme】 : 输入框装饰主题 【InputDecorationTheme?】", + "【leadingIcon】 : 左侧图标 【Widget?】", + "【trailingIcon】 : 右侧为展开菜单时图标 【Widget?】", + "【selectedTrailingIcon】 : 右侧展开菜单时图标 【Widget?】", + "【hintText】 : 输入框提示文字 【String?】", + "【helperText】 : 输入框辅助文字 【String?】", + "【errorText】 : 输入框错误文字 【String?】", + "【menuStyle】 : 弹出菜单样式 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "下拉菜单自定义菜单项", + "desc": [ + "可以通过 DropdownMenuEntry 的 labelWidget 定制构建菜单项。" + ] + } ] -} - +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart index d8e6ad84..a2dc6ebf 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node1.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 370 DropdownMenu 表单菜单 -/// 下拉选择组件,支持文本输入过滤,可自定义菜单项。底层主要依赖 MenuAnchor 和 TextFiled 实现。 -/// link: 55 -// { -// "widgetId": 370, -// "name": '下拉菜单的简单使用', -// "priority": 1, -// "subtitle": -// "【dropdownMenuEntries】 : 菜单条目列表 【List>】\n" -// "【initialSelection】 : 表单验证回调 【T?】\n" -// "【onSelected】 : 表单保存回调 【ValueChanged?】\n" -// "【menuHeight】 : 菜单高度 【double】\n" -// "【width】 : 输入框宽度 【double】", -// } + class DropdownMenuNode1 extends StatefulWidget { const DropdownMenuNode1({super.key}); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart index 97a3a2a1..cf4f5eaa 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node2.dart @@ -2,24 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 370 DropdownMenu 表单菜单 -// { -// "widgetId": 370, -// "name": '下拉菜单样式设置', -// "priority": 2, -// "subtitle": -// "【controller】 : 文字输入控制器 【TextEditingController?】\n" -// "【label】 : 输入框标签 【Widget?】\n" -// "【textStyle】 : 输入框文字样式 【TextStyle?】\n" -// "【inputDecorationTheme】 : 输入框装饰主题 【InputDecorationTheme?】\n" -// "【leadingIcon】 : 左侧图标 【Widget?】\n" -// "【trailingIcon】 : 右侧为展开菜单时图标 【Widget?】\n" -// "【selectedTrailingIcon】 : 右侧展开菜单时图标 【Widget?】\n" -// "【hintText】 : 输入框提示文字 【String?】\n" -// "【helperText】 : 输入框辅助文字 【String?】\n" -// "【errorText】 : 输入框错误文字 【String?】\n" -// "【menuStyle】 : 弹出菜单样式 【MenuStyle?】", -// } + enum ColorLabel { blue('Blue', Colors.blue), pink('Pink', Colors.pink), diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart index 353c97a5..f401df20 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/node3.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 370 DropdownMenu 表单菜单 -// { -// "widgetId": 370, -// "name": '下拉菜单自定义菜单项', -// "priority": 3, -// "subtitle": -// "可以通过 DropdownMenuEntry 的 labelWidget 定制构建菜单项。", -// } + class User { final String name; final bool man; diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json new file mode 100644 index 00000000..01075660 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "可编辑文字", + "info": "可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableText基本使用", + "desc": [ + "【controller】 : 控制器 【TextEditingController】", + "【focusNode】 : 焦点 【FocusNode】", + "【style】 : 文字样式 【TextStyle】", + "【backgroundCursorColor】 : 背景游标颜色 【Color】", + "【cursorColor】 : 游标颜色 【Color】", + "上面五个是EditableText必须的属性,其他同TextField,此处不再列举。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart index 35b4836c..951baf83 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 244 EditableText 可编辑文字 可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。 -// { -// "widgetId": 244, -// "name": "EditableText基本使用", -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TextEditingController】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【backgroundCursorColor】 : 背景游标颜色 【Color】\n" -// "【cursorColor】 : 游标颜色 【Color】\n" -// "上面五个是EditableText必须的属性,其他同TextField,此处不再列举。", -// } + class EditableTextDemo extends StatefulWidget { const EditableTextDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json new file mode 100644 index 00000000..a4f8675d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "升起按钮", + "info": "Material风格的升起按钮,表现和RaisedButton类似。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButton基本使用", + "desc": [ + "【child】 : 是否具有滚动主体 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart index 31ff221d..68ce3de1 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 354 ElevatedButton Material风格的升起按钮,表现和RaisedButton类似。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 354, -// "name": 'ElevatedButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } + class ElevatedButtonDemo extends StatelessWidget { const ElevatedButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart index 9db627ac..afe9bf65 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/node2_style.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 354, -// "name": 'ElevatedButton样式', -// "priority": 2, -// "subtitle": -// "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } + class ElevatedButtonStyleDemo extends StatelessWidget { const ElevatedButtonStyleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json new file mode 100644 index 00000000..0e38b4cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "展开图标", + "info": "一个展开按钮,点击时会自己执行旋转180的动画。可指定颜色、大小、边距,接收点击事件。", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIcon基本使用", + "desc": [ + "【isExpanded】 : 是否展开 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】,", + "【size】 : 图标大小 【double】", + "【color】 : 不展开时颜色 【Color】", + "【expandedColor】 : 展开时颜色 【Color】", + "【onPressed】 : 点击事件 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart index a90eefcd..f3c3ae02 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 51, -// "name": 'ExpandIcon基本使用', -// "priority": 1, -// "subtitle": -// "【isExpanded】 : 是否展开 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n", -// "【size】 : 图标大小 【double】\n" -// "【color】 : 不展开时颜色 【Color】\n" -// "【expandedColor】 : 展开时颜色 【Color】\n" -// "【onPressed】 : 点击事件 【Function(bool)】", -// } + class CustomExpandIcon extends StatefulWidget { const CustomExpandIcon({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json new file mode 100644 index 00000000..25d51a59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "展开列表", + "info": "可展开的列表组件,可根据逻辑来实现单展开或多展开。可指定展开动画时长,接收展开回调", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【animationDuration】 : 动画时长 【Duration】", + "【expansionCallback】 : 展开回调 【List】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart index 3faf35a8..2576dc4a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 178, -// "name": 'ExpansionPanelList基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【animationDuration】 : 动画时长 【Duration】\n" -// "【expansionCallback】 : 展开回调 【List】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + class CustomExpansionPanelList extends StatefulWidget { const CustomExpansionPanelList({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json new file mode 100644 index 00000000..8eca010f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "展开瓦片", + "info": "一个通用的展开栏,可在指定的部位安放组件,点击时会折叠显隐下方组件。接收折叠时事件。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTile基本使用", + "desc": [ + "【children】 : 展开内容 【List】", + "【leading】 : 头左组件 【Widget】", + "【title】 : 头中组件 【Widget】", + "【trailing】 : 头尾组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【onExpansionChanged】 : 折叠事件 【Function(bool)】", + "【initiallyExpanded】 : 是否初始时展开 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart index 7c59f98f..d3f0f816 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; import '../../StatelessWidget/RadioListTile/node1_base.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 52, -// "name": 'ExpansionTile基本使用', -// "priority": 1, -// "subtitle": "【children】 : 展开内容 【List】\n" -// "【leading】 : 头左组件 【Widget】\n" -// "【title】 : 头中组件 【Widget】\n" -// "【trailing】 : 头尾组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【onExpansionChanged】 : 折叠事件 【Function(bool)】\n" -// "【initiallyExpanded】 : 是否初始时展开 【bool】", -// } + class CustomExpansionTile extends StatefulWidget { const CustomExpansionTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json new file mode 100644 index 00000000..18d129e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "表单组件", + "info": "表单组件,可以接收其下的FormField组件的变化回调,通过onWillPop拦截页面返回,通过FormState可对表单字段进行保存或校验。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Form基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onChanged】 : 表单变化回调 【VoidCallback】", + "【onWillPop】 : 返回回调 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart index 1cf4dbd5..22d56bd8 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 198, -// "name": 'Form基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onChanged】 : 表单变化回调 【VoidCallback】\n" -// "【onWillPop】 : 返回回调 【WillPopCallback】", -// } + class CustomForm extends StatefulWidget { const CustomForm({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json new file mode 100644 index 00000000..f1925f24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "表单字段", + "info": "一个表单字段,需要在 Form 组件中使用,内含泛型 T 的字段作为状态量,对根据字段的更新和验证会触发相应回调。", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 介绍", + "desc": [ + "【builder】 : 内容构造器 【FormFieldBuilder】", + "【initialValue】 : 初始值 【T】", + "【validator】 : 验证函数 【FormFieldValidator 】", + "【enabled】 : 是否有效 【bool】", + "【onSaved】 : 表单save时回调 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart index f687de2f..690432be 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: 222 FormField 表单字段 -/// 一个表单字段,需要在 Form 组件中使用,内含泛型 T 的字段作为状态量,对根据字段的更新和验证会触发相应回调。 -/// link:198,199,223, -// { -// "widgetId": 222, -// "name": 'FormField 介绍', -// "priority": 1, -// "subtitle": -// "【builder】 : 内容构造器 【FormFieldBuilder】\n" -// "【initialValue】 : 初始值 【T】\n" -// "【validator】 : 验证函数 【FormFieldValidator 】\n" -// "【enabled】 : 是否有效 【bool】\n" -// "【onSaved】 : 表单save时回调 【FormFieldSetter】", -// } + class FormFieldDemo extends StatelessWidget { const FormFieldDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json new file mode 100644 index 00000000..7e59a172 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "异步构造器", + "info": "可指定一个Future对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。注意该Future对象不能和FutureBuilder同时创建,否则可能过渡刷新。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilder基本使用", + "desc": [ + "【builder】 : 子组件 【AsyncWidgetBuilder】", + "【initialData】 : 初始数据 【T】", + "【future】 : 异步任务 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart index d0aacef9..8a5afea7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 172, -// "name": 'FutureBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 子组件 【AsyncWidgetBuilder】\n" -// "【initialData】 : 初始数据 【T】\n" -// "【future】 : 异步任务 【Future】", -// } + class CustomFutureBuilder extends StatefulWidget { const CustomFutureBuilder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json new file mode 100644 index 00000000..57ad2ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "滑动越域指示器", + "info": "孩子为可滑动列表,当滑动到顶部和底部时的指示效果,可指定颜色,没什么太大卵用。是Android和fuchsia系统默认滑动效果。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【showLeading】 : 头部是否生效 【bool】", + "【showTrailing】 : 底部是否生效 【bool】", + "【axisDirection】 : 轴向 【AxisDirection】", + "【color】 : 颜色 【Color】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart index efd87685..1e3da9b5 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 250 GlowingOverscrollIndicator 孩子为可滑动列表,当滑动到顶部和底部时的指示效果,可指定颜色,没什么太大卵用。是Android和fuchsia系统默认滑动效果。 -// { -// "widgetId": 250, -// "name": '基本使用', -// "priority": 1, -// "subtitle": -// "【showLeading】 : 头部是否生效 【bool】\n" -// "【showTrailing】 : 底部是否生效 【bool】\n" -// "【axisDirection】 : 轴向 【AxisDirection】\n" -// "【color】 : 颜色 【Color】\n" -// "【child】 : 子组件 【Widget】", -// } + class GlowingOverscrollIndicatorDemo extends StatelessWidget { GlowingOverscrollIndicatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json new file mode 100644 index 00000000..6cd3ba9e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "共享动画", + "info": "可指定标签名,两个界面跳转时具有相同标签的组件会进行共享动画。一个界面中不能存在两个同名的Hero标签", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Hero基本使用", + "desc": [ + "【tag】 : 标签 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart index 119a0f41..c0224bf1 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 171, -// "name": 'Hero基本使用', -// "priority": 1, -// "subtitle": -// "【tag】 : 标签 【String】\n", -// } class CustomHero extends StatelessWidget { const CustomHero({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json new file mode 100644 index 00000000..1b2434ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_zh-CN.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "图片组件", + "info": "用于显示一张图片,可以从文件、内存、网络、资源里加载。可以指定适应方式、样式、颜色混合模式、重复模式等", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可从资源文件和网络加载图片", + "desc": [ + "Image.asset加载资源图片," + ] + }, + { + "file": "node2_fit.dart", + "name": "图片的适应模式", + "desc": [ + "【fit】 : 适应模式*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "图片对齐模式", + "desc": [ + "【alignment】 : 颜色 【AlignmentGeometry】", + " 常用Alignment类的九个静态常量,但也可定制位置" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "图片颜色及混合模式", + "desc": [ + "【color】 : 颜色 【Color】", + "【colorBlendMode】: 混合模式*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "图片重复模式", + "desc": [ + "【repeat】 : 重复模式*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "图片实现局部放大", + "desc": [ + "【centerSlice】 : 保留的区域 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart index 42ca2bfb..71530c45 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '可从资源文件和网络加载图片', -// "priority": 1, -// "subtitle": "Image.asset加载资源图片,指定路径;\n" -// "Image.network加载资源网络图片,指定链接。\n" -// "Image.file加载资源文件图片,指定路径。\n" -// "Image.memory加载内存图片,指定字节数组。\n" -// "【height】 : 宽 【double】\n" -// "【width】: 高 【double】" -// } + class LoadImage extends StatelessWidget { const LoadImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart index 0155c389..b61fb637 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node2_fit.dart @@ -2,13 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片的适应模式', -// "priority": 2, -// "subtitle": "【fit】 : 适应模式*7 【BoxFit】\n", -// }, class FitImage extends StatefulWidget { const FitImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart index 75f33e7b..2bf65a18 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart @@ -2,14 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片对齐模式', -// "priority": 3, -// "subtitle": "【alignment】 : 颜色 【AlignmentGeometry】\n" -// " 常用Alignment类的九个静态常量,但也可定制位置", -// }, class AlignmentImage extends StatelessWidget { const AlignmentImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart index 530f5cef..8c251029 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node4_colorBlendMode.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片颜色及混合模式', -// "priority": 4, -// "subtitle": "【color】 : 颜色 【Color】\n" -// "【colorBlendMode】: 混合模式*29 【BlendMode】", -// }, + class BlendModeImage extends StatelessWidget { const BlendModeImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart index 59d36b6b..2048dc2e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node5_repeat.dart @@ -2,13 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片重复模式', -// "priority": 5, -// "subtitle": "【repeat】 : 重复模式*4 【ImageRepeat】", -// }, class RepeatImage extends StatelessWidget { const RepeatImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart index 95086264..d4f4364f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node6_centerSlice.dart @@ -1,17 +1,7 @@ - import 'package:flutter/material.dart'; - - - /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 38, -// "name": '图片实现局部放大', -// "priority": 6, -// "subtitle": "【centerSlice】 : 保留的区域 【Rect】", -// }, + class CenterSliceImage extends StatelessWidget { const CenterSliceImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json new file mode 100644 index 00000000..961f0dc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "水波", + "info": "使InkWell和InkResponse的水波纹有效,用于绘制图像或其他装饰的Material组件。", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ink基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【decoration】 : 装饰 【Decoration】", + "【width】 : 宽 【double】", + "【height】 : 高 【double】", + "【color】 : 颜色 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image图片水波纹", + "desc": [ + "其中属性与Image组件一致,详见Image组件" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart index c8345204..fdc0a1d7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 152, -// "name": 'Ink基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【width】 : 宽 【double】\n" -// "【height】 : 高 【double】\n" -// "【color】 : 颜色 【Color】", -// } + class CustomInk extends StatelessWidget { const CustomInk({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart index 5041a018..aceedd2d 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/node2_image.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 152, -// "name": 'Ink.image图片水波纹', -// "priority": 2, -// "subtitle": " 其中属性与Image组件一致,详见Image组件", -// } + class InkImage extends StatelessWidget { const InkImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json new file mode 100644 index 00000000..900fa0b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "水波纹响应", + "info": "水波纹的点击效果,接收点击、双击、长按、取消、高亮变化事件,可指定水波纹颜色、半径、高亮形状等属性。", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onTapCancel】 : 点击取消 【Function()】", + "【onLongPress】 : 长按事件 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse其他属性", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", + "【highlightColor】 : 高亮色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【radius】 : 水波半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart index 0fcbdb5e..da42a370 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 149, -// "name": 'InkResponse基本事件', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onTapCancel】 : 点击取消 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】", -// } class CustomInkResponse extends StatefulWidget { const CustomInkResponse({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart index d5d61473..b9f45269 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/node2_color.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 149, -// "name": 'InkResponse其他属性', -// "priority": 2, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n" -// "【highlightColor】 : 高亮色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【radius】 : 水波半径 【double】", -// } class ColorInkResponse extends StatefulWidget { const ColorInkResponse({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json new file mode 100644 index 00000000..46a7480f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_zh-CN.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "水波纹", + "info": "InkResponse的子类,基本属性同InkResponse。一个矩形区域的水波纹,可以知道圆角半径,边线形状等。", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onTapCancel】 : 点击取消 【Function()】", + "【onLongPress】 : 长按事件 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell其他属性", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", + "【highlightColor】 : 高亮色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【radius】 : 水波半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart index d0e0ed50..11d053a5 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 150, -// "name": 'InkWell基本事件', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onTapCancel】 : 点击取消 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】", -// } class CustomInkWell extends StatefulWidget { const CustomInkWell({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart index ba752c6c..f10b47a1 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/node2_color.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 150, -// "name": 'InkWell其他属性', -// "priority": 2, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】\n" -// "【highlightColor】 : 高亮色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【radius】 : 水波半径 【double】", -// } class ColorInkWell extends StatefulWidget { const ColorInkWell({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json new file mode 100644 index 00000000..629ece4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "输入装饰", + "info": "在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecorator基本使用", + "desc": [ + "【decoration】 : 装饰对象 【InputDecoration】", + "【textAlign】 : 文字对齐方式 【TextAlign】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart index 0990e86d..8bac27f0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 231 InputDecorator 输入装饰 在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。 -// { -// "widgetId": 231, -// "name": "InputDecorator基本使用", -// "priority": 1, -// "subtitle": "【decoration】 : 装饰对象 【InputDecoration】\n" -// "【textAlign】 : 文字对齐方式 【TextAlign】\n" -// "【child】 : 子组件 【Widget】", -// } + class InputDecoratorDemo extends StatelessWidget { const InputDecoratorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json new file mode 100644 index 00000000..13775de2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_zh-CN.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "交互视图", + "info": "主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewer基本使用", + "desc": [ + "【alignPanAxis】 : 沿轴拖动 【bool】", + "【boundaryMargin】 : 边界边距 【EdgeInsets】", + "【panEnabled】 : 是否可平移 【bool】", + "【scaleEnabled】 : 是否可缩放 【bool】", + "【maxScale】 : 最大放大倍数 【double】", + "【minScale】 : 最小缩小倍数 【double】", + "【onInteractionEnd】 : 交互结束回调 【GestureScaleEndCallback】", + "【onInteractionStart】 : 交互开始回调 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : 交互更新回调 【GestureScaleUpdateCallback】", + "【child】 : 游标颜色 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained属性测试", + "desc": [ + "【constrained】 : 受约束的 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "变换控制器的使用", + "desc": [ + "【transformationController】 : 变换控制器 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart index e944cb43..1a2bb795 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node1_base.dart @@ -3,22 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 351 InteractiveViewer 交互视图 主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。 -// { -// "widgetId": 351, -// "name": "InteractiveViewer基本使用", -// "priority": 1, -// "subtitle": "【alignPanAxis】 : 沿轴拖动 【bool】\n" -// "【boundaryMargin】 : 边界边距 【EdgeInsets】\n" -// "【panEnabled】 : 是否可平移 【bool】\n" -// "【scaleEnabled】 : 是否可缩放 【bool】\n" -// "【maxScale】 : 最大放大倍数 【double】\n" -// "【minScale】 : 最小缩小倍数 【double】\n" -// "【onInteractionEnd】 : 交互结束回调 【GestureScaleEndCallback】\n" -// "【onInteractionStart】 : 交互开始回调 【GestureScaleStartCallback】\n" -// "【onInteractionUpdate】 : 交互更新回调 【GestureScaleUpdateCallback】\n" -// "【child】 : 游标颜色 【Widget】", -// } + class InteractiveViewerDemo extends StatelessWidget { const InteractiveViewerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart index 18b915e1..75c85605 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node2_constrained.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 351, -// "name": "constrained属性测试", -// "priority": 2, -// "subtitle": "【constrained】 : 受约束的 【bool】", -// } + class InteractiveViewerDemo2 extends StatelessWidget { const InteractiveViewerDemo2({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart index bf6d633d..b6631fac 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/node3_controller.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 351, -// "name": "变换控制器的使用", -// "priority": 3, -// "subtitle": "【transformationController】 : 变换控制器 【TransformationController】", -// } + class InteractiveViewerDemo3 extends StatefulWidget { const InteractiveViewerDemo3({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json new file mode 100644 index 00000000..56434b38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "证书页", + "info": "应用的证书页,可指定应用图标、应用名、应用版本号等信息,其他由Flutter自动生成。", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePage基本使用", + "desc": [ + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart index b339529e..90c27cc4 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 145, -// "name": 'LicensePage基本使用', -// "priority": 1, -// "subtitle": "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】", -// } + class CustomLicensePage extends StatelessWidget { const CustomLicensePage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json new file mode 100644 index 00000000..110a0878 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "水平进度", + "info": "直线型的进度显示,可指定颜色、进度等属性。value为null时会不停旋转。", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicator基本使用", + "desc": [ + "【value】 : 进度 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 进度颜色 【Animation】", + " value为null时会不停循环" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart index a124eb33..c7d770f9 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 47, -// "name": 'LinearProgressIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 进度 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【valueColor】 : 进度颜色 【Animation】\n" -// " value为null时会不停循环", -// } + class CustomLinearProgressIndicator extends StatefulWidget { const CustomLinearProgressIndicator({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json new file mode 100644 index 00000000..7b9117dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "滚轮列表", + "info": "高大上的柱面滑动列表,精妙十足,可指定item高度、透视、挤压等属性,接收滑动时选中事件。", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【perspective】 : 透视度 【double】", + "【itemExtent】 : item高 【EdgeInsets】", + "【onSelectedItemChanged】 : 选中回调 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart index b62dc3d3..d3c253db 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 179, -// "name": 'ListWheelScrollView基本使用', -// "priority": 1, -// "subtitle": "【children】 : 子组件列表 【List】\n" -// "【perspective】 : 透视度 【double】\n" -// "【itemExtent】 : item高 【EdgeInsets】\n" -// "【onSelectedItemChanged】 : 选中回调 【ValueChanged 】", -// } + class CustomListWheelScrollView extends StatefulWidget { const CustomListWheelScrollView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json new file mode 100644 index 00000000..8f9210ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "拖拽目标", + "info": "长按时让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable与DragTarget联用", + "desc": [ + "【child】 : 孩子 【Widget】", + "【feedback】 : 拖拽时的孩子 【Widget】", + "【axis】 : 拖动的轴 【Axis】", + "【data】 : 数据 【T】", + "【onDragStarted】 : 开始拖拽 【Function()】", + "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】", + "【onDragCompleted】 : 拖拽完成 【Function()】", + "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart index 727a5b43..c969744a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 105, -// "name": 'LongPressDraggable与DragTarget联用', -// "priority": 1, -// "subtitle": "【child】 : 孩子 【Widget】\n" -// "【feedback】 : 拖拽时的孩子 【Widget】\n" -// "【axis】 : 拖动的轴 【Axis】\n" -// "【data】 : 数据 【T】\n" -// "【onDragStarted】 : 开始拖拽 【Function()】\n" -// "【onDragEnd】 : 结束拖拽 【Function(DraggableDetails)】\n" -// "【onDragCompleted】 : 拖拽完成 【Function()】\n" -// "【onDraggableCanceled】 : 拖拽取消 【Function(Velocity,Offset)】", -// } + class CustomLongPressDraggable extends StatefulWidget { const CustomLongPressDraggable({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json new file mode 100644 index 00000000..9c232cab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "材料组件", + "info": "Material风格组件的领军人物,灵魂核心。可指定颜色、影深、类型、阴影颜色、形状等属性。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Material基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【type】 : 类型 【MaterialType】", + "【elevation】 : 影深 【double】", + "【shadowColor】 : 阴影颜色 【Color】", + "【color】 : 颜色 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Material的shape属性", + "desc": [ + "【shape】 : 形状 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart index 4e78c440..3dec9b67 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 160, -// "name": 'Material基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【type】 : 类型 【MaterialType】\n" -// "【elevation】 : 影深 【double】\n" -// "【shadowColor】 : 阴影颜色 【Color】\n" -// "【color】 : 颜色 【Color】", -// } + class CustomMaterial extends StatelessWidget { const CustomMaterial({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart index 58872e81..d31d3c2c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/node2_shape.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 160, -// "name": 'Material的shape属性', -// "priority": 2, -// "subtitle": -// "【shape】 : 形状 【ShapeBorder】\n", -// } + class ShapeMaterial extends StatelessWidget { const ShapeMaterial({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json new file mode 100644 index 00000000..57ba7ea5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material应用", + "info": "Material应用的顶级组件,包含路由生成器、主题、语言、主页等属性。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialApp基本用法", + "desc": [ + "【theme】 : 主题 【ThemeData】", + "【title】 : 任务栏标题 【String】", + "【debugShowCheckedModeBanner】 : 开启角标 【bool】", + "【showPerformanceOverlay】 : 开启性能浮层 【bool】", + "【debugShowMaterialGrid】 : 开启网格 【bool】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【home】 : 主页 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart index a2b7b013..c7c61e55 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-17 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 65, -// "name": 'MaterialApp基本用法', -// "priority": 1, -// "subtitle": "【theme】 : 主题 【ThemeData】\n" -// "【title】 : 任务栏标题 【String】\n" -// "【debugShowCheckedModeBanner】 : 开启角标 【bool】\n" -// "【showPerformanceOverlay】 : 开启性能浮层 【bool】\n" -// "【debugShowMaterialGrid】 : 开启网格 【bool】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【home】 : 主页 【Widget】", -// } class MaterialAppDemo extends StatefulWidget { const MaterialAppDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json new file mode 100644 index 00000000..67f725fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "可合并材料", + "info": "用于展示 MergeableMaterialItem 的列表,包括 MaterialSlice(主体) 和 MaterialGap(分隔) 。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterial基本使用", + "desc": [ + "【elevation】 : 影深 【double】", + "【hasDividers】 : 是否有分隔线 【bool】", + "【dividerColor】 : 分隔线颜色 【Color】", + "【mainAxis】 : 轴向 【Axis】", + "【children】 : 子组件集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart index 18472167..8c51e075 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/node1_base.dart @@ -3,18 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 261 MergeableMaterial 可合并材料 用于展示 MergeableMaterialItem 的列表,包括 MaterialSlice(主体) 和 MaterialGap(分隔) 。 -// { -// "widgetId": 261, -// "name": 'MergeableMaterial基本使用', -// "priority": 1, -// "subtitle": -// "【elevation】 : 影深 【double】\n" -// "【hasDividers】 : 是否有分隔线 【bool】\n" -// "【dividerColor】 : 分隔线颜色 【Color】\n" -// "【mainAxis】 : 轴向 【Axis】\n" -// "【children】 : 子组件集 【List】", -// } + class MergeableMaterialDemo extends StatefulWidget { const MergeableMaterialDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json new file mode 100644 index 00000000..816c09a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_zh-CN.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "月份选择器", + "info": "月份的选择组件,自带上下月切换的监听。可指定选择的日期范围、选中日期等,接收日期选中事件。", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 月份期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart index af9d3653..b7f9668b 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 135, -// "name": 'MonthPicker基本使用', -// "priority": 1, -// "subtitle": "【selectedDate】 : 选中日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } + class CustomMonthPicker extends StatelessWidget{ const CustomMonthPicker({Key? key}) : super(key: key); @@ -27,19 +18,4 @@ class CustomMonthPicker extends StatelessWidget{ child: Text(info), ); } - - // final DateTime _date = DateTime.now(); - // - // @override - // Widget build(BuildContext context) { - // return SizedBox( - // height: 350, - // child: MonthPicker( - // selectedDate: _date, - // onChanged: (date) => setState(() => _date = date), - // firstDate: DateTime(2018), - // lastDate: DateTime(2030), - // ), - // ); - // } } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json new file mode 100644 index 00000000..194a6654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "鼠标区域", + "info": "用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegion基本使用", + "desc": [ + "【onEnter】 : 移入事件 【PointerEnterEventListener】", + "【onHover】: 移动事件 【PointerHoverEventListener】", + "【onExit】: 移出事件 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart index 114db985..2d77a327 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 293 MouseRegion 用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。 -// { -// "widgetId": 293, -// "name": "MouseRegion基本使用", -// "priority": 1, -// "subtitle": "【onEnter】 : 移入事件 【PointerEnterEventListener】\n" -// "【onHover】: 移动事件 【PointerHoverEventListener】\n" -// "【onExit】: 移出事件 【PointerExitEventListener】", -// } + class MouseRegionDemo extends StatefulWidget { const MouseRegionDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json new file mode 100644 index 00000000..92520a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_zh-CN.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "侧栏导航", + "info": "侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 基本使用", + "desc": [ + "【destinations】 : 菜单数据列表 【List】", + "【selectedIndex】: 激活索引 【int】", + "【labelType】: 标签样式 【NavigationRailLabelType?】", + "【onDestinationSelected】: 菜单点击事件 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 折叠效果", + "desc": [ + "【elevation】 : 影深 【double】", + "【leading】: 首组件 【Widget?】", + "【trailing】: 尾组件 【Widget?】", + "【extended】: 是否展开 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail 样式", + "desc": [ + "【useIndicator】 : 是否显示指示器 【bool】", + "【indicatorColor】: 指示器颜色 【Color?】", + "【backgroundColor】: 背景色 【Color?】", + "【labelType】: 标签样式 【NavigationRailLabelType?】", + "【selectedIconTheme】: 选中图标样式 【IconThemeData?】", + "【unselectedIconTheme】: 未选中图标样式 【IconThemeData?】", + "【selectedLabelTextStyle】: 选中文字样式 【TextStyle?】", + "【unselectedLabelTextStyle】: 未选中文字样式 【TextStyle?】", + "【minExtendedWidth】: 展开宽度 【double?】", + "【minWidth】: 未展开宽度 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart index b4913d37..dcea36e5 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 基本使用", -// "priority": 1, -// "subtitle": "【destinations】 : 菜单数据列表 【List】\n" -// "【selectedIndex】: 激活索引 【int】\n" -// "【labelType】: 标签样式 【NavigationRailLabelType?】\n" -// "【onDestinationSelected】: 菜单点击事件 【ValueChanged?】", -// } + class CustomNavigationRail extends StatefulWidget { const CustomNavigationRail({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart index 61638bdb..db76710a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart @@ -3,16 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 折叠效果", -// "priority": 2, -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【leading】: 首组件 【Widget?】\n" -// "【trailing】: 尾组件 【Widget?】\n" -// "【extended】: 是否展开 【bool】", -// } + class ExtendableNavigationRail extends StatefulWidget { const ExtendableNavigationRail({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart index 02315f81..0b4cee95 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart @@ -12,22 +12,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com -/// 说明: 358 NavigationRail 侧导航栏,一般用于桌面导航菜单。支持展开和收缩区域,可指定首尾位置组件。。 -// { -// "widgetId": 358, -// "name": "NavigationRail 样式", -// "priority": 3, -// "subtitle": "【useIndicator】 : 是否显示指示器 【bool】\n" -// "【indicatorColor】: 指示器颜色 【Color?】\n" -// "【backgroundColor】: 背景色 【Color?】\n" -// "【labelType】: 标签样式 【NavigationRailLabelType?】\n" -// "【selectedIconTheme】: 选中图标样式 【IconThemeData?】\n" -// "【unselectedIconTheme】: 未选中图标样式 【IconThemeData?】\n" -// "【selectedLabelTextStyle】: 选中文字样式 【TextStyle?】\n" -// "【unselectedLabelTextStyle】: 未选中文字样式 【TextStyle?】\n" -// "【minExtendedWidth】: 展开宽度 【double?】\n" -// "【minWidth】: 未展开宽度 【double?】", -// } + class DarkNavigationRail extends StatefulWidget { diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json new file mode 100644 index 00000000..f350eeb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "导航器", + "info": "Navigator用堆栈规则管理一组子组件,可以将子组件切入弹出及监听出入栈事件。MaterialApp路由管理的本源就是使用了Navigator。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigator基本用法", + "desc": [ + "【initialRoute】 : 最初显示路由 【String】", + "【onGenerateRoute】 : 路由生成器 【RouteFactory】", + "【observers】 : 路由监听器 【List】", + "【onPopPage】 : 出栈回调 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart index 5daa0c0a..eb000b4a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/19 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 232, -// "name": 'Navigator基本用法', -// "priority": 1, -// "subtitle": -// "【initialRoute】 : 最初显示路由 【String】\n" -// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【observers】 : 路由监听器 【List】\n" -// "【onPopPage】 : 出栈回调 【PopPageCallback】", -// } + class NavigatorDemo extends StatelessWidget { const NavigatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json new file mode 100644 index 00000000..30e70e89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "嵌套滑动视图", + "info": "用于多个视图滑动嵌套处理,可以指定头部、滑动控制器、滑动方向等,其中body必须是可滑动类型的组件。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollView基本用法", + "desc": [ + "【controller】 : 滑动控制器 【ScrollController】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】", + "【physics】 : 滑顶样式 【ScrollPhysics】", + "【dragStartBehavior】 : 开始拖动行为 【DragStartBehavior】", + "【headerSliverBuilder】 : *头部构造器 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *内容 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart index 241090fc..d49d94ca 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/6/16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 251, -// "name": 'NestedScrollView基本用法', -// "priority": 1, -// "subtitle": -// "【controller】 : 滑动控制器 【ScrollController】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】\n" -// "【physics】 : 滑顶样式 【ScrollPhysics】\n" -// "【dragStartBehavior】 : 开始拖动行为 【DragStartBehavior】\n" -// "【headerSliverBuilder】 : *头部构造器 【NestedScrollViewHeaderSliversBuilder】\n" -// "【body】 : *内容 【Widget】", -// } class NestedScrollViewDemo extends StatelessWidget { final List _tabs = const ['风神传', '封妖志', "幻将录", "永恒传说"]; diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json new file mode 100644 index 00000000..1322d244 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "边框按钮", + "info": "Material风格的边线按钮,表现和OutlineButton类似。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButton基本使用", + "desc": [ + "【child】 : 是否具有滚动主体 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart index ec7a27c9..01e46cec 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 355 OutlinedButton Material风格的边线按钮,表现和OutlineButton类似。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 355, -// "name": 'OutlinedButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } + class OutlinedButtonDemo extends StatelessWidget { const OutlinedButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart index eddadc6b..3564a741 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/node2_style.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 355, -// "name": 'OutlinedButton样式', -// "priority": 2, -// "subtitle": -// "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } + class OutlinedButtonStyleDemo extends StatelessWidget { const OutlinedButtonStyleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json new file mode 100644 index 00000000..a582e71e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "悬浮组件", + "info": "可以将组件在全应用中进行悬浮显示,能够添加或移除组件,它们有独立管理的栈。", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlay基本使用", + "desc": [ + "Overlay.of(context).insert插入全局组件" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart index d8a9aed2..54d8d481 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 182, -// "name": 'Overlay基本使用', -// "priority": 1, -// "subtitle": -// " Overlay.of(context).insert插入全局组件", -// } + class CustomOverlay extends StatelessWidget { const CustomOverlay({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json new file mode 100644 index 00000000..de89d037 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "滑页", + "info": "容纳多个组件页面,可对它们进行滑动切换,可指定滑动的方向、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【onPageChanged】 : 点击事件 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageView控制器简单实用", + "desc": [ + "【controller】 : 页面控制器 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart index 94a33414..a4260c70 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 165, -// "name": 'PageView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【onPageChanged】 : 点击事件 【ValueChanged】", -// } class CustomPageView extends StatelessWidget { CustomPageView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart index b2056220..c7bbeeb4 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 165, -// "name": 'PageView滑动方向', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】", -// } class DirectionPageView extends StatelessWidget { DirectionPageView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart index fea68213..c7e0d62a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node3_controller.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 165, -// "name": 'PageView控制器简单实用', -// "priority": 3, -// "subtitle": -// "【controller】 : 页面控制器 【PageController】", -// } class CtrlPageView extends StatefulWidget { const CtrlPageView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json new file mode 100644 index 00000000..2eeb0cf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "可分页表格", + "info": "一个功能丰富的可分页表格组件,可指定分页数、排列、页码前后切换。", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable 使用", + "desc": [ + "【header】 : 表名 【Widget】", + "【rowsPerPage】 : 每页记录数 【int】", + "【actions】 : 操作组件 【List】", + "【columns】 : 数据列 【List】", + "【sortColumnIndex】 : 排序列索引 【int】", + "【sortAscending】 : 是否升序 【bool】", + "【onSelectAll】 : 全选回调 【ValueSetter】", + "【onRowsPerPageChanged】 : 分页改变监听 【ValueChanged】", + "【availableRowsPerPage】 : 可用分页列表 【List】", + "【source】 : 数据源 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart index e7208c43..622c38e3 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/node1_base.dart @@ -2,25 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: 235 PaginatedDataTable 可分页表格 -/// 一个功能丰富的可分页表格组件,可指定分页数、排列、页码前后切换。 -/// link: 110,102 -// { -// "widgetId": 235 , -// "name": 'PaginatedDataTable 使用', -// "priority": 1, -// "subtitle": -// "【header】 : 表名 【Widget】\n" -// "【rowsPerPage】 : 每页记录数 【int】\n" -// "【actions】 : 操作组件 【List】\n" -// "【columns】 : 数据列 【List】\n" -// "【sortColumnIndex】 : 排序列索引 【int】\n" -// "【sortAscending】 : 是否升序 【bool】\n" -// "【onSelectAll】 : 全选回调 【ValueSetter】\n" -// "【onRowsPerPageChanged】 : 分页改变监听 【ValueChanged】\n" -// "【availableRowsPerPage】 : 可用分页列表 【List】\n" -// "【source】 : 数据源 【DataTableSource】", -// } + class PaginatedDataTableDemo extends StatefulWidget { const PaginatedDataTableDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json new file mode 100644 index 00000000..d2559105 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "菜单按钮", + "info": "弹出菜单栏,可指定偏移、颜色、影深、形状等属性。接收item选中的事件和取消选择事件。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButton基本使用", + "desc": [ + "【itemBuilder】 : 构造器 【PopupMenuItemBuilder】", + "【offset】 : 偏移 【Offset】", + "【color】 : 背景颜色 【Color】", + "【shape】 : 形状 【ShapeBorder】", + "【elevation】 : 影深 【double】", + "【onCanceled】 : 取消事件 【Function()】", + "【onSelected】 : 选择事件 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart index 9ba7d0cb..03fe4f20 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/node1_base.dart @@ -4,21 +4,7 @@ import 'package:widgets/utils/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 56, -// "name": 'PopupMenuButton基本使用', -// "priority": 1, -// "subtitle": -// "【itemBuilder】 : 构造器 【PopupMenuItemBuilder】\n" -// "【offset】 : 偏移 【Offset】\n" -// "【color】 : 背景颜色 【Color】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【elevation】 : 影深 【double】\n" -// "【onCanceled】 : 取消事件 【Function()】\n" -// "【onSelected】 : 选择事件 【Function(T)】", -// } class CustomPopupMenuButton extends StatefulWidget { const CustomPopupMenuButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json new file mode 100644 index 00000000..40ed06d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "弹出菜单分割线", + "info": "PopupMenuButton的分割线,一般不单独使用,可指定高度。", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDivider基本使用", + "desc": [ + "【height】 : 高度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart index e16919b6..b72d5538 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/node1_base.dart @@ -4,14 +4,7 @@ import 'package:widgets/utils/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 174, -// "name": 'PopupMenuDivider基本使用', -// "priority": 1, -// "subtitle": -// "【height】 : 高度 【double】", -// } + class CustomPopupMenuDivider extends StatelessWidget { const CustomPopupMenuDivider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json new file mode 100644 index 00000000..5999b455 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "位置变换", + "info": "只能用于Stack中,可容纳一个子组件,让其在两个矩形间进行位置动画,需要提供动画器rect。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【rect】 : 动画 【Animation】", + " PositionedTransition组件只能在Stack内起作用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart index d90763a7..6485185c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 93, -// "name": 'PositionedTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【rect】 : 动画 【Animation】\n" -// " PositionedTransition组件只能在Stack内起作用", -// } + class CustomPositionedTransition extends StatefulWidget { const CustomPositionedTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json new file mode 100644 index 00000000..fdcbd66d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "选钮", + "info": "由于选中和未选择状态的圆钮,多个Radio根据逻辑可以实现单选或多选的需求。可指定颜色,接收状态变化回调。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Radio基本使用", + "desc": [ + "【value】 : 选钮值 【T】", + "【groupValue】 : 当前匹配值 【T】", + "【activeColor】 : 激活颜色 【Color】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart index b2005847..363a7ece 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 45, -// "name": 'Radio基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 选钮值 【T】\n" -// "【groupValue】 : 当前匹配值 【T】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【onChanged】 : 改变时回调 【Function(T)】", -// } + class CustomRadio extends StatefulWidget { const CustomRadio({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json new file mode 100644 index 00000000..815e725e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "范围滑块", + "info": "范围滑块组件,支持两点拖动,获取之间的范围。可指定颜色、分段数及显示的标签,接收进度变化回调。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider基本使用", + "desc": [ + "【values】 : 数值 【RangeValues】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【divisions】 : 分段数 【int】", + "【label】 : 提示气泡文字 【String】", + "【activeColor】 : 激活颜色 【Color】", + "【inactiveColor】 : 非激活颜色 【Color】", + "【onChangeStart】 : 开始滑动时监听 【Function(RangeValues)】", + "【onChangeEnd】 : 滑动结束时监听 【Function(RangeValues)】", + "【onChanged】 : 改变时回调 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart index 28c35587..bb9ab74e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/node1_base.dart @@ -1,22 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 44, -// "name": 'RangeSlider基本使用', -// "priority": 1, -// "subtitle": "【values】 : 数值 【RangeValues】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【divisions】 : 分段数 【int】\n" -// "【label】 : 提示气泡文字 【String】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【inactiveColor】 : 非激活颜色 【Color】\n" -// "【onChangeStart】 : 开始滑动时监听 【Function(RangeValues)】\n" -// "【onChangeEnd】 : 滑动结束时监听 【Function(RangeValues)】\n" -// "【onChanged】 : 改变时回调 【Function(RangeValues)】", -// } + class CustomRangeSlider extends StatefulWidget { const CustomRangeSlider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json new file mode 100644 index 00000000..c70fd51d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "原生小条", + "info": "各自Chip组件的始祖,拥有各自Chip表现的能力,支持选中、点击、删除等事件。详见Chip、FilterChip、ActionChip、InputChip、ChoiceChip。", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip点击效果", + "desc": [ + "【label】: 中间组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【labelPadding】 : label边距 【EdgeInsetsGeometry】", + "【shadowColor】: 阴影色 【Color】", + "【avatar】: 左侧组件 【Widget】", + "【elevation】: 影深 【double】", + "【pressElevation】: 点击时影深 【double】", + "【onPressed】 : 点击事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip选中和删除效果", + "desc": [ + "【selected】: 是否选中 【bool】", + "【deleteIconColor】: 尾部图标色 【Color】", + "【selectedColor】: 选中色 【Color】", + "【deleteIcon】: 尾部组件 【Widget】", + "【onSelected】: 选中事件 【Function(bool)】", + "【onDeleted】 : 尾部事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart index cd1c437f..39140106 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node1_press.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 153, -// "name": 'RawChip点击效果', -// "priority": 1, -// "subtitle": -// "【label】: 中间组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【labelPadding】 : label边距 【EdgeInsetsGeometry】\n" -// "【shadowColor】: 阴影色 【Color】\n" -// "【avatar】: 左侧组件 【Widget】\n" -// "【elevation】: 影深 【double】\n" -// "【pressElevation】: 点击时影深 【double】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } class PressRawChip extends StatelessWidget { const PressRawChip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart index 8949f861..2165a0d2 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/node2_select.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 153, -// "name": 'RawChip选中和删除效果', -// "priority": 2, -// "subtitle": -// "【selected】: 是否选中 【bool】\n" -// "【deleteIconColor】: 尾部图标色 【Color】\n" -// "【selectedColor】: 选中色 【Color】\n" -// "【deleteIcon】: 尾部组件 【Widget】\n" -// "【onSelected】: 选中事件 【Function(bool)】\n" -// "【onDeleted】 : 尾部事件 【Function()】", -// } class SelectRawChip extends StatefulWidget { const SelectRawChip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json new file mode 100644 index 00000000..f061068a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "原手势检测器", + "info": "可以用来检测给定手势工厂描述的手势,在开发自己的手势识别器时非常有用。对于常见的手势,使用 GestureRecognizer。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector基本使用", + "desc": [ + "【behavior】 : 侦测行为 【HitTestBehavior】", + "【gestures】 : 手势映射 【Map】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart index 5b5c2a58..505f019a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/node1_base.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 248 RawGestureDetector 可以用来检测给定手势工厂描述的手势,在开发自己的手势识别器时非常有用。对于常见的手势,使用 GestureRecognizer。 -// { -// "widgetId": 248, -// "name": 'RawGestureDetector基本使用', -// "priority": 1, -// "subtitle": -// "【behavior】 : 侦测行为 【HitTestBehavior】\n" -// "【gestures】 : 手势映射 【Map】\n" -// "【child】 : 子组件 【Widget】", -// } + class RawGestureDetectorDemo extends StatefulWidget { const RawGestureDetectorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json new file mode 100644 index 00000000..44a4de06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "原键盘监听器", + "info": "可以用来检测键盘按键和松键的事件,目前只能检测到物理键盘,可在桌面端使用。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector基本使用", + "desc": [ + "【onKey】 : 键盘事件 【ValueChanged】", + "【focusNode】 : 焦点 【FocusNode】", + "【autofocus】 : 是否自动聚焦 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart index 6152e70c..45a43cdf 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/node1_base.dart @@ -3,16 +3,7 @@ import 'package:flutter/services.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 254 RawKeyboardListener 可以用来检测键盘按键和松键的事件,目前只能检测到物理键盘,可在桌面端使用。 -// { -// "widgetId": 254, -// "name": 'RawGestureDetector基本使用', -// "priority": 1, -// "subtitle": "【onKey】 : 键盘事件 【ValueChanged】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【autofocus】 : 是否自动聚焦 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } + class RawKeyboardListenerDemo extends StatefulWidget { const RawKeyboardListenerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json new file mode 100644 index 00000000..756285b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "原始按钮", + "info": "原始的Material按钮,按钮界的幕后大佬,可接受点击、长按、高亮变化事件,可指定颜色、形状。影深、内边距等属性。", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButton基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【elevation】 : 影深 【double】", + "【fillColor】 : 填充色 【Color】", + "【splashColor】 : 水波纹色 【Color】", + "【textStyle】 : 文字样式 【TextStyle】", + "【onLongPress】 : 长按事件 【Function()】", + "【onPressed】 : 点击事件 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButton高亮和形状", + "desc": [ + "【highlightElevation】 : 高亮影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart index 69468522..18e72046 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node1_base.dart @@ -3,20 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 175, -// "name": 'RawMaterialButton基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【fillColor】 : 填充色 【Color】\n" -// "【splashColor】 : 水波纹色 【Color】\n" -// "【textStyle】 : 文字样式 【TextStyle】\n" -// "【onLongPress】 : 长按事件 【Function()】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + class CustomRawMaterialButton extends StatelessWidget { const CustomRawMaterialButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart index 8fb42d22..b38ded03 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/node2_shape.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 175, -// "name": 'RawMaterialButton高亮和形状', -// "priority": 2, -// "subtitle": -// "【highlightElevation】 : 高亮影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } class ShapeRawMaterialButton extends StatelessWidget { const ShapeRawMaterialButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json new file mode 100644 index 00000000..f9b529a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "刷新指示器", + "info": "内部嵌套可滑动区域,下滑时会显示刷新图标,松手后可以执行指定的异步方法。可指定颜色、到顶端距离等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicator基本使用", + "desc": [ + "【child】 : 孩子(可滑动) 【Widget】", + "【displacement】 : 指示器悬浮高度 【double】", + "【color】 : 指示器颜色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart index 6b2ba5b5..3b0b1745 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 49, -// "name": 'RefreshIndicator基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子(可滑动) 【Widget】\n" -// "【displacement】 : 指示器悬浮高度 【double】\n" -// "【color】 : 指示器颜色 【Color】\n", -// "【backgroundColor】 : 指示器背景色 【Color】\n" -// "【onRefresh】 : 异步函数 【Future Function()】" -// } + class CustomRefreshIndicator extends StatefulWidget { const CustomRefreshIndicator({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json new file mode 100644 index 00000000..b8b19f59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "矩形位置变换", + "info": "AnimatedWidget的子类,使用Rect类型的动画器让子组件在两个Rect对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【size】 : 左和上的偏移量 【Size】", + "【rect】 : 动画 【Animation】", + " PositionedTransition组件只能在Stack内起作用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart index bc9883e6..2fc8df00 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 115, -// "name": 'RelativePositionedTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【size】 : 左和上的偏移量 【Size】\n" -// "【rect】 : 动画 【Animation】\n" -// " PositionedTransition组件只能在Stack内起作用", -// } class CustomRelativePositionedTransition extends StatefulWidget { const CustomRelativePositionedTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json new file mode 100644 index 00000000..b67b345a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "可重排序列表", + "info": "可以进行长按排序的ListView,可指定滑动方向、是否反向、滑动控制器等属性。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【header】 : 头部组件 【Widget】", + "【padding】 : 内边距 【EdgeInsets】", + "【onReorder】 : 调换时回调 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart index d485ed00..153fe66e 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 177, -// "name": 'ReorderableListView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【header】 : 头部组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsets】\n" -// "【onReorder】 : 调换时回调 【ReorderCallback】", -// } + class CustomReorderableListView extends StatefulWidget { const CustomReorderableListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart index d4612940..906ba9bb 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/node2_direction.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 177, -// "name": 'ReorderableListView滑动方向', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【bool】", -// } class DirectionReorderableListView extends StatefulWidget { const DirectionReorderableListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json new file mode 100644 index 00000000..77a2fb32 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "旋转变换", + "info": "可容纳一个子组件,并使其进行旋转动画,需要提供动画器turns,拥有alignment属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【turns】 : 是否消失 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart index e28a145a..761491f0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 90, -// "name": 'RotationTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【turns】 : 是否消失 【Animation】", -// } class CustomRotationTransition extends StatefulWidget { const CustomRotationTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json new file mode 100644 index 00000000..72cb719e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "脚手架", + "info": "一个通用app结构,包括上、下、左、右、中、浮动按钮部位,对应位置可盛放组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffold基本用法", + "desc": [ + "【appBar】 : 头部组件 【PreferredSizeWidget】", + "【bottomNavigationBar】 : 底部组件 【Widget】", + "【drawer】 : 左侧滑组件 【Widget】", + "【endDrawer】 : 右侧滑组件 【Widget】", + "【body】 : 内容组件 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【floatingActionButton】 : 浮动按钮 【Widget】", + "【floatingActionButtonLocation】 : 浮动按钮位置 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart index 0cfbf92a..5c18db22 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; import '../PopupMenuButton/node1_base.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 64, -// "name": 'Scaffold基本用法', -// "priority": 1, -// "subtitle": -// "【appBar】 : 头部组件 【PreferredSizeWidget】\n" -// "【bottomNavigationBar】 : 底部组件 【Widget】\n" -// "【drawer】 : 左侧滑组件 【Widget】\n" -// "【endDrawer】 : 右侧滑组件 【Widget】\n" -// "【body】 : 内容组件 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【floatingActionButton】 : 浮动按钮 【Widget】\n" -// "【floatingActionButtonLocation】 : 浮动按钮位置 【FloatingActionButtonLocation】", -// } + class CustomScaffold extends StatefulWidget { const CustomScaffold({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json new file mode 100644 index 00000000..de5eae99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "缩放变换", + "info": "可容纳一个子组件,并使其进行缩放动画,需要提供动画器scale,拥有alignment属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【scale】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart index 9afc2afd..524dbdb7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 91, -// "name": 'ScaleTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【scale】 : 动画 【Animation】", -// } + class CustomScaleTransition extends StatefulWidget { const CustomScaleTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json new file mode 100644 index 00000000..f726ea80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "可滑动组件", + "info": "实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollable的基本使用", + "desc": [ + "【viewportBuilder】 : 视口构造器 【ViewportBuilder】", + "【axisDirection】: 滑动方向 【AxisDirection】", + "【controller】: 滑动控制器 【ScrollController】", + "【dragStartBehavior】: t拖动行为 【DragStartBehavior】", + "【physics】: 滚动现象 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart index dd95e0ce..9ca0c80c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart @@ -4,18 +4,7 @@ import 'package:flutter/rendering.dart'; /// create by 张风捷特烈 on 2020/8/2 /// contact me by email 1981462002@qq.com -/// 说明: 253 Scrollable 可滑动组件 实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。 -// { -// "widgetId": 253, -// "name": "Scrollable的基本使用", -// "priority": 1, -// "subtitle": "【viewportBuilder】 : 视口构造器 【ViewportBuilder】\n" -// "【axisDirection】: 滑动方向 【AxisDirection】\n" -// "【controller】: 滑动控制器 【ScrollController】\n" -// "【dragStartBehavior】: t拖动行为 【DragStartBehavior】\n" -// "【physics】: 滚动现象 【ScrollPhysics】\n", -// } class ScrollableDemo extends StatelessWidget { ScrollableDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json new file mode 100644 index 00000000..7e6d02ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "滑动指示栏", + "info": "需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbar基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart index 97fff91c..828274cb 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 194, -// "name": 'Scrollbar基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【controller】 : 控制器 【ScrollController】", -// } + class CustomScrollbar extends StatelessWidget { CustomScrollbar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json new file mode 100644 index 00000000..0459ab60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "可选择文字", + "info": "可选择的文字,可以选择、复制。可指定浮标的颜色、大小、文字样式、对齐方式等。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableText基本使用", + "desc": [ + "【入参】 : 显示文字 【String】", + "【style】 : 文字样式 【TextStyle】", + "【cursorRadius】 : 光标半径 【Radius】", + "【cursorColor】 : 光标颜色 【Color】", + "【cursorWidth】 : 光标宽度 【double】", + "【showCursor】 : 是否显示光标 【bool】", + "【autofocus】 : 自动聚焦 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableText对齐属性", + "desc": [ + "【textAlign】 : 对齐方式*6 【textAlign】", + "【textDirection】 : 文字方向*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart index 398040c8..a20dcd5a 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node1_base.dart @@ -1,20 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 53, -// "name": 'SelectableText基本使用', -// "priority": 1, -// "subtitle": -// "【入参】 : 显示文字 【String】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【cursorRadius】 : 光标半径 【Radius】\n" -// "【cursorColor】 : 光标颜色 【Color】\n" -// "【cursorWidth】 : 光标宽度 【double】\n" -// "【showCursor】 : 是否显示光标 【bool】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } + class CustomSelectableText extends StatelessWidget { const CustomSelectableText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart index edfe022b..53bf6c37 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/node2_align.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 53, -// "name": 'SelectableText对齐属性', -// "priority": 2, -// "subtitle": -// "【textAlign】 : 对齐方式*6 【textAlign】\n" -// "【textDirection】 : 文字方向*2 【TextDirection】", -// } + class AlignSelectableText extends StatefulWidget { const AlignSelectableText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json new file mode 100644 index 00000000..8cb4f26b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "尺寸变换", + "info": "可容纳一个子组件,并使其进行尺寸动画,需要提供动画器sizeFactor,可指定尺寸变化轴及轴向的axisAlignment。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransition基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【axis】 : 轴向*2 【Axis】", + "【sizeFactor】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart index a196c71f..733e9c49 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 92, -// "name": 'SizeTransition基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【axis】 : 轴向*2 【Axis】\n" -// "【sizeFactor】 : 动画 【Animation】", -// } + class CustomSizeTransition extends StatefulWidget { const CustomSizeTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json new file mode 100644 index 00000000..8007c60a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "滑动变换", + "info": "AnimatedWidget的子类,使用Offset类型的动画器让子组件在两个Offset对象之间进行过渡动画。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 基本使用", + "desc": [ + "【child】 : 孩子组件 【Widget】", + "【textDirection】 : x轴方向 【TextDirection】", + "【position】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart index 4bf9ceb1..19569425 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 112, -// "name": 'SlideTransition 基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 孩子组件 【Widget】\n" -// "【textDirection】 : x轴方向 【TextDirection】\n" -// "【position】 : 动画 【Animation】", -// } + class CustomSlideTransition extends StatefulWidget { const CustomSlideTransition({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json new file mode 100644 index 00000000..d8164d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "滑块", + "info": "滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色、分段数及显示的标签,接收进度变化回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Slider基本使用", + "desc": [ + "【value】 : 数值 【double】", + "【min】 : 最小值 【double】", + "【max】 : 最大值 【double】", + "【activeColor】 : 激活颜色 【Color】", + "【inactiveColor】 : 非激活颜色 【Color】", + "【onChanged】 : 改变时回调 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider的分段与标签", + "desc": [ + "【divisions】 : 分段数 【int】", + "【label】 : 提示气泡文字 【String】", + "【onChangeStart】 : 开始滑动时监听 【Function(double)】", + "【onChangeEnd】 : 滑动结束时监听 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart index 278635c3..102802e0 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 42, -// "name": 'Slider基本使用', -// "priority": 1, -// "subtitle": -// "【value】 : 数值 【double】\n" -// "【min】 : 最小值 【double】\n" -// "【max】 : 最大值 【double】\n" -// "【activeColor】 : 激活颜色 【Color】\n" -// "【inactiveColor】 : 非激活颜色 【Color】\n" -// "【onChanged】 : 改变时回调 【Function(double)】", -// } + class CustomSlider extends StatefulWidget { const CustomSlider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart index e11d5227..268f5e8f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/node2_lable.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-31 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 42, -// "name": 'Slider的分段与标签', -// "priority": 2, -// "subtitle": -// "【divisions】 : 分段数 【int】\n" -// "【label】 : 提示气泡文字 【String】\n" -// "【onChangeStart】 : 开始滑动时监听 【Function(double)】\n" -// "【onChangeEnd】 : 滑动结束时监听 【Function(double)】", -// } + class DivisionsSlider extends StatefulWidget { const DivisionsSlider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json new file mode 100644 index 00000000..4105126d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "状态构造器", + "info": "需要传入 builder 属性进行构造组件,在 builder 中可以使用 StateSetter 改变构造子组件的状态,即可以不用创建类而实现一个局部刷新的组件。", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilder基本使用", + "desc": [ + "【builder】 : 组件构造器 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart index a40aa0ea..6cc0f465 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/node1_base.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 242 StatefulBuilder 需要传入 builder 属性进行构造组件,在 builder 中可以使用 StateSetter 改变构造子组件的状态,即可以不用创建类而实现一个局部刷新的组件。 -// { -// "widgetId": 242, -// "name": 'StatefulBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【StatefulWidgetBuilder】", -// } + class StatefulBuilderDemo extends StatelessWidget { const StatefulBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json new file mode 100644 index 00000000..523c58f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "状态转变组件", + "info": "抽象类,可以根据提供的动画器状态变化触发刷新。在 Flutter 框架层没有实现的子类,也没有使用的场景,感觉用处不是很大。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 介绍", + "desc": [ + "【animation】 : 子组件 【Animation】", + "这里自定义 ColorStatusTransitionWidget 进行使用,在动画器的状态改变时构建不同的颜色。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart index 27e59ba1..c431fb38 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 233 StatusTransitionWidget 状态转变组件 -/// 抽象类,可以根据提供的动画器状态变化触发刷新。在 Flutter 框架层没有实现的子类,也没有使用的场景,感觉用处不是很大。 -/// -// { -// "widgetId": 233, -// "name": 'StatusTransitionWidget 介绍', -// "priority": 1, -// "subtitle": -// "【animation】 : 子组件 【Animation】\n" -// "这里自定义 ColorStatusTransitionWidget 进行使用,在动画器的状态改变时构建不同的颜色。", -// } + class StatusTransitionWidgetDemo extends StatefulWidget { diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json new file mode 100644 index 00000000..23576b38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "步骤组件", + "info": "步骤组件,可指定一步步的操作,可以自定义步骤的内容,确认和返回的按钮以及步骤排列的方向。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepper基本使用", + "desc": [ + "【steps】 : 步骤列表 【List】", + "【currentStep】 : 当前步骤 【double】", + "【onStepTapped】 : 点击回调 【ValueChanged】", + "【onStepCancel】 : 上一步回调 【VoidCallback】", + "【controlsBuilder】 : 控制器构造 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepper的方向", + "desc": [ + "【type】 : 方向 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart index 6274ec80..6b2b2cfd 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 200, -// "name": 'Stepper基本使用', -// "priority": 1, -// "subtitle": -// "【steps】 : 步骤列表 【List】\n" -// "【currentStep】 : 当前步骤 【double】\n" -// "【onStepTapped】 : 点击回调 【ValueChanged】\n" -// "【onStepCancel】 : 上一步回调 【VoidCallback】\n" -// "【controlsBuilder】 : 控制器构造 【ControlsWidgetBuilder】", -// } + class StepperDemo extends StatefulWidget { const StepperDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart index 60fc4a28..0b42e623 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/node2_type.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 200, -// "name": 'Stepper的方向', -// "priority": 2, -// "subtitle": -// "【type】 : 方向 【StepperType】", -// } class VerticalStepper extends StatefulWidget { const VerticalStepper({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json new file mode 100644 index 00000000..f6be1cc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "流构造器", + "info": "可指定一个stream对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilder基本使用", + "desc": [ + "【stream】 : 子组件 【Stream】", + "【initialData】 : 初始数据 【T】", + "【builder】 : 点击事件 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart index be5cdb1a..2abad565 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/node1_base.dart @@ -4,17 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 173, -// "name": 'StreamBuilder基本使用', -// "priority": 1, -// "subtitle": -// "【stream】 : 子组件 【Stream】\n" -// "【initialData】 : 初始数据 【T】\n" -// "【builder】 : 点击事件 【AsyncWidgetBuilder】", -// } class CustomStreamBuilder extends StatefulWidget { const CustomStreamBuilder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json new file mode 100644 index 00000000..c034cac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_zh-CN.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "切钮", + "info": "切换选钮,常用于配置的切换,可指定小圆颜色、图片,滑槽颜色等,接收状态变化回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switch基础用法", + "desc": [ + "【inactiveThumbColor】 : 未选中小圈颜色 【Color】", + "【inactiveTrackColor】 : 未选中滑槽颜色 【Color】", + "【activeColor】 : 选中时小圈颜色 【Color】", + "【activeTrackColor】 : 选中时滑槽颜色 【Color】", + "【onChanged】 : 切换回调 【Function(double)】\"", + " onChanged时,回调true、null、false三种状态" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch图片", + "desc": [ + "【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】", + "【activeThumbImage】 : 选中小圈图片 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart index 65421274..7ba534a7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-14 /// contact me by email 1981462002@qq.com -/// 说明: -/// { -// "widgetId": 40, -// "name": 'Switch基础用法', -// "priority": 1, -// "subtitle": -// "【inactiveThumbColor】 : 未选中小圈颜色 【Color】\n" -// "【inactiveTrackColor】 : 未选中滑槽颜色 【Color】\n" -// "【activeColor】 : 选中时小圈颜色 【Color】\n" -// "【activeTrackColor】 : 选中时滑槽颜色 【Color】\n" -// "【onChanged】 : 切换回调 【Function(double)】" -// " onChanged时,回调true、null、false三种状态", -// } class CustomSwitch extends StatefulWidget { const CustomSwitch({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart index ce5d7225..5487e25f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/node2_image.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-14 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 40, -// "name": 'Switch图片', -// "priority": 2, -// "subtitle": -// "【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】\n" -// "【activeThumbImage】 : 选中小圈图片 【ImageProvider】", -// } class ImageSwitch extends StatefulWidget { const ImageSwitch({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json new file mode 100644 index 00000000..8e7388e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "标签页", + "info": "通常与TabBar联用,实现滑页的效果。一般不单独使用。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView需要与TabBar联用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【children】 : 孩子们 【指示器颜色】", + "【physics】 : 表现 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart index b284591e..9e5a3e7c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 59, -// "name": 'TabBarView需要与TabBar联用', -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TabController】\n" -// "【children】 : 孩子们 【指示器颜色】\n" -// "【physics】 : 表现 【ScrollPhysics】", -// } + class CustomTabBarView extends StatefulWidget { const CustomTabBarView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json new file mode 100644 index 00000000..47f41a15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "表格水波纹", + "info": "只能用于Table的水波纹,接收点击、双击、长按、高亮变化事件,水波纹会作用于表格的一行。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【Function()】", + "【onLongPress】 : 长按事件 【Function()】", + "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart index 9750631d..ef2758b6 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 151, -// "name": 'TableRowInkWell基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【Function()】\n" -// "【onLongPress】 : 长按事件 【Function()】\n" -// "【onHighlightChanged】 : 高亮变化回调 【Function(bool)】", -// } class CustomTableRowInkWell extends StatelessWidget { const CustomTableRowInkWell({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json new file mode 100644 index 00000000..73589c97 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "文字按钮", + "info": "Material风格的文字按钮,默认只有文字,点击时有水波纹。可通过样式更改边框、颜色、阴影等属性。", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButton基本使用", + "desc": [ + "【child】 : 是否具有滚动主体 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onLongPress】 : 长按事件 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton样式", + "desc": [ + "【style】 : 按钮样式 【ButtonStyle】", + "【focusNode】 : 焦点 【FocusNode】", + "【clipBehavior】 : 裁剪行为 【Clip】", + "【autofocus】 : 自动聚焦 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart index 66673861..0b8383a5 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 353 TextButton Material风格的文字按钮,默认只有文字,点击时有水波纹。可通过样式更改边框、颜色、阴影等属性。 -// { -// "widgetId": 353, -// "name": 'TextButton基本使用', -// "priority": 1, -// "subtitle": "【child】 : 是否具有滚动主体 【Widget】\n" -// "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【onLongPress】 : 长按事件 【VoidCallback】", -// } + class TextButtonDemo extends StatelessWidget { const TextButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart index 7c13d329..d5a62004 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/node2_style.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 353, -// "name": 'TextButton样式', -// "priority": 2, -// "subtitle": "【style】 : 按钮样式 【ButtonStyle】\n" -// "【focusNode】 : 焦点 【FocusNode】\n" -// "【clipBehavior】 : 裁剪行为 【Clip】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } + class TextButtonStyleDemo extends StatelessWidget { const TextButtonStyleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json new file mode 100644 index 00000000..cf7ea31a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_zh-CN.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "输入框", + "info": "由于输入的组件,拥有复杂的属性。可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextField基本用法", + "desc": [ + "【controller】 : 控制器 【TextEditingController】", + "【style】 : 文字样式 【TextStyle】", + "【decoration】 : 装饰线 【InputDecoration】", + "【onEditingComplete】 : 输入完成事件 【Function()】", + "【onSubmitted】 : 提交事件 【Function(String)】", + "【onChanged】 : 输入事件 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextField行数和cursor", + "desc": [ + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【cursorRadius】 : 光标半径 【Radius】", + "【cursorColor】 : 光标颜色 【Color】", + "【cursorWidth】 : 光标宽度 【double】", + "【showCursor】 : 是否显示光标 【bool】", + "【autofocus】 : 自动聚焦 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decoration的复杂装饰", + "desc": [ + "InputDecoration有非常多的装饰点,对应点缀见代码:", + "border: 边线相关", + "helper: 左下角相关提示", + "counter: 右下角相关提示", + "prefix: 输入框内部最左侧", + "suffix: 输入框内部最右侧", + "label: 无焦点时文字", + "label: 无焦点时文字", + "hint: 提示文字相关", + "border: 边线相关" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart index e95678ce..64a59be9 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node1_base.dart @@ -1,19 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'TextField基本用法', -// "priority": 1, -// "subtitle": -// "【controller】 : 控制器 【TextEditingController】\n" -// "【style】 : 文字样式 【TextStyle】\n" -// "【decoration】 : 装饰线 【InputDecoration】\n" -// "【onEditingComplete】 : 输入完成事件 【Function()】\n" -// "【onSubmitted】 : 提交事件 【Function(String)】\n" -// "【onChanged】 : 输入事件 【Function(String)】", -// } + class CustomTextField extends StatefulWidget { const CustomTextField({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart index db685901..5efaa0cc 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node2_cursor.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'TextField行数和cursor', -// "priority": 2, -// "subtitle": -// "【minLines】 : 最小行数 【int】\n" -// "【maxLines】 : 最大行数 【int】\n" -// "【cursorRadius】 : 光标半径 【Radius】\n" -// "【cursorColor】 : 光标颜色 【Color】\n" -// "【cursorWidth】 : 光标宽度 【double】\n" -// "【showCursor】 : 是否显示光标 【bool】\n" -// "【autofocus】 : 自动聚焦 【bool】", -// } + class CursorTextField extends StatefulWidget { const CursorTextField({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart index 72b4e60d..0a8aeb3d 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/node3_decoration.dart @@ -2,23 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 54, -// "name": 'decoration的复杂装饰', -// "priority": 3, -// "subtitle": -// "InputDecoration有非常多的装饰点,对应点缀见代码:\n" -// "border: 边线相关\n" -// "helper: 左下角相关提示\n" -// "counter: 右下角相关提示\n" -// "prefix: 输入框内部最左侧\n" -// "suffix: 输入框内部最右侧\n" -// "label: 无焦点时文字\n" -// "label: 无焦点时文字\n" -// "hint: 提示文字相关\n" -// "border: 边线相关", -// } + class ComplexTextField extends StatelessWidget { const ComplexTextField({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json new file mode 100644 index 00000000..26a01201 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "文字表单输入", + "info": "和TextField属性基本一致,在其基础上增加字段的校验和提交的回调,FormState的save会触发onSaved回调。", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormField基本使用", + "desc": [ + "基本属性和TextField一致,详见之", + "【validator】 : 验证函数 【FormFieldValidator 】", + "【onFieldSubmitted】 : 提交回调 【ValueChanged】", + "【onSaved】 : 表单save时回调 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart index 9b2b372b..0e8dc173 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 199, -// "name": 'TextFormField基本使用', -// "priority": 1, -// "subtitle": -// " 基本属性和TextField一致,详见之\n" -// "【validator】 : 验证函数 【FormFieldValidator 】\n" -// "【onFieldSubmitted】 : 提交回调 【ValueChanged】\n" -// "【onSaved】 : 表单save时回调 【FormFieldSetter】", -// } + class CustomTextFormField extends StatefulWidget { const CustomTextFormField({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json new file mode 100644 index 00000000..570a1548 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "提示工具", + "info": "由于显示提示信息的组件,长按时显示信息。可指定边距、显示时长、文字样式、装饰灯属性。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltip基本使用", + "desc": [ + "【preferBelow】 : 是否首选下方 【bool】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【message】 : 消息内容 【String】", + "【showDuration】 : 展示时间 【Duration】", + "【waitDuration】 : 悬浮出现时间 【Duration】", + "【child】 : 孩子 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltip的装饰", + "desc": [ + "【decoration】 : 装饰对象 【Decoration】", + "【textStyle】 : 文字样式 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart index 4246fab4..29953fdb 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node1_base.dart @@ -1,20 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 50, -// "name": 'Tooltip基本使用', -// "priority": 1, -// "subtitle": -// "【preferBelow】 : 是否首选下方 【bool】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【message】 : 消息内容 【String】\n" -// "【showDuration】 : 展示时间 【Duration】\n" -// "【waitDuration】 : 悬浮出现时间 【Duration】\n" -// "【child】 : 孩子 【Widget】", -// } + class CustomTooltip extends StatelessWidget { const CustomTooltip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart index 7e6d2207..c850cb18 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/node2_decoration.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 50, -// "name": 'Tooltip的装饰', -// "priority": 2, -// "subtitle": -// "【decoration】 : 装饰对象 【Decoration】\n" -// "【textStyle】 : 文字样式 【double】", -// } class DecorationTooltip extends StatelessWidget { const DecorationTooltip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json new file mode 100644 index 00000000..9631b0ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "渐变动画构造器", + "info": "通过渐变器 Tween 对相关属性进行渐变动画,通过 builder 进行局部构建,减少刷新范围。不需要自定义动画器,可指定动画时长、曲线、结束回调。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 使用案例", + "desc": [ + "【tween】 : *渐变器 【Tween】", + "【duration】 : *时长 【Duration】", + "【builder】 : *构造器 【ValueWidgetBuilder】", + "【curve】 : 动画曲线 【Curve】", + "【onEnd】 : 结束回调 【VoidCallback】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart index 262fd484..89a97218 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart @@ -3,21 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 226 TweenAnimationBuilder 渐变动画构造器 -/// 通过渐变器 Tween 对相关属性进行渐变动画,通过 builder 进行局部构建,减少刷新范围。不需要自定义动画器,可指定动画时长、曲线、结束回调。 -/// -// { -// "widgetId": 226, -// "name": 'TweenAnimationBuilder 使用案例', -// "priority": 1, -// "subtitle": -// "【tween】 : *渐变器 【Tween】\n" -// "【duration】 : *时长 【Duration】\n" -// "【builder】 : *构造器 【ValueWidgetBuilder】\n" -// "【curve】 : 动画曲线 【Curve】\n" -// "【onEnd】 : 结束回调 【VoidCallback】\n" -// "【child】 : 子组件 【Widget】", -// } + class TweenAnimationBuilderDemo extends StatefulWidget { const TweenAnimationBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json new file mode 100644 index 00000000..362d6b53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "唯一组件", + "info": "抽象类,必须提供一个 GlobalKey 进行身份标识,该类型组件只会 inflated 一个实例,同一时刻也只会有一个状态,可以通过 currentState 属性获取状态。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 介绍", + "desc": [ + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart index 39ecd1dc..e31fce22 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 243 UniqueWidget 唯一组件 -/// 抽象类,必须提供一个 GlobalKey 进行身份标识,该类型组件只会 inflated 一个实例,同一时刻也只会有一个状态,可以通过 currentState 属性获取状态。 -/// -// { -// "widgetId": 243, -// "name": 'UniqueWidget 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】", -// } + class UniqueWidgetDemo extends StatelessWidget { const UniqueWidgetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json new file mode 100644 index 00000000..190489a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "监听值构造器", + "info": "可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilder基本使用", + "desc": [ + "【builder】: 组件构造器 【ValueWidgetBuilder】", + "【valueListenable】: 监听值 【ValueListenable】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart index a2a44aea..21d9de4b 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: 255 ValueListenableBuilder 1 可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。 -// { -// "widgetId": 255, -// "name": 'ValueListenableBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】: 组件构造器 【ValueWidgetBuilder】\n" -// "【valueListenable】: 监听值 【ValueListenable】\n" -// "【child】: 子组件 【Widget】", -// } + class ValueListenableBuilderDemo extends StatelessWidget { ValueListenableBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json new file mode 100644 index 00000000..2a829b29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "组件检查器", + "info": "该组件可以让你很方便地查看子组件层级结构,是Flutter Inspector插件的功能之一。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspector基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【selectButtonBuilder】: *选择按钮构造器 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart index f44c6116..fd118ca7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/16 /// contact me by email 1981462002@qq.com -/// 说明: 234 WidgetInspector 该组件可以让你很方便地查看子组件层级结构,是Flutter Inspector插件的功能之一。 -// { -// "widgetId": 234, -// "name": "WidgetInspector基本使用", -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【selectButtonBuilder】: *选择按钮构造器 【InspectorSelectButtonBuilder】", -// } + class WidgetInspectorDemo extends StatelessWidget { const WidgetInspectorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json new file mode 100644 index 00000000..6c4c0011 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "组件应用", + "info": "集合一个应用程序需要的部件,如路由、语言、一些调试开关等。也是实现MaterialApp和CupertinoApp的核心组件。", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp基本使用", + "desc": [ + "【pageRouteBuilder】 : *路由构造器 【PageRouteFactory】", + "【color】: *颜色 【Color】", + "【debugShowWidgetInspector】: 是否显示z组件查看器 【bool】", + "其他属性基本上同MaterialApp,详见之。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart index 0a671a60..608948c7 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/16 /// contact me by email 1981462002@qq.com -/// 说明: 236 WidgetsApp 集合一个应用程序需要的部件,如路由、语言、一些调试开关等。也是实现MaterialApp和CupertinoApp的核心组件。 -// { -// "widgetId": 236, -// "name": "WidgetsApp基本使用", -// "priority": 1, -// "subtitle": "【pageRouteBuilder】 : *路由构造器 【PageRouteFactory】\n" -// "【color】: *颜色 【Color】\n" -// "【debugShowWidgetInspector】: 是否显示z组件查看器 【bool】\n" -// "其他属性基本上同MaterialApp,详见之。", -// } + class WidgetsAppDemo extends StatefulWidget { const WidgetsAppDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json new file mode 100644 index 00000000..bc4572ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "返回拦截", + "info": "当一个界面中有WillPopScope组件时,在页面返回时会触发回调,决定是否返回。可用于二次确认退出的场景。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onWillPop】 : 返回回调 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart index e81e2f59..46b0e827 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 170, -// "name": 'WillPopScope使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onWillPop】 : 返回回调 【WillPopCallback】", -// } class CustomWillPopScope extends StatelessWidget { const CustomWillPopScope({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json new file mode 100644 index 00000000..d8332463 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "年份选择器", + "info": "年份的选择组件,长相比较寒酸。可指定选择的日期范围、选中日期等,接收每份选中事件", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart index 886a2837..a3e83334 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 136, -// "name": 'YearPicker基本使用', -// "priority": 1, -// "subtitle": "【selectedDate】 : 选中日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } + class CustomYearPicker extends StatefulWidget { const CustomYearPicker({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json new file mode 100644 index 00000000..8dd6cffe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "关于对话框", + "info": "应用的简介对话框,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表,点击左侧按钮可以跳转到证书页。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialog基本使用", + "desc": [ + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】", + "【children】 : 子组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart index 1d92e310..2a1cb902 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 130, -// "name": 'AboutDialog基本使用', -// "priority": 1, -// "subtitle": -// "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】\n" -// "【children】 : 子组件列表 【List】", -// } + class CustomAboutDialog extends StatelessWidget { const CustomAboutDialog({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json new file mode 100644 index 00000000..5fe2f3b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "关于应用条目", + "info": "一个点击条目,点击时可以弹出应用相关信息,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表。", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTile基本使用", + "desc": [ + "【icon】 : 左图标 【Widget】", + "【applicationIcon】 : 左上图标 【Widget】", + "【applicationVersion】 : 版本号 【String】", + "【applicationName】 : 应用名 【String】", + "【applicationLegalese】 : 应用律术 【String】", + "【aboutBoxChildren】 : 弹框内容组件 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart index 8a9655a9..29266545 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/node1_base.dart @@ -3,19 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 193, -// "name": 'AboutListTile基本使用', -// "priority": 1, -// "subtitle": -// "【icon】 : 左图标 【Widget】\n" -// "【applicationIcon】 : 左上图标 【Widget】\n" -// "【applicationVersion】 : 版本号 【String】\n" -// "【applicationName】 : 应用名 【String】\n" -// "【applicationLegalese】 : 应用律术 【String】\n" -// "【aboutBoxChildren】 : 弹框内容组件 【List】", -// } + class AboutListTileDemo extends StatelessWidget { const AboutListTileDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json new file mode 100644 index 00000000..64440ef3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "事件小条", + "info": "和Chip组件类似的样式,有一些点击的属性。可以指定点击时的阴影深、点击事件。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChip的普通表现如下", + "desc": [ + "【onPressed】: 点击事件 【Function】", + "【pressElevation】: 按下时影深 【double】", + "其他属性同Chip组件,无右侧组件。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart index e73d2e37..b384b890 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/node1_base.dart @@ -1,16 +1,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -/// "widgetId": 13, -// "priority": 1, -// "name": "ActionChip的普通表现如下", -// "subtitle": "【onPressed】: 点击事件 【Function】\n" -// "【pressElevation】: 按下时影深 【double】\n" -// "其他属性同Chip组件,无右侧组件。", -// } + /// diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json new file mode 100644 index 00000000..6d8bb8d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "弹出对话框", + "info": "一个通用的对话框结构,可指定头、中、尾处的组件。拥有标题、内容的文字样式和边距,影深、形状等属性。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialog基本使用", + "desc": [ + "【title】 : 顶部组件 【Widget】", + "【content】 : 内容组件 【Widget】", + "【titleTextStyle】 : 顶部文字样式 【TextStyle】", + "【contentTextStyle】 : 内容文字样式 【TextStyle】", + "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】", + "【actions】 : 右下角组件列表 【List】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart index 233be35f..ada7cf5c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/node1_base.dart @@ -2,24 +2,7 @@ /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 127, -// "name": 'AlertDialog基本使用', -// "priority": 1, -// "subtitle": -// "【title】 : 顶部组件 【Widget】\n" -// "【content】 : 内容组件 【Widget】\n" -// "【titleTextStyle】 : 顶部文字样式 【TextStyle】\n" -// "【contentTextStyle】 : 内容文字样式 【TextStyle】\n" -// "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n" -// "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n" -// "【actions】 : 右下角组件列表 【List】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json new file mode 100644 index 00000000..d9f9c3aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "图标动画", + "info": "使用AnimatedIcons的图标数据,可以根据一个动画控制器来使图标进行动画效果。可指定图标大小、颜色等。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIcon基本使用", + "desc": [ + "【icon】 : 动画图标数据 【AnimatedIcons】", + "【size】 : 大小 【double】", + "【color】 : 颜色 【Color】", + "【progress】 : 动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart index 3621c672..4e96eb8d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 125, -// "name": 'AnimatedIcon基本使用', -// "priority": 1, -// "subtitle": -// "【icon】 : 动画图标数据 【AnimatedIcons】\n" -// "【size】 : 大小 【double】\n" -// "【color】 : 颜色 【Color】\n" -// "【progress】 : 动画 【Animation】", -// } + class CustomAnimatedIcon extends StatefulWidget { const CustomAnimatedIcon({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json new file mode 100644 index 00000000..3f7fe013 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "自动填充", + "info": "在输入期间,提供联想词浮层展示,以便用户选择,拥有高度的可定制性。", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocomplete基本使用", + "desc": [ + "【optionsBuilder】 : 选项构造器 【AutocompleteOptionsBuilder】", + "【onSelected】 : 选择时回调 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocomplete的泛型", + "desc": [ + "【optionsViewBuilder】 : 面板构造器 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 输入构造器 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : 文字展示 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart index 52c906ba..b9abae50 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node1_base.dart @@ -3,14 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022-04-18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 356, -// "name": 'Autocomplete基本使用', -// "priority": 1, -// "subtitle": "【optionsBuilder】 : 选项构造器 【AutocompleteOptionsBuilder】\n" -// "【onSelected】 : 选择时回调 【AutocompleteOnSelected】", -// } + class AutocompleteDemo extends StatelessWidget { const AutocompleteDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart index 66ac2124..f0fe0063 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart @@ -4,15 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022-04-18 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 356, -// "name": 'Autocomplete的泛型', -// "priority": 2, -// "subtitle": "【optionsViewBuilder】 : 面板构造器 【AutocompleteOptionsViewBuilder】\n" -// "【fieldViewBuilder】 : 输入构造器 【AutocompleteFieldViewBuilder】\n" -// "【displayStringForOption】 : 文字展示 【AutocompleteOptionToString】\n", -// } + class AutocompleteType extends StatefulWidget { const AutocompleteType({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json new file mode 100644 index 00000000..4806e8bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "返回按钮", + "info": "一个具有返回功能的IconButton,返回图标不可更改。在iOS和Android中表现不同", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton属性", + "desc": [ + "【color】: 颜色 【Color】", + "【style】: 按钮样式 【ButtonStyle?】", + "【onPressed】: 点击事件 【Function】", + " onPressed为空会退出当前栈" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart index 90d65cfc..c2f2178e 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 31, -// "priority": 1, -// "name": "BackButton属性", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【style】: 按钮样式 【ButtonStyle?】\n" -// "【onPressed】: 点击事件 【Function】\n" -// " onPressed为空会退出当前栈", -// } + class CustomBackButton extends StatelessWidget { CustomBackButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..1a3a4273 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "返回按钮图标", + "info": "一个返回 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的返回按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart index db69b2aa..1f39e563 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 272, -// "priority": 1, -// "name": "BackButtonIcon 效果", -// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的返回按钮图标。", -// } + class BackButtonIconDemo extends StatelessWidget { const BackButtonIconDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json new file mode 100644 index 00000000..c14d74fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_zh-CN.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "标记组件", + "info": "Badge 是一种 Material 风格的组件,可以在 child 上层添加标记物,构建时依赖 Stack 组件进行叠放。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge 圆点标记的使用", + "desc": [ + "【backgroundColor】 : 背景色 【Color?】", + "【isLabelVisible】 : 是否显示标记 【bool】", + "【smallSize】 : 无标签时直径 【double?】", + "【child】 : 子组件 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge 标签标记", + "desc": [ + "【label】 : 标题组件 【Widget?】", + "【textStyle】 : 标题颜色 【TextStyle?】", + "【textColor】 : 标题样式 【Color?】", + "【padding】 : 标题边距 【EdgeInsetsGeometry?】", + "【largeSize】 : 有标签时高度 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge 的偏移量", + "desc": [ + "【offset】 : 标记偏移量 【Offset?】", + "【alignment】 : 标题偏移 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart index c0fd4359..f5173c38 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_1.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/01/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 258, -// "name": 'Badge 圆点标记的使用', -// "priority": 1, -// "subtitle": "【backgroundColor】 : 背景色 【Color?】\n" -// "【isLabelVisible】 : 是否显示标记 【bool】\n" -// "【smallSize】 : 无标签时直径 【double?】\n" -// "【child】 : 子组件 【Widget?】", -// } + class BadgeDemo extends StatelessWidget { const BadgeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart index 028649c6..73cf887d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_2.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/01/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 258, -// "name": 'Badge 标签标记', -// "priority": 2, -// "subtitle": "【label】 : 标题组件 【Widget?】\n" -// "【textStyle】 : 标题颜色 【TextStyle?】\n" -// "【textColor】 : 标题样式 【Color?】\n" -// "【padding】 : 标题边距 【EdgeInsetsGeometry?】\n" -// "【largeSize】 : 有标签时高度 【double?】\n", -// } + class BadgeLabelDemo extends StatelessWidget { const BadgeLabelDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart index 4ad90b41..e815b239 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/node_3.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/01/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 258, -// "name": 'Badge 的偏移量', -// "priority": 3, -// "subtitle": "【offset】 : 标记偏移量 【Offset?】\n" -// "【alignment】 : 标题偏移 【AlignmentDirectional?】", -// } + class BadgeAlignOffsetDemo extends StatelessWidget { const BadgeAlignOffsetDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json new file mode 100644 index 00000000..7b2765d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "角标组件", + "info": "用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个角标", + "desc": [ + "【message】 : 显示的文字信息 【String】", + "【location】 : 位置*4 【BannerLocation】", + "【color】: 角标颜色 【Color】", + "【child】: 孩子 【Widget】", + "【textStyle】: 文字样式 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart index 22a1938d..9b8c3b91 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 5, -// "priority": 1, -// "name": "用于显示一个角标", -// "subtitle": "【message】 : 显示的文字信息 【String】\n" -// "【location】 : 位置*4 【BannerLocation】\n" -// "【color】: 角标颜色 【Color】\n" -// "【child】: 孩子 【Widget】\n" -// "【textStyle】: 文字样式 【TextStyle】", -// } + class CustomBanner extends StatelessWidget { CustomBanner({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json new file mode 100644 index 00000000..afe4e499 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "底部抽屉", + "info": "作为组件来说是一个简单的结构组件,可指定形状、影深、背景色、内部组件构造器等。一般通过ScaffoldState的showBottomSheet方法从底部弹出。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheet基本使用", + "desc": [ + "【builder】 : 组件构造器 【WidgetBuilder】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onClosing】 : 关闭回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart index 0020befe..36364e8a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/node1_base.dart @@ -1,17 +1,6 @@ /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 142, -// "name": 'BottomSheet基本使用', -// "priority": 1, -// "subtitle": -// "【builder】 : 组件构造器 【WidgetBuilder】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【onClosing】 : 关闭回调 【Function()】", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json new file mode 100644 index 00000000..398232fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "盒滑动视图", + "info": "BoxScrollView 是一个继承自 ScrollView 的抽象类,所以无法直接使用,它的子类有 ListView、GridView。一般不自己实现子类使用它", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 介绍", + "desc": [ + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【cacheExtent】 : 缓存长 【double】", + "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】", + "【clipBehavior】 : 裁剪行为 【ClipBehavior】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart index afa8a1f3..af29d47a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 350 BoxScrollView 盒滑动视图 -/// BoxScrollView 类是一个继承自 ScrollView 的抽象类,所以无法直接使用,它的子类有 ListView、GridView。一般不自己实现子类使用它。 -/// link 183,162,163 -/// -// { -// "widgetId": 350, -// "name": 'BoxScrollView 介绍', -// "priority": 1, -// "subtitle": -// "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【cacheExtent】 : 缓存长 【double】\n" -// "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】\n" -// "【clipBehavior】 : 裁剪行为 【ClipBehavior】\n" -// "【controller】 : 控制器 【ScrollController】", -// } + class BoxScrollViewDemo extends StatelessWidget { const BoxScrollViewDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json new file mode 100644 index 00000000..93bbb25f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "构造器", + "info": "一个不影响子组件占位空间,不具有显示性的组件,存在的唯一价值是提供当前组件对应元素的上下文。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builder的使用", + "desc": [ + "【builder】 : 组件构造器 【WidgetBuilder】", + "同一个类中使用`XXX.of(context)`获取某类状态对象方法会存在`上下文滞后`的错误,使用Builder解决。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart index 452b0697..83e7e8ac 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 202, -// "name": 'Builder的使用', -// "priority": 1, -// "subtitle": "【builder】 : 组件构造器 【WidgetBuilder】\n" -// "同一个类中使用`XXX.of(context)`获取某类状态对象方法会存在`上下文滞后`的错误,使用Builder解决。", -// } class BuilderDemo extends StatelessWidget { const BuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json new file mode 100644 index 00000000..afbc8471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "按钮栏", + "info": "接收组件列表,常用于盛放若干个按钮。可指定对齐方式、边距等信息。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar对齐方式", + "desc": [ + "【alignment】: 对齐方式 【MainAxisAlignment】", + "【children】: 子组件集 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar边距和高", + "desc": [ + "【buttonPadding】: 内边距 【EdgeInsetsGeometry】", + "【buttonHeight】: 高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart index 70eb7e03..12c2f4ce 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node1_base.dart @@ -1,13 +1,6 @@ /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 29, -// "priority": 1, -// "name": "ButtonBar对齐方式", -// "subtitle": "【alignment】: 对齐方式 【MainAxisAlignment】\n" -// "【children】: 子组件集 【List】", -// } + import 'package:flutter/material.dart'; import 'package:widgets/utils/dialog_about.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart index 113943da..7c35a8db 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/node2_padding.dart @@ -5,14 +5,7 @@ import 'package:widgets/utils/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 29, -// "priority": 2, -// "name": "ButtonBar边距和高", -// "subtitle": "【buttonPadding】: 内边距 【EdgeInsetsGeometry】\n" -// "【buttonHeight】: 高 【double】", -// } + class PaddingButtonBar extends StatelessWidget { const PaddingButtonBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json new file mode 100644 index 00000000..f0de12b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "卡片组件", + "info": " 基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card可以让一个组件卡片化", + "desc": [ + "【elevation】 : 影深 【double】", + "【margin】: 外边距 【double】", + "【color】: 颜色 【Color】", + "【child】: 孩子 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "可以通过shape属性实现裁切效果", + "desc": [ + "【shape】 : 形状 【ShapeBorder】", + "【margin】: 外边距 【double】", + "【color】: 颜色 【Color】", + "【child】: 孩子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart index 13f833cc..eb27e7f4 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 3, -// "priority": 1, -// "name": "Card可以让一个组件卡片化", -// "subtitle": "【elevation】 : 影深 【double】\n" -// "【margin】: 外边距 【double】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 孩子 【Widget】", -// } + class CustomCard extends StatelessWidget { const CustomCard({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart index 25bbca87..a5845018 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/node2_shape.dart @@ -2,16 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 3, -// "priority": 2, -// "name": "可以通过shape属性实现裁切效果", -// "subtitle": "【shape】 : 形状 【ShapeBorder】\n" -// "【margin】: 外边距 【double】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 孩子 【Widget】", -// } + import 'package:flutter/material.dart'; import 'package:widgets/utils/pather.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json new file mode 100644 index 00000000..02ac5962 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "复选瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个CheckBox。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTile的基本表现如下", + "desc": [ + "【secondary】: 左侧组件 【Widget】", + "【checkColor】: ✔️颜色 【Color】", + "【activeColor】: 选中时外框颜色 【Color】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【onChanged】: 选中事件 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTile的选中效果", + "desc": [ + "【selected】: 是否选中 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart index 8ffe39fe..9d0a9b4b 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node1_base.dart @@ -1,19 +1,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 17, -// "priority": 1, -// "name": "CheckBoxListTile的基本表现如下", -// "subtitle": "【secondary】: 左侧组件 【Widget】\n" -// "【checkColor】: ✔️颜色 【Color】\n" -// "【activeColor】: 选中时外框颜色 【Color】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【onChanged】: 选中事件 【Function(bool)】", -// } import 'package:flutter/material.dart'; class CustomCheckBoxListTile extends StatefulWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart index 9b626012..f6fd5c80 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node2_select.dart @@ -1,14 +1,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 17, -// "priority": 2, -// "name": "CheckBoxListTile的选中效果", -// "subtitle": "【selected】: 是否选中 【bool】", -// } import 'package:flutter/material.dart'; class SelectCheckBoxListTile extends StatefulWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart index 5f990ffe..e65566b7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/node3_dense.dart @@ -1,13 +1,6 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 17, -// "priority": 3, -// "name": "CheckBoxListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json new file mode 100644 index 00000000..72c0cd98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "debug标签", + "info": "仅在debug运行模式中显示右上角角标,没什么太大卵用。在 MaterialApp 组件源码中有使用场景。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBanner基本使用", + "desc": [ + "【child】 : 组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart index f2d853a7..6cf08309 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 215 CheckedModeBanner 仅在debug运行模式中显示右上角角标,没什么太大卵用。在 MaterialApp 组件源码中有使用场景。 -// { -// "widgetId": 215, -// "name": 'CheckedModeBanner基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】", -// } + class CheckedModeBannerDemo extends StatelessWidget { const CheckedModeBannerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json new file mode 100644 index 00000000..a7f5a649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_zh-CN.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "小条组件", + "info": "一个横向的圆边小条,可以包含左中右三个组件。可以指定颜色、阴影色和点击事件。", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chip的普通表现如下", + "desc": [ + "【avatar】: 左侧组件 【Widget】", + "【label】: 中间组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【labelPadding】: label边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "可以设置颜色和阴影", + "desc": [ + "【backgroundColor】: 背景色 【Color】", + "【shadowColor】: 阴影色 【Color】", + "【elevation】: 影深 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "可以设置右侧点击按钮", + "desc": [ + "【deleteIcon】: 右侧组件(通常为Icon) 【Widget】", + "【deleteIconColor】: 右侧组件颜色 【Color】", + "【onDeleted】: 右侧组件点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart index a0d18340..59f80507 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node1_base.dart @@ -2,17 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 11, -// "priority": 1, -// "name": "Chip的普通表现如下", -// "subtitle": "【avatar】: 左侧组件 【Widget】\n" -// "【label】: 中间组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【labelPadding】: label边距 【EdgeInsetsGeometry】", -// } import 'package:flutter/material.dart'; class CustomChip extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart index 3b49e4ef..0a1af3df 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node2_color.dart @@ -2,16 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 11, -// "priority": 2, -// "name": "可以设置颜色和阴影", -// "subtitle": "【backgroundColor】: 背景色 【Color】\n" -// "【shadowColor】: 阴影色 【Color】\n" -// "【elevation】: 影深 【double】", -// } import 'package:flutter/material.dart'; class ColorOfChip extends StatelessWidget { const ColorOfChip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart index 3ebe27b8..e9eae199 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/node3_delete.dart @@ -2,16 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 11, -// "priority": 3, -// "name": "可以设置右侧点击按钮", -// "subtitle": "【deleteIcon】: 右侧组件(通常为Icon) 【Widget】\n" -// "【deleteIconColor】: 右侧组件颜色 【Color】\n" -// "【onDeleted】: 右侧组件点击事件 【Function】", -// } import 'package:flutter/material.dart'; import 'package:widgets/utils/dialog_about.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json new file mode 100644 index 00000000..000e49a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "选择小条", + "info": "和Chip组件类似的样式,有一些选择的属性。可以指定选中时的颜色、阴影色和选择事件。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChip的普通表现如下", + "desc": [ + "【selectedColor】: 选中时颜色 【Color】", + "【selectedShadowColor】: 选中时阴影颜色 【Color】", + "【onSelected】: 选中事件 【Fuction(bool)】", + " 其他属性同Chip组件,无右侧组件。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart index 6d136447..973d090f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/node1_base.dart @@ -1,16 +1,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 12, -// "priority": 1, -// "name": "ChoiceChip的普通表现如下", -// "subtitle": "【selectedColor】: 选中时颜色 【Color】\n" -// "【selectedShadowColor】: 选中时阴影颜色 【Color】\n" -// "【onSelected】: 选中事件 【Fuction(bool)】\n" -// " 其他属性同Chip组件,无右侧组件。", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json new file mode 100644 index 00000000..53f64fbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "圆形组件", + "info": "可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar的表现", + "desc": [ + "【radius】 : 半径 【double】", + "【backgroundImage】 : 图片资源 【ImageProvider】", + "【foregroundColor】: 前景色 【Color】", + "【backgroundColor】: 背景色 【Color】", + "【minRadius】: 最小半径 【double】", + "【maxRadius】: 最大半径 【double】", + "【child】: 孩子组件 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart index ff2fd147..796785f2 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/node1_base.dart @@ -1,18 +1,6 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 9, -// "priority": 1, -// "name": "CircleAvatar的表现", -// "subtitle": "【radius】 : 半径 【double】\n" -// "【backgroundImage】 : 图片资源 【ImageProvider】\n" -// "【foregroundColor】: 前景色 【Color】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【minRadius】: 最小半径 【double】\n" -// "【maxRadius】: 最大半径 【double】\n" -// "【child】: 孩子组件 【Child】", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json new file mode 100644 index 00000000..844ed1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "关闭按钮", + "info": "一个具有关闭功能的IconButton,关闭图标不可更改。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton点击事件", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "【color】: 颜色 【Color】", + "onPressed 为空时,点击时会退出当前界面。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart index c15715bc..973db918 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 32, -// "priority": 1, -// "name": "CloseButton点击事件", -// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" -// "【style】: 按钮样式 【ButtonStyle?】\n" -// "【color】: 颜色 【Color】\n" -// "onPressed 为空时,点击时会退出当前界面。", -// } + class CustomCloseButton extends StatelessWidget { const CustomCloseButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..0eb43117 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "关闭按钮图标", + "info": "一个关闭 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的关闭按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart index 50c0380f..c18bfd49 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 274, -// "priority": 1, -// "name": "CloseButtonIcon 效果", -// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的关闭按钮图标。", -// } + class CloseButtonIconDemo extends StatelessWidget { const CloseButtonIconDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json index ee325d64..cb27642a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_zh-CN.json @@ -5,7 +5,14 @@ "info": "用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...", "lever": 5, "family": 0, - "linkWidget": [74,85,80,78,70,123], + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], "nodes": [ { "file": "node1_base.dart", @@ -13,7 +20,7 @@ "desc": [ "【width】 : 宽 【int】", "【height】: 高 【int】", - "【color】: 颜色 【Color】" + "【color】: 颜色 【Color】" ] }, { @@ -24,7 +31,37 @@ "【margin】: 外边距 【EdgeInsetsGeometry】", "【child】: 子组件 【Widget】" ] + }, + { + "file": "node3_alignment.dart", + "name": "可对子组件进行对齐定位", + "desc": [ + "【alignment】 : 对齐定位 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "可对子组件进行装饰", + "desc": [ + "【decoration】 : 装饰 【Decoration】", + "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container还具有变换性", + "desc": [ + "【transform】 : 变换矩阵 【Matrix4】", + "基于Matrix4的矩阵变换,变换详情见线性代数" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container的约束性", + "desc": [ + "【constraints】 : 约束 【BoxConstraints】", + "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。" + ] } ] -} - +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart index 9caa7552..b4cb2c7f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可用于显示一个指定宽高的区域', -// "priority": 1, -// "subtitle": "【width】 : 宽 【int】\n" -// "【height】: 高 【int】\n" -// "【color】: 颜色 【Color】", -// } + class CustomContainer extends StatelessWidget { const CustomContainer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart index 1c77f689..592513f3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node2_child.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可以在区域中放入一个子组件', -// "priority": 2, -// "subtitle": "【padding】 : 内边距 【EdgeInsetsGeometry】\n" -// "【margin】: 外边距 【EdgeInsetsGeometry】\n" -// "【child】: 子组件 【Widget】", -// } + class ContainerWithChild extends StatelessWidget { const ContainerWithChild({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart index af324e07..069ed3c8 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node3_alignment.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可对子组件进行对齐定位', -// "priority": 3, -// "subtitle": "【alignment】 : 对齐定位 【AlignmentGeometry】", -// } + class ContainerAlignment extends StatelessWidget { const ContainerAlignment({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart index 96e94caa..0ed77fdb 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": '可对子组件进行装饰', -// "priority": 4, -// "subtitle": -// "【decoration】 : 装饰 【Decoration】\n " -// "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容", -// } + class ContainerDecoration extends StatelessWidget { ContainerDecoration({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart index a37e2189..f2598d30 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node5_transform.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": 'Container还具有变换性', -// "priority": 5, -// "subtitle": "【transform】 : 变换矩阵 【Matrix4】\n " -// "基于Matrix4的矩阵变换,变换详情见线性代数", -// } + class ContainerTransform extends StatelessWidget { const ContainerTransform({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart index 3371138f..c67937c1 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node6_constraints.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 1, -// "name": 'Container的约束性', -// "priority": 6, -// "subtitle": -// "【constraints】 : 约束 【BoxConstraints】\n " -// "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。", -// } + class ContainerConstraints extends StatelessWidget { const ContainerConstraints({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json new file mode 100644 index 00000000..c716d299 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS行为单", + "info": "iOS风格的弹出选择结构,可放多的按钮,一般与CupertinoActionSheetAction联用。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheet基本使用", + "desc": [ + "【title】 : 第一行组件 【Widget】", + "【message】 : 第二行组件 【Widget】", + "【cancelButton】 : 取消按钮处组件 【Widget】", + "【actions】 : 中间组件列表 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart index 89f27834..e7c1c58f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/node1_base.dart @@ -3,16 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 131, -// "name": 'CupertinoActionSheet基本使用', -// "priority": 1, -// "subtitle": "【title】 : 第一行组件 【Widget】\n" -// "【message】 : 第二行组件 【Widget】\n" -// "【cancelButton】 : 取消按钮处组件 【Widget】\n" -// "【actions】 : 中间组件列表 【List】", -// } + class CustomCupertinoActionSheet extends StatelessWidget { const CustomCupertinoActionSheet({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json new file mode 100644 index 00000000..1cbe10e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS行为单按键", + "info": "一个按钮,应用场景很少,通常用于CupertinoActionSheet中,接收点击事件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart index 99003ba9..73053e52 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/node1_base.dart @@ -5,15 +5,7 @@ import 'package:widgets/utils/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 132, -// "name": 'CupertinoActionSheetAction基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + class CustomCupertinoActionSheetAction extends StatelessWidget { const CustomCupertinoActionSheetAction({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json new file mode 100644 index 00000000..8e576471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS对话框", + "info": "iOS风格的通用的对话框结构,可指定头、中、尾处的组件。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【isDefaultAction】 : 是否默认选中 【bool】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart index fbcc4be4..2c4a6fc6 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 129, -// "name": 'CupertinoActionSheetAction基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【isDefaultAction】 : 是否默认选中 【bool】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + class CustomCupertinoAlertDialog extends StatelessWidget { const CustomCupertinoAlertDialog({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json new file mode 100644 index 00000000..246eacf3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "交互视图", + "info": " 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogAction基本使用", + "desc": [ + "【isDefaultAction】 : 是否是默认性操作 【bool】", + "【isDestructiveAction】 : 是否是毁灭性操作 【bool】", + "【textStyle】: 文字样式 【TextStyle】", + "【onPressed】: 点击事件 【VoidCallback】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart index 679eeeca..2f6e6c1b 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/node1_base.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 352 CupertinoDialogAction 0 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。 -// { -// "widgetId": 352, -// "name": "CupertinoDialogAction基本使用", -// "priority": 1, -// "subtitle": "【isDefaultAction】 : 是否是默认性操作 【bool】\n" -// "【isDestructiveAction】 : 是否是毁灭性操作 【bool】\n" -// "【textStyle】: 文字样式 【TextStyle】\n" -// "【onPressed】: 点击事件 【VoidCallback】\n" -// "【child】: 子组件 【Widget】", -// } + class CupertinoDialogActionDemo extends StatelessWidget { const CupertinoDialogActionDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json new file mode 100644 index 00000000..ab421eed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "全页面过渡变换", + "info": "创建一个 iOS 风格的转换,用于唤出全屏对话框。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "组件介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "【linearTransition】 : 是否线性转换 【bool】", + "【primaryRouteAnimation】 : 初始路由动画 【Animation】", + "【secondaryRouteAnimation】 : 第二路由动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart index 8ff03dba..94a27961 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/11 /// contact me by email 1981462002@qq.com /// -/// 说明: 219 CupertinoFullscreenDialogTransition 0 全页面过渡变换 创建一个 iOS 风格的转换,用于唤出全屏对话框。link 216 -// { -// "widgetId": 219, -// "name": '组件介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【linearTransition】 : 是否线性转换 【bool】\n" -// "【primaryRouteAnimation】 : 初始路由动画 【Animation】\n" -// "【secondaryRouteAnimation】 : 第二路由动画 【Animation】", -// } + class CupertinoFullscreenDialogTransitionDemo extends StatelessWidget { const CupertinoFullscreenDialogTransitionDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json new file mode 100644 index 00000000..0312f63e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS风格返回按钮", + "info": "Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "返回按钮基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart index f87463ad..e9ae28f7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/node1_base.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 218 CupertinoNavigationBarBackButton Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。 -// { -// "widgetId": 218, -// "name": "返回按钮基本使用", -// "priority": 1, -// "subtitle": "【onPressed】 : 点击事件 【VoidCallback】\n" -// "【color】: 颜色 【Color】", -// } + class CupertinoNavigationBarBackButtonDemo extends StatelessWidget { const CupertinoNavigationBarBackButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json new file mode 100644 index 00000000..c2fbb0a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "页面过渡变换", + "info": "提供一个 iOS 风格的页面过渡动画变换。 ", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 介绍", + "desc": [ + "【child】 : 子组件 【Widget】", + "【linearTransition】 : 是否线性转换 【bool】", + "【primaryRouteAnimation】 : 初始路由动画 【Animation】", + "【secondaryRouteAnimation】 : 第二路由动画 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart index 69a5524f..d3b9c9ae 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/node1_base.dart @@ -3,16 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/11 /// contact me by email 1981462002@qq.com /// -/// 说明: 216 CupertinoPageTransition 0 风格的页面过渡动画变换 提供一个 iOS 风格的页面过渡动画。 link 219 -// { -// "widgetId": 216, -// "name": 'CupertinoPageTransition 介绍', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【linearTransition】 : 是否线性转换 【bool】\n" -// "【primaryRouteAnimation】 : 初始路由动画 【Animation】\n" -// "【secondaryRouteAnimation】 : 第二路由动画 【Animation】", -// } + class CupertinoPageTransitionDemo extends StatelessWidget { const CupertinoPageTransitionDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json new file mode 100644 index 00000000..10e0dc73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "模糊弹出层", + "info": "ios 弹出框的圆角矩形模糊背景,源码中应用于 Cupertino 风格的对话框中。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface 使用", + "desc": [ + "【isSurfacePainted】 : 是否绘白 【bool】", + "【child】 : 子组件 【Widget】", + "测试效果左侧 isSurfacePainted = false,右侧 isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart index 0b4b281a..99d0f84a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart @@ -3,17 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 217 CupertinoPopupSurface 模糊弹出层 -/// ios 弹出框的圆角矩形模糊背景,源码中应用于 Cupertino 风格的对话框中。 -/// -// { -// "widgetId": 217, -// "name": 'CupertinoPopupSurface 使用', -// "priority": 1, -// "subtitle": "【isSurfacePainted】 : 是否绘白 【bool】\n" -// "【child】 : 子组件 【Widget】\n" -// "测试效果左侧 isSurfacePainted = false,右侧 isSurfacePainted = true", -// } + class CupertinoPopupSurfaceDemo extends StatelessWidget { CupertinoPopupSurfaceDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json new file mode 100644 index 00000000..91756245 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS主题", + "info": "可通过CupertinoTheme.of获取CupertinoThemeData对象。也可以指定主题应用于CupertinoTheme的后代组件。", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "文字样式-TextTheme", + "desc": [ + "后代组件可以通过CupertinoTheme.of获取主题的数据进行使用。" + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeData的使用", + "desc": [ + "和Theme一样可以通过指定的属性,让它们在后代中共享,不过属性较少。注意如果需要使用主题,不能在当前的context中获取。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart index b1334981..64ccfd50 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node1_base.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 169, -// "name": '文字样式-TextTheme', -// "priority": 1, -// "subtitle": "后代组件可以通过CupertinoTheme.of获取主题的数据进行使用。", -// } + class TextCupertinoTheme extends StatelessWidget { const TextCupertinoTheme({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart index 2a336d2a..61cad7ac 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/node2_use.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 169, -// "name": 'CupertinoThemeData的使用', -// "priority": 2, -// "subtitle": -// "和Theme一样可以通过指定的属性,让它们在后代中共享,不过属性较少。注意如果需要使用主题,不能在当前的context中获取。", -// } + class CustomCupertinoTheme extends StatelessWidget { const CustomCupertinoTheme({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json new file mode 100644 index 00000000..be8ceb7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "数据表格", + "info": "一个表格组件,可以制订逻辑进行点击、修改、排序等操作。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTable基本使用", + "desc": [ + "【columns】 : 列 【List】", + "【rows】 : 行 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTable的sort", + "desc": [ + "【sortColumnIndex】 : 列号 【int】", + "【columnSpacing】 : 列间距 【double】", + "【sortAscending】 : 是否顺序 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart index 24f11f7a..b47cb2a4 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 102, -// "name": 'DataTable基本使用', -// "priority": 1, -// "subtitle": -// "【columns】 : 列 【List】\n" -// "【rows】 : 行 【List】", -// } + class _Bean { final int id; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart index b9fa4944..5895e621 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node2_operation.dart @@ -2,17 +2,7 @@ /// create by 张风捷特烈 on 2020/4/25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 102, -// "name": 'DataTable的sort', -// "priority": 2, -// "subtitle": -// "【sortColumnIndex】 : 列号 【int】\n" -// "【columnSpacing】 : 列间距 【double】\n" -// "【sortAscending】 : 是否顺序 【bool】", -// } import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json new file mode 100644 index 00000000..be05cf4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_zh-CN.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "日期选择器", + "info": "日期的选择组件,可指定当前日期、选中日期、展示月份等,接收日期选中事件。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPicker基本使用", + "desc": [ + "【selectedDate】 : 选中日期 【DateTime】", + "【currentDate】 : 当前日期 【DateTime】", + "【firstDate】 : 最前日期限制 【DateTime】", + "【lastDate】 : 最后日期限制 【DateTime】", + "【displayedMonth】 : 当前展示的月份 【DateTime】", + "【onChanged】 : 点击回调 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 日期选择器于 Flutter3.0 退出历史舞台。取代者为 CalendarDatePicker 日历选择器。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart index 5fc12937..9938f603 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/node1_base.dart @@ -2,22 +2,10 @@ /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 134, -// "name": 'DayPicker基本使用', -// "priority": 1, -// "subtitle": -// "【selectedDate】 : 选中日期 【DateTime】\n" -// "【currentDate】 : 当前日期 【DateTime】\n" -// "【firstDate】 : 最前日期限制 【DateTime】\n" -// "【lastDate】 : 最后日期限制 【DateTime】\n" -// "【displayedMonth】 : 当前展示的月份 【DateTime】\n" -// "【onChanged】 : 点击回调 【Function(DateTime)】", -// } + import 'package:flutter/material.dart'; -class CustomDayPicker extends StatelessWidget{ +class CustomDayPicker extends StatelessWidget { const CustomDayPicker({Key? key}) : super(key: key); @@ -33,21 +21,4 @@ class CustomDayPicker extends StatelessWidget{ child: Text(info), ); } - - // final DateTime _date = DateTime.now(); - // - // @override - // Widget build(BuildContext context) { - // return SizedBox( - // height: 350, - // child: DayPicker( - // selectedDate: _date, - // currentDate: DateTime.now(), - // onChanged: (date)=> setState(() => _date = date), - // firstDate: DateTime(2018), - // lastDate: DateTime(2030), - // displayedMonth: DateTime.now() - // ), - // ); - // } -} +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json new file mode 100644 index 00000000..b12763d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "对话框", + "info": "最简易的对话框面板,包含一个内容组件,可指定影深、背景色、形状等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog基本使用", + "desc": [ + "【child】 : 动画图标数据 【Widget】", + "【elevation】 : 影深 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart index e5af212c..59d39bd6 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/node1_base.dart @@ -1,18 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 126, -// "name": 'Dialog基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 动画图标数据 【Widget】\n" -// "【elevation】 : 影深 【double】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } + class CustomDialog extends StatelessWidget { const CustomDialog({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json new file mode 100644 index 00000000..1c292685 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "水平分割线", + "info": "水平分割线,可指定颜色、高度、粗细、左右边距信息,常用与列表的item分割线。", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider颜色和粗细", + "desc": [ + "【color】: 颜色 【Color】", + "【thickness】: 线粗细 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider高度和空缺", + "desc": [ + "【indent】: 前面空缺长度 【double】", + "【endIndent】: 后面空缺长度 【double】", + "【height】: 占位高 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart index 952f021b..c17f923f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 34, -// "priority": 1, -// "name": "Divider颜色和粗细", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【thickness】: 线粗细 【double】", -// } + class CustomDivider extends StatelessWidget { const CustomDivider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart index 1064d09b..5c4a8531 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/node2_height.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 34, -// "priority": 2, -// "name": "Divider高度和空缺", -// "subtitle": "【indent】: 前面空缺长度 【double】\n" -// "【endIndent】: 后面空缺长度 【double】\n" -// "【height】: 占位高 【double】", -// } + class HeightDivider extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json new file mode 100644 index 00000000..77c96c87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "拖滑重置器", + "info": "它可以通知后代的 DraggableScrollableSheet,将其位置重置为初始状态。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用方法", + "desc": [ + "【child】 : 子组件 【Widget】", + "使用 DraggableScrollableActuator.reset(context) 重置后代 DraggableScrollableSheet 位初始位置。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart index abc8a027..16f72005 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 221 DraggableScrollableActuator 拖滑重置器 它可以通知后代的 DraggableScrollableSheet,将其位置重置为初始状态。 -// { -// "widgetId": 221, -// "name": '基本使用方法', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "使用 DraggableScrollableActuator.reset(context) 重置后代 DraggableScrollableSheet 位初始位置。", -// } + class DraggableScrollableActuatorDemo extends StatelessWidget { const DraggableScrollableActuatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json new file mode 100644 index 00000000..35284bfa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "滑页栏", + "info": "一般用于Scaffold中的draw和endDraw属性作为左右的滑页栏,可以容纳一个子组件,能指定影深。", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawer基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【elevation】 : 影深 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart index b57bc0de..9248e9a5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/node1_base.dart @@ -1,15 +1,7 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 154, -// "name": 'Drawer基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【elevation】 : 影深 【double】", -// } + import 'package:flutter/material.dart'; class CustomDrawer extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json new file mode 100644 index 00000000..6cf4fc4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "抽屉按钮", + "info": "一个左抽屉图标按钮, 使用 DrawerButtonIcon 展示图标,默认点击事件可以打开左抽屉。", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "onPressed 为空时,点击时会打开左抽屉。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart index 45699d5b..8803ccdb 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 276, -// "priority": 1, -// "name": "DrawerButton 基本使用", -// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" -// "【style】: 按钮样式 【ButtonStyle?】\n" -// "onPressed 为空时,点击时会打开左抽屉。", -// } + class DrawerButtonDemo extends StatelessWidget { const DrawerButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..1397b3c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "抽屉按钮图标", + "info": "一个抽屉 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的抽屉按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart index 3ad0c9da..a60b8b70 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 273, -// "priority": 1, -// "name": "DrawerButtonIcon 效果", -// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的抽屉按钮图标。", -// } + class DrawerButtonIconDemo extends StatelessWidget { const DrawerButtonIconDemo({super.key}); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json new file mode 100644 index 00000000..7ebf64d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "滑页栏标题", + "info": "一般用于Drawer中,作为滑页栏的头部。可以指定内外边距、装饰、子组件等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeader基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【decoration】 : 装饰 【Decoration】", + "【margin】 : 外边距 【EdgeInsetsGeometry】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart index 0b976fdb..76e761a9 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/node1_base.dart @@ -1,18 +1,7 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 155, -// "name": 'DrawerHeader基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【decoration】 : 装饰 【Decoration】\n" -// "【margin】 : 外边距 【EdgeInsetsGeometry】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } import 'package:flutter/material.dart'; class CustomDrawerHeader extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json new file mode 100644 index 00000000..6d40c8cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "右抽屉按钮", + "info": "一个右抽屉图标按钮, 使用 EndDrawerButtonIcon 展示图标,默认点击事件可以打开右抽屉。", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 基本使用", + "desc": [ + "【onPressed】 : 点击事件 【VoidCallback?】", + "【style】: 按钮样式 【ButtonStyle?】", + "onPressed 为空时,点击时会打开右抽屉。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart index e11381e2..bbce197e 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 361, -// "priority": 1, -// "name": "EndDrawerButton 基本使用", -// "subtitle": "【onPressed】 : 点击事件 【VoidCallback?】\n" -// "【style】: 按钮样式 【ButtonStyle?】\n" -// "onPressed 为空时,点击时会打开右抽屉。", -// } + class EndDrawerButtonDemo extends StatelessWidget { const EndDrawerButtonDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json new file mode 100644 index 00000000..07e601ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "右抽屉按钮图标", + "info": "一个右抽屉 Icon 图标, 根据平台展示对应的图标,可以通过 ActionIconTheme 定制主题。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 效果", + "desc": [ + "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的右抽屉按钮图标。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart index 75c9500f..a2957fcd 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2023/11/28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 275, -// "priority": 1, -// "name": "EndDrawerButtonIcon 效果", -// "subtitle": "通过 _ActionIcon 组件根据 ActionIconTheme 主题,来适配不同平台的右抽屉按钮图标。", -// } + class EndDrawerButtonIconDemo extends StatelessWidget { const EndDrawerButtonIconDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json new file mode 100644 index 00000000..4c4d01c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "淡入图片", + "info": "透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork加载网络图片", + "desc": [ + "【placeholder】 : 展位图地址 【String】", + "【image】 : 显示图地址 【String】", + "【width】: 宽 【double】", + "【height】: 高 【double】", + "【fadeInDuration】: 淡入时长 【Duration】", + "【fadeOutDuration】: 淡出时长 【Duration】", + "【fadeInCurve】: 淡入曲线 【Cubic】", + "【fadeOutCurve】: 淡出曲线 【Cubic】", + "【fit】: 适应模式 【BoxFit】", + "【alignment】: 对齐模式 【Alignment】", + "【repeat】: 重复模式 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart index bd759cf2..0e6e88ac 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/node1_base.dart @@ -2,23 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 8, -// "priority": 1, -// "name": "FadeInImage.assetNetwork加载网络图片", -// "subtitle": "【placeholder】 : 展位图地址 【String】\n" -// "【image】 : 显示图地址 【String】\n" -// "【width】: 宽 【double】\n" -// "【height】: 高 【double】\n" -// "【fadeInDuration】: 淡入时长 【Duration】\n" -// "【fadeOutDuration】: 淡出时长 【Duration】\n" -// "【fadeInCurve】: 淡入曲线 【Cubic】\n" -// "【fadeOutCurve】: 淡出曲线 【Cubic】\n" -// "【fit】: 适应模式 【BoxFit】\n" -// "【alignment】: 对齐模式 【Alignment】\n" -// "【repeat】: 重复模式 【ImageRepeat】\n", -// } + class CustomFadeInImage extends StatelessWidget { const CustomFadeInImage({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json new file mode 100644 index 00000000..3c4aaf75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "过滤小条", + "info": "和Chip组件类似的样式,具有选中与否的属性和选中事件。当选中时左侧组件上层会被✔️遮罩。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip可接受选择事件", + "desc": [ + "【selected】: 是否选择 【bool】", + "【onSelected】: 选择事件 【Function(bool)】", + "【selectedColor】: 选择后的颜色 【Color】", + "【selectedShadowColor】: 选择后的阴影颜色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart index f4db385a..276c893a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart @@ -1,15 +1,6 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 15, -// "priority": 1, -// "name": "FilterChip可接受选择事件", -// "subtitle": "【selected】: 是否选择 【bool】\n" -// "【onSelected】: 选择事件 【Function(bool)】\n" -// "【selectedColor】: 选择后的颜色 【Color】\n" -// "【selectedShadowColor】: 选择后的阴影颜色 【Color】\n", -// } + import 'package:flutter/material.dart'; class CustomFilterChip extends StatefulWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json new file mode 100644 index 00000000..acf03901 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_zh-CN.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "平按钮", + "info": "无阴影的平按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart index 856b6cf1..096d961d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/node1_base.dart @@ -1,19 +1,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 25, -// "priority": 1, -// "name": "FlatButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } class CustomFlatButton extends StatelessWidget { const CustomFlatButton({Key? key}) : super(key: key); @@ -30,17 +17,4 @@ class CustomFlatButton extends StatelessWidget { child: Text(info), ); } - -// @override -// Widget build(BuildContext context) { -// return FlatButton( -// onPressed: ()=>{}, -// padding: const EdgeInsets.all(8), -// splashColor: Colors.green, -// child: const Text("FlatButton"), -// textColor: const Color(0xffFfffff), -// color: Colors.blue, -// highlightColor: const Color(0xffF88B0A), -// ); -// } } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json new file mode 100644 index 00000000..71c3705e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "浮动按钮", + "info": "浮动按钮,一般用于Scaffold中,可摆放在特定位置。可盛放一个子组件,接收点击、可定义颜色、形状等。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton点击事件", + "desc": [ + "【child】: 子组件 【Widget】", + "【tooltip】: 长按时提示文字 【String】", + "【backgroundColor】: 背景色 【Color】", + "【foregroundColor】: 前景色 【Color】", + "【elevation】: 影深 【double】", + "【onPressed】: 点击事件 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini属性", + "desc": [ + "【mini】: 是否是迷你 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape属性", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart index 9a5e7b34..e55a4678 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node1_base.dart @@ -1,17 +1,6 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 1, -// "name": "FloatingActionButton点击事件", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【tooltip】: 长按时提示文字 【String】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【foregroundColor】: 前景色 【Color】\n" -// "【elevation】: 影深 【double】\n" -// "【onPressed】: 点击事件 【Function】", -// } + import 'package:flutter/material.dart'; class CustomFAB extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart index e6750998..0478fa29 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node2_mini.dart @@ -1,12 +1,6 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 2, -// "name": "mini属性", -// "subtitle": "【mini】: 是否是迷你 【bool】", -// } + import 'package:flutter/material.dart'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart index 276d6043..4aa0083c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/node3_shape.dart @@ -2,13 +2,7 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 28, -// "priority": 3, -// "name": "shape属性", -// "subtitle": "【shape】: 形状 【ShapeBorder】", -// } + import 'dart:math'; diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json new file mode 100644 index 00000000..10eea5bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter图标", + "info": "用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个FlutterLogo", + "desc": [ + "【size】 : 大小 【double】", + "【colors】: 颜色 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "样式用于显示文字", + "desc": [ + "【style】 : 样式-3种枚举 【FlutterLogoStyle】", + "【textColor】: 文字颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart index d45dad47..aa5bec8d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node1_base.dart @@ -2,14 +2,7 @@ /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 4, -// "priority": 1, -// "name": "用于显示一个FlutterLogo", -// "subtitle": "【size】 : 大小 【double】\n" -// "【colors】: 颜色 【MaterialColor】", -// } + import 'package:flutter/material.dart'; class CustomFlutterLogo extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart index 3e9f4197..ace614eb 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/node2_style.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 4, -// "priority": 2, -// "name": "样式用于显示文字", -// "subtitle": "【style】 : 样式-3种枚举 【FlutterLogoStyle】\n" -// "【textColor】: 文字颜色 【Color】", -// } + class FlutterLogoWithText extends StatelessWidget { const FlutterLogoWithText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json new file mode 100644 index 00000000..483a6bd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_zh-CN.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "手势监听器", + "info": "组件手势事件的检测器,可接受点击、长按、双击,按下、松开、移动等事件,并可以获取触点信息,居家旅行必备组件。", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onTap】 : 点击事件 【Function()】", + "【onDoubleTap】 : 双击事件 【GestureTapCallback】", + "【onLongPress】 : 长按事件 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector详情信息", + "desc": [ + "【onTapDown】 : 按下回调 【GestureTapDownCallback】", + "【onTapUp】 : 点击抬起回调 【GestureTapUpCallback】", + "【onTapCancel】 : 点击取消 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetector的Pan事件", + "desc": [ + "【onPanDown】 : 按下回调 【GestureDragDownCallback】", + "【onPanEnd】 : 拖动结束 【GestureDragEndCallback】", + "【onPanStart】 : 开始拖动 【GestureDragStartCallback】", + "【onPanUpdate】 : 拖动更新 【GestureDragUpdateCallback】", + "【onPanCancel】 : 拖动取消 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart index 697fdca8..b9f20e61 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -/// create by 张风捷特烈 on 2020-03-25 -/// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 146, -// "name": 'GestureDetector基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onTap】 : 点击事件 【Function()】\n" -// "【onDoubleTap】 : 双击事件 【GestureTapCallback】\n" -// "【onLongPress】 : 长按事件 【GestureLongPressCallback】", -// } class CustomGestureDetector extends StatefulWidget { const CustomGestureDetector({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart index 63522f2d..c9d42241 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node2_tap.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 146, -// "name": 'GestureDetector详情信息', -// "priority": 2, -// "subtitle": -// "【onTapDown】 : 按下回调 【GestureTapDownCallback】\n" -// "【onTapUp】 : 点击抬起回调 【GestureTapUpCallback】\n" -// "【onTapCancel】 : 点击取消 【GestureTapCancelCallback】", -// } class TapGestureDetector extends StatefulWidget { const TapGestureDetector({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart index 18a05900..34558bb3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/node3_pan.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 146, -// "name": 'GestureDetector的Pan事件', -// "priority": 3, -// "subtitle": -// "【onPanDown】 : 按下回调 【GestureDragDownCallback】\n" -// "【onPanEnd】 : 拖动结束 【GestureDragEndCallback】\n" -// "【onPanStart】 : 开始拖动 【GestureDragStartCallback】\n" -// "【onPanUpdate】 : 拖动更新 【GestureDragUpdateCallback】\n" -// "【onPanCancel】 : 拖动取消 【GestureDragCancelCallback】", -// } class PanGestureDetector extends StatefulWidget { const PanGestureDetector({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json new file mode 100644 index 00000000..154fe340 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_zh-CN.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "网格线组件", + "info": "可容纳一个组件,在其上绘制网格。可指定颜色、线宽、间距等属性。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 基础属性", + "desc": [ + "【child】: 子组件 【Widget】", + "【color】: 颜色 【Color】", + "【interval】: 小块边长 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 再分割", + "desc": [ + "【child】: 子组件 【Widget】", + "【color】: 颜色 【Color】", + "【subdivisions】: 小块中子块个数 【int】", + "【divisions】: 小块中子块的分割数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart index 71e8bf69..173bc587 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node1_base.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 37, -// "priority": 1, -// "name": "GridPager 基础属性", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【color】: 颜色 【Color】\n" -// "【interval】: 小块边长 【double】", -// } class CustomGridPaper extends StatelessWidget { const CustomGridPaper({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart index 895ebbc5..3c7ee007 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/node2_divisions.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 37, -// "priority": 2, -// "name": "GridPager 再分割", -// "subtitle": "【child】: 子组件 【Widget】\n" -// "【color】: 颜色 【Color】\n" -// "【subdivisions】: 小块中子块个数 【int】\n" -// "【divisions】: 小块中子块的分割数 【int】", -// } + class DivisionsGridPaper extends StatelessWidget { const DivisionsGridPaper({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json new file mode 100644 index 00000000..b55b947b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "网格瓦片", + "info": "Flutter提供的一个通用列表条目结构,可指定头、尾、子组件,常用于网格列表。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTile的基本表现如下", + "desc": [ + "【header】: 头组件 【Widget】", + "【child】: 子组件 【Widget】", + "【footer】: 脚组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart index 80d58f8a..3d9e7e26 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 21, -// "priority": 1, -// "name": "GridTile的基本表现如下", -// "subtitle": "【header】: 头组件 【Widget】\n" -// "【child】: 子组件 【Widget】\n" -// "【footer】: 脚组件 【Widget】", -// } class CustomGridTile extends StatelessWidget { const CustomGridTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json new file mode 100644 index 00000000..799a543b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "网格瓦片头", + "info": "Flutter提供的一个通用头结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目,相比ListTile而言,属性较少。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBar的基本表现如下", + "desc": [ + "【leading】: 左侧组件 【Widget】", + "【trailing】: 尾组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【backgroundColor】: 背景色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart index 62c394dd..b5960402 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 20, -// "priority": 1, -// "name": "GridTileBar的基本表现如下", -// "subtitle": "【leading】: 左侧组件 【Widget】\n" -// "【trailing】: 尾组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【backgroundColor】: 背景色 【Color】", -// } class CustomGridTileBar extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json new file mode 100644 index 00000000..226589b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_zh-CN.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "网格组件", + "info": "容纳多个组件,并以网格的方式。可以通过count、extent、custom、builder等构造。有内边距、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count构造", + "desc": [ + "【children】 : 子组件列表 【List】", + "【crossAxisCount】 : 主轴一行box数量 【int】", + "【mainAxisSpacing】 : 主轴每行间距 【double】", + "【crossAxisSpacing】 : 交叉轴每行间距 【double】", + "【childAspectRatio】 : box主长/交叉轴长 【double】", + "【crossAxisCount】 : 主轴一行数量 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder构造", + "desc": [ + "【itemCount】 : 条目数量 【int】", + "【gridDelegate】 : 网格代理 【SliverGridDelegate】", + "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart similarity index 100% rename from modules/widget_system/widgets/lib/StatelessWidget/GirdView/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart similarity index 100% rename from modules/widget_system/widgets/lib/StatelessWidget/GirdView/node2_direction.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node3_extend.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart similarity index 90% rename from modules/widget_system/widgets/lib/StatelessWidget/GirdView/node3_extend.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart index a7da1abc..790515d0 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node3_extend.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart @@ -6,10 +6,10 @@ import 'package:flutter/material.dart'; // { // "widgetId": 163, -// "name": 'GridView.extent构造', -// "priority": 3, +// "name": 'GridView滑动方向', +// "priority": 2, // "subtitle": -// "【maxCrossAxisExtent】 : box轴向长度 【double】\n" +// "【scrollDirection】 : 滑动方向 【Axis】\n" // "【reverse】 : 是否反向滑动 【bool】\n" // "【shrinkWrap】 : 无边界时是否包裹 【bool】", // } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GirdView/node4_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart similarity index 100% rename from modules/widget_system/widgets/lib/StatelessWidget/GirdView/node4_builder.dart rename to modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json new file mode 100644 index 00000000..899721db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html 元素视图", + "info": "在 Flutter Web 的 Widget 层次结构中嵌入一个 HTML 元素。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 介绍", + "desc": [ + "【child】 : 子组件 【child】", + "【viewType】 : html元素唯一表识 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart index a3960a62..edbf1324 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/node1_base.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/11 /// contact me by email 1981462002@qq.com /// -/// 说明: 213 HtmlElementView 0 在 Flutter Web 的 Widget 层次结构中嵌入一个 HTML 元素。 -// { -// "widgetId": 213, -// "name": 'HtmlElementView 介绍', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【child】\n" -// "【viewType】 : html元素唯一表识 【String】", -// } + class HtmlElementViewDemo extends StatelessWidget { const HtmlElementViewDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json new file mode 100644 index 00000000..6b2847df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "图标组件", + "info": "用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但是非常用", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个图标", + "desc": [ + "【入参】 :图标数据 【IconData】", + "【size】 : 大小 【double】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "使用自定义图标", + "desc": [ + "可在iconfont网站中下载图标字体进行使用" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart index 522ecbf7..4a27ebe7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node1_base.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 6, -// "priority": 1, -// "name": "用于显示一个图标", -// "subtitle": "【入参】 :图标数据 【IconData】\n" -// "【size】 : 大小 【double】\n" -// "【color】: 颜色 【Color】", -// } class CustomIcon extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart index 30d3bf96..0bbffd9c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/node2_diy.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 6, -// "priority": 2, -// "name": "使用自定义图标", -// "subtitle": "可在iconfont网站中下载图标字体进行使用", -// } class MyIcon extends StatelessWidget { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json new file mode 100644 index 00000000..b8e6bf4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "图标按钮", + "info": "可点击的图标按钮,可指定图标信息、内边距、大小、颜色等,接收点击事件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton属性", + "desc": [ + "【icon】: 图标组件 【Widget】", + "【tooltip】: 长按提示文字 【String】", + "【highlightColor】: 长按高亮色 【Color】", + "【splashColor】: 水波纹色 【Color】", + "【onPressed】: 点击事件 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart index 12bdf2e5..a3fff848 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/node1_base.dart @@ -1,17 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 30, -// "priority": 1, -// "name": "IconButton属性", -// "subtitle": "【icon】: 图标组件 【Widget】\n" -// "【tooltip】: 长按提示文字 【String】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【splashColor】: 水波纹色 【Color】\n" -// "【onPressed】: 点击事件 【Function】", -// } + class CustomIconButton extends StatelessWidget { const CustomIconButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json new file mode 100644 index 00000000..f86199f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "容器", + "info": "用于将一个图片变为纯色的组件。可指定大小、颜色。", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "用于显示一个纯色图片", + "desc": [ + "【入参】 : 图片资源 【ImageProvider】", + "【size】 : 大小 【double】", + "【color】: 角标颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart index 36f24f6a..c687766c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 7, -// "priority": 1, -// "name": "用于显示一个纯色图片", -// "subtitle": "【入参】 : 图片资源 【ImageProvider】\n" -// "【size】 : 大小 【double】\n" -// "【color】: 角标颜色 【Color】", -// } + class CustomImageIcon extends StatelessWidget { const CustomImageIcon({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json new file mode 100644 index 00000000..9d99ecd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "综合小条", + "info": "和Chip组件类似的样式,集成了点击、删除、选择事件为一体。注意:点击事件和选择事件不能同时存在。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可以接受点击、删除事件", + "desc": [ + "【onPressed】: 点击事件 【Function()】", + "【onDeleted】: 删除事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "可以接受选中事件", + "desc": [ + "【selected】: 是否选中 【bool】", + "【onSelected】: 选中事件 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart index 441d9bc3..3d1161be 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 14, -// "priority": 1, -// "name": "可以接受点击、删除事件", -// "subtitle": "【onPressed】: 点击事件 【Function()】\n" -// "【onDeleted】: 删除事件 【Function()】", -// } + class PressInputChip extends StatefulWidget { const PressInputChip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart index 4b659cf1..f19dcb12 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/node2_select.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 14, -// "priority": 2, -// "name": "可以接受选中事件", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【onSelected】: 选中事件 【Function(bool)】", -// } + class SelectInputChip extends StatefulWidget { const SelectInputChip({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json new file mode 100644 index 00000000..aee1c845 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_zh-CN.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "列表瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTile的基本表现如下", + "desc": [ + "【leading】: 左侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【trailing】: 尾组件 【Widget】", + "【contentPadding】: 内边距 【EdgeInsetsGeometry】", + "【onLongPress】: 点击事件 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile选中效果和长按事件", + "desc": [ + "【selected】: 是否选中 【bool】", + "【onTap】: 点击事件 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart index 4ee09902..7e7f533d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 16, -// "priority": 1, -// "name": "ListTile的基本表现如下", -// "subtitle": "【leading】: 左侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【trailing】: 尾组件 【Widget】\n" -// "【contentPadding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onLongPress】: 点击事件 【Function()】", -// } class CustomListTile extends StatelessWidget { const CustomListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart index b45d37c2..5262e161 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node2_select.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 16, -// "priority": 2, -// "name": "ListTile选中效果和长按事件", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【onTap】: 点击事件 【Function()】", -// } class SelectListTile extends StatefulWidget { const SelectListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart index a176f586..347c420d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/node3_dense.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 16, -// "priority": 3, -// "name": "ListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } class DenseListTile extends StatefulWidget { const DenseListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json new file mode 100644 index 00000000..c3e9400b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_zh-CN.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "列表组件", + "info": "列表显示的领军人物,容纳多个子组件,可以通过builder、separated、custom等构造。有内边距、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView基本使用", + "desc": [ + "【children】 : 子组件列表 【List】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListView横向滑动", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向滑动 【bool】", + "【shrinkWrap】 : 无边界时是否包裹 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder构造", + "desc": [ + "【itemCount】 : 条目个数 【int】", + "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated构造", + "desc": [ + "【separatorBuilder】 : 条目构造器 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart index 45afd5a6..0ee51dd5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView基本使用', -// "priority": 1, -// "subtitle": -// "【children】 : 子组件列表 【List】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } + class CustomListView extends StatelessWidget { CustomListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart index 081ded31..1cb99c62 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView横向滑动', -// "priority": 2, -// "subtitle": -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向滑动 【bool】\n" -// "【shrinkWrap】 : 无边界时是否包裹 【bool】", -// } class HorizontalListView extends StatelessWidget { HorizontalListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart index d951c4d8..c7747bb3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView.builder构造', -// "priority": 3, -// "subtitle": -// "【itemCount】 : 条目个数 【int】\n" -// "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】", -// } class BuilderListView extends StatelessWidget { BuilderListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart index 4105d108..9da13bb7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 162, -// "name": 'ListView.separated构造', -// "priority": 3, -// "subtitle": -// "【separatorBuilder】 : 条目构造器 【IndexedWidgetBuilder】", -// } class SeparatedListView extends StatelessWidget { SeparatedListView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json new file mode 100644 index 00000000..8053c35a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "事件监听器", + "info": "组件事件的监听器,可接受按下、松开、移动、取消等事件。较GestureDetector比较原始,可获取的信息也更多。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener基本事件", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onPointerDown】 : 按下事件 【Function(PointerDownEvent)】", + "【onPointerMove】 : 移动事件 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 抬起事件 【Function(PointerUpEvent)】", + "【onPointerCancel】 : 取消事件 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart index 894cc42e..f302a3eb 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/node1_base.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 147, -// "name": 'Listener基本事件', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【onPointerDown】 : 按下事件 【Function(PointerDownEvent)】\n" -// "【onPointerMove】 : 移动事件 【Function(PointerMoveEvent)】\n" -// "【onPointerMove】 : 抬起事件 【Function(PointerUpEvent)】\n" -// "【onPointerCancel】 : 取消事件 【Function(PointerUpEvent)】", -// } class CustomListener extends StatefulWidget { const CustomListener({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json new file mode 100644 index 00000000..d4af77e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "横幅组件", + "info": "Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner一行的使用", + "desc": [ + "【content】 : 中间组件 【Widget】", + "【leading】: 左侧组件 【Widget】", + "【actions】: 右侧组件列表 【List】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【forceActionsBelow】: 是否按钮在下方 【bool】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner两行的使用", + "desc": [ + "【contentTextStyle】: 中间位置样式 【TextStyle】", + "【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】", + "当尾部组件数量大于1,该组件结构为左中下。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart index 236ac64f..9d122366 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node1_one_btn.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: 211 MaterialBanner Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等。 -// { -// "widgetId": 211, -// "name": 'MaterialBanner一行的使用', -// "priority": 1, -// "subtitle": "【content】 : 中间组件 【Widget】\n" -// "【leading】: 左侧组件 【Widget】\n" -// "【actions】: 右侧组件列表 【List】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【forceActionsBelow】: 是否按钮在下方 【bool】\n" -// "【backgroundColor】: 背景色 【Color】", -// } class MaterialBannerDemo extends StatelessWidget { const MaterialBannerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart index 7f3c18e7..d2fe347e 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/node2_two_btn.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 211, -// "name": 'MaterialBanner两行的使用', -// "priority": 2, -// "subtitle": "【contentTextStyle】: 中间位置样式 【TextStyle】\n" -// "【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】\n" -// "当尾部组件数量大于1,该组件结构为左中下。", -// } + class MaterialBannerDemoTwo extends StatelessWidget { const MaterialBannerDemoTwo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json new file mode 100644 index 00000000..649b27fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_zh-CN.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "材料按钮", + "info": "基于RawMaterialButton实现的通用Material按钮。可盛放一个子组件,能定义颜色、形状等表现,可接收点击和长按事件。", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【height】: 高 【double】", + "【elevation】: 影深 【double】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton长按事件", + "desc": [ + "【highlightColor】: 长按高亮色 【Color】", + "【onLongPress】: 长按事件 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton的自定义形状", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart index ad46dc97..19fa2123 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart @@ -2,22 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 23, -// "priority": 1, -// "name": "MaterialButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【height】: 高 【double】\n" -// "【elevation】: 影深 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } class CustomMaterialButton extends StatelessWidget { const CustomMaterialButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart index fba95a72..34fda962 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 23, -// "priority": 2, -// "name": "MaterialButton长按事件", -// "subtitle": "【highlightColor】: 长按高亮色 【Color】\n" -// "【onLongPress】: 长按事件 【Function】", -// } class LongPressMaterialButton extends StatelessWidget { const LongPressMaterialButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart index 9ab3246c..5e497291 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node3_shape.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 23, -// "priority": 3, -// "name": "MaterialButton的自定义形状", -// "subtitle": "【shape】: 形状 【ShapeBorder】", -// } class ShapeMaterialButton extends StatelessWidget { const ShapeMaterialButton({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json new file mode 100644 index 00000000..1cd6dd28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "屏障模", + "info": "相当于一块幕布层,防止用户与其背后的 Widget 交互,可以通过 dismissible 决定点击时,是否触发返回栈。源码中用于 Dialog 相关组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 介绍", + "desc": [ + "【dismissible】 : 点击是否返回 【bool】", + "【color】 : 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart index bdabc296..449fd8ef 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-01 /// contact me by email 1981462002@qq.com -/// 说明: 212 ModalBarrier 屏障模 -/// 相当于一块幕布,防止用户与其背后的 Widget 交互,可以通过 dismissible 决定点击时,是否触发返回栈。源码中用于 Dialog 相关组件。 -/// link: 227,126,127,128 -// { -// "widgetId": 212, -// "name": 'ModalBarrier 介绍', -// "priority": 1, -// "subtitle": -// "【dismissible】 : 点击是否返回 【bool】\n" -// "【color】 : 颜色 【Color】", -// } + class ModalBarrierDemo extends StatelessWidget { const ModalBarrierDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json new file mode 100644 index 00000000..0fea6ef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "导航工具条", + "info": "左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbar基本使用", + "desc": [ + "【leading】 : 左侧组件 【Widget】", + "【middle】: 中间组件 【Widget】", + "【trailing】: 右侧组件组件 【Widget】", + "【centerMiddle】: 中间组件是否居中 【bool】", + "【middleSpacing】: 中间组件距左距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart index 7789c819..37e89d96 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/20 /// contact me by email 1981462002@qq.com -/// 说明: NavigationToolbar 214 左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。 -// { -// "widgetId": 214, -// "name": 'NavigationToolbar基本使用', -// "priority": 1, -// "subtitle": "【leading】 : 左侧组件 【Widget】\n" -// "【middle】: 中间组件 【Widget】\n" -// "【trailing】: 右侧组件组件 【Widget】\n" -// "【centerMiddle】: 中间组件是否居中 【bool】\n" -// "【middleSpacing】: 中间组件距左距离 【double】", -// } + class NavigationToolbarDemo extends StatelessWidget { const NavigationToolbarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json new file mode 100644 index 00000000..e659e451 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "通知监听器", + "info": "可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "监听OverscrollIndicatorNotification", + "desc": [ + "该通知之后在滑动到最顶和最底是回调,通过leading属性判断是顶部还是底部。另外通过notification#disallowGlow(),可以去除顶底滑动蓝色阴影" + ] + }, + { + "file": "node2_update.dart", + "name": "监听ScrollUpdateNotification", + "desc": [ + "在滑动过程中对滑动数据进行回调,你可以获取大量数据来进行操作。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart index 4231b996..ed6f9456 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node1_base.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/14 /// contact me by email 1981462002@qq.com -/// 说明: NotificationListener 220 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 -// { -// "widgetId": 220, -// "name": "监听OverscrollIndicatorNotification", -// "priority": 1, -// "subtitle": "该通知之后在滑动到最顶和最底是回调,通过leading属性判断是顶部还是底部。另外通过notification#disallowGlow(),可以去除顶底滑动蓝色阴影", -// } + class NotificationListenerDemo extends StatefulWidget { const NotificationListenerDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart index 990f803e..b7195b1d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/node2_update.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/14 /// contact me by email 1981462002@qq.com -/// 说明: NotificationListener 210 0 通知监听器 可指定Notification子泛型T,监听该类型的变化。Flutter内置很多滑动的Notification,当然你也可以自定义Notification进行监听。 -// { -// "widgetId": 220, -// "name": "监听ScrollUpdateNotification", -// "priority": 2, -// "subtitle": "在滑动过程中对滑动数据进行回调,你可以获取大量数据来进行操作。", -// } + class NotificationListenerUpdate extends StatefulWidget { const NotificationListenerUpdate({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json new file mode 100644 index 00000000..3a25ec69 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_zh-CN.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "方向构造器", + "info": "能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilder基本使用", + "desc": [ + "【builder】 : 方向组件构造器 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart index 22968e88..1f383a90 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com -/// 说明: 203 OrientationBuilder 能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。 -// { -// "widgetId": 203, -// "name": 'OrientationBuilder基本使用', -// "priority": 1, -// "subtitle": "【builder】 : 方向组件构造器 【OrientationWidgetBuilder】", -// } + class OrientationBuilderDemo extends StatefulWidget { const OrientationBuilderDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json new file mode 100644 index 00000000..ffaa5f47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_zh-CN.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "线框按钮", + "info": "边框样式按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton点击事件", + "desc": [ + "【textColor】: 子组件文字颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【highlightedBorderColor】: 高亮时框色 【Color】", + "【child】: 子组件 【Widget】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【borderSide】: 边线 【BorderSide】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton 按钮于 Flutter3.0 退出历史舞台。取代者为 OutlinedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(边线按钮", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart index bba68e82..3c8df034 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/node1_base.dart @@ -2,20 +2,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 27, -// "priority": 1, -// "name": "OutlineButton点击事件", -// "subtitle": "【textColor】: 子组件文字颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【highlightedBorderColor】: 高亮时框色 【Color】\n" -// "【child】: 子组件 【Widget】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【borderSide】: 边线 【BorderSide】\n" -// "【onPressed】: 点击事件 【Function】", -// } class CustomOutlineButton extends StatelessWidget { const CustomOutlineButton({Key? key}) : super(key: key); @@ -32,18 +18,4 @@ class CustomOutlineButton extends StatelessWidget { child: Text(info), ); } - - // @override - // Widget build(BuildContext context) { - // return OutlineButton(//边线按钮 - // onPressed: () {}, - // child: const Text("OutlineButton"), - // padding: const EdgeInsets.all(8), - // splashColor: Colors.green, - // highlightColor: Colors.orangeAccent, - // highlightedBorderColor: Colors.grey, - // textColor: const Color(0xff000000), - // borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2), - // ); - // } } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json new file mode 100644 index 00000000..f511ec00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_zh-CN.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "页面存储器", + "info": "可以将页面状态进行存储,在切页时可以保持状态。源码中在ScrollView、PageView、ExpansionTile等皆有应用。", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorage基本使用", + "desc": [ + "【bucket】 : 存储区 【PageStorageBucket】", + "【child】: 子组件 【Widget】", + "上面切换界面初始化组件时并不会将状态重置。如上CountWidget,子组件需要在初始化时从存储器中读取状态,在改变状态时将状态量写入存储器。另外,如果使用MaterialApp已经内置了PageStorage,不过你也可以创建PageStorage。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart index 2f62074c..5f7cf6a9 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/8/14 /// contact me by email 1981462002@qq.com -/// 说明: PageStorage 210 0 页面存储器 可以将页面状态进行存储,在切页时可以保持状态。源码中在ScrollView、PageView、ExpansionTile等皆有应用。 -// { -// "widgetId": 210, -// "name": "PageStorage基本使用", -// "priority": 1, -// "subtitle": "【bucket】 : 存储区 【PageStorageBucket】\n" -// "【child】: 子组件 【Widget】\n" -// "上面切换界面初始化组件时并不会将状态重置。如上CountWidget,子组件需要在初始化时从存储器中读取状态,在改变状态时将状态量写入存储器。另外,如果使用MaterialApp已经内置了PageStorage,不过你也可以创建PageStorage。", -// } + class PageStorageDemo extends StatefulWidget { const PageStorageDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json new file mode 100644 index 00000000..00869967 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "占位组件", + "info": "一个矩形和叉叉的占位组件,可指定颜色、线宽、宽高等属性。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder基础属性", + "desc": [ + "【color】: 颜色 【Color】", + "【strokeWidth】: 线粗 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder的fallback属性", + "desc": [ + "当所在区域无宽高约束时,占位组件的宽高。\"", + "【fallbackHeight】: 高 【double】", + "【fallbackWidth】: 宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart index c7f8f680..560a8a2e 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 36, -// "priority": 1, -// "name": "Placeholder基础属性", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【strokeWidth】: 线粗 【double】", -// } + class CustomPlaceholder extends StatelessWidget { const CustomPlaceholder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart index 63030673..680283b5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/node2_fallback.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 36, -// "priority": 2, -// "name": "Placeholder的fallback属性", -// "subtitle": " 当所在区域无宽高约束时,占位组件的宽高。" -// "【fallbackHeight】: 高 【double】\n" -// "【fallbackWidth】: 宽 【double】", -// } + class FallbackPlaceholder extends StatelessWidget { const FallbackPlaceholder({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json new file mode 100644 index 00000000..225dc999 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "方向定位", + "info": "和Positioned组件功能一样,属性名不同。只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional基本使用", + "desc": [ + "【child】 : 组件 【Widget】", + "【top】 : 到父顶距离 【double】", + "【end】 : 到父右距离 【double】", + "【start】 : 到父左距离 【double】", + "【bottom】 : 到父底距离 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart index 73ac81bd..d918c053 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 159, -// "name": 'PositionedDirectional基本使用', -// "priority": 1, -// "subtitle": "【child】 : 组件 【Widget】\n" -// "【top】 : 到父顶距离 【double】\n" -// "【end】 : 到父右距离 【double】\n" -// "【start】 : 到父左距离 【double】\n" -// "【bottom】 : 到父底距离 【double】", -// } class CustomPositionedDirectional extends StatelessWidget { const CustomPositionedDirectional({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json new file mode 100644 index 00000000..77ca7e11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "优先尺寸", + "info": "实现了PreferredSizeWidget接口,可容纳一个子组件,设置优先尺寸,不会对其子组件施加任何约束。", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize调整AppBar高度", + "desc": [ + "【preferredSize】 : 尺寸 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSize的转化使用", + "desc": [ + "【PreferredSize将普通组件转化为PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart index bad7a866..3879b6d3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node1_base.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 204, -// "name": 'PreferredSize调整AppBar高度', -// "priority": 1, -// "subtitle": "【preferredSize】 : 尺寸 【Size】", -// } + class CustomPreferredSize extends StatelessWidget { const CustomPreferredSize({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart index 1202bbf9..b68bf26c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/node2_adapter.dart @@ -2,13 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/5/3 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 204, -// "name": 'PreferredSize的转化使用', -// "priority": 2, -// "subtitle": "【PreferredSize将普通组件转化为PreferredSizeWidget", -// } + class AdapterPreferredSize extends StatelessWidget { const AdapterPreferredSize({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json new file mode 100644 index 00000000..81424424 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_zh-CN.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "选钮瓦片", + "info": "Flutter提供的一个通用列表条目结构,为中右结构,尾部是一个Radio。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile需要一个泛型T", + "desc": [ + "【value】 : 条目对象 【T】", + "【groupValue】 : 选中对象 【T】", + "【selected】: 是否选中 【bool】", + "【secondary】: 右侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【onChanged】: 切换事件 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile选中色和密排", + "desc": [ + "【activeColor】 : 选中时颜色 【Color】", + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart index 1ed6c0a5..9e32a0cf 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 19, -// "priority": 1, -// "name": "RadioListTile需要一个泛型T", -// "subtitle": "【value】 : 条目对象 【T】\n" -// "【groupValue】 : 选中对象 【T】\n" -// "【selected】: 是否选中 【bool】\n" -// "【secondary】: 右侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【onChanged】: 切换事件 【Function(T)】", -// } enum ItemType { java, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart index ddaa90f8..dcbd3e3c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/node2_dense.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 19, -// "priority": 2, -// "name": "RadioListTile选中色和密排", -// "subtitle": "【activeColor】 : 选中时颜色 【Color】\n" -// "【dense】: 是否密排 【bool】", -// } enum ItemType { java, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json new file mode 100644 index 00000000..e1cac5fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_zh-CN.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "浮起按钮", + "info": "有阴影的浮起按钮,基于MaterialButton实现,所有属性和MaterialButton类似。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton点击事件", + "desc": [ + "【color】: 颜色 【Color】", + "【splashColor】: 水波纹颜色 【Color】", + "【elevation】: 影深 【double】", + "【child】: 子组件 【Widget】", + "【textColor】: 子组件文字颜色 【Color】", + "【highlightColor】: 长按高亮色 【Color】", + "【padding】: 内边距 【EdgeInsetsGeometry】", + "【onPressed】: 点击事件 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton 按钮于 Flutter3.3 退出历史舞台。取代者为 ElevatedButton 按钮。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart index e375c2c0..f8123b6a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/node1_base.dart @@ -1,21 +1,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 26, -// "priority": 1, -// "name": "RaisedButton点击事件", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【splashColor】: 水波纹颜色 【Color】\n" -// "【elevation】: 影深 【double】\n" -// "【child】: 子组件 【Widget】\n" -// "【textColor】: 子组件文字颜色 【Color】\n" -// "【highlightColor】: 长按高亮色 【Color】\n" -// "【padding】: 内边距 【EdgeInsetsGeometry】\n" -// "【onPressed】: 点击事件 【Function】", -// } class CustomRaisedButton extends StatelessWidget { const CustomRaisedButton({Key? key}) : super(key: key); @@ -32,18 +17,4 @@ class CustomRaisedButton extends StatelessWidget { child: Text(info), ); } - - // @override - // Widget build(BuildContext context) { - // return RaisedButton( - // color: Colors.blue, - // splashColor: Colors.green, - // onPressed: () {}, - // child: const Text("RaisedButton"), - // textColor: const Color(0xffFfffff), - // padding: const EdgeInsets.all(8), - // elevation: 5, - // highlightColor: const Color(0xffF88B0A), - // ); - // } -} +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json new file mode 100644 index 00000000..0eb7cf71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "原放大镜", + "info": "一个可以放大下方任意组件的放大镜,可以设置装饰形状、尺寸、偏移量等属性。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier 的简单使用", + "desc": [ + "【size】 : 尺寸 【Size】", + "【magnificationScale】 : 放大倍率 【double】", + "【focalPointOffset】: 放大内容偏移量 【Offset】", + "【decoration】: 发现装饰 【MagnifierDecoration】", + "【child】: 子组件 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier 自定义装饰形状", + "desc": [ + "这里自定义五角星装饰形状" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart index a03e40fb..a391e622 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 360, -// "priority": 1, -// "name": "RawMagnifier 的简单使用", -// "subtitle": "【size】 : 尺寸 【Size】\n" -// "【magnificationScale】 : 放大倍率 【double】\n" -// "【focalPointOffset】: 放大内容偏移量 【Offset】\n" -// "【decoration】: 发现装饰 【MagnifierDecoration】\n" -// "【child】: 子组件 【Widget?】\n", -// } class MagnifierCircleShape extends StatefulWidget{ const MagnifierCircleShape({super.key}); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart index b3ce9b23..69fd1508 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/node2_shape.dart @@ -4,14 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 360, -// "priority": 2, -// "name": "RawMagnifier 自定义装饰形状", -// "subtitle": "这里自定义五角星装饰形状", -// } + class MagnifierStarShape extends StatefulWidget{ const MagnifierStarShape({super.key}); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json new file mode 100644 index 00000000..b0c52070 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_zh-CN.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "安全区", + "info": "通过添加内边距,来适配一些手机本身特殊性(圆角、刘海屏等)而所造成的布局问题。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 使用测试", + "desc": [ + "【left】 : 左侧是否启用 【bool】", + "【top】 : 上方是否启用 【bool】", + "【bottom】 : 下方是否启用 【bool】", + "【right】 : 右侧是否启用 【bool】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart index bfeb97e8..d32b2dc5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 207 SafeArea 安全区 通过添加内边距,来适配一些手机本身特殊性(圆角、刘海屏等)而所造成的布局问题。 -// { -// "widgetId": 207, -// "name": 'SafeArea 使用测试', -// "priority": 1, -// "subtitle": -// "【left】 : 左侧是否启用 【bool】\n" -// "【top】 : 上方是否启用 【bool】\n" -// "【bottom】 : 下方是否启用 【bool】\n" -// "【right】 : 右侧是否启用 【bool】\n" -// "【child】 : 子组件 【Widget】", -// } + class SafeAreaDemo extends StatelessWidget { const SafeAreaDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json new file mode 100644 index 00000000..78028aa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "视滑动图", + "info": "该组件用于滑动的支持,该类是一个抽象类,所以无法直接使用,它有很多实现类,如 CustomScrollView、BoxScrollView、ListView、GridView。", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 介绍", + "desc": [ + "【reverse】 : 是否反向 【bool】", + "【scrollDirection】 : 滑动方向 【Axis】", + "【cacheExtent】 : 缓存长 【double】", + "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】", + "【clipBehavior】 : 裁剪行为 【ClipBehavior】", + "【controller】 : 控制器 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart index 5211f615..a17fee85 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com -/// 说明: 349 ScrollView 滑动视图 -/// 该组件用于滑动的支持,该类是一个抽象类,所以无法直接使用,它有很多实现类,如 CustomScrollView、BoxScrollView、ListView、GridView。 -/// link 183,162,163,253,340 -/// -// { -// "widgetId": 349, -// "name": 'ScrollView 介绍', -// "priority": 1, -// "subtitle": "【reverse】 : 是否反向 【bool】\n" -// "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【cacheExtent】 : 缓存长 【double】\n" -// "【dragStartBehavior】 : 拖动行为 【DragStartBehavior】\n" -// "【clipBehavior】 : 裁剪行为 【ClipBehavior】\n" -// "【controller】 : 控制器 【ScrollController】", -// } + class ScrollViewDemo extends StatelessWidget { const ScrollViewDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json new file mode 100644 index 00000000..5f5bbc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "简单对话框", + "info": "一个简单的对话框结构,可指定头、中处的组件。拥有拥有标题、内容的文字样式和边距,影深、形状等属性。常与SimpleDialogOption联用。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialog基本使用", + "desc": [ + "【title】 : 顶部组件 【Widget】", + "【children】 : 子组件列表 【List】", + "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart index 672494c6..262eec58 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-24 /// contact me by email 1981462002@qq.com -/// 说明: -/// -// { -// "widgetId": 128, -// "name": 'SimpleDialog基本使用', -// "priority": 1, -// "subtitle": -// "【title】 : 顶部组件 【Widget】\n" -// "【children】 : 子组件列表 【List】\n" -// "【titlePadding】 : 顶部内边距 【EdgeInsetsGeometry】\n" -// "【contentPadding】 : 内容内边距 【EdgeInsetsGeometry】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】", -// } + class CustomSimpleDialog extends StatelessWidget { const CustomSimpleDialog({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json new file mode 100644 index 00000000..54061f58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_zh-CN.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "简单对话框选项", + "info": "一个按钮,应用场景很少,通常用于SimpleDialog中,接收点击事件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOption基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【onPressed】 : 点击事件 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart index a5ca6e83..62f76cf5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 133, -// "name": 'SimpleDialogOption基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【onPressed】 : 点击事件 【Function()】", -// } + class CustomSimpleDialogOption extends StatelessWidget { const CustomSimpleDialogOption({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json new file mode 100644 index 00000000..8dea51b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "单子滑动", + "info": "使一个组件具有滑动的效果,可指定滑动的方向、是否反向、滑动控制器等属性。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollView基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【padding】 : 内边距 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollView滑动方向", + "desc": [ + "【scrollDirection】 : 滑动方向 【Axis】", + "【reverse】 : 是否反向 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart index 8ea25ad0..b1e4cb6b 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-28 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 164, -// "name": 'SingleChildScrollView基本使用', -// "priority": 1, -// "subtitle": "【child】 : 子组件 【Widget】\n" -// "【padding】 : 内边距 【EdgeInsetsGeometry】", -// } class CustomSingleChildScrollView extends StatelessWidget { CustomSingleChildScrollView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart index 030dfe9e..0113e0a2 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 164, -// "name": 'SingleChildScrollView滑动方向', -// "priority": 2, -// "subtitle": "【scrollDirection】 : 滑动方向 【Axis】\n" -// "【reverse】 : 是否反向 【Axis】", -// } class DirectionSingleChildScrollView extends StatelessWidget { DirectionSingleChildScrollView({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json new file mode 100644 index 00000000..f199b3bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "信息提示条", + "info": "作为组件来说是一个简单的结构组件,可指定形状、影深、背景色等。一般通过ScaffoldState的showSnackBar方法从底部弹出。", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBar基本使用", + "desc": [ + "【content】 : 中间内容组件 【Widget】", + "【action】 : 右侧按钮 【SnackBarAction】", + "【duration】 : 持续时长 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影深 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onVisible】 : 显示时回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart index 48b2896e..36cac9c3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 140, -// "name": 'SnackBar基本使用', -// "priority": 1, -// "subtitle": -// "【content】 : 中间内容组件 【Widget】\n" -// "【action】 : 右侧按钮 【SnackBarAction】\n" -// "【duration】 : 持续时长 【Widget】\n" -// "【backgroundColor】 : 背景色 【Color】\n" -// "【elevation】 : 影深 【double】\n" -// "【shape】 : 形状 【ShapeBorder】\n" -// "【onVisible】 : 显示时回调 【Function()】", -// } + class CustomSnackBar extends StatefulWidget { const CustomSnackBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json new file mode 100644 index 00000000..a5e8dc22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "信息提示条按钮", + "info": "一般只用于SnackBar中,接受点击事件。点击一次后该按钮就会被禁用,可以指定颜色和禁用时颜色。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarAction基本使用", + "desc": [ + "【label】 : 标签 【String】", + "【textColor】 : 文字颜色 【Color】", + "【disabledTextColor】 : 文字失效色 【Color】", + "【onPressed】 : 点击回调 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart index 2e8fa368..65cf6ac0 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 141, -// "name": 'SnackBarAction基本使用', -// "priority": 1, -// "subtitle": -// "【label】 : 标签 【String】\n" -// "【textColor】 : 文字颜色 【Color】\n" -// "【disabledTextColor】 : 文字失效色 【Color】\n" -// "【onPressed】 : 点击回调 【Function()】", -// } + class CustomSnackBarAction extends StatelessWidget { const CustomSnackBarAction({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json new file mode 100644 index 00000000..3e50a823 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_zh-CN.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "空间组件", + "info": "只能用于Row、Column和Flex布局中,可利用剩余空间进行占位,使用flex属性可以给多个Spacer按比例分配空间。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacer基本使用", + "desc": [ + "一个Spacer会占据可延伸区域" + ] + }, + { + "file": "node2_flex.dart", + "name": "多个Spacer空间分配", + "desc": [ + "【flex】 : 剩余空间分配占比 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart index 8423188d..2efb18a0 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 107, -// "name": 'Spacer基本使用', -// "priority": 1, -// "subtitle": -// "一个Spacer会占据可延伸区域", -// } class OneSpacer extends StatelessWidget { const OneSpacer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart index 8ebdcbfc..dfc17ae7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/node2_flex.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 107, -// "name": '多个Spacer空间分配', -// "priority": 2, -// "subtitle": -// "【flex】 : 剩余空间分配占比 【int】", -// } class ManySpacer extends StatefulWidget { const ManySpacer({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json new file mode 100644 index 00000000..1feece7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_zh-CN.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "切钮瓦片", + "info": "Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个Switch。相应位置可插入组件,可以很方便地应对特定的条目。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTile的基本表现如下", + "desc": [ + "【secondary】: 左侧组件 【Widget】", + "【title】: 中间上组件 【Widget】", + "【subtitle】: 中间下组件 【Widget】", + "【inactiveThumbColor】: 未选中时圆圈颜色 【Color】", + "【inactiveTrackColor】: 未选中滑槽颜色 【Color】", + "【activeColor】: 选中时圆圈颜色 【Color】", + "【activeTrackColor】: 选中滑槽颜色 【Color】", + "【onChanged】: 选中事件 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTile的选中效果", + "desc": [ + "【selected】: 是否选中 【bool】", + "【inactiveThumbImage】: 未选中时圆圈图片 【ImageProvider】", + "【activeThumbImage】: 选中时圆圈图片 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTile的密排属性", + "desc": [ + "【dense】: 是否密排 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart index 716cfad9..51098829 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node1_base.dart @@ -2,20 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 1, -// "name": "SwitchListTile的基本表现如下", -// "subtitle": "【secondary】: 左侧组件 【Widget】\n" -// "【title】: 中间上组件 【Widget】\n" -// "【subtitle】: 中间下组件 【Widget】\n" -// "【inactiveThumbColor】: 未选中时圆圈颜色 【Color】\n" -// "【inactiveTrackColor】: 未选中滑槽颜色 【Color】\n" -// "【activeColor】: 选中时圆圈颜色 【Color】\n" -// "【activeTrackColor】: 选中滑槽颜色 【Color】\n" -// "【onChanged】: 选中事件 【Function(bool)】", -// } + class CustomSwitchListTile extends StatefulWidget { const CustomSwitchListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart index 8b9743e9..bbdeaee3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node2_select.dart @@ -3,15 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 2, -// "name": "SwitchListTile的选中效果", -// "subtitle": "【selected】: 是否选中 【bool】\n" -// "【inactiveThumbImage】: 未选中时圆圈图片 【ImageProvider】\n" -// "【activeThumbImage】: 选中时圆圈图片 【ImageProvider】", -// } + class SelectSwitchListTile extends StatefulWidget { const SelectSwitchListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart index a34580af..06387d3c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/node3_dense.dart @@ -3,13 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 18, -// "priority": 3, -// "name": "SwitchListTile的密排属性", -// "subtitle": "【dense】: 是否密排 【bool】", -// } + class DenseSwitchListTile extends StatefulWidget { const DenseSwitchListTile({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json new file mode 100644 index 00000000..b3849f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "标签", + "info": "一般用于TabBar中的item,上下结构,可指定图标和一个内容组件。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tab基本使用", + "desc": [ + "【child】 : 子组件 【Widget】", + "【text】 : 文字 【String】", + "【icon】 : 下方组件 【Widgit】", + " text和child不能同时存在" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart index 77d476bc..932f2bc1 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/node1_base.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 148, -// "name": 'Tab基本使用', -// "priority": 1, -// "subtitle": -// "【child】 : 子组件 【Widget】\n" -// "【text】 : 文字 【String】\n" -// "【icon】 : 下方组件 【Widgit】\n" -// " text和child不能同时存在", -// } class CustomTab extends StatelessWidget { const CustomTab({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json new file mode 100644 index 00000000..b49dbb29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_zh-CN.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "标签栏", + "info": "可滑动和点击标签栏,通常用于AppBar的底部,可与TabBarView联用,实现滑页的效果。", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBar基本使用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【indicatorColor】 : 指示器颜色 【指示器颜色】", + "【indicatorWeight】 : 指示器高 【double】", + "【indicatorPadding】 : 指示器边距 【EdgeInsetsGeometry】", + "【labelStyle】 : 页签文字样式 【TextStyle】", + "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】", + "【isScrollable】 : 是否可滑动 【bool】", + "【onTap】 : 页签点击回调 【Function(int)】", + "【tabs】 : 标签组件 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "通过设置Theme可实现无水波纹", + "desc": [ + "将Theme关于水波纹的颜色设置为透明即可。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart index 56f08961..747d93ea 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node1_base.dart @@ -2,23 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 58, -// "name": 'TabBar基本使用', -// "priority": 1, -// "subtitle": -// "【controller】 : 控制器 【TabController】\n" -// "【indicatorColor】 : 指示器颜色 【指示器颜色】\n" -// "【indicatorWeight】 : 指示器高 【double】\n" -// "【indicatorPadding】 : 指示器边距 【EdgeInsetsGeometry】\n" -// "【labelStyle】 : 页签文字样式 【TextStyle】\n" -// "【unselectedLabelStyle】 : 未选中文字样式 【TextStyle】\n" -// "【isScrollable】 : 是否可滑动 【bool】\n" -// "【onTap】 : 页签点击回调 【Function(int)】\n" -// "【tabs】 : 标签组件 【List】", -// } class CustomTabBar extends StatefulWidget { const CustomTabBar({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart index 69897529..46993393 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/node2_noShadow.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 58, -// "name": '通过设置Theme可实现无水波纹', -// "priority": 1, -// "subtitle": -// "将Theme关于水波纹的颜色设置为透明即可。", -// } class NoShadowTabBarDemo extends StatefulWidget { const NoShadowTabBarDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json new file mode 100644 index 00000000..65dd3fd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_zh-CN.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "页签滑动选择器", + "info": "通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelector基本使用", + "desc": [ + "【controller】 : 控制器 【TabController】", + "【indicatorSize】: 指示器大小 【double】", + "【selectedColor】: 选中色 【Color】", + "【color】: 颜色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart index ab504e0c..e061bc8b 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 205 TabPageSelector 通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。 -// { -// "widgetId": 205, -// "name": "TabPageSelector基本使用", -// "priority": 1, -// "subtitle": "【controller】 : 控制器 【TabController】\n" -// "【indicatorSize】: 指示器大小 【double】\n" -// "【selectedColor】: 选中色 【Color】\n" -// "【color】: 颜色 【Color】", -// } class TabPageSelectorDemo extends StatefulWidget { const TabPageSelectorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json new file mode 100644 index 00000000..e667b9a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "页签指示器", + "info": "一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicator基本使用", + "desc": [ + "【size】: 大小 【double】", + "【backgroundColor】: 背景色 【Color】", + "【borderColor】: 边线色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart index 6b377b3d..089bb4ac 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/node1_base.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 206 TabPageSelectorIndicator 一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。 - -// { -// "widgetId": 206, -// "name": "TabPageSelectorIndicator基本使用", -// "priority": 1, -// "subtitle": "【size】: 大小 【double】\n" -// "【backgroundColor】: 背景色 【Color】\n" -// "【borderColor】: 边线色 【Color】", -// } + class TabPageSelectorIndicatorDemo extends StatelessWidget { const TabPageSelectorIndicatorDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json new file mode 100644 index 00000000..42c7496d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "文字组件", + "info": "用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "文字的基本样式", + "desc": [ + "【入参】 : 文字 【String】", + "【style】: 文字样式 【TextStyle】", + "【color】: 文字样式 【Color】", + "【fontSize】: 文字大小 【double】", + "【fontWeight】: 字重 【FontWeight】", + "【fontStyle】: 字体样式 【fontStyle】", + "【letterSpacing】: 字距 【double】" + ] + }, + { + "file": "node2_shadows.dart", + "name": "文字阴影", + "desc": [ + "【shadows】 : 文字 【List】", + "【backgroundColor】: 背景颜色 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "文字装饰线", + "desc": [ + "【fontFamily】 : 文字字体 【String】", + "【decoration】: 装饰线 【TextDecoration】", + "【decorationColor】: 装饰线颜色 【Color】", + "【decorationThickness】: 装饰线粗 【double】", + "【decorationStyle】: 装饰线样式 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "文字对齐方式", + "desc": [ + "【textAlign】: 对齐方式 【TextAlign】", + "下面依次是:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "文字方向与最大行数", + "desc": [ + "【maxLines】 : 最大行数 【int】", + "【textDirection】 : 文字方向 【TextDirection】", + "下面依次是:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "是否包裹与越界效果", + "desc": [ + "【softWrap】 : 是否换行 【bool】", + "【overflow】 : 越界效果 【TextOverflow】", + "下面softWrap=false; overflow依次是:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart index fc27085b..5060ffe2 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart @@ -2,21 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 1, -// "name": "文字的基本样式", -// "subtitle": "【入参】 : 文字 【String】\n" -// "【style】: 文字样式 【TextStyle】\n" -// "【color】: 文字样式 【Color】\n" -// "【fontSize】: 文字大小 【double】\n" -// "【fontWeight】: 字重 【FontWeight】\n" -// "【fontStyle】: 字体样式 【fontStyle】\n" -// "【letterSpacing】: 字距 【double】", -// } class CustomText extends StatelessWidget { const CustomText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart index a7bf9414..b27cb09c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 2, -// "name": "文字阴影", -// "subtitle": "【shadows】 : 文字 【List】\n" -// "【backgroundColor】: 背景颜色 【Color】", -// } class ShadowText extends StatelessWidget { const ShadowText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart index 1aee5c8e..7a3716e3 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node3_decoration.dart @@ -2,19 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 3, -// "name": "文字装饰线", -// "subtitle": "【fontFamily】 : 文字字体 【String】\n" -// "【decoration】: 装饰线 【TextDecoration】\n" -// "【decorationColor】: 装饰线颜色 【Color】\n" -// "【decorationThickness】: 装饰线粗 【double】\n" -// "【decorationStyle】: 装饰线样式 【TextDecorationStyle】", -// } class DecorationText extends StatelessWidget { const DecorationText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart index 11b8b2ce..de98a034 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node4_textAlign.dart @@ -2,16 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 4, -// "name": "文字对齐方式", -// "subtitle": "【textAlign】: 对齐方式 【TextAlign】\n" -// "下面依次是:left、right、center、justify、start、end ", -// } class TextAlignText extends StatelessWidget { const TextAlignText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart index da2ce798..89d286ab 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node5_textDirection.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 5, -// "name": "文字方向与最大行数", -// "subtitle": "【maxLines】 : 最大行数 【int】\n" -// "【textDirection】 : 文字方向 【TextDirection】\n" -// "下面依次是:rtl、ltr ", -// } class TextDirectionText extends StatelessWidget { const TextDirectionText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart index cc80eb61..9c1aba9a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node6_softWrap.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: - -// { -// "widgetId": 2, -// "priority": 6, -// "name": "是否包裹与越界效果", -// "subtitle": "【softWrap】 : 是否换行 【bool】\n" -// "【overflow】 : 越界效果 【TextOverflow】\n" -// "下面softWrap=false; overflow依次是:clip、fade、ellipsis、visible ", -// } class SoftWrapText extends StatelessWidget { const SoftWrapText({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json new file mode 100644 index 00000000..18c0dedb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "主题", + "info": "可通过Theme.of获取ThemeData对象。也可以指定主题应用于Theme的后代组件。", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "文字样式-ThemeData#TextTheme", + "desc": [ + "子组件可以通过ThemeData.of获取主题的数据进行使用。" + ] + }, + { + "file": "node2_use.dart", + "name": "Theme的用法", + "desc": [ + "使用Theme,可以指定非常多的属性作为主题,这些属性将应用于所有的后代组件,如指定字体、滑块、卡片、文字、分割线、按钮等属性。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart index 9b175948..69e4d691 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node1_base.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 168, -// "name": '文字样式-ThemeData#TextTheme', -// "priority": 1, -// "subtitle": -// "子组件可以通过ThemeData.of获取主题的数据进行使用。", -// } + class TextThemeDemo extends StatelessWidget { const TextThemeDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart index 89d1d3ec..33f86421 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 168, -// "name": 'Theme的用法', -// "priority": 2, -// "subtitle": -// "使用Theme,可以指定非常多的属性作为主题,这些属性将应用于所有的后代组件,如指定字体、滑块、卡片、文字、分割线、按钮等属性。", -// } class CustomTheme extends StatelessWidget { const CustomTheme({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json new file mode 100644 index 00000000..0df024db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "应用标题", + "info": "该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title基本使用", + "desc": [ + "【title】 : 名称 【int】", + "【color】: 颜色 【Color】", + "【child】: 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart index 40287758..19bb988c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/node1_base.dart @@ -2,15 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/22 /// contact me by email 1981462002@qq.com -/// 说明: 208 Title 0 该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。 -// { -// "widgetId": 208, -// "name": "Title基本使用", -// "priority": 1, -// "subtitle": "【title】 : 名称 【int】\n" -// "【color】: 颜色 【Color】\n" -// "【child】: 子组件 【Widget】", -// } + class TitleDemo extends StatelessWidget { const TitleDemo({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json new file mode 100644 index 00000000..57099796 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "切换按钮组", + "info": "接收组件列表,可指定边线、圆角、颜色等属性。根据具体逻辑,可以实现多个按钮单选或多选的需求。", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons单选切换", + "desc": [ + "【children】: 子组件集 【List】", + "【borderWidth】: 边线宽 【double】", + "【borderRadius】: 圆角 【BorderRadius】", + "【isSelected】: 是否选中集 【List】", + "【onPressed】: 点击事件 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons颜色属性", + "desc": [ + "【borderColor】: 边线色 【Color】", + "【selectedBorderColor】: 选中边线色 【Color】", + "【selectedColor】: 选中时组件色 【Color】", + "【fillColor】: 选中时填充色 【Color】", + "【splashColor】: 水波纹色 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons多选切换", + "desc": [ + "可以控制状态转化的逻辑来形成不同的效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart index 8b0c6533..7ec287cc 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node1_single.dart @@ -2,18 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 33, -// "priority": 1, -// "name": "ToggleButtons单选切换", -// "subtitle": "【children】: 子组件集 【List】\n" -// "【borderWidth】: 边线宽 【double】\n" -// "【borderRadius】: 圆角 【BorderRadius】\n" -// "【isSelected】: 是否选中集 【List】\n" -// "【onPressed】: 点击事件 【Function(int)】", -// } class CustomToggleButtons extends StatefulWidget { const CustomToggleButtons({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart index 733409e2..db779159 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node2_color.dart @@ -4,18 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 33, -// "priority": 2, -// "name": "ToggleButtons颜色属性", -// "subtitle": "【borderColor】: 边线色 【Color】\n" -// "【selectedBorderColor】: 选中边线色 【Color】\n" -// "【selectedColor】: 选中时组件色 【Color】\n" -// "【fillColor】: 选中时填充色 【Color】\n" -// "【splashColor】: 水波纹色 【Color】", -// } class ColorToggleButtons extends StatefulWidget { const ColorToggleButtons({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart index 8c52e113..edb205b5 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/node3_multi.dart @@ -3,14 +3,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 33, -// "priority": 3, -// "name": "ToggleButtons多选切换", -// "subtitle": " 可以控制状态转化的逻辑来形成不同的效果。", -// } class ProToggleButtons extends StatefulWidget { const ProToggleButtons({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json new file mode 100644 index 00000000..efda0517 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "展示头", + "info": "Flutter提供的一个通用展示结构,相应位置可插入组件,可以很方便地应对特定的条目,常用于Drawer中。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "该组件的基本表现如下", + "desc": [ + "【currentAccountPicture】: 上组件 【Widget】", + "【accountName】: 中组件 【Widget】", + "【accountEmail】: 下组件 【Widget】", + "【decoration】: 装饰 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "右上角和底部", + "desc": [ + "【otherAccountsPictures】: 右上组件 【List】", + "【onDetailsPressed】: 右下角点击事件 【Function()】", + "【arrowColor】: 右下角按钮颜色 【Color】", + "【margin】: 外边距 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart index 64c4c7c7..dc2eda1b 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node1_base.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 22, -// "priority": 1, -// "name": "该组件的基本表现如下", -// "subtitle": "【currentAccountPicture】: 上组件 【Widget】\n" -// "【accountName】: 中组件 【Widget】\n" -// "【accountEmail】: 下组件 【Widget】\n" -// "【decoration】: 装饰 【Decoration】", -// } class CustomUAGHP extends StatelessWidget { const CustomUAGHP({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart index 834e33e3..3c8e7d54 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/node2_pro.dart @@ -2,17 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 22, -// "priority": 2, -// "name": "右上角和底部", -// "subtitle": "【otherAccountsPictures】: 右上组件 【List】\n" -// "【onDetailsPressed】: 右下角点击事件 【Function()】\n" -// "【arrowColor】: 右下角按钮颜色 【Color】\n" -// "【margin】: 外边距 【EdgeInsetsGeometry】", -// } class ProUAGHP extends StatelessWidget { const ProUAGHP({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json new file mode 100644 index 00000000..7fad0ce5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "竖直分割线", + "info": "竖直分割线,可指定颜色、宽度、粗细、上下边距信息,常用与列表的item分割线。", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider颜色和粗细", + "desc": [ + "【color】: 颜色 【Color】", + "【thickness】: 线粗细 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider宽度和空缺", + "desc": [ + "【indent】: 前面空缺长度 【double】", + "【endIndent】: 后面空缺长度 【double】", + "【width】: 占位宽 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart index 434136f4..36473ef2 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node1_base.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 35, -// "priority": 1, -// "name": "VerticalDivider颜色和粗细", -// "subtitle": "【color】: 颜色 【Color】\n" -// "【thickness】: 线粗细 【double】", -// } class CustomVerticalDivider extends StatelessWidget { const CustomVerticalDivider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart index 9943c976..86610bcc 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/node2_height.dart @@ -4,16 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 35, -// "priority": 2, -// "name": "VerticalDivider宽度和空缺", -// "subtitle": "【indent】: 前面空缺长度 【double】\n" -// "【endIndent】: 后面空缺长度 【double】\n" -// "【width】: 占位宽 【double】", -// } class WidthVerticalDivider extends StatelessWidget { const WidthVerticalDivider({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json new file mode 100644 index 00000000..48f0b2d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_zh-CN.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "显隐组件", + "info": "控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "根据visible控制内部子组件的显隐情况", + "desc": [ + "【visible】 : 是否显示 【bool】", + "【child】: 孩子 【Widget】", + "默认孩子隐藏时会失去原来所在区域。" + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement可在隐藏时进行占位", + "desc": [ + "【replacement】 : 隐藏时的占位组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart index 5d0bbe32..e6c1de43 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node1_base.dart @@ -1,16 +1,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 10, -// "priority": 1, -// "name": "根据visible控制内部子组件的显隐情况", -// "subtitle": "【visible】 : 是否显示 【bool】\n" -// "【child】: 孩子 【Widget】\n" -// "默认孩子隐藏时会失去原来所在区域。", -// } class CustomVisibility extends StatelessWidget { const CustomVisibility({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart index d9ed102b..9c96f49d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/node2_replacement.dart @@ -2,14 +2,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 10, -// "priority": 2, -// "name": "replacement可在隐藏时进行占位", -// "subtitle": "【replacement】 : 隐藏时的占位组件 【Widget】", -// } class ReplacementVisibility extends StatelessWidget { const ReplacementVisibility({Key? key}) : super(key: key); diff --git a/modules/widget_system/widgets/lib/exp/render_object_unit.dart b/modules/widget_system/widgets/lib/exp/render_object_unit.dart index 1128f417..6f1d694f 100644 --- a/modules/widget_system/widgets/lib/exp/render_object_unit.dart +++ b/modules/widget_system/widgets/lib/exp/render_object_unit.dart @@ -55,7 +55,7 @@ export '../SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart'; export '../SingleChildRenderObjectWidget/FadeTransition/node1_base.dart'; export '../SingleChildRenderObjectWidget/FittedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart'; -export '../SingleChildRenderObjectWidget/LimiteBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/LimitedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/OffStage/node1_base.dart'; export '../SingleChildRenderObjectWidget/Opacity/node1_base.dart'; export '../SingleChildRenderObjectWidget/Padding/node1_all.dart'; diff --git a/modules/widget_system/widgets/lib/exp/stateless_unit.dart b/modules/widget_system/widgets/lib/exp/stateless_unit.dart index 15827b0b..f641ae37 100644 --- a/modules/widget_system/widgets/lib/exp/stateless_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateless_unit.dart @@ -153,10 +153,10 @@ export '../StatelessWidget/VerticalDivider/node1_base.dart'; export '../StatelessWidget/VerticalDivider/node2_height.dart'; -export '../StatelessWidget/GirdView/node1_base.dart'; -export '../StatelessWidget/GirdView/node2_direction.dart'; -export '../StatelessWidget/GirdView/node3_extend.dart'; -export '../StatelessWidget/GirdView/node4_builder.dart'; +export '../StatelessWidget/GridView/node1_base.dart'; +export '../StatelessWidget/GridView/node2_direction.dart'; +export '../StatelessWidget/GridView/node3_extend.dart'; +export '../StatelessWidget/GridView/node4_builder.dart'; export '../StatelessWidget/GridPaper/node1_base.dart'; export '../StatelessWidget/GridPaper/node2_divisions.dart'; From c879e52a5b83f1ed8607be63fcf9a885abc8650c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 22 Sep 2024 16:13:23 +0800 Subject: [PATCH 097/149] new detail ui --- assets/flutter.db | Bin 1462272 -> 1474560 bytes .../view/mobile/unit_navigation.dart | 3 +- lib/src/starter/start_repository.dart | 4 +- modules/basic_system/app/lib/app.dart | 2 +- .../view/data_manage/data_manage_page.dart | 2 +- modules/basic_system/app/pubspec.yaml | 2 +- .../db_storage/flutter/model/widget_po.dart | 12 + .../lib/data/model/node_model.dart | 18 + .../lib/views/mobile/mobile_ui.dart | 3 +- .../search_page/standard_search_bar.dart | 10 +- .../node_display/code_display.dart | 187 ++++++++ .../widget_detail/node_display/collapse.dart | 436 ++++++++++++++++++ .../node_display/node_display.dart | 90 ++++ .../node_display/node_title.dart | 40 ++ .../widget_detail/widget_detail_page.dart | 16 +- .../widget_detail/widget_detail_panel.dart | 12 +- .../widget_detail/widget_node_panel.dart | 2 + .../widget_page/standard_home_search.dart | 15 +- .../widget_system/widget_module/pubspec.yaml | 2 +- modules/widget_system/widgets/.gitignore | 1 + .../Column/desc_zh-CN.json | 2 +- .../Column/{node1_base.dart => node_01.dart} | 4 +- .../CustomMultiChildLayout/desc_zh-CN.json | 2 +- .../{node1_base.dart => node_01.dart} | 4 +- .../Flex/desc_zh-CN.json | 10 +- .../{node1_direction.dart => node_01.dart} | 4 +- ...e2_mainAxisAlignment.dart => node_02.dart} | 4 +- ...3_crossAxisAlignment.dart => node_03.dart} | 4 +- ...e4_verticalDirection.dart => node_04.dart} | 4 +- ...{node5_textDirection.dart => node_05.dart} | 4 +- .../Flex/zz_node_play.dart | 188 -------- .../Flow/desc_zh-CN.json | 4 +- .../Flow/{node1_base.dart => node_01.dart} | 4 +- .../Flow/{node2_anim.dart => node_02.dart} | 11 +- .../IndexedStack/node1_base.dart | 8 +- .../Sliver/PinnedHeaderSliver/desc_zh-CN.json | 38 ++ .../Sliver/PinnedHeaderSliver/node_01.dart | 115 +++++ .../Sliver/PinnedHeaderSliver/node_02.dart | 109 +++++ .../Sliver/PinnedHeaderSliver/node_03.dart | 161 +++++++ .../SliverPersistentHeader/desc_zh-CN.json | 4 +- .../widgets/lib/exp/render_object_unit.dart | 18 +- .../widgets/lib/exp/sliver_unit.dart | 3 + .../widgets/lib/widgets_map.dart | 26 +- pubspec.lock | 8 +- 44 files changed, 1320 insertions(+), 276 deletions(-) create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/{node1_base.dart => node_01.dart} (93%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/{node1_base.dart => node_01.dart} (95%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/{node1_direction.dart => node_01.dart} (93%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/{node2_mainAxisAlignment.dart => node_02.dart} (92%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/{node3_crossAxisAlignment.dart => node_03.dart} (93%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/{node4_verticalDirection.dart => node_04.dart} (92%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/{node5_textDirection.dart => node_05.dart} (93%) delete mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/{node1_base.dart => node_01.dart} (94%) rename modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/{node2_anim.dart => node_02.dart} (91%) create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart diff --git a/assets/flutter.db b/assets/flutter.db index 5593b9422c4e4e1e70f05449a8b01d99919e6e33..bd45d324bb649fa684d5aa7ee3eb765626e806b2 100644 GIT binary patch delta 18810 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 { children: [ StandardHomePage(), GalleryUnit(), - ArtifactPage(), + AlgoScope(child: ArtifactPage()), CollectPageAdapter(), UserPage(), ], diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index c487b559..d8b390fd 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -11,6 +11,7 @@ import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; +import 'package:utils/utils.dart'; class FlutterUnitStartRepo implements AppStartRepository { const FlutterUnitStartRepo(); @@ -26,6 +27,7 @@ class FlutterUnitStartRepo implements AppStartRepository { // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); if (!kAppEnv.isWeb) await initDb(); + HttpUtil.instance.rebase(PathUnit.baseUrl); AppConfigPo po = await SpStorage.instance.appConfig.read(); List netConnect = await (Connectivity().checkConnectivity()); AppConfig state = AppConfig.fromPo(po); @@ -73,7 +75,7 @@ class FlutterUnitStartRepo implements AppStartRepository { } //非 release模式,执行拷贝 - if (!kDebugMode) { + if (kDebugMode) { shouldCopy = true; } diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart index e1e839f0..68763768 100644 --- a/modules/basic_system/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -23,7 +23,7 @@ export 'app/style/shape/coupon_shape_border.dart'; export 'app/style/shape/techno_shape.dart'; export 'app/style/behavior/no_scroll_behavior.dart'; -export 'package:fx_platform_adapter/platform_adapter.dart'; +export 'package:fx_platform_adapter/fx_platform_adapter.dart'; export 'app_config/app_config.dart'; diff --git a/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart index 75589b6a..85887305 100644 --- a/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart +++ b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:app/app.dart'; -import 'package:artifact/artifact.dart'; import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; import 'package:flutter/material.dart'; @@ -16,6 +15,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:path/path.dart' as path; import 'package:sqflite/sqflite.dart'; +import 'package:widget_module/views/mobile/category_page/sync/category_api.dart'; import 'package:widget_module/widget_module.dart'; diff --git a/modules/basic_system/app/pubspec.yaml b/modules/basic_system/app/pubspec.yaml index bf1c6368..c4b5ba8d 100644 --- a/modules/basic_system/app/pubspec.yaml +++ b/modules/basic_system/app/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: shared_preferences: ^2.2.2 # xml 固化 connectivity_plus: ^6.0.3 url_launcher: ^6.1.14 # url - fx_platform_adapter: ^0.0.2 # 平台适配器 + fx_platform_adapter: ^0.0.2+1 # 平台适配器 storage: path: ../storage diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart index 70f4dfd8..7ea24e24 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart @@ -38,6 +38,18 @@ class WidgetPo { info: map["info"]); } + factory WidgetPo.fromDesc(Map map) { + return WidgetPo( + id: map['id'], + name: map['name'], + nameCN: map["localName"], + family: map["family"], + lever: map["lever"].toDouble(), + linkWidget: map["linkIds"].join(','), + deprecated: map["deprecated"] ?? 0, + info: map["info"]); + } + Map toJson() { return { "id": id, diff --git a/modules/widget_system/widget_module/lib/data/model/node_model.dart b/modules/widget_system/widget_module/lib/data/model/node_model.dart index 15b89f6d..9b330d12 100644 --- a/modules/widget_system/widget_module/lib/data/model/node_model.dart +++ b/modules/widget_system/widget_module/lib/data/model/node_model.dart @@ -3,6 +3,14 @@ import 'package:equatable/equatable.dart'; /// create by 张风捷特烈 on 2020-03-04 /// contact me by email 1981462002@qq.com /// 说明: 详情页节点-展示-数据模型 +/// + +enum NodeType{ + display, + newPage, + description, + deprecated +} class NodeModel extends Equatable { final String name; @@ -18,6 +26,16 @@ class NodeModel extends Equatable { @override List get props => [name, subtitle, code]; + + NodeType type(String widget){ + if(widget=='PinnedHeaderSliver'){ + return NodeType.newPage; + } + + return NodeType.display; + } + + factory NodeModel.fromJson(Map map) { return NodeModel( name: map['name'], subtitle: map["subtitle"], code: map["code"]); diff --git a/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart b/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart index e4e9586a..5996b986 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/mobile_ui.dart @@ -1,7 +1,8 @@ export 'widget_detail/widget_detail_page.dart'; +export 'widget_detail/node_display/node_title.dart'; export 'widget_page/standard_home_page.dart'; export 'widget_page/widget_page.dart'; export 'category_page/category_page.dart'; export 'category_page/collect_page.dart'; export 'category_page/category_detail.dart'; -export 'category_page/home_right_drawer.dart'; \ No newline at end of file +export 'category_page/home_right_drawer.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 137092af..41a05236 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -56,11 +56,19 @@ class StandardSearchBarInner extends StatelessWidget prefixIcon: Icon( Icons.search, color: Colors.grey, + size: 20, ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 24, + minWidth: 36 + ), + isCollapsed: true, + contentPadding: EdgeInsets.only(top: 4,bottom: 4,right: 8), border: UnderlineInputBorder( borderSide: BorderSide.none, borderRadius: - BorderRadius.all(Radius.circular(35 / 2)), + BorderRadius.all(Radius.circular(8)), ), hintText: "搜索组件", hintStyle: TextStyle(fontSize: 14)), diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart new file mode 100644 index 00000000..c7da0f9b --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart @@ -0,0 +1,187 @@ +import 'dart:math'; + +import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:toly_ui/code/code.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/tolyui.dart'; + +// import 'package:flutter_highlight/flutter_highlight.dart'; +import 'collapse.dart'; + +class CodeDisplay extends StatefulWidget { + final Widget display; + final HighlighterStyle style; + final String code; + + const CodeDisplay({ + super.key, + required this.display, + required this.code, + required this.style, + }); + + @override + State createState() => _CodeDisplayState(); +} + +class _CodeDisplayState extends State { + String? codeRes; + + void _loadAssets() async { + codeRes = await codeData(); + setState(() {}); + } + + Future codeData() async { + if (widget.code.startsWith('assets')) { + return await rootBundle.loadString(widget.code); + } else { + return widget.code; + } + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.maxFinite, + decoration: BoxDecoration( + color: Theme.of(context).listTileTheme.tileColor, + border: Border.all( + color: Theme.of(context).dividerTheme.color ?? Colors.grey, + width: Theme.of(context).dividerTheme.space ?? 1, + ), + boxShadow: [ + BoxShadow(color: Colors.grey.withOpacity(0.05),spreadRadius: 1,blurRadius: 4) + ], + borderRadius: BorderRadius.circular(4)), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 12), + child: widget.display, + ), + const Divider(), + TolyCollapse( + titleBuilder: _buildTitle, + sizeCurve: Curves.ease, + content: CodeWidget( + code: widget.code, + style: widget.style, + ), + duration: const Duration(milliseconds: 500), + ) + ], + ), + ); + } + _doShare() { + Share.share(widget.code); + } + Widget _buildTitle(BuildContext context, Animation anima, CollapseController ctrl) { + Color color = Theme.of(context).primaryColor; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8.0), + child: Row( + children: [ + const Spacer(), + FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _doShare, + child: Padding( + padding: const EdgeInsets.only( + right: 10, + ), + child: Icon( + TolyIcon.icon_share, + size: 20, + color: color, + ), + ), + ), + FeedbackWidget( + mode: FeedMode.fade, + a: 0.4, + onPressed: _copyCode, + child: Padding( + padding: const EdgeInsets.only( + right: 10, + ), + child: Icon( + Icons.copy_rounded, + size: 20, + color: color, + ), + ), + ), + GestureDetector( + onTap: () => _toggleCode(ctrl), + child: AnimatedBuilder( + animation: anima, + builder: (_, child) { + return Transform.rotate( + angle: pi / 2 * Curves.ease.transform(anima.value), + child: Icon( + TolyIcon.icon_code, + color: color, + ), + ); + }, + )), + ], + )); + } + + + void _toggleCode(CollapseController ctrl) { + if (!ctrl.isOpen) { + _loadAssets(); + } else { + codeRes = null; + } + ctrl.toggle(); + } + + void _copyCode() async { + String code = await codeData(); + await Clipboard.setData(ClipboardData(text: code)); + $message.success(message: '代码复制成功!'); + } +} + +const githubTheme = { + 'root': TextStyle(color: Color(0xff333333), backgroundColor: Colors.transparent), + 'comment': TextStyle(color: Color(0xff999988), fontStyle: FontStyle.italic), + 'quote': TextStyle(color: Color(0xff999988), fontStyle: FontStyle.italic), + 'keyword': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.bold), + 'selector-tag': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.bold), + 'subst': TextStyle(color: Color(0xff333333), fontWeight: FontWeight.normal), + 'number': TextStyle(color: Color(0xff008080)), + 'literal': TextStyle(color: Color(0xff008080)), + 'variable': TextStyle(color: Color(0xff008080)), + 'template-variable': TextStyle(color: Color(0xff008080)), + 'string': TextStyle(color: Color(0xffdd1144)), + 'doctag': TextStyle(color: Color(0xffdd1144)), + 'title': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'section': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'selector-id': TextStyle(color: Color(0xff990000), fontWeight: FontWeight.bold), + 'type': TextStyle(color: Color(0xff445588), fontWeight: FontWeight.bold), + 'tag': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'name': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'attribute': TextStyle(color: Color(0xff000080), fontWeight: FontWeight.normal), + 'regexp': TextStyle(color: Color(0xff009926)), + 'link': TextStyle(color: Color(0xff009926)), + 'symbol': TextStyle(color: Color(0xff990073)), + 'bullet': TextStyle(color: Color(0xff990073)), + 'built_in': TextStyle(color: Color(0xff0086b3)), + 'builtin-name': TextStyle(color: Color(0xff0086b3)), + 'meta': TextStyle(color: Color(0xff999999), fontWeight: FontWeight.bold), + 'deletion': TextStyle(backgroundColor: Color(0xffffdddd)), + 'addition': TextStyle(backgroundColor: Color(0xffddffdd)), + 'emphasis': TextStyle(fontStyle: FontStyle.italic), + 'strong': TextStyle(fontWeight: FontWeight.bold), +}; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart new file mode 100644 index 00000000..963b1f5b --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/collapse.dart @@ -0,0 +1,436 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart' hide CrossFadeState; +import 'package:flutter/rendering.dart'; + +typedef AnimatedTitleBuilder = Widget Function( + BuildContext context, + Animation anima, + CollapseController ctrl, +); + +/// A widget that cross-fades between two given children and animates itself +/// between their sizes. +/// +/// {@youtube 560 315 https://www.youtube.com/watch?v=PGK2UUAyE54} +/// +/// The animation is controlled through the [crossFadeState] parameter. +/// [firstCurve] and [opacityCurve] represent the opacity curves of the two +/// children. The [firstCurve] is inverted, i.e. it fades out when providing a +/// growing curve like [Curves.linear]. The [sizeCurve] is the curve used to +/// animate between the size of the fading-out child and the size of the +/// fading-in child. +/// +/// This widget is intended to be used to fade a pair of widgets with the same +/// width. In the case where the two children have different heights, the +/// animation crops overflowing children during the animation by aligning their +/// top edge, which means that the bottom will be clipped. +/// +/// The animation is automatically triggered when an existing +/// [TolyCollapse] is rebuilt with a different value for the +/// [crossFadeState] property. +/// +/// {@tool snippet} +/// +/// This code fades between two representations of the Flutter logo. It depends +/// on a boolean field `_first`; when `_first` is true, the first logo is shown, +/// otherwise the second logo is shown. When the field changes state, the +/// [TolyCollapse] widget cross-fades between the two forms of the logo +/// over three seconds. +/// +/// ```dart +/// AnimatedCrossFade( +/// duration: const Duration(seconds: 3), +/// firstChild: const FlutterLogo(style: FlutterLogoStyle.horizontal, size: 100.0), +/// secondChild: const FlutterLogo(style: FlutterLogoStyle.stacked, size: 100.0), +/// crossFadeState: _first ? CrossFadeState.showFirst : CrossFadeState.showSecond, +/// ) +/// ``` +/// {@end-tool} +/// +/// See also: +/// +/// * [AnimatedOpacity], which fades between nothing and a single child. +/// * [AnimatedSwitcher], which switches out a child for a new one with a +/// customizable transition, supporting multiple cross-fades at once. +/// * [AnimatedSize], the lower-level widget which [TolyCollapse] uses to +/// automatically change size. + +class TolyCollapse extends StatefulWidget { + /// Creates a cross-fade animation widget. + /// + /// The [duration] of the animation is the same for all components (fade in, + /// fade out, and size), and you can pass [Interval]s instead of [Curve]s in + /// order to have finer control, e.g., creating an overlap between the fades. + const TolyCollapse({ + super.key, + required this.content, + this.title, + this.opacityCurve = Curves.linear, + this.sizeCurve = Curves.linear, + this.alignment = Alignment.topCenter, + this.titlePadding = const EdgeInsets.symmetric(vertical: 12.0), + this.contentPadding = + const EdgeInsets.only(top: 0, right: 8, left: 8, bottom: 8), + required this.duration, + this.reverseDuration, + this.titleBuilder, + this.controller, + this.onOpen, + this.onClose, + this.excludeBottomFocus = true, + }) : assert(title == null && titleBuilder != null || + titleBuilder == null && title != null || + titleBuilder != null && title != null); + + final Widget content; + final Widget? title; + final VoidCallback? onOpen; + final VoidCallback? onClose; + final AnimatedTitleBuilder? titleBuilder; + final EdgeInsetsGeometry titlePadding; + final EdgeInsetsGeometry contentPadding; + final CollapseController? controller; + + /// The duration of the whole orchestrated animation. + final Duration duration; + + /// The duration of the whole orchestrated animation when running in reverse. + /// + /// If not supplied, this defaults to [duration]. + final Duration? reverseDuration; + + /// The fade curve of the second child. + /// + /// Defaults to [Curves.linear]. + final Curve opacityCurve; + + /// The curve of the animation between the two children's sizes. + /// + /// Defaults to [Curves.linear]. + final Curve sizeCurve; + + /// How the children should be aligned while the size is animating. + /// + /// Defaults to [Alignment.topCenter]. + /// + /// See also: + /// + /// * [Alignment], a class with convenient constants typically used to + /// specify an [AlignmentGeometry]. + /// * [AlignmentDirectional], like [Alignment] for specifying alignments + /// relative to text direction. + final AlignmentGeometry alignment; + + /// When true, this is equivalent to wrapping the bottom widget with an [ExcludeFocus] + /// widget while it is at the bottom of the cross-fade stack. + /// + /// Defaults to true. When it is false, the bottom widget in the cross-fade stack + /// can remain in focus until the top widget requests focus. This is useful for + /// animating between different [TextField]s so the keyboard remains open during the + /// cross-fade animation. + final bool excludeBottomFocus; + + @override + State createState() => _TolyCollapseState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty( + 'alignment', alignment, + defaultValue: Alignment.topCenter)); + properties + .add(IntProperty('duration', duration.inMilliseconds, unit: 'ms')); + properties.add(IntProperty( + 'reverseDuration', reverseDuration?.inMilliseconds, + unit: 'ms', defaultValue: null)); + } +} + +class _TolyCollapseState extends State + with TickerProviderStateMixin { + late AnimationController _controller; + late Animation _firstAnimation; + late Animation _secondAnimation; + + CollapseController? _internalController; + + CollapseController get _collapseCtrl => + widget.controller ?? _internalController!; + + @override + void initState() { + super.initState(); + if (widget.controller == null) { + _internalController = CollapseController(); + } + _collapseCtrl._attach(this); + _controller = AnimationController( + duration: widget.duration, + reverseDuration: widget.reverseDuration, + vsync: this, + ); + // if (widget.crossFadeState == CrossFadeState.showSecond) { + // _controller.value = 1.0; + // } + _firstAnimation = _initAnimation(Curves.linear, true); + _secondAnimation = _initAnimation(widget.opacityCurve, false); + _controller.addStatusListener((AnimationStatus status) { + setState(() { + // Trigger a rebuild because it depends on _isTransitioning, which + // changes its value together with animation status. + }); + }); + } + + Animation _initAnimation(Curve curve, bool inverted) { + Animation result = _controller.drive(CurveTween(curve: curve)); + if (inverted) { + result = result.drive(Tween(begin: 1.0, end: 0.0)); + } + return result; + } + + @override + void dispose() { + _controller.dispose(); + _collapseCtrl._detach(this); + super.dispose(); + } + + @override + void didUpdateWidget(TolyCollapse oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.duration != oldWidget.duration) { + _controller.duration = widget.duration; + } + if (widget.reverseDuration != oldWidget.reverseDuration) { + _controller.reverseDuration = widget.reverseDuration; + } + if (widget.opacityCurve != oldWidget.opacityCurve) { + _secondAnimation = _initAnimation(widget.opacityCurve, false); + } + } + + /// Whether we're in the middle of cross-fading this frame. + bool get _isTransitioning => + _controller.status == AnimationStatus.forward || + _controller.status == AnimationStatus.reverse; + + bool get _isOpen => _controller.value == 1.0; + + @override + Widget build(BuildContext context) { + const Key closeKey = ValueKey(false); + const Key openKey = ValueKey(true); + final bool transitioningForwards = + _controller.status == AnimationStatus.completed || + _controller.status == AnimationStatus.forward; + final Key topKey; + Widget topChild; + final Animation topAnimation; + final Key bottomKey; + Widget bottomChild; + final Animation bottomAnimation; + if (transitioningForwards) { + topKey = openKey; + topChild = Align( + alignment: Alignment.topLeft, + child: Padding(padding: widget.contentPadding, child: widget.content), + ); + topAnimation = _secondAnimation; + bottomKey = closeKey; + bottomChild = Container( + height: 0, + ); + bottomAnimation = _firstAnimation; + } else { + topKey = closeKey; + topChild = Container( + height: 0, + ); + topAnimation = _firstAnimation; + bottomKey = openKey; + bottomChild = Align( + alignment: Alignment.topLeft, + child: Padding( + padding: widget.contentPadding, + child: widget.content, + ), + ); + bottomAnimation = _secondAnimation; + } + + bottomChild = TickerMode( + key: bottomKey, + enabled: _isTransitioning, + child: IgnorePointer( + child: ExcludeSemantics( + // Always exclude the semantics of the widget that's fading out. + child: ExcludeFocus( + excluding: widget.excludeBottomFocus, + child: FadeTransition( + opacity: bottomAnimation, + child: bottomChild, + ), + ), + ), + ), + ); + topChild = TickerMode( + key: topKey, + enabled: true, // Top widget always has its animations enabled. + child: IgnorePointer( + ignoring: false, + child: ExcludeSemantics( + excluding: false, + // Always publish semantics for the widget that's fading in. + child: ExcludeFocus( + excluding: false, + child: FadeTransition( + opacity: topAnimation, + child: topChild, + ), + ), + ), + ), + ); + Widget title; + if (widget.titleBuilder != null) { + title = widget.titleBuilder!(context, _controller, _collapseCtrl); + } else { + title = GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _toggleCodePanel(); + }, + child: Row( + children: [ + Expanded( + child: Padding( + padding: widget.titlePadding, + child: widget.title, + )), + Spacer(), + AnimatedBuilder( + animation: _controller, + builder: (_, child) => Transform.rotate( + angle: pi * _controller.value, + child: child, + ), + child: const Icon(Icons.expand_more)) + ], + )); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title, + ClipRect( + child: AnimatedSize( + alignment: widget.alignment, + duration: widget.duration, + reverseDuration: widget.reverseDuration, + curve: widget.sizeCurve, + child: + defaultLayoutBuilder(topChild, topKey, bottomChild, bottomKey), + ), + ), + ], + ); + } + + Widget defaultLayoutBuilder(Widget topChild, Key topChildKey, + Widget bottomChild, Key bottomChildKey) { + return Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + key: bottomChildKey, + left: 0.0, + top: 0.0, + right: 0.0, + child: bottomChild, + ), + Positioned( + key: topChildKey, + child: topChild, + ), + ], + ); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder description) { + super.debugFillProperties(description); + // description.add(EnumProperty('crossFadeState', widget.crossFadeState)); + description.add(DiagnosticsProperty( + 'controller', _controller, + showName: false)); + description.add(DiagnosticsProperty( + 'alignment', widget.alignment, + defaultValue: Alignment.topCenter)); + } + + void _close() { + widget.onClose?.call(); + _controller.reverse(); + } + + void _open() { + widget.onOpen?.call(); + _controller.forward(); + } + + // 折叠代码面板 + void _toggleCodePanel() { + if (_isOpen) { + _close(); + } else { + _open(); + } + } +} + +class CollapseController { + _TolyCollapseState? _state; + + bool get isOpen { + assert(_state != null); + return _state!._isOpen; + } + + void toggle() { + if (isOpen) { + close(); + } else { + open(); + } + } + + void close() { + assert(_state != null); + _state!._close(); + } + + void open() { + assert(_state != null); + _state!._open(); + } + + void _attach(_TolyCollapseState state) { + _state = state; + } + + void _detach(_TolyCollapseState state) { + if (_state == state) { + _state = null; + } + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart new file mode 100644 index 00000000..8dc8f032 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:widget_module/data/model/model.dart'; +import 'package:widget_module/views/mobile/widget_detail/node_display/code_display.dart'; +import 'package:widgets/widgets.dart'; + +import 'node_title.dart'; + +class NodeDisplay extends StatelessWidget { + final NodeModel node; + final int nodeIndex; + final WidgetModel widget; + final HighlighterStyle style; + + const NodeDisplay({ + super.key, + required this.node, + required this.nodeIndex, + required this.style, + required this.widget, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + NodeTitle( + text: node.name, + ), + const SizedBox(height: 10), + CodeDisplay(display: mapNode(node), code: node.code, style: style), + if(!widget.death) + _buildNodeInfo(), + ], + ), + ); + } + Widget _buildNodeInfo() => Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: SizedBox( + width: double.infinity, + child: Panel( + color: Colors.cyanAccent.withOpacity(0.05), + child: Text( + node.subtitle, + style: const TextStyle(fontSize: 12), + )), + ), + ); + Widget mapNode(NodeModel node){ + NodeType type = node.type(widget.name); + Widget display = WidgetsMap.map(widget.name)[nodeIndex]; + return switch(type){ + NodeType.display => display, + NodeType.newPage => newPageDisplay(display), + NodeType.description => display, + NodeType.deprecated => display, + }; + } + + + Widget newPageDisplay(Widget page){ + return Builder( + builder:(ctx) => ElevatedButton( + onPressed: () { + Navigator.of(ctx).push(MaterialPageRoute(builder: (_)=>page)); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(Icons.open_in_new,size: 16,), + Text('新界面打开'), + ],), + style: FillButtonPalette( + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart new file mode 100644 index 00000000..f285fb65 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_title.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:toly_ui/toly_ui.dart'; + +class NodeTitle extends StatelessWidget { + final String text; + const NodeTitle({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + + return Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Circle( + color: Theme.of(context).primaryColor, + radius: 5, + ), + ), + Expanded( + child: Text( + text, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + ), + ), + ], + ); + } +} + +class LinkedButton extends StatelessWidget { + const LinkedButton({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} + + diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 80ff4a3c..75b8e64d 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -8,6 +8,7 @@ import 'package:l10n/l10n.dart'; import '../../../data/zone.dart'; import '../../desk_ui/widget_detail/link_widget_buttons.dart'; +import 'node_display/node_display.dart'; import 'widget_node_panel.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -86,7 +87,7 @@ class WidgetDetailPage extends StatelessWidget { links: state.links, onSelect: bloc.push, ), - const Divider(), + // const Divider(), ], ), ), @@ -109,14 +110,11 @@ class WidgetDetailPage extends StatelessWidget { AppConfig globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( - (_, i) => WidgetNodePanel( - codeStyle: globalState.codeStyle, - codeFamily: 'Inconsolata', - text: nodes[i].name, - subText: nodes[i].subtitle, - code: nodes[i].code, - death: model.death, - show: WidgetsMap.map(model.name)[i], + (_, i) => NodeDisplay( + node: nodes[i], + nodeIndex: i, + style: globalState.codeStyle, + widget: model, ), childCount: nodes.length, )); diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart index b57c9bb1..84b593af 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart @@ -11,16 +11,10 @@ class WidgetDetailPanel extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, + return Row( children: [ - Row( - children: [ - _buildLeft(model, context), - _buildRight(model), - ], - ), - const Divider(), + _buildLeft(model, context), + _buildRight(model), ], ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart index 67029e60..c886ea4f 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_node_panel.dart @@ -104,6 +104,8 @@ class _WidgetNodePanelState extends State { ), ); + + Widget _buildShareButton() => FeedbackWidget( mode: FeedMode.fade, a: 0.4, diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index 19c9c8cb..8d9a0b6a 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -48,10 +48,21 @@ class StandardHomeSearch extends StatelessWidget return InputDecoration( filled: true, fillColor: isDark ? const Color(0xff292929) : const Color(0xffF3F6F9), - prefixIcon: const Icon(Icons.search, color: Colors.grey), + prefixIcon: const Icon( + Icons.search, + color: Colors.grey, + size: 20, + ), + + prefixIconConstraints: const BoxConstraints( + maxHeight: 24, + minWidth: 36 + ), + isCollapsed: true, + contentPadding: const EdgeInsets.only(top: 4,bottom: 4,right: 8), border: const UnderlineInputBorder( borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(35 / 2)), + borderRadius: BorderRadius.all(Radius.circular(6)), ), hintText: hintText, hintStyle: const TextStyle(fontSize: 14)); diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml index 14f2602c..228d43f2 100644 --- a/modules/widget_system/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: wrapper: ^1.0.2 share_plus: ^10.0.1 # 文字分享 go_router: ^14.2.0 - + tolyui: ^0.0.2+15 storage: path: ../../basic_system/storage toly_ui: diff --git a/modules/widget_system/widgets/.gitignore b/modules/widget_system/widgets/.gitignore index 96486fd9..a17a495d 100644 --- a/modules/widget_system/widgets/.gitignore +++ b/modules/widget_system/widgets/.gitignore @@ -28,3 +28,4 @@ migrate_working_dir/ .dart_tool/ .packages build/ +example/ \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json index b3f47f79..5dc8af0c 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_zh-CN.json @@ -11,7 +11,7 @@ ], "nodes": [ { - "file": "node1_base.dart", + "file": "node_01.dart", "name": "Column基本使用", "desc": [ "【children】 : 组件列表 【List】", diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart similarity index 93% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart index 3192da8c..5007ad3d 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -class CustomColumn extends StatelessWidget { - const CustomColumn({Key? key}) : super(key: key); +class ColumnNode1 extends StatelessWidget { + const ColumnNode1({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json index 9590d8d5..20f89055 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_zh-CN.json @@ -11,7 +11,7 @@ ], "nodes": [ { - "file": "node1_base.dart", + "file": "node_01.dart", "name": "CustomMultiChildLayout基本使用", "desc": [ "【children】 : 子组件集 【List】", diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart similarity index 95% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart index 965f3ce0..136fdf64 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; -class CustomMultiChildLayoutDemo extends StatelessWidget { - const CustomMultiChildLayoutDemo({Key? key}) : super(key: key); +class CustomMultiChildLayoutNode1 extends StatelessWidget { + const CustomMultiChildLayoutNode1({Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json index a117a24f..f4dc4817 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_zh-CN.json @@ -14,7 +14,7 @@ ], "nodes": [ { - "file": "node1_direction.dart", + "file": "node_01.dart", "name": "Flex的排布方向", "desc": [ "【children】 : 组件列表 【List】", @@ -22,28 +22,28 @@ ] }, { - "file": "node2_mainAxisAlignment.dart", + "file": "node_02.dart", "name": "Flex主轴对齐方式", "desc": [ "【mainAxisAlignment】 : 主轴对齐 【MainAxisAlignment】" ] }, { - "file": "node3_crossAxisAlignment.dart", + "file": "node_03.dart", "name": "Flex交叉轴对齐方式", "desc": [ "【crossAxisAlignment】 : 交叉轴对齐 【CrossAxisAlignment】" ] }, { - "file": "node4_verticalDirection.dart", + "file": "node_04.dart", "name": "Flex垂直方向顺序", "desc": [ "【verticalDirection】 : 垂直方向顺序 【VerticalDirection】" ] }, { - "file": "node5_textDirection.dart", + "file": "node_05.dart", "name": "Flex水平方向顺序", "desc": [ "【textDirection】 : 水平方向顺序 【TextDirection】" diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart similarity index 93% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart index 9e71c71b..f263cc9c 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node1_direction.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -class DirectionFlex extends StatelessWidget { - DirectionFlex({Key? key}) : super(key: key); +class FlexNode1 extends StatelessWidget { + FlexNode1({Key? key}) : super(key: key); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart similarity index 92% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart index bf0be812..45991fdc 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -class MainAxisAlignmentFlex extends StatelessWidget { - MainAxisAlignmentFlex({Key? key}) : super(key: key); +class FlexNode2 extends StatelessWidget { + FlexNode2({Key? key}) : super(key: key); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart similarity index 93% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart index 4bb82235..20af4c52 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -class CrossAxisAlignmentFlex extends StatelessWidget { - CrossAxisAlignmentFlex({Key? key}) : super(key: key); +class FlexNode3 extends StatelessWidget { + FlexNode3({Key? key}) : super(key: key); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart similarity index 92% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart index 912c7888..23adfb7e 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -class VerticalDirectionFlex extends StatelessWidget { - VerticalDirectionFlex({Key? key}) : super(key: key); +class FlexNode4 extends StatelessWidget { + FlexNode4({Key? key}) : super(key: key); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart similarity index 93% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart index b84de742..e0a4e322 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node5_textDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/4/30 /// contact me by email 1981462002@qq.com -class TextDirectionFlex extends StatelessWidget { - TextDirectionFlex({Key? key}) : super(key: key); +class FlexNode5 extends StatelessWidget { + FlexNode5({Key? key}) : super(key: key); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart deleted file mode 100644 index 1d70d95a..00000000 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/zz_node_play.dart +++ /dev/null @@ -1,188 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020/4/30 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PlayFlex extends StatefulWidget { - const PlayFlex({Key? key}) : super(key: key); - - @override - _PlayFlexState createState() => _PlayFlexState(); -} - -class _PlayFlexState extends State { - final Widget redBox = Container( - color: Colors.red, - height: 50, - width: 50, - ); - final Widget blueBox = Container( - color: Colors.blue, - width: 60, - height: 60, - ); - final Widget yellowBox = Container( - color: Colors.yellow, - height: 10, - width: 10, - ); - final Widget greenBox = Container( - color: Colors.green, - height: 30, - width: 20, - ); - Axis _direction = Axis.horizontal; - MainAxisAlignment _mainAxisAlignment = MainAxisAlignment.start; - CrossAxisAlignment _crossAxisAlignment = CrossAxisAlignment.center; - VerticalDirection _verticalDirection = VerticalDirection.up; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildDirectionSelector(), - _buildMainAxisAlignmentSelector(), - _buildCrossAxisAlignmentSelector(), - _buildVerticalDirectionSelector(), - Container( - width: 300, - height: 300 * 0.618, - color: Colors.grey.withAlpha(33), - child: Flex( - textBaseline: TextBaseline.alphabetic, - direction: _direction, - mainAxisAlignment: _mainAxisAlignment, - crossAxisAlignment: _crossAxisAlignment, - verticalDirection: _verticalDirection, - children: [redBox, blueBox, yellowBox, greenBox], - ), - ), - ], - ); - } - - Widget _buildDirectionSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "direction", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _direction, - items: Axis.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString()), - )) - .toList(), - onChanged: (e) { - setState(() { - _direction = e??_direction; - }); - }), - ], - ), - ); - } - - Widget _buildMainAxisAlignmentSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "mainAxisAlignment", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _mainAxisAlignment, - items: MainAxisAlignment.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _mainAxisAlignment = e??_mainAxisAlignment; - }); - }), - ], - ), - ); - } - - Widget _buildCrossAxisAlignmentSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "crossAxisAlignment", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _crossAxisAlignment, - items: CrossAxisAlignment.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _crossAxisAlignment = e??_crossAxisAlignment; - }); - }), - ], - ), - ); - } - - Widget _buildVerticalDirectionSelector() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - "MainAxisSize", - style: TextStyle( - fontSize: 16, color: Colors.blue, fontWeight: FontWeight.bold), - ), - DropdownButton( - elevation: 1, - underline: Container(), - value: _verticalDirection, - items: VerticalDirection.values - .map((e) => DropdownMenuItem( - value: e, - child: Text(e.toString().split('.')[1]), - )) - .toList(), - onChanged: (e) { - setState(() { - _verticalDirection = e??_verticalDirection; - }); - }), - ], - ), - ); - } -} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json index 3e80aece..d448bc13 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_zh-CN.json @@ -11,7 +11,7 @@ ], "nodes": [ { - "file": "node1_base.dart", + "file": "node_01.dart", "name": "Flow圆形排布", "desc": [ "【children】 : 组件列表 【List】", @@ -19,7 +19,7 @@ ] }, { - "file": "node2_anim.dart", + "file": "node_02.dart", "name": "Flow圆形与动画结合", "desc": [ "通过动画来更改周围组件的位置实现效果" diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart similarity index 94% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart index 295349b1..27a83c1e 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -class CircleFlow extends StatelessWidget { - CircleFlow({Key? key}) : super(key: key); +class FlowNode1 extends StatelessWidget { + FlowNode1({Key? key}) : super(key: key); final List data = List.generate( 16, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart similarity index 91% rename from modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart rename to modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart index a0af7cdc..f25aad49 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node2_anim.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart @@ -4,8 +4,7 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com - -class BurstFlow extends StatefulWidget { +class FlowNode02 extends StatefulWidget { static final data = List.generate( 16, (index) => index.isEven @@ -15,7 +14,7 @@ class BurstFlow extends StatefulWidget { width: 300, height: 300, alignment: Alignment.center, - child: BurstFlow( + child: FlowNode02( children: data .map((e) => CircleAvatar(backgroundImage: AssetImage(e))) .toList(), @@ -26,13 +25,13 @@ class BurstFlow extends StatefulWidget { final List children; final Widget menu; - const BurstFlow({Key? key, required this.children, required this.menu}) : super(key: key); + const FlowNode02({Key? key, required this.children, required this.menu}) : super(key: key); @override - _BurstFlowState createState() => _BurstFlowState(); + State createState() => _FlowNode02State(); } -class _BurstFlowState extends State +class _FlowNode02State extends State with SingleTickerProviderStateMixin { late AnimationController _controller; double _rad = 0.0; diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart index b703c1ef..aa33f43c 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/node1_base.dart @@ -3,14 +3,14 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com -class CustomIndexedStack extends StatefulWidget { - const CustomIndexedStack({Key? key}) : super(key: key); +class IndexedStackNode01 extends StatefulWidget { + const IndexedStackNode01({Key? key}) : super(key: key); @override - _CustomIndexedStackState createState() => _CustomIndexedStackState(); + State createState() => _IndexedStackNode01State(); } -class _CustomIndexedStackState extends State { +class _IndexedStackNode01State extends State { int _index = 1; @override diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json new file mode 100644 index 00000000..86f2cae4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "固定头部滑片", + "info": "一个可以停留在视口上部的滑片, 可轻松完成吸顶效果。", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 官方案例", + "display": "new_page", + "desc": [ + "【child】 : 子组件 【Widget?】", + "PinnedHeaderSliver 只能用在滚动视口中,其中子组件在滑动到顶部时,不会移出视口,从而会停留在视口上方。" + ] + }, + { + "file": "node_02.dart", + "name": "标题吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题吸顶效果,注意看下方的分隔线也有吸顶效果哦。" + ] + }, + { + "file": "node_03.dart", + "name": "标题+搜索吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题+搜索框的吸顶效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart new file mode 100644 index 00000000..ec018062 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_01.dart @@ -0,0 +1,115 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + + +class PinnedHeaderSliverNode1 extends StatefulWidget { + const PinnedHeaderSliverNode1({ super.key }); + + @override + State createState() => _PinnedHeaderSliverNode1State(); +} + +class _PinnedHeaderSliverNode1State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + final Widget header = Container( + color: colorScheme.surface, + padding: const EdgeInsets.all(4), + child: Material( + color: colorScheme.primaryContainer, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + width: 7, + color: colorScheme.outline, + ), + ), + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 48), + child: Text( + count.isOdd ? 'Alternative Title\nWith Two Lines' : 'PinnedHeaderSliver', + style: theme.textTheme.headlineMedium!.copyWith( + color: colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ); + + return Scaffold( + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: + CustomScrollView( + controller: scrollController, + slivers: [ + PinnedHeaderSliver(child: header), + const _ItemList(), + ], + ), + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + setState(() { + count += 1; + }); + }, + child: const Icon(Icons.add), + ), + ); + } +} + +// A placeholder SliverList of 25 items. +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return Card( + color: colorScheme.onSecondary, + child: ListTile( + textColor: colorScheme.secondary, + title: Text('Item $index'), + ), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart new file mode 100644 index 00000000..a3c26c8a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_02.dart @@ -0,0 +1,109 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PinnedHeaderSliverNode2 extends StatefulWidget { + const PinnedHeaderSliverNode2({super.key}); + + @override + State createState() => _PinnedHeaderSliverNode2State(); +} + +class _PinnedHeaderSliverNode2State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + return Scaffold( + backgroundColor: Colors.white, + body: + CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + const PinnedHeaderSliver(child: Divider()), + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon ); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } +} + +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart new file mode 100644 index 00000000..6028b1f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/node_03.dart @@ -0,0 +1,161 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PinnedHeaderSliverNode3 extends StatefulWidget { + const PinnedHeaderSliverNode3({super.key}); + + @override + State createState() => _PinnedHeaderSliverNode3State(); +} + +class _PinnedHeaderSliverNode3State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + return Scaffold( + backgroundColor: Colors.white, + body: CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + _buildSliverSearch(), + +// PinnedHeaderSliver(child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 12.0), +// child: TextField( +// decoration: InputDecoration( +// filled: true, +// fillColor: Colors.white, +// border: InputBorder.none +// ), +// ), +// )), + + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } + + Widget _buildSliverSearch() { + BoxDecoration decoration = BoxDecoration( + color: const Color(0xffefeff1), borderRadius: BorderRadius.circular(6)); + Widget prefix = const Padding( + padding: EdgeInsets.only(left: 8.0), + child: Icon(CupertinoIcons.search, size: 20, color: Color(0xff808082)) + ); + return PinnedHeaderSliver( + child: ColoredBox( + color: Colors.white, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0, right: 12, left: 12), + child: CupertinoTextField( + readOnly: true, + placeholder: '搜索', + onTap: _toSearchPage, + decoration: decoration, + prefix:prefix, + style: const TextStyle(fontSize: 14), + placeholderStyle: const TextStyle(color: Color(0xff808082)), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + ), + ), + const Divider(), + ], + ), + )); + } + + void _toSearchPage() { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => Scaffold(appBar: AppBar(title: const Text('SearchPage')))), + ); + } +} + +// A placeholder SliverList of 25 items. +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme + .of(context) + .colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json index 14433161..a72aae22 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_zh-CN.json @@ -1,8 +1,8 @@ { "id": 190, "name": "SliverPersistentHeader", - "localName": "Sliver存留头", - "info": "通常用于CustomScrollView中,可以让一个组件在滑动中停留在顶部,不会滑动消失。", + "localName": "吸顶滑片", + "info": "通常用于 CustomScrollView 中,可以让一个组件在滑动中停留在顶部,不会滑动消失。", "lever": 5, "family": 4, "linkIds": [], diff --git a/modules/widget_system/widgets/lib/exp/render_object_unit.dart b/modules/widget_system/widgets/lib/exp/render_object_unit.dart index 6f1d694f..236af324 100644 --- a/modules/widget_system/widgets/lib/exp/render_object_unit.dart +++ b/modules/widget_system/widgets/lib/exp/render_object_unit.dart @@ -1,14 +1,14 @@ library render_object_widget; -export '../MultiChildRenderObjectWidget/Flex/node1_direction.dart'; -export '../MultiChildRenderObjectWidget/Flex/node2_mainAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Flex/node3_crossAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Flex/node4_verticalDirection.dart'; -export '../MultiChildRenderObjectWidget/Flex/node5_textDirection.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_02.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_03.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_04.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_05.dart'; -export '../MultiChildRenderObjectWidget/Flow/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Flow/node2_anim.dart'; +export '../MultiChildRenderObjectWidget/Flow/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flow/node_02.dart'; export '../MultiChildRenderObjectWidget/RichText/node1_base.dart'; export '../MultiChildRenderObjectWidget/RichText/node2_widget.dart'; export '../MultiChildRenderObjectWidget/Stack/node1_base.dart'; @@ -18,10 +18,10 @@ export '../MultiChildRenderObjectWidget/Wrap/node2_alignment.dart'; export '../MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart'; export '../MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart'; export '../MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart'; -export '../MultiChildRenderObjectWidget/Column/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Column/node_01.dart'; export '../MultiChildRenderObjectWidget/IndexedStack/node1_base.dart'; export '../MultiChildRenderObjectWidget/Row/node1_base.dart'; -export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node1_base.dart'; +export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart'; export '../MultiChildRenderObjectWidget/Viewport/node1_base.dart'; export '../MultiChildRenderObjectWidget/ListBody/node1_base.dart'; export '../MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart'; diff --git a/modules/widget_system/widgets/lib/exp/sliver_unit.dart b/modules/widget_system/widgets/lib/exp/sliver_unit.dart index 5e235960..e8d0ac17 100644 --- a/modules/widget_system/widgets/lib/exp/sliver_unit.dart +++ b/modules/widget_system/widgets/lib/exp/sliver_unit.dart @@ -30,3 +30,6 @@ export '../Sliver/SliverConstrainedCrossAxis/node1.dart'; export '../Sliver/SliverCrossAxisExpanded/node1.dart'; export '../Sliver/SliverCrossAxisGroup/node1.dart'; export '../Sliver/SliverMainAxisGroup/node1.dart'; +export '../Sliver/PinnedHeaderSliver/node_01.dart'; +export '../Sliver/PinnedHeaderSliver/node_02.dart'; +export '../Sliver/PinnedHeaderSliver/node_03.dart'; diff --git a/modules/widget_system/widgets/lib/widgets_map.dart b/modules/widget_system/widgets/lib/widgets_map.dart index 50f0a0c0..94e2f3d4 100644 --- a/modules/widget_system/widgets/lib/widgets_map.dart +++ b/modules/widget_system/widgets/lib/widgets_map.dart @@ -27,6 +27,12 @@ class WidgetsMap { const DropdownMenuNode2(), const DropdownMenuNode3(), ]; + case "PinnedHeaderSliver": + return [ + const PinnedHeaderSliverNode1(), + const PinnedHeaderSliverNode2(), + const PinnedHeaderSliverNode3(), + ]; case "CupertinoSegmentedControl": return [ const CupertinoSegmentedControlDemo(), @@ -606,7 +612,7 @@ class WidgetsMap { ]; case "CustomMultiChildLayout": return [ - const CustomMultiChildLayoutDemo(), + const CustomMultiChildLayoutNode1(), ]; case "LayoutId": return [ @@ -868,11 +874,11 @@ class WidgetsMap { ]; case "Flex": return [ - DirectionFlex(), - MainAxisAlignmentFlex(), - CrossAxisAlignmentFlex(), - VerticalDirectionFlex(), - TextDirectionFlex(), + FlexNode1(), + FlexNode2(), + FlexNode3(), + FlexNode4(), + FlexNode5(), ]; case "Row": return [ @@ -880,7 +886,7 @@ class WidgetsMap { ]; case "Column": return [ - const CustomColumn(), + const ColumnNode1(), ]; case "Stack": return [const CustomStack(), const PositionedStack()]; @@ -894,8 +900,8 @@ class WidgetsMap { ]; case "Flow": return [ - CircleFlow(), - BurstFlow.show, + FlowNode1(), + FlowNode02.show, ]; case "AnimatedCrossFade": return [ @@ -1165,7 +1171,7 @@ class WidgetsMap { ]; case "IndexedStack": return [ - const CustomIndexedStack(), + const IndexedStackNode01(), ]; case "ListView": return [ diff --git a/pubspec.lock b/pubspec.lock index 0f69da9d..0dd6860d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -322,10 +322,10 @@ packages: dependency: transitive description: name: fx_platform_adapter - sha256: "04b954f658e1c380abf11dee93265396147f953f5b02cbf9621c7fddab21f9c3" + sha256: da5920bc99ef7f732d04742c2556702376e717bb0c0b8daa56840127d133c206 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2" + version: "0.0.2+1" go_router: dependency: "direct main" description: @@ -985,10 +985,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.flutter-io.cn/" source: hosted - version: "14.2.4" + version: "14.2.5" web: dependency: transitive description: From 0f3968322f92b461a198b1f57e93cb367907798d Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Sep 2024 19:42:35 +0800 Subject: [PATCH 098/149] fix:tolyui version --- modules/knowledge_system/algorithm/pubspec.yaml | 2 +- modules/knowledge_system/layout/pubspec.yaml | 2 +- modules/widget_system/widget_module/pubspec.yaml | 2 +- pubspec.lock | 12 ++++++++++-- pubspec.yaml | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/knowledge_system/algorithm/pubspec.yaml b/modules/knowledge_system/algorithm/pubspec.yaml index ea61b3e6..294ccfc5 100644 --- a/modules/knowledge_system/algorithm/pubspec.yaml +++ b/modules/knowledge_system/algorithm/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter: sdk: flutter # tolyui - tolyui: ^0.0.2+15 + tolyui: 0.0.2+19 fx_go_router_ext: 0.0.2 diff --git a/modules/knowledge_system/layout/pubspec.yaml b/modules/knowledge_system/layout/pubspec.yaml index 22110061..834ee78b 100644 --- a/modules/knowledge_system/layout/pubspec.yaml +++ b/modules/knowledge_system/layout/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter # tolyui - tolyui: ^0.0.2+15 + tolyui: 0.0.2+19 # 路由管理 go_router: ^14.2.0 diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml index 228d43f2..18886ecd 100644 --- a/modules/widget_system/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: wrapper: ^1.0.2 share_plus: ^10.0.1 # 文字分享 go_router: ^14.2.0 - tolyui: ^0.0.2+15 + tolyui: 0.0.2+19 storage: path: ../../basic_system/storage toly_ui: diff --git a/pubspec.lock b/pubspec.lock index 0dd6860d..9a221a7c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -843,10 +843,18 @@ packages: dependency: "direct main" description: name: tolyui - sha256: f88af1cabd06d0eb2df989abac9bfc37f1ad76d273cc9f8d9109cc163205fe48 + sha256: bbe7335016275812ba28120ee5115a6c4ad15a1b17ebb21c6e3ebd8b364bcb50 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2+15" + version: "0.0.2+19" + tolyui_color: + dependency: transitive + description: + name: tolyui_color + sha256: "410c378344d47a5f170e70a78cc1ac6a4f2665ea40f02c9aaa67da4072fde0e1" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.1" tolyui_feedback: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index edaa6f8e..964903c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: connectivity_plus: ^6.0.3 # tolyui - tolyui: ^0.0.2+15 + tolyui: 0.0.2+19 l10n: path: modules/basic_system/l10n From 8b487597ffcc3daa02e4f24e8a2db614cf7a0e7c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 29 Sep 2024 09:42:07 +0800 Subject: [PATCH 099/149] update windows widget detail ui --- .../widget_detail/widget_detail_page.dart | 30 +++++++++++++------ .../node_display/node_display.dart | 7 +++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index c29c773f..0b531d0b 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -10,6 +10,7 @@ import '../../../../data/zone.dart'; import 'package:widgets/widgets.dart'; import '../../mobile/widget_detail/category_end_drawer.dart'; +import '../../mobile/widget_detail/node_display/node_display.dart'; import 'link_widget_buttons.dart'; import 'widget_detail_bar.dart'; import 'widget_detail_panel.dart'; @@ -76,6 +77,7 @@ class DeskWidgetDetailPage extends StatelessWidget { return BlocBuilder( builder: (_, state) => Scaffold( + backgroundColor: Colors.white, endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), body: Builder(builder: (ctx) { return _buildContent(ctx, bloc); @@ -155,15 +157,25 @@ class DeskWidgetDetailPage extends StatelessWidget { return SliverList( delegate: SliverChildBuilderDelegate( - (_, i) => DeskWidgetNodePanel( - codeStyle: globalState.codeStyle, - codeFamily: 'Inconsolata', - text: nodes[i].name, - subText: nodes[i].subtitle, - code: nodes[i].code, - death: model.death, - show: WidgetsMap.map(model.name)[i], - ), + (_, i) => + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: NodeDisplay( + node: nodes[i], + nodeIndex: i, + style: globalState.codeStyle, + widget: model, + ), + ), + // DeskWidgetNodePanel( + // codeStyle: globalState.codeStyle, + // codeFamily: 'Inconsolata', + // text: nodes[i].name, + // subText: nodes[i].subtitle, + // code: nodes[i].code, + // death: model.death, + // show: WidgetsMap.map(model.name)[i], + // ), childCount: nodes.length, )); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart index 8dc8f032..6de9f4c3 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart @@ -23,6 +23,7 @@ class NodeDisplay extends StatelessWidget { @override Widget build(BuildContext context) { + Color primaryColor = Theme.of(context).primaryColor; return Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -33,17 +34,17 @@ class NodeDisplay extends StatelessWidget { const SizedBox(height: 10), CodeDisplay(display: mapNode(node), code: node.code, style: style), if(!widget.death) - _buildNodeInfo(), + _buildNodeInfo(primaryColor), ], ), ); } - Widget _buildNodeInfo() => Padding( + Widget _buildNodeInfo(Color primaryColor) => Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: SizedBox( width: double.infinity, child: Panel( - color: Colors.cyanAccent.withOpacity(0.05), + color: primaryColor.withOpacity(0.04), child: Text( node.subtitle, style: const TextStyle(fontSize: 12), From 3d78daac4cc93fba2475f2f90165edda507d7b8c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 9 Oct 2024 09:03:18 +0800 Subject: [PATCH 100/149] =?UTF-8?q?=E5=B8=83=E5=B1=80=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E9=9B=86=E9=94=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/src/data/display_map/display_map.dart | 3 ++ .../lib/src/data/display_map/multi.dart | 19 +++++++++ .../lib/src/navigation/menu/scroll.dart | 5 +++ .../src/navigation/router/desk_router.dart | 40 +++--------------- .../scroll/grid_view/grid_view_demo01.dart | 41 +++++++++++++++++++ .../scroll/list_view/list_view_demo01.dart | 21 ++++++++++ .../lib/src/fun/stemp/stamp_paper.dart | 2 +- 7 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart create mode 100644 modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart index b6aa8f12..247fb57a 100644 --- a/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart +++ b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart @@ -21,6 +21,9 @@ Map> get kDisplayMap => { '/multi/wrap': multiWrap, '/multi/stack': multiStack, + '/scroll/list': listView, + '/scroll/grid': gridView, + '/funny/elevator':funnyElevator, // '/popable/DropdownButton': [ diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart index 4e123b32..a5346209 100644 --- a/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart +++ b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart @@ -14,6 +14,8 @@ import '../../views/multi/flex/column_show.dart'; import '../../views/playground/view/flex/flex_playground.dart'; import '../../views/multi/flex/row_show.dart'; import '../../views/playground/view/wrap/wrap_playground.dart'; +import '../../views/scroll/grid_view/grid_view_demo01.dart'; +import '../../views/scroll/list_view/list_view_demo01.dart'; import '../model/display_frame.dart'; List get multiFlex => [ @@ -55,3 +57,20 @@ List get multiStack => [ ), ]; +List get listView => [ + DisplayFrame( + title: 'ListView 滑动列表', + desc: "通过 ListView.builder 构造,可以实现按需加载的滑动视图。", + src: '', + display: (BuildContext context) => ListViewDemo01(), + ), +]; + +List get gridView => [ + DisplayFrame( + title: 'GridView 滑动网格', + desc: "通过 GridView.builder 构造,可以实现按需加载的网格滑动视图。", + src: '', + display: (BuildContext context) => GridViewDemo01(), + ), +]; diff --git a/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart b/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart index e9d9ee40..cef50dea 100644 --- a/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart +++ b/modules/knowledge_system/layout/lib/src/navigation/menu/scroll.dart @@ -16,5 +16,10 @@ Map get calcMenus => { 'label': '网格布局', // 'icon': Icons.grid_on_sharp, }, + { + 'path': '/page', + 'label': '滑页布局', + // 'icon': Icons.grid_on_sharp, + }, ] }; diff --git a/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart b/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart index 8cc7df44..a92d6202 100644 --- a/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart +++ b/modules/knowledge_system/layout/lib/src/navigation/router/desk_router.dart @@ -25,6 +25,12 @@ RouteBase get deskNavRoute => ShellRoute( return const FrameDisplayPanel(); }, ), + GoRoute( + path: 'scroll/:name', + builder: (BuildContext context, GoRouterState state) { + return const FrameDisplayPanel(); + }, + ), GoRoute( path: 'popable/:name', builder: (BuildContext context, GoRouterState state) { @@ -36,40 +42,6 @@ RouteBase get deskNavRoute => ShellRoute( builder: (BuildContext context, GoRouterState state) { return const FrameDisplayPanel(); }, - // builder: (_,__)=>Text("暂未实现"), - // routes: [ - // GoRoute( - // path: 'row', - // builder: (BuildContext context, GoRouterState state) { - // return TextShow( - // info: 'row', - // ); - // }, - // ), - // GoRoute( - // path: 'column', - // builder: (BuildContext context, GoRouterState state) { - // return TextShow( - // info: 'column', - // ); - // }, - // ), GoRoute( - // path: 'expanded', - // builder: (BuildContext context, GoRouterState state) { - // return TextShow( - // info: 'expanded', - // ); - // }, - // ), - // GoRoute( - // path: 'holy', - // builder: (BuildContext context, GoRouterState state) { - // return TextShow( - // info: 'holy', - // ); - // }, - // ), - // ] ), GoRoute( path: 'funny/:name', diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart new file mode 100644 index 00000000..f69c8248 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/grid_view/grid_view_demo01.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class GridViewDemo01 extends StatelessWidget { + GridViewDemo01({super.key}); + + final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: GridView.count( + crossAxisCount: 4, + mainAxisSpacing: 2, + crossAxisSpacing: 2, + childAspectRatio: 1 / 0.618, + children: data.map((color) => _buildItem(color)).toList(), + ), + ); + } + + Container _buildItem(Color color) => Container( + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), + style: const TextStyle( + color: Colors.white, + shadows: [ + Shadow(color: Colors.black, offset: Offset(.5, .5), blurRadius: 2) + ], + ), + ), + ); + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; + +} diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart new file mode 100644 index 00000000..d9dd06d2 --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/list_view/list_view_demo01.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class ListViewDemo01 extends StatelessWidget { + const ListViewDemo01({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.builder( + itemCount: 100, + itemBuilder: (_, index) { + return Card( + child: ListTile( + tileColor: Colors.transparent, + title: Text('Test index:$index'), + )); + }), + ); + } +} diff --git a/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart index a9f1ebbd..1be90b4a 100644 --- a/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart +++ b/modules/painting_system/draw_system/lib/src/fun/stemp/stamp_paper.dart @@ -42,7 +42,7 @@ class _StampPaperState extends State @override Widget build(BuildContext context) { - width = MediaQuery.of(context).size.shortestSide * 0.8; + width = MediaQuery.of(context).size.shortestSide * 0.5; return GestureDetector( onTapDown: _onTapDown, From c48d1f4b46fd38e69539f5f5f2556c10173726dd Mon Sep 17 00:00:00 2001 From: sweet <1395723441@qq.com> Date: Wed, 16 Oct 2024 13:46:53 +0800 Subject: [PATCH 101/149] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=90=9C=E7=B4=A2info?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_storage/flutter/dao/widget_dao.dart | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart index 5413aed4..5799afe2 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart @@ -1,4 +1,3 @@ - import 'package:fx_dao/fx_dao.dart'; import '../model/enums.dart'; @@ -6,7 +5,6 @@ import '../model/widget_filter.dart'; import '../model/widget_po.dart'; class WidgetDao with HasDatabase, DbTable { - @override String get createSql => ''; @@ -20,15 +18,15 @@ class WidgetDao with HasDatabase, DbTable { "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " "VALUES (?,?,?,?,?,?,?,?);"; return database.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.id, - widget.name, - widget.nameCN, - widget.deprecated, - widget.family, - widget.lever, - widget.linkWidget, - widget.info - ])); + widget.id, + widget.name, + widget.nameCN, + widget.deprecated, + widget.family, + widget.lever, + widget.linkWidget, + widget.info + ])); } Future>> queryAll() async { @@ -38,7 +36,7 @@ class WidgetDao with HasDatabase, DbTable { Future>> queryByFamily(WidgetFamily family) async { return database.rawQuery( "SELECT * " - "FROM widget WHERE family = ? ORDER BY lever DESC", + "FROM widget WHERE family = ? ORDER BY lever DESC", [family.index]); } @@ -70,35 +68,38 @@ class WidgetDao with HasDatabase, DbTable { } return database.rawQuery( "SELECT * " - "FROM widget WHERE name like ?$familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", - ["%$name%", ...familyArg, ...starArg, arguments.pageSize, arguments.offset]); + "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", + [ + "%$name%", + "%$name%", + "%$name%", + ...familyArg, + ...starArg, + arguments.pageSize, + arguments.offset + ]); } - Future total(WidgetFilter args) async{ + Future total(WidgetFilter args) async { bool hasFamily = args.family != null; String familySql = hasFamily ? 'family = ?' : ''; List familyArg = hasFamily ? [args.family!.index] : []; String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; - List> result = await database.rawQuery(sql,familyArg); - if(result.isNotEmpty){ - return result.first['count'] as int ??0; + List> result = await database.rawQuery(sql, familyArg); + if (result.isNotEmpty) { + return result.first['count'] as int ?? 0; } return 0; - } - Future?> queryWidgetByName(String name) async{ + Future?> queryWidgetByName(String name) async { String sql = "SELECT * FROM widget WHERE name = ?"; List> result = await database.rawQuery(sql, [name]); - if(result.isNotEmpty){ + if (result.isNotEmpty) { return result.first; } return null; } - - } - - From 7e7267a13553c455290ae191a42cc111118bd3f8 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 21 Oct 2024 09:11:24 +0800 Subject: [PATCH 102/149] navigation --- lib/src/flutter_unit.dart | 29 +- lib/src/navigation/router/app_route.dart | 48 +-- lib/src/navigation/router/desk_route.dart | 97 ------ lib/src/navigation/router/mobile_route.dart | 83 ------ lib/src/navigation/router/system/app.dart | 44 +++ lib/src/navigation/router/system/global.dart | 17 ++ .../navigation/router/system/settings.dart | 28 ++ .../router/widgets/collection_route.dart | 20 ++ .../router/widgets/widgets_route.dart | 36 +++ .../desktop/flutter_unit_desk_navigation.dart | 4 +- lib/src/starter/fx_application.dart | 11 +- modules/basic_system/app/lib/app.dart | 9 +- .../app/lib/app/router/app_route.dart | 40 +++ .../app/lib/app/router/fade_page_route.dart | 55 ---- .../app/lib/app/router/slide_page_route.dart | 49 ---- .../app/lib/app/router/zero_page_route.dart | 36 --- .../fade_page_transitions_builder.dart | 19 -- .../transition/size_clip_transition.dart | 105 ------- .../cupertino_back_gesture_detector.dart | 277 ------------------ .../slide_page_transition_builder.dart | 32 -- .../app/lib/app/theme/app_theme.dart | 6 - .../app/lib/view/about/about_app_page.dart | 1 + modules/basic_system/app/pubspec.yaml | 2 +- .../lib/views/mobile/user/page_item.dart | 14 +- .../src/db_storage/flutter/model/node_po.dart | 2 +- .../knowledge_system/algorithm/pubspec.yaml | 2 +- .../lib/src/data/display_map/display_map.dart | 1 + .../lib/src/data/display_map/multi.dart | 10 + .../scroll/page_view/page_view_demo01.dart | 33 +++ .../widget_detail_bloc.dart | 6 +- .../category_panel/desk_category_page.dart | 2 +- .../widget_detail/widget_detail_page.dart | 3 + .../widget_panel/desk_widget_model_item.dart | 17 +- .../desk_ui/widget_panel/widget_panel.dart | 2 +- .../mobile/category_page/collect_page.dart | 7 +- .../widget_page/standard_home_search.dart | 2 +- .../SliverResizingHeader/desc_zh-CN.json | 38 +++ .../Sliver/SliverResizingHeader/node_01.dart | 128 ++++++++ .../Sliver/SliverResizingHeader/node_02.dart | 119 ++++++++ .../Sliver/SliverResizingHeader/node_03.dart | 161 ++++++++++ .../CarouselView/desc_zh-CN.json | 29 ++ .../CarouselView/node1_base.dart | 61 ++++ .../StatefulWidget/CarouselView/node2.dart | 91 ++++++ .../widgets/lib/exp/sliver_unit.dart | 2 + .../widgets/lib/exp/stateful_unit.dart | 3 +- pubspec.lock | 4 +- 46 files changed, 958 insertions(+), 827 deletions(-) delete mode 100644 lib/src/navigation/router/desk_route.dart delete mode 100644 lib/src/navigation/router/mobile_route.dart create mode 100644 lib/src/navigation/router/system/app.dart create mode 100644 lib/src/navigation/router/system/global.dart create mode 100644 lib/src/navigation/router/system/settings.dart create mode 100644 lib/src/navigation/router/widgets/collection_route.dart create mode 100644 lib/src/navigation/router/widgets/widgets_route.dart create mode 100644 modules/basic_system/app/lib/app/router/app_route.dart delete mode 100644 modules/basic_system/app/lib/app/router/fade_page_route.dart delete mode 100644 modules/basic_system/app/lib/app/router/slide_page_route.dart delete mode 100644 modules/basic_system/app/lib/app/router/zero_page_route.dart delete mode 100644 modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart delete mode 100644 modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart delete mode 100644 modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart delete mode 100644 modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart create mode 100644 modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 00f37075..5a79a610 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -6,7 +6,9 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/gen_l10n/app_localizations.dart'; import 'package:l10n/l10n.dart'; +import 'package:storage/storage.dart'; import 'package:tolyui/tolyui.dart'; +import 'package:widget_module/blocs/blocs.dart'; import 'l10n/gen/app_l10n.dart'; import 'navigation/router/app_route.dart'; @@ -15,17 +17,28 @@ import 'navigation/router/app_route.dart'; /// contact me by email 1981462002@qq.com /// 说明: 应用主程序 -class FlutterUnit3 extends StatelessWidget { - FlutterUnit3({Key? key}) : super(key: key); +class FlutterUnit3 extends StatefulWidget { + const FlutterUnit3({super.key}); + @override + State createState() => _FlutterUnit3State(); +} + +class _FlutterUnit3State extends State { final GoRouter _router = GoRouter( - initialLocation: '/splash', - routes: [deskAppRoute], + initialLocation: AppRoute.splash.url, + routes: [appRoute], onException: (BuildContext ctx, GoRouterState state, GoRouter router) { - router.go('/404', extra: state.uri.toString()); + router.go(AppRoute.globalError.url, extra: state.uri.toString()); }, ); + @override + void initState() { + super.initState(); + _initWeb(); + } + @override Widget build(BuildContext context) { AppConfig state = context.watch().state; @@ -56,4 +69,10 @@ class FlutterUnit3 extends StatelessWidget { ), ); } + + void _initWeb() { + if(!kAppEnv.isWeb)return; + GoRouter.optionURLReflectsImperativeAPIs = true; + context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); + } } diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart index 03e164d9..e175386d 100644 --- a/lib/src/navigation/router/app_route.dart +++ b/lib/src/navigation/router/app_route.dart @@ -1,23 +1,31 @@ import 'package:app/app.dart'; -import 'package:go_router/go_router.dart'; +import 'package:flutter/material.dart'; +import '../view/desktop/flutter_unit_desk_navigation.dart'; -import '../../starter/fx_application.dart'; -import 'desk_route.dart'; -import 'mobile_route.dart'; +import 'system/app.dart'; +import 'system/global.dart'; +import 'system/settings.dart'; +import 'widgets/collection_route.dart'; +import 'widgets/widgets_route.dart'; -final RouteBase deskAppRoute = GoRoute( - path: '/', - redirect: (_, __) => null, - routes: [ - GoRoute( - path: 'splash', - builder: (_, __) => const FlutterUnitSplash(), - ), - GoRoute( - path: 'start_error', - builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), - ), - if (isDesk) appNavRoute, - if (!isDesk) ...appMobileNavRoute - ], -); +RouteBase get appRoute { + List body = [ + widgetsRoute, + collectRoute, + settingsRoute, + ...systemRoutes, + ]; + return GoRoute( + path: AppRoute.home.path, + redirect: (_, __) => null, + routes: [ + ...globalRoutes, + if (kAppEnv.isDesktopUI) + ShellRoute( + builder: (_, __, Widget child) => AppDeskNavigation(content: child), + routes: body, + ), + if (!kAppEnv.isDesktopUI) ...body, + ], + ); +} diff --git a/lib/src/navigation/router/desk_route.dart b/lib/src/navigation/router/desk_route.dart deleted file mode 100644 index c0e0dc91..00000000 --- a/lib/src/navigation/router/desk_route.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'package:app/app.dart'; -import 'package:artifact/artifact.dart'; -import 'package:draw_system/draw_system.dart'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:treasure_tools/treasure_tools.dart'; -import 'package:widget_module/widget_module.dart'; -import '../view/desktop/flutter_unit_desk_navigation.dart'; - -final RouteBase appNavRoute = ShellRoute( - builder: (BuildContext context, GoRouterState state, Widget child) { - return FlutterUnitDeskNavigation(content: child); - }, - routes: [ - GoRoute( - path: 'widget', - builder: (_, __) => const DeskWidgetPanel(), - routes: [ - GoRoute( - path: 'detail/:name', - builder: (BuildContext context, GoRouterState state) { - Object? extra = state.extra; - WidgetModel? model; - if (extra is WidgetModel) { - model = extra; - } - return DeskWidgetDetailPageScope( - model: model, - widgetName: state.pathParameters['name'], - ); - }, - ), - ]), - GoRoute( - path: 'painter', - builder: (_,__) => const GalleryUnit(), - ), - GoRoute( - path: 'about_app', - builder: (_,__) => const AboutAppPage(), - ), - GoRoute( - path: 'knowledge', - builder: (_,__) => const DeskKnowledgePage(), - ), - GoRoute( - path: 'collection', - builder: (_,__) => const CollectPageAdapter(), - routes: [ - GoRoute( - path: 'widgets/:id', - builder: (BuildContext context, GoRouterState state) { - Object? extra = state.extra; - CategoryModel? model; - if (extra is CategoryModel) { - model = extra; - } - return CategoryShow(model: model!); - }, - ), - ]), - GoRoute( - path: 'account', - builder: (_,__) => const DeskAccountPage(), - ), - GoRoute( - path: 'tools', - builder: (_,__) => const CodeGenPage(), - ), - GoRoute( - path: 'settings', - builder: (_,__) => const SettingPage(), - routes: [ - GoRoute( - path: 'dark_mode', - builder: (_,__) => const ThemeModelSetting(), - ), - GoRoute( - path: 'code_style', - builder: (_,__) => const CodeStyleSettingPage(), - ), - GoRoute( - path: 'theme_color', - builder: (_,__) => const ThemeColorSettingPage(), - ), - GoRoute( - path: 'font_setting', - builder: (_,__) => const FontSettingPage(), - ), - GoRoute( - path: 'version', - builder: (_,__) => const VersionInfo(), - ), - ]) - ], -); diff --git a/lib/src/navigation/router/mobile_route.dart b/lib/src/navigation/router/mobile_route.dart deleted file mode 100644 index db3dfb0a..00000000 --- a/lib/src/navigation/router/mobile_route.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:app/app.dart'; -import 'package:authentication/authentication.dart'; -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:widget_module/widget_module.dart'; - -import '../view/mobile/unit_navigation.dart'; - -final List appMobileNavRoute = [ - GoRoute( - path: 'widget', - builder: (_, __) => const UnitPhoneNavigation(), - routes: [ - GoRoute( - path: 'detail/:name', - builder: (BuildContext context, GoRouterState state) { - Object? extra = state.extra; - WidgetModel? model; - if (extra is WidgetModel) { - model = extra; - } - return WidgetDetailPageScope(model: model!); - }, - ), - ], - ), - GoRoute( - path: 'collection_widgets/:id', - builder: (BuildContext context, GoRouterState state) { - Object? extra = state.extra; - CategoryModel? model; - if (extra is CategoryModel) { - model = extra; - } - return CategoryShow(model: model!); - }, - ), - GoRoute( - path: 'settings', - builder: (_, __) => const SettingPage(), - routes: [ - GoRoute( - path: 'dark_mode', - builder: (_, __) => const ThemeModelSetting(), - ), - GoRoute( - path: 'code_style', - builder: (_, __) => const CodeStyleSettingPage(), - ), - GoRoute( - path: 'theme_color', - builder: (_, __) => const ThemeColorSettingPage(), - ), - GoRoute( - path: 'font_setting', - builder: (_, __) => const FontSettingPage(), - ), - GoRoute( - path: 'version', - builder: (_, __) => const VersionInfo(), - ), - ]), - GoRoute( - path: 'data_manage', - builder: (_, __) => const DataManagePage(), - ), - GoRoute( - path: 'collect', - builder: (_, __) => const CollectPageAdapter(canPop: true), - ), - GoRoute( - path: 'about_app', - builder: (_, __) => const AboutAppPage(), - ), - GoRoute( - path: 'about_me', - builder: (_, __) => const AboutMePage(), - ), - GoRoute( - path: 'support_me', - builder: (_, __) => const SupportMe(), - ), -]; diff --git a/lib/src/navigation/router/system/app.dart b/lib/src/navigation/router/system/app.dart new file mode 100644 index 00000000..79ab782e --- /dev/null +++ b/lib/src/navigation/router/system/app.dart @@ -0,0 +1,44 @@ +import 'package:app/app.dart'; +import 'package:artifact/artifact.dart'; +import 'package:authentication/authentication.dart'; +import 'package:draw_system/draw_system.dart'; +import 'package:treasure_tools/treasure_tools.dart'; + +List get systemRoutes => [ + GoRoute( + path: AppRoute.dataManage.path, + builder: (_, __) => const DataManagePage(), + ), + GoRoute( + path: AppRoute.account.path, + builder: (_, __) => const DeskAccountPage(), + ), + GoRoute( + path: AppRoute.aboutApp.path, + builder: (_, __) => const AboutAppPage(), + ), + GoRoute( + path: AppRoute.aboutMe.path, + builder: (_, __) => const AboutMePage(), + ), + GoRoute( + path: AppRoute.supportMe.path, + builder: (_, __) => const SupportMe(), + ), + if (kAppEnv.isDesktopUI) ...deskTopRoutes + ]; + +List get deskTopRoutes => [ + GoRoute( + path: AppRoute.knowledge.path, + builder: (_, __) => const DeskKnowledgePage(), + ), + GoRoute( + path: AppRoute.painter.path, + builder: (_, __) => const GalleryUnit(), + ), + GoRoute( + path: AppRoute.tools.path, + builder: (_, __) => const CodeGenPage(), + ), + ]; diff --git a/lib/src/navigation/router/system/global.dart b/lib/src/navigation/router/system/global.dart new file mode 100644 index 00000000..d7c1c0f3 --- /dev/null +++ b/lib/src/navigation/router/system/global.dart @@ -0,0 +1,17 @@ +import 'package:app/app.dart'; +import '../../../starter/fx_application.dart'; + +List get globalRoutes => [ + GoRoute( + path: AppRoute.splash.path, + builder: (_, __) => const FlutterUnitSplash(), + ), + GoRoute( + path: AppRoute.startError.path, + builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), + ), + GoRoute( + path: AppRoute.globalError.path, + builder: (_, GoRouterState state) => AppStartErrorPage(error: state.extra), + ), + ]; diff --git a/lib/src/navigation/router/system/settings.dart b/lib/src/navigation/router/system/settings.dart new file mode 100644 index 00000000..820cd1dd --- /dev/null +++ b/lib/src/navigation/router/system/settings.dart @@ -0,0 +1,28 @@ +import 'package:app/app.dart'; + +GoRoute get settingsRoute => GoRoute( + path: AppRoute.settings.path, + builder: (_, __) => const SettingPage(), + routes: [ + GoRoute( + path: AppRoute.darkModel.path, + builder: (_, __) => const ThemeModelSetting(), + ), + GoRoute( + path: AppRoute.codeStyle.path, + builder: (_, __) => const CodeStyleSettingPage(), + ), + GoRoute( + path: AppRoute.themeColor.path, + builder: (_, __) => const ThemeColorSettingPage(), + ), + GoRoute( + path: AppRoute.fontSetting.path, + builder: (_, __) => const FontSettingPage(), + ), + GoRoute( + path: AppRoute.version.path, + builder: (_, __) => const VersionInfo(), + ), + ], + ); diff --git a/lib/src/navigation/router/widgets/collection_route.dart b/lib/src/navigation/router/widgets/collection_route.dart new file mode 100644 index 00000000..3b348bf7 --- /dev/null +++ b/lib/src/navigation/router/widgets/collection_route.dart @@ -0,0 +1,20 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:widget_module/widget_module.dart'; + +GoRoute get collectRoute => GoRoute( + path: AppRoute.collection.path, + builder: (_, __) => const CollectPageAdapter(), + routes: [ + GoRoute(path: AppRoute.collectionDetail.path, builder: collectionDetailBuilder), + ], +); + +Widget collectionDetailBuilder(BuildContext context, GoRouterState state) { + Object? extra = state.extra; + CategoryModel? model; + if (extra is CategoryModel) { + model = extra; + } + return CategoryShow(model: model!); +} diff --git a/lib/src/navigation/router/widgets/widgets_route.dart b/lib/src/navigation/router/widgets/widgets_route.dart new file mode 100644 index 00000000..c63ae1f5 --- /dev/null +++ b/lib/src/navigation/router/widgets/widgets_route.dart @@ -0,0 +1,36 @@ +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:widget_module/widget_module.dart'; + +import '../../view/mobile/unit_navigation.dart'; + +GoRoute get widgetsRoute => GoRoute( + path: AppRoute.widget.path, + builder: (_, __) { + if (kAppEnv.isDesktopUI){ + return const DeskWidgetPanel(); + } + return const UnitPhoneNavigation(); + }, + routes: [ + GoRoute(path: AppRoute.widgetDetail.path, builder: widgetDetailBuilder), + ], + ); + +Widget widgetDetailBuilder(BuildContext context, GoRouterState state) { + Object? extra = state.extra; + String? widgetName = state.pathParameters['name']; + + WidgetModel? model; + if (extra is WidgetModel) { + model = extra; + } + if (kAppEnv.isDesktopUI) { + return DeskWidgetDetailPageScope( + model: model, + widgetName: widgetName, + ); + } + assert(model != null); + return WidgetDetailPageScope(model: model!); +} diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart index a37ff4c9..0bd86b16 100644 --- a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -7,10 +7,10 @@ import 'package:tolyui_navigation/tolyui_navigation.dart'; import 'menu_bar_leading.dart'; import 'menu_bar_tail.dart'; import 'toly_unit_menu_cell.dart'; -class FlutterUnitDeskNavigation extends StatelessWidget { +class AppDeskNavigation extends StatelessWidget { final Widget content; - const FlutterUnitDeskNavigation({super.key, required this.content}); + const AppDeskNavigation({super.key, required this.content}); @override Widget build(BuildContext context) { diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 45fe5cbc..d6071eb9 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -14,11 +14,10 @@ export 'view/splash/Flutter_unit_splash.dart'; export 'view/error/app_start_error.dart'; class FxApplication with FxStarter { - const FxApplication(); @override - Widget get app => AppBlocProvider(child: FlutterUnit3()); + Widget get app => AppBlocProvider(child: FlutterUnit3()); @override AppStartRepository get repository => const FlutterUnitStartRepo(); @@ -28,7 +27,7 @@ class FxApplication with FxStarter { debugPrint("App启动耗时:$cost ms"); context.read().init(state); context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); - if(!kAppEnv.isWeb){ + if (!kAppEnv.isWeb) { context.read().add(const EventLoadLikeData()); context.read().add(const EventLoadCategory()); } @@ -36,18 +35,16 @@ class FxApplication with FxStarter { @override void onStartSuccess(BuildContext context, AppConfig state) { - context.go('/widget'); + context.go(AppRoute.widget.url); } @override void onStartError(BuildContext context, Object error, StackTrace trace) { - context.go('/start_error',extra: error); + context.go(AppRoute.startError.url, extra: error); } - @override void onGlobalError(Object error, StackTrace stack) { print(error); } } - diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart index 68763768..599ab59a 100644 --- a/modules/basic_system/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -8,11 +8,6 @@ export 'app/cons/path_unit.dart'; export 'app/cons/sp.dart'; export 'app/cons/str_unit.dart'; - -export 'app/router/slide_page_route.dart'; -export 'app/router/fade_page_route.dart'; -export 'app/router/zero_page_route.dart'; - export 'app/res/toly_icon.dart'; export 'app/theme/size_unit.dart'; export 'app/theme/app_theme.dart'; @@ -24,9 +19,9 @@ export 'app/style/shape/techno_shape.dart'; export 'app/style/behavior/no_scroll_behavior.dart'; export 'package:fx_platform_adapter/fx_platform_adapter.dart'; - +export 'package:fx_go_router_ext/fx_go_router_ext.dart'; export 'app_config/app_config.dart'; export 'app/action/action.dart'; - +export 'app/router/app_route.dart'; export 'view/view.dart'; \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart new file mode 100644 index 00000000..0148b4cb --- /dev/null +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -0,0 +1,40 @@ +enum AppRoute { + home('/', url: '/'), + splash('splash', url: '/splash'), + startError('start_error', url: '/start_error'), + globalError('404', url: '/404'), + + /// widget module + widget('widget', url: '/widget'), + widgetDetail('detail/:name', url: '/widget/detail/'), + collection('collection', url: '/collection'), + collectionDetail('widgets/:id', url: '/collection/widgets/'), + + painter('painter', url: '/painter'), + knowledge('knowledge', url: '/knowledge'), + tools('tools', url: '/tools'), + + /// user/app + aboutApp('about_app', url: '/about_app'), + account('account', url: '/account'), + dataManage('data_manage', url: '/data_manage'), + aboutMe('about_me', url: '/about_me'), + supportMe('support_me', url: '/support_me'), + + /// settings + settings('settings', url: '/setting'), + darkModel('dark_mode', url: '/setting/dark_mode'), + codeStyle('code_style', url: '/setting/code_style'), + themeColor('theme_color', url: '/setting/theme_color'), + fontSetting('font_setting', url: '/setting/font_setting'), + version('version', url: '/setting/version'), + ; + + final String path; + final String url; + + const AppRoute( + this.path, { + required this.url, + }); +} diff --git a/modules/basic_system/app/lib/app/router/fade_page_route.dart b/modules/basic_system/app/lib/app/router/fade_page_route.dart deleted file mode 100644 index 1b070dea..00000000 --- a/modules/basic_system/app/lib/app/router/fade_page_route.dart +++ /dev/null @@ -1,55 +0,0 @@ -//渐变透明路由动画 -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; - -class FadePageRoute extends MaterialPageRoute { - final Widget child; - final Duration duration; - final Curve? curve; - - FadePageRoute({ - required this.child, - this.duration = const Duration(milliseconds: 300), - this.curve, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child, - ); - } - - if (curve != null) { - animation = CurvedAnimation( - parent: animation, - curve: curve!, - ); - } - - return FadeTransition( - opacity: Tween(begin: 0.1, end: 1.0).animate(animation), - child: child, - ); - } - - @override - Duration get transitionDuration => duration; - - @override - @protected - bool get hasScopedWillPopCallback { - return false; - } -} diff --git a/modules/basic_system/app/lib/app/router/slide_page_route.dart b/modules/basic_system/app/lib/app/router/slide_page_route.dart deleted file mode 100644 index f4866869..00000000 --- a/modules/basic_system/app/lib/app/router/slide_page_route.dart +++ /dev/null @@ -1,49 +0,0 @@ -//右--->左 -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; - - -class SlidePageRoute extends MaterialPageRoute { - final Widget child; - final Duration duration; - - SlidePageRoute({ - required this.child, - this.duration = const Duration(milliseconds: 300), - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child); - } - final bool linearTransition = isPopGestureInProgress(this); - return CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: linearTransition, - child: child, - ); - } - - @override - Duration get transitionDuration => duration; - - @override - @protected - bool get hasScopedWillPopCallback { - return false; - } -} diff --git a/modules/basic_system/app/lib/app/router/zero_page_route.dart b/modules/basic_system/app/lib/app/router/zero_page_route.dart deleted file mode 100644 index 75f03fb4..00000000 --- a/modules/basic_system/app/lib/app/router/zero_page_route.dart +++ /dev/null @@ -1,36 +0,0 @@ -//渐变透明路由动画 -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import '../style/transition/slide_transition/cupertino_back_gesture_detector.dart'; - -class ZeroPageRoute extends MaterialPageRoute { - final Widget child; - - - ZeroPageRoute({ - required this.child, - }) : super(builder: (_) => child); - - @override - Widget buildTransitions( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(this), - onStartPopGesture: () => startPopGesture(this), - child: child, - ); - } - - return child; - } - - @override - Duration get transitionDuration => Duration.zero; -} diff --git a/modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart b/modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart deleted file mode 100644 index d0e9e3f0..00000000 --- a/modules/basic_system/app/lib/app/style/transition/fade_page_transitions_builder.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -class FadePageTransitionsBuilder extends PageTransitionsBuilder { - const FadePageTransitionsBuilder(); - - @override - Widget buildTransitions( - PageRoute? route, - BuildContext? context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - return FadeTransition( - opacity: animation.drive(CurveTween(curve: Curves.easeIn)), - child: child, - ); - } -} diff --git a/modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart b/modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart deleted file mode 100644 index f3fa0f5c..00000000 --- a/modules/basic_system/app/lib/app/style/transition/size_clip_transition.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; - -class SizeClipTransition extends StatelessWidget { - final Animation animation; - final Animation secondaryAnimation; - final Widget child; - - const SizeClipTransition({ - super.key, - required this.animation, - required this.secondaryAnimation, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return ClipPath( - clipper: CirclePathClipper(Curves.easeIn.transform(animation.value)), - child: child, - ); - } -} - -class SizePathClipper extends CustomClipper { - final double progress; - - SizePathClipper(this.progress); - - @override - Path getClip(Size size) { - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCenter( - center: Offset(size.width / 2, size.height / 2), - width: size.width * (1 - progress), - height: size.height, - ); - - return Path() - ..addRect(box) - ..addRect(center) - ..fillType = PathFillType.evenOdd; - } - - @override - bool shouldReclip(covariant SizePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} - -class ScalePathClipper extends CustomClipper { - final double progress; - - ScalePathClipper(this.progress); - - @override - Path getClip(Size size) { - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCenter( - center: Offset(size.width / 2, size.height / 2), - width: size.width * (1 - progress), - height: size.height* (1 - progress), - ); - - return Path() - ..addRect(box) - ..addRect(center) - ..fillType = PathFillType.evenOdd; - } - - @override - bool shouldReclip(covariant ScalePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} - -class CirclePathClipper extends CustomClipper { - final double progress; - - CirclePathClipper(this.progress); - - @override - Path getClip(Size size) { - print('progress:$progress'); - if(progress==0){ - return Path(); - } - Rect box = Rect.fromLTWH(0, 0, size.width, size.height); - Rect center = Rect.fromCircle( - center: Offset(size.width , 0), - radius: sqrt(size.width*size.width+size.height*size.height) * (progress), - ); - - Path zone = Path()..addRect(box); - Path cliper = Path()..addOval(center); - - return Path.combine(PathOperation.intersect, zone, cliper ); - } - - @override - bool shouldReclip(covariant CirclePathClipper oldClipper) { - return oldClipper.progress != progress; - } -} \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart b/modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart deleted file mode 100644 index 53bec7e3..00000000 --- a/modules/basic_system/app/lib/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart +++ /dev/null @@ -1,277 +0,0 @@ -import 'dart:math'; -import 'dart:ui'; - -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -// The maximum time for a page to get reset to it's original position if the -// user releases a page mid swipe. -const int _kMaxPageBackAnimationTime = 300; // Milliseconds. -const double _kBackGestureWidth = 20.0; -const double _kMinFlingVelocity = 1.0; // Screen widths per second. - -// An eyeballed value for the maximum time it takes for a page to animate forward -// if the user releases a page mid swipe. -const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. - -/// This is the widget side of [CupertinoBackGestureController]. -/// -/// This widget provides a gesture recognizer which, when it determines the -/// route can be closed with a back gesture, creates the controller and -/// feeds it the input from the gesture recognizer. -/// -/// The gesture data is converted from absolute coordinates to logical -/// coordinates by this widget. -/// -/// The type `T` specifies the return type of the route with which this gesture -/// detector is associated. -class CupertinoBackGestureDetector extends StatefulWidget { - const CupertinoBackGestureDetector({ - super.key, - required this.enabledCallback, - required this.onStartPopGesture, - required this.child, - }); - - final Widget child; - - final ValueGetter enabledCallback; - - final ValueGetter> onStartPopGesture; - - @override - _CupertinoBackGestureDetectorState createState() => _CupertinoBackGestureDetectorState(); -} - -class _CupertinoBackGestureDetectorState extends State> { - CupertinoBackGestureController? _backGestureController; - - late HorizontalDragGestureRecognizer _recognizer; - - @override - void initState() { - super.initState(); - _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) - ..onStart = _handleDragStart - ..onUpdate = _handleDragUpdate - ..onEnd = _handleDragEnd - ..onCancel = _handleDragCancel; - } - - @override - void dispose() { - _recognizer.dispose(); - super.dispose(); - } - - void _handleDragStart(DragStartDetails details) { - assert(mounted); - assert(_backGestureController == null); - _backGestureController = widget.onStartPopGesture(); - } - - void _handleDragUpdate(DragUpdateDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController!.dragUpdate(_convertToLogical(details.primaryDelta! / context.size!.width)); - } - - void _handleDragEnd(DragEndDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController!.dragEnd(_convertToLogical(details.velocity.pixelsPerSecond.dx / context.size!.width)); - _backGestureController = null; - } - - void _handleDragCancel() { - assert(mounted); - // This can be called even if start is not called, paired with the "down" event - // that we don't consider here. - _backGestureController?.dragEnd(0.0); - _backGestureController = null; - } - - void _handlePointerDown(PointerDownEvent event) { - if (widget.enabledCallback()) { - _recognizer.addPointer(event); - } - } - - double _convertToLogical(double value) { - switch (Directionality.of(context)) { - case TextDirection.rtl: - return -value; - case TextDirection.ltr: - return value; - } - } - - @override - Widget build(BuildContext context) { - assert(debugCheckHasDirectionality(context)); - // For devices with notches, the drag area needs to be larger on the side - // that has the notch. - double dragAreaWidth = Directionality.of(context) == TextDirection.ltr ? - MediaQuery.paddingOf(context).left : - MediaQuery.paddingOf(context).right; - dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); - return Stack( - fit: StackFit.passthrough, - children: [ - widget.child, - PositionedDirectional( - start: 0.0, - width: dragAreaWidth, - top: 0.0, - bottom: 0.0, - child: Listener( - onPointerDown: _handlePointerDown, - behavior: HitTestBehavior.translucent, - ), - ), - ], - ); - } -} - - -class CupertinoBackGestureController { - /// Creates a controller for an iOS-style back gesture. - /// - /// The [navigator] and [controller] arguments must not be null. - CupertinoBackGestureController({ - required this.navigator, - required this.controller, - }) { - navigator.didStartUserGesture(); - } - - final AnimationController controller; - final NavigatorState navigator; - - /// The drag gesture has changed by [fractionalDelta]. The total range of the - /// drag should be 0.0 to 1.0. - void dragUpdate(double delta) { - controller.value -= delta; - } - - /// The drag gesture has ended with a horizontal motion of - /// [fractionalVelocity] as a fraction of screen width per second. - void dragEnd(double velocity) { - // Fling in the appropriate direction. - // AnimationController.fling is guaranteed to - // take at least one frame. - // - // This curve has been determined through rigorously eyeballing native iOS - // animations. - const Curve animationCurve = Curves.fastLinearToSlowEaseIn; - final bool animateForward; - - // If the user releases the page before mid screen with sufficient velocity, - // or after mid screen, we should animate the page out. Otherwise, the page - // should be animated back in. - if (velocity.abs() >= _kMinFlingVelocity) { - animateForward = velocity <= 0; - } else { - animateForward = controller.value > 0.5; - } - - if (animateForward) { - // The closer the panel is to dismissing, the shorter the animation is. - // We want to cap the animation time, but we want to use a linear curve - // to determine it. - final int droppedPageForwardAnimationTime = min( - lerpDouble(_kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!.floor(), - _kMaxPageBackAnimationTime, - ); - controller.animateTo(1.0, duration: Duration(milliseconds: droppedPageForwardAnimationTime), curve: animationCurve); - } else { - // This route is destined to pop at this point. Reuse navigator's pop. - navigator.pop(); - - // The popping may have finished inline if already at the target destination. - if (controller.isAnimating) { - // Otherwise, use a custom popping animation duration and curve. - final int droppedPageBackAnimationTime = lerpDouble(0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!.floor(); - controller.animateBack(0.0, duration: Duration(milliseconds: droppedPageBackAnimationTime), curve: animationCurve); - } - } - - if (controller.isAnimating) { - // Keep the userGestureInProgress in true state so we don't change the - // curve of the page transition mid-flight since CupertinoPageTransition - // depends on userGestureInProgress. - late AnimationStatusListener animationStatusCallback; - animationStatusCallback = (AnimationStatus status) { - navigator.didStopUserGesture(); - controller.removeStatusListener(animationStatusCallback); - }; - controller.addStatusListener(animationStatusCallback); - } else { - navigator.didStopUserGesture(); - } - } -} - -// Called by _CupertinoBackGestureDetector when a pop ("back") drag start -// gesture is detected. The returned controller handles all of the subsequent -// drag events. -CupertinoBackGestureController startPopGesture(PageRoute route) { - return CupertinoBackGestureController( - navigator: route.navigator!, - controller: route.controller!, // protected access - ); -} - -bool isPopGestureEnabled(PageRoute route) { - print( - "======_isPopGestureEnabled:${route.hasScopedWillPopCallback}========="); -// If there's nothing to go back to, then obviously we don't support -// the back gesture. - if (route.isFirst) { - return false; - } -// If the route wouldn't actually pop if we popped it, then the gesture -// would be really confusing (or would skip internal routes), so disallow it. - if (route.willHandlePopInternally) { - return false; - } -// If attempts to dismiss this route might be vetoed such as in a page -// with forms, then do not allow the user to dismiss the route with a swipe. - if (route.hasScopedWillPopCallback) { - return false; - } -// Fullscreen dialogs aren't dismissible by back swipe. - if (route.fullscreenDialog) { - return false; - } -// If we're in an animation already, we cannot be manually swiped. - if (route.animation!.status != AnimationStatus.completed) { - return false; - } -// If we're being popped into, we also cannot be swiped until the pop above -// it completes. This translates to our secondary animation being -// dismissed. - if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { - return false; - } -// If we're in a gesture already, we cannot start another. - if (isPopGestureInProgress(route)) { - return false; - } - -// Looks like a back gesture would be welcome! - return true; -} - -/// True if an iOS-style back swipe pop gesture is currently underway for [route]. -/// -/// This just check the route's [NavigatorState.userGestureInProgress]. -/// -/// See also: -/// -/// * [popGestureEnabled], which returns true if a user-triggered pop gesture -/// would be allowed. -bool isPopGestureInProgress(PageRoute route) { - return route.navigator!.userGestureInProgress; -} diff --git a/modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart b/modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart deleted file mode 100644 index 4c4270cf..00000000 --- a/modules/basic_system/app/lib/app/style/transition/slide_transition/slide_page_transition_builder.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'dart:io'; - -import 'package:app/app/style/transition/slide_transition/cupertino_back_gesture_detector.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class SlidePageTransitionsBuilder extends PageTransitionsBuilder { - const SlidePageTransitionsBuilder(); - - @override - Widget buildTransitions( - PageRoute? route, - BuildContext? context, - Animation animation, - Animation secondaryAnimation, - Widget child, - ) { - if (Platform.isIOS) { - child = CupertinoBackGestureDetector( - enabledCallback: () => isPopGestureEnabled(route!), - onStartPopGesture: () => startPopGesture(route!), - child: child); - } - final bool linearTransition = isPopGestureInProgress(route!); - return CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: linearTransition, - child: child, - ); - } -} \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index a705f134..49415e71 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -1,14 +1,8 @@ -import 'dart:convert'; -import 'dart:io'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import '../../app_config/bloc/state.dart'; -import '../style/transition/fade_page_transitions_builder.dart'; -import '../style/transition/slide_transition/slide_page_transition_builder.dart'; - class AppTheme { static ThemeData darkTheme(AppConfig state) { Color scaffoldBackgroundColor = const Color(0xff010201); diff --git a/modules/basic_system/app/lib/view/about/about_app_page.dart b/modules/basic_system/app/lib/view/about/about_app_page.dart index 498b3a10..59eb8325 100644 --- a/modules/basic_system/app/lib/view/about/about_app_page.dart +++ b/modules/basic_system/app/lib/view/about/about_app_page.dart @@ -4,6 +4,7 @@ import 'package:app/app.dart'; import 'package:components/components.dart'; import 'package:flutter/material.dart'; +import 'package:fx_go_router_ext/fx_go_router_ext.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/modules/basic_system/app/pubspec.yaml b/modules/basic_system/app/pubspec.yaml index c4b5ba8d..5ca35a1e 100644 --- a/modules/basic_system/app/pubspec.yaml +++ b/modules/basic_system/app/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: connectivity_plus: ^6.0.3 url_launcher: ^6.1.14 # url fx_platform_adapter: ^0.0.2+1 # 平台适配器 - + fx_go_router_ext: 0.0.3 storage: path: ../storage widget_module: diff --git a/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart b/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart index d4d31c30..5e6131eb 100644 --- a/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart +++ b/modules/basic_system/authentication/lib/views/mobile/user/page_item.dart @@ -28,13 +28,13 @@ class MePageItem extends StatelessWidget { height: 10, ), Gap.sfl10, - _buildItem(context, TolyIcon.icon_them, context.l10n.appSettings, '/settings'), + _buildItem(context, TolyIcon.icon_them, context.l10n.appSettings, AppRoute.settings.url), const Divider(), _buildItem( - context, TolyIcon.icon_layout, context.l10n.dataManagement, '/data_manage'), + context, TolyIcon.icon_layout, context.l10n.dataManagement, AppRoute.dataManage.url), const Divider(), _buildItem( - context, TolyIcon.icon_collect, context.l10n.userCollection, '/collect',), + context, TolyIcon.icon_collect, context.l10n.userCollection, AppRoute.collection.url,), Gap.sfl10, Stack( @@ -43,18 +43,18 @@ class MePageItem extends StatelessWidget { context, Icons.update, context.l10n.versionInformation, - '/settings/version', + AppRoute.version.url, ), const Positioned(left: 40, top: 10, child: UpdateRedPoint()) ], ), const Divider(), - _buildItem(context, Icons.info, context.l10n.aboutApplications, '/about_app'), + _buildItem(context, Icons.info, context.l10n.aboutApplications, AppRoute.aboutApp.url), Gap.sfl10, - _buildItem(context, TolyIcon.icon_kafei, context.l10n.contactThisKing, '/about_me'), + _buildItem(context, TolyIcon.icon_kafei, context.l10n.contactThisKing, AppRoute.aboutMe.url), const Divider(), - _buildItem(context, Icons.sanitizer, context.l10n.homeAccountSupport, '/support_me'), + _buildItem(context, Icons.sanitizer, context.l10n.homeAccountSupport, AppRoute.supportMe.url), ], ), ); diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart index 16bfd817..f5198a1b 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart @@ -22,7 +22,7 @@ class NodePo { factory NodePo.fromJson(Map map) { return NodePo( - id: map['id'], + id: map['id']??0, name: map['name'], widgetId: map["widgetId"], priority: map["priority"], diff --git a/modules/knowledge_system/algorithm/pubspec.yaml b/modules/knowledge_system/algorithm/pubspec.yaml index 294ccfc5..e0c4a7f6 100644 --- a/modules/knowledge_system/algorithm/pubspec.yaml +++ b/modules/knowledge_system/algorithm/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: # tolyui tolyui: 0.0.2+19 - fx_go_router_ext: 0.0.2 + fx_go_router_ext: 0.0.3 components: path: ../../basic_system/components diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart index 247fb57a..7ed67338 100644 --- a/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart +++ b/modules/knowledge_system/layout/lib/src/data/display_map/display_map.dart @@ -23,6 +23,7 @@ Map> get kDisplayMap => { '/scroll/list': listView, '/scroll/grid': gridView, + '/scroll/page': pageView, '/funny/elevator':funnyElevator, diff --git a/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart index a5346209..e16a2022 100644 --- a/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart +++ b/modules/knowledge_system/layout/lib/src/data/display_map/multi.dart @@ -16,6 +16,7 @@ import '../../views/multi/flex/row_show.dart'; import '../../views/playground/view/wrap/wrap_playground.dart'; import '../../views/scroll/grid_view/grid_view_demo01.dart'; import '../../views/scroll/list_view/list_view_demo01.dart'; +import '../../views/scroll/page_view/page_view_demo01.dart'; import '../model/display_frame.dart'; List get multiFlex => [ @@ -74,3 +75,12 @@ List get gridView => [ display: (BuildContext context) => GridViewDemo01(), ), ]; + +List get pageView => [ + DisplayFrame( + title: 'PageView 滑动界面', + desc: "通过 GridView.builder 构造,可以实现按需加载的网格滑动视图。", + src: '', + display: (BuildContext context) => PageViewDemo01(), + ), +]; diff --git a/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart b/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart new file mode 100644 index 00000000..f1f7053f --- /dev/null +++ b/modules/knowledge_system/layout/lib/src/views/scroll/page_view/page_view_demo01.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +const List kColors3 = [Colors.blue,Colors.red, Colors.green, Colors.orange]; + +class PageViewDemo01 extends StatelessWidget { + PageViewDemo01({super.key}); + + final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: PageView.builder( + itemCount: 8, + itemBuilder: (_, index) { + Color color = kColors3[index % kColors3.length]; + return Container( + color: color, + alignment: Alignment.center, + child: Text( + 'Page ${index + 1}\n${colorString(color)}', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 18, color: Colors.white), + ), + ); + }), + ); + } + + String colorString(Color color) => + "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; +} diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index bf7866e3..2f24e281 100644 --- a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -46,6 +46,8 @@ class WidgetDetailBloc extends Cubit { try { final List nodes = await nodeRepository.loadNode(widget.id); final List links = await widgetRepository.loadWidget(widget.links); + print("queryDetail====${nodes.length}==="); + if (nodes.isEmpty) { emit(DetailEmpty()); } else { @@ -55,7 +57,9 @@ class WidgetDetailBloc extends Cubit { links: links, )); } - } catch (_) { + } catch (e,s) { + print("queryDetail=error===${e}=$s=="); + emit(DetailFailed()); } } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart index e689cdc6..cd79d3c1 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart @@ -146,7 +146,7 @@ class DeskCateGoryPage extends StatelessWidget { BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); BlocProvider.of(context).add(EventLoadCategoryWidget(model.id!)); // Navigator.pushNamed(context, UnitRouter.category_show, arguments: model); - context.push('/collection/widgets/${model.id}',extra: model); + context.push('${AppRoute.collectionDetail.url}${model.id}',extra: model); } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 0b531d0b..831707f9 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -45,6 +45,9 @@ class _DeskWidgetDetailPageScopeState extends State { void _loadModelByName() async { _model = await widgetRepository.queryWidgetByName(widget.widgetName); + setState(() { + + }); } @override diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 737c1e98..6d2fd8d7 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -60,12 +60,17 @@ class DeskWidgetItem extends StatelessWidget { return Row( children: [ if (searchArg == null) - Text( - model.name, - style: TextStyle( - fontSize: 15, - color: textColor, - fontWeight: FontWeight.bold, + Expanded( + child: Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, + color: textColor, + + fontWeight: FontWeight.bold, + ), ), ), if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index f5b0f512..430b367d 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -88,7 +88,7 @@ class WidgetList extends StatelessWidget { return DeskWidgetItem( model: model, onTap: () { - context.push('/widget/detail/${model.name}',extra: model); + context.push('${AppRoute.widgetDetail.url}${model.name}',extra: model); }, ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart index a795e4a4..36b87540 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/collect_page.dart @@ -14,16 +14,15 @@ import 'sync/upload_button.dart'; class CollectPageAdapter extends StatelessWidget { - final bool canPop; - const CollectPageAdapter({Key? key, this.canPop=false}) : super(key: key); + const CollectPageAdapter({Key? key,}) : super(key: key); @override Widget build(BuildContext context) { bool isDesk = Platform.isMacOS||Platform.isWindows||Platform.isLinux; if(isDesk){ - return DeskCategoryPage(); + return const DeskCategoryPage(); }else{ - return CollectPage(canPop:canPop); + return const CollectPage(canPop:true); } } } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index 8d9a0b6a..e8cff546 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -84,7 +84,7 @@ class StandardHomeSearch extends StatelessWidget Widget _buildCollectIcon(BuildContext context) { return IconButton( // splashRadius: 20, - onPressed: () => context.push('/collect'), + onPressed: () => context.push(AppRoute.collection.url), icon: const Icon(TolyIcon.icon_collect), ); } diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json new file mode 100644 index 00000000..86f2cae4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "固定头部滑片", + "info": "一个可以停留在视口上部的滑片, 可轻松完成吸顶效果。", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 官方案例", + "display": "new_page", + "desc": [ + "【child】 : 子组件 【Widget?】", + "PinnedHeaderSliver 只能用在滚动视口中,其中子组件在滑动到顶部时,不会移出视口,从而会停留在视口上方。" + ] + }, + { + "file": "node_02.dart", + "name": "标题吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题吸顶效果,注意看下方的分隔线也有吸顶效果哦。" + ] + }, + { + "file": "node_03.dart", + "name": "标题+搜索吸顶", + "display": "new_page", + "desc": [ + "基于 PinnedHeaderSliver 实现的标题+搜索框的吸顶效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart new file mode 100644 index 00000000..406a79d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart @@ -0,0 +1,128 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + +class SliverResizingHeaderDemo1 extends StatefulWidget { + const SliverResizingHeaderDemo1({ super.key }); + + @override + State createState() => _SliverResizingHeaderDemo1State(); +} + +class _SliverResizingHeaderDemo1State extends State { + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(4), + child: Scrollbar( + controller: scrollController, + child: CustomScrollView( + controller: scrollController, + slivers: const [ + SliverResizingHeader( + minExtentPrototype: ListHeader(text: 'One'), + maxExtentPrototype: ListHeader(text: 'One\nTwo\nThree\n2'), + child: ListHeader( + text: 'SliverResizingHeader\nWith Two Optional\nLines of Text\n7777', + ), + ), + ItemList(), + ], + ), + ), + ), + ), + ); + } +} + +// A widget that displays its text within a thick rounded rectangle border +class ListHeader extends StatelessWidget { + const ListHeader({ + super.key, + required this.text, + }); + + final String text; + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + return Container( + color: colorScheme.background, + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Material( + color: colorScheme.primaryContainer, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + width: 7, + color: colorScheme.outline, + ), + ), + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + text, + textAlign: TextAlign.center, + style: theme.textTheme.headlineMedium!.copyWith( + color: colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ); + } +} + +// A placeholder SliverList of 50 items. +class ItemList extends StatelessWidget { + const ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return Card( + color: colorScheme.onSecondary, + child: ListTile( + textColor: colorScheme.secondary, + title: Text('Item $index'), + ), + ); + }, + childCount: itemCount, + ), + ); + } +} + diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart new file mode 100644 index 00000000..62e13083 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart @@ -0,0 +1,119 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class SliverResizingHeaderNode2 extends StatefulWidget { + const SliverResizingHeaderNode2({super.key}); + + @override + State createState() => _SliverResizingHeaderNode2State(); +} + +class _SliverResizingHeaderNode2State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + return Scaffold( + backgroundColor: Colors.white, + body: + CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + // _buildTitleText(), + const PinnedHeaderSliver(child: Divider()), + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon ); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + + const Text text2 = Text('Settings', style: style); + + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + + // bottom: PreferredSize(preferredSize: Size.fromHeight(46), child: text2), + title: Opacity(opacity: factor, child: text), + ); + + return SliverResizingHeader(child: header, + minExtentPrototype: AppBar(), + maxExtentPrototype: header, + ); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } +} + +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart new file mode 100644 index 00000000..6028b1f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart @@ -0,0 +1,161 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class PinnedHeaderSliverNode3 extends StatefulWidget { + const PinnedHeaderSliverNode3({super.key}); + + @override + State createState() => _PinnedHeaderSliverNode3State(); +} + +class _PinnedHeaderSliverNode3State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + + return Scaffold( + backgroundColor: Colors.white, + body: CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + _buildSliverSearch(), + +// PinnedHeaderSliver(child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 12.0), +// child: TextField( +// decoration: InputDecoration( +// filled: true, +// fillColor: Colors.white, +// border: InputBorder.none +// ), +// ), +// )), + + const _ItemList(), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); + const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Colors.white, + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('Settings', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } + + Widget _buildSliverSearch() { + BoxDecoration decoration = BoxDecoration( + color: const Color(0xffefeff1), borderRadius: BorderRadius.circular(6)); + Widget prefix = const Padding( + padding: EdgeInsets.only(left: 8.0), + child: Icon(CupertinoIcons.search, size: 20, color: Color(0xff808082)) + ); + return PinnedHeaderSliver( + child: ColoredBox( + color: Colors.white, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0, right: 12, left: 12), + child: CupertinoTextField( + readOnly: true, + placeholder: '搜索', + onTap: _toSearchPage, + decoration: decoration, + prefix:prefix, + style: const TextStyle(fontSize: 14), + placeholderStyle: const TextStyle(color: Color(0xff808082)), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + ), + ), + const Divider(), + ], + ), + )); + } + + void _toSearchPage() { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => Scaffold(appBar: AppBar(title: const Text('SearchPage')))), + ); + } +} + +// A placeholder SliverList of 25 items. +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme + .of(context) + .colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json new file mode 100644 index 00000000..a820dad8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "旋转视图", + "info": "复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Checkbox基础用法", + "desc": [ + "【value】 : 是否选中 【double】", + "【checkColor】: 选中时✔️gou颜色 【Color】", + "【activeColor】: 选中时框内颜色 【Color】", + "【onChanged】: 状态改变事件 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Checkbox的三态", + "desc": [ + "【tristate】 : 是否是三态 【double】", + " onChanged时," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart new file mode 100644 index 00000000..f1308bc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart @@ -0,0 +1,61 @@ + +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class CarouselNode1 extends StatefulWidget { + const CarouselNode1({super.key}); + + @override + State createState() => _CarouselNode1State(); +} + +class _CarouselNode1State extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Carousel'),), + body: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 200), + child: CarouselView( + itemExtent: 320, + shrinkExtent: 200, + // itemSnapping: true, + children: List.generate(20, (int index) { + return UncontainedLayoutCard(index: index, label: 'Item $index'); + }), + ), + ), + ), + ); + } +} + +class UncontainedLayoutCard extends StatelessWidget { + const UncontainedLayoutCard({ + super.key, + required this.index, + required this.label, + }); + + final int index; + final String label; + + @override + Widget build(BuildContext context) { + return ColoredBox( + color: Colors.primaries[index % Colors.primaries.length].withOpacity(0.5), + child: Center( + child: Text( + label, + style: const TextStyle(color: Colors.white, fontSize: 20), + overflow: TextOverflow.clip, + softWrap: false, + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart new file mode 100644 index 00000000..e8017368 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart @@ -0,0 +1,91 @@ + +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +class CarouselNode2 extends StatefulWidget { + const CarouselNode2({super.key}); + + @override + State createState() => _CarouselNode2State(); +} + +class _CarouselNode2State extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar(title: Text('Carousel'),), + body: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 64), + child: CarouselView( + backgroundColor: Color(0xfff7f8fa), + itemExtent: 240, + // shrinkExtent: 200, + itemSnapping: true, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6) + ), + children: List.generate(20, (int index) { + return _UncontainedLayoutCard(index: index, label: 'Item $index'); + }), + ), + ), + ), + ); + } +} + +class _UncontainedLayoutCard extends StatelessWidget { + const _UncontainedLayoutCard({ + super.key, + required this.index, + required this.label, + }); + + final int index; + final String label; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 18, + height: 18, + margin: EdgeInsets.only(right: 6), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(4) + ), + child: Text('热',style: TextStyle(fontSize: 10,color: Colors.white,),), + ), + Text( + 'Container 容器组件', + style: const TextStyle(color: Colors.black, fontSize: 14,fontWeight: FontWeight.bold), + overflow: TextOverflow.clip, + softWrap: false, + ), + ], + ), + Text( + '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...', + style: const TextStyle(color: Colors.grey, fontSize: 12), + overflow: TextOverflow.clip, + softWrap: false, + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/exp/sliver_unit.dart b/modules/widget_system/widgets/lib/exp/sliver_unit.dart index e8d0ac17..c626766e 100644 --- a/modules/widget_system/widgets/lib/exp/sliver_unit.dart +++ b/modules/widget_system/widgets/lib/exp/sliver_unit.dart @@ -33,3 +33,5 @@ export '../Sliver/SliverMainAxisGroup/node1.dart'; export '../Sliver/PinnedHeaderSliver/node_01.dart'; export '../Sliver/PinnedHeaderSliver/node_02.dart'; export '../Sliver/PinnedHeaderSliver/node_03.dart'; +export '../Sliver/SliverResizingHeader/node_01.dart'; +export '../Sliver/SliverResizingHeader/node_02.dart'; diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart index 91f36040..606f58d8 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateful_unit.dart @@ -36,6 +36,8 @@ export '../StatefulWidget/Navigator/node1_base.dart'; export '../StatefulWidget/InteractiveViewer/node1_base.dart'; export '../StatefulWidget/InteractiveViewer/node2_constrained.dart'; export '../StatefulWidget/InteractiveViewer/node3_controller.dart'; +export '../StatefulWidget/CarouselView/node1_base.dart'; +export '../StatefulWidget/CarouselView/node2.dart'; export '../StatefulWidget/Image/node1_base.dart'; export '../StatefulWidget/Image/node2_fit.dart'; @@ -43,7 +45,6 @@ export '../StatefulWidget/Image/node3_alignment.dart'; export '../StatefulWidget/Image/node4_colorBlendMode.dart'; export '../StatefulWidget/Image/node5_repeat.dart'; export '../StatefulWidget/Image/node6_centerSlice.dart'; -export '../StatefulWidget/Image/node6_centerSlice.dart'; export '../StatefulWidget/RangeSlider/node1_base.dart'; export '../StatefulWidget/Slider/node1_base.dart'; diff --git a/pubspec.lock b/pubspec.lock index 9a221a7c..607c26ea 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -314,10 +314,10 @@ packages: dependency: transitive description: name: fx_go_router_ext - sha256: "982aa2c7618075fd458ad50b6779578bfdff3376745320d4cb6d2dda31ddabc3" + sha256: a82d719d6f2026eaff97e466c7f8c34d75a55a58cfce469807df8a2211d91652 url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2" + version: "0.0.3" fx_platform_adapter: dependency: transitive description: From 495163151da77793cfc5717c31439a7663affca9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 9 Nov 2024 12:28:35 +0800 Subject: [PATCH 103/149] workspace --- modules/basic_system/app/pubspec.yaml | 29 +--- modules/basic_system/app_update/pubspec.yaml | 8 +- .../basic_system/authentication/pubspec.yaml | 9 +- modules/basic_system/components/pubspec.yaml | 17 +- modules/basic_system/l10n/pubspec.yaml | 9 +- modules/basic_system/storage/pubspec.yaml | 11 +- modules/basic_system/toly_ui/pubspec.yaml | 9 +- .../utils/lib/src/color_utils.dart | 4 +- modules/basic_system/utils/pubspec.yaml | 12 +- .../knowledge_system/algorithm/pubspec.yaml | 19 +-- .../knowledge_system/artifact/pubspec.yaml | 28 +--- modules/knowledge_system/awesome/pubspec.yaml | 8 +- modules/knowledge_system/layout/pubspec.yaml | 13 +- .../painting_system/draw_system/pubspec.yaml | 20 +-- .../tools_system/treasure_tools/pubspec.yaml | 78 ++++----- .../widget_system/widget_module/pubspec.yaml | 33 +--- .../widgets/lib/utils/color_utils.dart | 4 +- modules/widget_system/widgets/pubspec.yaml | 14 +- pubspec.lock | 151 +++--------------- pubspec.yaml | 100 +++++++----- 20 files changed, 158 insertions(+), 418 deletions(-) diff --git a/modules/basic_system/app/pubspec.yaml b/modules/basic_system/app/pubspec.yaml index 5ca35a1e..04484de6 100644 --- a/modules/basic_system/app/pubspec.yaml +++ b/modules/basic_system/app/pubspec.yaml @@ -5,38 +5,15 @@ homepage: publish_to: none environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" +resolution: workspace + dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.6 # 状态管理 - equatable: ^2.0.5 # 相等辅助 - shared_preferences: ^2.2.2 # xml 固化 - connectivity_plus: ^6.0.3 - url_launcher: ^6.1.14 # url - fx_platform_adapter: ^0.0.2+1 # 平台适配器 - fx_go_router_ext: 0.0.3 - storage: - path: ../storage - widget_module: - path: ../../widget_system/widget_module - components: - path: ../components - toly_ui: - path: ../toly_ui - l10n: - path: ../l10n -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.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 packages. flutter: # To add assets to your package, add an assets section, like this: diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 7fb4b174..01d8ca82 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -4,9 +4,9 @@ version: 0.0.1 homepage: publish_to: none environment: - sdk: '>=2.18.6 <3.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter @@ -20,10 +20,6 @@ dependencies: path: ../utils app: path: ../app -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/authentication/pubspec.yaml b/modules/basic_system/authentication/pubspec.yaml index f7a96759..258aaa06 100644 --- a/modules/basic_system/authentication/pubspec.yaml +++ b/modules/basic_system/authentication/pubspec.yaml @@ -4,9 +4,9 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.5 <3.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter @@ -26,10 +26,7 @@ dependencies: path: ../components toly_ui: path: ../toly_ui -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/components/pubspec.yaml b/modules/basic_system/components/pubspec.yaml index b36b54c4..b529d128 100644 --- a/modules/basic_system/components/pubspec.yaml +++ b/modules/basic_system/components/pubspec.yaml @@ -5,25 +5,14 @@ homepage: publish_to: none environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" +resolution: workspace + dependencies: flutter: sdk: flutter - flutter_spinkit: ^5.2.0 # loading - flutter_markdown: ^0.7.2+1 # markdown - dash_painter: ^1.0.2 - refresh: ^1.0.1 - - toly_ui: - path: ../toly_ui - app: - path: ../app -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/l10n/pubspec.yaml b/modules/basic_system/l10n/pubspec.yaml index 9b731b29..d5b23bf5 100644 --- a/modules/basic_system/l10n/pubspec.yaml +++ b/modules/basic_system/l10n/pubspec.yaml @@ -4,19 +4,14 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/storage/pubspec.yaml b/modules/basic_system/storage/pubspec.yaml index 864b3511..df10e193 100644 --- a/modules/basic_system/storage/pubspec.yaml +++ b/modules/basic_system/storage/pubspec.yaml @@ -4,19 +4,14 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.3 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" +resolution: workspace + dependencies: flutter: sdk: flutter - shared_preferences: ^2.2.1 # xml 固化 - fx_dao: 0.0.1+2 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/toly_ui/pubspec.yaml b/modules/basic_system/toly_ui/pubspec.yaml index 72ead5dc..7959688d 100644 --- a/modules/basic_system/toly_ui/pubspec.yaml +++ b/modules/basic_system/toly_ui/pubspec.yaml @@ -4,18 +4,13 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.3 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - flutter_markdown: ^0.7.2+1 # markdown -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/utils/lib/src/color_utils.dart b/modules/basic_system/utils/lib/src/color_utils.dart index 4d0f8f43..f95fdcae 100644 --- a/modules/basic_system/utils/lib/src/color_utils.dart +++ b/modules/basic_system/utils/lib/src/color_utils.dart @@ -36,10 +36,10 @@ class ColorUtils { print(e); } switch (code.length) { - case 1 + 6://6位 + case 7://6位 result = Color(value + 0xFF000000); break; - case 1 + 8://8位 + case 9://8位 result = Color(value); break; default: diff --git a/modules/basic_system/utils/pubspec.yaml b/modules/basic_system/utils/pubspec.yaml index 3cef9949..f6885348 100644 --- a/modules/basic_system/utils/pubspec.yaml +++ b/modules/basic_system/utils/pubspec.yaml @@ -4,18 +4,14 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.1 <3.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - dio: ^5.4.3+1 # 网络请求 - jwt_decoder: ^2.0.1 # jwt 解析 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/knowledge_system/algorithm/pubspec.yaml b/modules/knowledge_system/algorithm/pubspec.yaml index e0c4a7f6..51cf4b61 100644 --- a/modules/knowledge_system/algorithm/pubspec.yaml +++ b/modules/knowledge_system/algorithm/pubspec.yaml @@ -5,27 +5,16 @@ homepage: publish_to: none environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - # tolyui - tolyui: 0.0.2+19 - fx_go_router_ext: 0.0.3 - components: - path: ../../basic_system/components - toly_ui: - path: ../../basic_system/toly_ui - app: - path: ../../basic_system/app -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/knowledge_system/artifact/pubspec.yaml b/modules/knowledge_system/artifact/pubspec.yaml index dd30ad2e..96c3113b 100644 --- a/modules/knowledge_system/artifact/pubspec.yaml +++ b/modules/knowledge_system/artifact/pubspec.yaml @@ -4,35 +4,13 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=2.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.6 # 状态管理 - dio: ^5.3.2 # 网络请求 - webview_flutter: ^4.2.4 - storage: - path: ../../basic_system/storage - algorithm: - path: ../algorithm - components: - path: ../../basic_system/components - utils: - path: ../../basic_system/utils - layout: - path: ../layout - app: - path: ../../basic_system/app - l10n: - path: ../../basic_system/l10n - toly_ui: - path: ../../basic_system/toly_ui -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/knowledge_system/awesome/pubspec.yaml b/modules/knowledge_system/awesome/pubspec.yaml index 36a20d16..2c13654f 100644 --- a/modules/knowledge_system/awesome/pubspec.yaml +++ b/modules/knowledge_system/awesome/pubspec.yaml @@ -4,17 +4,13 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.3 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/knowledge_system/layout/pubspec.yaml b/modules/knowledge_system/layout/pubspec.yaml index 834ee78b..a1d73812 100644 --- a/modules/knowledge_system/layout/pubspec.yaml +++ b/modules/knowledge_system/layout/pubspec.yaml @@ -4,22 +4,15 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.3.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - # tolyui - tolyui: 0.0.2+19 - # 路由管理 - go_router: ^14.2.0 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^3.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/painting_system/draw_system/pubspec.yaml b/modules/painting_system/draw_system/pubspec.yaml index ece375ee..28e38def 100644 --- a/modules/painting_system/draw_system/pubspec.yaml +++ b/modules/painting_system/draw_system/pubspec.yaml @@ -5,28 +5,12 @@ homepage: publish_to: none environment: - sdk: '>=3.2.3 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - toly_ui: - path: ../../basic_system/toly_ui - l10n: - path: ../../basic_system/l10n - app: - path: ../../basic_system/app - components: - path: ../../basic_system/components - dash_painter: ^1.0.2 - flutter_bloc: ^8.1.6 # 状态管理 - url_launcher: ^6.1.14 # url - image: ^4.0.17 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/tools_system/treasure_tools/pubspec.yaml b/modules/tools_system/treasure_tools/pubspec.yaml index c16ce56a..a70d90ba 100644 --- a/modules/tools_system/treasure_tools/pubspec.yaml +++ b/modules/tools_system/treasure_tools/pubspec.yaml @@ -4,27 +4,13 @@ version: 0.0.1 homepage: environment: - sdk: '>=3.2.3 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.6 # 状态管理 - equatable: ^2.0.5 # 相等辅助 - archive: ^3.6.1 # 解压 - file_picker: ^8.0.5 - shared_preferences: ^2.2.2 # xml 固化 - utils: - path: ../../basic_system/utils - app: - path: ../../basic_system/app - toly_ui: - path: ../../basic_system/toly_ui -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -32,33 +18,33 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware +# To add assets to your package, add an assets section, like this: +# assets: +# - images/a_dot_burr.jpeg +# - images/a_dot_ham.jpeg +# +# For details regarding assets in packages, see +# https://flutter.dev/assets-and-images/#from-packages +# +# An image asset can refer to one or more resolution-specific "variants", see +# https://flutter.dev/assets-and-images/#resolution-aware - # To add custom fonts to your package, 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 in packages, see - # https://flutter.dev/custom-fonts/#from-packages +# To add custom fonts to your package, 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 in packages, see +# https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml index 18886ecd..d85bb913 100644 --- a/modules/widget_system/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -5,41 +5,14 @@ homepage: publish_to: none environment: - sdk: '>=3.0.0 <4.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - flutter_bloc: ^8.1.6 # 状态管理 - equatable: ^2.0.5 # 相等辅助 - flutter_star: ^1.0.2 # 星星组件 - toggle_rotate: ^1.0.1 - wrapper: ^1.0.2 - share_plus: ^10.0.1 # 文字分享 - go_router: ^14.2.0 - tolyui: 0.0.2+19 - storage: - path: ../../basic_system/storage - toly_ui: - path: ../../basic_system/toly_ui - components: - path: ../../basic_system/components - authentication: - path: ../../basic_system/authentication - app: - path: ../../basic_system/app - l10n: - path: ../../basic_system/l10n - widgets: - path: ../widgets - utils: - path: ../../basic_system/utils -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/widget_system/widgets/lib/utils/color_utils.dart b/modules/widget_system/widgets/lib/utils/color_utils.dart index 98b1151b..e1a2b49e 100644 --- a/modules/widget_system/widgets/lib/utils/color_utils.dart +++ b/modules/widget_system/widgets/lib/utils/color_utils.dart @@ -40,10 +40,10 @@ class ColorUtils { print(e); } switch (code.length) { - case 1 + 6://6位 + case 7://6位 result = Color(value + 0xFF000000); break; - case 1 + 8://8位 + case 9://8位 result = Color(value); break; default: diff --git a/modules/widget_system/widgets/pubspec.yaml b/modules/widget_system/widgets/pubspec.yaml index c900e345..d1999a16 100644 --- a/modules/widget_system/widgets/pubspec.yaml +++ b/modules/widget_system/widgets/pubspec.yaml @@ -4,23 +4,13 @@ version: 0.0.1 homepage: environment: - sdk: '>=2.18.6 <3.0.0' + sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" - +resolution: workspace dependencies: flutter: sdk: flutter - path_provider: ^2.1.3 # 路径 - intl: ^0.19.0 - app: - path: ../../basic_system/app - components: - path: ../../basic_system/components -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/pubspec.lock b/pubspec.lock index 607c26ea..e521bc5d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,29 +1,8 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - algorithm: - dependency: "direct main" - description: - path: "modules/knowledge_system/algorithm" - relative: true - source: path - version: "0.0.1" - app: - dependency: "direct main" - description: - path: "modules/basic_system/app" - relative: true - source: path - version: "0.0.1" - app_update: - dependency: "direct main" - description: - path: "modules/basic_system/app_update" - relative: true - source: path - version: "0.0.1" archive: - dependency: transitive + dependency: "direct main" description: name: archive sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d @@ -38,13 +17,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.0" - artifact: - dependency: "direct main" - description: - path: "modules/knowledge_system/artifact" - relative: true - source: path - version: "0.0.1" async: dependency: transitive description: @@ -53,13 +25,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.11.0" - authentication: - dependency: "direct main" - description: - path: "modules/basic_system/authentication" - relative: true - source: path - version: "0.0.1" bloc: dependency: transitive description: @@ -100,13 +65,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.18.0" - components: - dependency: "direct main" - description: - path: "modules/basic_system/components" - relative: true - source: path - version: "0.0.1" connectivity_plus: dependency: "direct main" description: @@ -148,7 +106,7 @@ packages: source: hosted version: "1.0.5" dash_painter: - dependency: transitive + dependency: "direct main" description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a @@ -172,20 +130,13 @@ packages: source: hosted version: "1.0.0+11" dio: - dependency: transitive + dependency: "direct main" description: name: dio sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" url: "https://pub.flutter-io.cn/" source: hosted version: "5.4.3+1" - draw_system: - dependency: "direct main" - description: - path: "modules/painting_system/draw_system" - relative: true - source: path - version: "0.0.1" equatable: dependency: "direct main" description: @@ -219,7 +170,7 @@ packages: source: hosted version: "6.1.4" file_picker: - dependency: transitive + dependency: "direct main" description: name: file_picker sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" @@ -243,17 +194,17 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.0.3" + version: "4.0.0" flutter_localizations: dependency: "direct main" description: flutter source: sdk version: "0.0.0" flutter_markdown: - dependency: transitive + dependency: "direct main" description: name: flutter_markdown sha256: "85cc6f7daeae537844c92e2d56e2aff61b00095f8f77913b529ea4be12fc45ea" @@ -269,7 +220,7 @@ packages: source: hosted version: "2.0.20" flutter_spinkit: - dependency: transitive + dependency: "direct main" description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 @@ -277,7 +228,7 @@ packages: source: hosted version: "5.2.1" flutter_star: - dependency: transitive + dependency: "direct main" description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" @@ -303,7 +254,7 @@ packages: source: hosted version: "0.1.1" fx_dao: - dependency: transitive + dependency: "direct main" description: name: fx_dao sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b @@ -311,7 +262,7 @@ packages: source: hosted version: "0.0.1+2" fx_go_router_ext: - dependency: transitive + dependency: "direct main" description: name: fx_go_router_ext sha256: a82d719d6f2026eaff97e466c7f8c34d75a55a58cfce469807df8a2211d91652 @@ -319,7 +270,7 @@ packages: source: hosted version: "0.0.3" fx_platform_adapter: - dependency: transitive + dependency: "direct main" description: name: fx_platform_adapter sha256: da5920bc99ef7f732d04742c2556702376e717bb0c0b8daa56840127d133c206 @@ -351,7 +302,7 @@ packages: source: hosted version: "4.0.2" image: - dependency: transitive + dependency: "direct main" description: name: image sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" @@ -367,27 +318,13 @@ packages: source: hosted version: "0.19.0" jwt_decoder: - dependency: transitive + dependency: "direct main" description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" - l10n: - dependency: "direct main" - description: - path: "modules/basic_system/l10n" - relative: true - source: path - version: "0.0.1" - layout: - dependency: "direct main" - description: - path: "modules/knowledge_system/layout" - relative: true - source: path - version: "0.0.1" leak_tracker: dependency: transitive description: @@ -416,10 +353,10 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.1" + version: "4.0.0" logging: dependency: transitive description: @@ -509,7 +446,7 @@ packages: source: hosted version: "1.9.0" path_provider: - dependency: transitive + dependency: "direct main" description: name: path_provider sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 @@ -629,7 +566,7 @@ packages: source: hosted version: "0.4.2" refresh: - dependency: transitive + dependency: "direct main" description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc @@ -645,7 +582,7 @@ packages: source: hosted version: "0.1.9" share_plus: - dependency: transitive + dependency: "direct main" description: name: share_plus sha256: "38658034f9f3c29f3b37ab0068db15caea9df2dd70d83e99300991a0d756c2a6" @@ -777,13 +714,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.11.1" - storage: - dependency: "direct main" - description: - path: "modules/basic_system/storage" - relative: true - source: path - version: "0.0.1" stream_channel: dependency: transitive description: @@ -825,20 +755,13 @@ packages: source: hosted version: "0.7.2" toggle_rotate: - dependency: transitive + dependency: "direct main" description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" - toly_ui: - dependency: "direct main" - description: - path: "modules/basic_system/toly_ui" - relative: true - source: path - version: "0.0.1" tolyui: dependency: "direct main" description: @@ -887,13 +810,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" - treasure_tools: - dependency: "direct main" - description: - path: "modules/tools_system/treasure_tools" - relative: true - source: path - version: "0.0.1" typed_data: dependency: transitive description: @@ -903,7 +819,7 @@ packages: source: hosted version: "1.3.1" url_launcher: - dependency: transitive + dependency: "direct main" description: name: url_launcher sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" @@ -966,13 +882,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.2" - utils: - dependency: "direct main" - description: - path: "modules/basic_system/utils" - relative: true - source: path - version: "0.0.1" uuid: dependency: transitive description: @@ -1006,7 +915,7 @@ packages: source: hosted version: "1.0.0" webview_flutter: - dependency: transitive + dependency: "direct main" description: name: webview_flutter sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" @@ -1037,20 +946,6 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "3.13.1" - widget_module: - dependency: "direct main" - description: - path: "modules/widget_system/widget_module" - relative: true - source: path - version: "0.0.1" - widgets: - dependency: "direct main" - description: - path: "modules/widget_system/widgets" - relative: true - source: path - version: "0.0.1" win32: dependency: transitive description: @@ -1068,7 +963,7 @@ packages: source: hosted version: "0.4.2" wrapper: - dependency: transitive + dependency: "direct main" description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" diff --git a/pubspec.yaml b/pubspec.yaml index 964903c8..edadf7a5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: flutter_unit -description: A new Flutter application. +description: All Platform Flutter Experience App. publish_to: none version: 3.0.0 author: 张风捷特烈 <1981462002@qq.com> @@ -7,7 +7,29 @@ homepage: https://juejin.cn/user/149189281194766/posts environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ">=3.5.0 <4.0.0" +workspace: + - modules/basic_system/app + - modules/basic_system/app_update + - modules/basic_system/authentication + - modules/basic_system/components + - modules/basic_system/l10n + - modules/basic_system/storage + - modules/basic_system/toly_ui + - modules/basic_system/utils + + - modules/knowledge_system/algorithm + - modules/knowledge_system/artifact + - modules/knowledge_system/awesome + - modules/knowledge_system/layout + + - modules/painting_system/draw_system + + - modules/tools_system/treasure_tools + + - modules/widget_system/widget_module + - modules/widget_system/widgets + dependencies: flutter: @@ -16,54 +38,48 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.4 + # 路由与状态管理 + go_router: ^14.2.0 # 路由管理 + flutter_bloc: ^8.1.6 # 状态管理 + ## fx 架构 + fx_platform_adapter: ^0.0.2+1 # 平台适配器 + fx_go_router_ext: 0.0.3 # 路由 + fx_dao: 0.0.1+2 # 数据库 fx_boot_starter: 0.1.1 # app 启动器 - go_router: ^14.2.0 - - flutter_bloc: ^8.1.6 # 状态管理 - equatable: ^2.0.5 # 相等辅助 + # 数据与持久化 + dio: ^5.4.3+1 # 网络请求 shared_preferences: ^2.2.2 # xml 固化 - connectivity_plus: ^6.0.3 - - # tolyui - tolyui: 0.0.2+19 - - l10n: - path: modules/basic_system/l10n - app: - path: modules/basic_system/app - utils: - path: modules/basic_system/utils - authentication: - path: modules/basic_system/authentication - components: - path: modules/basic_system/components - toly_ui: - path: modules/basic_system/toly_ui - storage: - path: modules/basic_system/storage - app_update: - path: modules/basic_system/app_update - widgets: - path: modules/widget_system/widgets - draw_system: - path: modules/painting_system/draw_system - artifact: - path: modules/knowledge_system/artifact - algorithm: - path: modules/knowledge_system/algorithm - widget_module: - path: modules/widget_system/widget_module - treasure_tools: - path: modules/tools_system/treasure_tools - layout: - path: modules/knowledge_system/layout + jwt_decoder: ^2.0.1 # jwt 解析 + path_provider: ^2.1.3 # 路径 + + # 平台功能 + connectivity_plus: ^6.0.3 # 网络状态 + url_launcher: ^6.1.14 # url + archive: ^3.6.1 # 解压 + file_picker: ^8.0.5 # 文件选择器 + share_plus: ^10.0.1 # 文字分享 + + # 视图展示 + tolyui: 0.0.2+19 # tolyui + refresh: ^1.0.1 # 下拉刷新 + dash_painter: ^1.0.2 # 虚线 + flutter_star: ^1.0.2 # 星星组件 + flutter_spinkit: ^5.2.0 # loading + toggle_rotate: ^1.0.1 # 点击旋转 + wrapper: ^1.0.2 # 气泡包裹 + webview_flutter: ^4.2.4 # webview + flutter_markdown: ^0.7.2+1 # markdown + + # 逻辑处理 + image: ^4.0.17 # 图像处理 + equatable: ^2.0.5 # 相等辅助 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^4.0.0 dependency_overrides: web: ^1.0.0 From ac56c110a11abd8a900d0a0d3a16aaf4e548c2c5 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 10 Nov 2024 19:39:09 +0800 Subject: [PATCH 104/149] WidgetDetail --- assets/fonts/{CHOPS.TTF => CHOPS.ttf} | Bin lib/src/flutter_unit.dart | 4 +- lib/src/starter/fx_application.dart | 2 +- lib/src/starter/start_repository.dart | 4 + modules/basic_system/app/lib/app.dart | 3 +- .../basic_system/app/lib/app/cons/cons.dart | 43 +------- .../app/lib/app/host/unit_host.dart | 34 ++++++ .../artifact/lib/src/points/bloc/bloc.dart | 4 + .../lib/src/points/bloc/point_bloc.dart | 55 ++++++++++ .../points/bloc/point_bloc/point_bloc.dart | 28 ----- .../points/bloc/point_bloc/point_event.dart | 16 --- .../points/bloc/point_bloc/point_state.dart | 38 ------- .../src/points/bloc/point_comment_bloc.dart | 74 +++++++++++++ .../point_comment_bloc.dart | 36 ------- .../point_comment_event.dart | 19 ---- .../point_comment_state.dart | 56 ---------- .../src/points/bloc/point_system_bloc.dart | 9 -- .../lib/src/points/data/api/issues_api.dart | 26 ----- .../artifact/lib/src/points/exp.dart | 2 +- .../src/points/repository/api/point_api.dart | 46 +++++++++ .../points/view/desk_ui/desk_point_page.dart | 24 ++++- .../points/view/issues_point/issue_item.dart | 90 ++++++++-------- .../view/issues_point/issues_detail.dart | 2 +- .../view/issues_point/issues_point_page.dart | 55 +++++----- .../lib/data/db_impl/node_db_repository.dart | 2 +- .../data/db_impl/widget_db_repository.dart | 17 ++- .../memory_impl/memory_node_repository.dart | 6 -- .../memory_impl/memory_widget_repository.dart | 3 - .../widget_module/lib/data/model/enums.dart | 13 --- .../widget_module/lib/data/model/model.dart | 4 +- .../lib/data/model/widget_filter.dart | 48 --------- .../lib/data/model/widget_model.dart | 2 - .../widget_detail/widget_detail_page.dart | 77 +++++--------- .../widget_panel/desk_widget_model_item.dart | 97 +++++++++--------- pubspec.lock | 19 +++- pubspec.yaml | 5 +- 36 files changed, 424 insertions(+), 539 deletions(-) rename assets/fonts/{CHOPS.TTF => CHOPS.ttf} (100%) create mode 100644 modules/basic_system/app/lib/app/host/unit_host.dart create mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart create mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart create mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart delete mode 100644 modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart create mode 100644 modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart delete mode 100644 modules/widget_system/widget_module/lib/data/model/enums.dart delete mode 100644 modules/widget_system/widget_module/lib/data/model/widget_filter.dart diff --git a/assets/fonts/CHOPS.TTF b/assets/fonts/CHOPS.ttf similarity index 100% rename from assets/fonts/CHOPS.TTF rename to assets/fonts/CHOPS.ttf diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 5a79a610..130e8513 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -18,7 +18,7 @@ import 'navigation/router/app_route.dart'; /// 说明: 应用主程序 class FlutterUnit3 extends StatefulWidget { - const FlutterUnit3({super.key}); + const FlutterUnit3({super.key}); @override State createState() => _FlutterUnit3State(); @@ -71,7 +71,7 @@ class _FlutterUnit3State extends State { } void _initWeb() { - if(!kAppEnv.isWeb)return; + if (!kAppEnv.isWeb) return; GoRouter.optionURLReflectsImperativeAPIs = true; context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); } diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index d6071eb9..8719539f 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -17,7 +17,7 @@ class FxApplication with FxStarter { const FxApplication(); @override - Widget get app => AppBlocProvider(child: FlutterUnit3()); + Widget get app => const AppBlocProvider(child: FlutterUnit3()); @override AppStartRepository get repository => const FlutterUnitStartRepo(); diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index d8b390fd..b1d22413 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; +import 'package:fx_dio/fx_dio.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; @@ -26,6 +27,9 @@ class FlutterUnitStartRepo implements AppStartRepository { WindowSizeAdapter.setSize(); // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); + + FxDio().register([const UnitHost()]); + if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); AppConfigPo po = await SpStorage.instance.appConfig.read(); diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart index 599ab59a..8f733e6a 100644 --- a/modules/basic_system/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -24,4 +24,5 @@ export 'app_config/app_config.dart'; export 'app/action/action.dart'; export 'app/router/app_route.dart'; -export 'view/view.dart'; \ No newline at end of file +export 'view/view.dart'; +export 'app/host/unit_host.dart'; \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/cons/cons.dart b/modules/basic_system/app/lib/app/cons/cons.dart index 95cc7744..5cd60f3e 100644 --- a/modules/basic_system/app/lib/app/cons/cons.dart +++ b/modules/basic_system/app/lib/app/cons/cons.dart @@ -9,8 +9,6 @@ import '../res/toly_icon.dart'; class Cons { - static const menuInfo = ["关于", "帮助", "问题反馈"]; //菜单栏 - static const List tabColors = [ Color(0xff44D1FD), Color(0xffFD4F43), @@ -21,22 +19,7 @@ class Cons { Color(0xFFDBD83F), ]; - static const tabs = [ - 'Stles', - 'Stful', - 'Scrow', - 'Mcrow', - 'Sliver', - 'Proxy', - 'Other' - ]; //标题列表 - - static const iconMap = { - //底栏图标 - "组件集录": TolyIcon.icon_layout, "收藏集录": TolyIcon.icon_star, - "绘制集录": Icons.palette, "布局集录": Icons.widgets, - "要点集录": TolyIcon.icon_bug, - }; + static const List kFontFamilySupport = [ 'local', @@ -66,30 +49,6 @@ class Cons { HighlighterStyle.fromColors(HighlighterStyle.solarized):"cst - Power By cst", }; - - // static final kThemeColorSupport = { - // Colors.red: "毁灭之红", - // Colors.orange: "愤怒之橙", - // Colors.yellow: "警告之黄", - // Colors.green: "伪装之绿", - // Colors.blue: "冷漠之蓝", - // Colors.indigo: "无限之靛", - // Colors.purple: "神秘之紫", - // - // const MaterialColor(0xff2D2D2D, { - // 50: Color(0xFF8A8A8A), - // 100: Color(0xFF747474), - // 200: Color(0xFF616161), - // 300: Color(0xFF484848), - // 400: Color(0xFF3D3D3D), - // 500: Color(0xff2D2D2D), - // 600: Color(0xFF252525), - // 700: Color(0xFF141414), - // 800: Color(0xFF050505), - // 900: Color(0xff000000), - // }): "归宿之黑" - // }; - } enum ThemeColor { diff --git a/modules/basic_system/app/lib/app/host/unit_host.dart b/modules/basic_system/app/lib/app/host/unit_host.dart new file mode 100644 index 00000000..e91081d8 --- /dev/null +++ b/modules/basic_system/app/lib/app/host/unit_host.dart @@ -0,0 +1,34 @@ +import 'package:fx_dio/fx_dio.dart'; + +class UnitHost extends Host { + const UnitHost(); + + @override + Map get value => { + HostEnv.release: 'api.toly1994.com', + }; + + @override + HostConfig get config => const HostConfig( + scheme: 'http', + port: 8080, + apiNest: '/api/v1', + ); + + @override + HostEnv get env => HostEnv.release; +} + +enum UnitApi { + hello("/hello"), + + repository("/repository/name/FlutterUnit"), + point("/point"), + pointComment("/pointComment/"), + ; + + final String path; + final Method? method; + + const UnitApi(this.path, [this.method = Method.get]); +} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart new file mode 100644 index 00000000..89c84966 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/bloc.dart @@ -0,0 +1,4 @@ +export 'point_comment_bloc.dart'; +export 'point_bloc.dart'; + + diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart new file mode 100644 index 00000000..d6b2cb11 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart @@ -0,0 +1,55 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../repository/api/point_api.dart'; +import 'package:equatable/equatable.dart'; +import '../data/model/issue.dart'; + +/// create by 张风捷特烈 on 2020-09-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointBloc extends Cubit { + final PointApi api; + + PointBloc(this.api) : super(const PointLoading()); + + void loadPoint() async { + emit(const PointLoading()); + try { + final issues = await api.getIssues(); + emit(PointLoaded(issues)); + } catch (err) { + print(err); + emit(PointLoadFailure(err.toString())); + } + } +} + +sealed class PointState extends Equatable { + const PointState(); +} + +class PointLoading extends PointState { + const PointLoading(); + + @override + List get props => []; +} + +class PointLoaded extends PointState { + final List issues; + + const PointLoaded(this.issues); + + @override + List get props => [issues]; +} + +class PointLoadFailure extends PointState { + final String error; + + const PointLoadFailure(this.error); + + @override + List get props => [error]; +} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart deleted file mode 100644 index 685cf31a..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_bloc.dart +++ /dev/null @@ -1,28 +0,0 @@ - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../data/api/issues_api.dart'; -import 'point_event.dart'; -import 'point_state.dart'; - - -/// create by 张风捷特烈 on 2020-09-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PointBloc extends Bloc { - PointBloc() : super(PointLoading()){ - on(_onEventLoadPoint); - } - - void _onEventLoadPoint(PointEvent event,Emitter emit) async{ - emit( PointLoading()); - try { - final issues = await IssuesApi.getIssues(); - emit( PointLoaded(issues)); - } catch (err) { - print(err); - emit( PointLoadFailure(err.toString())); - } - } -} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart deleted file mode 100644 index 5c686d59..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_event.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointEvent extends Equatable { - -} - -class EventLoadPoint extends PointEvent{ - - @override - List get props => []; - -} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart deleted file mode 100644 index 7e83db63..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc/point_state.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../data/model/issue.dart'; - - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointState extends Equatable{ - -} - -class PointLoading extends PointState{ - @override - List get props => []; -} - -class PointLoaded extends PointState{ - - final List issues; - - PointLoaded(this.issues); - - @override - List get props => [issues]; -} - - -class PointLoadFailure extends PointState{ - - final String error; - - PointLoadFailure(this.error); - - @override - List get props => [error]; -} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart new file mode 100644 index 00000000..7cffbf43 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart @@ -0,0 +1,74 @@ +import 'package:artifact/src/points/repository/api/point_api.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../data/model/github_model.dart'; +import 'package:equatable/equatable.dart'; + +/// create by 张风捷特烈 on 2020-09-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointCommentBloc extends Cubit { + final PointApi api = PointApiImpl(); + + PointCommentBloc() : super(const PointCommentInitial()); + + void loadPointComment(Issue point) async { + emit(PointCommentLoading(point)); + if (point.number == null) { + emit(const PointCommentLoadFailure('point_bloc id 为空')); + } + try { + final List comments = await api.getIssuesComment(point.number!); + comments.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); + emit(PointCommentLoaded(point, comments)); + } catch (err) { + print(err); + emit(PointCommentLoadFailure(err.toString())); + } + } +} + +sealed class PointCommentState extends Equatable { + const PointCommentState(); +} + +class PointCommentInitial extends PointCommentState { + const PointCommentInitial(); + + @override + List get props => []; +} + +class PointCommentLoading extends PointCommentState { + final Issue issue; + + const PointCommentLoading(this.issue); + + @override + List get props => [issue]; +} + +class PointCommentLoaded extends PointCommentState { + final Issue issue; + final List comments; + + const PointCommentLoaded(this.issue, this.comments); + + @override + List get props => [issue, comments]; + + @override + String toString() { + return 'PointCommentLoaded{issue: $issue, comments: $comments}'; + } +} + +class PointCommentLoadFailure extends PointCommentState { + final String error; + + const PointCommentLoadFailure(this.error); + + @override + List get props => [error]; +} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart deleted file mode 100644 index fa838be9..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_bloc.dart +++ /dev/null @@ -1,36 +0,0 @@ - -import 'package:flutter_bloc/flutter_bloc.dart'; - - - -import '../../data/api/issues_api.dart'; -import '../../data/model/github_model.dart'; -import 'point_comment_event.dart'; -import 'point_comment_state.dart'; - - -/// create by 张风捷特烈 on 2020-09-03 -/// contact me by email 1981462002@qq.com -/// 说明: - -class PointCommentBloc extends Bloc { - - PointCommentBloc() : super(PointCommentInitial()){ - on(_onEventLoadPointComment); - } - - void _onEventLoadPointComment(EventLoadPointComment event,Emitter emit) async{ - emit( PointCommentLoading(event.point)); - if(event.point.number==null){ - emit( PointCommentLoadFailure('point_bloc id 为空')); - } - try { - final List comments = await IssuesApi.getIssuesComment(event.point.number!); - comments.sort((a,b)=>a.createdAt!.compareTo(b.createdAt!)); - emit( PointCommentLoaded(event.point,comments)); - } catch (err) { - print(err); - emit( PointCommentLoadFailure(err.toString())); - } - } -} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart deleted file mode 100644 index 8e7f8bea..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_event.dart +++ /dev/null @@ -1,19 +0,0 @@ - - -import 'package:equatable/equatable.dart'; -import '../../data/model/issue.dart'; - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointCommentEvent extends Equatable {} - -class EventLoadPointComment extends PointCommentEvent { - final Issue point; - - EventLoadPointComment(this.point); - - @override - List get props => [point]; -} diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart deleted file mode 100644 index dfd73f6a..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc/point_comment_state.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../data/model/github_model.dart'; -import '../../data/model/issue.dart'; - - -/// create by 张风捷特烈 on 2020/9/3 -/// contact me by email 1981462002@qq.com -/// 说明: - -abstract class PointCommentState extends Equatable{ - -} - -class PointCommentInitial extends PointCommentState{ - - - @override - List get props => []; -} - -class PointCommentLoading extends PointCommentState{ - final Issue issue; - - PointCommentLoading(this.issue); - - @override - List get props => [issue]; -} - -class PointCommentLoaded extends PointCommentState{ - - final Issue issue; - final List comments; - - PointCommentLoaded(this.issue,this.comments); - - @override - List get props => [issue,comments]; - - @override - String toString() { - return 'PointCommentLoaded{issue: $issue, comments: $comments}'; - } -} - - -class PointCommentLoadFailure extends PointCommentState{ - - final String error; - - PointCommentLoadFailure(this.error); - - @override - List get props => [error]; -} \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart deleted file mode 100644 index e9642c71..00000000 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_system_bloc.dart +++ /dev/null @@ -1,9 +0,0 @@ -export './point_comment_bloc/point_comment_bloc.dart'; -export './point_comment_bloc/point_comment_event.dart'; -export './point_comment_bloc/point_comment_state.dart'; - -export './point_bloc/point_bloc.dart'; -export './point_bloc/point_event.dart'; -export './point_bloc/point_state.dart'; - - diff --git a/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart b/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart index 4162dc92..9856b9a4 100644 --- a/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart +++ b/modules/knowledge_system/artifact/lib/src/points/data/api/issues_api.dart @@ -11,29 +11,3 @@ import '../model/repository.dart'; /// contact me by email 1981462002@qq.com /// 说明: -const kBaseUrl = 'http://toly1994.com:8080/api/v1'; - -class IssuesApi { - static Dio dio = Dio(BaseOptions(baseUrl: kBaseUrl)); - - static Future getRepoFlutterUnit() async { - Response rep = await dio.get('/repository/name/FlutterUnit'); - dynamic repoStr = rep.data['data']['repositoryData']; - return Repository.fromJson(json.decode(repoStr)); - } - - static Future> getIssues( - {int page = 1, int pageSize = 100}) async { - List res = (await dio.get('/point', - queryParameters: {"page": page, "pageSize": pageSize})) - .data['data'] as List; - return res.map((e) => Issue.fromJson(json.decode(e['pointData']))).toList(); - } - - static Future> getIssuesComment(int pointId) async { - List res = (await dio.get('/pointComment/$pointId')).data['data'] as List; - return res - .map((e) => IssueComment.fromJson(json.decode(e['pointCommentData']))) - .toList(); - } -} diff --git a/modules/knowledge_system/artifact/lib/src/points/exp.dart b/modules/knowledge_system/artifact/lib/src/points/exp.dart index 720d052f..dd213594 100644 --- a/modules/knowledge_system/artifact/lib/src/points/exp.dart +++ b/modules/knowledge_system/artifact/lib/src/points/exp.dart @@ -5,4 +5,4 @@ export 'view/desk_ui/github_repo_panel.dart'; export 'view/issues_point/issues_point_page.dart'; export 'view/issues_point/issues_detail.dart'; -export 'bloc/point_system_bloc.dart'; \ No newline at end of file +export 'bloc/bloc.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart new file mode 100644 index 00000000..3a8f0c03 --- /dev/null +++ b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart @@ -0,0 +1,46 @@ +import 'dart:convert'; + +import '../../data/model/issue.dart'; +import '../../data/model/issue_comment.dart'; +import '../../data/model/repository.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +abstract interface class PointApi { + /// 获取 github 中 FlutterUnit 仓库信息 + Future getFlutterUnitRepo(); + + /// 获取 github 中 FlutterUnit 仓库 issues 列表 + Future> getIssues(); + + Future> getIssuesComment(int pointId); +} + +class PointApiImpl implements PointApi { + Dio get dio => FxDio()(); + + @override + Future getFlutterUnitRepo() async { + Response rep = await dio.get(UnitApi.repository.path); + dynamic repoStr = rep.data['data']['repositoryData']; + return Repository.fromJson(json.decode(repoStr)); + } + + @override + Future> getIssues({int page = 1, int pageSize = 100}) async { + Response rep = await dio.get(UnitApi.point.path, queryParameters: { + "page": page, + "pageSize": pageSize, + }); + return rep.data['data'].map((e) => Issue.fromJson(json.decode(e['pointData']))).toList(); + } + + @override + Future> getIssuesComment(int pointId) async { + Response rep = await dio.get("${UnitApi.pointComment.path}$pointId"); + + return rep.data['data'] + .map((e) => IssueComment.fromJson(json.decode(e['pointCommentData']))) + .toList(); + } +} diff --git a/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart index c7e330cf..d009cee9 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -4,9 +4,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; -import '../../bloc/point_bloc/point_bloc.dart'; -import '../../bloc/point_system_bloc.dart'; +import '../../bloc/point_bloc.dart'; +import '../../bloc/bloc.dart'; import '../../data/model/repository.dart'; +import '../../repository/api/point_api.dart'; import '../issues_point/issues_point_page.dart'; import 'github_repo_panel.dart'; @@ -19,7 +20,7 @@ class DeskPointPage extends StatefulWidget { class _DeskPointPageState extends State { - final Repository _repository = Repository.fromJson({ + Repository _repository = Repository.fromJson({ 'full_name': 'toly1994328/FlutterUnit', 'license': {"spdx_id": 'GPL-3.0'}, 'description': @@ -30,10 +31,25 @@ class _DeskPointPageState extends State { 'open_issues_count': 40, }); + final PointApi _api = PointApiImpl(); + + @override + void initState() { + super.initState(); + _loadRepo(); + } + + void _loadRepo() async { + final Repository result = await _api.getFlutterUnitRepo(); + setState(() { + _repository = result; + }); + } + @override Widget build(BuildContext context) { return BlocProvider( - create: (_) => PointBloc()..add(EventLoadPoint()), + create: (_) => PointBloc(_api)..loadPoint(), child: Scaffold( body: Column( children: [ diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart index 34a38c98..de2aaded 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issue_item.dart @@ -13,55 +13,61 @@ import '../../data/model/issue.dart'; class IssueItem extends StatelessWidget { final Issue issue; + final ValueChanged onTap; - const IssueItem({Key? key, required this.issue}) : super(key: key); + const IssueItem({ + super.key, + required this.issue, + required this.onTap, + }); @override Widget build(BuildContext context) { bool isDark = Theme.of(context).brightness == Brightness.dark; - return Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).dividerTheme.color??Colors.transparent, - width: 1 / window.devicePixelRatio)), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTop(), - Padding( - padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), - child: Text( - '${issue.title}', - style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ - Shadow( - color: isDark ? Colors.black : Colors.white, - offset: Offset(1, .5)) - ]), - ), - ), - Row( - children: [ - const Spacer(), - WrapColor( - color: Colors.greenAccent, - child: Text( - issue.commentNum.toString(), - style: const TextStyle(color: Colors.white), - )), - const SizedBox( - width: 5, - ), - const Icon( - TolyIcon.icon_common, - size: 20, + return GestureDetector( + onTap: () => onTap(issue), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerTheme.color ?? Colors.transparent, + width: 1 / window.devicePixelRatio)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTop(), + Padding( + padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), + child: Text( + '${issue.title}', + style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ + Shadow(color: isDark ? Colors.black : Colors.white, offset: Offset(1, .5)) + ]), ), - ], - ) - ], + ), + Row( + children: [ + const Spacer(), + WrapColor( + color: Colors.greenAccent, + child: Text( + issue.commentNum.toString(), + style: const TextStyle(color: Colors.white), + )), + const SizedBox( + width: 5, + ), + const Icon( + TolyIcon.icon_common, + size: 20, + ), + ], + ) + ], + ), ), ); } diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart index 35c5ac74..0338d57e 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_detail.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:utils/utils.dart'; -import '../../bloc/point_system_bloc.dart'; +import '../../bloc/bloc.dart'; import '../../data/model/github_model.dart'; import '../../data/model/issue.dart'; diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart index ec3b39c5..108ea72b 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; - -import '../../bloc/point_system_bloc.dart'; +import '../../bloc/bloc.dart'; import '../../data/api/issues_api.dart'; import '../../data/model/issue.dart'; import '../../data/model/repository.dart'; +import '../../repository/api/point_api.dart'; import 'issue_item.dart'; import 'issues_detail.dart'; import 'repo_widget.dart'; @@ -17,19 +17,21 @@ import 'repo_widget.dart'; /// 说明: class IssuesPointScope extends StatelessWidget { - const IssuesPointScope({Key? key}) : super(key: key); + const IssuesPointScope({super.key}); @override Widget build(BuildContext context) { - return MultiBlocProvider(providers: [ - BlocProvider(create: (_) => PointBloc()..add(EventLoadPoint())), - ], child: const IssuesPointPage(), + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => PointBloc(PointApiImpl())..loadPoint()), + ], + child: const IssuesPointPage(), ); } } class IssuesPointPage extends StatelessWidget { - const IssuesPointPage({Key? key}) : super(key: key); + const IssuesPointPage({super.key}); @override Widget build(BuildContext context) { @@ -38,10 +40,10 @@ class IssuesPointPage extends StatelessWidget { } class IssuesPointContent extends StatefulWidget { - const IssuesPointContent({Key? key}) : super(key: key); + const IssuesPointContent({super.key}); @override - _IssuesPointContentState createState() => _IssuesPointContentState(); + State createState() => _IssuesPointContentState(); } class _IssuesPointContentState extends State { @@ -81,20 +83,11 @@ class _IssuesPointContentState extends State { if (state is PointLoaded) { List issues = state.issues; return SliverList( - delegate: SliverChildBuilderDelegate( - (ctx, int index) => GestureDetector( - onTap: () { - Navigator.of(context).push(SlidePageRoute( - child: BlocProvider( - create: (_) => PointCommentBloc() - ..add(EventLoadPointComment(issues[index])), - child: const IssuesDetailPage()))); - - // Navigator.pushNamed(ctx, UnitRouter. - // ); - }, - child: IssueItem(issue: issues[index])), - childCount: issues.length),); + delegate: SliverChildBuilderDelegate( + (ctx, int index) => IssueItem(onTap: toDetailPage, issue: issues[index]), + childCount: issues.length, + ), + ); } if (state is PointLoadFailure) { @@ -112,6 +105,17 @@ class _IssuesPointContentState extends State { ); } + void toDetailPage(Issue issue) { + Navigator.of(context).push( + SlidePageRoute( + child: BlocProvider( + create: (_) => PointCommentBloc()..loadPointComment(issue), + child: const IssuesDetailPage(), + ), + ), + ); + } + Widget _buildSliverAppBar() { return SliverAppBar( expandedHeight: 210.0, @@ -149,12 +153,13 @@ class _IssuesPointContentState extends State { } Future _loadIssues() async { - BlocProvider.of(context).add(EventLoadPoint()); + BlocProvider.of(context).loadPoint(); await Future.delayed(const Duration(milliseconds: 200)); } void _loadRepo() async { - final Repository result = await IssuesApi.getRepoFlutterUnit(); + PointApi api = context.read().api; + final Repository result = await api.getFlutterUnitRepo(); setState(() { _repository = result; }); diff --git a/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart b/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart index 3eeac0a5..05c5d02e 100644 --- a/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart +++ b/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart @@ -9,7 +9,7 @@ class NodeDbRepository implements NodeRepository{ const NodeDbRepository(); - NodeDao get nodeDao => AppStorage().flutter()!; + NodeDao get nodeDao => AppStorage().flutter(); @override Future> loadNode(int widgetId) async{ diff --git a/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart b/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart index 473ad82e..36fbe564 100644 --- a/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart +++ b/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart @@ -1,20 +1,17 @@ - import 'package:storage/storage.dart'; import '../zone.dart'; - - /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com /// 说明 : Widget数据仓库 class WidgetDbRepository implements WidgetRepository { - const WidgetDbRepository(); - WidgetDao get widgetDao => AppStorage().flutter()!; - LikeDao get likeDao => AppStorage().flutter()!; + WidgetDao get widgetDao => AppStorage().flutter(); + + LikeDao get likeDao => AppStorage().flutter(); @override Future> loadLikeWidgets() async { @@ -55,10 +52,10 @@ class WidgetDbRepository implements WidgetRepository { Future total(WidgetFilter args) => widgetDao.total(args); @override - Future queryWidgetByName(String? name) async{ - if(name==null) return null; - Map? data = await widgetDao.queryWidgetByName(name); - if(data!=null){ + Future queryWidgetByName(String? name) async { + if (name == null) return null; + Map? data = await widgetDao.queryWidgetByName(name); + if (data != null) { return WidgetModel.fromPo(WidgetPo.fromJson(data)); } return null; diff --git a/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart b/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart index 11919387..1d62b249 100644 --- a/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart +++ b/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart @@ -1,15 +1,9 @@ import 'dart:convert'; -import 'dart:io'; - import 'package:flutter/services.dart'; import 'package:storage/storage.dart'; -import '../model/enums.dart'; import '../model/node_model.dart'; -import '../model/widget_filter.dart'; -import '../model/widget_model.dart'; import '../node_repository.dart'; -import '../widget_repository.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart b/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart index ad375a2e..7fe86dd9 100644 --- a/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart +++ b/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart @@ -1,10 +1,7 @@ import 'dart:convert'; -import 'dart:io'; - import 'package:flutter/services.dart'; import 'package:storage/storage.dart'; -import '../model/widget_filter.dart'; import '../model/widget_model.dart'; import '../widget_repository.dart'; diff --git a/modules/widget_system/widget_module/lib/data/model/enums.dart b/modules/widget_system/widget_module/lib/data/model/enums.dart deleted file mode 100644 index 2f4f720b..00000000 --- a/modules/widget_system/widget_module/lib/data/model/enums.dart +++ /dev/null @@ -1,13 +0,0 @@ -// /// create by 张风捷特烈 on 2020-03-07 -// /// contact me by email 1981462002@qq.com -// /// 说明: -// -// enum WidgetFamily { -// statelessWidget, -// statefulWidget, -// singleChildRenderObjectWidget, -// multiChildRenderObjectWidget, -// sliver, -// proxyWidget, -// other, -// } diff --git a/modules/widget_system/widget_module/lib/data/model/model.dart b/modules/widget_system/widget_module/lib/data/model/model.dart index f79c5c9d..be0c197b 100644 --- a/modules/widget_system/widget_module/lib/data/model/model.dart +++ b/modules/widget_system/widget_module/lib/data/model/model.dart @@ -1,5 +1,3 @@ export 'node_model.dart'; export 'widget_model.dart'; -export 'category_model.dart'; -export 'enums.dart'; -export 'widget_filter.dart'; \ No newline at end of file +export 'category_model.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/model/widget_filter.dart b/modules/widget_system/widget_module/lib/data/model/widget_filter.dart deleted file mode 100644 index 95620a52..00000000 --- a/modules/widget_system/widget_module/lib/data/model/widget_filter.dart +++ /dev/null @@ -1,48 +0,0 @@ -// import 'enums.dart'; -// -// -// -// class WidgetFilter { -// final String name; -// final WidgetFamily? family; -// final List stars; -// final int page; -// final int pageSize; -// -// const WidgetFilter({ -// this.name = '', -// this.family, -// this.stars = const [-1, -1, -1, -1, -1], -// this.page = 1, -// this.pageSize = 20, -// }); -// -// int get offset =>pageSize*(page-1); -// -// WidgetFilter.family( -// this.family, { -// this.name = '*', -// this.page = 1, -// this.pageSize = 20, -// this.stars = const [1, 2, 3, 4, 5], -// }); -// -// WidgetFilter copyWith({ -// String? name, -// WidgetFamily? family, -// List? stars, -// int? page, -// }) { -// return WidgetFilter( -// name: name ?? this.name, -// family: family ?? this.family, -// stars: stars ?? this.stars, -// page: page ?? this.page, -// ); -// } -// -// @override -// String toString() { -// return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; -// } -// } diff --git a/modules/widget_system/widget_module/lib/data/model/widget_model.dart b/modules/widget_system/widget_module/lib/data/model/widget_model.dart index 714124f1..20c02bd6 100644 --- a/modules/widget_system/widget_module/lib/data/model/widget_model.dart +++ b/modules/widget_system/widget_module/lib/data/model/widget_model.dart @@ -2,8 +2,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; import 'package:storage/storage.dart'; -import 'enums.dart'; - /// create by 张风捷特烈 on 2020-03-04 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 831707f9..029c57dd 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -32,7 +32,8 @@ class _DeskWidgetDetailPageScopeState extends State { WidgetModel? _model; WidgetRepository get widgetRepository => context.read().repository; - NodeRepository get nodeRepository => kIsWeb? MemoryNodeRepository():const NodeDbRepository(); + + NodeRepository get nodeRepository => kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); @override void initState() { @@ -45,17 +46,12 @@ class _DeskWidgetDetailPageScopeState extends State { void _loadModelByName() async { _model = await widgetRepository.queryWidgetByName(widget.widgetName); - setState(() { - - }); + setState(() {}); } @override Widget build(BuildContext context) { - if (_model == null) - return Center( - child: CupertinoActivityIndicator(), - ); + if (_model == null) return const Center(child: CupertinoActivityIndicator()); return BlocProvider( create: (_) => WidgetDetailBloc( @@ -77,15 +73,14 @@ class DeskWidgetDetailPage extends StatelessWidget { @override Widget build(BuildContext context) { WidgetDetailBloc bloc = context.watch(); - - return BlocBuilder( - builder: (_, state) => Scaffold( - backgroundColor: Colors.white, - endDrawer: CategoryEndDrawer(widget: bloc.currentWidget), - body: Builder(builder: (ctx) { - return _buildContent(ctx, bloc); - }), - ), + DetailState state = context.watch().state; + WidgetModel widget = bloc.currentWidget; + return Scaffold( + backgroundColor: Theme.of(context).appBarTheme.backgroundColor, + endDrawer: CategoryEndDrawer(widget: widget), + body: Builder(builder: (ctx) { + return _buildContent(ctx, bloc, state); + }), ); } @@ -99,8 +94,7 @@ class DeskWidgetDetailPage extends StatelessWidget { ], ); - Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { - DetailState state = bloc.state; + Widget _buildContent(BuildContext context, WidgetDetailBloc bloc, DetailState state) { return WillPopScope( onWillPop: () => _whenPop(context), child: CustomScrollView( @@ -113,26 +107,17 @@ class DeskWidgetDetailPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: DeskWidgetDetailPanel( - model: bloc.currentWidget, - ), - ), - const SizedBox( - width: 20, + child: DeskWidgetDetailPanel(model: bloc.currentWidget), ), + const SizedBox(width: 20), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox( - height: 16, - ), + const SizedBox(height: 16), linkText(context), if (state is DetailWithData) - LinkWidgetButtons( - links: state.links, - onSelect: bloc.push, - ) + LinkWidgetButtons(links: state.links, onSelect: bloc.push) ], )) ], @@ -160,25 +145,15 @@ class DeskWidgetDetailPage extends StatelessWidget { return SliverList( delegate: SliverChildBuilderDelegate( - (_, i) => - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24.0), - child: NodeDisplay( - node: nodes[i], - nodeIndex: i, - style: globalState.codeStyle, - widget: model, - ), - ), - // DeskWidgetNodePanel( - // codeStyle: globalState.codeStyle, - // codeFamily: 'Inconsolata', - // text: nodes[i].name, - // subText: nodes[i].subtitle, - // code: nodes[i].code, - // death: model.death, - // show: WidgetsMap.map(model.name)[i], - // ), + (_, i) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: NodeDisplay( + node: nodes[i], + nodeIndex: i, + style: globalState.codeStyle, + widget: model, + ), + ), childCount: nodes.length, )); } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 6d2fd8d7..edd97098 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -8,46 +8,43 @@ import 'package:widget_module/views/components/collected_tag.dart'; import '../../../../data/zone.dart'; import 'package:wrapper/wrapper.dart'; - - class DeskWidgetItem extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; final String? searchArg; - const DeskWidgetItem( - {Key? key, required this.model, required this.onTap, this.searchArg}) - : super(key: key); + const DeskWidgetItem({ + super.key, + required this.model, + required this.onTap, + this.searchArg, + }); @override Widget build(BuildContext context) { - Color? tileColor = Theme.of(context).listTileTheme.tileColor; Color? textColor = Theme.of(context).listTileTheme.textColor; bool isDark = Theme.of(context).brightness == Brightness.dark; - textColor = isDark?textColor: Color(0xff2F3032); + textColor = isDark ? textColor : Color(0xff2F3032); return InkWell( borderRadius: BorderRadius.circular(6), onTap: onTap, child: Ink( - decoration: BoxDecoration( - color: tileColor, - borderRadius: BorderRadius.circular(6), - boxShadow: [ - BoxShadow( - color: Theme.of(context).primaryColor.withOpacity(0.1), - blurRadius: 2, - ) - ] - ), + decoration: + BoxDecoration(color: tileColor, borderRadius: BorderRadius.circular(6), boxShadow: [ + BoxShadow( + color: Theme.of(context).primaryColor.withOpacity(0.1), + blurRadius: 2, + ) + ]), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), // margin: child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _buildTitle(Theme.of(context).primaryColor,textColor,isDark), + _buildTitle(Theme.of(context).primaryColor, textColor, isDark), _buildContent(textColor), _buildFoot(isDark) ], @@ -56,34 +53,34 @@ class DeskWidgetItem extends StatelessWidget { ); } - Widget _buildTitle(Color color,Color? textColor,bool isDark) { + Widget _buildTitle(Color color, Color? textColor, bool isDark) { return Row( children: [ if (searchArg == null) Expanded( - child: Text( - model.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 15, - color: textColor, - - fontWeight: FontWeight.bold, - ), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 8, + children: [ + Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, + color: textColor, + fontWeight: FontWeight.bold, + ), + ), + BlocBuilder(builder: (_, s) { + bool show = s.widgets.contains(model); + if (!show) return const SizedBox(); + return const CollectedTag(); + }), + ], ), ), if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), - const SizedBox(width: 8), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - if (!show) return const SizedBox(); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: const CollectedTag(), - ); - }), - const Spacer(), StarScore( star: Star(emptyColor: Colors.white, size: 12, fillColor: color), score: model.lever, @@ -99,7 +96,7 @@ class DeskWidgetItem extends StatelessWidget { model.info, maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 14, color: textColor), + style: TextStyle(fontSize: 14, color: textColor), ), ); } @@ -111,28 +108,28 @@ class DeskWidgetItem extends StatelessWidget { width: 4, height: 4, margin: const EdgeInsets.only(right: 6), - decoration: const BoxDecoration( - color: Color(0xff86909c), shape: BoxShape.circle), + decoration: const BoxDecoration(color: Color(0xff86909c), shape: BoxShape.circle), ), Text( model.nameCN, - style: const TextStyle( - fontSize: 12, height: 1, color: Color(0xff86909c)), + style: const TextStyle(fontSize: 12, height: 1, color: Color(0xff86909c)), ), const Spacer(), Wrapper.just( radius: 2, - color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), + color: isDark ? Color(0xff292A2D) : const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( Cons.kWidgetFamilyLabelMap[model.family]!, - style: TextStyle( - color: isDark?Color(0xffCCCCCC):Color(0xff878D96), + style: TextStyle( + color: isDark ? Color(0xffCCCCCC) : Color(0xff878D96), height: 1, fontSize: 12, shadows: [ Shadow( - color: isDark? Colors.black:Colors.white, blurRadius: 2, offset: Offset(1, 1)) + color: isDark ? Colors.black : Colors.white, + blurRadius: 2, + offset: Offset(1, 1)) ]), ), ), @@ -153,9 +150,7 @@ class DeskWidgetItem extends StatelessWidget { span.add(TextSpan(text: match.group(0), style: lightTextStyle)); return ''; }, onNonMatch: (str) { - span.add(TextSpan( - text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); + span.add(TextSpan(text: str, style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); return ''; }); return TextSpan(children: span); diff --git a/pubspec.lock b/pubspec.lock index e521bc5d..a02e279d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -133,10 +133,18 @@ packages: dependency: "direct main" description: name: dio - sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" url: "https://pub.flutter-io.cn/" source: hosted - version: "5.4.3+1" + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "2.0.0" equatable: dependency: "direct main" description: @@ -261,6 +269,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1+2" + fx_dio: + dependency: "direct main" + description: + path: "D:\\Projects\\Flutter\\Fx\\fx\\modules\\fx_dio" + relative: false + source: path + version: "0.0.1" fx_go_router_ext: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index edadf7a5..058adea0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,6 @@ version: 3.0.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts - environment: sdk: ">=3.5.0 <4.0.0" workspace: @@ -75,6 +74,8 @@ dependencies: # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 + fx_dio: + path: D:\Projects\Flutter\Fx\fx\modules\fx_dio dev_dependencies: flutter_test: @@ -116,7 +117,7 @@ flutter: - asset: assets/fonts/ComicNeue-Regular.ttf - family: CHOPS fonts: - - asset: assets/fonts/CHOPS.TTF + - asset: assets/fonts/CHOPS.ttf toly: icon: From 55c19d6efff857398d4f9133e80209dc8b21a46b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 12 Nov 2024 12:13:52 +0800 Subject: [PATCH 105/149] fx_dio --- pubspec.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 058adea0..f0bc6a4d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -74,8 +74,7 @@ dependencies: # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 - fx_dio: - path: D:\Projects\Flutter\Fx\fx\modules\fx_dio + fx_dio: ^0.0.2 dev_dependencies: flutter_test: From e76c597006e2b0ba17b427a2098a3229762be255 Mon Sep 17 00:00:00 2001 From: sweet <1395723441@qq.com> Date: Tue, 12 Nov 2024 14:13:20 +0800 Subject: [PATCH 106/149] =?UTF-8?q?feat=EF=BC=9A=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8F=AF=E4=BB=A5=E9=80=89=E4=B8=AD=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/lib/app/theme/app_theme.dart | 84 +++++++++++-------- .../toly_ui/lib/code/code_widget.dart | 56 +++++++------ .../widget_detail/widget_detail_page.dart | 46 +++++++--- 3 files changed, 112 insertions(+), 74 deletions(-) diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index 49415e71..c9ed4d78 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -1,4 +1,3 @@ - import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -22,33 +21,38 @@ class AppTheme { TargetPlatform.windows: FadePageTransitionsBuilder(), TargetPlatform.linux: FadePageTransitionsBuilder(), }), - tabBarTheme: TabBarTheme( - dividerColor: Colors.transparent, + tabBarTheme: const TabBarTheme( + dividerColor: Colors.transparent, ), fontFamily: state.fontFamily, - useMaterial3:true, + useMaterial3: true, brightness: Brightness.dark, primaryColor: const Color(0xff4699FB), - listTileTheme: ListTileThemeData( - tileColor: Color(0xff181818), - textColor: Color(0xffD6D6D6), - ), - appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, - elevation: 0, - centerTitle: true, - backgroundColor: Color(0xff181818), - - iconTheme: IconThemeData(color: Color(0xffCCCCCC)), - - titleTextStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold,color: Color(0xffCCCCCC))), + listTileTheme: const ListTileThemeData( + tileColor: Color(0xff181818), + textColor: Color(0xffD6D6D6), + ), + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: const Color(0xff181818), + iconTheme: const IconThemeData(color: Color(0xffCCCCCC)), + titleTextStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0xffCCCCCC))), floatingActionButtonTheme: const FloatingActionButtonThemeData( foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), - dividerTheme: DividerThemeData( - color: const Color(0xff2F2F2F), - space: px1, - thickness: px1, - ), + dividerTheme: DividerThemeData( + color: const Color(0xff2F2F2F), + space: px1, + thickness: px1, + ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: Color(0xff181818), selectedItemColor: Color(0xff4699FB)), @@ -65,13 +69,18 @@ class AppTheme { return ThemeData( fontFamily: '宋体', primaryColor: state.themeColor.color, - scaffoldBackgroundColor: Color(0xffF3F4F6), + scaffoldBackgroundColor: const Color(0xffF3F4F6), useMaterial3: true, // Android 使用 Material3 - chipTheme: ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), - listTileTheme: ListTileThemeData( + chipTheme: + const ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), + listTileTheme: const ListTileThemeData( tileColor: Colors.white, ), + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), dividerTheme: DividerThemeData( color: const Color(0xffDEE0E2), space: px1, @@ -85,22 +94,25 @@ class AppTheme { TargetPlatform.linux: FadePageTransitionsBuilder(), }), tabBarTheme: TabBarTheme( - dividerColor: Colors.transparent, + dividerColor: Colors.transparent, splashFactory: NoSplash.splashFactory, - overlayColor: MaterialStateProperty.resolveWith( - (Set states) { - return states.contains(MaterialState.focused) ? null : Colors.transparent; + overlayColor: WidgetStateProperty.resolveWith( + (Set states) { + return states.contains(WidgetState.focused) + ? null + : Colors.transparent; }, ), ), - bottomNavigationBarTheme: const BottomNavigationBarThemeData( - backgroundColor: Colors.white), + bottomNavigationBarTheme: + const BottomNavigationBarThemeData(backgroundColor: Colors.white), appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, - elevation: 0, - centerTitle: true, - backgroundColor: Colors.white, - titleTextStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold,color: Colors.black), + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: Colors.white, + titleTextStyle: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black), ), ); } diff --git a/modules/basic_system/toly_ui/lib/code/code_widget.dart b/modules/basic_system/toly_ui/lib/code/code_widget.dart index 019db6ff..d5eb4db6 100644 --- a/modules/basic_system/toly_ui/lib/code/code_widget.dart +++ b/modules/basic_system/toly_ui/lib/code/code_widget.dart @@ -1,7 +1,6 @@ - /// create by 张风捷特烈 on 2020-04-15 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: import 'package:flutter/material.dart'; import 'high_light_code.dart'; @@ -9,7 +8,12 @@ import 'highlighter_style.dart'; import 'language/dart_languge.dart'; class CodeWidget extends StatelessWidget { - CodeWidget({Key? key, required this.code,required this.style, this.fontSize = 13,this.fontFamily}) + CodeWidget( + {Key? key, + required this.code, + required this.style, + this.fontSize = 13, + this.fontFamily}) : super(key: key); final String code; @@ -21,30 +25,30 @@ class CodeWidget extends StatelessWidget { Widget build(BuildContext context) { Widget body; Widget _codeWidget; - try { - _codeWidget = RichText( - text: TextSpan( - style: TextStyle(fontSize: fontSize,fontFamily: fontFamily), - children: [ - CodeHighlighter( - style: style, - language: const DartLanguage() - ).format(code)], - ), - ); - } catch (err) { - print(err); - _codeWidget = Text(code); - } - body = SingleChildScrollView( - child: Container( - child: _codeWidget, - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - color: style.backgroundColor ?? const Color(0xffF6F8FA), - borderRadius: const BorderRadius.all(Radius.circular(5.0))), + try { + _codeWidget = SelectableText.rich( + selectionControls: MaterialTextSelectionControls(), + TextSpan( + style: TextStyle(fontSize: fontSize, fontFamily: fontFamily), + children: [ + CodeHighlighter(style: style, language: const DartLanguage()) + .format(code) + ], ), ); + } catch (err) { + print(err); + _codeWidget = SelectableText(code); + } + body = SingleChildScrollView( + child: Container( + child: _codeWidget, + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: style.backgroundColor ?? const Color(0xffF6F8FA), + borderRadius: const BorderRadius.all(Radius.circular(5.0))), + ), + ); return body; } -} \ No newline at end of file +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 75b8e64d..5c372882 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -28,7 +28,8 @@ class WidgetDetailPageScope extends StatelessWidget { @override Widget build(BuildContext context) { WidgetRepository widgetRepository = context.read().repository; - NodeRepository nodeRepository = kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); + NodeRepository nodeRepository = + kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); return BlocProvider( create: (_) => WidgetDetailBloc( @@ -71,8 +72,27 @@ class WidgetDetailPage extends StatelessWidget { Widget _buildContent(BuildContext context, WidgetDetailBloc bloc) { DetailState state = bloc.state; - return WillPopScope( - onWillPop: () => _whenPop(context), + return PopScope( + canPop: false, + onPopInvokedWithResult: (bool didPop, dynamic result) { + if (didPop) { + return; + } + WidgetDetailBloc detailBloc = context.read(); + // 检查抽屉是否打开 + if (Scaffold.of(context).isEndDrawerOpen) { + if (context.mounted) { + Navigator.of(context).pop(); + } + return; + } + // 调用原来的 pop 逻辑 + detailBloc.pop().then((bool canPop) { + if (canPop && context.mounted) { + Navigator.of(context).pop(); + } + }); + }, child: CustomScrollView( slivers: [ SliverWidgetDetailBar(model: bloc.currentWidget), @@ -97,16 +117,18 @@ class WidgetDetailPage extends StatelessWidget { )); } - Future _whenPop(BuildContext context) async { - // print("======_whenPop============"); - WidgetDetailBloc detailBloc = context.read(); - if (Scaffold.of(context).isEndDrawerOpen) { - return true; - } - return detailBloc.pop(); - } + // Future _whenPop(BuildContext context) async { + // // print("======_whenPop============"); + // WidgetDetailBloc detailBloc = context.read(); + // if (Scaffold.of(context).isEndDrawerOpen) { + // return true; + // } + // return detailBloc.pop(); + // } + - Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { + Widget _buildSliverNodeList( + BuildContext context, List nodes, WidgetModel model) { AppConfig globalState = BlocProvider.of(context).state; return SliverList( delegate: SliverChildBuilderDelegate( From f2441df94fa1acea549bf0255f11dae8342d1783 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 17 Nov 2024 00:30:45 +0800 Subject: [PATCH 107/149] upgrade logic --- .../navigation/view/app_bloc_provider.dart | 4 +- .../view/mobile/unit_navigation.dart | 2 +- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + modules/basic_system/app/lib/app.dart | 2 +- .../app/lib/app/cons/global_value.dart | 4 +- .../http/flutter_unit/api/upgrade_api.dart | 26 ++++++ .../host => http/flutter_unit}/unit_host.dart | 2 + modules/basic_system/app/lib/http/http.dart | 2 + .../app_update/lib/app_update.dart | 4 +- .../app_update/lib/bloc/bloc.dart | 88 +++++++++++------- .../app_update/lib/model/app_info.dart | 52 ++++------- .../lib/repository/api/upgrade_api.dart | 6 ++ .../lib/repository/model/app_info.dart | 1 + .../lib/views/app_update_panel.dart | 6 +- .../lib/views/update_red_point.dart | 2 +- modules/basic_system/app_update/pubspec.yaml | 4 + .../toly_ui/lib/code/code_widget.dart | 9 +- pubspec.lock | 91 ++++++++++++++++--- pubspec.yaml | 2 +- 21 files changed, 217 insertions(+), 97 deletions(-) create mode 100644 modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart rename modules/basic_system/app/lib/{app/host => http/flutter_unit}/unit_host.dart (95%) create mode 100644 modules/basic_system/app/lib/http/http.dart create mode 100644 modules/basic_system/app_update/lib/repository/api/upgrade_api.dart create mode 100644 modules/basic_system/app_update/lib/repository/model/app_info.dart diff --git a/lib/src/navigation/view/app_bloc_provider.dart b/lib/src/navigation/view/app_bloc_provider.dart index 523b9e12..22ef4be6 100644 --- a/lib/src/navigation/view/app_bloc_provider.dart +++ b/lib/src/navigation/view/app_bloc_provider.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/widget_module.dart'; + /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: Bloc提供器包裹层 @@ -21,7 +22,6 @@ class AppBlocProvider extends StatefulWidget { } class _AppBlocProviderState extends State { - @override Widget build(BuildContext context) { return MultiBlocProvider( @@ -29,7 +29,7 @@ class _AppBlocProviderState extends State { // 全局 bloc : 维护应用存储状态、更新、认证 BlocProvider(create: (_) => AuthBloc(repository: HttpAuthRepository())), BlocProvider(create: (_) => AppConfigBloc()), - BlocProvider(create: (_) => UpdateBloc()), + BlocProvider(create: (_) => UpgradeBloc(api: UnitUpgradeApi())), BlocProvider(create: (_) => UserBloc()), BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 7852d817..a73363d2 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -39,7 +39,7 @@ class _UnitPhoneNavigationState extends State { void initState() { super.initState(); if (Platform.isAndroid || Platform.isIOS) {} - context.read().add(const CheckUpdate(appName: 'FlutterUnit')); + context.read().add(const CheckUpdate(appName: 'FlutterUnit')); } @override diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 0cacc750..4554882f 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,11 +6,15 @@ #include "generated_plugin_registrant.h" +#include #include #include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) open_file_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); + open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); g_autoptr(FlPluginRegistrar) screen_retriever_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 62f151fd..740cb314 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + open_file_linux screen_retriever url_launcher_linux window_manager diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 20085aa4..b698ecb9 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import connectivity_plus +import open_file_mac import package_info_plus import path_provider_foundation import screen_retriever @@ -17,6 +18,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart index 8f733e6a..3d7e36b6 100644 --- a/modules/basic_system/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -25,4 +25,4 @@ export 'app_config/app_config.dart'; export 'app/action/action.dart'; export 'app/router/app_route.dart'; export 'view/view.dart'; -export 'app/host/unit_host.dart'; \ No newline at end of file +export 'http/http.dart'; \ No newline at end of file diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart index c3ef5731..b8ab307b 100644 --- a/modules/basic_system/app/lib/app/cons/global_value.dart +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -3,6 +3,6 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; -double px1 = 1/window.devicePixelRatio; +double px1 = 1 / window.devicePixelRatio; -bool isDesk = kIsWeb || Platform.isMacOS||Platform.isWindows||Platform.isLinux; \ No newline at end of file +bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart new file mode 100644 index 00000000..de8c67fb --- /dev/null +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -0,0 +1,26 @@ +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +class UnitUpgradeApi implements UpgradeApi { + @override + Future fetch(String appName) async { + Dio dio = FxDio()(); + Response rep = await dio.get('${UnitApi.appInfo.path}$appName'); + if (rep.statusCode == 200 && rep.data != null) { + dynamic ret = rep.data['data']; + // 说明有数据 + if (ret != null) { + return AppInfo( + appName: ret['appName'], + appVersion: ret['appVersion'], + appUrl: ret['appUrl'], + appSize: ret['appSize'], + description: ret['description'], + sha256: ret['sha256'], + ); + } + } + throw '请求错误:'; + } +} diff --git a/modules/basic_system/app/lib/app/host/unit_host.dart b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart similarity index 95% rename from modules/basic_system/app/lib/app/host/unit_host.dart rename to modules/basic_system/app/lib/http/flutter_unit/unit_host.dart index e91081d8..8780b99e 100644 --- a/modules/basic_system/app/lib/app/host/unit_host.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart @@ -25,6 +25,8 @@ enum UnitApi { repository("/repository/name/FlutterUnit"), point("/point"), pointComment("/pointComment/"), + + appInfo("/appInfo/name/"), ; final String path; diff --git a/modules/basic_system/app/lib/http/http.dart b/modules/basic_system/app/lib/http/http.dart new file mode 100644 index 00000000..1dbb145c --- /dev/null +++ b/modules/basic_system/app/lib/http/http.dart @@ -0,0 +1,2 @@ +export 'flutter_unit/api/upgrade_api.dart'; +export 'flutter_unit/unit_host.dart'; diff --git a/modules/basic_system/app_update/lib/app_update.dart b/modules/basic_system/app_update/lib/app_update.dart index 129f3ec6..95089d3f 100644 --- a/modules/basic_system/app_update/lib/app_update.dart +++ b/modules/basic_system/app_update/lib/app_update.dart @@ -5,4 +5,6 @@ export 'bloc/state.dart'; export 'bloc/event.dart'; export 'model/app_info.dart'; export 'views/app_update_panel.dart'; -export 'views/update_red_point.dart'; \ No newline at end of file +export 'views/update_red_point.dart'; + +export 'repository/api/upgrade_api.dart'; \ No newline at end of file diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index c217b9f9..ba6fbb9a 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -1,20 +1,26 @@ import 'dart:async'; +import 'dart:io'; import 'package:app/app.dart'; -import 'package:flutter/foundation.dart'; +import 'package:app_update/repository/api/upgrade_api.dart'; +import 'package:dio/dio.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:open_file/open_file.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:r_upgrade/r_upgrade.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:utils/utils.dart'; import '../model/app_info.dart'; + import 'event.dart'; import 'state.dart'; +import 'package:path/path.dart' as p; + +class UpgradeBloc extends Bloc { + final UpgradeApi api; -class UpdateBloc extends Bloc { - UpdateBloc() : super(const NoUpdateState()) { + UpgradeBloc({required this.api}) : super(const NoUpdateState()) { on(_onCheckUpdate); on(_onResetNoUpdate); on(_onDownloadEvent); @@ -24,25 +30,24 @@ class UpdateBloc extends Bloc { void _onCheckUpdate(CheckUpdate event, Emitter emit) async { print("========_onCheckUpdate=============="); emit(const CheckLoadingState()); - // await Future.delayed(Duration(seconds: 1)); // 检测更新逻辑 - TaskResult result = await AppInfoApi.getAppVersion(appName: event.appName); - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - print(result); - if (result.success && result.data != null) { - if (packageInfo.version == result.data!.appVersion) { + try { + AppInfo result = await api.fetch(event.appName); + print(result); + + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + + if (result.shouldUpgrade(packageInfo.version)) { emit(NoUpdateState( isChecked: true, checkTime: DateTime.now().millisecondsSinceEpoch, )); } else { - if (result.data != null) { - emit(ShouldUpdateState( - oldVersion: packageInfo.version, info: result.data!)); - } + emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); } - } else { - emit(CheckErrorState(error: result.msg)); + } catch (e) { + print(e); + emit(CheckErrorState(error: e.toString())); } } @@ -53,24 +58,32 @@ class UpdateBloc extends Bloc { late int? id; late StreamSubscription? subscription; - void _launchURL(String url) async { - print(url); - Uri uri = Uri.parse(url); - if (await canLaunchUrl(Uri.parse(url))) { - await launchUrl(uri,mode: LaunchMode.externalApplication); - } else { - debugPrint('Could not launch $url'); - } - } - - void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ - if(isDesk){ + void _onDownloadEvent(DownloadEvent event, Emitter emit) async { + if (isDesk) { + String url = + 'https://gitee.com/toly1994328/FlutterUnit/releases/download/last/FlutterUnit.exe'; // 桌面端跳转到下载地址 - _launchURL('https://github.com/toly1994328/FlutterUnit/releases'); + // _launchURL('https://github.com/toly1994328/FlutterUnit/releases'); + Dio dio = Dio(); + Directory dir = await getTemporaryDirectory(); + String filePath = p.join(dir.path, 'FlutterUnit.exe'); + + Response rep = await dio.download( + url, + filePath, + onReceiveProgress: (c, t) => _onProgressChange(event.appInfo.appSize, c / t), + ); + if (rep.statusCode == 200) { + add(const ResetNoUpdate()); + OpenFile.open(filePath); + } return; } - id = await RUpgrade.upgrade(event.appInfo.appUrl, fileName: '${event.appInfo.appName}.apk',); + id = await RUpgrade.upgrade( + event.appInfo.appUrl, + fileName: '${event.appInfo.appName}.apk', + ); subscription = RUpgrade.stream.listen((DownloadInfo info) { double progress = (info.percent ?? 0) / 100; if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { @@ -78,13 +91,18 @@ class UpdateBloc extends Bloc { subscription?.cancel(); add(const ResetNoUpdate()); } - add(DownloadingEvent(state: DownloadingState( - appSize: event.appInfo.appSize, - progress: progress - ))); + _onProgressChange(event.appInfo.appSize, progress); }); } + void _onProgressChange(int appSize, double progress) { + add( + DownloadingEvent( + state: DownloadingState(appSize: appSize, progress: progress), + ), + ); + } + void _onDownloadingEvent(DownloadingEvent event, Emitter emit) { emit(event.state); } diff --git a/modules/basic_system/app_update/lib/model/app_info.dart b/modules/basic_system/app_update/lib/model/app_info.dart index 245abd18..deab168b 100644 --- a/modules/basic_system/app_update/lib/model/app_info.dart +++ b/modules/basic_system/app_update/lib/model/app_info.dart @@ -1,49 +1,20 @@ -import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; -import 'package:utils/utils.dart'; - -class AppInfoApi { - static Future> getAppVersion( - {required String appName}) async { - String errorMsg = ""; - var result; - try { - result = - await HttpUtil.instance.client.get(PathUnit.appInfo + "/$appName"); - } catch (err) { - errorMsg = err.toString(); - } - print("=====${errorMsg}====="); - // 获取的数据非空且 status = true - if (result.data != null && result.data['status']) { - // 说明有数据 - if (result.data['data'] != null) { - return TaskResult.success( - data: AppInfo( - appName: result.data['data']['appName'], - appVersion: result.data['data']['appVersion'], - appUrl: result.data['data']['appUrl'], - appSize: result.data['data']['appSize'], - )); - } else { - return const TaskResult.success(data: null); - } - } - return TaskResult.error(msg: '请求错误: $errorMsg'); - } -} class AppInfo extends Equatable { final String appName; final String appVersion; final String appUrl; final int appSize; + final String? description; + final String? sha256; const AppInfo({ required this.appName, required this.appVersion, required this.appUrl, required this.appSize, + required this.description, + required this.sha256, }); @override @@ -53,4 +24,19 @@ class AppInfo extends Equatable { String toString() { return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; } + + bool shouldUpgrade(String current) { + List currentArray = current.split("."); + List upgradeArray = appVersion.split("."); + int length = currentArray.length; + if (length == upgradeArray.length) { + for (int i = 0; i < length; i++) { + if (int.parse(currentArray[i]) == int.tryParse(upgradeArray[i])) { + continue; + } + return int.parse(currentArray[i]) < int.parse(upgradeArray[i]); + } + } + return false; + } } diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart new file mode 100644 index 00000000..756237e2 --- /dev/null +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -0,0 +1,6 @@ +import '../../model/app_info.dart'; + +abstract class UpgradeApi { + Future fetch(String appName); + +} diff --git a/modules/basic_system/app_update/lib/repository/model/app_info.dart b/modules/basic_system/app_update/lib/repository/model/app_info.dart new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/modules/basic_system/app_update/lib/repository/model/app_info.dart @@ -0,0 +1 @@ + diff --git a/modules/basic_system/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart index 895924ac..5cbb67cd 100644 --- a/modules/basic_system/app_update/lib/views/app_update_panel.dart +++ b/modules/basic_system/app_update/lib/views/app_update_panel.dart @@ -16,7 +16,7 @@ class AppUpdatePanel extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocConsumer( + return BlocConsumer( builder: _buildByUpdateState, listener: _listenerByUpdateState, ); @@ -94,7 +94,7 @@ class AppUpdatePanel extends StatelessWidget { void _tapByState(UpdateState state, BuildContext context) { if (state is NoUpdateState) { - BlocProvider.of(context) + BlocProvider.of(context) .add(const CheckUpdate(appName: 'FlutterUnit')); } if (state is ShouldUpdateState) { @@ -104,7 +104,7 @@ class AppUpdatePanel extends StatelessWidget { return; } // 处理下载的事件 - BlocProvider.of(context) + BlocProvider.of(context) .add(DownloadEvent(appInfo: state.info)); } } diff --git a/modules/basic_system/app_update/lib/views/update_red_point.dart b/modules/basic_system/app_update/lib/views/update_red_point.dart index 9108d97a..64d28965 100644 --- a/modules/basic_system/app_update/lib/views/update_red_point.dart +++ b/modules/basic_system/app_update/lib/views/update_red_point.dart @@ -16,7 +16,7 @@ class UpdateRedPoint extends StatelessWidget { height: 8, decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle), ); - return BlocBuilder( + return BlocBuilder( builder: (BuildContext context, UpdateState state) { if (state is ShouldUpdateState) { return radPoint; diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 01d8ca82..d5f5c943 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -11,11 +11,15 @@ dependencies: flutter: sdk: flutter flutter_bloc: ^8.1.6 # 状态管理 + dio: ^5.7.0 + equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.3 # xml 固化 r_upgrade: ^0.4.2 # 应用升级 + open_file: ^3.5.9 # 打开文件 url_launcher: ^6.3.0 # url package_info_plus: ^8.0.0 + path_provider: ^2.1.5 utils: path: ../utils app: diff --git a/modules/basic_system/toly_ui/lib/code/code_widget.dart b/modules/basic_system/toly_ui/lib/code/code_widget.dart index d5eb4db6..c0cc9cc4 100644 --- a/modules/basic_system/toly_ui/lib/code/code_widget.dart +++ b/modules/basic_system/toly_ui/lib/code/code_widget.dart @@ -24,9 +24,9 @@ class CodeWidget extends StatelessWidget { @override Widget build(BuildContext context) { Widget body; - Widget _codeWidget; + Widget codeWidget; try { - _codeWidget = SelectableText.rich( + codeWidget = SelectableText.rich( selectionControls: MaterialTextSelectionControls(), TextSpan( style: TextStyle(fontSize: fontSize, fontFamily: fontFamily), @@ -38,15 +38,16 @@ class CodeWidget extends StatelessWidget { ); } catch (err) { print(err); - _codeWidget = SelectableText(code); + codeWidget = SelectableText(code); } body = SingleChildScrollView( child: Container( - child: _codeWidget, + alignment: Alignment.centerLeft, padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: style.backgroundColor ?? const Color(0xffF6F8FA), borderRadius: const BorderRadius.all(Radius.circular(5.0))), + child: codeWidget, ), ); return body; diff --git a/pubspec.lock b/pubspec.lock index a02e279d..68dae560 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -272,10 +272,11 @@ packages: fx_dio: dependency: "direct main" description: - path: "D:\\Projects\\Flutter\\Fx\\fx\\modules\\fx_dio" - relative: false - source: path - version: "0.0.1" + name: fx_dio + sha256: ab16f0322f05fd4381e7375c9f3bb1f18b8fbf87f8dca46955b4a2661e5836a1 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.2" fx_go_router_ext: dependency: "direct main" description: @@ -436,6 +437,70 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.5.0" + open_file: + dependency: transitive + description: + name: open_file + sha256: "737641e823d568a12b63494855010ceef286bcdf8f88d0a831e53229a5e850e8" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.5.9" + open_file_android: + dependency: transitive + description: + name: open_file_android + sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.6" + open_file_ios: + dependency: transitive + description: + name: open_file_ios + sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.3" + open_file_linux: + dependency: transitive + description: + name: open_file_linux + sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.5" + open_file_mac: + dependency: transitive + description: + name: open_file_mac + sha256: dd1570bd12601b4d50fda3609c1662382f17ee403b47f0d74d737de603a39ec6 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.2" + open_file_platform_interface: + dependency: transitive + description: + name: open_file_platform_interface + sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" + url: "https://pub.flutter-io.cn/" + source: hosted + version: "1.0.3" + open_file_web: + dependency: transitive + description: + name: open_file_web + sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.4" + open_file_windows: + dependency: transitive + description: + name: open_file_windows + sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3" package_info_plus: dependency: transitive description: @@ -464,18 +529,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1" + sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a url: "https://pub.flutter-io.cn/" source: hosted - version: "2.2.0" + version: "2.2.12" path_provider_foundation: dependency: transitive description: @@ -925,10 +990,10 @@ packages: dependency: transitive description: name: web - sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb url: "https://pub.flutter-io.cn/" source: hosted - version: "1.0.0" + version: "1.1.0" webview_flutter: dependency: "direct main" description: @@ -1011,4 +1076,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.5.0 <4.0.0" - flutter: ">=3.22.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index f0bc6a4d..013b1613 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.0.0 +version: 3.1.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 1f71550528c1dc5c115df7b1262052cb5ca35a5f Mon Sep 17 00:00:00 2001 From: sweet <1395723441@qq.com> Date: Tue, 19 Nov 2024 12:07:00 +0800 Subject: [PATCH 108/149] =?UTF-8?q?fix=EF=BC=9A=E5=9B=BE=E7=89=87=E7=BB=84?= =?UTF-8?q?=E4=BB=B6release=E4=B8=8B=E6=98=BE=E7=A4=BA=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StatefulWidget/Image/node3_alignment.dart | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart index 2bf65a18..a7885cee 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/node3_alignment.dart @@ -3,39 +3,47 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com +enum AlignmentType { + center(Alignment.center, 'center'), + centerLeft(Alignment.centerLeft, 'centerLeft'), + centerRight(Alignment.centerRight, 'centerRight'), + topCenter(Alignment.topCenter, 'topCenter'), + topLeft(Alignment.topLeft, 'topLeft'), + topRight(Alignment.topRight, 'topRight'), + bottomCenter(Alignment.bottomCenter, 'bottomCenter'), + bottomLeft(Alignment.bottomLeft, 'bottomLeft'), + bottomRight(Alignment.bottomRight, 'bottomRight'), + ; + + const AlignmentType(this.alignment, this.title); + + final Alignment alignment; + final String title; +} + class AlignmentImage extends StatelessWidget { const AlignmentImage({Key? key}) : super(key: key); - final List alignment = const[ - Alignment.center, - Alignment.centerLeft, - Alignment.centerRight, - Alignment.topCenter, - Alignment.topLeft, - Alignment.topRight, - Alignment.bottomCenter, - Alignment.bottomLeft, - Alignment.bottomRight - ]; //测试数组 + //测试数组 @override Widget build(BuildContext context) { - List imgLi = alignment - .map((alignment) => //生成子Widget列表 - Column(children: [ - Container( - margin: const EdgeInsets.all(5), - width: 90, - height: 60, - color: Colors.grey.withAlpha(88), - child: Image( - image: const AssetImage("assets/images/wy_30x20.webp"), - alignment: alignment, - )), - Text(alignment.toString().split(".")[1]) - ])) + List imgLi = AlignmentType.values + .map((v) => //生成子Widget列表 + Column(children: [ + Container( + margin: const EdgeInsets.all(5), + width: 90, + height: 60, + color: Colors.grey.withAlpha(88), + child: Image( + image: const AssetImage("assets/images/wy_30x20.webp"), + alignment: v.alignment, + )), + Text(v.title), + ])) .toList(); var imageAlignment = Wrap(children: imgLi); return imageAlignment; } -} \ No newline at end of file +} From 312ab87fda618d1cd458504bd1f48a6bf3404c59 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 20 Nov 2024 09:26:21 +0800 Subject: [PATCH 109/149] fix setting page in mobile --- assets/flutter.db | Bin 1474560 -> 1482752 bytes .../view/desktop/menu_bar_leading.dart | 14 +- .../app/lib/app/router/app_route.dart | 2 +- .../http/flutter_unit/api/upgrade_api.dart | 11 +- .../app/lib/http/flutter_unit/unit_host.dart | 3 +- .../app_update/lib/bloc/bloc.dart | 14 +- .../lib/repository/api/upgrade_api.dart | 9 +- .../lib/views/app_update_panel.dart | 50 ++- .../dialog/desk_feishu_update_dialog.dart | 288 ++++++++++++++++++ .../views/dialog/feishu_update_dialog.dart | 257 ++++++++++++++++ .../app_update/lib/views/dialog/top_bar.dart | 34 +++ modules/basic_system/app_update/pubspec.yaml | 2 + .../SliverResizingHeader/desc_zh-CN.json | 38 --- .../Sliver/SliverResizingHeader/node_01.dart | 128 -------- .../Sliver/SliverResizingHeader/node_02.dart | 119 -------- .../Sliver/SliverResizingHeader/node_03.dart | 161 ---------- .../CarouselView/desc_zh-CN.json | 33 +- .../CarouselView/node1_base.dart | 23 +- .../StatefulWidget/CarouselView/node2.dart | 80 ++--- .../widgets/lib/exp/sliver_unit.dart | 4 +- .../widget_system/widgets/lib/widgets.dart | 9 +- .../widgets/lib/widgets_map.dart | 5 + pubspec.lock | 8 + pubspec.yaml | 2 +- 24 files changed, 747 insertions(+), 547 deletions(-) create mode 100644 modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart create mode 100644 modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart create mode 100644 modules/basic_system/app_update/lib/views/dialog/top_bar.dart delete mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json delete mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart delete mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart delete mode 100644 modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart diff --git a/assets/flutter.db b/assets/flutter.db index bd45d324bb649fa684d5aa7ee3eb765626e806b2..4632277a2d1e93e49ee3c6dbfaaf06adc8755582 100644 GIT binary patch delta 15379 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 + }, + child: CircleImage( + image: AssetImage('assets/images/icon_head.webp'), + size: 60, + ), ), Text( '张风捷特烈', diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart index 0148b4cb..db486dd7 100644 --- a/modules/basic_system/app/lib/app/router/app_route.dart +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -22,7 +22,7 @@ enum AppRoute { supportMe('support_me', url: '/support_me'), /// settings - settings('settings', url: '/setting'), + settings('settings', url: '/settings'), darkModel('dark_mode', url: '/setting/dark_mode'), codeStyle('code_style', url: '/setting/code_style'), themeColor('theme_color', url: '/setting/theme_color'), diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart index de8c67fb..5feecfd5 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -1,12 +1,14 @@ import 'package:app_update/app_update.dart'; import 'package:fx_dio/fx_dio.dart'; import 'package:app/app.dart'; - +import 'package:tolyui/tolyui.dart'; class UnitUpgradeApi implements UpgradeApi { @override Future fetch(String appName) async { Dio dio = FxDio()(); - Response rep = await dio.get('${UnitApi.appInfo.path}$appName'); + Response rep = await dio.get('${UnitApi.appInfo.path}$appName',queryParameters: { + 'os' : kAppEnv.os.name, + }); if (rep.statusCode == 200 && rep.data != null) { dynamic ret = rep.data['data']; // 说明有数据 @@ -23,4 +25,9 @@ class UnitUpgradeApi implements UpgradeApi { } throw '请求错误:'; } + + @override + void toast(String message) { + $message.warning(message: message); + } } diff --git a/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart index 8780b99e..ba4ec516 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart @@ -6,6 +6,7 @@ class UnitHost extends Host { @override Map get value => { HostEnv.release: 'api.toly1994.com', + HostEnv.dev: '127.0.0.1', }; @override @@ -21,11 +22,9 @@ class UnitHost extends Host { enum UnitApi { hello("/hello"), - repository("/repository/name/FlutterUnit"), point("/point"), pointComment("/pointComment/"), - appInfo("/appInfo/name/"), ; diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index ba6fbb9a..d887f121 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -36,14 +36,13 @@ class UpgradeBloc extends Bloc { print(result); PackageInfo packageInfo = await PackageInfo.fromPlatform(); - if (result.shouldUpgrade(packageInfo.version)) { + emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); + } else { emit(NoUpdateState( isChecked: true, checkTime: DateTime.now().millisecondsSinceEpoch, )); - } else { - emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); } } catch (e) { print(e); @@ -59,15 +58,12 @@ class UpgradeBloc extends Bloc { late StreamSubscription? subscription; void _onDownloadEvent(DownloadEvent event, Emitter emit) async { + emit(DownloadingState(progress: 0, appSize: event.appInfo.appSize)); if (isDesk) { - String url = - 'https://gitee.com/toly1994328/FlutterUnit/releases/download/last/FlutterUnit.exe'; - // 桌面端跳转到下载地址 - // _launchURL('https://github.com/toly1994328/FlutterUnit/releases'); + String url = event.appInfo.appUrl; Dio dio = Dio(); Directory dir = await getTemporaryDirectory(); - String filePath = p.join(dir.path, 'FlutterUnit.exe'); - + String filePath = p.join(dir.path, p.basename(url)); Response rep = await dio.download( url, filePath, diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart index 756237e2..700d21a8 100644 --- a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -1,6 +1,13 @@ import '../../model/app_info.dart'; -abstract class UpgradeApi { +abstract class UpgradeApi with CheckUpgrade, Toaster { + +} + +mixin CheckUpgrade { Future fetch(String appName); +} +mixin Toaster { + void toast(String message); } diff --git a/modules/basic_system/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart index 5cbb67cd..01629aee 100644 --- a/modules/basic_system/app_update/lib/views/app_update_panel.dart +++ b/modules/basic_system/app_update/lib/views/app_update_panel.dart @@ -10,6 +10,7 @@ import 'package:l10n/l10n.dart'; import '../bloc/bloc.dart'; import '../bloc/event.dart'; import '../bloc/state.dart'; +import 'dialog/feishu_update_dialog.dart'; class AppUpdatePanel extends StatelessWidget { const AppUpdatePanel({Key? key}) : super(key: key); @@ -94,18 +95,26 @@ class AppUpdatePanel extends StatelessWidget { void _tapByState(UpdateState state, BuildContext context) { if (state is NoUpdateState) { - BlocProvider.of(context) - .add(const CheckUpdate(appName: 'FlutterUnit')); + context.read().add(const CheckUpdate(appName: 'FlutterUnit')); } + if (state is ShouldUpdateState) { - if(Platform.isIOS){ - // ios 跳转应用商店 - RUpgrade.upgradeFromAppStore('6450545123', false); - return; - } - // 处理下载的事件 - BlocProvider.of(context) - .add(DownloadEvent(appInfo: state.info)); + showDialog( + barrierDismissible: false, + context: context, + builder: (ctx) => FeiShuUpdateDialog( + result: state.info, + onConfirm: () { + context.read().add(DownloadEvent(appInfo: state.info)); + }, + )); + // if(Platform.isIOS){ + // // ios 跳转应用商店 + // RUpgrade.upgradeFromAppStore('6450545123', false); + // return; + // } + // // 处理下载的事件 + // BlocProvider.of(context).add(DownloadEvent(appInfo: state.info)); } } @@ -115,16 +124,25 @@ class AppUpdatePanel extends StatelessWidget { Toast.success(context, context.l10n.currentIsNew); } } + // if (state is ShouldUpdateState) { + // showDialog( + // barrierDismissible: false, + // context: context, + // builder: (ctx) => FeiShuUpdateDialog( + // result: state.info, + // onConfirm: () {}, + // )); + // } } - String convertFileSize(int size){ + String convertFileSize(int size) { double result = size / 1024.0; - if(result<1024){ + if (result < 1024) { return "${result.toStringAsFixed(2)} Kb"; - }else if(result>1024&&result<1024*1024){ - return "${(result/1024).toStringAsFixed(2)} Mb"; - }else{ - return "${(result/1024/1024).toStringAsFixed(2)} Gb"; + } else if (result > 1024 && result < 1024 * 1024) { + return "${(result / 1024).toStringAsFixed(2)} Mb"; + } else { + return "${(result / 1024 / 1024).toStringAsFixed(2)} Gb"; } } } diff --git a/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart b/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart new file mode 100644 index 00000000..13e91eea --- /dev/null +++ b/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart @@ -0,0 +1,288 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:crypto/crypto.dart'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; + +import 'package:async/async.dart'; +import 'package:path/path.dart' as path; +import 'package:path_provider/path_provider.dart'; +import 'package:convert/convert.dart'; +import '../../model/app_info.dart'; +import 'top_bar.dart'; + +class DeskFeiShuUpdateDialog extends StatefulWidget { + final AppInfo result; + // final ValueChanged? onDownloadSuccess; + + const DeskFeiShuUpdateDialog({Key? key, required this.result,}) : super(key: key); + + @override + State createState() => _DeskFeiShuUpdateDialogState(); +} + +class _DeskFeiShuUpdateDialogState extends State { + final TextStyle noticeStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + + final TextStyle subTextStyle = const TextStyle( + color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); + + final TextStyle okTextStyle = + const TextStyle(color: Color(0xffe16b5c), fontSize: 16); + + ValueNotifier progress = ValueNotifier(0); + + @override + Widget build(BuildContext context) { + return Dialog( + elevation: 0, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8))), + child: Container( + height: 360, + alignment: Alignment.topLeft, + width: isDesk ? 400 : 320, + // color: Colors.green, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + buildTitle(), + Expanded(child: buildContent()), + Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // 下载中,不能退出 + if (progress.value == 0) { + // UpgradeChecker.checked = true; + Navigator.of(context).pop(false); + } else { + // Toast.warning('请等待下载完成'); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '稍后再说', + style: cancelTextStyle, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + upgradeWindows(); + + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '立即升级', + style: okTextStyle, + ), + ), + )), + ], + ), + ], + ), + ), + ); + } + + Widget buildContent() { + return ValueListenableBuilder( + valueListenable: progress, + builder: (_, double progress, Widget? child) { + if (progress == 0) { + return _buildUpdateInfo(); + } + return downloadProgress(progress); + }, + ); + } + + Widget downloadProgress(double progress) { + return Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '下载中...', + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox( + height: 10, + ), + LinearProgressIndicator( + minHeight: 10, + value: progress / 100, + ), + const SizedBox( + height: 10, + ), + Row( + children: [ + Text("${progress.toStringAsFixed(1)}%", + style: + TextStyle(height: 1, fontSize: 12, color: Colors.grey)), + Spacer(), + Text( + "${convertFileSize(((widget.result.appSize) / 100 * (progress)).toInt())}/${convertFileSize(widget.result.appSize)}", + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ) + ], + ) + ], + ), + ), + ); + } + + Widget _buildUpdateInfo() { + return SingleChildScrollView( + child: Container( + width: 500, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '更新内容: ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 6, + ), + Text( + widget.result.description??'', + style: TextStyle(color: Colors.grey), + ), + ], + ), + ), + ); + } + + Widget buildTitle() { + return ValueListenableBuilder( + valueListenable: progress, + builder: (_, double progress, Widget? child) { + String text = + progress != 0 ? "正在下载更新.." : "蜜蜂 V${widget.result.appVersion} 准备就绪"; + + return FeiShuUpdateTopBar( + text: text, + ); + }, + ); + } + + void onDownloadWindowsSuccess() async { + Navigator.pop(context); + String? downloadUrl = widget.result.appUrl; + Directory dir = await getApplicationSupportDirectory(); + String savePath = path.join(dir.path, path.basename(downloadUrl)); + File file = File(savePath); + print("======下载成功:======${file.path}==========="); + + Digest digest = await getFileSha256(file.path); + // if (digest.toString() == widget.result.checkCode) { + // Toast.success('更新程序下载完成,即将重新启动!',short: false); + // // widget.onDownloadSuccess?.call(savePath); + // } else { + // Toast.error("文件校验失败,请重新下载"); + // } + } + + static Future getFileSha256(String path) async { + final reader = ChunkedStreamReader(File(path).openRead()); + const chunkSize = 1024 * 1024 * 2; + var output = AccumulatorSink(); + var input = sha256.startChunkedConversion(output); + + try { + while (true) { + final chunk = await reader.readChunk(chunkSize); + if (chunk.isEmpty) { + break; + } + input.add(chunk); + } + } finally { + reader.cancel(); + } + input.close(); + + return output.events.single; + } + + + String convertFileSize(int? size) { + if (size == null) return '0 Kb'; + double result = size / 1024.0; + if (result < 1024) { + return "${result.toStringAsFixed(2)} KB"; + } else if (result > 1024 && result < 1024 * 1024) { + return "${(result / 1024).toStringAsFixed(2)} MB"; + } else { + return "${(result / 1024 / 1024).toStringAsFixed(2)} GB"; + } + } + + void upgradeWindows() async { + // if (progress.value != 0) { + // Toast.warning('正在下载'); + // progress.value = 0.1; + // return; + // } + // String? downloadUrl = widget.result.url; + // if (downloadUrl == null) return; + // Directory dir = await getApplicationSupportDirectory(); + // String savePath = path.join(dir.path, path.basename(downloadUrl)); + // print('===downloadUrl:$downloadUrl====savePath:$savePath===='); + // + // context.read().api.dio.download(widget.result.url!, savePath, + // onReceiveProgress: onReceiveProgress); + } + + void onReceiveProgress(int count, int total) { + progress.value = (count / total) * 100; + if (total == count) { + progress.value = 100; + onDownloadWindowsSuccess(); + } + } +} diff --git a/modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart b/modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart new file mode 100644 index 00000000..544c898f --- /dev/null +++ b/modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart @@ -0,0 +1,257 @@ + +import 'dart:ui'; +import 'package:app/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../bloc/bloc.dart'; +import '../../bloc/state.dart'; +import '../../model/app_info.dart'; +import 'top_bar.dart'; + +class FeiShuUpdateDialog extends StatefulWidget { + final AppInfo result; + final ValueChanged? onDownloadSuccess; + final VoidCallback? onBackHide; + final VoidCallback? onConfirm; + + const FeiShuUpdateDialog({ + Key? key, + required this.result, + this.onDownloadSuccess, + this.onBackHide, + this.onConfirm, + }) : super(key: key); + + @override + State createState() => _FeiShuUpdateDialogState(); +} + +class _FeiShuUpdateDialogState extends State { + final TextStyle noticeStyle = const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = const TextStyle(color: Colors.grey, fontSize: 16); + + final TextStyle subTextStyle = + const TextStyle(color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); + + + @override + Widget build(BuildContext context) { + UpdateState state = context.watch().state; + return WillPopScope( + onWillPop: () async { + // UpdateCubit.isShowDialog = false; + return true; + }, + child: Dialog( + elevation: 0, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8))), + child: Container( + height: 360, + alignment: Alignment.topLeft, + width: isDesk ? 400 : 320, + // color: Colors.green, + child: Column( + mainAxisSize: MainAxisSize.min, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //大小为 ${(widget.result.appSize!/1024/1024).toStringAsFixed(1)}M + buildTitle(state), + Expanded(child: buildContent(state)), + buildButtons(state), + ], + ), + ), + ), + ); + } + + Widget buildContent(UpdateState state) { + if (state is DownloadingState) { + return downloadProgress(state.progress); + } + + if (state is ShouldUpdateState) { + return _buildUpdateInfo(); + } + return const SizedBox.shrink(); + } + + Widget downloadProgress(double progress) { + return Center( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + progress == 1 ? "文件校验中..." : '下载中...', + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox( + height: 10, + ), + LinearProgressIndicator( + minHeight: 10, + value: progress, + ), + const SizedBox( + height: 10, + ), + Row( + children: [ + Text("${(progress * 100).toStringAsFixed(1)}%", + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey)), + Spacer(), + Text( + "${convertFileSize(((widget.result.appSize) * (progress)).toInt())}/${convertFileSize(widget.result.appSize)}", + style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), + ) + ], + ) + ], + ), + ), + ); + } + + String convertFileSize(int? size) { + if (size == null) return '0 KB'; + double result = size / 1024.0; + if (result < 1024) { + return "${result.toStringAsFixed(2)} KB"; + } else if (result > 1024 && result < 1024 * 1024) { + return "${(result / 1024).toStringAsFixed(2)} MB"; + } else { + return "${(result / 1024 / 1024).toStringAsFixed(2)} GB"; + } + } + + Widget _buildUpdateInfo() { + return SingleChildScrollView( + child: Container( + width: 500, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '更新内容: ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 6, + ), + Text( + widget.result.description ?? '', + style: TextStyle(color: Colors.grey), + ), + ], + ), + ), + ); + } + + Widget buildTitle(UpdateState state) { + String text = ''; + if (state is DownloadingState) { + text = "正在下载更新.."; + } + + if (state is ShouldUpdateState) { + text = "FlutterUnit v${state.info.appVersion} 准备就绪"; + } + + return FeiShuUpdateTopBar( + text: text, + ); + } + + Widget buildButtons(UpdateState state) { + if (state is ShouldUpdateState) { + return Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pop(false); + // UpdateCubit.isShowDialog = false; + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '稍后再说', + style: cancelTextStyle, + ), + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: (){ + widget.onConfirm?.call(); + }, + child: Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio), + right: BorderSide( + color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), + alignment: Alignment.center, + height: 50, + child: Text( + '立即升级', + style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 16), + ), + ), + )), + ], + ); + } + if (state is DownloadingState) { + return Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // widget.onBackHide?.call(); + Navigator.of(context).pop(); + // UpdateCubit.isShowDialog = false; + }, + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), + height: 50, + child: Text( + '后台执行', + style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 16), + ), + ), + )), + ], + ); + } + + return const SizedBox.shrink(); + } + + void upgradeWindows() async { + // context.read().doUpdate(); + } +} diff --git a/modules/basic_system/app_update/lib/views/dialog/top_bar.dart b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart new file mode 100644 index 00000000..a9466068 --- /dev/null +++ b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class FeiShuUpdateTopBar extends StatelessWidget { + final String text; + const FeiShuUpdateTopBar({Key? key, required this.text}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 68, + decoration: BoxDecoration( + color: Colors.blue, + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment(0.8, 1), + colors: [ + Color(0xff4181b4), + Color(0xff1fbcfd), + Color(0xff46d1fd), + ], + // Gradient from https://learnui.design/tools/gradient-generator.html + tileMode: TileMode.mirror, + ), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), topRight: Radius.circular(8))), + alignment: Alignment.center, + child: Text( + text, + style: TextStyle( + color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold), + ), + ); + } +} diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index d5f5c943..8798d106 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -13,6 +13,8 @@ dependencies: flutter_bloc: ^8.1.6 # 状态管理 dio: ^5.7.0 + convert: ^3.1.2 + equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.3 # xml 固化 r_upgrade: ^0.4.2 # 应用升级 diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json deleted file mode 100644 index 86f2cae4..00000000 --- a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/desc_zh-CN.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "id": 309, - "name": "PinnedHeaderSliver", - "localName": "固定头部滑片", - "info": "一个可以停留在视口上部的滑片, 可轻松完成吸顶效果。", - "lever": 4, - "family": 4, - "linkIds": [ - 190 - ], - "nodes": [ - { - "file": "node_01.dart", - "name": "PinnedHeaderSliver 官方案例", - "display": "new_page", - "desc": [ - "【child】 : 子组件 【Widget?】", - "PinnedHeaderSliver 只能用在滚动视口中,其中子组件在滑动到顶部时,不会移出视口,从而会停留在视口上方。" - ] - }, - { - "file": "node_02.dart", - "name": "标题吸顶", - "display": "new_page", - "desc": [ - "基于 PinnedHeaderSliver 实现的标题吸顶效果,注意看下方的分隔线也有吸顶效果哦。" - ] - }, - { - "file": "node_03.dart", - "name": "标题+搜索吸顶", - "display": "new_page", - "desc": [ - "基于 PinnedHeaderSliver 实现的标题+搜索框的吸顶效果。" - ] - } - ] -} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart deleted file mode 100644 index 406a79d5..00000000 --- a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_01.dart +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:flutter/material.dart'; - - -class SliverResizingHeaderDemo1 extends StatefulWidget { - const SliverResizingHeaderDemo1({ super.key }); - - @override - State createState() => _SliverResizingHeaderDemo1State(); -} - -class _SliverResizingHeaderDemo1State extends State { - late final ScrollController scrollController; - - @override - void initState() { - super.initState(); - scrollController = ScrollController(); - } - - @override - void dispose() { - scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: SafeArea( - child: Padding( - padding: const EdgeInsets.all(4), - child: Scrollbar( - controller: scrollController, - child: CustomScrollView( - controller: scrollController, - slivers: const [ - SliverResizingHeader( - minExtentPrototype: ListHeader(text: 'One'), - maxExtentPrototype: ListHeader(text: 'One\nTwo\nThree\n2'), - child: ListHeader( - text: 'SliverResizingHeader\nWith Two Optional\nLines of Text\n7777', - ), - ), - ItemList(), - ], - ), - ), - ), - ), - ); - } -} - -// A widget that displays its text within a thick rounded rectangle border -class ListHeader extends StatelessWidget { - const ListHeader({ - super.key, - required this.text, - }); - - final String text; - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - - return Container( - color: colorScheme.background, - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Material( - color: colorScheme.primaryContainer, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide( - width: 7, - color: colorScheme.outline, - ), - ), - child: Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(vertical: 16), - child: Text( - text, - textAlign: TextAlign.center, - style: theme.textTheme.headlineMedium!.copyWith( - color: colorScheme.onPrimaryContainer, - ), - ), - ), - ), - ); - } -} - -// A placeholder SliverList of 50 items. -class ItemList extends StatelessWidget { - const ItemList({ - super.key, - this.itemCount = 50, - }); - - final int itemCount; - - @override - Widget build(BuildContext context) { - final ColorScheme colorScheme = Theme.of(context).colorScheme; - return SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return Card( - color: colorScheme.onSecondary, - child: ListTile( - textColor: colorScheme.secondary, - title: Text('Item $index'), - ), - ); - }, - childCount: itemCount, - ), - ); - } -} - diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart deleted file mode 100644 index 62e13083..00000000 --- a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_02.dart +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class SliverResizingHeaderNode2 extends StatefulWidget { - const SliverResizingHeaderNode2({super.key}); - - @override - State createState() => _SliverResizingHeaderNode2State(); -} - -class _SliverResizingHeaderNode2State extends State { - int count = 0; - late final ScrollController scrollController; - - @override - void initState() { - super.initState(); - scrollController = ScrollController(); - } - - @override - void dispose() { - scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - return Scaffold( - backgroundColor: Colors.white, - body: - CustomScrollView( - controller: scrollController, - slivers: [ - _buildSliverBar(), - // _buildTitleText(), - const PinnedHeaderSliver(child: Divider()), - const _ItemList(), - ], - ), - ); - } - - Widget _buildSliverBar() { - const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); - const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); - const Text text = Text('Settings', style: style); - Widget action = IconButton(onPressed: () {}, icon: icon ); - return SliverLayoutBuilder(builder: (_, scs) { - double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); - factor = factor < 0.2 ? 0 : factor; - const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); - - const Text text2 = Text('Settings', style: style); - - AppBar header = AppBar( - backgroundColor: Colors.white, - surfaceTintColor: Colors.transparent, - actions: [action], - centerTitle: true, - - // bottom: PreferredSize(preferredSize: Size.fromHeight(46), child: text2), - title: Opacity(opacity: factor, child: text), - ); - - return SliverResizingHeader(child: header, - minExtentPrototype: AppBar(), - maxExtentPrototype: header, - ); - }); - } - - Widget _buildTitleText() { - const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); - const Text text = Text('Settings', style: style); - return const SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.only(left: 12.0, bottom: 8), - child: text, - ), - ); - } -} - -class _ItemList extends StatelessWidget { - const _ItemList({ - super.key, - this.itemCount = 50, - }); - - final int itemCount; - - @override - Widget build(BuildContext context) { - final ColorScheme colorScheme = Theme.of(context).colorScheme; - return SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return ListTile( - dense: true, - textColor: colorScheme.secondary, - title: Text('#$index title'), - subtitle: Text('Subtitle in line $index'), - ); - }, - childCount: itemCount, - ), - ); - } -} diff --git a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart b/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart deleted file mode 100644 index 6028b1f2..00000000 --- a/modules/widget_system/widgets/lib/Sliver/SliverResizingHeader/node_03.dart +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class PinnedHeaderSliverNode3 extends StatefulWidget { - const PinnedHeaderSliverNode3({super.key}); - - @override - State createState() => _PinnedHeaderSliverNode3State(); -} - -class _PinnedHeaderSliverNode3State extends State { - int count = 0; - late final ScrollController scrollController; - - @override - void initState() { - super.initState(); - scrollController = ScrollController(); - } - - @override - void dispose() { - scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final ThemeData theme = Theme.of(context); - final ColorScheme colorScheme = theme.colorScheme; - - return Scaffold( - backgroundColor: Colors.white, - body: CustomScrollView( - controller: scrollController, - slivers: [ - _buildSliverBar(), - _buildTitleText(), - _buildSliverSearch(), - -// PinnedHeaderSliver(child: Padding( -// padding: const EdgeInsets.symmetric(horizontal: 12.0), -// child: TextField( -// decoration: InputDecoration( -// filled: true, -// fillColor: Colors.white, -// border: InputBorder.none -// ), -// ), -// )), - - const _ItemList(), - ], - ), - ); - } - - Widget _buildSliverBar() { - const Icon icon = Icon(CupertinoIcons.settings, color: Colors.blue); - const TextStyle style = TextStyle(fontSize: 16, fontWeight: FontWeight.bold); - const Text text = Text('Settings', style: style); - Widget action = IconButton(onPressed: () {}, icon: icon); - return SliverLayoutBuilder(builder: (_, scs) { - double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); - factor = factor < 0.2 ? 0 : factor; - AppBar header = AppBar( - backgroundColor: Colors.white, - surfaceTintColor: Colors.transparent, - actions: [action], - centerTitle: true, - title: Opacity(opacity: factor, child: text), - ); - return PinnedHeaderSliver(child: header); - }); - } - - Widget _buildTitleText() { - const TextStyle style = TextStyle(fontSize: 20, fontWeight: FontWeight.bold); - const Text text = Text('Settings', style: style); - return const SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.only(left: 12.0, bottom: 8), - child: text, - ), - ); - } - - Widget _buildSliverSearch() { - BoxDecoration decoration = BoxDecoration( - color: const Color(0xffefeff1), borderRadius: BorderRadius.circular(6)); - Widget prefix = const Padding( - padding: EdgeInsets.only(left: 8.0), - child: Icon(CupertinoIcons.search, size: 20, color: Color(0xff808082)) - ); - return PinnedHeaderSliver( - child: ColoredBox( - color: Colors.white, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 8.0, right: 12, left: 12), - child: CupertinoTextField( - readOnly: true, - placeholder: '搜索', - onTap: _toSearchPage, - decoration: decoration, - prefix:prefix, - style: const TextStyle(fontSize: 14), - placeholderStyle: const TextStyle(color: Color(0xff808082)), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - ), - ), - const Divider(), - ], - ), - )); - } - - void _toSearchPage() { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => Scaffold(appBar: AppBar(title: const Text('SearchPage')))), - ); - } -} - -// A placeholder SliverList of 25 items. -class _ItemList extends StatelessWidget { - const _ItemList({ - super.key, - this.itemCount = 50, - }); - - final int itemCount; - - @override - Widget build(BuildContext context) { - final ColorScheme colorScheme = Theme - .of(context) - .colorScheme; - return SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - return ListTile( - dense: true, - textColor: colorScheme.secondary, - title: Text('#$index title'), - subtitle: Text('Subtitle in line $index'), - ); - }, - childCount: itemCount, - ), - ); - } -} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json index a820dad8..f75e987c 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_zh-CN.json @@ -1,28 +1,37 @@ { "id": 237, "name": "CarouselView", - "localName": "旋转视图", - "info": "复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。", + "localName": "轮播视图", + "info": "一个符合 Material Design 规范的轮播组件。显示一个可滚动的项目列表,每条目都可以根据选定的布局动态调整大小。", "lever": 4, "family": 1, - "linkIds": [], + "linkIds": [ + 253, + 340, + 160 + ], "nodes": [ { "file": "node1_base.dart", - "name": "Checkbox基础用法", + "name": "CarouselView 基础用法", "desc": [ - "【value】 : 是否选中 【double】", - "【checkColor】: 选中时✔️gou颜色 【Color】", - "【activeColor】: 选中时框内颜色 【Color】", - "【onChanged】: 状态改变事件 【Function(bool)】," + "【itemExtent】 : 主轴方向强制尺寸 【double】", + "【shrinkExtent】: 滑动中,主轴方向条目最小尺寸 【double】", + "【scrollDirection】 : 滑动轴向 【Axis?】", + "【children】: 子组件列表 【List】" ] }, { - "file": "node2_tristate.dart", - "name": "Checkbox的三态", + "file": "node2.dart", + "name": "CarouselView 样式配置", "desc": [ - "【tristate】 : 是否是三态 【double】", - " onChanged时," + "【padding】 : 内边距 【EdgeInsets? 】", + "【backgroundColor】 : 背景色 【Color? 】", + "【elevation】 : 阴影深 【double?】", + "【shape】 : 形状 【ShapeBorder?】", + "【controller】 : 控制器 【CarouselController?】", + "【reverse】 : 是否反向滑动 【bool】", + "【onTap】 : 点击事件 【ValueChanged? 】" ] } ] diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart index f1308bc9..158a3414 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node1_base.dart @@ -1,4 +1,3 @@ - // Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -15,20 +14,14 @@ class CarouselNode1 extends StatefulWidget { class _CarouselNode1State extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text('Carousel'),), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxHeight: 200), - child: CarouselView( - itemExtent: 320, - shrinkExtent: 200, - // itemSnapping: true, - children: List.generate(20, (int index) { - return UncontainedLayoutCard(index: index, label: 'Item $index'); - }), - ), - ), + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 160), + child: CarouselView( + itemExtent: 260, + shrinkExtent: 160, + children: List.generate(20, (int index) { + return UncontainedLayoutCard(index: index, label: 'Item $index'); + }), ), ); } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart index e8017368..6caabcbf 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/node2.dart @@ -1,4 +1,3 @@ - // Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,42 +11,51 @@ class CarouselNode2 extends StatefulWidget { State createState() => _CarouselNode2State(); } +class _WidgetMeta { + final String name; + final String desc; + + _WidgetMeta(this.name, this.desc); +} + class _CarouselNode2State extends State { + final List<_WidgetMeta> widgets = [ + _WidgetMeta('Container 容器组件', '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...'), + _WidgetMeta('Text 文字组件', '用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。'), + _WidgetMeta('Card 卡片组件', '基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。'), + _WidgetMeta('FlutterLogo Flutter图标', '用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。'), + _WidgetMeta('Banner 角标组件', '用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。'), + _WidgetMeta('Icon 图标组件', '用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但非常实用。'), + _WidgetMeta('ImageIcon 图形图标', '用于将一个图片变为纯色的组件。可指定大小、颜色。'), + _WidgetMeta('FadeInImage 淡入图片', '透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。'), + _WidgetMeta('CircleAvatar 圆形组件', '可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。'), + _WidgetMeta('Visibility 显隐组件', '控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。'), + ]; + @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - appBar: AppBar(title: Text('Carousel'),), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxHeight: 64), - child: CarouselView( - backgroundColor: Color(0xfff7f8fa), - itemExtent: 240, - // shrinkExtent: 200, - itemSnapping: true, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6) - ), - children: List.generate(20, (int index) { - return _UncontainedLayoutCard(index: index, label: 'Item $index'); - }), - ), - ), + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 64), + child: CarouselView( + backgroundColor: const Color(0xfff7f8fa), + itemExtent: 240, + // elevation: 1, + shrinkExtent: 240, + itemSnapping: true, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + children: widgets.map((e) => _WidgetDisplay(widget: e)).toList(), ), ); } } -class _UncontainedLayoutCard extends StatelessWidget { - const _UncontainedLayoutCard({ +class _WidgetDisplay extends StatelessWidget { + const _WidgetDisplay({ super.key, - required this.index, - required this.label, + required this.widget, }); - final int index; - final String label; + final _WidgetMeta widget; @override Widget build(BuildContext context) { @@ -60,26 +68,28 @@ class _UncontainedLayoutCard extends StatelessWidget { Row( children: [ Container( - width: 18, - height: 18, + width: 16, + height: 16, margin: EdgeInsets.only(right: 6), alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(4) + decoration: + BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(4)), + child: Text( + '热', + style: TextStyle(fontSize: 8, color: Colors.white, height: 1), ), - child: Text('热',style: TextStyle(fontSize: 10,color: Colors.white,),), ), Text( - 'Container 容器组件', - style: const TextStyle(color: Colors.black, fontSize: 14,fontWeight: FontWeight.bold), + widget.name, + style: + const TextStyle(color: Colors.black, fontSize: 14, fontWeight: FontWeight.bold), overflow: TextOverflow.clip, softWrap: false, ), ], ), Text( - '用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...', + widget.desc, style: const TextStyle(color: Colors.grey, fontSize: 12), overflow: TextOverflow.clip, softWrap: false, diff --git a/modules/widget_system/widgets/lib/exp/sliver_unit.dart b/modules/widget_system/widgets/lib/exp/sliver_unit.dart index c626766e..b7cbed9f 100644 --- a/modules/widget_system/widgets/lib/exp/sliver_unit.dart +++ b/modules/widget_system/widgets/lib/exp/sliver_unit.dart @@ -33,5 +33,5 @@ export '../Sliver/SliverMainAxisGroup/node1.dart'; export '../Sliver/PinnedHeaderSliver/node_01.dart'; export '../Sliver/PinnedHeaderSliver/node_02.dart'; export '../Sliver/PinnedHeaderSliver/node_03.dart'; -export '../Sliver/SliverResizingHeader/node_01.dart'; -export '../Sliver/SliverResizingHeader/node_02.dart'; +// export '../Sliver/SliverResizingHeader/node_01.dart'; +// export '../Sliver/SliverResizingHeader/node_02.dart'; diff --git a/modules/widget_system/widgets/lib/widgets.dart b/modules/widget_system/widgets/lib/widgets.dart index 27ce957f..0f0ee752 100644 --- a/modules/widget_system/widgets/lib/widgets.dart +++ b/modules/widget_system/widgets/lib/widgets.dart @@ -1,3 +1,10 @@ library widgets; -export 'widgets_map.dart'; \ No newline at end of file +export 'widgets_map.dart'; + +export 'exp/other_unit.dart'; +export 'exp/proxy_unit.dart'; +export 'exp/render_object_unit.dart' hide Box50,CornerCustomMultiChildLayout,CornerType; +export 'exp/sliver_unit.dart'; +export 'exp/stateful_unit.dart' hide ListModel,ColorBox,CardItem; +export 'exp/stateless_unit.dart' hide User; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/widgets_map.dart b/modules/widget_system/widgets/lib/widgets_map.dart index 94e2f3d4..a07c0da9 100644 --- a/modules/widget_system/widgets/lib/widgets_map.dart +++ b/modules/widget_system/widgets/lib/widgets_map.dart @@ -27,6 +27,11 @@ class WidgetsMap { const DropdownMenuNode2(), const DropdownMenuNode3(), ]; + case "CarouselView": + return [ + const CarouselNode1(), + const CarouselNode2(), + ]; case "PinnedHeaderSliver": return [ const PinnedHeaderSliverNode1(), diff --git a/pubspec.lock b/pubspec.lock index 68dae560..e7a01969 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,6 +81,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.flutter-io.cn/" + source: hosted + version: "3.1.2" cross_file: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 013b1613..0184b094 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.1.0 +version: 3.0.9 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts From 8af2099adf33bc4651bda53b1bb0a336e5454f39 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 26 Nov 2024 19:31:35 +0800 Subject: [PATCH 110/149] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/flutter_unit.dart | 2 +- lib/src/starter/fx_application.dart | 2 +- .../db_storage/flutter/dao/article_dao.dart | 2 - .../db_storage/flutter/dao/category_dao.dart | 406 ++--- .../src/db_storage/flutter/dao/like_dao.dart | 138 +- .../src/db_storage/flutter/dao/node_dao.dart | 89 +- .../db_storage/flutter/dao/widget_dao.dart | 210 +-- .../db_storage/flutter/flutter_db_store.dart | 17 +- .../db_storage/flutter/model/category_po.dart | 172 +- .../src/db_storage/flutter/model/enums.dart | 18 +- .../src/db_storage/flutter/model/node_po.dart | 76 +- .../flutter/model/widget_filter.dart | 96 +- .../db_storage/flutter/model/widget_po.dart | 148 +- .../blocs/category_bloc/category_bloc.dart | 3 +- .../category_widget_bloc.dart | 2 +- .../liked_widget_bloc/liked_widget_bloc.dart | 3 +- .../widget_detail_bloc.dart | 34 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 60 +- .../lib/data/db_impl/db_impl.dart | 4 - .../widget_module/lib/data/model/model.dart | 3 - .../widget_module/lib/data/zone.dart | 7 - .../category_panel/desk_category_page.dart | 6 +- .../category_panel/desk_top_like_panel.dart | 3 +- .../widget_detail/link_widget_buttons.dart | 3 +- .../widget_detail/widget_detail_bar.dart | 3 +- .../widget_detail/widget_detail_page.dart | 53 +- .../widget_detail/widget_detail_panel.dart | 3 +- .../desk_ui/widget_panel/desk_search_bar.dart | 6 +- .../widget_panel/desk_widget_model_item.dart | 2 +- .../desk_ui/widget_panel/widget_panel.dart | 4 +- .../mobile/category_page/category_detail.dart | 3 +- .../category_page/category_list_item.dart | 4 +- .../mobile/category_page/category_page.dart | 4 +- .../category_page/edit_category_panel.dart | 3 +- .../category_page/like_widget_page.dart | 3 +- .../category_page/sync/async_button.dart | 3 +- .../category_page/sync/upload_button.dart | 3 +- .../mobile/search_page/app_search_bar.dart | 3 +- .../search_page/standard_search_bar.dart | 4 +- .../search_page/standard_search_page.dart | 2 +- .../widget_detail/category_end_drawer.dart | 37 +- .../collect_widget_list_item.dart | 2 +- .../node_display/node_display.dart | 99 +- .../widget_detail/widget_detail_bar.dart | 2 +- .../widget_detail/widget_detail_page.dart | 133 +- .../widget_detail/widget_detail_panel.dart | 2 +- .../views/mobile/widget_page/home_drawer.dart | 2 +- .../widget_page/phone_widget_content.dart | 3 +- .../widget_page/standard_home_page.dart | 4 +- .../widget_page/unit_drawer_header.dart | 37 +- .../mobile/widget_page/widget_model_item.dart | 2 +- .../lib/views/widgets_bloc_provider.dart | 3 +- .../widget_module/lib/widget_module.dart | 12 +- .../widget_system/widget_module/pubspec.yaml | 3 +- .../widget_repository/.gitignore | 29 + .../widget_system/widget_repository/.metadata | 10 + .../widget_repository/CHANGELOG.md | 3 + .../widget_system/widget_repository/LICENSE | 1 + .../widget_system/widget_repository/README.md | 39 + .../widget_repository/analysis_options.yaml | 4 + .../lib/src/database/dao/category_dao.dart | 204 +++ .../lib/src/database/dao/like_dao.dart | 69 + .../lib/src/database/dao/node_dao.dart | 41 + .../lib/src/database/dao/widget_dao.dart | 103 ++ .../lib/src/database/database.dart | 12 + .../db_impl/category_db_repository.dart} | 6 +- .../database}/db_impl/node_db_repository.dart | 5 +- .../db_impl/widget_db_repository.dart | 5 +- .../lib/src/database/po/category_po.dart | 86 + .../lib/src/database/po/node_po.dart | 38 + .../lib/src/database/po/widget_po.dart | 73 + .../src/memory}/memory_node_repository.dart | 13 +- .../src/memory}/memory_widget_repository.dart | 7 +- .../lib/src}/model/category_model.dart | 10 +- .../lib/src/model/model.dart | 4 + .../lib/src}/model/node_model.dart | 20 +- .../lib/src/model/widget_filter.dart | 55 + .../lib/src}/model/widget_model.dart | 4 +- .../src/repository}/category_repository.dart | 4 +- .../lib/src/repository}/node_repository.dart | 2 +- .../lib/src/repository/repository.dart | 3 + .../src/repository}/widget_repository.dart | 4 +- .../lib/widget_repository.dart | 7 + .../widget_repository/pubspec.yaml | 60 + .../test/widget_repository_test.dart | 0 .../Column/node_01.dart | 2 +- .../Flex/node_01.dart | 8 +- .../Flex/node_02.dart | 8 +- .../Flex/node_03.dart | 23 +- .../Flex/node_04.dart | 8 +- .../Flex/node_05.dart | 8 +- .../Flow/node_01.dart | 4 +- .../Flow/node_02.dart | 45 +- .../Viewport/node1_base.dart | 4 +- .../Wrap/node1_base.dart | 16 +- .../Wrap/node2_alignment.dart | 16 +- .../Wrap/node3_crossAxisAlignment.dart | 16 +- .../Wrap/node4_textDirection.dart | 16 +- .../Wrap/node5_verticalDirection.dart | 16 +- .../Other/ListWheelViewport/node1_base.dart | 4 +- .../ListWheelViewport/node2_perspective.dart | 4 +- .../ListWheelViewport/node3_magnifier.dart | 4 +- .../ListWheelViewport/node4_opacity.dart | 4 +- .../ButtonBarTheme/node1_base.dart | 8 +- .../InheritedModel/desc_zh-CN.json | 2 +- .../lib/ProxyWidget/InheritedModel/node1.dart | 47 +- .../InheritedTheme/node1_base.dart | 2 +- .../InheritedWidget/node1_base.dart | 7 +- .../InheritedWidget/node2_use.dart | 16 +- .../lib/ProxyWidget/KeepAlive/node1_base.dart | 4 +- .../ScrollConfiguration/node1_base.dart | 4 +- .../RepaintBoundary/node2_save.dart | 12 +- .../node1_base.dart | 4 +- .../Sliver/CustomScrollView/node1_base.dart | 4 +- .../Sliver/FlexibleSpaceBar/node1_base.dart | 4 +- .../lib/Sliver/SliverGrid/node1_base.dart | 14 +- .../lib/Sliver/SliverList/node1_base.dart | 4 +- .../lib/Sliver/SliverOpacity/node1_base.dart | 4 +- .../lib/Sliver/SliverPadding/node1_base.dart | 4 +- .../SliverPersistentHeader/node1_base.dart | 4 +- .../Sliver/SliverToBoxAdapter/node1_base.dart | 4 +- .../AnimatedList/node1_base.dart | 17 +- .../AutomaticKeepAlive/node1_base.dart | 13 +- .../CupertinoButton/node1_base.dart | 4 +- .../CupertinoScrollbar/node1_base.dart | 4 +- .../node1_base.dart | 4 +- .../StatefulWidget/PageView/node1_base.dart | 4 +- .../PageView/node2_direction.dart | 4 +- .../StatefulWidget/Scrollable/node1_base.dart | 4 +- .../StatefulWidget/Scrollbar/node1_base.dart | 4 +- .../ValueListenableBuilder/node1_base.dart | 5 +- .../Autocomplete/node2_type.dart | 46 +- .../BackButton/node1_base.dart | 4 +- .../StatelessWidget/Banner/node1_base.dart | 4 +- .../Container/node4_decoration.dart | 6 +- .../CupertinoPopupSurface/node1_base.dart | 6 +- .../StatelessWidget/DataTable/node1_base.dart | 7 +- .../StatelessWidget/GridView/node1_base.dart | 4 +- .../GridView/node2_direction.dart | 20 +- .../GridView/node3_extend.dart | 20 +- .../GridView/node4_builder.dart | 4 +- .../StatelessWidget/ListView/node1_base.dart | 4 +- .../ListView/node2_direction.dart | 4 +- .../ListView/node3_builder.dart | 4 +- .../ListView/node4_separated.dart | 4 +- .../SingleChildScrollView/node1_base.dart | 4 +- .../node2_direction.dart | 29 +- .../lib/StatelessWidget/Text/desc_zh-CN.json | 4 +- .../Text/{node1_base.dart => node1.dart} | 10 +- .../lib/StatelessWidget/Text/node2.dart | 21 + .../StatelessWidget/Text/node2_shadows.dart | 29 - .../widgets/lib/exp/proxy_unit.dart | 2 + .../widgets/lib/exp/stateless_unit.dart | 4 +- .../widgets/lib/node_display_map.dart | 491 ++++++ .../widgets/lib/utils/dialog_about.dart | 17 +- .../widget_system/widgets/lib/widgets.dart | 6 +- .../widgets/lib/widgets_map.dart | 1486 ----------------- pubspec.lock | 7 + 158 files changed, 2662 insertions(+), 2871 deletions(-) delete mode 100644 modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart delete mode 100644 modules/widget_system/widget_module/lib/data/model/model.dart delete mode 100644 modules/widget_system/widget_module/lib/data/zone.dart create mode 100644 modules/widget_system/widget_repository/.gitignore create mode 100644 modules/widget_system/widget_repository/.metadata create mode 100644 modules/widget_system/widget_repository/CHANGELOG.md create mode 100644 modules/widget_system/widget_repository/LICENSE create mode 100644 modules/widget_system/widget_repository/README.md create mode 100644 modules/widget_system/widget_repository/analysis_options.yaml create mode 100644 modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/database.dart rename modules/widget_system/{widget_module/lib/data/db_impl/catagory_db_repository.dart => widget_repository/lib/src/database/db_impl/category_db_repository.dart} (95%) rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src/database}/db_impl/node_db_repository.dart (85%) rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src/database}/db_impl/widget_db_repository.dart (92%) create mode 100644 modules/widget_system/widget_repository/lib/src/database/po/category_po.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/po/node_po.dart create mode 100644 modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart rename modules/widget_system/{widget_module/lib/data/memory_impl => widget_repository/lib/src/memory}/memory_node_repository.dart (74%) rename modules/widget_system/{widget_module/lib/data/memory_impl => widget_repository/lib/src/memory}/memory_widget_repository.dart (93%) rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src}/model/category_model.dart (91%) create mode 100644 modules/widget_system/widget_repository/lib/src/model/model.dart rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src}/model/node_model.dart (67%) create mode 100644 modules/widget_system/widget_repository/lib/src/model/widget_filter.dart rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src}/model/widget_model.dart (97%) rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src/repository}/category_repository.dart (93%) rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src/repository}/node_repository.dart (75%) create mode 100644 modules/widget_system/widget_repository/lib/src/repository/repository.dart rename modules/widget_system/{widget_module/lib/data => widget_repository/lib/src/repository}/widget_repository.dart (89%) create mode 100644 modules/widget_system/widget_repository/lib/widget_repository.dart create mode 100644 modules/widget_system/widget_repository/pubspec.yaml create mode 100644 modules/widget_system/widget_repository/test/widget_repository_test.dart rename modules/widget_system/widgets/lib/StatelessWidget/Text/{node1_base.dart => node1.dart} (64%) create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart delete mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart create mode 100644 modules/widget_system/widgets/lib/node_display_map.dart delete mode 100644 modules/widget_system/widgets/lib/widgets_map.dart diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 130e8513..71bdbc09 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -6,7 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/gen_l10n/app_localizations.dart'; import 'package:l10n/l10n.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_module/widget_module.dart'; import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 8719539f..750762c2 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:go_router/go_router.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_module/widget_module.dart'; import 'package:widget_module/blocs/blocs.dart'; import '../flutter_unit.dart'; diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart index a625406d..580ad87b 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart @@ -3,8 +3,6 @@ import 'package:sqflite/sqflite.dart'; import '../model/article.dart'; - - class ArticleDao with HasDatabase, DbTable{ @override String get createSql => ''; diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart index 4610b147..23a58986 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart @@ -1,203 +1,203 @@ - -import 'package:fx_dao/fx_dao.dart'; - -import '../model/category_po.dart'; - - -//""" -// CREATE TABLE IF NOT EXISTS category_widget( -// id INTEGER PRIMARY KEY AUTOINCREMENT, -// name VARCHAR(64) NOT NULL, -// color VARCHAR(9) DEFAULT '#FF2196F3', -// info VARCHAR(256) DEFAULT '这里什么都没有...', -// created DATETIME NOT NULL, -// updated DATETIME NOT NULL, -// priority INTEGER DEFAULT 0, -// image VARCHAR(128) NULL image DEFAULT '' -// ); -//"""; - -class CategoryDao with HasDatabase, DbTable{ - @override - String get createSql => ''; - - @override - String get name => 'category'; - - - - Future insert(CategoryPo category) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "category(id,name,color,info,priority,image,created,updated) " - "VALUES (?,?,?,?,?,?,?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ - category.id, - category.name, - category.color, - category.info, - category.priority, - category.image, - category.created?.toIso8601String(), - category.updated.toIso8601String(), - ])); - } - - Future update(CategoryPo widget) async { - //插入方法 - String updateSql = //插入数据 - "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " - "WHERE id = ?"; - - return await database.transaction((tran) async => - await tran.rawUpdate(updateSql, [ - widget.name, - widget.color, - widget.info, - widget.priority, - widget.image, - widget.updated.toIso8601String(), - widget.id, - ])); - } - - - - Future addWidget(int categoryId,int widgetId,) async { - String addSql = //插入数据 - "INSERT INTO " - "category_widget(widgetId,categoryId) " - "VALUES (?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ - widgetId, - categoryId, - ])); - } - - Future addWidgets(int categoryId,List widgetIds) async { - String addSql = //插入数据 - "INSERT INTO " - "category_widget(widgetId,categoryId) VALUES "; - - String args = ''; - - for(int i=0;i< widgetIds.length;i++){ - args+= "(${widgetIds[i]},$categoryId)"; - if(i==widgetIds.length-1){ - args+=";"; - }else{ - args+=","; - } - } - addSql += args; - return await database.transaction((tran) async => await tran.rawInsert(addSql)); - } - - Future existByName(String name) async { - String sql = //插入数据 - "SELECT COUNT(name) as count FROM category " - "WHERE name = ?"; - List> rawData = await database.rawQuery(sql, [name]); - if (rawData.isNotEmpty) { - return rawData[0]['count'] > 0; - } - return false; - } - - Future>> queryAll() async { - List> data = await database.rawQuery( - "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" - "FROM category AS c " - "LEFT JOIN category_widget AS cw " - "ON c.id = cw.categoryId GROUP BY c.id " - "ORDER BY priority DESC,created DESC", - []); - return data; - } - - Future> categoryWidgetIds(int id) async { - List> data = await database.rawQuery( - "SELECT categoryId FROM `category_widget`" - "WHERE widgetId = ?", - [id]); - return data.toList().map((e)=>e["categoryId"]).toList(); - } - - - - Future deleteCollect(int id) async { - await database.execute( - "DELETE FROM category_widget " - "WHERE categoryId = ?", - [id]); - return await database.execute( - "DELETE FROM category " - "WHERE id = ?", - [id]); - } - - Future clear() async { - await database.execute( - "DELETE FROM category_widget " - "WHERE categoryId >0"); - return await database.execute( - "DELETE FROM category " - "WHERE id > 0"); - } - - Future removeWidget(int categoryId, int widgetId) async { - //插入方法 - String deleteSql = //插入数据 - "DELETE FROM " - "category_widget WHERE categoryId = ? AND widgetId = ? "; - return await database - .transaction((tran) async => await tran.rawInsert(deleteSql, [ - categoryId, - widgetId, - ])); - } - - Future existWidgetInCollect(int categoryId, int widgetId) async { - String sql = //插入数据 - "SELECT COUNT(id) as count FROM category_widget " - "WHERE categoryId = ? AND widgetId = ?"; - List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); - if (rawData.isNotEmpty) { - return rawData[0]['count'] > 0; - } - return false; - } - - Future toggleCollect(int categoryId, int widgetId) async { - if (await existWidgetInCollect(categoryId, widgetId)) { - //已存在: 移除 - await removeWidget(categoryId, widgetId); - } else { - await addWidget(categoryId, widgetId); - } - } - - Future toggleCollectDefault(int widgetId) async { - await toggleCollect(1, widgetId); - } - - Future>> loadCollectWidgets(int categoryId) async{ - String querySql = //插入数据 - "SELECT * FROM widget " - "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " - "ORDER BY lever DESC"; - - return await database.rawQuery(querySql,[categoryId]); - } - - Future> loadCollectWidgetIds(int categoryId) async{ - String querySql = //插入数据 - "SELECT id FROM widget " - "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " - "ORDER BY lever DESC"; - - var data = await database.rawQuery(querySql,[categoryId]); - return data.map((e) => e["id"] as int).toList(); - } -} +// +// import 'package:fx_dao/fx_dao.dart'; +// +// import '../model/category_po.dart'; +// +// +// //""" +// // CREATE TABLE IF NOT EXISTS category_widget( +// // id INTEGER PRIMARY KEY AUTOINCREMENT, +// // name VARCHAR(64) NOT NULL, +// // color VARCHAR(9) DEFAULT '#FF2196F3', +// // info VARCHAR(256) DEFAULT '这里什么都没有...', +// // created DATETIME NOT NULL, +// // updated DATETIME NOT NULL, +// // priority INTEGER DEFAULT 0, +// // image VARCHAR(128) NULL image DEFAULT '' +// // ); +// //"""; +// +// class CategoryDao with HasDatabase, DbTable{ +// @override +// String get createSql => ''; +// +// @override +// String get name => 'category'; +// +// +// +// Future insert(CategoryPo category) async { +// //插入方法 +// String addSql = //插入数据 +// "INSERT INTO " +// "category(id,name,color,info,priority,image,created,updated) " +// "VALUES (?,?,?,?,?,?,?,?);"; +// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ +// category.id, +// category.name, +// category.color, +// category.info, +// category.priority, +// category.image, +// category.created?.toIso8601String(), +// category.updated.toIso8601String(), +// ])); +// } +// +// Future update(CategoryPo widget) async { +// //插入方法 +// String updateSql = //插入数据 +// "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " +// "WHERE id = ?"; +// +// return await database.transaction((tran) async => +// await tran.rawUpdate(updateSql, [ +// widget.name, +// widget.color, +// widget.info, +// widget.priority, +// widget.image, +// widget.updated.toIso8601String(), +// widget.id, +// ])); +// } +// +// +// +// Future addWidget(int categoryId,int widgetId,) async { +// String addSql = //插入数据 +// "INSERT INTO " +// "category_widget(widgetId,categoryId) " +// "VALUES (?,?);"; +// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ +// widgetId, +// categoryId, +// ])); +// } +// +// Future addWidgets(int categoryId,List widgetIds) async { +// String addSql = //插入数据 +// "INSERT INTO " +// "category_widget(widgetId,categoryId) VALUES "; +// +// String args = ''; +// +// for(int i=0;i< widgetIds.length;i++){ +// args+= "(${widgetIds[i]},$categoryId)"; +// if(i==widgetIds.length-1){ +// args+=";"; +// }else{ +// args+=","; +// } +// } +// addSql += args; +// return await database.transaction((tran) async => await tran.rawInsert(addSql)); +// } +// +// Future existByName(String name) async { +// String sql = //插入数据 +// "SELECT COUNT(name) as count FROM category " +// "WHERE name = ?"; +// List> rawData = await database.rawQuery(sql, [name]); +// if (rawData.isNotEmpty) { +// return rawData[0]['count'] > 0; +// } +// return false; +// } +// +// Future>> queryAll() async { +// List> data = await database.rawQuery( +// "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" +// "FROM category AS c " +// "LEFT JOIN category_widget AS cw " +// "ON c.id = cw.categoryId GROUP BY c.id " +// "ORDER BY priority DESC,created DESC", +// []); +// return data; +// } +// +// Future> categoryWidgetIds(int id) async { +// List> data = await database.rawQuery( +// "SELECT categoryId FROM `category_widget`" +// "WHERE widgetId = ?", +// [id]); +// return data.toList().map((e)=>e["categoryId"]).toList(); +// } +// +// +// +// Future deleteCollect(int id) async { +// await database.execute( +// "DELETE FROM category_widget " +// "WHERE categoryId = ?", +// [id]); +// return await database.execute( +// "DELETE FROM category " +// "WHERE id = ?", +// [id]); +// } +// +// Future clear() async { +// await database.execute( +// "DELETE FROM category_widget " +// "WHERE categoryId >0"); +// return await database.execute( +// "DELETE FROM category " +// "WHERE id > 0"); +// } +// +// Future removeWidget(int categoryId, int widgetId) async { +// //插入方法 +// String deleteSql = //插入数据 +// "DELETE FROM " +// "category_widget WHERE categoryId = ? AND widgetId = ? "; +// return await database +// .transaction((tran) async => await tran.rawInsert(deleteSql, [ +// categoryId, +// widgetId, +// ])); +// } +// +// Future existWidgetInCollect(int categoryId, int widgetId) async { +// String sql = //插入数据 +// "SELECT COUNT(id) as count FROM category_widget " +// "WHERE categoryId = ? AND widgetId = ?"; +// List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); +// if (rawData.isNotEmpty) { +// return rawData[0]['count'] > 0; +// } +// return false; +// } +// +// Future toggleCollect(int categoryId, int widgetId) async { +// if (await existWidgetInCollect(categoryId, widgetId)) { +// //已存在: 移除 +// await removeWidget(categoryId, widgetId); +// } else { +// await addWidget(categoryId, widgetId); +// } +// } +// +// Future toggleCollectDefault(int widgetId) async { +// await toggleCollect(1, widgetId); +// } +// +// Future>> loadCollectWidgets(int categoryId) async{ +// String querySql = //插入数据 +// "SELECT * FROM widget " +// "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " +// "ORDER BY lever DESC"; +// +// return await database.rawQuery(querySql,[categoryId]); +// } +// +// Future> loadCollectWidgetIds(int categoryId) async{ +// String querySql = //插入数据 +// "SELECT id FROM widget " +// "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " +// "ORDER BY lever DESC"; +// +// var data = await database.rawQuery(querySql,[categoryId]); +// return data.map((e) => e["id"] as int).toList(); +// } +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart index 92ca842c..7126cea8 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart @@ -1,69 +1,69 @@ -import 'package:fx_dao/fx_dao.dart'; -import 'package:sqflite/sqflite.dart'; - -class LikeDao with HasDatabase, DbTable{ - @override - String get createSql => ''; - - @override - String get name => 'like_widget'; - - Future> likeWidgetIds() async { - var result = await database.rawQuery("SELECT widget_id FROM like_widget"); - var ids = result.map((e) => e['widget_id'] as int).toList(); - return ids; - } - - // 如果已喜欢,取消喜欢 - // 如果未喜欢,设为喜欢 - Future toggleCollect(int widgetId) async { - bool liked = await isLiked(widgetId); - - if (liked) { - await unlike(widgetId, check: false); - } else { - await like(widgetId, check: false); - } - } - - Future like(int widgetId, {bool check = true}) async { - if (check) { - // 如果 liked_widget_bloc ,直接取消,不执行 liked_widget_bloc 操作 - bool liked = await isLiked(widgetId); - if (liked) return 0; - } - - return await database.rawInsert( - "INSERT INTO " - "like_widget(widget_id) " - "VALUES (?);", - [widgetId]); - } - - Future unlike(int widgetId, {bool check = true}) async { - if (check) { - // 如果未 liked_widget_bloc ,直接取消,不执行 unlike 操作 - bool liked = await isLiked(widgetId); - if (!liked) return; - } - await database.execute( - "DELETE FROM like_widget " - "WHERE widget_id = ?", - [widgetId]); - } - - // 判断组件是否已 liked - Future isLiked(int widgetId) async { - var data = await database.rawQuery( - "Select count(id) as `count` FROM like_widget " - "WHERE widget_id = ?", - [widgetId]); - if (data.isNotEmpty) { - var result = data[0]; - return result['count'] as int > 0; - } - return false; - } - - -} +// import 'package:fx_dao/fx_dao.dart'; +// import 'package:sqflite/sqflite.dart'; +// +// class LikeDao with HasDatabase, DbTable{ +// @override +// String get createSql => ''; +// +// @override +// String get name => 'like_widget'; +// +// Future> likeWidgetIds() async { +// var result = await database.rawQuery("SELECT widget_id FROM like_widget"); +// var ids = result.map((e) => e['widget_id'] as int).toList(); +// return ids; +// } +// +// // 如果已喜欢,取消喜欢 +// // 如果未喜欢,设为喜欢 +// Future toggleCollect(int widgetId) async { +// bool liked = await isLiked(widgetId); +// +// if (liked) { +// await unlike(widgetId, check: false); +// } else { +// await like(widgetId, check: false); +// } +// } +// +// Future like(int widgetId, {bool check = true}) async { +// if (check) { +// // 如果 liked_widget_bloc ,直接取消,不执行 liked_widget_bloc 操作 +// bool liked = await isLiked(widgetId); +// if (liked) return 0; +// } +// +// return await database.rawInsert( +// "INSERT INTO " +// "like_widget(widget_id) " +// "VALUES (?);", +// [widgetId]); +// } +// +// Future unlike(int widgetId, {bool check = true}) async { +// if (check) { +// // 如果未 liked_widget_bloc ,直接取消,不执行 unlike 操作 +// bool liked = await isLiked(widgetId); +// if (!liked) return; +// } +// await database.execute( +// "DELETE FROM like_widget " +// "WHERE widget_id = ?", +// [widgetId]); +// } +// +// // 判断组件是否已 liked +// Future isLiked(int widgetId) async { +// var data = await database.rawQuery( +// "Select count(id) as `count` FROM like_widget " +// "WHERE widget_id = ?", +// [widgetId]); +// if (data.isNotEmpty) { +// var result = data[0]; +// return result['count'] as int > 0; +// } +// return false; +// } +// +// +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart index 214c5bc8..99ce75fd 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart @@ -1,48 +1,41 @@ -import 'package:fx_dao/fx_dao.dart'; -import 'package:storage/storage.dart'; - -import '../model/node_po.dart'; - -class NodeDao with HasDatabase, DbTable { - - @override - String get createSql => ''; - - @override - String get name => 'node'; - - - - - Future insert(NodePo widget) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "node(widgetId,name,priority,subtitle,code) " - "VALUES (?,?,?,?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.widgetId, - widget.name, - widget.priority, - widget.subtitle, - widget.code - ])); - } - - Future>> queryAll() async { - return await database.rawQuery("SELECT * FROM node"); - } - - //根据 id 查询组件 node - Future>> queryById(int id) async { - return await database.rawQuery( - "SELECT name,subtitle,code " - "FROM node " - "WHERE widgetId = ? ORDER BY priority", - [id]); - } - - - - -} +// import 'package:fx_dao/fx_dao.dart'; +// import 'package:storage/storage.dart'; +// +// import '../model/node_po.dart'; +// +// class NodeDao with HasDatabase, DbTable { +// +// @override +// String get createSql => ''; +// +// @override +// String get name => 'node'; +// +// Future insert(NodePo widget) async { +// //插入方法 +// String addSql = //插入数据 +// "INSERT INTO " +// "node(widgetId,name,priority,subtitle,code) " +// "VALUES (?,?,?,?,?);"; +// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ +// widget.widgetId, +// widget.name, +// widget.priority, +// widget.subtitle, +// widget.code +// ])); +// } +// +// Future>> queryAll() async { +// return await database.rawQuery("SELECT * FROM node"); +// } +// +// //根据 id 查询组件 node +// Future>> queryById(int id) async { +// return await database.rawQuery( +// "SELECT name,subtitle,code " +// "FROM node " +// "WHERE widgetId = ? ORDER BY priority", +// [id]); +// } +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart index 5799afe2..cecd7745 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart @@ -1,105 +1,105 @@ -import 'package:fx_dao/fx_dao.dart'; - -import '../model/enums.dart'; -import '../model/widget_filter.dart'; -import '../model/widget_po.dart'; - -class WidgetDao with HasDatabase, DbTable { - @override - String get createSql => ''; - - @override - String get name => 'widget'; - - Future insert(WidgetPo widget) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " - "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " - "VALUES (?,?,?,?,?,?,?,?);"; - return database.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.id, - widget.name, - widget.nameCN, - widget.deprecated, - widget.family, - widget.lever, - widget.linkWidget, - widget.info - ])); - } - - Future>> queryAll() async { - return database.rawQuery("SELECT * FROM widget"); - } - - Future>> queryByFamily(WidgetFamily family) async { - return database.rawQuery( - "SELECT * " - "FROM widget WHERE family = ? ORDER BY lever DESC", - [family.index]); - } - - Future>> queryByIds(List ids) async { - if (ids.isEmpty) { - return []; - } - String sql = "SELECT * " - "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; - - return database.rawQuery(sql, [...ids]); - } - - Future>> search(WidgetFilter arguments) async { - // 保证 name 参数为空时,不进行搜索 - if (arguments.name.isEmpty) { - return []; - } - - // _表示 name 任意 - String name = arguments.name == '*' ? '' : arguments.name; - bool hasFamily = arguments.family != null; - String familySql = hasFamily ? ' AND family = ?' : ''; - List familyArg = hasFamily ? [arguments.family!.index] : []; - List starArg = arguments.stars; - // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 - if (arguments.stars.reduce((a, b) => a + b) == -5) { - starArg = [1, 2, 3, 4, 5]; - } - return database.rawQuery( - "SELECT * " - "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", - [ - "%$name%", - "%$name%", - "%$name%", - ...familyArg, - ...starArg, - arguments.pageSize, - arguments.offset - ]); - } - - Future total(WidgetFilter args) async { - bool hasFamily = args.family != null; - String familySql = hasFamily ? 'family = ?' : ''; - List familyArg = hasFamily ? [args.family!.index] : []; - - String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; - - List> result = await database.rawQuery(sql, familyArg); - if (result.isNotEmpty) { - return result.first['count'] as int ?? 0; - } - return 0; - } - - Future?> queryWidgetByName(String name) async { - String sql = "SELECT * FROM widget WHERE name = ?"; - List> result = await database.rawQuery(sql, [name]); - if (result.isNotEmpty) { - return result.first; - } - return null; - } -} +// import 'package:fx_dao/fx_dao.dart'; +// +// import '../model/enums.dart'; +// import '../model/widget_filter.dart'; +// import '../model/widget_po.dart'; +// +// class WidgetDao with HasDatabase, DbTable { +// @override +// String get createSql => ''; +// +// @override +// String get name => 'widget'; +// +// Future insert(WidgetPo widget) async { +// //插入方法 +// String addSql = //插入数据 +// "INSERT INTO " +// "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " +// "VALUES (?,?,?,?,?,?,?,?);"; +// return database.transaction((tran) async => await tran.rawInsert(addSql, [ +// widget.id, +// widget.name, +// widget.nameCN, +// widget.deprecated, +// widget.family, +// widget.lever, +// widget.linkWidget, +// widget.info +// ])); +// } +// +// Future>> queryAll() async { +// return database.rawQuery("SELECT * FROM widget"); +// } +// +// Future>> queryByFamily(WidgetFamily family) async { +// return database.rawQuery( +// "SELECT * " +// "FROM widget WHERE family = ? ORDER BY lever DESC", +// [family.index]); +// } +// +// Future>> queryByIds(List ids) async { +// if (ids.isEmpty) { +// return []; +// } +// String sql = "SELECT * " +// "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; +// +// return database.rawQuery(sql, [...ids]); +// } +// +// Future>> search(WidgetFilter arguments) async { +// // 保证 name 参数为空时,不进行搜索 +// if (arguments.name.isEmpty) { +// return []; +// } +// +// // * 表示 name 任意 +// String name = arguments.name == '*' ? '' : arguments.name; +// bool hasFamily = arguments.family != null; +// String familySql = hasFamily ? ' AND family = ?' : ''; +// List familyArg = hasFamily ? [arguments.family!.index] : []; +// List starArg = arguments.stars; +// // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 +// if (arguments.stars.reduce((a, b) => a + b) == -5) { +// starArg = [1, 2, 3, 4, 5]; +// } +// return database.rawQuery( +// "SELECT * " +// "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", +// [ +// "%$name%", +// "%$name%", +// "%$name%", +// ...familyArg, +// ...starArg, +// arguments.pageSize, +// arguments.offset +// ]); +// } +// +// Future total(WidgetFilter args) async { +// bool hasFamily = args.family != null; +// String familySql = hasFamily ? 'family = ?' : ''; +// List familyArg = hasFamily ? [args.family!.index] : []; +// +// String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; +// +// List> result = await database.rawQuery(sql, familyArg); +// if (result.isNotEmpty) { +// return result.first['count'] as int ?? 0; +// } +// return 0; +// } +// +// Future?> queryWidgetByName(String name) async { +// String sql = "SELECT * FROM widget WHERE name = ?"; +// List> result = await database.rawQuery(sql, [name]); +// if (result.isNotEmpty) { +// return result.first; +// } +// return null; +// } +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart index bb9f10a5..7c747d0e 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart @@ -3,18 +3,10 @@ import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:fx_dao/fx_dao.dart'; -import 'dao/article_dao.dart'; -import 'dao/category_dao.dart'; import 'dao/columnize_dao.dart'; -import 'dao/like_dao.dart'; -import 'dao/node_dao.dart'; -import 'dao/widget_dao.dart'; +import 'package:widget_module/widget_module.dart'; class FlutterDbStore extends FxDb { - late WidgetDao _widgetStore; - - WidgetDao get widgetStore => _widgetStore; - @override String get dbname => 'flutter.db'; @@ -35,11 +27,10 @@ class FlutterDbStore extends FxDb { @override Iterable get tables => [ - WidgetDao(), - LikeDao(), + ColumnizeDao(), CategoryDao(), + WidgetDao(), NodeDao(), - ArticleDao(), - ColumnizeDao(), + LikeDao(), ]; } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart index 6046d5d8..aaca07de 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart @@ -1,86 +1,86 @@ -/// create by 张风捷特烈 on 2020-04-17 -/// contact me by email 1981462002@qq.com -/// 说明: 收藏夹数据库-数据模型 - -// """ -// CREATE TABLE IF NOT EXISTS category( -// id INTEGER PRIMARY KEY AUTOINCREMENT, -// name VARCHAR(64) NOT NULL, -// color VARCHAR(9) DEFAULT '#FF2196F3', -// info VARCHAR(256) DEFAULT '这里什么都没有...', -// created DATETIME NOT NULL, -// updated DATETIME NOT NULL, -// priority INTEGER DEFAULT 0, -// image VARCHAR(128) NULL image DEFAULT '' -// );"""; //建表语句 - -class CategoryPo { - final int? id; - final String name; - final String color; - final String info; - final DateTime? created; - final DateTime updated; - final String image; - final int count; - final int priority; - - const CategoryPo({ - this.id, - required this.name, - this.color = '#FFF2F2F2', - this.created, - required this.updated, - this.count = 0, - this.priority = 0, - this.info = '这里什么都没有...', - this.image = '', - }); - - factory CategoryPo.fromJson(Map map) { - return CategoryPo( - id: map['id'], - name: map['name'], - color: map["color"], - created: DateTime.parse(map["created"]), - image: map["image"], - priority: map["priority"], - count: map["count"], - updated: DateTime.parse(map["updated"]), - info: map["info"]); - } - - factory CategoryPo.fromNetJson(Map map) { - return CategoryPo( - id: map['id'], - name: map['name'], - color: map["color"], - created: DateTime.fromMillisecondsSinceEpoch(map["created"]), - image: map["image"], - priority: map["priority"], - count: map["count"], - updated: DateTime.fromMillisecondsSinceEpoch(map["updated"]), - info: map["info"]); - } - - Map toJson() => { - "id": id, - "name": name, - "info": info, - "created": created?.millisecondsSinceEpoch, - "updated": updated.millisecondsSinceEpoch, - "image": image, - "count": count, - "color": color, - "priority": priority, - }; - - @override - String toString() { - return 'CategoryPo{id: $id, name: $name, color: $color, info: $info, created: $created, updated: $updated, image: $image, count: $count, priority: $priority}'; - } - - @override - List get props => - [id, name, color, created, image, info, updated, priority,count]; -} +// /// create by 张风捷特烈 on 2020-04-17 +// /// contact me by email 1981462002@qq.com +// /// 说明: 收藏夹数据库-数据模型 +// +// // """ +// // CREATE TABLE IF NOT EXISTS category( +// // id INTEGER PRIMARY KEY AUTOINCREMENT, +// // name VARCHAR(64) NOT NULL, +// // color VARCHAR(9) DEFAULT '#FF2196F3', +// // info VARCHAR(256) DEFAULT '这里什么都没有...', +// // created DATETIME NOT NULL, +// // updated DATETIME NOT NULL, +// // priority INTEGER DEFAULT 0, +// // image VARCHAR(128) NULL image DEFAULT '' +// // );"""; //建表语句 +// +// class CategoryPo { +// final int? id; +// final String name; +// final String color; +// final String info; +// final DateTime? created; +// final DateTime updated; +// final String image; +// final int count; +// final int priority; +// +// const CategoryPo({ +// this.id, +// required this.name, +// this.color = '#FFF2F2F2', +// this.created, +// required this.updated, +// this.count = 0, +// this.priority = 0, +// this.info = '这里什么都没有...', +// this.image = '', +// }); +// +// factory CategoryPo.fromJson(Map map) { +// return CategoryPo( +// id: map['id'], +// name: map['name'], +// color: map["color"], +// created: DateTime.parse(map["created"]), +// image: map["image"], +// priority: map["priority"], +// count: map["count"], +// updated: DateTime.parse(map["updated"]), +// info: map["info"]); +// } +// +// factory CategoryPo.fromNetJson(Map map) { +// return CategoryPo( +// id: map['id'], +// name: map['name'], +// color: map["color"], +// created: DateTime.fromMillisecondsSinceEpoch(map["created"]), +// image: map["image"], +// priority: map["priority"], +// count: map["count"], +// updated: DateTime.fromMillisecondsSinceEpoch(map["updated"]), +// info: map["info"]); +// } +// +// Map toJson() => { +// "id": id, +// "name": name, +// "info": info, +// "created": created?.millisecondsSinceEpoch, +// "updated": updated.millisecondsSinceEpoch, +// "image": image, +// "count": count, +// "color": color, +// "priority": priority, +// }; +// +// @override +// String toString() { +// return 'CategoryPo{id: $id, name: $name, color: $color, info: $info, created: $created, updated: $updated, image: $image, count: $count, priority: $priority}'; +// } +// +// @override +// List get props => +// [id, name, color, created, image, info, updated, priority,count]; +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart index 37a33388..097c34b6 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart @@ -2,12 +2,12 @@ /// contact me by email 1981462002@qq.com /// 说明: -enum WidgetFamily { - statelessWidget, - statefulWidget, - singleChildRenderObjectWidget, - multiChildRenderObjectWidget, - sliver, - proxyWidget, - other, -} +// enum WidgetFamily { +// statelessWidget, +// statefulWidget, +// singleChildRenderObjectWidget, +// multiChildRenderObjectWidget, +// sliver, +// proxyWidget, +// other, +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart index f5198a1b..e25953c6 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart @@ -1,38 +1,38 @@ - -/// create by 张风捷特烈 on 2020-03-04 -/// contact me by email 1981462002@qq.com -/// 说明: 详情页节点-数据库-数据模型 -/// -class NodePo { - final int id; - final int widgetId; - final String name; - final int priority; - final String subtitle; - final String code; - - const NodePo({ - required this.id, - required this.widgetId, - required this.name, - required this.priority, - required this.subtitle, - required this.code, - }); - - factory NodePo.fromJson(Map map) { - return NodePo( - id: map['id']??0, - name: map['name'], - widgetId: map["widgetId"], - priority: map["priority"], - subtitle: map["subtitle"], - code: map["code"]); - } - - @override - String toString() { - return 'NodePo{id: $id, widgetId: $widgetId, name: $name, priority: $priority, subtitle: $subtitle, code: $code}'; - } - -} +// +// /// create by 张风捷特烈 on 2020-03-04 +// /// contact me by email 1981462002@qq.com +// /// 说明: 详情页节点-数据库-数据模型 +// /// +// class NodePo { +// final int id; +// final int widgetId; +// final String name; +// final int priority; +// final String subtitle; +// final String code; +// +// const NodePo({ +// required this.id, +// required this.widgetId, +// required this.name, +// required this.priority, +// required this.subtitle, +// required this.code, +// }); +// +// factory NodePo.fromJson(Map map) { +// return NodePo( +// id: map['id']??0, +// name: map['name'], +// widgetId: map["widgetId"], +// priority: map["priority"], +// subtitle: map["subtitle"], +// code: map["code"]); +// } +// +// @override +// String toString() { +// return 'NodePo{id: $id, widgetId: $widgetId, name: $name, priority: $priority, subtitle: $subtitle, code: $code}'; +// } +// +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart index 71f36d13..95620a52 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart @@ -1,48 +1,48 @@ -import 'enums.dart'; - - - -class WidgetFilter { - final String name; - final WidgetFamily? family; - final List stars; - final int page; - final int pageSize; - - const WidgetFilter({ - this.name = '', - this.family, - this.stars = const [-1, -1, -1, -1, -1], - this.page = 1, - this.pageSize = 20, - }); - - int get offset =>pageSize*(page-1); - - WidgetFilter.family( - this.family, { - this.name = '*', - this.page = 1, - this.pageSize = 20, - this.stars = const [1, 2, 3, 4, 5], - }); - - WidgetFilter copyWith({ - String? name, - WidgetFamily? family, - List? stars, - int? page, - }) { - return WidgetFilter( - name: name ?? this.name, - family: family ?? this.family, - stars: stars ?? this.stars, - page: page ?? this.page, - ); - } - - @override - String toString() { - return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; - } -} +// import 'enums.dart'; +// +// +// +// class WidgetFilter { +// final String name; +// final WidgetFamily? family; +// final List stars; +// final int page; +// final int pageSize; +// +// const WidgetFilter({ +// this.name = '', +// this.family, +// this.stars = const [-1, -1, -1, -1, -1], +// this.page = 1, +// this.pageSize = 20, +// }); +// +// int get offset =>pageSize*(page-1); +// +// WidgetFilter.family( +// this.family, { +// this.name = '*', +// this.page = 1, +// this.pageSize = 20, +// this.stars = const [1, 2, 3, 4, 5], +// }); +// +// WidgetFilter copyWith({ +// String? name, +// WidgetFamily? family, +// List? stars, +// int? page, +// }) { +// return WidgetFilter( +// name: name ?? this.name, +// family: family ?? this.family, +// stars: stars ?? this.stars, +// page: page ?? this.page, +// ); +// } +// +// @override +// String toString() { +// return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; +// } +// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart index 7ea24e24..10695353 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart @@ -1,74 +1,74 @@ - -/// create by 张风捷特烈 on 2020-03-04 -/// contact me by email 1981462002@qq.com -/// 说明: 组件信息-数据库-数据模型 -/// - - -class WidgetPo { - final int id; - final String name; - final String nameCN; - final int deprecated; - final int family; - final double lever; - final String info; - final String linkWidget; - - const WidgetPo({ - required this.id, - required this.name, - required this.nameCN, - required this.deprecated, - required this.family, - required this.lever, - required this.linkWidget, - required this.info, - }); - - factory WidgetPo.fromJson(Map map) { - return WidgetPo( - id: map['id'], - name: map['name'], - nameCN: map["nameCN"], - family: map["family"], - deprecated: map["deprecated"] ?? 0, - lever: map["lever"].toDouble(), - linkWidget: map["linkWidget"], - info: map["info"]); - } - - factory WidgetPo.fromDesc(Map map) { - return WidgetPo( - id: map['id'], - name: map['name'], - nameCN: map["localName"], - family: map["family"], - lever: map["lever"].toDouble(), - linkWidget: map["linkIds"].join(','), - deprecated: map["deprecated"] ?? 0, - info: map["info"]); - } - - Map toJson() { - return { - "id": id, - "name": name, - "nameCN": nameCN, - "family": family, - "deprecated": deprecated, - "lever": lever, - "linkWidget": linkWidget, - "info": info - }; - } - - @override - String toString() { - return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, deprecated: $deprecated, family: $family, lever: $lever, info: $info}'; - } - - @override - List get props => - [id, name, nameCN, deprecated, family, linkWidget, lever, info]; -} +// +// /// create by 张风捷特烈 on 2020-03-04 +// /// contact me by email 1981462002@qq.com +// /// 说明: 组件信息-数据库-数据模型 +// /// +// +// +// class WidgetPo { +// final int id; +// final String name; +// final String nameCN; +// final int deprecated; +// final int family; +// final double lever; +// final String info; +// final String linkWidget; +// +// const WidgetPo({ +// required this.id, +// required this.name, +// required this.nameCN, +// required this.deprecated, +// required this.family, +// required this.lever, +// required this.linkWidget, +// required this.info, +// }); +// +// factory WidgetPo.fromJson(Map map) { +// return WidgetPo( +// id: map['id'], +// name: map['name'], +// nameCN: map["nameCN"], +// family: map["family"], +// deprecated: map["deprecated"] ?? 0, +// lever: map["lever"].toDouble(), +// linkWidget: map["linkWidget"], +// info: map["info"]); +// } +// +// factory WidgetPo.fromDesc(Map map) { +// return WidgetPo( +// id: map['id'], +// name: map['name'], +// nameCN: map["localName"], +// family: map["family"], +// lever: map["lever"].toDouble(), +// linkWidget: map["linkIds"].join(','), +// deprecated: map["deprecated"] ?? 0, +// info: map["info"]); +// } +// +// Map toJson() { +// return { +// "id": id, +// "name": name, +// "nameCN": nameCN, +// "family": family, +// "deprecated": deprecated, +// "lever": lever, +// "linkWidget": linkWidget, +// "info": info +// }; +// } +// +// @override +// String toString() { +// return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, deprecated: $deprecated, family: $family, lever: $lever, info: $info}'; +// } +// +// @override +// List get props => +// [id, name, nameCN, deprecated, family, linkWidget, lever, info]; +// } diff --git a/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart index fa104856..cd4f03c9 100644 --- a/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/category_bloc/category_bloc.dart @@ -1,7 +1,6 @@ -import 'package:storage/storage.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; part 'category_event.dart'; diff --git a/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart index b0d075d5..b263c2bd 100644 --- a/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/category_widget_bloc/category_widget_bloc.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; diff --git a/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart index 352458a0..0ab2ef17 100644 --- a/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/liked_widget_bloc/liked_widget_bloc.dart @@ -1,6 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 2f24e281..cf0cf99e 100644 --- a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -1,35 +1,34 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; part 'widget_detail_state.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com /// 说明: 组件详情页状态数据维护核心类 -/// [_modelStack] 组件详情页支持管理跳转,栈数据交由 Bloc 维护 +/// [_modelStack] 组件详情页支持管理跳转,栈数据交由 Bloc 维护 class WidgetDetailBloc extends Cubit { - final WidgetRepository widgetRepository; - final NodeRepository nodeRepository; + final WidgetRepository widgetRepo; + final NodeRepository nodeRepo; WidgetDetailBloc({ - required this.widgetRepository, - required this.nodeRepository, + required this.widgetRepo, + required this.nodeRepo, }) : super(DetailLoading()); final List _modelStack = []; WidgetModel get currentWidget => _modelStack.last; - void push(WidgetModel model){ + void push(WidgetModel model) { _modelStack.add(model); queryDetail(model); } - Future pop() async{ - if(_modelStack.isEmpty){ + Future pop() async { + if (_modelStack.isEmpty) { return true; } _modelStack.removeLast(); @@ -44,22 +43,15 @@ class WidgetDetailBloc extends Cubit { void queryDetail(WidgetModel widget) async { emit(DetailLoading()); try { - final List nodes = await nodeRepository.loadNode(widget.id); - final List links = await widgetRepository.loadWidget(widget.links); - print("queryDetail====${nodes.length}==="); - + final List nodes = await nodeRepo.loadNode(widget.id); + final List links = await widgetRepo.loadWidget(widget.links); if (nodes.isEmpty) { emit(DetailEmpty()); } else { - emit(DetailWithData( - widgetModel: widget, - nodes: nodes, - links: links, - )); + emit(DetailWithData(widgetModel: widget, nodes: nodes, links: links)); } - } catch (e,s) { + } catch (e, s) { print("queryDetail=error===${e}=$s=="); - emit(DetailFailed()); } } diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 0c4069c4..79392b23 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -1,12 +1,9 @@ import 'dart:async'; -import 'dart:io'; import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:storage/storage.dart'; - -import '../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; part 'widgets_event.dart'; @@ -29,8 +26,8 @@ class WidgetsBloc extends Bloc { /// 切换页签,以 [family] 为过滤项 void _onEventTabTap(EventTabTap event, Emitter emit) async { emit(const WidgetsLoading(operate: LoadOperate.load)); - int size = isDesk?1000:20; - WidgetFilter filter = WidgetFilter.family(event.family,pageSize: size); + int size = isDesk ? 1000 : 20; + WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size); try { final List widgets = await repository.searchWidgets(filter); emit(WidgetsLoaded( @@ -38,7 +35,7 @@ class WidgetsBloc extends Bloc { filter: filter, operate: LoadOperate.load, )); - } catch (err,t) { + } catch (err, t) { print("======$err==========$t=============="); emit(WidgetsLoadFailed( err.toString(), @@ -50,18 +47,16 @@ class WidgetsBloc extends Bloc { FutureOr _onEventRefresh( EventRefresh event, Emitter emit) async { - // emit(const WidgetsLoading(operate: LoadOperate.refresh)); try { await Future.delayed(const Duration(milliseconds: 500)); final List widgets = - await repository.searchWidgets(state.filter.copyWith( - page: 1, - )); + await repository.searchWidgets(state.filter.copyWith(page: 1)); emit(WidgetsLoaded( - widgets: widgets, - filter: state.filter, - operate: LoadOperate.refresh, - fetchTime: DateTime.now().millisecondsSinceEpoch)); + widgets: widgets, + filter: state.filter, + operate: LoadOperate.refresh, + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); } catch (err) { print(err); emit(WidgetsLoadFailed( @@ -79,17 +74,21 @@ class WidgetsBloc extends Bloc { int total = await repository.total(old.filter); if (old.widgets.length < old.filter.pageSize) { // 不满一页 - emit(old.copyWith(full: true, + emit(old.copyWith( + full: true, operate: LoadOperate.more, - fetchTime: DateTime.now().millisecondsSinceEpoch,)); + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); return; } if (total <= old.widgets.length) { // 已满 - emit(old.copyWith(full: true, + emit(old.copyWith( + full: true, operate: LoadOperate.more, - fetchTime: DateTime.now().millisecondsSinceEpoch,)); + fetchTime: DateTime.now().millisecondsSinceEpoch, + )); return; } // 未满,继续加载下一页 @@ -98,11 +97,12 @@ class WidgetsBloc extends Bloc { final List newData = await repository.searchWidgets(filter); List newWidget = old.widgets + newData; emit(old.copyWith( - widgets: newWidget, - full: newWidget.length == total, - operate: LoadOperate.more, - fetchTime: DateTime.now().millisecondsSinceEpoch, - filter: filter)); + widgets: newWidget, + full: newWidget.length == total, + operate: LoadOperate.more, + fetchTime: DateTime.now().millisecondsSinceEpoch, + filter: filter, + )); } } @@ -113,11 +113,17 @@ class WidgetsBloc extends Bloc { final List widgets = await repository.searchWidgets(event.filter); emit(WidgetsLoaded( - widgets: widgets, filter: event.filter, operate: LoadOperate.load)); + widgets: widgets, + filter: event.filter, + operate: LoadOperate.load, + )); } catch (err) { print(err); - emit(WidgetsLoadFailed(err.toString(), - filter: event.filter, operate: LoadOperate.load)); + emit(WidgetsLoadFailed( + err.toString(), + filter: event.filter, + operate: LoadOperate.load, + )); } } } diff --git a/modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart b/modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart deleted file mode 100644 index be0f2b85..00000000 --- a/modules/widget_system/widget_module/lib/data/db_impl/db_impl.dart +++ /dev/null @@ -1,4 +0,0 @@ - -export 'widget_db_repository.dart'; -export 'catagory_db_repository.dart'; -export 'node_db_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/model/model.dart b/modules/widget_system/widget_module/lib/data/model/model.dart deleted file mode 100644 index be0c197b..00000000 --- a/modules/widget_system/widget_module/lib/data/model/model.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'node_model.dart'; -export 'widget_model.dart'; -export 'category_model.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/zone.dart b/modules/widget_system/widget_module/lib/data/zone.dart deleted file mode 100644 index 8fe47b61..00000000 --- a/modules/widget_system/widget_module/lib/data/zone.dart +++ /dev/null @@ -1,7 +0,0 @@ -export 'category_repository.dart'; -export 'node_repository.dart'; -export 'widget_repository.dart'; -export 'model/model.dart'; -export 'db_impl/db_impl.dart'; -export 'memory_impl/memory_node_repository.dart'; -export 'memory_impl/memory_widget_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart index cd79d3c1..6550094e 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_category_page.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; import '../../mobile/category_page/category_list_item.dart'; import '../../mobile/category_page/delete_category_dialog.dart'; import '../../mobile/category_page/edit_category_panel.dart'; @@ -30,9 +30,7 @@ class _DeskCategoryPageState extends State { children: [ DeskTabTopBar(onTabPressed: (int value) { _ctrl.jumpToPage(value); - }, tabs: ['组件酒肆','珍藏组件', - // '添加收藏集' - ],), + }, tabs: ['组件酒肆','珍藏组件'],), Expanded(child: PageView( controller: _ctrl, children: [ diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart index bcd1d9e8..ff2f7f1a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/category_panel/desk_top_like_panel.dart @@ -3,7 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + import '../../mobile/widget_detail/collect_widget_list_item.dart'; import '../../mobile/widget_detail/widget_detail_page.dart'; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart index 03242a1b..b357dc4c 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/link_widget_buttons.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + class LinkWidgetButtons extends StatelessWidget { final List links; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart index 5144f7ef..274a2bfa 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_bar.dart @@ -9,7 +9,8 @@ import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + class DeskSliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index 029c57dd..a99115a4 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -5,16 +5,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../../data/zone.dart'; -import 'package:widgets/widgets.dart'; - +import '../../mobile/mobile_ui.dart'; import '../../mobile/widget_detail/category_end_drawer.dart'; import '../../mobile/widget_detail/node_display/node_display.dart'; import 'link_widget_buttons.dart'; import 'widget_detail_bar.dart'; import 'widget_detail_panel.dart'; -import 'widget_node_panel.dart'; // 用于组件详情不需要在一开始就加载 // WidgetDetailBloc 可以在稍后提供 @@ -22,18 +20,22 @@ class DeskWidgetDetailPageScope extends StatefulWidget { final WidgetModel? model; final String? widgetName; - const DeskWidgetDetailPageScope({super.key, required this.model, this.widgetName}); + const DeskWidgetDetailPageScope( + {super.key, required this.model, this.widgetName}); @override - State createState() => _DeskWidgetDetailPageScopeState(); + State createState() => + _DeskWidgetDetailPageScopeState(); } class _DeskWidgetDetailPageScopeState extends State { WidgetModel? _model; - WidgetRepository get widgetRepository => context.read().repository; + WidgetRepository get widgetRepository => + context.read().repository; - NodeRepository get nodeRepository => kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); + NodeRepository get nodeRepository => + kIsWeb ? MemoryNodeRepository() : const NodeDbRepository(); @override void initState() { @@ -51,12 +53,13 @@ class _DeskWidgetDetailPageScopeState extends State { @override Widget build(BuildContext context) { - if (_model == null) return const Center(child: CupertinoActivityIndicator()); + if (_model == null) + return const Center(child: CupertinoActivityIndicator()); return BlocProvider( create: (_) => WidgetDetailBloc( - widgetRepository: widgetRepository, - nodeRepository: nodeRepository, + widgetRepo: widgetRepository, + nodeRepo: nodeRepository, )..push(_model!), child: DeskWidgetDetailPage( model: widget.model, @@ -94,7 +97,8 @@ class DeskWidgetDetailPage extends StatelessWidget { ], ); - Widget _buildContent(BuildContext context, WidgetDetailBloc bloc, DetailState state) { + Widget _buildContent( + BuildContext context, WidgetDetailBloc bloc, DetailState state) { return WillPopScope( onWillPop: () => _whenPop(context), child: CustomScrollView( @@ -117,7 +121,8 @@ class DeskWidgetDetailPage extends StatelessWidget { const SizedBox(height: 16), linkText(context), if (state is DetailWithData) - LinkWidgetButtons(links: state.links, onSelect: bloc.push) + LinkWidgetButtons( + links: state.links, onSelect: bloc.push) ], )) ], @@ -127,7 +132,10 @@ class DeskWidgetDetailPage extends StatelessWidget { ), ), if (state is DetailWithData) - _buildSliverNodeList(context, state.nodes, state.widgetModel) + SliverNodeList( + nodes: state.nodes, + model: state.widgetModel, + ) ], )); } @@ -140,21 +148,4 @@ class DeskWidgetDetailPage extends StatelessWidget { return detailBloc.pop(); } - Widget _buildSliverNodeList(BuildContext context, List nodes, WidgetModel model) { - AppConfig globalState = BlocProvider.of(context).state; - - return SliverList( - delegate: SliverChildBuilderDelegate( - (_, i) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 24.0), - child: NodeDisplay( - node: nodes[i], - nodeIndex: i, - style: globalState.codeStyle, - widget: model, - ), - ), - childCount: nodes.length, - )); - } } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index e53b7f53..44dbc632 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:toly_ui/toly_ui.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + class DeskWidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index 07bebd6f..0af02889 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -4,10 +4,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/l10n.dart'; -import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/zone.dart'; - +import 'package:widget_repository/widget_repository.dart'; class DeskSearchBar extends StatefulWidget { final ValueChanged? onChanged; @@ -143,7 +141,7 @@ class _DeskSearchBarState extends State { Color? textColor = Theme.of(context).listTileTheme.textColor; List span = []; - RegExp regExp = RegExp(pattern, caseSensitive: false); + RegExp regExp = RegExp(RegExp.escape(pattern), caseSensitive: false); src.splitMapJoin(regExp, onMatch: (Match match) { span.add(TextSpan(text: match.group(0), style: lightTextStyle)); return ''; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index edd97098..25448ebb 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -4,8 +4,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/views/components/collected_tag.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../../data/zone.dart'; import 'package:wrapper/wrapper.dart'; class DeskWidgetItem extends StatelessWidget { diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index 430b367d..fc5c5ebf 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -3,9 +3,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; -import 'package:storage/storage.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart index 15eb0047..70fd7c1f 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_detail.dart @@ -8,7 +8,8 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + /// create by 张风捷特烈 on 2020-04-22 diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart index 5147d815..570900f4 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_list_item.dart @@ -2,7 +2,9 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + + /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart index 03752395..555e9436 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/category_page.dart @@ -8,7 +8,9 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + + import 'category_list_item.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart index ff9d3609..0ee7740e 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/edit_category_panel.dart @@ -4,8 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; + -import '../../../data/zone.dart'; /// create by 张风捷特烈 on 2020-04-23 diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart index c7015d85..be108c61 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/like_widget_page.dart @@ -3,8 +3,7 @@ import 'package:components/project_ui/project_ui.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/blocs/blocs.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart index 3b64bb4f..be83c4ad 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/async_button.dart @@ -10,7 +10,8 @@ import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:storage/storage.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + import 'package:toly_ui/toly_ui.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index 77c4630c..caab512d 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -10,7 +10,8 @@ import 'category_api.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:toly_ui/toly_ui.dart'; -import '../../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart index e00781a7..1de3cf28 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/app_search_bar.dart @@ -3,10 +3,9 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; class AppSearchBar extends StatefulWidget { diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 41a05236..3e91374f 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -1,11 +1,9 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; - class StandardSearchBarInner extends StatelessWidget implements PreferredSizeWidget { const StandardSearchBarInner({Key? key}) : super(key: key); diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart index 013ec39f..e3f58222 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; import '../widget_page/widget_model_item.dart'; import 'standard_search_bar.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart index 60c5441b..c14f6b83 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/category_end_drawer.dart @@ -6,11 +6,9 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:widget_module/blocs/blocs.dart'; - -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; import '../widget_page/unit_drawer_header.dart'; - /// create by 张风捷特烈 on 2020-04-22 /// contact me by email 1981462002@qq.com /// 说明: @@ -26,24 +24,24 @@ class CategoryEndDrawer extends StatelessWidget { child: ListView(padding: EdgeInsets.zero, children: [ UnitDrawerHeader(color: Theme.of(context).primaryColor), Padding( - padding: const EdgeInsets.all(10.0), - child: Row( - children: [ - Circle( - color: widget.color, + padding: const EdgeInsets.all(10.0), + child: Row( + children: [ + Circle( + color: widget.color, + ), + const SizedBox( + width: 10, + ), + Text(widget.name) + ], ), - const SizedBox( - width: 10, - ), - Text(widget.name) - ], - ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 15.0), - child: Panel( - child: Text(widget.info, style: UnitTextStyle.shadowTextStyle), - ), + padding: const EdgeInsets.symmetric(horizontal: 15.0), + child: Panel( + child: Text(widget.info, style: UnitTextStyle.shadowTextStyle), + ), ), const Divider(), _buildTitle(context), @@ -133,7 +131,8 @@ class _CategoryInfoState extends State { onSelected: (v) async { await repository.toggleCategory(category.id!, widget.id); _loadCategoryIds(); - BlocProvider.of(context).add(EventLoadCategoryWidget(category.id!)); + BlocProvider.of(context) + .add(EventLoadCategoryWidget(category.id!)); }); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart index 2e70491b..75e0bff0 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/collect_widget_list_item.dart @@ -3,8 +3,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:toly_ui/toly_ui.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../data/zone.dart'; class CollectWidgetListItem extends StatelessWidget { final WidgetModel data; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart index 6de9f4c3..14d4263b 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart @@ -1,91 +1,62 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:toly_ui/toly_ui.dart'; -import 'package:tolyui/tolyui.dart'; -import 'package:widget_module/data/model/model.dart'; +import 'package:app/app.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_repository/widget_repository.dart'; import 'package:widget_module/views/mobile/widget_detail/node_display/code_display.dart'; -import 'package:widgets/widgets.dart'; import 'node_title.dart'; +typedef NodeWidgetMapper = Widget Function(NodeModel model); + class NodeDisplay extends StatelessWidget { final NodeModel node; - final int nodeIndex; - final WidgetModel widget; - final HighlighterStyle style; + final NodeWidgetMapper mapper; + final bool isDeath; const NodeDisplay({ super.key, required this.node, - required this.nodeIndex, - required this.style, - required this.widget, + required this.isDeath, + required this.mapper, }); @override Widget build(BuildContext context) { Color primaryColor = Theme.of(context).primaryColor; + var style = context.select((AppConfigBloc bloc) => bloc.state.codeStyle); + + bool isDesk = + kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; + EdgeInsets pd = isDesk + ? const EdgeInsets.symmetric(horizontal: 24, vertical: 8) + : const EdgeInsets.all(8.0); return Padding( - padding: const EdgeInsets.all(8.0), + padding: pd, child: Column( children: [ - NodeTitle( - text: node.name, - ), + NodeTitle(text: node.name), const SizedBox(height: 10), - CodeDisplay(display: mapNode(node), code: node.code, style: style), - if(!widget.death) - _buildNodeInfo(primaryColor), + CodeDisplay(display: mapper(node), code: node.code, style: style), + if (!isDeath) _buildNodeInfo(primaryColor), ], ), ); } - Widget _buildNodeInfo(Color primaryColor) => Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: SizedBox( - width: double.infinity, - child: Panel( - color: primaryColor.withOpacity(0.04), - child: Text( - node.subtitle, - style: const TextStyle(fontSize: 12), - )), - ), - ); - Widget mapNode(NodeModel node){ - NodeType type = node.type(widget.name); - Widget display = WidgetsMap.map(widget.name)[nodeIndex]; - return switch(type){ - NodeType.display => display, - NodeType.newPage => newPageDisplay(display), - NodeType.description => display, - NodeType.deprecated => display, - }; - } - - Widget newPageDisplay(Widget page){ - return Builder( - builder:(ctx) => ElevatedButton( - onPressed: () { - Navigator.of(ctx).push(MaterialPageRoute(builder: (_)=>page)); - }, - child: Wrap( - spacing: 6, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(Icons.open_in_new,size: 16,), - Text('新界面打开'), - ],), - style: FillButtonPalette( - foregroundPalette: Palette.all(Colors.white), - borderRadius: BorderRadius.circular(6), - backgroundPalette: const Palette( - normal: Color(0xff1890ff), - hover: Color(0xff40a9ff), - pressed: Color(0xff096dd9), - ), - ).style, - ), - ); - } + Widget _buildNodeInfo(Color primaryColor) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: SizedBox( + width: double.infinity, + child: Panel( + color: primaryColor.withOpacity(0.04), + child: Text( + node.subtitle, + style: const TextStyle(fontSize: 12), + )), + ), + ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart index 83601239..2af9060c 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_bar.dart @@ -7,8 +7,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../data/zone.dart'; class SliverWidgetDetailBar extends StatelessWidget { final WidgetModel model; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 5c372882..5009ef3c 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -5,18 +5,17 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../data/zone.dart'; import '../../desk_ui/widget_detail/link_widget_buttons.dart'; import 'node_display/node_display.dart'; -import 'widget_node_panel.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widgets/widgets.dart'; - import 'category_end_drawer.dart'; import 'widget_detail_bar.dart'; import 'widget_detail_panel.dart'; +import 'package:widgets/widgets.dart'; +import 'package:tolyui/tolyui.dart'; // 用于组件详情不需要在一开始就加载 // WidgetDetailBloc 可以在稍后提供 @@ -33,12 +32,10 @@ class WidgetDetailPageScope extends StatelessWidget { return BlocProvider( create: (_) => WidgetDetailBloc( - widgetRepository: widgetRepository, - nodeRepository: nodeRepository, + widgetRepo: widgetRepository, + nodeRepo: nodeRepository, )..push(model), - child: WidgetDetailPage( - model: model, - ), + child: WidgetDetailPage(model: model), ); } } @@ -46,7 +43,7 @@ class WidgetDetailPageScope extends StatelessWidget { class WidgetDetailPage extends StatelessWidget { final WidgetModel model; - const WidgetDetailPage({Key? key, required this.model}) : super(key: key); + const WidgetDetailPage({super.key, required this.model}); @override Widget build(BuildContext context) { @@ -74,25 +71,8 @@ class WidgetDetailPage extends StatelessWidget { DetailState state = bloc.state; return PopScope( canPop: false, - onPopInvokedWithResult: (bool didPop, dynamic result) { - if (didPop) { - return; - } - WidgetDetailBloc detailBloc = context.read(); - // 检查抽屉是否打开 - if (Scaffold.of(context).isEndDrawerOpen) { - if (context.mounted) { - Navigator.of(context).pop(); - } - return; - } - // 调用原来的 pop 逻辑 - detailBloc.pop().then((bool canPop) { - if (canPop && context.mounted) { - Navigator.of(context).pop(); - } - }); - }, + onPopInvokedWithResult: (didPop, result) => + _onPop(context, didPop, result), child: CustomScrollView( slivers: [ SliverWidgetDetailBar(model: bloc.currentWidget), @@ -103,42 +83,97 @@ class WidgetDetailPage extends StatelessWidget { WidgetDetailPanel(model: bloc.currentWidget), linkText(context), if (state is DetailWithData) - LinkWidgetButtons( - links: state.links, - onSelect: bloc.push, - ), - // const Divider(), + LinkWidgetButtons(links: state.links, onSelect: bloc.push), ], ), ), if (state is DetailWithData) - _buildSliverNodeList(context, state.nodes, state.widgetModel) + SliverNodeList( + nodes: state.nodes, + model: state.widgetModel, + ), ], )); } - // Future _whenPop(BuildContext context) async { - // // print("======_whenPop============"); - // WidgetDetailBloc detailBloc = context.read(); - // if (Scaffold.of(context).isEndDrawerOpen) { - // return true; - // } - // return detailBloc.pop(); - // } + void _onPop(BuildContext context, bool didPop, dynamic result) { + if (didPop) { + return; + } + WidgetDetailBloc detailBloc = context.read(); + // 检查抽屉是否打开 + if (Scaffold.of(context).isEndDrawerOpen) { + if (context.mounted) { + Navigator.of(context).pop(); + } + return; + } + // 调用原来的 pop 逻辑 + detailBloc.pop().then((bool canPop) { + if (canPop && context.mounted) { + Navigator.of(context).pop(); + } + }); + } +} +class SliverNodeList extends StatelessWidget { + final List nodes; + final WidgetModel model; - Widget _buildSliverNodeList( - BuildContext context, List nodes, WidgetModel model) { - AppConfig globalState = BlocProvider.of(context).state; + const SliverNodeList({super.key, required this.nodes, required this.model}); + + @override + Widget build(BuildContext context) { return SliverList( delegate: SliverChildBuilderDelegate( (_, i) => NodeDisplay( + mapper: _nodeMapper, node: nodes[i], - nodeIndex: i, - style: globalState.codeStyle, - widget: model, + isDeath: model.death, ), childCount: nodes.length, )); } + + Widget _nodeMapper(NodeModel node) { + NodeType type = node.type(model.name); + Widget display = mapNodeDisplay(model.id,node.priority); + return switch (type) { + NodeType.display => display, + NodeType.newPage => newPageDisplay(display), + NodeType.description => display, + NodeType.deprecated => display, + }; + } +} + +Widget newPageDisplay(Widget page) { + return Builder( + builder: (ctx) => ElevatedButton( + onPressed: () { + Navigator.of(ctx).push(MaterialPageRoute(builder: (_) => page)); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.open_in_new, + size: 16, + ), + Text('新界面打开'), + ], + ), + style: FillButtonPalette( + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart index 84b593af..96dc2abd 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_panel.dart @@ -1,8 +1,8 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../../../data/zone.dart'; class WidgetDetailPanel extends StatelessWidget { final WidgetModel model; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart index 18ea0980..a23c52c5 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/home_drawer.dart @@ -11,7 +11,7 @@ import 'unit_drawer_header.dart'; class HomeDrawer extends StatelessWidget { - const HomeDrawer({Key? key}):super(key: key); + const HomeDrawer({super.key}); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart index 846d2f79..728d6410 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart @@ -2,7 +2,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; + import 'widget_model_item.dart'; class PhoneWidgetContent extends StatelessWidget { diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index 42381fc2..dfed3a0a 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -1,12 +1,12 @@ import 'package:l10n/ext.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; -import '../../../data/zone.dart'; import 'home_drawer.dart'; import 'standard_home_search.dart'; import 'widget_page.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart index 0d557292..ebe738af 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/unit_drawer_header.dart @@ -2,13 +2,12 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-22 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: class UnitDrawerHeader extends StatelessWidget { final Color color; - - const UnitDrawerHeader({Key? key, required this.color}) : super(key: key); + const UnitDrawerHeader({super.key, required this.color}); @override Widget build(BuildContext context) { @@ -22,10 +21,10 @@ class UnitDrawerHeader extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Wrap( + const Wrap( spacing: 10, crossAxisAlignment: WrapCrossAlignment.center, - children: const [ + children: [ FlutterLogo( size: 35, ), @@ -33,39 +32,29 @@ class UnitDrawerHeader extends StatelessWidget { 'Flutter Unit', style: TextStyle(fontSize: 24, color: Colors.white, shadows: [ Shadow( - color: Colors.black, - offset: Offset(1, 1), - blurRadius: 3) + color: Colors.black, offset: Offset(1, 1), blurRadius: 3) ]), ), ], ), - const SizedBox( - height: 15, - ), + const SizedBox(height: 15), Text( 'The Unity Of Flutter, The Unity Of Coder.', style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) ]), ), - const SizedBox( - height: 5, - ), + const SizedBox(height: 5), Text( 'Flutter的联合,编程者的联合。', style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ Shadow(color: color, offset: const Offset(.5, .5), blurRadius: 1) ]), ), - const SizedBox( - height: 10, - ), - Row( - children: const [ - Spacer( - flex: 5, - ), + const SizedBox(height: 10), + const Row( + children: [ + Spacer(flex: 5), Text( '—— 张风捷特烈', style: TextStyle(fontSize: 15, color: Colors.white, shadows: [ @@ -75,9 +64,7 @@ class UnitDrawerHeader extends StatelessWidget { blurRadius: 1) ]), ), - Spacer( - flex: 1, - ), + Spacer(flex: 1), ], ), ], diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart index c040a994..d6b370e2 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart @@ -6,7 +6,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:wrapper/wrapper.dart'; -import '../../../data/zone.dart'; +import 'package:widget_repository/widget_repository.dart'; import '../../components/collected_tag.dart'; class StandardWidgetItem extends StatelessWidget { diff --git a/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart index d4b98bbe..f3aa6314 100644 --- a/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart +++ b/modules/widget_system/widget_module/lib/views/widgets_bloc_provider.dart @@ -3,7 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../blocs/blocs.dart'; -import '../widget_module.dart'; +import 'package:widget_repository/widget_repository.dart'; + class WidgetsBlocProvider extends StatefulWidget { final Widget child; diff --git a/modules/widget_system/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart index 2b7b2295..6b58ec71 100644 --- a/modules/widget_system/widget_module/lib/widget_module.dart +++ b/modules/widget_system/widget_module/lib/widget_module.dart @@ -2,7 +2,13 @@ library widget_module; export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; -export 'data/zone.dart'; export 'views/widgets_bloc_provider.dart'; - -export 'package:storage/storage.dart' show WidgetFilter,WidgetFamily; \ No newline at end of file +export 'package:widget_repository/widget_repository.dart' + show + WidgetFilter, + WidgetFamily, + CategoryModel, + WidgetModel, + CategoryRepository, + CategoryTo, + LikeDao,WidgetDao,NodeDao,CategoryDao; diff --git a/modules/widget_system/widget_module/pubspec.yaml b/modules/widget_system/widget_module/pubspec.yaml index d85bb913..63ee4db3 100644 --- a/modules/widget_system/widget_module/pubspec.yaml +++ b/modules/widget_system/widget_module/pubspec.yaml @@ -11,7 +11,8 @@ resolution: workspace dependencies: flutter: sdk: flutter - + widget_repository: + path: ../widget_repository # For information on the generic Dart part of this file, see the diff --git a/modules/widget_system/widget_repository/.gitignore b/modules/widget_system/widget_repository/.gitignore new file mode 100644 index 00000000..ac5aa989 --- /dev/null +++ b/modules/widget_system/widget_repository/.gitignore @@ -0,0 +1,29 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/modules/widget_system/widget_repository/.metadata b/modules/widget_system/widget_repository/.metadata new file mode 100644 index 00000000..24472f12 --- /dev/null +++ b/modules/widget_system/widget_repository/.metadata @@ -0,0 +1,10 @@ +# 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: "2663184aa79047d0a33a14a3b607954f8fdd8730" + channel: "stable" + +project_type: package diff --git a/modules/widget_system/widget_repository/CHANGELOG.md b/modules/widget_system/widget_repository/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/widget_system/widget_repository/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/widget_system/widget_repository/LICENSE b/modules/widget_system/widget_repository/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/widget_system/widget_repository/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/widget_system/widget_repository/README.md b/modules/widget_system/widget_repository/README.md new file mode 100644 index 00000000..4a260d8d --- /dev/null +++ b/modules/widget_system/widget_repository/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/modules/widget_system/widget_repository/analysis_options.yaml b/modules/widget_system/widget_repository/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/widget_system/widget_repository/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart new file mode 100644 index 00000000..451e24c7 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart @@ -0,0 +1,204 @@ + +import 'package:fx_dao/fx_dao.dart'; + +import '../../../widget_repository.dart'; + + + +//""" +// CREATE TABLE IF NOT EXISTS category_widget( +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// name VARCHAR(64) NOT NULL, +// color VARCHAR(9) DEFAULT '#FF2196F3', +// info VARCHAR(256) DEFAULT '这里什么都没有...', +// created DATETIME NOT NULL, +// updated DATETIME NOT NULL, +// priority INTEGER DEFAULT 0, +// image VARCHAR(128) NULL image DEFAULT '' +// ); +//"""; + +class CategoryDao with HasDatabase, DbTable{ + @override + String get createSql => ''; + + @override + String get name => 'category'; + + + + Future insert(CategoryPo category) async { + //插入方法 + String addSql = //插入数据 + "INSERT INTO " + "category(id,name,color,info,priority,image,created,updated) " + "VALUES (?,?,?,?,?,?,?,?);"; + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ + category.id, + category.name, + category.color, + category.info, + category.priority, + category.image, + category.created?.toIso8601String(), + category.updated.toIso8601String(), + ])); + } + + Future update(CategoryPo widget) async { + //插入方法 + String updateSql = //插入数据 + "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " + "WHERE id = ?"; + + return await database.transaction((tran) async => + await tran.rawUpdate(updateSql, [ + widget.name, + widget.color, + widget.info, + widget.priority, + widget.image, + widget.updated.toIso8601String(), + widget.id, + ])); + } + + + + Future addWidget(int categoryId,int widgetId,) async { + String addSql = //插入数据 + "INSERT INTO " + "category_widget(widgetId,categoryId) " + "VALUES (?,?);"; + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ + widgetId, + categoryId, + ])); + } + + Future addWidgets(int categoryId,List widgetIds) async { + String addSql = //插入数据 + "INSERT INTO " + "category_widget(widgetId,categoryId) VALUES "; + + String args = ''; + + for(int i=0;i< widgetIds.length;i++){ + args+= "(${widgetIds[i]},$categoryId)"; + if(i==widgetIds.length-1){ + args+=";"; + }else{ + args+=","; + } + } + addSql += args; + return await database.transaction((tran) async => await tran.rawInsert(addSql)); + } + + Future existByName(String name) async { + String sql = //插入数据 + "SELECT COUNT(name) as count FROM category " + "WHERE name = ?"; + List> rawData = await database.rawQuery(sql, [name]); + if (rawData.isNotEmpty) { + return rawData[0]['count'] > 0; + } + return false; + } + + Future>> queryAll() async { + List> data = await database.rawQuery( + "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" + "FROM category AS c " + "LEFT JOIN category_widget AS cw " + "ON c.id = cw.categoryId GROUP BY c.id " + "ORDER BY priority DESC,created DESC", + []); + return data; + } + + Future> categoryWidgetIds(int id) async { + List> data = await database.rawQuery( + "SELECT categoryId FROM `category_widget`" + "WHERE widgetId = ?", + [id]); + return data.toList().map((e)=>e["categoryId"]).toList(); + } + + + + Future deleteCollect(int id) async { + await database.execute( + "DELETE FROM category_widget " + "WHERE categoryId = ?", + [id]); + return await database.execute( + "DELETE FROM category " + "WHERE id = ?", + [id]); + } + + Future clear() async { + await database.execute( + "DELETE FROM category_widget " + "WHERE categoryId >0"); + return await database.execute( + "DELETE FROM category " + "WHERE id > 0"); + } + + Future removeWidget(int categoryId, int widgetId) async { + //插入方法 + String deleteSql = //插入数据 + "DELETE FROM " + "category_widget WHERE categoryId = ? AND widgetId = ? "; + return await database + .transaction((tran) async => await tran.rawInsert(deleteSql, [ + categoryId, + widgetId, + ])); + } + + Future existWidgetInCollect(int categoryId, int widgetId) async { + String sql = //插入数据 + "SELECT COUNT(id) as count FROM category_widget " + "WHERE categoryId = ? AND widgetId = ?"; + List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); + if (rawData.isNotEmpty) { + return rawData[0]['count'] > 0; + } + return false; + } + + Future toggleCollect(int categoryId, int widgetId) async { + if (await existWidgetInCollect(categoryId, widgetId)) { + //已存在: 移除 + await removeWidget(categoryId, widgetId); + } else { + await addWidget(categoryId, widgetId); + } + } + + Future toggleCollectDefault(int widgetId) async { + await toggleCollect(1, widgetId); + } + + Future>> loadCollectWidgets(int categoryId) async{ + String querySql = //插入数据 + "SELECT * FROM widget " + "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " + "ORDER BY lever DESC"; + + return await database.rawQuery(querySql,[categoryId]); + } + + Future> loadCollectWidgetIds(int categoryId) async{ + String querySql = //插入数据 + "SELECT id FROM widget " + "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " + "ORDER BY lever DESC"; + + var data = await database.rawQuery(querySql,[categoryId]); + return data.map((e) => e["id"] as int).toList(); + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart new file mode 100644 index 00000000..92ca842c --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart @@ -0,0 +1,69 @@ +import 'package:fx_dao/fx_dao.dart'; +import 'package:sqflite/sqflite.dart'; + +class LikeDao with HasDatabase, DbTable{ + @override + String get createSql => ''; + + @override + String get name => 'like_widget'; + + Future> likeWidgetIds() async { + var result = await database.rawQuery("SELECT widget_id FROM like_widget"); + var ids = result.map((e) => e['widget_id'] as int).toList(); + return ids; + } + + // 如果已喜欢,取消喜欢 + // 如果未喜欢,设为喜欢 + Future toggleCollect(int widgetId) async { + bool liked = await isLiked(widgetId); + + if (liked) { + await unlike(widgetId, check: false); + } else { + await like(widgetId, check: false); + } + } + + Future like(int widgetId, {bool check = true}) async { + if (check) { + // 如果 liked_widget_bloc ,直接取消,不执行 liked_widget_bloc 操作 + bool liked = await isLiked(widgetId); + if (liked) return 0; + } + + return await database.rawInsert( + "INSERT INTO " + "like_widget(widget_id) " + "VALUES (?);", + [widgetId]); + } + + Future unlike(int widgetId, {bool check = true}) async { + if (check) { + // 如果未 liked_widget_bloc ,直接取消,不执行 unlike 操作 + bool liked = await isLiked(widgetId); + if (!liked) return; + } + await database.execute( + "DELETE FROM like_widget " + "WHERE widget_id = ?", + [widgetId]); + } + + // 判断组件是否已 liked + Future isLiked(int widgetId) async { + var data = await database.rawQuery( + "Select count(id) as `count` FROM like_widget " + "WHERE widget_id = ?", + [widgetId]); + if (data.isNotEmpty) { + var result = data[0]; + return result['count'] as int > 0; + } + return false; + } + + +} diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart new file mode 100644 index 00000000..a8f6c2e8 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -0,0 +1,41 @@ +import 'package:fx_dao/fx_dao.dart'; + +import '../po/node_po.dart'; + + +class NodeDao with HasDatabase, DbTable { + + @override + String get createSql => ''; + + @override + String get name => 'node'; + + Future insert(NodePo widget) async { + //插入方法 + String addSql = //插入数据 + "INSERT INTO " + "node(widgetId,name,priority,subtitle,code) " + "VALUES (?,?,?,?,?);"; + return await database.transaction((tran) async => await tran.rawInsert(addSql, [ + widget.widgetId, + widget.name, + widget.priority, + widget.subtitle, + widget.code + ])); + } + + Future>> queryAll() async { + return await database.rawQuery("SELECT * FROM node"); + } + + //根据 id 查询组件 node + Future>> queryById(int id) async { + return await database.rawQuery( + "SELECT name,subtitle,code,priority " + "FROM node " + "WHERE widgetId = ? ORDER BY priority", + [id]); + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart new file mode 100644 index 00000000..4b6ca183 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -0,0 +1,103 @@ +import 'package:fx_dao/fx_dao.dart'; +import '../../model/widget_filter.dart'; +import '../po/widget_po.dart'; + +class WidgetDao with HasDatabase, DbTable { + @override + String get createSql => ''; + + @override + String get name => 'widget'; + + Future insert(WidgetPo widget) async { + //插入方法 + String addSql = //插入数据 + "INSERT INTO " + "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " + "VALUES (?,?,?,?,?,?,?,?);"; + return database.transaction((tran) async => await tran.rawInsert(addSql, [ + widget.id, + widget.name, + widget.nameCN, + widget.deprecated, + widget.family, + widget.lever, + widget.linkWidget, + widget.info + ])); + } + + Future>> queryAll() async { + return database.rawQuery("SELECT * FROM widget"); + } + + Future>> queryByFamily(WidgetFamily family) async { + return database.rawQuery( + "SELECT * " + "FROM widget WHERE family = ? ORDER BY lever DESC", + [family.index]); + } + + Future>> queryByIds(List ids) async { + if (ids.isEmpty) { + return []; + } + String sql = "SELECT * " + "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; + + return database.rawQuery(sql, [...ids]); + } + + Future>> search(WidgetFilter arguments) async { + // 保证 name 参数为空时,不进行搜索 + if (arguments.name.isEmpty) { + return []; + } + + // * 表示 name 任意 + String name = arguments.name == '*' ? '' : arguments.name; + bool hasFamily = arguments.family != null; + String familySql = hasFamily ? ' AND family = ?' : ''; + List familyArg = hasFamily ? [arguments.family!.index] : []; + List starArg = arguments.stars; + // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 + if (arguments.stars.reduce((a, b) => a + b) == -5) { + starArg = [1, 2, 3, 4, 5]; + } + return database.rawQuery( + "SELECT * " + "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", + [ + "%$name%", + "%$name%", + "%$name%", + ...familyArg, + ...starArg, + arguments.pageSize, + arguments.offset + ]); + } + + Future total(WidgetFilter args) async { + bool hasFamily = args.family != null; + String familySql = hasFamily ? 'family = ?' : ''; + List familyArg = hasFamily ? [args.family!.index] : []; + + String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; + + List> result = await database.rawQuery(sql, familyArg); + if (result.isNotEmpty) { + return result.first['count'] as int ?? 0; + } + return 0; + } + + Future?> queryWidgetByName(String name) async { + String sql = "SELECT * FROM widget WHERE name = ?"; + List> result = await database.rawQuery(sql, [name]); + if (result.isNotEmpty) { + return result.first; + } + return null; + } +} diff --git a/modules/widget_system/widget_repository/lib/src/database/database.dart b/modules/widget_system/widget_repository/lib/src/database/database.dart new file mode 100644 index 00000000..03fed7c2 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/database.dart @@ -0,0 +1,12 @@ +export 'po/category_po.dart'; +export 'po/node_po.dart'; +export 'po/widget_po.dart'; + +export 'dao/like_dao.dart'; +export 'dao/node_dao.dart'; +export 'dao/widget_dao.dart'; +export 'dao/category_dao.dart'; + +export 'db_impl/category_db_repository.dart'; +export 'db_impl/node_db_repository.dart'; +export 'db_impl/widget_db_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/db_impl/catagory_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart similarity index 95% rename from modules/widget_system/widget_module/lib/data/db_impl/catagory_db_repository.dart rename to modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart index 8c7b121f..fc5b8755 100644 --- a/modules/widget_system/widget_module/lib/data/db_impl/catagory_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'dart:convert'; import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../zone.dart'; - - +import '../../repository/category_repository.dart'; +import '../dao/category_dao.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart similarity index 85% rename from modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart rename to modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart index 05c5d02e..7eb091b6 100644 --- a/modules/widget_system/widget_module/lib/data/db_impl/node_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart @@ -1,9 +1,6 @@ import 'package:storage/storage.dart'; - - -import '../model/node_model.dart'; -import '../node_repository.dart'; +import 'package:widget_repository/widget_repository.dart'; class NodeDbRepository implements NodeRepository{ diff --git a/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart similarity index 92% rename from modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart rename to modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart index 36fbe564..f38b22db 100644 --- a/modules/widget_system/widget_module/lib/data/db_impl/widget_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart @@ -1,6 +1,9 @@ import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../../model/widget_filter.dart'; +import '../../repository/widget_repository.dart'; -import '../zone.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart new file mode 100644 index 00000000..6046d5d8 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart @@ -0,0 +1,86 @@ +/// create by 张风捷特烈 on 2020-04-17 +/// contact me by email 1981462002@qq.com +/// 说明: 收藏夹数据库-数据模型 + +// """ +// CREATE TABLE IF NOT EXISTS category( +// id INTEGER PRIMARY KEY AUTOINCREMENT, +// name VARCHAR(64) NOT NULL, +// color VARCHAR(9) DEFAULT '#FF2196F3', +// info VARCHAR(256) DEFAULT '这里什么都没有...', +// created DATETIME NOT NULL, +// updated DATETIME NOT NULL, +// priority INTEGER DEFAULT 0, +// image VARCHAR(128) NULL image DEFAULT '' +// );"""; //建表语句 + +class CategoryPo { + final int? id; + final String name; + final String color; + final String info; + final DateTime? created; + final DateTime updated; + final String image; + final int count; + final int priority; + + const CategoryPo({ + this.id, + required this.name, + this.color = '#FFF2F2F2', + this.created, + required this.updated, + this.count = 0, + this.priority = 0, + this.info = '这里什么都没有...', + this.image = '', + }); + + factory CategoryPo.fromJson(Map map) { + return CategoryPo( + id: map['id'], + name: map['name'], + color: map["color"], + created: DateTime.parse(map["created"]), + image: map["image"], + priority: map["priority"], + count: map["count"], + updated: DateTime.parse(map["updated"]), + info: map["info"]); + } + + factory CategoryPo.fromNetJson(Map map) { + return CategoryPo( + id: map['id'], + name: map['name'], + color: map["color"], + created: DateTime.fromMillisecondsSinceEpoch(map["created"]), + image: map["image"], + priority: map["priority"], + count: map["count"], + updated: DateTime.fromMillisecondsSinceEpoch(map["updated"]), + info: map["info"]); + } + + Map toJson() => { + "id": id, + "name": name, + "info": info, + "created": created?.millisecondsSinceEpoch, + "updated": updated.millisecondsSinceEpoch, + "image": image, + "count": count, + "color": color, + "priority": priority, + }; + + @override + String toString() { + return 'CategoryPo{id: $id, name: $name, color: $color, info: $info, created: $created, updated: $updated, image: $image, count: $count, priority: $priority}'; + } + + @override + List get props => + [id, name, color, created, image, info, updated, priority,count]; +} diff --git a/modules/widget_system/widget_repository/lib/src/database/po/node_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/node_po.dart new file mode 100644 index 00000000..f5198a1b --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/po/node_po.dart @@ -0,0 +1,38 @@ + +/// create by 张风捷特烈 on 2020-03-04 +/// contact me by email 1981462002@qq.com +/// 说明: 详情页节点-数据库-数据模型 +/// +class NodePo { + final int id; + final int widgetId; + final String name; + final int priority; + final String subtitle; + final String code; + + const NodePo({ + required this.id, + required this.widgetId, + required this.name, + required this.priority, + required this.subtitle, + required this.code, + }); + + factory NodePo.fromJson(Map map) { + return NodePo( + id: map['id']??0, + name: map['name'], + widgetId: map["widgetId"], + priority: map["priority"], + subtitle: map["subtitle"], + code: map["code"]); + } + + @override + String toString() { + return 'NodePo{id: $id, widgetId: $widgetId, name: $name, priority: $priority, subtitle: $subtitle, code: $code}'; + } + +} diff --git a/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart new file mode 100644 index 00000000..752a0a36 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart @@ -0,0 +1,73 @@ + +/// create by 张风捷特烈 on 2020-03-04 +/// contact me by email 1981462002@qq.com +/// 说明: 组件信息-数据库-数据模型 + +class WidgetPo { + final int id; + final String name; + final String nameCN; + final int deprecated; + final int family; + final double lever; + final String info; + final String linkWidget; + + const WidgetPo({ + required this.id, + required this.name, + required this.nameCN, + required this.deprecated, + required this.family, + required this.lever, + required this.linkWidget, + required this.info, + }); + + factory WidgetPo.fromJson(Map map) { + return WidgetPo( + id: map['id'], + name: map['name'], + nameCN: map["nameCN"], + family: map["family"], + deprecated: map["deprecated"] ?? 0, + lever: map["lever"].toDouble(), + linkWidget: map["linkWidget"], + info: map["info"]); + } + + factory WidgetPo.fromDesc(Map map) { + return WidgetPo( + id: map['id'], + name: map['name'], + nameCN: map["localName"], + family: map["family"], + lever: map["lever"].toDouble(), + linkWidget: map["linkIds"].join(','), + deprecated: map["deprecated"] ?? 0, + info: map["info"]); + } + + Map toJson() { + return { + "id": id, + "name": name, + "nameCN": nameCN, + "family": family, + "deprecated": deprecated, + "lever": lever, + "linkWidget": linkWidget, + "info": info + }; + } + + @override + String toString() { + return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, deprecated: $deprecated, family: $family, lever: $lever, info: $info}'; + } + + @override + List get props => + [id, name, nameCN, deprecated, family, linkWidget, lever, info]; +} + diff --git a/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart similarity index 74% rename from modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart rename to modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart index 1d62b249..d1889760 100644 --- a/modules/widget_system/widget_module/lib/data/memory_impl/memory_node_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart @@ -1,9 +1,8 @@ import 'dart:convert'; import 'package:flutter/services.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; -import '../model/node_model.dart'; -import '../node_repository.dart'; +import '../repository/node_repository.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com @@ -12,7 +11,6 @@ import '../node_repository.dart'; class MemoryNodeRepository implements NodeRepository { List? _nodeCache; - MemoryNodeRepository(); Future initData() async { @@ -30,7 +28,12 @@ class MemoryNodeRepository implements NodeRepository { await initData(); return _nodeCache! .where((element) => element.widgetId == widgetId) - .map((e) => NodeModel(name: e.name, subtitle: e.subtitle, code: e.code)) + .map((e) => NodeModel( + name: e.name, + subtitle: e.subtitle, + code: e.code, + priority: e.priority, + )) .toList(); } } diff --git a/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart similarity index 93% rename from modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart rename to modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart index 7fe86dd9..ed73883a 100644 --- a/modules/widget_system/widget_module/lib/data/memory_impl/memory_widget_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart @@ -1,9 +1,10 @@ import 'dart:convert'; import 'package:flutter/services.dart'; -import 'package:storage/storage.dart'; +import 'package:widget_repository/widget_repository.dart'; + +import '../model/widget_filter.dart'; +import '../repository/widget_repository.dart'; -import '../model/widget_model.dart'; -import '../widget_repository.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/data/model/category_model.dart b/modules/widget_system/widget_repository/lib/src/model/category_model.dart similarity index 91% rename from modules/widget_system/widget_module/lib/data/model/category_model.dart rename to modules/widget_system/widget_repository/lib/src/model/category_model.dart index 47ff5096..790267bb 100644 --- a/modules/widget_system/widget_module/lib/data/model/category_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/category_model.dart @@ -1,11 +1,15 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; - - import 'package:intl/intl.dart'; import 'package:utils/utils.dart'; -import 'package:storage/storage.dart'; +import '../database/po/category_po.dart'; + + +// import 'package:intl/intl.dart'; +// import 'package:utils/utils.dart'; +// +// import 'package:storage/storage.dart'; /// create by 张风捷特烈 on 2020-04-21 diff --git a/modules/widget_system/widget_repository/lib/src/model/model.dart b/modules/widget_system/widget_repository/lib/src/model/model.dart new file mode 100644 index 00000000..399e0f3c --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/model.dart @@ -0,0 +1,4 @@ +export 'node_model.dart'; +export 'widget_model.dart'; +export 'category_model.dart'; +export 'widget_filter.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/model/node_model.dart b/modules/widget_system/widget_repository/lib/src/model/node_model.dart similarity index 67% rename from modules/widget_system/widget_module/lib/data/model/node_model.dart rename to modules/widget_system/widget_repository/lib/src/model/node_model.dart index 9b330d12..78111d02 100644 --- a/modules/widget_system/widget_module/lib/data/model/node_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/node_model.dart @@ -5,40 +5,42 @@ import 'package:equatable/equatable.dart'; /// 说明: 详情页节点-展示-数据模型 /// -enum NodeType{ +enum NodeType { display, newPage, description, - deprecated + deprecated, } class NodeModel extends Equatable { final String name; final String subtitle; final String code; + final int priority; const NodeModel({ required this.name, required this.subtitle, required this.code, + required this.priority, }); @override - List get props => [name, subtitle, code]; + List get props => [name, subtitle, code, priority]; - - NodeType type(String widget){ - if(widget=='PinnedHeaderSliver'){ + NodeType type(String widget) { + if (widget == 'PinnedHeaderSliver') { return NodeType.newPage; } - return NodeType.display; } - factory NodeModel.fromJson(Map map) { return NodeModel( - name: map['name'], subtitle: map["subtitle"], code: map["code"]); + name: map['name'], + subtitle: map["subtitle"], + code: map["code"], + priority: map['priority']); } @override diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart new file mode 100644 index 00000000..999e0b66 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart @@ -0,0 +1,55 @@ +enum WidgetFamily { + statelessWidget, + statefulWidget, + singleChildRenderObjectWidget, + multiChildRenderObjectWidget, + sliver, + proxyWidget, + other, +} + + +class WidgetFilter { + final String name; + final WidgetFamily? family; + final List stars; + final int page; + final int pageSize; + + const WidgetFilter({ + this.name = '', + this.family, + this.stars = const [-1, -1, -1, -1, -1], + this.page = 1, + this.pageSize = 20, + }); + + int get offset =>pageSize*(page-1); + + WidgetFilter.family( + this.family, { + this.name = '*', + this.page = 1, + this.pageSize = 20, + this.stars = const [1, 2, 3, 4, 5], + }); + + WidgetFilter copyWith({ + String? name, + WidgetFamily? family, + List? stars, + int? page, + }) { + return WidgetFilter( + name: name ?? this.name, + family: family ?? this.family, + stars: stars ?? this.stars, + page: page ?? this.page, + ); + } + + @override + String toString() { + return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; + } +} diff --git a/modules/widget_system/widget_module/lib/data/model/widget_model.dart b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart similarity index 97% rename from modules/widget_system/widget_module/lib/data/model/widget_model.dart rename to modules/widget_system/widget_repository/lib/src/model/widget_model.dart index 20c02bd6..10c615af 100644 --- a/modules/widget_system/widget_module/lib/data/model/widget_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart @@ -1,6 +1,8 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; -import 'package:storage/storage.dart'; + +import '../../widget_repository.dart'; +import '../database/po/widget_po.dart'; /// create by 张风捷特烈 on 2020-03-04 diff --git a/modules/widget_system/widget_module/lib/data/category_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/category_repository.dart similarity index 93% rename from modules/widget_system/widget_module/lib/data/category_repository.dart rename to modules/widget_system/widget_repository/lib/src/repository/category_repository.dart index 71f01bd9..47329190 100644 --- a/modules/widget_system/widget_module/lib/data/category_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/category_repository.dart @@ -1,6 +1,6 @@ -import 'model/model.dart'; -import 'package:storage/storage.dart'; +import '../database/po/category_po.dart'; +import '../model/model.dart'; /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_module/lib/data/node_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart similarity index 75% rename from modules/widget_system/widget_module/lib/data/node_repository.dart rename to modules/widget_system/widget_repository/lib/src/repository/node_repository.dart index 21789988..7cd03f63 100644 --- a/modules/widget_system/widget_module/lib/data/node_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart @@ -1,5 +1,5 @@ -import 'model/model.dart'; +import '../model/model.dart'; abstract class NodeRepository{ diff --git a/modules/widget_system/widget_repository/lib/src/repository/repository.dart b/modules/widget_system/widget_repository/lib/src/repository/repository.dart new file mode 100644 index 00000000..2f73ddde --- /dev/null +++ b/modules/widget_system/widget_repository/lib/src/repository/repository.dart @@ -0,0 +1,3 @@ +export 'category_repository.dart'; +export 'node_repository.dart'; +export 'widget_repository.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/data/widget_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart similarity index 89% rename from modules/widget_system/widget_module/lib/data/widget_repository.dart rename to modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart index 78777724..e0fdbb04 100644 --- a/modules/widget_system/widget_module/lib/data/widget_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart @@ -1,6 +1,6 @@ -import 'package:storage/storage.dart'; -import 'model/model.dart'; +import '../model/model.dart'; +import '../model/widget_filter.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com diff --git a/modules/widget_system/widget_repository/lib/widget_repository.dart b/modules/widget_system/widget_repository/lib/widget_repository.dart new file mode 100644 index 00000000..c163d131 --- /dev/null +++ b/modules/widget_system/widget_repository/lib/widget_repository.dart @@ -0,0 +1,7 @@ +library widget_repository; + +export 'src/repository/repository.dart'; +export 'src/memory/memory_node_repository.dart'; +export 'src/memory/memory_widget_repository.dart'; +export 'src/model/model.dart'; +export 'src/database/database.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_repository/pubspec.yaml b/modules/widget_system/widget_repository/pubspec.yaml new file mode 100644 index 00000000..a4c89b3a --- /dev/null +++ b/modules/widget_system/widget_repository/pubspec.yaml @@ -0,0 +1,60 @@ +name: widget_repository +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.5.0 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + equatable: ^2.0.5 # 相等辅助 + intl: ^0.19.0 # 相等辅助 + fx_dao: 0.0.1+2 # 数据库 + storage: + path: ../../basic_system/storage + utils: + path: ../../basic_system/utils +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^4.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/to/font-from-package diff --git a/modules/widget_system/widget_repository/test/widget_repository_test.dart b/modules/widget_system/widget_repository/test/widget_repository_test.dart new file mode 100644 index 00000000..e69de29b diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart index 5007ad3d..b90694f2 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/node_01.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class ColumnNode1 extends StatelessWidget { - const ColumnNode1({Key? key}) : super(key: key); + const ColumnNode1({super.key}); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart index f263cc9c..06c2d13f 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_01.dart @@ -4,12 +4,12 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlexNode1 extends StatelessWidget { - FlexNode1({Key? key}) : super(key: key); + const FlexNode1({super.key}); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - final Widget blueBox = Container( + Widget get blueBox => Container( alignment: Alignment.center, color: Colors.blue, height: 20, @@ -17,7 +17,7 @@ class FlexNode1 extends StatelessWidget { child: Text('1', style: textStyle), ); - final Widget redBox = Container( + Widget get redBox => Container( alignment: Alignment.center, color: Colors.red, height: 30, @@ -25,7 +25,7 @@ class FlexNode1 extends StatelessWidget { child: Text('2', style: textStyle), ); - final Widget greenBox = Container( + Widget get greenBox => Container( alignment: Alignment.center, color: Colors.green, height: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart index 45991fdc..e5f0b0f0 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_02.dart @@ -4,12 +4,12 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlexNode2 extends StatelessWidget { - FlexNode2({Key? key}) : super(key: key); + const FlexNode2({super.key}); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - final Widget blueBox = Container( + Widget get blueBox => Container( alignment: Alignment.center, color: Colors.blue, height: 20, @@ -17,7 +17,7 @@ class FlexNode2 extends StatelessWidget { child: Text('1', style: textStyle), ); - final Widget redBox = Container( + Widget get redBox => Container( alignment: Alignment.center, color: Colors.red, height: 30, @@ -25,7 +25,7 @@ class FlexNode2 extends StatelessWidget { child: Text('2', style: textStyle), ); - final Widget greenBox = Container( + Widget get greenBox => Container( alignment: Alignment.center, color: Colors.green, height: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart index 20af4c52..417772e2 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_03.dart @@ -4,42 +4,33 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlexNode3 extends StatelessWidget { - FlexNode3({Key? key}) : super(key: key); + const FlexNode3({super.key}); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - final Widget blueBox = Container( + Widget get blueBox => Container( alignment: Alignment.center, color: Colors.blue, height: 20, width: 30, - child: Text( - '1', - style: textStyle - ), + child: Text('1', style: textStyle), ); - final Widget redBox = Container( + Widget get redBox => Container( alignment: Alignment.center, color: Colors.red, height: 30, width: 40, - child: Text( - '2', - style: textStyle - ), + child: Text('2', style: textStyle), ); - final Widget greenBox = Container( + Widget get greenBox => Container( alignment: Alignment.center, color: Colors.green, height: 20, width: 20, - child: Text( - '3', - style: textStyle - ), + child: Text('3', style: textStyle), ); diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart index 23adfb7e..154f280f 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_04.dart @@ -4,12 +4,12 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlexNode4 extends StatelessWidget { - FlexNode4({Key? key}) : super(key: key); + const FlexNode4({super.key}); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - final Widget blueBox = Container( + Widget get blueBox => Container( alignment: Alignment.center, color: Colors.blue, height: 20, @@ -17,7 +17,7 @@ class FlexNode4 extends StatelessWidget { child: Text('1', style: textStyle), ); - final Widget redBox = Container( + Widget get redBox => Container( alignment: Alignment.center, color: Colors.red, height: 30, @@ -25,7 +25,7 @@ class FlexNode4 extends StatelessWidget { child: Text('2', style: textStyle), ); - final Widget greenBox = Container( + Widget get greenBox => Container( alignment: Alignment.center, color: Colors.green, height: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart index e0a4e322..39e35fc9 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/node_05.dart @@ -4,12 +4,12 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlexNode5 extends StatelessWidget { - FlexNode5({Key? key}) : super(key: key); + const FlexNode5({super.key}); static TextStyle textStyle = const TextStyle(color: Colors.white, fontWeight: FontWeight.bold); - final Widget blueBox = Container( + Widget get blueBox => Container( alignment: Alignment.center, color: Colors.blue, height: 20, @@ -17,7 +17,7 @@ class FlexNode5 extends StatelessWidget { child: Text('1', style: textStyle), ); - final Widget redBox = Container( + Widget get redBox => Container( alignment: Alignment.center, color: Colors.red, height: 30, @@ -25,7 +25,7 @@ class FlexNode5 extends StatelessWidget { child: Text('2', style: textStyle), ); - final Widget greenBox = Container( + Widget get greenBox => Container( alignment: Alignment.center, color: Colors.green, height: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart index 27a83c1e..dca7b68e 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_01.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class FlowNode1 extends StatelessWidget { - FlowNode1({Key? key}) : super(key: key); + const FlowNode1({super.key}); - final List data = List.generate( + List get data => List.generate( 16, (index) => index.isEven ? "assets/images/icon_head.webp" diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart index f25aad49..4dc644f9 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/node_02.dart @@ -1,31 +1,14 @@ import 'dart:math'; import 'package:flutter/material.dart'; + /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com class FlowNode02 extends StatefulWidget { - static final data = List.generate( - 16, - (index) => index.isEven - ? "assets/images/icon_head.webp" - : "assets/images/wy_300x200.webp"); - static final show = Container( - width: 300, - height: 300, - alignment: Alignment.center, - child: FlowNode02( - children: data - .map((e) => CircleAvatar(backgroundImage: AssetImage(e))) - .toList(), - menu: const CircleAvatar( - backgroundImage: AssetImage('assets/images/icon_head.webp'), - ))); - - final List children; - final Widget menu; - - const FlowNode02({Key? key, required this.children, required this.menu}) : super(key: key); + const FlowNode02({ + super.key, + }); @override State createState() => _FlowNode02State(); @@ -37,6 +20,12 @@ class _FlowNode02State extends State double _rad = 0.0; bool _closed = true; + List get data => List.generate( + 16, + (index) => index.isEven + ? "assets/images/icon_head.webp" + : "assets/images/wy_300x200.webp"); + @override void initState() { _controller = AnimationController( @@ -64,13 +53,15 @@ class _FlowNode02State extends State return Flow( delegate: _BurstFlowDelegate(_rad), children: [ - ...widget.children, + ...data.map((e) => CircleAvatar(backgroundImage: AssetImage(e))), InkWell( onTap: () { _controller.reset(); _controller.forward(); }, - child: widget.menu) + child: const CircleAvatar( + backgroundImage: AssetImage('assets/images/icon_head.webp'), + )) ], ); } @@ -88,11 +79,13 @@ class _BurstFlowDelegate extends FlowDelegate { final double perRad = 2 * pi / count; for (int i = 0; i < count; i++) { Size size = context.getChildSize(i) ?? Size.zero; - final double offsetX = rad * (radius - size.width/2) * cos(i * perRad) + radius; - final double offsetY = rad * (radius - size.height/2) * sin(i * perRad) + radius; + final double offsetX = + rad * (radius - size.width / 2) * cos(i * perRad) + radius; + final double offsetY = + rad * (radius - size.height / 2) * sin(i * perRad) + radius; context.paintChild(i, transform: Matrix4.translationValues( - offsetX - size.width/2, offsetY - size.height/2, 0.0)); + offsetX - size.width / 2, offsetY - size.height / 2, 0.0)); } Size size = context.getChildSize(context.childCount - 1) ?? Size.zero; diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart index 24020556..6895cf2f 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/node1_base.dart @@ -7,9 +7,9 @@ import 'package:flutter/rendering.dart'; class ViewportDemo extends StatelessWidget { - ViewportDemo({Key? key}) : super(key: key); + const ViewportDemo({super.key}); - final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart index f17bd199..9c725298 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node1_base.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class DirectionWrap extends StatelessWidget { - DirectionWrap({Key? key}) : super(key: key); + const DirectionWrap({super.key}); @override Widget build(BuildContext context) { @@ -20,38 +20,38 @@ class DirectionWrap extends StatelessWidget { ])) .toList()); } - final Widget yellowBox = Container( + Widget get yellowBox => Container( color: Colors.yellow, height: 30, width: 50, ); - final Widget redBox = Container( + Widget get redBox => Container( color: Colors.red, height: 40, width: 40, ); - final Widget greenBox = Container( + Widget get greenBox => Container( color: Colors.green, height: 40, width: 20, ); - final Widget blackBox = Container( + Widget get blackBox => Container( color: Colors.black, height: 10, width: 10, ); - final Widget purpleBox = Container( + Widget get purpleBox => Container( color: Colors.purple, height: 20, width: 20, ); - final Widget orangeBox = Container( + Widget get orangeBox => Container( color: Colors.orange, height: 80, width: 20, ); - final Widget cyanBox = Container( + Widget get cyanBox => Container( color: Colors.cyanAccent, height: 10, width: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart index 50a6d236..0ed715cc 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node2_alignment.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class WrapAlignmentWrap extends StatelessWidget { - WrapAlignmentWrap({Key? key}) : super(key: key); + const WrapAlignmentWrap({super.key}); @override Widget build(BuildContext context) { @@ -21,38 +21,38 @@ class WrapAlignmentWrap extends StatelessWidget { .toList()); } - final Widget yellowBox = Container( + Widget get yellowBox => Container( color: Colors.yellow, height: 30, width: 50, ); - final Widget redBox = Container( + Widget get redBox => Container( color: Colors.red, height: 40, width: 40, ); - final Widget greenBox = Container( + Widget get greenBox => Container( color: Colors.green, height: 40, width: 20, ); - final Widget blackBox = Container( + Widget get blackBox => Container( color: Colors.black, height: 10, width: 10, ); - final Widget purpleBox = Container( + Widget get purpleBox => Container( color: Colors.purple, height: 20, width: 20, ); - final Widget orangeBox = Container( + Widget get orangeBox => Container( color: Colors.orange, height: 80, width: 20, ); - final Widget cyanBox = Container( + Widget get cyanBox => Container( color: Colors.cyanAccent, height: 10, width: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart index 8cd9cdbf..58774bf0 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CrossAxisAlignmentWrap extends StatelessWidget { - CrossAxisAlignmentWrap({Key? key}) : super(key: key); + const CrossAxisAlignmentWrap({super.key}); @override Widget build(BuildContext context) { @@ -22,38 +22,38 @@ class CrossAxisAlignmentWrap extends StatelessWidget { .toList()); } - final Widget yellowBox = Container( + Widget get yellowBox => Container( color: Colors.yellow, height: 30, width: 50, ); - final Widget redBox = Container( + Widget get redBox => Container( color: Colors.red, height: 40, width: 40, ); - final Widget greenBox = Container( + Widget get greenBox => Container( color: Colors.green, height: 40, width: 20, ); - final Widget blackBox = Container( + Widget get blackBox => Container( color: Colors.black, height: 10, width: 10, ); - final Widget purpleBox = Container( + Widget get purpleBox => Container( color: Colors.purple, height: 20, width: 20, ); - final Widget orangeBox = Container( + Widget get orangeBox => Container( color: Colors.orange, height: 80, width: 20, ); - final Widget cyanBox = Container( + Widget get cyanBox => Container( color: Colors.cyanAccent, height: 10, width: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart index b969f913..2aba4b94 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class TextDirectionWrap extends StatelessWidget { - TextDirectionWrap({Key? key}) : super(key: key); + const TextDirectionWrap({super.key}); @override Widget build(BuildContext context) { @@ -22,38 +22,38 @@ class TextDirectionWrap extends StatelessWidget { .toList()); } - final Widget yellowBox = Container( + Widget get yellowBox => Container( color: Colors.yellow, height: 30, width: 50, ); - final Widget redBox = Container( + Widget get redBox => Container( color: Colors.red, height: 40, width: 40, ); - final Widget greenBox = Container( + Widget get greenBox => Container( color: Colors.green, height: 40, width: 20, ); - final Widget blackBox = Container( + Widget get blackBox => Container( color: Colors.black, height: 10, width: 10, ); - final Widget purpleBox = Container( + Widget get purpleBox => Container( color: Colors.purple, height: 20, width: 20, ); - final Widget orangeBox = Container( + Widget get orangeBox => Container( color: Colors.orange, height: 80, width: 20, ); - final Widget cyanBox = Container( + Widget get cyanBox => Container( color: Colors.cyanAccent, height: 10, width: 20, diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart index 085524f4..9c981319 100644 --- a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class VerticalDirectionWrap extends StatelessWidget { - VerticalDirectionWrap({Key? key}) : super(key: key); + const VerticalDirectionWrap({super.key}); @override Widget build(BuildContext context) { @@ -22,38 +22,38 @@ class VerticalDirectionWrap extends StatelessWidget { .toList()); } - final Widget yellowBox = Container( + Widget get yellowBox => Container( color: Colors.yellow, height: 30, width: 50, ); - final Widget redBox = Container( + Widget get redBox => Container( color: Colors.red, height: 40, width: 40, ); - final Widget greenBox = Container( + Widget get greenBox => Container( color: Colors.green, height: 40, width: 20, ); - final Widget blackBox = Container( + Widget get blackBox => Container( color: Colors.black, height: 10, width: 10, ); - final Widget purpleBox = Container( + Widget get purpleBox => Container( color: Colors.purple, height: 20, width: 20, ); - final Widget orangeBox = Container( + Widget get orangeBox => Container( color: Colors.orange, height: 80, width: 20, ); - final Widget cyanBox = Container( + Widget get cyanBox => Container( color: Colors.cyanAccent, height: 10, width: 20, diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart index 1d82ea01..1aeb4391 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node1_base.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; class ListWheelViewportDemo extends StatelessWidget { - ListWheelViewportDemo({Key? key}) : super(key: key); + const ListWheelViewportDemo({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart index c61d48a5..ea873016 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node2_perspective.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; class ListWheelViewportDemo2 extends StatelessWidget { - ListWheelViewportDemo2({Key? key}) : super(key: key); + const ListWheelViewportDemo2({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart index 4e210338..7b98d643 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node3_magnifier.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; class ListWheelViewportDemo3 extends StatelessWidget { - ListWheelViewportDemo3({Key? key}) : super(key: key); + const ListWheelViewportDemo3({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart index a818045c..098261a8 100644 --- a/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/node4_opacity.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; class ListWheelViewportDemo4 extends StatelessWidget { - ListWheelViewportDemo4({Key? key}) : super(key: key); + const ListWheelViewportDemo4({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart index 1d3eb600..a05838c2 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/node1_base.dart @@ -5,24 +5,24 @@ import 'package:flutter/material.dart'; class ButtonBarThemeDemo extends StatelessWidget { - const ButtonBarThemeDemo({Key? key}) : super(key: key); + const ButtonBarThemeDemo({super.key}); @override Widget build(BuildContext context) { return ButtonBarTheme( - child: const TempButtonBar(), data: ButtonBarTheme.of(context).copyWith( alignment: MainAxisAlignment.center, buttonPadding: const EdgeInsets.symmetric(horizontal: 6), overflowDirection: VerticalDirection.up, buttonMinWidth: 150, buttonHeight: 30, - buttonTextTheme: ButtonTextTheme.primary)); + buttonTextTheme: ButtonTextTheme.primary), + child: const TempButtonBar()); } } class TempButtonBar extends StatelessWidget { - const TempButtonBar({Key? key}) : super(key: key); + const TempButtonBar({super.key}); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json index 8e6062c9..cd3566fa 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_zh-CN.json @@ -5,7 +5,7 @@ "info": "它是 InheritedWidget 抽象子类,通过 context 向子树传递数据,并通过 Aspect 方面控制依赖通知的粒度。", "lever": 4, "family": 5, - "linkIds": [], + "linkIds": [346], "nodes": [ { "file": "node1.dart", diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart index a3e32265..6516f3b6 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/node1.dart @@ -33,7 +33,7 @@ class _InheritedModelDemoState extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - CircleIconButton( + _CircleIconButton( color: Colors.green, icon: Icons.remove, onPressed: _decrease, @@ -41,9 +41,9 @@ class _InheritedModelDemoState extends State { CounterModel( color: _color, counter: _counter, - child: BoxDecorationWrap(), + child: const _BoxDecorationWrap(), ), - CircleIconButton( + _CircleIconButton( color: Colors.blue, icon: Icons.add, onPressed: _increase, @@ -51,7 +51,7 @@ class _InheritedModelDemoState extends State { ], ), const SizedBox(height: 20), - ColorSelector( + _ColorSelector( colors: colors, activeColor: _color, onSelect: _onSelectColor, @@ -108,12 +108,12 @@ class CounterModel extends InheritedModel { } } -class CircleIconButton extends StatelessWidget { +class _CircleIconButton extends StatelessWidget { final Color color; final IconData icon; final VoidCallback onPressed; - const CircleIconButton( + const _CircleIconButton( {super.key, required this.color, required this.icon, @@ -124,16 +124,15 @@ class CircleIconButton extends StatelessWidget { return GestureDetector( onTap: onPressed, child: Container( - margin: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( + margin: const EdgeInsets.symmetric(horizontal: 20), + decoration: const BoxDecoration( color: Color(0xFFDFDFDF), shape: BoxShape.circle, - // border: Border.all(width: 14.0, color: Color(0xFFDFDFDF)) ), child: Padding( padding: const EdgeInsets.all(2.0), child: Container( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: color, shape: BoxShape.circle, @@ -151,12 +150,12 @@ class CircleIconButton extends StatelessWidget { } } -class ColorSelector extends StatelessWidget { +class _ColorSelector extends StatelessWidget { final List colors; final ValueChanged onSelect; final Color activeColor; - const ColorSelector({ + const _ColorSelector({ super.key, required this.colors, required this.activeColor, @@ -180,7 +179,7 @@ class ColorSelector extends StatelessWidget { return CircleAvatar( radius: 12, child: color == activeColor - ? Icon( + ? const Icon( Icons.check, color: Colors.white, size: 16, @@ -191,14 +190,14 @@ class ColorSelector extends StatelessWidget { } } -class BoxDecorationWrap extends StatefulWidget { - const BoxDecorationWrap({super.key}); +class _BoxDecorationWrap extends StatefulWidget { + const _BoxDecorationWrap({super.key}); @override - State createState() => _BoxDecorationWrapState(); + State<_BoxDecorationWrap> createState() => _BoxDecorationWrapState(); } -class _BoxDecorationWrapState extends State { +class _BoxDecorationWrapState extends State<_BoxDecorationWrap> { @override void didChangeDependencies() { @@ -210,8 +209,8 @@ class _BoxDecorationWrapState extends State { Widget build(BuildContext context) { final Color color = CounterModel.of(context,CounterAspect.color)?.color ?? Colors.black; return Container( - padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: CounterText(), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: const _CounterText(), decoration: BoxDecoration( color: Colors.white, border: Border.all(color: color), @@ -221,20 +220,20 @@ class _BoxDecorationWrapState extends State { color: color, spreadRadius: 2, blurRadius: 8, - offset: Offset(0, 0)) + offset: const Offset(0, 0)) ]), ); } } -class CounterText extends StatefulWidget { - const CounterText({super.key}); +class _CounterText extends StatefulWidget { + const _CounterText({super.key}); @override - State createState() => _CounterTextState(); + State<_CounterText> createState() => _CounterTextState(); } -class _CounterTextState extends State { +class _CounterTextState extends State<_CounterText> { @override void didChangeDependencies() { print("======CounterText#didChangeDependencies========="); diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart index 3018d341..3fd4a5ee 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/node1_base.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class InheritedThemeDemo extends StatelessWidget { - const InheritedThemeDemo({Key? key}) : super(key: key); + const InheritedThemeDemo({super.key}); @override diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart index 631e6911..823cbb2c 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node1_base.dart @@ -8,7 +8,7 @@ class InheritedWidgetDemo extends StatelessWidget { 'InheritedWidget 是一个抽象类,不可以直接使用。可以自定义对应共享数据的子类,如这里的通过 InfoInheritedWidget 实现:当前这段话可以在任意子树节点上下文获取。' '一般都会定义一个 XXX.of(context) 的方法来获取数据,如 MediaQuery.of,Theme.of 等。'; - const InheritedWidgetDemo({Key? key}) : super(key: key); + const InheritedWidgetDemo({super.key}); @override Widget build(BuildContext context) { @@ -20,7 +20,7 @@ class InheritedWidgetDemo extends StatelessWidget { } class InfoWidget extends StatelessWidget { - const InfoWidget({Key? key}) : super(key: key); + const InfoWidget({super.key}); @override Widget build(BuildContext context) { @@ -38,8 +38,7 @@ class InfoWidget extends StatelessWidget { class InfoInheritedWidget extends InheritedWidget { final String info; - const InfoInheritedWidget({Key? key,required this.info, required Widget child}) - : super(key: key, child: child); + const InfoInheritedWidget({super.key,required this.info, required super.child}); @override bool updateShouldNotify(covariant InfoInheritedWidget oldWidget) => diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart index c43ec1da..4e2ec7d5 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/node2_use.dart @@ -2,6 +2,13 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/9/21 /// contact me by email 1981462002@qq.com +/// +class InheritedWidgetDemo2 extends StatefulWidget { + const InheritedWidgetDemo2({super.key}); + + @override + State createState() => _InheritedWidgetDemo2State(); +} class InheritedCounter extends InheritedWidget { const InheritedCounter({ @@ -24,14 +31,7 @@ class InheritedCounter extends InheritedWidget { } } -class InheritedModelDemo extends StatefulWidget { - const InheritedModelDemo({super.key}); - - @override - State createState() => _InheritedModelDemoState(); -} - -class _InheritedModelDemoState extends State { +class _InheritedWidgetDemo2State extends State { int _counter = 0; late Color _color = colors.first; diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart index 192a561a..d9b6a7a1 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; class KeepAliveDemo extends StatelessWidget { - KeepAliveDemo({Key? key}) : super(key: key); + const KeepAliveDemo({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart index 61fb0e66..5c18f5ab 100644 --- a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomScrollConfiguration extends StatelessWidget { - CustomScrollConfiguration({Key? key}) : super(key: key); + const CustomScrollConfiguration({super.key}); - final List data = [ + List get data => [ Colors.cyan[50]!, Colors.cyan[100]!, Colors.cyan[200]!, diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart index 97430942..a235ebd3 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/node2_save.dart @@ -10,10 +10,16 @@ import 'node1_base.dart'; /// contact me by email 1981462002@qq.com -class RepaintBoundarySave extends StatelessWidget { - final GlobalKey _globalKey = GlobalKey(); +class RepaintBoundarySave extends StatefulWidget { + + const RepaintBoundarySave({super.key}); + + @override + State createState() => _RepaintBoundarySaveState(); +} - RepaintBoundarySave({Key? key}) : super(key: key); +class _RepaintBoundarySaveState extends State { + final GlobalKey _globalKey = GlobalKey(); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart index 48f3e2dd..00c448f7 100644 --- a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CupertinoSliverNavigationBarDemo extends StatelessWidget { - CupertinoSliverNavigationBarDemo({Key? key}) : super(key: key); + const CupertinoSliverNavigationBarDemo({super.key}); - final List data = [ + List get data => [ Colors.orange[50]!, Colors.orange[100]!, Colors.orange[200]!, diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart index 4f8b8043..9e482f0f 100644 --- a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomScrollViewDemo extends StatelessWidget { - CustomScrollViewDemo({Key? key}) : super(key: key); + const CustomScrollViewDemo({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart index ba83d7a5..ba132525 100644 --- a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; class FlexibleSpaceBarDemo extends StatelessWidget { - FlexibleSpaceBarDemo({Key? key}) : super(key: key); + const FlexibleSpaceBarDemo({super.key}); - final List data =[ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart index a6cb09d1..eef958f6 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/node1_base.dart @@ -2,19 +2,11 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com -/// 说明: -// { -// "widgetId": 188, -// "name": 'SliverList基本使用', -// "priority": 1, -// "subtitle": "SliverGrid.count 指定轴向数量构造\n" -// "SliverGrid.extent 指定轴向长度构造\n" -// "属性特征同GridView,可详见之", -// } + class SliverGirdDemo extends StatelessWidget { - SliverGirdDemo({Key? key}) : super(key: key); + const SliverGirdDemo({super.key}); - final List data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart index 99a7f78f..ea903dca 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SliverListDemo extends StatelessWidget { - SliverListDemo({Key? key}) : super(key: key); + const SliverListDemo({super.key}); - final List data =[ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart index b286e18e..209d7629 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SliverOpacityDemo extends StatelessWidget { - SliverOpacityDemo({Key? key}) : super(key: key); + const SliverOpacityDemo({super.key}); - final List data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart index d7dd874d..26b707ba 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SliverPaddingDemo extends StatelessWidget { - SliverPaddingDemo({Key? key}) : super(key: key); + const SliverPaddingDemo({super.key}); - final data = List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF6600FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart index 5c84cc71..7ea9109c 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/node1_base.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SliverPersistentHeaderDemo extends StatelessWidget { - SliverPersistentHeaderDemo({Key? key}) : super(key: key); + const SliverPersistentHeaderDemo({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart index 4ecd217e..31d23053 100644 --- a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SliverToBoxAdapterDemo extends StatelessWidget { - SliverToBoxAdapterDemo({Key? key}) : super(key: key); + const SliverToBoxAdapterDemo({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart index bbc7682c..9f5ded80 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/node1_base.dart @@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomAnimatedList extends StatefulWidget { - const CustomAnimatedList({Key? key}) : super(key: key); + const CustomAnimatedList({super.key}); @override - _CustomAnimatedListState createState() => _CustomAnimatedListState(); + State createState() => _CustomAnimatedListState(); } class _CustomAnimatedListState extends State { @@ -29,7 +29,7 @@ class _CustomAnimatedListState extends State { Widget _buildItem( BuildContext context, int index, Animation animation) { - return CardItem( + return _CardItem( animation: animation, item: _list[index], selected: _selectedItem == _list[index], @@ -43,7 +43,7 @@ class _CustomAnimatedListState extends State { Widget _buildRemovedItem( int item, BuildContext context, Animation animation) { - return CardItem( + return _CardItem( animation: animation, item: item, selected: false, @@ -141,15 +141,14 @@ class ListModel { int indexOf(E item) => _items.indexOf(item); } -class CardItem extends StatelessWidget { - const CardItem( - {Key? key, +class _CardItem extends StatelessWidget { + const _CardItem( + {super.key, required this.animation, this.onTap, required this.item, this.selected = false}) - : assert(item >= 0), - super(key: key); + : assert(item >= 0); final Animation animation; final VoidCallback? onTap; final int item; diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart index 1e82c6fe..0416dbc2 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; class AutomaticKeepAliveDemo extends StatelessWidget { - AutomaticKeepAliveDemo({Key? key}) : super(key: key); + const AutomaticKeepAliveDemo({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, @@ -36,7 +36,7 @@ class AutomaticKeepAliveDemo extends StatelessWidget { height: 300, child: ListView.builder( itemCount: data.length, - itemBuilder: (_, index) => ColorBox( + itemBuilder: (_, index) => _ColorBox( color: data[index], index: index, ), @@ -45,18 +45,17 @@ class AutomaticKeepAliveDemo extends StatelessWidget { } } -class ColorBox extends StatefulWidget { +class _ColorBox extends StatefulWidget { final Color color; final int index; - const ColorBox({Key? key, required this.color, required this.index}) - : super(key: key); + const _ColorBox({super.key, required this.color, required this.index}); @override _ColorBoxState createState() => _ColorBoxState(); } -class _ColorBoxState extends State with AutomaticKeepAliveClientMixin { +class _ColorBoxState extends State<_ColorBox> with AutomaticKeepAliveClientMixin { bool _checked = false; @override diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart index 5cb83d6c..7ddf6689 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class CustomCupertinoButton extends StatelessWidget { - CustomCupertinoButton({Key? key}) : super(key: key); + const CustomCupertinoButton({super.key}); - final Map data = { + Map get data => { CupertinoColors.activeBlue:4.0, Colors.blue:6.0, CupertinoColors.activeOrange:8.0, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart index 03421687..77436718 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomCupertinoScrollbar extends StatelessWidget { - CustomCupertinoScrollbar({Key? key}) : super(key: key); + const CustomCupertinoScrollbar({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart index 1e3da9b5..aa263239 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; class GlowingOverscrollIndicatorDemo extends StatelessWidget { - GlowingOverscrollIndicatorDemo({Key? key}) : super(key: key); + const GlowingOverscrollIndicatorDemo({super.key}); - final List data = [ + List get data => [ Colors.orange[50]!, Colors.orange[100]!, Colors.orange[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart index a4260c70..8d046efa 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomPageView extends StatelessWidget { - CustomPageView({Key? key}) : super(key: key); + const CustomPageView({super.key}); - final List data = [ + List get data => [ Colors.green[50]!, Colors.green[100]!, Colors.green[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart index c7bbeeb4..95139a7d 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/node2_direction.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class DirectionPageView extends StatelessWidget { - DirectionPageView({Key? key}) : super(key: key); + const DirectionPageView({super.key}); - final List data = [ + List get data => [ Colors.orange[50]!, Colors.orange[100]!, Colors.orange[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart index 9ca0c80c..f32df2c3 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/node1_base.dart @@ -7,9 +7,9 @@ import 'package:flutter/rendering.dart'; class ScrollableDemo extends StatelessWidget { - ScrollableDemo({Key? key}) : super(key: key); + const ScrollableDemo({super.key}); - final List data = List.generate(32, (i) => Color(0xFF6600FF - 2 * i)); + List get data => List.generate(32, (i) => Color(0xFF6600FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart index 828274cb..da07c5b3 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomScrollbar extends StatelessWidget { - CustomScrollbar({Key? key}) : super(key: key); + const CustomScrollbar({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart index 21d9de4b..0d81ba90 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/node1_base.dart @@ -3,11 +3,10 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020/7/21 /// contact me by email 1981462002@qq.com +final ValueNotifier _counter = ValueNotifier(0); class ValueListenableBuilderDemo extends StatelessWidget { - ValueListenableBuilderDemo({Key? key}) : super(key: key); - - final ValueNotifier _counter = ValueNotifier(0); + const ValueListenableBuilderDemo({super.key}); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart index f0fe0063..d48fe1bd 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/node2_type.dart @@ -14,7 +14,7 @@ class AutocompleteType extends StatefulWidget { class _AutocompleteTypeState extends State { late TextEditingController _controller; - User? user; + _User? user; @override Widget build(BuildContext context) { @@ -35,7 +35,7 @@ class _AutocompleteTypeState extends State { } Widget buildAutocomplete() { - return Autocomplete( + return Autocomplete<_User>( optionsBuilder: buildOptions, onSelected: onSelected, optionsViewBuilder: _buildOptionsView, @@ -50,36 +50,36 @@ class _AutocompleteTypeState extends State { super.dispose(); } - void onSelected(User selection) { + void onSelected(_User selection) { debugPrint('当前选择了 $selection'); setState(() { user = selection; }); } - Future> buildOptions( + Future> buildOptions( TextEditingValue textEditingValue, ) async { if (textEditingValue.text == '') { - return const Iterable.empty(); + return const Iterable<_User>.empty(); } return searchByArgs(textEditingValue.text); } - Future> searchByArgs(String args) async { + Future> searchByArgs(String args) async { // 模拟网络请求 await Future.delayed(const Duration(milliseconds: 200)); - const List data = [ - User('toly', true, 'icon_5.webp'), - User('toly49', false, 'icon_6.webp'), - User('toly42', true, 'icon_7.webp'), - User('toly56', false, 'icon_8.webp'), - User('card', true, 'icon_5.webp'), - User('ls', true, 'icon_6.webp'), - User('alex', true, 'icon_7.webp'), - User('fan sha', false, 'icon_8.webp'), + const List<_User> data = [ + _User('toly', true, 'icon_5.webp'), + _User('toly49', false, 'icon_6.webp'), + _User('toly42', true, 'icon_7.webp'), + _User('toly56', false, 'icon_8.webp'), + _User('card', true, 'icon_5.webp'), + _User('ls', true, 'icon_6.webp'), + _User('alex', true, 'icon_7.webp'), + _User('fan sha', false, 'icon_8.webp'), ]; - return data.where((User user) => user.name.contains(args)); + return data.where((_User user) => user.name.contains(args)); } Widget _buildFieldView( @@ -112,7 +112,7 @@ class _AutocompleteTypeState extends State { } Widget _buildOptionsView(BuildContext context, - AutocompleteOnSelected onSelected, Iterable options) { + AutocompleteOnSelected<_User> onSelected, Iterable<_User> options) { return Align( alignment: Alignment.topCenter, child: Padding( @@ -123,7 +123,7 @@ class _AutocompleteTypeState extends State { child: ListView.builder( padding: EdgeInsets.zero, itemBuilder: (_, index) { - final User option = options.elementAt(index); + final _User option = options.elementAt(index); return _UserItem( onSelected: onSelected, user: option, @@ -140,9 +140,9 @@ class _AutocompleteTypeState extends State { } class _UserItem extends StatelessWidget { - final AutocompleteOnSelected? onSelected; + final AutocompleteOnSelected<_User>? onSelected; final String args; - final User user; + final _User user; const _UserItem({ Key? key, @@ -205,15 +205,15 @@ class _UserItem extends StatelessWidget { } } -class User { +class _User { final String name; final bool man; final String image; - const User(this.name, this.man, this.image); + const _User(this.name, this.man, this.image); @override String toString() { - return 'User{name: $name, man: $man, image: $image}'; + return '_User{name: $name, man: $man, image: $image}'; } } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart index c2f2178e..e51f70a7 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomBackButton extends StatelessWidget { - CustomBackButton({Key? key}) : super(key: key); + const CustomBackButton({super.key}); - final List data = [ + List get data => [ Colors.red, Colors.yellow, Colors.blue, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart index 9b8c3b91..b49c4429 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; class CustomBanner extends StatelessWidget { - CustomBanner({Key? key}) : super(key: key); + const CustomBanner({super.key}); - final Map data = { + Map get data => { BannerLocation.topStart: Colors.red, BannerLocation.topEnd: Colors.blue, BannerLocation.bottomStart: Colors.green, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart index 0ed77fdb..7d35f39c 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/node4_decoration.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class ContainerDecoration extends StatelessWidget { - ContainerDecoration({Key? key}) : super(key: key); + const ContainerDecoration({super.key}); - final List rainbow = [ + List get rainbow => [ 0xffff0000, 0xffFF7F00, 0xffFFFF00, @@ -16,7 +16,7 @@ class ContainerDecoration extends StatelessWidget { 0xff8B00FF ]; - final List stops = [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; + List get stops => [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart index 99d0f84a..b755874d 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/node1_base.dart @@ -6,9 +6,9 @@ import 'package:flutter/material.dart'; class CupertinoPopupSurfaceDemo extends StatelessWidget { - CupertinoPopupSurfaceDemo({Key? key}) : super(key: key); + const CupertinoPopupSurfaceDemo({super.key}); - final List rainbow = [ + List get rainbow => [ 0xffff0000, 0xffFF7F00, 0xffFFFF00, @@ -18,7 +18,7 @@ class CupertinoPopupSurfaceDemo extends StatelessWidget { 0xff8B00FF ]; - final List stops = [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; + List get stops => [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0]; @override diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart index b47cb2a4..9ead9206 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/node1_base.dart @@ -13,16 +13,15 @@ class _Bean { } class CustomDataTable extends StatelessWidget { - CustomDataTable({Key? key}) : super(key: key); + const CustomDataTable({super.key}); - final List<_Bean> data = [ + List<_Bean> get data => [ _Bean(101, 'DataTable', 'StatelessWidget'), _Bean(44, 'RangeSlider', 'StatefulWidget'), _Bean(2, 'Text', 'StatelessWidget'), _Bean(1, 'Image', 'StatefulWidget'), ]; - - final List columns = ['id', '名称', '类型']; + List get columns => ['id', '名称', '类型']; @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart index 49b729d4..475b961f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node1_base.dart @@ -17,9 +17,9 @@ import 'package:flutter/material.dart'; // "【crossAxisCount】 : 主轴一行数量 【int】", // } class CustomGridView extends StatelessWidget { - CustomGridView({Key? key}) : super(key: key); + const CustomGridView({super.key}); - final List data = List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFFFF00FF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart index 51f72338..32281c03 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node2_direction.dart @@ -14,9 +14,9 @@ import 'package:flutter/material.dart'; // "【shrinkWrap】 : 无边界时是否包裹 【bool】", // } class HorizontalGridView extends StatelessWidget { - HorizontalGridView({Key? key}) : super(key: key); + const HorizontalGridView({super.key}); - final List data = List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); @override Widget build(BuildContext context) { @@ -35,12 +35,12 @@ class HorizontalGridView extends StatelessWidget { } Container _buildItem(Color color) => Container( - alignment: Alignment.center, - width: 100, - height: 30, - color: color, - child: Text( - colorString(color), + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), style: const TextStyle( color: Colors.white, shadows: [ @@ -48,8 +48,8 @@ class HorizontalGridView extends StatelessWidget { ], ), ), - ); + ); String colorString(Color color) => "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart index 790515d0..c42658dd 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node3_extend.dart @@ -14,9 +14,9 @@ import 'package:flutter/material.dart'; // "【shrinkWrap】 : 无边界时是否包裹 【bool】", // } class ExtentGridView extends StatelessWidget { - ExtentGridView({Key? key}) : super(key: key); + const ExtentGridView({super.key}); - final List data = List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF00FFFF - 2 * i)); @override Widget build(BuildContext context) { @@ -34,12 +34,12 @@ class ExtentGridView extends StatelessWidget { } Container _buildItem(Color color) => Container( - alignment: Alignment.center, - width: 100, - height: 30, - color: color, - child: Text( - colorString(color), + alignment: Alignment.center, + width: 100, + height: 30, + color: color, + child: Text( + colorString(color), style: const TextStyle( color: Colors.white, shadows: [ @@ -47,8 +47,8 @@ class ExtentGridView extends StatelessWidget { ], ), ), - ); + ); String colorString(Color color) => "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart index a60215cf..a0b2ca75 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/node4_builder.dart @@ -14,9 +14,9 @@ import 'package:flutter/material.dart'; // "【itemBuilder】 : 条目构造器 【IndexedWidgetBuilder】", // } class BuilderGridView extends StatelessWidget { - BuilderGridView({Key? key}) : super(key: key); + const BuilderGridView({super.key}); - final List data = List.generate(128, (i) => Color(0xFF33FFF - 2 * i)); + List get data => List.generate(128, (i) => Color(0xFF33FFF - 2 * i)); @override Widget build(BuildContext context) { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart index 0ee51dd5..a6c2a115 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomListView extends StatelessWidget { - CustomListView({Key? key}) : super(key: key); + const CustomListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart index 1cb99c62..ff9458e0 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node2_direction.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class HorizontalListView extends StatelessWidget { - HorizontalListView({Key? key}) : super(key: key); + const HorizontalListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart index c7747bb3..b479f73f 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node3_builder.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class BuilderListView extends StatelessWidget { - BuilderListView({Key? key}) : super(key: key); + const BuilderListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart index 9da13bb7..8ccca75a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/node4_separated.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class SeparatedListView extends StatelessWidget { - SeparatedListView({Key? key}) : super(key: key); + const SeparatedListView({super.key}); - final List data = [ + List get data => [ Colors.purple[50]!, Colors.purple[100]!, Colors.purple[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart index b1e4cb6b..5c3d85b6 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node1_base.dart @@ -4,9 +4,9 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class CustomSingleChildScrollView extends StatelessWidget { - CustomSingleChildScrollView({Key? key}) : super(key: key); + const CustomSingleChildScrollView({super.key}); - final List data = [ + List get data => [ Colors.blue[50]!, Colors.blue[100]!, Colors.blue[200]!, diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart index 0113e0a2..96b9351a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/node2_direction.dart @@ -4,20 +4,20 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com class DirectionSingleChildScrollView extends StatelessWidget { - DirectionSingleChildScrollView({Key? key}) : super(key: key); + const DirectionSingleChildScrollView({super.key}); - final List data = [ - Colors.blue[50]!, - Colors.blue[100]!, - Colors.blue[200]!, - Colors.blue[300]!, - Colors.blue[400]!, - Colors.blue[500]!, - Colors.blue[600]!, - Colors.blue[700]!, - Colors.blue[800]!, - Colors.blue[900]!, - ]; + List get data => [ + Colors.blue[50]!, + Colors.blue[100]!, + Colors.blue[200]!, + Colors.blue[300]!, + Colors.blue[400]!, + Colors.blue[500]!, + Colors.blue[600]!, + Colors.blue[700]!, + Colors.blue[800]!, + Colors.blue[900]!, + ]; TextStyle get textStyle => const TextStyle( color: Colors.white, @@ -51,11 +51,10 @@ class DirectionSingleChildScrollView extends StatelessWidget { )) .toList(), ), - ), ); } String colorString(Color color) => "#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}"; -} \ No newline at end of file +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json index 42c7496d..cd97d60a 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_zh-CN.json @@ -11,7 +11,7 @@ ], "nodes": [ { - "file": "node1_base.dart", + "file": "node1.dart", "name": "文字的基本样式", "desc": [ "【入参】 : 文字 【String】", @@ -24,7 +24,7 @@ ] }, { - "file": "node2_shadows.dart", + "file": "node2.dart", "name": "文字阴影", "desc": [ "【shadows】 : 文字 【List】", diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart similarity index 64% rename from modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart rename to modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart index 5060ffe2..b7a87196 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node1.dart @@ -3,12 +3,12 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com -class CustomText extends StatelessWidget { - const CustomText({Key? key}) : super(key: key); +class TextDemo1 extends StatelessWidget { + const TextDemo1({super.key}); @override Widget build(BuildContext context) { - TextStyle style = const TextStyle( + const TextStyle style = TextStyle( color: Colors.blue, fontSize: 20, fontWeight: FontWeight.bold, @@ -18,8 +18,8 @@ class CustomText extends StatelessWidget { return Container( width: 200, color: Colors.cyanAccent.withAlpha(33), - height: 200 * 0.618 * 0.618, - child: Text("toly-张风捷特烈-1994`", style: style), + height: 76, + child: const Text("toly-张风捷特烈-1994`", style: style), ); } } \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart new file mode 100644 index 00000000..9f3d949f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-03-29 +/// contact me by email 1981462002@qq.com + +class TextDemo2 extends StatelessWidget { + const TextDemo2({super.key}); + + @override + Widget build(BuildContext context) { + const TextStyle style = TextStyle( + fontSize: 50, + color: Colors.white, + backgroundColor: Colors.black, + shadows: [ + Shadow(color: Colors.cyanAccent, offset: Offset(1, 1), blurRadius: 10), + Shadow(color: Colors.blue, offset: Offset(-0.1, 0.1), blurRadius: 10), + ]); + return const Text("张风捷特烈", style: style); + } +} diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart b/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart deleted file mode 100644 index b27cb09c..00000000 --- a/modules/widget_system/widgets/lib/StatelessWidget/Text/node2_shadows.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-03-29 -/// contact me by email 1981462002@qq.com - -class ShadowText extends StatelessWidget { - const ShadowText({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Text( - "张风捷特烈", - style: TextStyle( - fontSize: 50, - color: Colors.white, - backgroundColor: Colors.black, - shadows: [ - Shadow( - color: Colors.cyanAccent, - offset: Offset(1, 1), - blurRadius: 10), - Shadow( - color: Colors.blue, - offset: Offset(-0.1, 0.1), - blurRadius: 10), - ]), - ); - } -} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/exp/proxy_unit.dart b/modules/widget_system/widgets/lib/exp/proxy_unit.dart index fdc1ec8a..2b2e5cdd 100644 --- a/modules/widget_system/widgets/lib/exp/proxy_unit.dart +++ b/modules/widget_system/widgets/lib/exp/proxy_unit.dart @@ -32,5 +32,7 @@ export '../ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart'; export '../ProxyWidget/InheritedTheme/node1_base.dart'; export '../ProxyWidget/DefaultAssetBundle/node1_base.dart'; export '../ProxyWidget/InheritedWidget/node1_base.dart'; +export '../ProxyWidget/InheritedWidget/node2_use.dart'; export '../ProxyWidget/ParentDataWidget/node1_base.dart'; +export '../ProxyWidget/InheritedModel/node1.dart'; export '../ProxyWidget/PrimaryScrollController/node1_base.dart'; diff --git a/modules/widget_system/widgets/lib/exp/stateless_unit.dart b/modules/widget_system/widgets/lib/exp/stateless_unit.dart index f641ae37..9833ccae 100644 --- a/modules/widget_system/widgets/lib/exp/stateless_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateless_unit.dart @@ -185,8 +185,8 @@ export '../StatelessWidget/CupertinoActionSheet/node1_base.dart'; export '../StatelessWidget/CupertinoActionSheetAction/node1_base.dart'; export '../StatelessWidget/CupertinoAlertDialog/node1_base.dart'; -export '../StatelessWidget/Text/node1_base.dart'; -export '../StatelessWidget/Text/node2_shadows.dart'; +export '../StatelessWidget/Text/node1.dart'; +export '../StatelessWidget/Text/node2.dart'; export '../StatelessWidget/Text/node3_decoration.dart'; export '../StatelessWidget/Text/node4_textAlign.dart'; export '../StatelessWidget/Text/node5_textDirection.dart'; diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart new file mode 100644 index 00000000..f1468169 --- /dev/null +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -0,0 +1,491 @@ +import 'package:flutter/cupertino.dart'; +import 'exp/other_unit.dart'; +import 'exp/proxy_unit.dart'; +import 'exp/render_object_unit.dart'; +import 'exp/sliver_unit.dart'; +import 'exp/stateful_unit.dart'; +import 'exp/stateless_unit.dart'; + +Widget mapNodeDisplay(int widgetId, int nodePriority) { + String name = '$widgetId#$nodePriority'; + + return switch (name) { + '96#0' => const ColumnNode1(), + '341#0' => const CustomMultiChildLayoutNode1(), + '94#0' => const FlexNode1(), + '94#1' => const FlexNode2(), + '94#2' => const FlexNode3(), + '94#3' => const FlexNode4(), + '94#4' => const FlexNode5(), + '99#0' => const FlowNode1(), + '99#1' => const FlowNode02(), + '161#0' => const IndexedStackNode01(), + '342#0' => const ListBodyDemo(), + '344#0' => const NestedScrollViewViewportDemo(), + '101#0' => const CustomRichText(), + '101#1' => const RichTextWithWidget(), + '95#0' => const CustomRow(), + '343#0' => const ShrinkWrappingViewportDemo(), + '97#0' => const CustomStack(), + '97#1' => const PositionedStack(), + '340#0' => const ViewportDemo(), + '98#0' => const DirectionWrap(), + '98#1' => const WrapAlignmentWrap(), + '98#2' => const CrossAxisAlignmentWrap(), + '98#3' => const TextDirectionWrap(), + '98#4' => const VerticalDirectionWrap(), + '197#0' => const ErrorWidgetDemo(), + '291#0' => const ListWheelViewportDemo(), + '291#1' => const ListWheelViewportDemo2(), + '291#2' => const ListWheelViewportDemo3(), + '291#3' => const ListWheelViewportDemo4(), + '312#0' => const PerformanceOverlayDemo(), + '313#0' => const RawImageDemo(), + '289#0' => const RenderObjectToWidgetAdapterDemo(), + '110#0' => const CustomTable(), + '338#0' => const ButtonBarThemeDemo(), + '326#0' => const ButtonThemeDemo(), + '328#0' => const ChipThemeDemo(), + '337#0' => const CupertinoUserInterfaceLevelDemo(), + '320#0' => const DefaultAssetBundleDemo(), + '324#0' => const DefaultTextStyleDemo(), + '319#0' => const DirectionalityDemo(), + '329#0' => const DividerThemeDemo(), + '181#0' => const CustomDropDownButtonHideUnderline(), + '106#0' => const CustomExpended(), + '109#0' => const CustomFlexible(), + '325#0' => const IconThemeDemo(), + '336#0' => const InheritedModelDemo(), + '345#0' => const InheritedThemeDemo(), + '346#0' => const InheritedWidgetDemo(), + '346#1' => const InheritedWidgetDemo2(), + '316#0' => const KeepAliveDemo(), + '315#0' => const LayoutIdDemo(), + '334#0' => const ListTileThemeDemo(), + '327#0' => const MaterialBannerThemeDemo(), + '167#0' => const CustomMediaQuery(), + '347#0' => const ParentDataWidgetDemo(), + '330#0' => const PopupMenuThemeDemo(), + '108#0' => const CustomPositioned(), + '335#0' => const PrimaryScrollControllerDemo(), + '180#0' => const CustomScrollConfiguration(), + '331#0' => const SliderThemeDemo(), + '331#1' => const DIYSliderTheme(), + '317#0' => const TableCellDemo(), + '332#0' => const ToggleButtonsThemeDemo(), + '333#0' => const TooltipThemeDemo(), + '295#0' => const CustomAbsorbPointer(), + '85#0' => const CustomAlign(), + '85#1' => const Ball(), + '201#0' => const CustomAnimatedSize(), + '288#0' => const AnnotatedRegionDemo(), + '77#0' => const CustomAspectRatio(), + '278#0' => const CustomBackdropFilter(), + '75#0' => const CustomBaseline(), + '86#0' => const CustomCenter(), + '66#0' => const CustomClipOval(), + '69#0' => const CustomClipPath(), + '67#0' => const CustomClipRect(), + '68#0' => const CustomClipRRect(), + '267#0' => const ColoredBoxDemo(), + '88#0' => const CustomColorFiltered(), + '265#0' => const CompositedTransformFollowerDemo(), + '266#0' => const CompositedTransformTargetDemo(), + '80#0' => const CustomConstrainedBox(), + '299#0' => const CupertinoTextSelectionToolbarDemo(), + '166#0' => const ClockPage(), + '166#1' => const PlayBezier3Page(), + '285#0' => const CustomSingleChildLayoutDemo(), + '285#1' => const OffSetWidgetDemo(), + '70#0' => const BoxDecorationDemo(), + '70#1' => const ShapeImageDemo(), + '70#2' => const BorderDemo(), + '70#3' => const ShapeDecorationDemo(), + '70#4' => const UnderlineTabIndicatorDemo(), + '70#5' => const FlutterLogoDecorationDemo(), + '89#0' => const CustomFadeTransition(), + '87#0' => const CustomFittedBox(), + '82#0' => const CustomFractionallySizedBox(), + '263#0' => const FractionalTranslationDemo(), + '292#0' => const CustomIgnorePointer(), + '357#0' => const ImageFilteredBlur(), + '357#1' => const ImageFilteredColor(), + '357#2' => const ImageFilteredMatrix(), + '298#0' => const IntrinsicHeightDemo(), + '297#0' => const IntrinsicWidthDemo(), + '287#0' => const CustomLayoutBuilder(), + '287#1' => const FitByLayoutBuilder(), + '287#2' => const SimpleExpandableText(), + '79#0' => const CustomLimitedBox(), + '71#0' => const CustomOffstage(), + '73#0' => const CustomOpacity(), + '83#0' => const CustomOverflowBox(), + '74#0' => const PaddingAll(), + '74#1' => const PaddingOnly(), + '74#2' => const PaddingSymmetric(), + '296#0' => const PhysicalModelDemo(), + '279#0' => const PhysicalShapeDemo(), + '264#0' => const RepaintBoundaryDemo(), + '264#1' => const RepaintBoundarySave(), + '72#0' => const CustomRotatedBox(), + '277#0' => const RadialShaderMask(), + '277#1' => const LinearShaderMask(), + '294#0' => const SizeChangedLayoutNotifierDemo(), + '76#0' => const CustomSizedBox(), + '84#0' => const CustomSizedOverflowBox(), + '78#0' => const SkewTransform(), + '78#1' => const TranslationTransform(), + '78#2' => const ScaleTransform(), + '78#3' => const RotateTransform(), + '78#4' => const R3C2(), + '81#0' => const CustomUnConstrainedBox(), + '302#0' => const CupertinoSliverNavigationBarDemo(), + '303#0' => const CupertinoSliverRefreshControlDemo(), + '183#0' => const CustomScrollViewDemo(), + '209#0' => const DecorationSliverDemo(), + '196#0' => const FlexibleSpaceBarDemo(), + '309#0' => const PinnedHeaderSliverNode1(), + '309#1' => const PinnedHeaderSliverNode2(), + '309#2' => const PinnedHeaderSliverNode3(), + '301#0' => const SliverAnimatedListDemo(), + '184#0' => const SliverAppBarDemo(), + '270#0' => const SliverConstrainedCrossAxisDemo(), + '271#0' => const SliverCrossAxisExpandedDemo(), + '269#0' => const SliverCrossAxisGroupDemo(), + '306#0' => const SliverFillRemainingDemo(), + '187#0' => const SliverFillViewportDemo(), + '186#0' => const SliverFixedExtentListDemo(), + '188#0' => const SliverGirdDemo(), + '305#0' => const SliverIgnorePointerDemo(), + '304#0' => const SliverLayoutBuilderDemo(), + '185#0' => const SliverListDemo(), + '268#0' => const SliverMainAxisGroupDemo(), + '192#0' => const SliverOpacityDemo(), + '307#0' => const SliverOverlapAbsorberDemo(), + '308#0' => const SliverOverlapInjectorDemo(), + '191#0' => const SliverPaddingDemo(), + '190#0' => const SliverPersistentHeaderDemo(), + '314#0' => const SliverPrototypeExtentListDemo(), + '189#0' => const SliverToBoxAdapterDemo(), + '348#0' => const SliverWithKeepAliveWidgetDemo(), + '111#0' => const CustomAlignTransition(), + '120#0' => const CustomAnimatedAlign(), + '228#0' => const AnimatedBuilderDemo(), + '123#0' => const CustomAnimatedContainer(), + '100#0' => const CustomAnimatedCrossFade(), + '100#1' => const CurveAnimatedCrossFade(), + '124#0' => const CustomAnimatedDefaultTextStyle(), + '117#0' => const CustomAnimatedList(), + '227#0' => const AnimatedModalBarrierDemo(), + '118#0' => const CustomAnimatedOpacity(), + '119#0' => const CustomAnimatedPadding(), + '225#0' => const AnimatedPhysicalModelDemo(), + '121#0' => const CustomAnimatedPositioned(), + '122#0' => const CustomAnimatedPositionedDirectional(), + '116#0' => const CustomAnimatedSwitcher(), + '224#0' => const AnimatedThemeDemo(), + '57#0' => const CustomAppBar(), + '57#1' => const TabAppBar(), + '239#0' => const AutomaticKeepAliveDemo(), + '61#0' => const CustomBottomAppBar(), + '60#0' => const CustomBottomNavigationBar(), + '60#1' => const BottomNavigationBarWithPageView(), + '237#0' => const CarouselNode1(), + '237#1' => const CarouselNode2(), + '39#0' => const CustomCheckbox(), + '39#1' => const TristateCheckBok(), + '46#0' => const CustomCircularProgressIndicator(), + '48#0' => const CustomCupertinoActivityIndicator(), + '156#0' => const CustomCupertinoApp(), + '24#0' => const CustomCupertinoButton(), + '143#0' => const CustomCupertinoContextMenu(), + '144#0' => const CustomCupertinoContextMenuAction(), + '137#0' => const CustomCupertinoDatePicker(), + '62#0' => const CustomCupertinoNavigationBar(), + '157#0' => const CustomCupertinoPageScaffold(), + '139#0' => const CustomCupertinoPicker(), + '195#0' => const CustomCupertinoScrollbar(), + '262#0' => const CupertinoSegmentedControlDemo(), + '262#1' => const CupertinoSegmentedControlColor(), + '43#0' => const CustomCupertinoSlider(), + '256#0' => const CupertinoSlidingSegmentedControlDemo(), + '41#0' => const CustomCupertinoSwitch(), + '63#0' => const CustomCupertinoTabBar(), + '158#0' => const CustomCupertinoTabScaffold(), + '229#0' => const CupertinoTabViewDemo(), + '245#0' => const CupertinoTextFieldDemo(), + '245#1' => const CupertinoTextFieldStyle(), + '138#0' => const CustomCupertinoTimerPicker(), + '339#0' => const DateRangePickerDialogDemo(), + '339#1' => const DiyDateRangePickerDialogDemo(), + '113#0' => const CustomDecoratedBoxTransition(), + '230#0' => const DefaultTabControllerDemo(), + '114#0' => const CustomDefaultTextStyleTransition(), + '176#0' => const CustomDismissible(), + '176#1' => const DirectionDismissible(), + '103#0' => const CustomDraggable(), + '103#1' => const DraggablePage(), + '103#2' => const DeleteDraggable(), + '252#0' => const DraggableScrollableSheetDemo(), + '104#0' => const CustomDragTarget(), + '257#0' => const DrawerControllerDemo(), + '55#0' => const CustomDropDownButton(), + '55#1' => const StyleDropDownButton(), + '223#0' => const DropdownButtonFormFieldDemo(), + '370#0' => const DropdownMenuNode1(), + '370#1' => const DropdownMenuNode2(), + '370#2' => const DropdownMenuNode3(), + '244#0' => const EditableTextDemo(), + '354#0' => const ElevatedButtonDemo(), + '354#1' => const ElevatedButtonStyleDemo(), + '51#0' => const CustomExpandIcon(), + '178#0' => const CustomExpansionPanelList(), + '52#0' => const CustomExpansionTile(), + '198#0' => const CustomForm(), + '222#0' => const FormFieldDemo(), + '172#0' => const CustomFutureBuilder(), + '250#0' => const GlowingOverscrollIndicatorDemo(), + '171#0' => const CustomHero(), + '38#0' => const LoadImage(), + '38#1' => const FitImage(), + '38#2' => const AlignmentImage(), + '38#3' => const BlendModeImage(), + '38#4' => const RepeatImage(), + '38#5' => const CenterSliceImage(), + '152#0' => const CustomInk(), + '152#1' => const InkImage(), + '149#0' => const CustomInkResponse(), + '149#1' => const ColorInkResponse(), + '150#0' => const CustomInkWell(), + '150#1' => const ColorInkWell(), + '231#0' => const InputDecoratorDemo(), + '351#0' => const InteractiveViewerDemo(), + '351#1' => const InteractiveViewerDemo2(), + '351#2' => const InteractiveViewerDemo3(), + '145#0' => const CustomLicensePage(), + '47#0' => const CustomLinearProgressIndicator(), + '179#0' => const CustomListWheelScrollView(), + '105#0' => const CustomLongPressDraggable(), + '160#0' => const CustomMaterial(), + '160#1' => const ShapeMaterial(), + '65#0' => const MaterialAppDemo(), + '261#0' => const MergeableMaterialDemo(), + '135#0' => const CustomMonthPicker(), + '293#0' => const MouseRegionDemo(), + '358#0' => const CustomNavigationRail(), + '358#1' => const ExtendableNavigationRail(), + '358#2' => const DarkNavigationRail(), + '232#0' => const NavigatorDemo(), + '251#0' => const NestedScrollViewDemo(), + '355#0' => const OutlinedButtonDemo(), + '355#1' => const OutlinedButtonStyleDemo(), + '182#0' => const CustomOverlay(), + '165#0' => const CustomPageView(), + '165#1' => const DirectionPageView(), + '165#2' => const CtrlPageView(), + '235#0' => const PaginatedDataTableDemo(), + '56#0' => const CustomPopupMenuButton(), + '174#0' => const CustomPopupMenuDivider(), + '93#0' => const CustomPositionedTransition(), + '45#0' => const CustomRadio(), + '44#0' => const CustomRangeSlider(), + '153#0' => const PressRawChip(), + '153#1' => const SelectRawChip(), + '248#0' => const RawGestureDetectorDemo(), + '254#0' => const RawKeyboardListenerDemo(), + '175#0' => const CustomRawMaterialButton(), + '175#1' => const ShapeRawMaterialButton(), + '49#0' => const CustomRefreshIndicator(), + '115#0' => const CustomRelativePositionedTransition(), + '177#0' => const CustomReorderableListView(), + '177#1' => const DirectionReorderableListView(), + '90#0' => const CustomRotationTransition(), + '64#0' => const CustomScaffold(), + '91#0' => const CustomScaleTransition(), + '253#0' => const ScrollableDemo(), + '194#0' => const CustomScrollbar(), + '53#0' => const CustomSelectableText(), + '53#1' => const AlignSelectableText(), + '92#0' => const CustomSizeTransition(), + '42#0' => const CustomSlider(), + '42#1' => const DivisionsSlider(), + '112#0' => const CustomSlideTransition(), + '242#0' => const StatefulBuilderDemo(), + '233#0' => const StatusTransitionWidgetDemo(), + '200#0' => const StepperDemo(), + '200#1' => const VerticalStepper(), + '173#0' => const CustomStreamBuilder(), + '40#0' => const CustomSwitch(), + '40#1' => const ImageSwitch(), + '59#0' => const CustomTabBarView(), + '151#0' => const CustomTableRowInkWell(), + '353#0' => const TextButtonDemo(), + '353#1' => const TextButtonStyleDemo(), + '54#0' => const CustomTextField(), + '54#1' => const CursorTextField(), + '54#2' => const ComplexTextField(), + '199#0' => const CustomTextFormField(), + '50#0' => const CustomTooltip(), + '50#1' => const DecorationTooltip(), + '226#0' => const TweenAnimationBuilderDemo(), + '243#0' => const UniqueWidgetDemo(), + '255#0' => const ValueListenableBuilderDemo(), + '234#0' => const WidgetInspectorDemo(), + '236#0' => const WidgetsAppDemo(), + '170#0' => const CustomWillPopScope(), + '136#0' => const CustomYearPicker(), + '130#0' => const CustomAboutDialog(), + '193#0' => const AboutListTileDemo(), + '13#0' => const CustomActionChip(), + '127#0' => const CustomAlertDialog(), + '125#0' => const CustomAnimatedIcon(), + '356#0' => const AutocompleteDemo(), + '356#1' => const AutocompleteType(), + '31#0' => const CustomBackButton(), + '272#0' => const BackButtonIconDemo(), + '258#0' => const BadgeDemo(), + '258#1' => const BadgeLabelDemo(), + '258#2' => const BadgeAlignOffsetDemo(), + '5#0' => const CustomBanner(), + '142#0' => const CustomBottomSheet(), + '350#0' => const BoxScrollViewDemo(), + '202#0' => const BuilderDemo(), + '29#0' => const CustomButtonBar(), + '29#1' => const PaddingButtonBar(), + '3#0' => const CustomCard(), + '3#1' => const ShapeCard(), + '17#0' => const CustomCheckBoxListTile(), + '17#1' => const SelectCheckBoxListTile(), + '17#2' => const DenseCheckBoxListTile(), + '215#0' => const CheckedModeBannerDemo(), + '11#0' => const CustomChip(), + '11#1' => const ColorOfChip(), + '11#2' => const DeleteOfChip(), + '12#0' => const CustomChoiceChip(), + '9#0' => const CustomCircleAvatar(), + '32#0' => const CustomCloseButton(), + '274#0' => const CloseButtonIconDemo(), + '1#0' => const CustomContainer(), + '1#1' => const ContainerWithChild(), + '1#2' => const ContainerAlignment(), + '1#3' => const ContainerDecoration(), + '1#4' => const ContainerTransform(), + '1#5' => const ContainerConstraints(), + '131#0' => const CustomCupertinoActionSheet(), + '132#0' => const CustomCupertinoActionSheetAction(), + '129#0' => const CustomCupertinoAlertDialog(), + '352#0' => const CupertinoDialogActionDemo(), + '219#0' => const CupertinoFullscreenDialogTransitionDemo(), + '218#0' => const CupertinoNavigationBarBackButtonDemo(), + '216#0' => const CupertinoPageTransitionDemo(), + '217#0' => const CupertinoPopupSurfaceDemo(), + '169#0' => const TextCupertinoTheme(), + '169#1' => const CustomCupertinoTheme(), + '102#0' => const CustomDataTable(), + '102#1' => const SortDataTable(), + '134#0' => const CustomDayPicker(), + '126#0' => const CustomDialog(), + '34#0' => const CustomDivider(), + '34#1' => const HeightDivider(), + '221#0' => const DraggableScrollableActuatorDemo(), + '154#0' => const CustomDrawer(), + '276#0' => const DrawerButtonDemo(), + '273#0' => const DrawerButtonIconDemo(), + '155#0' => const CustomDrawerHeader(), + '361#0' => const EndDrawerButtonDemo(), + '275#0' => const EndDrawerButtonIconDemo(), + '8#0' => const CustomFadeInImage(), + '15#0' => const CustomFilterChip(), + '25#0' => const CustomFlatButton(), + '28#0' => const CustomFAB(), + '28#1' => const MiniFAB(), + '28#2' => const ShapeFAB(), + '4#0' => const CustomFlutterLogo(), + '4#1' => const FlutterLogoWithText(), + '146#0' => const CustomGestureDetector(), + '146#1' => const TapGestureDetector(), + '146#2' => const PanGestureDetector(), + '37#0' => const CustomGridPaper(), + '37#1' => const DivisionsGridPaper(), + '21#0' => const CustomGridTile(), + '20#0' => const CustomGridTileBar(), + '163#0' => const CustomGridView(), + '163#1' => const HorizontalGridView(), + '163#2' => const ExtentGridView(), + '163#3' => const BuilderGridView(), + '213#0' => const HtmlElementViewDemo(), + '6#0' => const CustomIcon(), + '6#1' => const MyIcon(), + '30#0' => const CustomIconButton(), + '7#0' => const CustomImageIcon(), + '14#0' => const PressInputChip(), + '14#1' => const SelectInputChip(), + '147#0' => const CustomListener(), + '16#0' => const CustomListTile(), + '16#1' => const SelectListTile(), + '16#2' => const DenseListTile(), + '162#0' => const CustomListView(), + '162#1' => const HorizontalListView(), + '162#2' => const BuilderListView(), + '162#3' => const SeparatedListView(), + '211#0' => const MaterialBannerDemo(), + '211#1' => const MaterialBannerDemoTwo(), + '23#0' => const CustomMaterialButton(), + '23#1' => const LongPressMaterialButton(), + '23#2' => const ShapeMaterialButton(), + '212#0' => const ModalBarrierDemo(), + '214#0' => const NavigationToolbarDemo(), + '220#0' => const NotificationListenerDemo(), + '220#1' => const NotificationListenerUpdate(), + '203#0' => const OrientationBuilderDemo(), + '27#0' => const CustomOutlineButton(), + '210#0' => const PageStorageDemo(), + '36#0' => const CustomPlaceholder(), + '36#1' => const FallbackPlaceholder(), + '159#0' => const CustomPositionedDirectional(), + '204#0' => const CustomPreferredSize(), + '204#1' => const AdapterPreferredSize(), + '19#0' => const CustomRadioListTile(), + '19#1' => const DenseRadioListTile(), + '26#0' => const CustomRaisedButton(), + '360#0' => const MagnifierCircleShape(), + '360#1' => const MagnifierStarShape(), + '207#0' => const SafeAreaDemo(), + '349#0' => const ScrollViewDemo(), + '128#0' => const CustomSimpleDialog(), + '133#0' => const CustomSimpleDialogOption(), + '164#0' => const CustomSingleChildScrollView(), + '164#1' => const DirectionSingleChildScrollView(), + '140#0' => const CustomSnackBar(), + '141#0' => const CustomSnackBarAction(), + '107#0' => const OneSpacer(), + '107#1' => const ManySpacer(), + '18#0' => const CustomSwitchListTile(), + '18#1' => const SelectSwitchListTile(), + '18#2' => const DenseSwitchListTile(), + '148#0' => const CustomTab(), + '58#0' => const CustomTabBar(), + '58#1' => const NoShadowTabBarDemo(), + '205#0' => const TabPageSelectorDemo(), + '206#0' => const TabPageSelectorIndicatorDemo(), + '2#0' => const TextDemo1(), + '2#1' => const TextDemo2(), + '2#2' => const DecorationText(), + '2#3' => const TextAlignText(), + '2#4' => const TextDirectionText(), + '2#5' => const SoftWrapText(), + '168#0' => const TextThemeDemo(), + '168#1' => const CustomTheme(), + '208#0' => const TitleDemo(), + '33#0' => const CustomToggleButtons(), + '33#1' => const ColorToggleButtons(), + '33#2' => const ProToggleButtons(), + '22#0' => const CustomUAGHP(), + '22#1' => const ProUAGHP(), + '35#0' => const CustomVerticalDivider(), + '35#1' => const WidthVerticalDivider(), + '10#0' => const CustomVisibility(), + '10#1' => const ReplacementVisibility(), + _ => const SizedBox(), + }; +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/utils/dialog_about.dart b/modules/widget_system/widgets/lib/utils/dialog_about.dart index c20a42a1..81b3023e 100644 --- a/modules/widget_system/widgets/lib/utils/dialog_about.dart +++ b/modules/widget_system/widgets/lib/utils/dialog_about.dart @@ -2,7 +2,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; class DialogAbout extends StatelessWidget { - const DialogAbout({Key? key}) : super(key: key); + const DialogAbout({super.key}); static show(BuildContext context){ showDialog(//内置方法,创建对话弹框 @@ -29,14 +29,10 @@ class DialogAbout extends StatelessWidget { ) ], ); - Widget content = Column( + Widget content = const Column( //内容 mainAxisSize: MainAxisSize.min, - children: const [ -// Image.asset( -// "assets/images/icon_flutter.png", -// width: 50, -// ), + children: [ FlutterLogo(size: 50,), SizedBox( height: 20, @@ -45,12 +41,11 @@ class DialogAbout extends StatelessWidget { "Flutter Unit ${StrUnit.version}", ), ]); - return AlertDialog(title: title, content: content, actions: [ - //左下角 + return AlertDialog(title: title, content: content, actions: const [ Padding( - padding: const EdgeInsets.only(right:15.0,bottom: 10,top: 10), + padding: EdgeInsets.only(right:15.0,bottom: 10,top: 10), child: Column( - children: const[ + children: [ Text( "Power By GF·J·Toly\n张风捷特烈", textAlign: TextAlign.center, diff --git a/modules/widget_system/widgets/lib/widgets.dart b/modules/widget_system/widgets/lib/widgets.dart index 0f0ee752..2a9b17f7 100644 --- a/modules/widget_system/widgets/lib/widgets.dart +++ b/modules/widget_system/widgets/lib/widgets.dart @@ -1,10 +1,10 @@ library widgets; -export 'widgets_map.dart'; +export 'node_display_map.dart'; export 'exp/other_unit.dart'; export 'exp/proxy_unit.dart'; export 'exp/render_object_unit.dart' hide Box50,CornerCustomMultiChildLayout,CornerType; export 'exp/sliver_unit.dart'; -export 'exp/stateful_unit.dart' hide ListModel,ColorBox,CardItem; -export 'exp/stateless_unit.dart' hide User; \ No newline at end of file +export 'exp/stateful_unit.dart' hide ListModel; +export 'exp/stateless_unit.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/widgets_map.dart b/modules/widget_system/widgets/lib/widgets_map.dart deleted file mode 100644 index a07c0da9..00000000 --- a/modules/widget_system/widgets/lib/widgets_map.dart +++ /dev/null @@ -1,1486 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'exp/other_unit.dart'; -import 'exp/proxy_unit.dart'; -import 'exp/render_object_unit.dart'; -import 'exp/sliver_unit.dart'; -import 'exp/stateful_unit.dart'; -import 'exp/stateless_unit.dart'; - -/// AUTO CREATED BY [张风捷特烈] , DON'T MODIFY! - -class WidgetsMap { - static List map(String name) { - switch (name) { - case "Container": - return [ - const CustomContainer(), - const ContainerWithChild(), - const ContainerAlignment(), - ContainerDecoration(), - const ContainerTransform(), - const ContainerConstraints() - ]; - case "DropdownMenu": - return [ - const DropdownMenuNode1(), - const DropdownMenuNode2(), - const DropdownMenuNode3(), - ]; - case "CarouselView": - return [ - const CarouselNode1(), - const CarouselNode2(), - ]; - case "PinnedHeaderSliver": - return [ - const PinnedHeaderSliverNode1(), - const PinnedHeaderSliverNode2(), - const PinnedHeaderSliverNode3(), - ]; - case "CupertinoSegmentedControl": - return [ - const CupertinoSegmentedControlDemo(), - const CupertinoSegmentedControlColor() - ]; - case "ImageFiltered": - return [ - const ImageFilteredBlur(), - const ImageFilteredColor(), - const ImageFilteredMatrix() - ]; - case "Autocomplete": - return [const AutocompleteDemo(), const AutocompleteType()]; - case "Badge": - return [ - const BadgeDemo(), - const BadgeLabelDemo(), - const BadgeAlignOffsetDemo(), - ]; - case "DateRangePickerDialog": - return [ - const DateRangePickerDialogDemo(), - const DiyDateRangePickerDialogDemo() - ]; - case "CompositedTransformTarget": - return [ - const CompositedTransformTargetDemo(), - ]; - case "CompositedTransformFollower": - return [ - const CompositedTransformFollowerDemo(), - ]; - case "PrimaryScrollController": - return [ - const PrimaryScrollControllerDemo(), - ]; - case "CupertinoFullscreenDialogTransition": - return [ - const CupertinoFullscreenDialogTransitionDemo(), - ]; - case "CupertinoPageTransition": - return [ - const CupertinoPageTransitionDemo(), - ]; - case "HtmlElementView": - return [ - const HtmlElementViewDemo(), - ]; - case "Text": - return [ - const CustomText(), - const ShadowText(), - const DecorationText(), - const TextAlignText(), - const TextDirectionText(), - const SoftWrapText() - ]; - case "Card": - return [ - const CustomCard(), - const ShapeCard(), - ]; - case "ElevatedButton": - return [ - const ElevatedButtonDemo(), - const ElevatedButtonStyleDemo(), - ]; - case "TextButton": - return [ - const TextButtonDemo(), - const TextButtonStyleDemo(), - ]; - case "OutlinedButton": - return [ - const OutlinedButtonDemo(), - const OutlinedButtonStyleDemo(), - ]; - case "FlutterLogo": - return [ - const CustomFlutterLogo(), - const FlutterLogoWithText(), - ]; - case "Banner": - return [ - CustomBanner(), - ]; - case "UniqueWidget": - return [ - const UniqueWidgetDemo(), - ]; - case "ShrinkWrappingViewport": - return [ - const ShrinkWrappingViewportDemo(), - ]; - case "NestedScrollViewViewport": - return [ - const NestedScrollViewViewportDemo(), - ]; - case "ParentDataWidget": - return [ - const ParentDataWidgetDemo(), - ]; - case "AutomaticKeepAlive": - return [ - AutomaticKeepAliveDemo(), - ]; - case "StatusTransitionWidget": - return [ - const StatusTransitionWidgetDemo(), - ]; - case "KeepAlive": - return [ - KeepAliveDemo(), - ]; - case "ListWheelViewport": - return [ - ListWheelViewportDemo(), - ListWheelViewportDemo2(), - ListWheelViewportDemo3(), - ListWheelViewportDemo4(), - ]; - case "InheritedTheme": - return [ - const InheritedThemeDemo(), - ]; - case "ModalBarrier": - return [ - const ModalBarrierDemo(), - ]; - case "AnimatedModalBarrier": - return [ - const AnimatedModalBarrierDemo(), - ]; - case "DefaultAssetBundle": - return [ - const DefaultAssetBundleDemo(), - ]; - case "DropdownButtonFormField": - return [ - const DropdownButtonFormFieldDemo(), - ]; - case "FormField": - return [ - const FormFieldDemo(), - ]; - case "PaginatedDataTable": - return [ - const PaginatedDataTableDemo(), - ]; - case "InheritedWidget": - return [ - const InheritedWidgetDemo(), - ]; - case "ScrollView": - return [ - const ScrollViewDemo(), - ]; - case "SliverWithKeepAliveWidget": - return [ - const SliverWithKeepAliveWidgetDemo(), - ]; - case "BoxScrollView": - return [ - const BoxScrollViewDemo(), - ]; - case "CupertinoUserInterfaceLevel": - return [ - const CupertinoUserInterfaceLevelDemo(), - ]; - case "CupertinoSliverNavigationBar": - return [ - CupertinoSliverNavigationBarDemo(), - ]; - case "CupertinoSliverRefreshControl": - return [ - const CupertinoSliverRefreshControlDemo(), - ]; - case "SliverAnimatedList": - return [ - const SliverAnimatedListDemo(), - ]; - case "SliverFillRemaining": - return [ - const SliverFillRemainingDemo(), - ]; - case "SliverIgnorePointer": - return [ - const SliverIgnorePointerDemo(), - ]; - case "Viewport": - return [ - ViewportDemo(), - ]; - case "CupertinoPopupSurface": - return [ - CupertinoPopupSurfaceDemo(), - ]; - case "RenderObjectToWidgetAdapter": - return [ - const RenderObjectToWidgetAdapterDemo(), - ]; - case "SliverPrototypeExtentList": - return [ - const SliverPrototypeExtentListDemo(), - ]; - case "InputDecorator": - return [ - const InputDecoratorDemo(), - ]; - case "ColoredBox": - return [ - const ColoredBoxDemo(), - ]; - case "StatefulBuilder": - return [ - const StatefulBuilderDemo(), - ]; - case "RawKeyboardListener": - return [ - const RawKeyboardListenerDemo(), - ]; - case "RawGestureDetector": - return [ - const RawGestureDetectorDemo(), - ]; - case "SafeArea": - return [ - const SafeAreaDemo(), - ]; - case "AnimatedBuilder": - return [ - const AnimatedBuilderDemo(), - ]; - case "TweenAnimationBuilder": - return [ - const TweenAnimationBuilderDemo(), - ]; - case "WidgetInspector": - return [ - const WidgetInspectorDemo(), - ]; - case "PageStorage": - return [ - const PageStorageDemo(), - ]; - case "NotificationListener": - return [ - const NotificationListenerDemo(), - const NotificationListenerUpdate() - ]; - - case "Scrollable": - return [ - ScrollableDemo(), - ]; - case "PhysicalModel": - return [ - const PhysicalModelDemo(), - ]; - case "Directionality": - return [ - const DirectionalityDemo(), - ]; - case "AnimatedTheme": - return [ - const AnimatedThemeDemo(), - ]; - case "CupertinoSlidingSegmentedControl": - return [ - const CupertinoSlidingSegmentedControlDemo(), - ]; - case "WidgetsApp": - return [ - const WidgetsAppDemo(), - ]; - case "TableCell": - return [ - const TableCellDemo(), - ]; - - case "EditableText": - return [ - const EditableTextDemo(), - ]; - case "PhysicalShape": - return [ - const PhysicalShapeDemo(), - ]; - case "ListBody": - return [ - const ListBodyDemo(), - ]; - case "FractionalTranslation": - return [ - const FractionalTranslationDemo(), - ]; - case "MouseRegion": - return [ - const MouseRegionDemo(), - ]; - case "TabPageSelector": - return [ - const TabPageSelectorDemo(), - ]; - case "CupertinoNavigationBarBackButton": - return [ - const CupertinoNavigationBarBackButtonDemo(), - ]; - case "TabPageSelectorIndicator": - return [ - const TabPageSelectorIndicatorDemo(), - ]; - case "Title": - return [ - const TitleDemo(), - ]; - case "ToggleButtonsTheme": - return [ - const ToggleButtonsThemeDemo(), - ]; - case "PerformanceOverlay": - return [ - const PerformanceOverlayDemo(), - ]; - case "NavigationToolbar": - return [ - const NavigationToolbarDemo(), - ]; - case "CupertinoDialogAction": - return [ - const CupertinoDialogActionDemo(), - ]; - case "ButtonBarTheme": - return [ - const ButtonBarThemeDemo(), - ]; - case "RawImage": - return [ - const RawImageDemo(), - ]; - case "TooltipTheme": - return [ - const TooltipThemeDemo(), - ]; - case "CupertinoTextField": - return [ - const CupertinoTextFieldDemo(), - const CupertinoTextFieldStyle(), - ]; - case "MaterialBanner": - return [ - const MaterialBannerDemo(), - const MaterialBannerDemoTwo(), - ]; - case "OrientationBuilder": - return [ - const OrientationBuilderDemo(), - ]; - case "Icon": - return [ - const CustomIcon(), - const MyIcon(), - ]; - case "ImageIcon": - return [ - const CustomImageIcon(), - ]; - case "FadeInImage": - return [ - const CustomFadeInImage(), - ]; - case "InteractiveViewer": - return [ - const InteractiveViewerDemo(), - const InteractiveViewerDemo2(), - const InteractiveViewerDemo3(), - ]; - case "CircleAvatar": - return [ - const CustomCircleAvatar(), - ]; - case "SliverLayoutBuilder": - return [ - const SliverLayoutBuilderDemo(), - ]; - case "Visibility": - return [ - const CustomVisibility(), - const ReplacementVisibility(), - ]; - case "RepaintBoundary": - return [ - const RepaintBoundaryDemo(), - RepaintBoundarySave(), - ]; - case "Chip": - return [ - const CustomChip(), - const ColorOfChip(), - const DeleteOfChip(), - ]; - case "ChoiceChip": - return [const CustomChoiceChip()]; - case "ListTileTheme": - return [const ListTileThemeDemo()]; - case "ValueListenableBuilder": - return [ValueListenableBuilderDemo()]; - case "ActionChip": - return [const CustomActionChip()]; - case "MaterialBannerTheme": - return [const MaterialBannerThemeDemo()]; - case "PopupMenuTheme": - return [const PopupMenuThemeDemo()]; - case "InputChip": - return [const PressInputChip(), const SelectInputChip()]; - case "FilterChip": - return [const CustomFilterChip()]; - case "IntrinsicHeight": - return [const IntrinsicHeightDemo()]; - case "IntrinsicWidth": - return [const IntrinsicWidthDemo()]; - case "ChipTheme": - return [const ChipThemeDemo()]; - case "ListTile": - return [ - const CustomListTile(), - const SelectListTile(), - const DenseListTile() - ]; - case "CheckboxListTile": - return [ - const CustomCheckBoxListTile(), - const SelectCheckBoxListTile(), - const DenseCheckBoxListTile() - ]; - case "SwitchListTile": - return [ - const CustomSwitchListTile(), - const SelectSwitchListTile(), - const DenseSwitchListTile() - ]; - - case "RadioListTile": - return [ - const CustomRadioListTile(), - const DenseRadioListTile(), - ]; - - case "GridTileBar": - return [ - const CustomGridTileBar(), - ]; - - case "GridTile": - return [ - const CustomGridTile(), - ]; - case "UserAccountsDrawerHeader": - return [ - const CustomUAGHP(), - const ProUAGHP(), - ]; - - case "MaterialButton": - return [ - const CustomMaterialButton(), - const LongPressMaterialButton(), - const ShapeMaterialButton(), - ]; - case "CupertinoButton": - return [CustomCupertinoButton()]; - case "FlatButton": - return [const CustomFlatButton()]; - case "RaisedButton": - return [const CustomRaisedButton()]; - case "OutlineButton": - return [const CustomOutlineButton()]; - case "FloatingActionButton": - return [const CustomFAB(), const MiniFAB(), const ShapeFAB()]; - - case "ButtonBar": - return [ - const CustomButtonBar(), - const PaddingButtonBar(), - ]; - - case "IconButton": - return [ - const CustomIconButton(), - ]; - case "BackButton": - return [ - CustomBackButton(), - ]; - - case "CloseButton": - return [ - const CustomCloseButton(), - ]; - case "ToggleButtons": - return [ - const CustomToggleButtons(), - const ColorToggleButtons(), - const ProToggleButtons(), - ]; - case "NestedScrollView": - return [ - const NestedScrollViewDemo(), - ]; - case "SliverOverlapAbsorber": - return [ - const SliverOverlapAbsorberDemo(), - ]; - case "SliverOverlapInjector": - return [ - const SliverOverlapInjectorDemo(), - ]; - case "Divider": - return [ - const CustomDivider(), - const HeightDivider(), - ]; - case "VerticalDivider": - return [ - const CustomVerticalDivider(), - const WidthVerticalDivider(), - ]; - case "Placeholder": - return [ - const CustomPlaceholder(), - const FallbackPlaceholder(), - ]; - case "GridPaper": - return [ - const CustomGridPaper(), - const DivisionsGridPaper(), - ]; - case "Image": - return [ - const LoadImage(), - const FitImage(), - const AlignmentImage(), - const BlendModeImage(), - const RepeatImage(), - const CenterSliceImage(), - ]; - case "Checkbox": - return [ - const CustomCheckbox(), - const TristateCheckBok(), - ]; - case "Switch": - return [ - const CustomSwitch(), - const ImageSwitch(), - ]; - case "CupertinoSwitch": - return [ - const CustomCupertinoSwitch(), - ]; - case "Slider": - return [ - const CustomSlider(), - const DivisionsSlider(), - ]; - case "CupertinoSlider": - return [ - const CustomCupertinoSlider(), - ]; - case "RangeSlider": - return [ - const CustomRangeSlider(), - ]; - case "Radio": - return [ - const CustomRadio(), - ]; - case "CustomMultiChildLayout": - return [ - const CustomMultiChildLayoutNode1(), - ]; - case "LayoutId": - return [ - const LayoutIdDemo(), - ]; - case "CircularProgressIndicator": - return [ - const CustomCircularProgressIndicator(), - ]; - case "LinearProgressIndicator": - return [ - const CustomLinearProgressIndicator(), - ]; - case "CupertinoActivityIndicator": - return [ - const CustomCupertinoActivityIndicator(), - ]; - case "RefreshIndicator": - return [ - const CustomRefreshIndicator(), - ]; - case "Tooltip": - return [ - const CustomTooltip(), - const DecorationTooltip(), - ]; - case "ExpandIcon": - return [ - const CustomExpandIcon(), - ]; - case "ExpansionTile": - return [ - const CustomExpansionTile(), - ]; - - case "AnnotatedRegion": - return [ - const AnnotatedRegionDemo(), - ]; - case "CheckedModeBanner": - return [ - const CheckedModeBannerDemo(), - ]; - case "DefaultTabController": - return [ - const DefaultTabControllerDemo(), - ]; - case "CupertinoTabView": - return [ - const CupertinoTabViewDemo(), - ]; - case "CupertinoTextSelectionToolbar": - return [ - const CupertinoTextSelectionToolbarDemo(), - ]; - case "DraggableScrollableActuator": - return [ - const DraggableScrollableActuatorDemo(), - ]; - case "GlowingOverscrollIndicator": - return [ - GlowingOverscrollIndicatorDemo(), - ]; - case "DraggableScrollableSheet": - return [ - const DraggableScrollableSheetDemo(), - ]; - case "DrawerController": - return [ - const DrawerControllerDemo(), - ]; - case "MergeableMaterial": - return [ - const MergeableMaterialDemo(), - ]; - case "SizeChangedLayoutNotifier": - return [ - const SizeChangedLayoutNotifierDemo(), - ]; - case "SelectableText": - return [ - const CustomSelectableText(), - const AlignSelectableText(), - ]; - case "TextField": - return [ - const CustomTextField(), - const CursorTextField(), - const ComplexTextField(), - ]; - case "DropdownButton": - return [ - const CustomDropDownButton(), - const StyleDropDownButton(), - ]; - case "PopupMenuButton": - return [ - const CustomPopupMenuButton(), - ]; - case "AppBar": - return [ - const CustomAppBar(), - const TabAppBar(), - ]; - case "TabBar": - return [ - const CustomTabBar(), - const NoShadowTabBarDemo(), - ]; - case "TabBarView": - return [ - const CustomTabBarView(), - ]; - case "BottomNavigationBar": - return [ - const CustomBottomNavigationBar(), - const BottomNavigationBarWithPageView() - ]; - case "BottomAppBar": - return [ - const CustomBottomAppBar(), - ]; - case "CupertinoNavigationBar": - return [ - const CustomCupertinoNavigationBar(), - ]; - case "CupertinoTabBar": - return [ - const CustomCupertinoTabBar(), - ]; - case "Scaffold": - return [ - const CustomScaffold(), - ]; - case "MaterialApp": - return [ - const MaterialAppDemo(), - ]; - case "ClipOval": - return [ - const CustomClipOval(), - ]; - case "ClipRect": - return [ - const CustomClipRect(), - ]; - case "ClipRRect": - return [ - const CustomClipRRect(), - ]; - case "ClipPath": - return [ - const CustomClipPath(), - ]; - case "DecoratedBox": - return const [ - BoxDecorationDemo(), - ShapeImageDemo(), - BorderDemo(), - ShapeDecorationDemo(), - UnderlineTabIndicatorDemo(), - FlutterLogoDecorationDemo(), - ]; - case "Offstage": - return [ - const CustomOffstage(), - ]; - case "RotatedBox": - return [ - const CustomRotatedBox(), - ]; - case "Opacity": - return [ - const CustomOpacity(), - ]; - case "Padding": - return [ - const PaddingAll(), - const PaddingOnly(), - const PaddingSymmetric(), - ]; - case "Baseline": - return [ - const CustomBaseline(), - ]; - case "SizedBox": - return [ - const CustomSizedBox(), - ]; - case "AspectRatio": - return [ - const CustomAspectRatio(), - ]; - case "Transform": - return [ - const SkewTransform(), - const TranslationTransform(), - const ScaleTransform(), - const RotateTransform(), - const R3C2(), - ]; - case "LimitedBox": - return [ - const CustomLimitedBox(), - ]; - case "ConstrainedBox": - return [ - const CustomConstrainedBox(), - ]; - case "UnconstrainedBox": - return [ - const CustomUnConstrainedBox(), - ]; - case "FractionallySizedBox": - return [ - const CustomFractionallySizedBox(), - ]; - case "OverflowBox": - return [ - const CustomOverflowBox(), - ]; - case "SizedOverflowBox": - return [ - const CustomSizedOverflowBox(), - ]; - case "Align": - return [const CustomAlign(), const SinLayout()]; - case "Center": - return [ - const CustomCenter(), - ]; - case "FittedBox": - return [ - const CustomFittedBox(), - ]; - case "ColorFiltered": - return [ - const CustomColorFiltered(), - ]; - case "FadeTransition": - return [ - const CustomFadeTransition(), - ]; - case "RotationTransition": - return [ - const CustomRotationTransition(), - ]; - case "ScaleTransition": - return [ - const CustomScaleTransition(), - ]; - case "SizeTransition": - return [ - const CustomSizeTransition(), - ]; - case "PositionedTransition": - return [ - const CustomPositionedTransition(), - ]; - case "Flex": - return [ - FlexNode1(), - FlexNode2(), - FlexNode3(), - FlexNode4(), - FlexNode5(), - ]; - case "Row": - return [ - const CustomRow(), - ]; - case "Column": - return [ - const ColumnNode1(), - ]; - case "Stack": - return [const CustomStack(), const PositionedStack()]; - case "Wrap": - return [ - DirectionWrap(), - WrapAlignmentWrap(), - CrossAxisAlignmentWrap(), - TextDirectionWrap(), - VerticalDirectionWrap(), - ]; - case "Flow": - return [ - FlowNode1(), - FlowNode02.show, - ]; - case "AnimatedCrossFade": - return [ - const CustomAnimatedCrossFade(), - const CurveAnimatedCrossFade(), - ]; - case "RichText": - return [ - const CustomRichText(), - const RichTextWithWidget(), - ]; - case "DataTable": - return [ - CustomDataTable(), - const SortDataTable(), - ]; - case "Draggable": - return [ - const CustomDraggable(), - const DraggablePage(), - const DeleteDraggable(), - ]; - case "DragTarget": - return [ - const CustomDragTarget(), - ]; - case "LongPressDraggable": - return [ - const CustomLongPressDraggable(), - ]; - case "Expanded": - return [ - const CustomExpended(), - ]; - case "Spacer": - return [ - const OneSpacer(), - const ManySpacer(), - ]; - case "Positioned": - return [ - const CustomPositioned(), - ]; - case "Flexible": - return [ - const CustomFlexible(), - ]; - case "Table": - return [ - const CustomTable(), - ]; - case "AlignTransition": - return [ - const CustomAlignTransition(), - ]; - case "SlideTransition": - return [ - const CustomSlideTransition(), - ]; - case "DecoratedBoxTransition": - return [ - const CustomDecoratedBoxTransition(), - ]; - case "DefaultTextStyleTransition": - return [ - const CustomDefaultTextStyleTransition(), - ]; - case "RelativePositionedTransition": - return [ - const CustomRelativePositionedTransition(), - ]; - case "AnimatedSwitcher": - return [ - const CustomAnimatedSwitcher(), - ]; - case "AnimatedList": - return [ - const CustomAnimatedList(), - ]; - case "AnimatedOpacity": - return [ - const CustomAnimatedOpacity(), - ]; - case "AnimatedPadding": - return [ - const CustomAnimatedPadding(), - ]; - case "AnimatedAlign": - return [ - const CustomAnimatedAlign(), - ]; - case "AnimatedPositioned": - return [ - const CustomAnimatedPositioned(), - ]; - case "AnimatedPositionedDirectional": - return [ - const CustomAnimatedPositionedDirectional(), - ]; - case "AnimatedContainer": - return [ - const CustomAnimatedContainer(), - ]; - case "AnimatedDefaultTextStyle": - return [ - const CustomAnimatedDefaultTextStyle(), - ]; - case "AnimatedIcon": - return [ - const CustomAnimatedIcon(), - ]; - case "Dialog": - return [ - const CustomDialog(), - ]; - case "AlertDialog": - return [ - const CustomAlertDialog(), - ]; - case "SimpleDialog": - return [ - const CustomSimpleDialog(), - ]; - case "CupertinoAlertDialog": - return [ - const CustomCupertinoAlertDialog(), - ]; - case "AboutDialog": - return [ - const CustomAboutDialog(), - ]; - case "CupertinoActionSheet": - return [ - const CustomCupertinoActionSheet(), - ]; - case "CupertinoActionSheetAction": - return [ - const CustomCupertinoActionSheetAction(), - ]; - case "SimpleDialogOption": - return [ - const CustomSimpleDialogOption(), - ]; - case "DayPicker": - return [ - const CustomDayPicker(), - ]; - case "MonthPicker": - return [ - const CustomMonthPicker(), - ]; - case "YearPicker": - return [ - const CustomYearPicker(), - ]; - case "CupertinoDatePicker": - return [ - const CustomCupertinoDatePicker(), - ]; - case "CupertinoTimerPicker": - return [ - const CustomCupertinoTimerPicker(), - ]; - case "CupertinoPicker": - return [ - const CustomCupertinoPicker(), - ]; - case "SnackBar": - return [ - const CustomSnackBar(), - ]; - case "SnackBarAction": - return [ - const CustomSnackBarAction(), - ]; - case "BottomSheet": - return [ - const CustomBottomSheet(), - ]; - case "CupertinoContextMenu": - return [ - const CustomCupertinoContextMenu(), - ]; - case "CupertinoContextMenuAction": - return [ - const CustomCupertinoContextMenuAction(), - ]; - case "LicensePage": - return [ - const CustomLicensePage(), - ]; - case "Builder": - return [ - const BuilderDemo(), - ]; - case "GestureDetector": - return [ - const CustomGestureDetector(), - const TapGestureDetector(), - const PanGestureDetector(), - ]; - case "Listener": - return [ - const CustomListener(), - ]; - case "Tab": - return [ - const CustomTab(), - ]; - case "PreferredSize": - return [ - const CustomPreferredSize(), - const AdapterPreferredSize(), - ]; - case "InkResponse": - return [ - const CustomInkResponse(), - const ColorInkResponse(), - ]; - case "InkWell": - return [ - const CustomInkWell(), - const ColorInkWell(), - ]; - case "TableRowInkWell": - return [ - const CustomTableRowInkWell(), - ]; - case "Ink": - return [ - const CustomInk(), - const InkImage(), - ]; - case "RawChip": - return [ - const PressRawChip(), - const SelectRawChip(), - ]; - case "Drawer": - return [ - const CustomDrawer(), - ]; - case "DrawerHeader": - return [ - const CustomDrawerHeader(), - ]; - case "CupertinoApp": - return [ - const CustomCupertinoApp(), - ]; - case "CupertinoPageScaffold": - return [ - const CustomCupertinoPageScaffold(), - ]; - case "CupertinoTabScaffold": - return [ - const CustomCupertinoTabScaffold(), - ]; - case "PositionedDirectional": - return [ - const CustomPositionedDirectional(), - ]; - case "Material": - return [ - const CustomMaterial(), - const ShapeMaterial(), - ]; - case "IndexedStack": - return [ - const IndexedStackNode01(), - ]; - case "ListView": - return [ - CustomListView(), - HorizontalListView(), - SeparatedListView(), - BuilderListView(), - ]; - case "GridView": - return [ - CustomGridView(), - HorizontalGridView(), - ExtentGridView(), - BuilderGridView() - ]; - case "SingleChildScrollView": - return [ - CustomSingleChildScrollView(), - DirectionSingleChildScrollView(), - ]; - case "PageView": - return [ - CustomPageView(), - DirectionPageView(), - const CtrlPageView(), - ]; - case "CustomPaint": - return [ - const ClockPage(), - const PlayBezier3Page(), - ]; - case "MediaQuery": - return [ - const CustomMediaQuery(), - ]; - case "Theme": - return [const TextThemeDemo(), const CustomTheme()]; - case "CupertinoTheme": - return [const TextCupertinoTheme(), const CustomCupertinoTheme()]; - case "WillPopScope": - return [ - const CustomWillPopScope(), - ]; - case "Hero": - return [ - const CustomHero(), - ]; - case "FutureBuilder": - return [ - const CustomFutureBuilder(), - ]; - case "StreamBuilder": - return [ - const CustomStreamBuilder(), - ]; - case "PopupMenuDivider": - return [ - const CustomPopupMenuDivider(), - ]; - case "RawMaterialButton": - return [ - const CustomRawMaterialButton(), - const ShapeRawMaterialButton(), - ]; - case "Dismissible": - return [ - const CustomDismissible(), - const DirectionDismissible(), - ]; - case "ReorderableListView": - return [ - const CustomReorderableListView(), - const DirectionReorderableListView(), - ]; - case "ExpansionPanelList": - return [ - const CustomExpansionPanelList(), - ]; - case "ListWheelScrollView": - return [ - const CustomListWheelScrollView(), - ]; - case "ScrollConfiguration": - return [ - CustomScrollConfiguration(), - ]; - case "DropdownButtonHideUnderline": - return [ - const CustomDropDownButtonHideUnderline(), - ]; - case "Overlay": - return [ - const CustomOverlay(), - ]; - case "CustomScrollView": - return [ - CustomScrollViewDemo(), - ]; - case "SliverAppBar": - return [ - const SliverAppBarDemo(), - ]; - case "SliverList": - return [ - SliverListDemo(), - ]; - case "SliverFixedExtentList": - return [ - const SliverFixedExtentListDemo(), - ]; - case "SliverFillViewport": - return [ - const SliverFillViewportDemo(), - ]; - case "SliverGird": - return [ - SliverGirdDemo(), - ]; - case "SliverToBoxAdapter": - return [ - SliverToBoxAdapterDemo(), - ]; - case "SliverPersistentHeader": - return [ - SliverPersistentHeaderDemo(), - ]; - case "SliverPadding": - return [ - SliverPaddingDemo(), - ]; - case "SliverOpacity": - return [ - SliverOpacityDemo(), - ]; - case "AboutListTile": - return [ - const AboutListTileDemo(), - ]; - case "Scrollbar": - return [ - CustomScrollbar(), - ]; - case "CupertinoScrollbar": - return [ - CustomCupertinoScrollbar(), - ]; - case "FlexibleSpaceBar": - return [ - FlexibleSpaceBarDemo(), - ]; - case "ErrorWidget": - return [ - const ErrorWidgetDemo(), - ]; - case "Form": - return [ - const CustomForm(), - ]; - case "TextFormField": - return [ - const CustomTextFormField(), - ]; - case "Stepper": - return [ - const StepperDemo(), - const VerticalStepper(), - ]; - case "AnimatedSize": - return [ - const CustomAnimatedSize(), - ]; - case "ShaderMask": - return [ - const RadialShaderMask(), - const LinearShaderMask(), - ]; - case "DefaultTextStyle": - return [ - const DefaultTextStyleDemo(), - ]; - case "IconTheme": - return [ - const IconThemeDemo(), - ]; - case "ButtonTheme": - return [ - const ButtonThemeDemo(), - ]; - case "DividerTheme": - return [ - const DividerThemeDemo(), - ]; - case "Navigator": - return [ - const NavigatorDemo(), - ]; - case "SliderTheme": - return [ - const SliderThemeDemo(), - const DIYSliderTheme(), - ]; - case "LayoutBuilder": - return [ - const CustomLayoutBuilder(), - const FitByLayoutBuilder(), - const SimpleExpandableText(), - ]; - case "IgnorePointer": - return [ - const CustomIgnorePointer(), - ]; - case "AbsorbPointer": - return [ - const CustomAbsorbPointer(), - ]; - case "BackdropFilter": - return [ - const CustomBackdropFilter(), - ]; - case "AnimatedPhysicalModel": - return [ - const AnimatedPhysicalModelDemo(), - ]; - case "CustomSingleChildLayout": - return [ - const CustomSingleChildLayoutDemo(), - const OffSetWidgetDemo(), - ]; - case "NavigationRail": - return [ - const AnotherPage(child: CustomNavigationRail()), - const AnotherPage(child: ExtendableNavigationRail()), - const AnotherPage(child: DarkNavigationRail()), - ]; - case "RawMagnifier": - return [ - const MagnifierCircleShape(), - const MagnifierStarShape(), - ]; - case "DecoratedSliver": - return [ - const DecorationSliverDemo(), - ]; - case "SliverConstrainedCrossAxis": - return [ - const SliverConstrainedCrossAxisDemo(), - ]; - case "SliverCrossAxisExpanded": - return [ - const SliverCrossAxisExpandedDemo(), - ]; - case "SliverCrossAxisGroup": - return [ - const SliverCrossAxisGroupDemo(), - ]; - case "SliverMainAxisGroup": - return [ - const SliverMainAxisGroupDemo(), - ]; - case "BackButtonIcon": - return [ - const BackButtonIconDemo(), - ]; - case "DrawerButtonIcon": - return [ - const DrawerButtonIconDemo(), - ]; - case "CloseButtonIcon": - return [ - const CloseButtonIconDemo(), - ]; - case "EndDrawerButtonIcon": - return [ - const EndDrawerButtonIconDemo(), - ]; - case "EndDrawerButton": - return [ - const EndDrawerButtonDemo(), - ]; - case "DrawerButton": - return [ - const DrawerButtonDemo(), - ]; - default: - return []; - } - } -} - -class AnotherPage extends StatelessWidget { - final Widget child; - const AnotherPage({Key? key, required this.child}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - appBar: AppBar( - leading: const BackButton(), - ), - body: child))); - }, - child: Text('跳转到新界面查看效果')); - } -} diff --git a/pubspec.lock b/pubspec.lock index e7a01969..ef49c760 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1034,6 +1034,13 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "3.13.1" + widget_repository: + dependency: transitive + description: + path: "modules/widget_system/widget_repository" + relative: true + source: path + version: "0.0.1" win32: dependency: transitive description: From ad6f76bb5518eff0044715ae77e02ef7e50efb2f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 30 Nov 2024 17:29:52 +0800 Subject: [PATCH 111/149] add CupertinoRadio/CupertinoCheckbox --- README-EN.md | 8 +- README.md | 8 +- assets/flutter.db | Bin 1482752 -> 1490944 bytes lib/src/flutter_unit.dart | 10 +- lib/src/starter/start_repository.dart | 2 +- .../app/lib/app/theme/app_theme.dart | 212 +++++++++--------- .../http/flutter_unit/api/upgrade_api.dart | 34 ++- .../app_update/lib/bloc/bloc.dart | 35 ++- .../app_update/lib/model/app_info.dart | 48 +++- .../lib/repository/api/upgrade_api.dart | 4 +- .../basic_system/toly_ui/lib/ti/panel.dart | 3 +- .../lib/src/points/bloc/point_bloc.dart | 10 +- .../src/points/bloc/point_comment_bloc.dart | 15 +- .../src/points/repository/api/point_api.dart | 49 ++-- .../points/view/desk_ui/desk_point_page.dart | 58 +++-- .../view/issues_point/issues_point_page.dart | 17 +- .../node_display/node_display.dart | 23 +- .../StatefulWidget/Checkbox/desc_zh-CN.json | 2 +- .../CupertinoCheckbox/desc_zh-CN.json | 43 ++++ .../CupertinoCheckbox/node1.dart | 45 ++++ .../CupertinoCheckbox/node2.dart | 27 +++ .../CupertinoCheckbox/node3.dart | 48 ++++ .../CupertinoRadio/desc_zh-CN.json | 42 ++++ .../StatefulWidget/CupertinoRadio/node1.dart | 32 +++ .../StatefulWidget/CupertinoRadio/node2.dart | 36 +++ .../StatefulWidget/CupertinoRadio/node3.dart | 32 +++ .../lib/StatefulWidget/Radio/desc_zh-CN.json | 2 +- .../widgets/lib/exp/stateful_unit.dart | 9 +- .../widgets/lib/node_display_map.dart | 8 +- pubspec.lock | 4 +- pubspec.yaml | 2 +- 31 files changed, 603 insertions(+), 265 deletions(-) create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart diff --git a/README-EN.md b/README-EN.md index 7f2bf931..1684651a 100644 --- a/README-EN.md +++ b/README-EN.md @@ -34,10 +34,10 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the #### Flutter Version ``` -Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 -Engine • revision f6344b75dc -Tools • Dart 3.4.0 • DevTools 2.34.3 +Flutter 3.24.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 2663184aa7 (3 months ago) • 2024-09-11 16:27:48 -0500 +Engine • revision 36335019a8 +Tools • Dart 3.5.3 • DevTools 2.37.3 ``` #### Build Application diff --git a/README.md b/README.md index 53eaa41d..0e7dd361 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,10 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut ``` ·]>> flutter --version -Flutter 3.24.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 5dcb86f68f (7 days ago) • 2024-05-09 07:39:20 -0500 -Engine • revision f6344b75dc -Tools • Dart 3.4.0 • DevTools 2.34.3 +Flutter 3.24.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision 2663184aa7 (3 months ago) • 2024-09-11 16:27:48 -0500 +Engine • revision 36335019a8 +Tools • Dart 3.5.3 • DevTools 2.37.3 ``` #### 构建应用 diff --git a/assets/flutter.db b/assets/flutter.db index 4632277a2d1e93e49ee3c6dbfaaf06adc8755582..499fa41e62df69b38453eb0a1e78ecff05781d5c 100644 GIT binary patch delta 26931 zcmd^n33wF67H(HBRo&CmGn33rLRcs4OMrwxWKY<42%CTiBqRX>AqiR7A?X=Fb^@76 zu@jI@L=7qw$Rdghie7Qw6_wTNg6nnno$6r;ir#zQ_I>Yre4LZh-PKjy=bZZMoT}<6 zJ$YAY>DaQGj*cG-0?H8tp#u^Y3!QmEP*n;%*MdGnUTOd_jdwMnFp-5*&nzt&};*|V>GaS zW)bkdW;!p^DFIj?zrkgt9kA~HX284pM*;8R?*&}wp9yThXc0Jae#Fo8bbf@VAsnH>JFmuYdYjxtkm-tJ3GvE7Ec4K54B~AdQ#WYhLwhsiEW&zZcJmr}ft2gN|(H z+j?E~JspYVwyWZ7^;ySIalE6GnCxgGwsLsUH=<7z(fjCm^nmd#+Ju&&VrOIHQu#B! zhaRbnZ7X`*QZunfaeh`oQFdh?tl$v_(D=o3;&?AMfk2uZ}~SfD+Wj<0{5I@6)50N}#|eSv2OK;I}c&;$6`KsVrNffV55 z0?EKf2f6|uALs&nYM?XloIpq5cLl(4(4;^+p+rC<1Bq}jEC6Oj8G(4>O&ja4Z4;=y}`X>R8_h$f4@TUQ9?H>ocrT;GAt^A{b$N9NlTlj|q zFKOmag+ERGgMl~kbM-d%4+P%O51jxt@^dBE_xAzbfV(z|^>+te&(D?Y^K&KF^>g*s z@pl4V+t1Zo%g@zY(|-r>7=IG*8h+>~DB9l^c$A;(+w13=_LTTr!5_Dut2)x(0(b=P zO~~cv3U~Us!X5rbzzsiFyWL+OxbF7>xB0p9HGgg3lD{T!?5_b_@kard{T|?g9}FS< z=8phb^n*EsAN^ns;dj3s_|N_lu!``LUjzPwA8aH1%MZ2@zV|D@zw?8Igm3)7gs;to zz`rs%KzwO}A%v?ID12dpA%xFOFof`#nGgJ*W-jng&FR3em>i`pnbUw@HnV|WG$#YU zV1k*1kIhW5y6}lP5%@=D8t@Oz3Bb>p zFrVotG`U%~njFhEo7}jYOm5sQrVPAfo5^jw(G-DiFcI+epc8>|Yga4)7Mc$% zI2Ty?Y+&o4_X%Z%z}9eMujW=>H5J%OZrv4AfGy{?U6u)KDRe{O9&X(w>A)6G0Jeym zHo&dP2aFQIGGht1-vVy9`P^>vxY_1HmlWo3qs{IMY!)}!Oz46_aZg}H-GLRR04wMU zYzFi}ArHEskPCfJn9fa?1AR`I#tk>M4X|u(w#nRHlc3KDncQX>CEQvQn*mF20xS)B znlPaOu<_hP<9xvGt_y4|H_u(%I%8@A8_g{=iks$6Zj+JR7$YKq4d+G}#%(Z^D?e2O zHUtcSMuFzh2v9k?ldF0V;$`gQ5uExGL9@%>7`3oq8@s(Xwa8$^TE*)LOPi$IJ5Wa8Q<-l<`nqeIsJ96Qk$KWWRADusZ^vaI) zaFkb@A70+R>QZnU9Oha@Pb|H%@x+CtOQt`Zzg#J)s4oi$*|SJREC`}qcotXqtW%9~ zMLkPcfGg@+LK3d1V+rkWMQuw^aYZdlAh@EYC16|;V+kUzsKEt27gt1E!gO2_WeGXB z!fOdrNlAqVBvBV0BNgtjbc9qyhNWYqA|fnp#}zJ+kUjucI4xlWu5ehwow&lVgkiYC zZV5wig>DI{xWZ-$LvV#=34=(53WBJkdbomsRD$$TxB^=jhvN#x5(eT5*%JEW3ds^i z;tJ6cib(|m0Ur1fQXzz;10+-umbT&0LaW#`99m!rb#Q3DCB%}@yl|m=Noa0Z+M$F> z=76Z_I5gWTm4QREEMX!J&9sDc94fYiG#o0jgb6rQXbIyq8bjG1kme3xD?zDtEaA>3@B;XK?15i&( z92#y3aX2*05}M=CP)lfvOG2rZ1R5Ly0zC3*5*i$q9wMPZVQC);4Gc>gNN7MKQInjzc}T;~-lt9O`ZfHF2n$ zCB)!RiY2&lDA^Jsaj2^$MBq>tOK{;(XG<_}sFNkwaj2su#Nto~OQ?-Q?JXf1hwiWh zCk`c9f`f$G$&i@9JFml`w)~vd7l#rpVGItnv4lh%O0a}@5{d^w)P(17sI_%!J`T0A zgt<7>(h}z2P@E;q#-SFLFbjv8Tf$5nYGw(AIMmb<3UH{2_5NBu4mGw;&A_2XmXL=- z4J~0D4mGfZyK%^ZDs3zdai~JtT{vVRl?JX@&pOi@hb*MhTH%m|R9X=ZSxBYL!yyZ) zv`iebkV;!XLNV6+tHPrs#IZ_L0fs^xtUx+OLL99?IzmDmu0Ucq#Ni65ok+++D^-9_ zW1*EQtiU0TR!A)-Ar4kh9$cNH6-eOf9IimxMM4~}K-x({cK-e#0w!?C0%->cam*5l za1w_s&>~EfffkvEgB-LFk(40EERB#L2P_c_Pmv&p zERYV9Ajd3_PLLo6Esz)qa?}FpVG`u91=3a$W)133A{l45yHy;GhLtij0F6Y$=U!(1I+@3*8bE@vAeDgF zj|4f6fz+D>>xCugmK@38Tu&0@P$o*keI&@S45Ymz$iYk$g@ZU~p_w=x2V>wA5_52n zV;K^slAr};qVOOIT2LlJP!P1BOccsUkV9Ds)UgT&IhY}_6A4;aCJLuWkYgEKe3Aq$ zFcXC!30hz#3X4h50y9xqM1mHWiNYolw1@B5NP-rYiQJeR%a91h1Sr!);b|NMC<9>+ z4g!>EV9d2Rh#&c>uJ{120h;M_>L5O^=S0QdxX2JrE6 zKJd|U9`HCh7q}=*5B$33o?q7>_Ujr^y2?}RYyZ&QkP~v61_W6$f^->W0YNH__*@C3 z!3Yv(1XCYqI1uF72$E|w7AOq}CP@%Xh#<(T5hUV#UKl}ojUWq0BY}niK^~4EyGD>) zBgm~$39obz&_Ezau@Rr_>IVdwHtGWe$u@#q8$qg#dH_MTjk*D)03`!K&W#}DMxB8= z0zu}D+5JN}v@$ z%Yl{wEd{yu_u%}mrq|uZzsgm~ECLOy2T8ReJI(s^H z8b280?5FLW^_TS++d|=9?L#d|tsw7`X1GAvCBG+orS9S(5uqfskG3z9rqPw04Vl-X}w-DfAP_Y0?I77cYn{mAm8@<^Iw|R3P-jqBKJ| z2M!i^*|7(uo`@d5Un*wL?U%kmGC3+VqtBd>8d2{~sZw&(w9)-*rF6P?yTo+C5Nd@h z(CDK(rEL#?b3DGf7dyM}MYi;UE>9Q;99+VS0#IhVJ6wCn3s7j~|Kq8GO>krUe_#U_6Lw>5u8UZL)SzTd1k(9Kg^)P55KRnEkrtW>1HOEo=tA#JBSj!J9ksT0x`cI=3B39+`vq%|VDd_=B+*`UKx zE^_gQ@rsFpGu`ni@j7ZVHD7KZvcv-UW0~GJT%OO?&XQMP+3fFcMSTn9=joZD@@zV> zMBdiId6y6=bru{C8NV7s?Ys4V>1}O`wNJEe>LT(w5%DPJEM*$JQ46UvEV8*Imi(%; zQI2cjPqhin8mS0YRwDZ4PRT0BF3QRrl$V*6b7Ap;^N-zsaqspETURJ@V%sDpz9s!0 zeFu6JJd+B}<*1wEZN~s(t^Ff`+EexQpq)(ZIW1PrB1iGRaGvskGE9C}_JDVe70SwE z(?%1x_W*bY`~51c4f5CBBXr?9tYv1?g}ogytXP8=WVOGRHj(!HdNd%5Tu;h%mN=dg z%N%`;h4#wK2#z!HbRx_%N<5 z$BE;ma&%PuL76T;<(%wTW4vnAus?3s_2J}#ZJG9()UbEe25g5QtfGJ5xp=>-opH&AqXw8;c{UkEY6Bf^-+7a zx=Rh&C*YEs3&H9lSPDL`oK=n~+m+?Y6#F1$xRPRTue7r_RST3lYKA(*?h$3Rr=2Kv z`CBzn^{H-EaqM$!Aiu~T>%YjalS||*dDgL<9432Yrhln_tUs&2PAKu~CA)Oy{7zq_ zXX(R8F&Rrb$?Hk1yhJXLuPr?jjNg|&$4q(!ZvHw6`pj~6-J7kD<7nbjgZOet;^rNr!X!>n4*;}sGZ&VkT z+oWi*dpfK>Bhe)_5W7vxD=zApot~37S@1tHp#C!SKeP57E9%-E0vVo@U0doT(%2Pp zG#1`!Bn=X&nP^1OU+={>_IP8t2+^)hp|?KU6e8dGf=q`slV7#>$jdD%$jiyeDnN+V zYA&}eZ&|-C9nxH0#I81%*B~^Xmd42g=trGokL);&l4yEo*-Il^%DI{`{Ik@c-T+DeTTXQ~GI-Vp(C@`drP@glikoFLB`RpMA z8B4?|WCK}2=7}AQ>0)DJ9LW?tWH`)Tv_ijU|t(We>S+D~l#h!|rNX6Kt{H(lV zZ>>CGuW2{*-;{m&_tIo#i?U3AUmB&%QKl-R^cVF5QZK2c6sfOMdg_bye5H}nL7$-a zDbd^MUfU104{T4{9Jc_CrCMlPIUK zm)py4DfELl8FEO7#mcuej|Kom^?T>!&4Pdk#nAMYay_ag%l7)8_s%W?nD3r9n}G%Z7(dJoU9k_}AqZ50`FVfT~c?;dt9R>sG9U+#U?kCrw zPescmw7@050FNskWo-w@Or(li&Y`V)%A4uuQSzItdky)F$R_lWd!h1ewYRbvZutYT zA0HQLK-l6O>tY9oOCWRVSeR_cQ2-WR2psPdw;iyqtvFWvPe=}B7ej8s8i*&u(! z@Y7OXQEK4V==gPV0y}Y9nkce^XQWg_XZ=HZmijlz7m~t5-eEyD#QiAW*;}k79CqxJ zM&mDVEizLX?@)}5fOnbt`|>(+8T>j`o2t%+0nbktq{&C9IZ?i!CZ)@3XQO+NK{8Di5MSAGU=F-c%&5LWw&Yx(s z$#?A~OONsQ{NvMJxaauAP!-+0RsIKCSPJnIhlH=`rbY4>KJH?6^1a~9cf8?9HkR5y zve(r&=n=Nz+8lK+`5rv_4Z_%uQa{YdUik^skl*1TuL;f>PT3J~*o}~3voF!#*JEuH zv?sLgY9)CM?y4f}^nEbv#=c?lwT1#-wRBJiTI%*p^_9Fc?eUxpHc24W5ZiYL4 zCN!qI>}LrB?v!hngiA^U@zB? z>VRmPL%|w{$iWcuCeUvEU7i{PvkQwl4=*an&Yj%V2V2#AndwF8zAjza(1ua%6n!dz zN;)7@Ti<}KZ5BmtRFXBDSJKX^gsL8IPGoo_w(6J&J_&eByWQvT(BHh?_=*KYr^&Uv zEorlX-UigM%|mRwu>uR1ZUJm56xrK^R$h>??Ya))+tBU5 zI-_X2Un8QZ?|`PzXMU93bR_Y<{FjQMpqM>0?QNq58=!gvqRbUWA6L8`==(PBCR!P1 zC-k$`Qcb$>0mDvRYothe^#iRQEyZ4guIXjB)6X6!UYgoCN@e%y-qT1oY`*LN=nTVK zi{?AMGW9l%>O%_*ua|ykcrl&PH0l)F;qYc4Fu&(_CzH>4kc%m2LEa;u^thN@zOa`FmpF)^Lm$5~Ftx6s`5>@<&;wLao`9lQvAAgBk? z2cXVZkiKe!7u4B7E8gg2Z*2F-$eodwTUg{9Rgj+FEhl?&?)0qOBAR-{-H4X{qIad0 z8{t8w-RptuqhyGe7~Ft!vU0%ZZdmZ@DvyKuc6r)H`l`81bx*KLSf23SW=|te^audYsi@v&ZVx`Ux}3Y3E&l9r)vx|pd!B0d-bQ!TFaNFPs^jUO_11d5=a`P7z}p5O zGkRkJ`+mKrA)@i8?IfZguduM&?CiqZ^iKx;v;6-XC57f09@=-C=QzQDX}@6$(=dBs ziN^=yV@VCrUO!~&8#}QdmU?Q3`zrltna4{<9C62912o=Qe~j{;=AHG#zX!Gd*WHT& znDs;$kq-sJBZ=3Ey{v9cO%VI3{^?tyY3wMEhkY~4v-6s|oY|l*cZ}2XSECGz?dM4p zS?&3r%Mw&uC6Fqpb~jWzs1~nQ^T%%O7OwWG$)1v%)ke|oUe~{=mO{0^(Y%44Eb5vU zCA0WJo;O4}Rv@v^Ml`Xny}LHF(FFy%Y#YSj(cimSy_atP!s-3Hr#_14OU-Z(T6Nl9 zgAbE-s?GPf+2XOD5?K|ME&}PVbb)pf6qeA-;}G@4I?z}G^2b!RVEy}e7FBBuwY4Ip zziaLjyho1b!?+K|b)s|-v`wjqyB+s5i!$O83|D z#IVn5d4?kTa${UmpPnDizq_XwP~Q?9MN7YSDfG@do=)Ll63T1r=QxO{hr2A*57Xniuqo}JdGb=wUH!~|YBRi|G8AKRvg3tu2A8;>56Ij^+w-?^A zuMt7>FX#3EM~r>lzHt!U@>Z3c7Abn7DAS8KMr9PWE?w)?V3pE=@= zq`o8W25{lbJa-!&fMJm59dXZqLZ9(JG`^Tb(35qdqUq!F-HqV%)}wC7=&A-pIz#6o zWr~jj{Qu)PG}-aERnxfR?lw@#n&a*XQ2LAG?kEu>WwoHJ230On?2k@v1zNmA_0PN5 zl9lgrkCdS_yhseKdd;cQs*R3@^yGU6rYRrTW!fd*J&*?Wxie|y3h>?u^k4Z_^*3*D zxs?XhZkRR0y$DU%^UwR;vIA6@WkvY%Ize6s%`cVh71LT<&4=dEc5GG9JrQ#wy679D zjqWrh&x`5RkUN65o?>%SXN5bCx;`W-+rP;@LOzu5hK(A%1a+d=3o7d%+V@8$KxG{? zGx3dnG}`a}oSt2vC^a*3(hCcHH|Dp)<5AD7>3MDF6O(WQni6npwwq^ZH?ONH&0l=$ z$tNDxy|iSHThnirY(u~L5$5Cmx!bKVZ@~RIta2=N+iockn@v3Q#XsD}KHTH3Cq{xk zrmU$I50A{hbXng4-Njx!E&qyW>BI;dYqi{c@R~>WTtrI_j)?XLxYg%=J)(5EmE}OF0$C2)N(AdIAJI(O8z5Kl*Yxw>mBxjF! z+=KKApG{`+)yR8mi9$Z)2=1|PcrNl6XGOdR+CCY{+pdaq?U5@vE90z`vwY6dI7^L$ zCrgRs2||42&(1@x$TMD;E@m$_icGZe`VY#yzH>IH?_9)>PEjb`eKo>WaaEW1$Y&#< zhLfCCML;!`5xknR2%dA4T5>+f&=4FzMuexNHDoUdSdx10x zlruoGud7iE%ITt+89QRxub;TSMl?0aZqT?dTru+Sbg%^ErLh(mxQAusr)TFDbD*CqP{gK|=SCpkkQO8A>kIwC7>q^%gAvI`Pf6dNLUvwpD zE@3V2yArIi+5@~;|AXS`HFvBNZpcSPGI2gkP?_TEO$|~ij z<$RaulDi6WS9tTbkVSMgMR@f))Wy;FC9{-F*IY_RK4`NRw zy4+$obl%a<<@ww3n!MG?S3O!b+3BWLQ=QZ3fVUm7?7sG{ zyNM#dDada^n=i^nMI%$T+6=_(UBKRM=-M9kd)x2~KI_kOQmdE!io%BaaC6KD5;=v#bxRGoU@3aoovn}XG;a` zW_vz!j*>)S$D`nYU=-&Vg7&iU)VW(_@<}InewhobSLOT->~_`(MbhBpp-QI$73MpC zu2*r=2|Xj#3C6_n&flFxJSZryiwEIN?-N;RH)lP`aeuIh83`}kK{ZQuH(?L-bb1g? z!A=MLvA44^O|4A`ElqSPa-Zyi%zyLdkcwBRhg?qVl2;1KN@&Kf*n{~dWZzJK$=*(E zRU@YgUFBM(Sb}+*e~Vewlu2p5qaL08($uLDMHwt8gQ1O{iVcN z!NCf4X_#Z6rcLOPUXaJ_iinQo=kG6hk7|iS&P6&S$=OvnRY1N zA-fLB4&;N7(*SnX0NmOsNIRk0jeuLDO&-%Et4m_`WwW)XjC7HfEhaYl{nL=kL8uh@ zmm&0xG5SINnuD|5GwAf^4UImV?H&>_!NOCR8EQK3S~L;S$mXS&pEGLG$RBMrX}jl* zkq|I0f8Lk}9ly%p9lz4x;9h3@?BpXRU2979D|$kwp1$1B>Bxs6;@!L)ruarIHJZ?u zmKz3*$cHE{wuIEDMfpY&-JfqHv(NL5E0~^~Z)-^N<08Fu!)zm(J~|r$l1&OA{=hHn z5%inc5JIbS;8|wL z7iACij3N;gj}xr=retMLo>J72#(oHMsihjcZv0EIB3*l-(U6`Cz$9os6r=Ht6`7{K z3ymCGV~cUd`6j`d@bK)pSsi@|ZR6<6&6L_~^+ID7(!@1_Hh@HnYrru~ktLbNQrXzq z)J)>;p)Kz4WHvjq*nkva-7@20-s4ZNN-*15z7xo(7|K>IHGURv)w@pMTd!tuhK)Wr z8=eXjZYW9d{J8EMBT7t2qTSvD#hzPfB+_kzU>djXDx)Xek{n@YD_0q_p&z6fJP0ES zQN9su<;piKqRMtziK=aOhQ824UDRdOfEqVeNaz!#-aA;kJB@d(anPWt17J|CHyRiZ z0_l$BQIUG}DfcO(jV(ljO_SQU_#4y-Uc4nrSkcx@hPN7m%yz*-;fou!UtfRmT|RN- z(qoUGKfLG|Mt zH2yHIakFdTq-K_Pys%17z%Y@V(56{MiOUP3^(_BY6ZGe0su4N72!2waczW0fP5;*_ zZ%ivsN65YfW>;_rh@V?5Z*V(zp#Pj^)M>*f43$Lre+%lM+>y>*!_#7;;!Rp(E z(qrcjKjzCV&dKp{p{0)|+>1xv-Xq%F#v^#@=)J8+a4d|X_G5PS7VEd6e{zU6^!5(X z=C%%Tz#s#u?}Qh3|5LL~udkz6%Y_}U`w;Z+@ahUIaupWA&b5xdqJrWq-tGJ68O`a5 zZ4otZ`iqC|KMbkb=ZAGd(->yI${x8T|JotPu$;;_K)OFU5jQK3=-<%8t#KmpvS|nN=j2 z`lhLMX~Gpf8r>?JbF~Ihu$~)60Jy95`NOL&tl^f2)k5NFZnbxFz4V5y!`8pNeeb26 zkA-icdCTzF+uJ?CvimJowAK#8Ioj><01Dg|4-)=t{)E3Uf5Kmxf6)IXJaE#4Nd_b| z*MUT}dO3HC-*REp{U9sCO=~R%>(R&AP50F)XuYoG3<$Lx+;74K>?Ln+1(8Fgbrdm0lIl)?`5Ge%&@;f*B- z^dxM+8+?IFcG~w!v{$Xt$_0i^w zwb7K0ftBQwi?vSlTpObkjsF&wTRHaItU?^h!{)Ajd@~=vwaRem8-}ia3-9FBk8kww zb~oF(W?yS21d@E1YqVCLePiR}d>iI(+B8=&npJ z#60674O;n@H-=U^A@K5@R*4L^C(~n2qZX~|YRL7&8xXo&+lY{y?2B*KiNgwj1N>h; z!0g4gHZ}$;s3-fpg%J&VqJ)Nm?JfMG&~RI!9Qxk zuw+dO{l%=1k0-_vh`wJdss&4}ZB$7mONrSRYD_=@34USWYIsvecr(R?rT1K1wL=8R zFUp%dIVUT9Vop{VX8v62)}i5MdEb?z>n}gJlLN-2^qj)1IBR&|u<5g~W9-WC9+8WW zmtK7IX!ZRl=Z|d+Zz2hgDzG!-;;IK>s5yUh*Tn~RhMzDDcd(b^%9gDlUtDot_?cnT z$HfDF`c-|U7I)7`daM`p##`Mp9G7S}+{g+_+_xJ44-v^tM@+Qfr~2^?$Lw;W#_NH| zf8v>A zXH2^>nDINV*^8zmJEG|Hr5cgBpVFeGT6^x^Hd-*w3q9roUA>)Cce%x>Z}I1bW*-hD z+9IRO`zIg?4^T8!hIEAwO3kj1YLl{aa;gn#7q;JjVew*kOz^~O0~rihHMNVI_l4cY zx;y*E-FX?sh1G7qY;L@?X!jq6!fRn{HC0_3K#x^kti0#q%6qP?TY9mQT{yNT+-@}m z{vp`C=>*}prkY3bpeFLq9(6OKsebRRNLMYExrubw1DXHCq5gn$cmJPsBpR_8Qqh~E zTde_FB>iBMD>^)0ZGF@0^xYh<;@k1?mAhT|-z3Xk^ko<(BU;VME}C+)C=6|BOEu4b z<&Dj6@kZYtA(qd@ib?~)_Jz^_M!RT5UeU)Kz&hBBXBBz5!|czxdJKnBaZ<&2kf1G+ z20^KAlDsm}9K>Gy(VmFqm9x!(?6_pi#ueuXR$%|;Hi^Yn%D;&6T8}w|kY{DMQe<#n?>yU=3y^?Uxi-JNbO1 zJ=#X)6#EKvH!DlAH&M`7cDR>)kPYGmdn*}@V{O~o&+0HAZx6yM7u(>m?~Fv_S=T1^ zXVrs>ohc}d9arpqY_Qm%`w+@xjlR;qBq)PW?xJzYeT*`z1+Z3aw+>;II|H1^dZ zJyu3jnR}W36_lyePhynKp5CpulhG9R^FCcsDtvrawoKn4qa4^|sgH$+&(|C3XgX^) zPk$FyLDKX%3FWec4E z1EYe4>>nL;SkmR2;OK`NL(0hx2wyV-HA%Fa*LxdX$=3^2e*lQtIE00_u-(u(w?@;V zDcOas(y#Ami}TSJ>o{xB)^i;;+l{lG=(}~CF=zn|*4OiB-G+KvqgyIzWnoz1O_U6y z_e@&ZP_Hj@*rX>K>UC+#J22xiVKYcD1s6|CTf>~#x!*j5&Ofb1!{#PfhxWY{84c^f zcGxLrcQ|QTGu=h6PIW=-z8n_w_czlcXzCkILQ8bLZ+Ox!?UGGbXI^^+idIWC=<$K7 zljbj1W$JoKSM-^!in5DxvaDH%vn4o&CO6h6I6x&FTk%%Gz71~$r(TEU6${LwJv$of z7!|U6K1Y~~#H0c;tR(QKB3 z^<1%{O2O({L7#`e6W2n`uvv0xnz@kG{Fg05Mhn=&pKX4)51I4Xy^*>p^CdN$B-pzv zNl?1EBCl5c0{h{z4Fd9eI+`Wy?r&_5Nfl@L(#%=g?@pT})fChc44W;Xyj_x)F|>K4JR|Dc`PM;74rMN45pTZoMh`NzlikpWu!!ki2e!Ut!yyfxW%*vU+}* z{c_L-`?)O`s)j9YQt{vv#i;+?R=$6djob{viHB$u3{9){_(Sx+iBnR?x2%W!fNAlMOD@wh#onLa63ZE6(WvoM*MA3i7a3uWPeyL|Q6npGiwW1@k3i zWtt!Mk%{dzvl|`D7M#+Whe49>T2xchCudm;cYL$(UroJR3zG~MCcDXYm*2}PQ_Z{z zgMI#-))iGWbQ|P9sfNuwqpjvE-P*qtRD=C;L2ChfH^`dd{%F?nvi2%*@!irz=_7bX zGd!=jAcGF=g72ixyY&uiTa}jX++C@;4wY&i1=VKW#oA>F)ndOvTns~Vz80&Xx~xet zJS3{avgc@os>e=F)p~(%rE2{}RG*~|(>}&1mL-nSUV*YH+Sej# z$bRUq6)C6zo8DKWu<#nM#jAQFfctT3K-<)#kfKgnZCZO74Clf2T0WHUX)t&;X04iN zZ$MDs(z=SMDeDoby{y=qfT{+7-nWbu4$v8}5tk*_&|V=SMcaUy9o(i(hV?+fc35TZJCvitX_V?gI+s*X@Q=31+M=YVhoz6L`{Y_wl}0D_Zz)h?quSY(mZG=W{rN8SH3G9Y??kIBHI&RI$Eq6$>dH_vRVD`&wY3D3IPE0$ISHnEe#fe!!6u34 z1nq$I99ZMHB(KQy_hBbKAr}<;06(A9fo0J_6&ic!3h9gJ%zu)uinYs!#=FI6Iy%t_ zvltFox=3(~QQQaesH-h$N58SVBH4(~$Xhb%#aezvg0j7*RoS9OAxZd{M*Kj$?Bnmq zC=8QJ9e*KbB+xcFhEad^7o2>;q`YdB~|-Ei#7CdUvSx`J_}`+IA92v(NDl<$XsB z%=l<5tDHpM6txK>3t<7qS6oO_;$RxecS#;k>t1w3(t0*ri}|LK{`~!>P9t~n_dA(G z%HU7xbg~Bid^nw?!=IE~vaW_z&&^q~>ruu8dO4RgheF4n)>}wik;!=^4vwegk(ThM z%QJdY>vYyLdSgpi@r(|?%L2cxaVVAifFMKpaVUJl3>nJ7(PWMU`Ah4&$?IUpc=98H zJma?n@{)wcuz$28?QM9rU=zgIpw=8wUL*TQv;6L45iwTG_m2X#c2NWUf(k?Z$pc}v z;_m6WxmjTVXgnxAzjOF_U|vQ#|NJh_XJ!1ie3roQK=L~{qK~ZPIn26-WUvGo&PPp1 z2N^P)T5;rxbWkRfWyn)_qJgfQEMW*nSXPlQGk7v7UlJN?a z&tX3#7WbUPYeYy$qCdf!1PMv(MLb4?RAk;|{3?P}WXPvDk*6<#&){QBNN|E*;cNwE zvERPOnhZ&j`ZNAbR$~R5K_X;JWewiJ@D&cPh46b(Gm)XZo}F zC&1E5{IH0M+2I|yOhiSj-!42|fgq3V!-Ev)tGI`R=CHm2d_sXBjx58!V|-SyeJG!W z*L+GgR_gv);NQJe|Co@*&Ia)T>wTPbc?FKNmgoN$Ut%Z4T_yWWXrrGRm{&%Gx8UO- zT!Z0FpmV@yJXJ>XSY9Tkx;#+O2f|}@*NtWI{<+|NFk~gH)!D##cx%}Ew4N}fY=sM9 z1^X-=PUxPMo_mYS(WC|VWL-cZ>w5LCp)&Gvil^stEwiYF_zMKl7fx5vd^Tw`-bSdB zg5QQf_QMq12=;r$V^KpTjC8;sOK2hcv@@>7{TSabi2;E<+yD=Q0mFqa%VI!cUwH5v zNDPSVnJBze6a$E*#^6WsK^Z4W5O#Kw@b_?8VTtgIRB%~l&k@`Su=c6~10HM%{aQKB z1JS8JDVt!3I;SM^2(!aS%3=v3%*W5e?;k+?+2V@wHu%F?#gqWOm%OU1laRq;-h{18 z5M_S(w&I1WCzaI-#FOPuE2WCv399d*1`^g33+rgNF2-m z=_ndJPDjo)`GFXCkq*c|cJo+xkt)9u#k!ly8Ih(8C&Ur{V)?&lW8osDQg+M;z()yU zJLFGZzu=mBSjsYGe|Ynrqu1;r$kqRgTJK(|yi#2u^taX+Q#oI03bAm@d}XQxvGDpr zWs3w6bJ8s38xbPr=5v+ZB4iOS&sP#9DyJ!>b_r8flaiu4Ak?0LvDoB`M|WZ6E{iJj@8WJ4!~ z$(U-U=H2h#n)>EqNCI67-;%-h6Fd8`xAMDacLyL6=gG%}iU#b{eo9gp2Gswu-hAp? zqx7N+yDE`%-j9(6OC6*6xbizH^8$3_~bGpB(ZiKl}@my@TN!o7nQQ)F3K|^;E$q- z5cE6iDuLr$PC`^Q1=ml#3ddd%Bhk{5Rm z^kz}6s3%1}--=fY+Q$;#gzuN^D~G~HQTVFRG-w_(dw5}EBliTE|G)!HU24Sq-~OVM z?d{`@7xh{aJXRvC_E(HypY-$A2|pHmG8_KdHT=n}^=!9%4ES$8cm2!n9Ql{AH@|qj zgt9^qBal=S9fY&bEnKWI&QLG9{|53@Op_ zo>3zeNQut%i)skNW|}t-L9SSo?p-B8t|(@CsR)_m#>rmDA(PmM>D~k4K_v>3&2DV8 z7`30z14X^BLA3huhN!x@B1MO}?)<3FBuEgyDU5& zr`||_pHy#mNGbZHdP_w#nw=iz{Z4@ejuWH3z4@GqcR0`2M<;ked62~?ddI-TyY#SN z3*uwa!|;$hC1VK=@IIZ@0IWG_DzJPZ$q7*6$n=6-5u!c6r?4T>W-QF|EdP0dm5xO&~k@bMewOthbT?6>T)u3j3*l1E`fWtvgzOTZb!TY@D#5{nI`@A_2t)KO}c=qOf+53Y8*_-2a??XI$JMoq`g|AKh{;n6xL_92L z9`P{fY`-Y493AMz-iwSHgY8oSd?sLs29rEP7?>D-vW#~_>r>@nHKV+iabx&!)A`RS znr|$P{VmcBX{^^loBRgbCr)I0oMCCuMejA~iyP+_+&EWv>h*FD+&DM*#<}-zoLdOz z4qfuX2h`j8*;}yHb)qgp95bKPqH9{?nN%tD-Vd`a2VjFGfw`C~_jqeTXj~cv%TDQR jl0WJoPXcQ%jT*?4!0eS#n;{M_^Pb?dI8RY;XZ3#ot~OnC delta 21029 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 Q{qJg!=l<}dzZUub0OT$_+W-In diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 71bdbc09..25429c7f 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -42,12 +42,14 @@ class _FlutterUnit3State extends State { @override Widget build(BuildContext context) { AppConfig state = context.watch().state; + ThemeData dark = darkTheme(state); + ThemeData light = lightTheme(state); return DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: TolyMessage( themeMode: state.themeMode, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), + darkTheme: dark, + theme:light, child: MaterialApp.router( routerConfig: _router, showPerformanceOverlay: state.showPerformanceOverlay, @@ -63,8 +65,8 @@ class _FlutterUnit3State extends State { supportedLocales: l10nLocales, locale: state.language.locale, themeMode: state.themeMode, - darkTheme: AppTheme.darkTheme(state), - theme: AppTheme.lightTheme(state), + darkTheme: dark, + theme:light, ), ), ); diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index b1d22413..fa0fb6d1 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -28,7 +28,7 @@ class FlutterUnitStartRepo implements AppStartRepository { // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); - FxDio().register([const UnitHost()]); + FxDio().register(const UnitHost()); if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index c9ed4d78..53e2601f 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -2,118 +2,118 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -class AppTheme { - static ThemeData darkTheme(AppConfig state) { - Color scaffoldBackgroundColor = const Color(0xff010201); +ThemeData darkTheme(AppConfig state) { + Color scaffoldBackgroundColor = const Color(0xff010201); - SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: Brightness.dark, - statusBarIconBrightness: Brightness.light, - ); + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.dark, + statusBarIconBrightness: Brightness.light, + ); - return ThemeData( - scaffoldBackgroundColor: scaffoldBackgroundColor, - pageTransitionsTheme: const PageTransitionsTheme(builders: { - TargetPlatform.android: SlidePageTransitionsBuilder(), - TargetPlatform.iOS: SlidePageTransitionsBuilder(), - TargetPlatform.macOS: FadePageTransitionsBuilder(), - TargetPlatform.windows: FadePageTransitionsBuilder(), - TargetPlatform.linux: FadePageTransitionsBuilder(), - }), - tabBarTheme: const TabBarTheme( - dividerColor: Colors.transparent, - ), - fontFamily: state.fontFamily, - useMaterial3: true, - brightness: Brightness.dark, - primaryColor: const Color(0xff4699FB), - listTileTheme: const ListTileThemeData( - tileColor: Color(0xff181818), - textColor: Color(0xffD6D6D6), - ), - ///设置选中的文本颜色 - textSelectionTheme: TextSelectionThemeData( - selectionColor: Colors.blue.withOpacity(0.3), - ), - appBarTheme: AppBarTheme( - systemOverlayStyle: overlayStyle, - elevation: 0, - centerTitle: true, - backgroundColor: const Color(0xff181818), - iconTheme: const IconThemeData(color: Color(0xffCCCCCC)), - titleTextStyle: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0xffCCCCCC))), - floatingActionButtonTheme: const FloatingActionButtonThemeData( - foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), - dividerTheme: DividerThemeData( - color: const Color(0xff2F2F2F), - space: px1, - thickness: px1, - ), - bottomNavigationBarTheme: const BottomNavigationBarThemeData( - backgroundColor: Color(0xff181818), - selectedItemColor: Color(0xff4699FB)), - ); - } + return ThemeData( + scaffoldBackgroundColor: scaffoldBackgroundColor, + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), + tabBarTheme: const TabBarTheme( + dividerColor: Colors.transparent, + ), + fontFamily: state.fontFamily, + useMaterial3: true, + brightness: Brightness.dark, + primaryColor: const Color(0xff4699FB), + listTileTheme: const ListTileThemeData( + tileColor: Color(0xff181818), + textColor: Color(0xffD6D6D6), + ), - static ThemeData lightTheme(AppConfig state) { - SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: Brightness.light, - statusBarIconBrightness: Brightness.dark, - ); - - return ThemeData( - fontFamily: '宋体', - primaryColor: state.themeColor.color, - scaffoldBackgroundColor: const Color(0xffF3F4F6), - useMaterial3: true, - // Android 使用 Material3 - chipTheme: - const ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), - listTileTheme: const ListTileThemeData( - tileColor: Colors.white, - ), - ///设置选中的文本颜色 - textSelectionTheme: TextSelectionThemeData( - selectionColor: Colors.blue.withOpacity(0.3), - ), - dividerTheme: DividerThemeData( - color: const Color(0xffDEE0E2), - space: px1, - thickness: px1, - ), - pageTransitionsTheme: const PageTransitionsTheme(builders: { - TargetPlatform.android: SlidePageTransitionsBuilder(), - TargetPlatform.iOS: SlidePageTransitionsBuilder(), - TargetPlatform.macOS: FadePageTransitionsBuilder(), - TargetPlatform.windows: FadePageTransitionsBuilder(), - TargetPlatform.linux: FadePageTransitionsBuilder(), - }), - tabBarTheme: TabBarTheme( - dividerColor: Colors.transparent, - splashFactory: NoSplash.splashFactory, - overlayColor: WidgetStateProperty.resolveWith( - (Set states) { - return states.contains(WidgetState.focused) - ? null - : Colors.transparent; - }, - ), - ), - bottomNavigationBarTheme: - const BottomNavigationBarThemeData(backgroundColor: Colors.white), - appBarTheme: AppBarTheme( + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), + appBarTheme: AppBarTheme( systemOverlayStyle: overlayStyle, elevation: 0, centerTitle: true, - backgroundColor: Colors.white, + backgroundColor: const Color(0xff181818), + iconTheme: const IconThemeData(color: Color(0xffCCCCCC)), titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black), + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0xffCCCCCC))), + floatingActionButtonTheme: const FloatingActionButtonThemeData( + foregroundColor: Colors.white, backgroundColor: Color(0xff4699FB)), + dividerTheme: DividerThemeData( + color: const Color(0xff2F2F2F), + space: px1, + thickness: px1, + ), + bottomNavigationBarTheme: const BottomNavigationBarThemeData( + backgroundColor: Color(0xff181818), + selectedItemColor: Color(0xff4699FB)), + ); +} + +ThemeData lightTheme(AppConfig state) { + SystemUiOverlayStyle overlayStyle = const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Brightness.light, + statusBarIconBrightness: Brightness.dark, + ); + + return ThemeData( + fontFamily: '宋体', + primaryColor: state.themeColor.color, + scaffoldBackgroundColor: const Color(0xffF3F4F6), + useMaterial3: true, + // Android 使用 Material3 + chipTheme: + const ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), + listTileTheme: const ListTileThemeData( + tileColor: Colors.white, + ), + + ///设置选中的文本颜色 + textSelectionTheme: TextSelectionThemeData( + selectionColor: Colors.blue.withOpacity(0.3), + ), + dividerTheme: DividerThemeData( + color: const Color(0xffDEE0E2), + space: px1, + thickness: px1, + ), + pageTransitionsTheme: const PageTransitionsTheme(builders: { + TargetPlatform.android: SlidePageTransitionsBuilder(), + TargetPlatform.iOS: SlidePageTransitionsBuilder(), + TargetPlatform.macOS: FadePageTransitionsBuilder(), + TargetPlatform.windows: FadePageTransitionsBuilder(), + TargetPlatform.linux: FadePageTransitionsBuilder(), + }), + tabBarTheme: TabBarTheme( + dividerColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + overlayColor: WidgetStateProperty.resolveWith( + (Set states) { + return states.contains(WidgetState.focused) + ? null + : Colors.transparent; + }, ), - ); - } + ), + bottomNavigationBarTheme: + const BottomNavigationBarThemeData(backgroundColor: Colors.white), + appBarTheme: AppBarTheme( + systemOverlayStyle: overlayStyle, + elevation: 0, + centerTitle: true, + backgroundColor: Colors.white, + titleTextStyle: const TextStyle( + fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black), + ), + ); } diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart index 5feecfd5..5b22cfc7 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -2,28 +2,24 @@ import 'package:app_update/app_update.dart'; import 'package:fx_dio/fx_dio.dart'; import 'package:app/app.dart'; import 'package:tolyui/tolyui.dart'; + class UnitUpgradeApi implements UpgradeApi { @override - Future fetch(String appName) async { - Dio dio = FxDio()(); - Response rep = await dio.get('${UnitApi.appInfo.path}$appName',queryParameters: { - 'os' : kAppEnv.os.name, + Future> fetch(String appName) async { + Host unit = FxDio()(); + return unit.get('${UnitApi.appInfo.path}$appName', queryParameters: { + 'os': kAppEnv.os.name, + }, convertor: (dynamic data) { + dynamic ret = data['data']; + return AppInfo( + appName: ret['appName'], + appVersion: ret['appVersion'], + appUrl: ret['appUrl'], + appSize: ret['appSize'], + description: ret['description'], + sha256: ret['sha256'], + ); }); - if (rep.statusCode == 200 && rep.data != null) { - dynamic ret = rep.data['data']; - // 说明有数据 - if (ret != null) { - return AppInfo( - appName: ret['appName'], - appVersion: ret['appVersion'], - appUrl: ret['appUrl'], - appSize: ret['appSize'], - description: ret['description'], - sha256: ret['sha256'], - ); - } - } - throw '请求错误:'; } @override diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index d887f121..3ea72bbc 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -3,14 +3,13 @@ import 'dart:io'; import 'package:app/app.dart'; import 'package:app_update/repository/api/upgrade_api.dart'; -import 'package:dio/dio.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:open_file/open_file.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:r_upgrade/r_upgrade.dart'; - +import 'package:fx_dio/fx_dio.dart'; import '../model/app_info.dart'; import 'event.dart'; @@ -31,22 +30,19 @@ class UpgradeBloc extends Bloc { print("========_onCheckUpdate=============="); emit(const CheckLoadingState()); // 检测更新逻辑 - try { - AppInfo result = await api.fetch(event.appName); - print(result); - - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - if (result.shouldUpgrade(packageInfo.version)) { - emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); - } else { - emit(NoUpdateState( - isChecked: true, - checkTime: DateTime.now().millisecondsSinceEpoch, - )); - } - } catch (e) { - print(e); - emit(CheckErrorState(error: e.toString())); + ApiRet ret = await api.fetch(event.appName); + if (ret.failed) { + emit(CheckErrorState(error: ret.msg)); + return; + } + AppInfo result = ret.data; + print(result); + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + if (result.shouldUpgrade(packageInfo.version)) { + emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); + } else { + int time = DateTime.now().millisecondsSinceEpoch; + emit(NoUpdateState(isChecked: true, checkTime: time)); } } @@ -67,7 +63,8 @@ class UpgradeBloc extends Bloc { Response rep = await dio.download( url, filePath, - onReceiveProgress: (c, t) => _onProgressChange(event.appInfo.appSize, c / t), + onReceiveProgress: (c, t) => + _onProgressChange(event.appInfo.appSize, c / t), ); if (rep.statusCode == 200) { add(const ResetNoUpdate()); diff --git a/modules/basic_system/app_update/lib/model/app_info.dart b/modules/basic_system/app_update/lib/model/app_info.dart index deab168b..9340471c 100644 --- a/modules/basic_system/app_update/lib/model/app_info.dart +++ b/modules/basic_system/app_update/lib/model/app_info.dart @@ -25,18 +25,42 @@ class AppInfo extends Equatable { return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; } - bool shouldUpgrade(String current) { - List currentArray = current.split("."); - List upgradeArray = appVersion.split("."); - int length = currentArray.length; - if (length == upgradeArray.length) { - for (int i = 0; i < length; i++) { - if (int.parse(currentArray[i]) == int.tryParse(upgradeArray[i])) { - continue; - } - return int.parse(currentArray[i]) < int.parse(upgradeArray[i]); - } + bool shouldUpgrade(String current) => needsUpdate(current, appVersion); +} + +bool needsUpdate( + String oldVersion, + String newVersion, { + int versionParts = 3, // 默认三位版本号 + String prefix = '', // 默认无前缀 +}) { + // 去除版本号前缀并将其解析为整数列表 + List parseVersion(String version) { + if (prefix.isNotEmpty && version.startsWith(prefix)) { + version = version.substring(prefix.length); // 移除前缀 + } + + final parts = version.split('.'); + if (parts.length != versionParts) { + throw FormatException( + '版本号格式错误,应为包含 $versionParts 位版本号的格式,如 ${prefix}1.0.0'); + } + + return parts.map(int.parse).toList(); + } + + final oldParts = parseVersion(oldVersion); + final newParts = parseVersion(newVersion); + + // 按位比较版本号 + for (int i = 0; i < versionParts; i++) { + if (newParts[i] > oldParts[i]) { + return true; // 新版本号更大,需要更新 + } else if (newParts[i] < oldParts[i]) { + return false; // 新版本号更小,不需要更新 } - return false; } + + // 版本号相同,不需要更新 + return false; } diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart index 700d21a8..1965d52e 100644 --- a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -1,11 +1,11 @@ import '../../model/app_info.dart'; - +import 'package:fx_dio/fx_dio.dart'; abstract class UpgradeApi with CheckUpgrade, Toaster { } mixin CheckUpgrade { - Future fetch(String appName); + Future> fetch(String appName); } mixin Toaster { diff --git a/modules/basic_system/toly_ui/lib/ti/panel.dart b/modules/basic_system/toly_ui/lib/ti/panel.dart index d1b4f24f..e655ad4c 100644 --- a/modules/basic_system/toly_ui/lib/ti/panel.dart +++ b/modules/basic_system/toly_ui/lib/ti/panel.dart @@ -13,11 +13,12 @@ class Panel extends StatelessWidget { Widget build(BuildContext context) { return Container( - child: child, + alignment: Alignment.centerLeft, padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: color ?? const Color(0xffF6F8FA), borderRadius: BorderRadius.all(Radius.circular(radius))), + child: child, ); } } diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart index d6b2cb11..91f6d32d 100644 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_bloc.dart @@ -15,13 +15,11 @@ class PointBloc extends Cubit { void loadPoint() async { emit(const PointLoading()); - try { - final issues = await api.getIssues(); - emit(PointLoaded(issues)); - } catch (err) { - print(err); - emit(PointLoadFailure(err.toString())); + ApiRet> ret = await api.getIssues(); + if(ret.failed){ + emit(PointLoadFailure(ret.msg)); } + emit(PointLoaded(ret.data)); } } diff --git a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart index 7cffbf43..0a71207a 100644 --- a/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart +++ b/modules/knowledge_system/artifact/lib/src/points/bloc/point_comment_bloc.dart @@ -17,15 +17,16 @@ class PointCommentBloc extends Cubit { emit(PointCommentLoading(point)); if (point.number == null) { emit(const PointCommentLoadFailure('point_bloc id 为空')); + return; } - try { - final List comments = await api.getIssuesComment(point.number!); - comments.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); - emit(PointCommentLoaded(point, comments)); - } catch (err) { - print(err); - emit(PointCommentLoadFailure(err.toString())); + ApiRet> ret = await api.getIssuesComment(point.number!); + if (ret.failed) { + emit(PointCommentLoadFailure(ret.msg)); + return; } + final List comments = ret.data; + comments.sort((a, b) => a.createdAt!.compareTo(b.createdAt!)); + emit(PointCommentLoaded(point, comments)); } } diff --git a/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart index 3a8f0c03..d9a4da21 100644 --- a/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart +++ b/modules/knowledge_system/artifact/lib/src/points/repository/api/point_api.dart @@ -6,41 +6,50 @@ import '../../data/model/repository.dart'; import 'package:fx_dio/fx_dio.dart'; import 'package:app/app.dart'; +export 'package:fx_dio/fx_dio.dart' show ApiRet; + abstract interface class PointApi { /// 获取 github 中 FlutterUnit 仓库信息 - Future getFlutterUnitRepo(); + Future> getFlutterUnitRepo(); /// 获取 github 中 FlutterUnit 仓库 issues 列表 - Future> getIssues(); + Future>> getIssues(); - Future> getIssuesComment(int pointId); + Future>> getIssuesComment(int pointId); } class PointApiImpl implements PointApi { - Dio get dio => FxDio()(); + Host get unit => FxDio()(); @override - Future getFlutterUnitRepo() async { - Response rep = await dio.get(UnitApi.repository.path); - dynamic repoStr = rep.data['data']['repositoryData']; - return Repository.fromJson(json.decode(repoStr)); + Future> getFlutterUnitRepo() async { + return unit.get(UnitApi.repository.path, convertor: (data) { + dynamic repoStr = data['data']['repositoryData']; + return Repository.fromJson(json.decode(repoStr)); + }); } @override - Future> getIssues({int page = 1, int pageSize = 100}) async { - Response rep = await dio.get(UnitApi.point.path, queryParameters: { - "page": page, - "pageSize": pageSize, - }); - return rep.data['data'].map((e) => Issue.fromJson(json.decode(e['pointData']))).toList(); + Future>> getIssues( + {int page = 1, int pageSize = 100}) async { + return unit.get>( + UnitApi.point.path, + queryParameters: { + "page": page, + "pageSize": pageSize, + }, + convertor: (data) => data['data'] + .map((e) => Issue.fromJson(json.decode(e['pointData']))) + .toList(), + ); } @override - Future> getIssuesComment(int pointId) async { - Response rep = await dio.get("${UnitApi.pointComment.path}$pointId"); - - return rep.data['data'] - .map((e) => IssueComment.fromJson(json.decode(e['pointCommentData']))) - .toList(); + Future>> getIssuesComment(int pointId) async { + return unit.get>("${UnitApi.pointComment.path}$pointId", + convertor: (data) => data['data'] + .map((e) => + IssueComment.fromJson(json.decode(e['pointCommentData']))) + .toList()); } } diff --git a/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart index d009cee9..fc6563e5 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/desk_ui/desk_point_page.dart @@ -10,6 +10,7 @@ import '../../data/model/repository.dart'; import '../../repository/api/point_api.dart'; import '../issues_point/issues_point_page.dart'; import 'github_repo_panel.dart'; +import 'package:fx_dio/fx_dio.dart'; class DeskPointPage extends StatefulWidget { const DeskPointPage({Key? key}) : super(key: key); @@ -19,7 +20,6 @@ class DeskPointPage extends StatefulWidget { } class _DeskPointPageState extends State { - Repository _repository = Repository.fromJson({ 'full_name': 'toly1994328/FlutterUnit', 'license': {"spdx_id": 'GPL-3.0'}, @@ -40,10 +40,12 @@ class _DeskPointPageState extends State { } void _loadRepo() async { - final Repository result = await _api.getFlutterUnitRepo(); - setState(() { - _repository = result; - }); + final ApiRet ret = await _api.getFlutterUnitRepo(); + if (ret.success) { + setState(() { + _repository = ret.data; + }); + } } @override @@ -61,14 +63,12 @@ class _DeskPointPageState extends State { GithubRepoPanel( repository: _repository, ), - Expanded( - child: SizedBox( - width: 250, - child: IssuesTip()) - ) + Expanded(child: SizedBox(width: 250, child: IssuesTip())) ], ), - VerticalDivider(width: 1,), + VerticalDivider( + width: 1, + ), Expanded(flex: 2, child: IssuesPointContent()), ], )) @@ -90,17 +90,14 @@ class IssuesTip extends StatelessWidget { TextSpan(children: [ TextSpan( text: '* 注: ', - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold)), + style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold)), TextSpan( text: - '要点集录中的 QA 数据收录在 FlutterUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'), + '要点集录中的 QA 数据收录在 FlutterUnit 以 point 为标签的 issues 中。如果需要提供数据,在 issues 中问答即可。'), TextSpan( text: '点击这里跳转', mouseCursor: SystemMouseCursors.click, - recognizer: TapGestureRecognizer() - ..onTap = _toUrl, + recognizer: TapGestureRecognizer()..onTap = _toUrl, style: TextStyle( color: Colors.blue, decoration: TextDecoration.underline, @@ -111,42 +108,43 @@ class IssuesTip extends StatelessWidget { ); } - void _toUrl() async{ - String url = 'https://github.com/toly1994328/FlutterUnit/issues?q=label%3Apoint+'; + void _toUrl() async { + String url = + 'https://github.com/toly1994328/FlutterUnit/issues?q=label%3Apoint+'; if (!await launchUrl(Uri.parse(url))) { - throw Exception('Could not launch $url'); + throw Exception('Could not launch $url'); } } } - class SimpleDeskTopBar extends StatelessWidget { final Widget? leading; final Widget? tail; final double height; - const SimpleDeskTopBar({super.key, this.leading,this.tail,this.height=64}); + const SimpleDeskTopBar( + {super.key, this.leading, this.tail, this.height = 64}); @override Widget build(BuildContext context) { - bool isDark = Theme.of(context).brightness == Brightness.dark; return DragToMoveWrapper( child: Container( height: height, - color: isDark? Color(0xff2C3036):Colors.white, + color: isDark ? Color(0xff2C3036) : Colors.white, child: Row( children: [ - if (leading != null) Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: leading!, - ), + if (leading != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: leading!, + ), const Spacer(), const SizedBox( width: 20, ), - if(tail!=null) tail!, + if (tail != null) tail!, const WindowButtons(), ], ), @@ -154,5 +152,3 @@ class SimpleDeskTopBar extends StatelessWidget { ); } } - - diff --git a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart index 108ea72b..99f19db1 100644 --- a/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart +++ b/modules/knowledge_system/artifact/lib/src/points/view/issues_point/issues_point_page.dart @@ -4,7 +4,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import '../../bloc/bloc.dart'; -import '../../data/api/issues_api.dart'; import '../../data/model/issue.dart'; import '../../data/model/repository.dart'; import '../../repository/api/point_api.dart'; @@ -23,7 +22,8 @@ class IssuesPointScope extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (_) => PointBloc(PointApiImpl())..loadPoint()), + BlocProvider( + create: (_) => PointBloc(PointApiImpl())..loadPoint()), ], child: const IssuesPointPage(), ); @@ -84,7 +84,8 @@ class _IssuesPointContentState extends State { List issues = state.issues; return SliverList( delegate: SliverChildBuilderDelegate( - (ctx, int index) => IssueItem(onTap: toDetailPage, issue: issues[index]), + (ctx, int index) => + IssueItem(onTap: toDetailPage, issue: issues[index]), childCount: issues.length, ), ); @@ -159,9 +160,11 @@ class _IssuesPointContentState extends State { void _loadRepo() async { PointApi api = context.read().api; - final Repository result = await api.getFlutterUnitRepo(); - setState(() { - _repository = result; - }); + final ApiRet ret = await api.getFlutterUnitRepo(); + if (ret.success) { + setState(() { + _repository = ret.data; + }); + } } } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart index 14d4263b..e70bdf11 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/node_display.dart @@ -28,12 +28,8 @@ class NodeDisplay extends StatelessWidget { Widget build(BuildContext context) { Color primaryColor = Theme.of(context).primaryColor; var style = context.select((AppConfigBloc bloc) => bloc.state.codeStyle); - - bool isDesk = - kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; - EdgeInsets pd = isDesk - ? const EdgeInsets.symmetric(horizontal: 24, vertical: 8) - : const EdgeInsets.all(8.0); + bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; + EdgeInsets pd = isDesk ? const EdgeInsets.symmetric(horizontal: 24, vertical: 8) : const EdgeInsets.all(8.0); return Padding( padding: pd, child: Column( @@ -49,14 +45,11 @@ class NodeDisplay extends StatelessWidget { Widget _buildNodeInfo(Color primaryColor) => Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: SizedBox( - width: double.infinity, - child: Panel( - color: primaryColor.withOpacity(0.04), - child: Text( - node.subtitle, - style: const TextStyle(fontSize: 12), - )), - ), + child: Panel( + color: primaryColor.withOpacity(0.04), + child: Text( + node.subtitle, + style: const TextStyle(fontSize: 12), + )), ); } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json index 8e387049..7e0c96b8 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_zh-CN.json @@ -5,7 +5,7 @@ "info": "复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。", "lever": 4, "family": 1, - "linkIds": [], + "linkIds": [326,17], "nodes": [ { "file": "node1_base.dart", diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json new file mode 100644 index 00000000..205ecbe6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_zh-CN.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "复选框·macOS风格", + "info": "一个 macOS 风格的复选框,支持三态;使用时需要提供 value 值和 onChanged 回调函数。", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 使用", + "desc": [ + "【value】 : 是否选中 【bool?】", + "【onChanged】 : 变化回调 【ValueChanged?】", + "【checkColor】 : 选中时√颜色 【Color?】", + "【activeColor】 : 选中背景颜色 【Color?】", + "【activeColor】 : 选中背景颜色 【Color?】", + "【inactiveColor】 : 非激活是边线色/不可用背景色 【Color?】", + "onChanged 为 null 时,表示不可用。" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 三态", + "desc": [ + "【tristate】 : 是否启用三态 【bool】", + "三态时,值为 null 为 - " + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 边线与形状", + "desc": [ + "【shape】 : 形状 【OutlinedBorder?】", + "【side】 : 边线 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart new file mode 100644 index 00000000..fedab6fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node1.dart @@ -0,0 +1,45 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo1 extends StatefulWidget { + const CupertinoCheckboxDemo1({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo1State(); +} + +class _CupertinoCheckboxDemo1State extends State { + bool? _active = false; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + CupertinoCheckbox( + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + + CupertinoCheckbox( + value: _active, + checkColor: Colors.yellow, + activeColor: Colors.purple, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + value: true, + inactiveColor: Colors.black.withOpacity(0.2), + onChanged: null, + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart new file mode 100644 index 00000000..1f1167a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node2.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo2 extends StatefulWidget { + const CupertinoCheckboxDemo2({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo2State(); +} + +class _CupertinoCheckboxDemo2State extends State { + bool? _active = false; + + @override + Widget build(BuildContext context) { + return + CupertinoCheckbox( + value: _active, + tristate: true, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart new file mode 100644 index 00000000..7253583f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/node3.dart @@ -0,0 +1,48 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoCheckboxDemo3 extends StatefulWidget { + const CupertinoCheckboxDemo3({super.key}); + + @override + State createState() => _CupertinoCheckboxDemo3State(); +} + +class _CupertinoCheckboxDemo3State extends State { + bool? _active = false; + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + CupertinoCheckbox( + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + side: const BorderSide(color: Colors.black12), + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + CupertinoCheckbox( + shape: const StadiumBorder(), + side: const BorderSide(color: Colors.black12), + value: _active, + onChanged: (bool? value) { + setState(() { + _active = value; + }); + }, + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json new file mode 100644 index 00000000..89fe1e0f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_zh-CN.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "单选钮·macOS风格", + "info": "一个 macOS 风格的选钮,value 和 groupValue 一起决定该单选按钮是否被选中; onChanged 回调点击事件。", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 使用", + "desc": [ + "【value】 : 选钮值 【T】", + "【groupValue】 : 当前匹配值 【T】", + "【onChanged】 : 改变时回调 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 颜色", + "desc": [ + "【activeColor】 : 激活背景颜色 【Color?】", + "【fillColor】 : 填充 【Color?】", + "【inactiveColor】 : 未激活背景颜色 【Color?】", + "【focusColor】 : 聚焦色 【Color?】", + "【mouseCursor】 : 鼠标指针样式 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "是否支持切换", + "desc": [ + "【toggleable】 : 是否支持切换 【bool】", + "toggleable 默认为 false, 为 true 时,点击激活的选钮,会回调 null 数据,以此支持选中和非选择切换需求。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart new file mode 100644 index 00000000..bfe2b26c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node1.dart @@ -0,0 +1,32 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoRadioDemo1 extends StatefulWidget { + const CupertinoRadioDemo1({super.key}); + + @override + State createState() => _CupertinoRadioDemo1State(); +} + +class _CupertinoRadioDemo1State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + value: value, + groupValue: _value, + onChanged: _onChange, + )) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value ?? 0); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart new file mode 100644 index 00000000..d2925e4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node2.dart @@ -0,0 +1,36 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class CupertinoRadioDemo2 extends StatefulWidget { + const CupertinoRadioDemo2({super.key}); + + @override + State createState() => _CupertinoRadioDemo2State(); +} + +class _CupertinoRadioDemo2State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + mouseCursor: SystemMouseCursors.click, + activeColor: Colors.purple, + fillColor: Colors.cyanAccent, + inactiveColor: Colors.cyanAccent.withOpacity(0.05), + focusColor: Colors.yellow.withOpacity(0.2), + value: value, + groupValue: _value, + onChanged: _onChange)) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value ?? 0); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart new file mode 100644 index 00000000..cc01444a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/node3.dart @@ -0,0 +1,32 @@ +import 'package:flutter/cupertino.dart'; + +class CupertinoRadioDemo3 extends StatefulWidget { + const CupertinoRadioDemo3({super.key}); + + @override + State createState() => _CupertinoRadioDemo3State(); +} + +class _CupertinoRadioDemo3State extends State { + List data = [0, 1, 2, 3, 4, 5]; + int? _value = 1; + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 6, + children: data + .map((int value) => CupertinoRadio( + mouseCursor: SystemMouseCursors.click, + toggleable: true, + value: value, + groupValue: _value, + onChanged: _onChange)) + .toList(), + ); + } + + void _onChange(int? value) { + setState(() => _value = value); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json index fdcbd66d..05943372 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_zh-CN.json @@ -5,7 +5,7 @@ "info": "由于选中和未选择状态的圆钮,多个Radio根据逻辑可以实现单选或多选的需求。可指定颜色,接收状态变化回调。", "lever": 4, "family": 1, - "linkIds": [], + "linkIds": [19,240], "nodes": [ { "file": "node1_base.dart", diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart index 606f58d8..e4f9b7f4 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateful_unit.dart @@ -181,4 +181,11 @@ export '../StatefulWidget/OutlinedButton/node2_style.dart'; export '../StatefulWidget/NavigationRail/node1_base.dart'; export '../StatefulWidget/NavigationRail/node2_extend.dart'; -export '../StatefulWidget/NavigationRail/node3_dark.dart'; \ No newline at end of file +export '../StatefulWidget/NavigationRail/node3_dark.dart'; +export '../StatefulWidget/CupertinoCheckbox/node1.dart'; +export '../StatefulWidget/CupertinoCheckbox/node2.dart'; +export '../StatefulWidget/CupertinoCheckbox/node3.dart'; + +export '../StatefulWidget/CupertinoRadio/node1.dart'; +export '../StatefulWidget/CupertinoRadio/node2.dart'; +export '../StatefulWidget/CupertinoRadio/node3.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index f1468169..94287d7b 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -198,12 +198,18 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '48#0' => const CustomCupertinoActivityIndicator(), '156#0' => const CustomCupertinoApp(), '24#0' => const CustomCupertinoButton(), + '238#0' => const CupertinoCheckboxDemo1(), + '238#1' => const CupertinoCheckboxDemo2(), + '238#2' => const CupertinoCheckboxDemo3(), '143#0' => const CustomCupertinoContextMenu(), '144#0' => const CustomCupertinoContextMenuAction(), '137#0' => const CustomCupertinoDatePicker(), '62#0' => const CustomCupertinoNavigationBar(), '157#0' => const CustomCupertinoPageScaffold(), '139#0' => const CustomCupertinoPicker(), + '240#0' => const CupertinoRadioDemo1(), + '240#1' => const CupertinoRadioDemo2(), + '240#2' => const CupertinoRadioDemo3(), '195#0' => const CustomCupertinoScrollbar(), '262#0' => const CupertinoSegmentedControlDemo(), '262#1' => const CupertinoSegmentedControlColor(), @@ -488,4 +494,4 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '10#1' => const ReplacementVisibility(), _ => const SizedBox(), }; -} \ No newline at end of file +} diff --git a/pubspec.lock b/pubspec.lock index ef49c760..1a32fa21 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -281,10 +281,10 @@ packages: dependency: "direct main" description: name: fx_dio - sha256: ab16f0322f05fd4381e7375c9f3bb1f18b8fbf87f8dca46955b4a2661e5836a1 + sha256: c2a525ff6a8a70d9f39e26d335fac0eff1a605749b80affa50f9e2155288859f url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.2" + version: "0.0.3" fx_go_router_ext: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0184b094..5840ab7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: fx_platform_adapter: ^0.0.2+1 # 平台适配器 fx_go_router_ext: 0.0.3 # 路由 fx_dao: 0.0.1+2 # 数据库 + fx_dio: 0.0.3 fx_boot_starter: 0.1.1 # app 启动器 # 数据与持久化 @@ -74,7 +75,6 @@ dependencies: # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 - fx_dio: ^0.0.2 dev_dependencies: flutter_test: From 8f6ca43e88dea7b0a6bbef3bc7f5a33314edea4a Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 3 Dec 2024 09:47:31 +0800 Subject: [PATCH 112/149] add TickerMode/UndoHistory --- assets/flutter.db | Bin 1490944 -> 1499136 bytes .../storage/lib/src/app_storage.dart | 1 + .../db_storage/flutter/dao/category_dao.dart | 203 ------------------ .../src/db_storage/flutter/dao/like_dao.dart | 69 ------ .../src/db_storage/flutter/dao/node_dao.dart | 41 ---- .../db_storage/flutter/dao/widget_dao.dart | 105 --------- .../lib/src/db_storage/flutter/flutter.dart | 16 -- .../db_storage/flutter/flutter_db_store.dart | 3 +- .../db_storage/flutter/model/category_po.dart | 86 -------- .../src/db_storage/flutter/model/enums.dart | 13 -- .../src/db_storage/flutter/model/node_po.dart | 38 ---- .../flutter/model/widget_filter.dart | 48 ----- .../db_storage/flutter/model/widget_po.dart | 74 ------- .../storage/lib/src/db_storage/storage.dart | 1 - .../artifact/lib/artifact.dart | 1 + .../lib/src/articles/bloc/article/bloc.dart | 3 +- .../lib/src/articles/bloc/columnize/bloc.dart | 3 +- .../src/articles/data}/dao/article_dao.dart | 0 .../src/articles/data}/dao/columnize_dao.dart | 0 .../artifact/lib/src/articles/data/exp.dart | 6 +- .../lib/src/articles/data}/model/article.dart | 0 .../src/articles/data}/model/columnize.dart | 1 - .../data/repository/article_repository.dart | 3 + .../data/repository/columnize_repository.dart | 2 + .../view/article/article_detail_page.dart | 3 +- .../view/article/column_detail_page.dart | 2 +- .../view/article/columnize_page_view.dart | 7 +- .../articles/view/article/sliver_article.dart | 47 ++-- .../StatefulWidget/TickerMode/desc_zh-CN.json | 20 ++ .../lib/StatefulWidget/TickerMode/node1.dart | 51 +++++ .../UndoHistory/desc_zh-CN.json | 20 ++ .../lib/StatefulWidget/UndoHistory/node1.dart | 108 ++++++++++ .../widgets/lib/exp/stateful_unit.dart | 4 +- .../widgets/lib/node_display_map.dart | 7 +- 34 files changed, 253 insertions(+), 733 deletions(-) delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/dao/category_dao.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart delete mode 100644 modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart rename modules/{basic_system/storage/lib/src/db_storage/flutter => knowledge_system/artifact/lib/src/articles/data}/dao/article_dao.dart (100%) rename modules/{basic_system/storage/lib/src/db_storage/flutter => knowledge_system/artifact/lib/src/articles/data}/dao/columnize_dao.dart (100%) rename modules/{basic_system/storage/lib/src/db_storage/flutter => knowledge_system/artifact/lib/src/articles/data}/model/article.dart (100%) rename modules/{basic_system/storage/lib/src/db_storage/flutter => knowledge_system/artifact/lib/src/articles/data}/model/columnize.dart (98%) create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart diff --git a/assets/flutter.db b/assets/flutter.db index 499fa41e62df69b38453eb0a1e78ecff05781d5c..54cda0c8f3df0a19157aaabeaa4b9d571a6d70a1 100644 GIT binary patch delta 14116 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 C_NTA_ delta 11841 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 ''; -// -// @override -// String get name => 'category'; -// -// -// -// Future insert(CategoryPo category) async { -// //插入方法 -// String addSql = //插入数据 -// "INSERT INTO " -// "category(id,name,color,info,priority,image,created,updated) " -// "VALUES (?,?,?,?,?,?,?,?);"; -// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ -// category.id, -// category.name, -// category.color, -// category.info, -// category.priority, -// category.image, -// category.created?.toIso8601String(), -// category.updated.toIso8601String(), -// ])); -// } -// -// Future update(CategoryPo widget) async { -// //插入方法 -// String updateSql = //插入数据 -// "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " -// "WHERE id = ?"; -// -// return await database.transaction((tran) async => -// await tran.rawUpdate(updateSql, [ -// widget.name, -// widget.color, -// widget.info, -// widget.priority, -// widget.image, -// widget.updated.toIso8601String(), -// widget.id, -// ])); -// } -// -// -// -// Future addWidget(int categoryId,int widgetId,) async { -// String addSql = //插入数据 -// "INSERT INTO " -// "category_widget(widgetId,categoryId) " -// "VALUES (?,?);"; -// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ -// widgetId, -// categoryId, -// ])); -// } -// -// Future addWidgets(int categoryId,List widgetIds) async { -// String addSql = //插入数据 -// "INSERT INTO " -// "category_widget(widgetId,categoryId) VALUES "; -// -// String args = ''; -// -// for(int i=0;i< widgetIds.length;i++){ -// args+= "(${widgetIds[i]},$categoryId)"; -// if(i==widgetIds.length-1){ -// args+=";"; -// }else{ -// args+=","; -// } -// } -// addSql += args; -// return await database.transaction((tran) async => await tran.rawInsert(addSql)); -// } -// -// Future existByName(String name) async { -// String sql = //插入数据 -// "SELECT COUNT(name) as count FROM category " -// "WHERE name = ?"; -// List> rawData = await database.rawQuery(sql, [name]); -// if (rawData.isNotEmpty) { -// return rawData[0]['count'] > 0; -// } -// return false; -// } -// -// Future>> queryAll() async { -// List> data = await database.rawQuery( -// "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" -// "FROM category AS c " -// "LEFT JOIN category_widget AS cw " -// "ON c.id = cw.categoryId GROUP BY c.id " -// "ORDER BY priority DESC,created DESC", -// []); -// return data; -// } -// -// Future> categoryWidgetIds(int id) async { -// List> data = await database.rawQuery( -// "SELECT categoryId FROM `category_widget`" -// "WHERE widgetId = ?", -// [id]); -// return data.toList().map((e)=>e["categoryId"]).toList(); -// } -// -// -// -// Future deleteCollect(int id) async { -// await database.execute( -// "DELETE FROM category_widget " -// "WHERE categoryId = ?", -// [id]); -// return await database.execute( -// "DELETE FROM category " -// "WHERE id = ?", -// [id]); -// } -// -// Future clear() async { -// await database.execute( -// "DELETE FROM category_widget " -// "WHERE categoryId >0"); -// return await database.execute( -// "DELETE FROM category " -// "WHERE id > 0"); -// } -// -// Future removeWidget(int categoryId, int widgetId) async { -// //插入方法 -// String deleteSql = //插入数据 -// "DELETE FROM " -// "category_widget WHERE categoryId = ? AND widgetId = ? "; -// return await database -// .transaction((tran) async => await tran.rawInsert(deleteSql, [ -// categoryId, -// widgetId, -// ])); -// } -// -// Future existWidgetInCollect(int categoryId, int widgetId) async { -// String sql = //插入数据 -// "SELECT COUNT(id) as count FROM category_widget " -// "WHERE categoryId = ? AND widgetId = ?"; -// List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); -// if (rawData.isNotEmpty) { -// return rawData[0]['count'] > 0; -// } -// return false; -// } -// -// Future toggleCollect(int categoryId, int widgetId) async { -// if (await existWidgetInCollect(categoryId, widgetId)) { -// //已存在: 移除 -// await removeWidget(categoryId, widgetId); -// } else { -// await addWidget(categoryId, widgetId); -// } -// } -// -// Future toggleCollectDefault(int widgetId) async { -// await toggleCollect(1, widgetId); -// } -// -// Future>> loadCollectWidgets(int categoryId) async{ -// String querySql = //插入数据 -// "SELECT * FROM widget " -// "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " -// "ORDER BY lever DESC"; -// -// return await database.rawQuery(querySql,[categoryId]); -// } -// -// Future> loadCollectWidgetIds(int categoryId) async{ -// String querySql = //插入数据 -// "SELECT id FROM widget " -// "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " -// "ORDER BY lever DESC"; -// -// var data = await database.rawQuery(querySql,[categoryId]); -// return data.map((e) => e["id"] as int).toList(); -// } -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart deleted file mode 100644 index 7126cea8..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/like_dao.dart +++ /dev/null @@ -1,69 +0,0 @@ -// import 'package:fx_dao/fx_dao.dart'; -// import 'package:sqflite/sqflite.dart'; -// -// class LikeDao with HasDatabase, DbTable{ -// @override -// String get createSql => ''; -// -// @override -// String get name => 'like_widget'; -// -// Future> likeWidgetIds() async { -// var result = await database.rawQuery("SELECT widget_id FROM like_widget"); -// var ids = result.map((e) => e['widget_id'] as int).toList(); -// return ids; -// } -// -// // 如果已喜欢,取消喜欢 -// // 如果未喜欢,设为喜欢 -// Future toggleCollect(int widgetId) async { -// bool liked = await isLiked(widgetId); -// -// if (liked) { -// await unlike(widgetId, check: false); -// } else { -// await like(widgetId, check: false); -// } -// } -// -// Future like(int widgetId, {bool check = true}) async { -// if (check) { -// // 如果 liked_widget_bloc ,直接取消,不执行 liked_widget_bloc 操作 -// bool liked = await isLiked(widgetId); -// if (liked) return 0; -// } -// -// return await database.rawInsert( -// "INSERT INTO " -// "like_widget(widget_id) " -// "VALUES (?);", -// [widgetId]); -// } -// -// Future unlike(int widgetId, {bool check = true}) async { -// if (check) { -// // 如果未 liked_widget_bloc ,直接取消,不执行 unlike 操作 -// bool liked = await isLiked(widgetId); -// if (!liked) return; -// } -// await database.execute( -// "DELETE FROM like_widget " -// "WHERE widget_id = ?", -// [widgetId]); -// } -// -// // 判断组件是否已 liked -// Future isLiked(int widgetId) async { -// var data = await database.rawQuery( -// "Select count(id) as `count` FROM like_widget " -// "WHERE widget_id = ?", -// [widgetId]); -// if (data.isNotEmpty) { -// var result = data[0]; -// return result['count'] as int > 0; -// } -// return false; -// } -// -// -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart deleted file mode 100644 index 99ce75fd..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/node_dao.dart +++ /dev/null @@ -1,41 +0,0 @@ -// import 'package:fx_dao/fx_dao.dart'; -// import 'package:storage/storage.dart'; -// -// import '../model/node_po.dart'; -// -// class NodeDao with HasDatabase, DbTable { -// -// @override -// String get createSql => ''; -// -// @override -// String get name => 'node'; -// -// Future insert(NodePo widget) async { -// //插入方法 -// String addSql = //插入数据 -// "INSERT INTO " -// "node(widgetId,name,priority,subtitle,code) " -// "VALUES (?,?,?,?,?);"; -// return await database.transaction((tran) async => await tran.rawInsert(addSql, [ -// widget.widgetId, -// widget.name, -// widget.priority, -// widget.subtitle, -// widget.code -// ])); -// } -// -// Future>> queryAll() async { -// return await database.rawQuery("SELECT * FROM node"); -// } -// -// //根据 id 查询组件 node -// Future>> queryById(int id) async { -// return await database.rawQuery( -// "SELECT name,subtitle,code " -// "FROM node " -// "WHERE widgetId = ? ORDER BY priority", -// [id]); -// } -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart deleted file mode 100644 index cecd7745..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/widget_dao.dart +++ /dev/null @@ -1,105 +0,0 @@ -// import 'package:fx_dao/fx_dao.dart'; -// -// import '../model/enums.dart'; -// import '../model/widget_filter.dart'; -// import '../model/widget_po.dart'; -// -// class WidgetDao with HasDatabase, DbTable { -// @override -// String get createSql => ''; -// -// @override -// String get name => 'widget'; -// -// Future insert(WidgetPo widget) async { -// //插入方法 -// String addSql = //插入数据 -// "INSERT INTO " -// "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " -// "VALUES (?,?,?,?,?,?,?,?);"; -// return database.transaction((tran) async => await tran.rawInsert(addSql, [ -// widget.id, -// widget.name, -// widget.nameCN, -// widget.deprecated, -// widget.family, -// widget.lever, -// widget.linkWidget, -// widget.info -// ])); -// } -// -// Future>> queryAll() async { -// return database.rawQuery("SELECT * FROM widget"); -// } -// -// Future>> queryByFamily(WidgetFamily family) async { -// return database.rawQuery( -// "SELECT * " -// "FROM widget WHERE family = ? ORDER BY lever DESC", -// [family.index]); -// } -// -// Future>> queryByIds(List ids) async { -// if (ids.isEmpty) { -// return []; -// } -// String sql = "SELECT * " -// "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; -// -// return database.rawQuery(sql, [...ids]); -// } -// -// Future>> search(WidgetFilter arguments) async { -// // 保证 name 参数为空时,不进行搜索 -// if (arguments.name.isEmpty) { -// return []; -// } -// -// // * 表示 name 任意 -// String name = arguments.name == '*' ? '' : arguments.name; -// bool hasFamily = arguments.family != null; -// String familySql = hasFamily ? ' AND family = ?' : ''; -// List familyArg = hasFamily ? [arguments.family!.index] : []; -// List starArg = arguments.stars; -// // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 -// if (arguments.stars.reduce((a, b) => a + b) == -5) { -// starArg = [1, 2, 3, 4, 5]; -// } -// return database.rawQuery( -// "SELECT * " -// "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", -// [ -// "%$name%", -// "%$name%", -// "%$name%", -// ...familyArg, -// ...starArg, -// arguments.pageSize, -// arguments.offset -// ]); -// } -// -// Future total(WidgetFilter args) async { -// bool hasFamily = args.family != null; -// String familySql = hasFamily ? 'family = ?' : ''; -// List familyArg = hasFamily ? [args.family!.index] : []; -// -// String sql = "SELECT count(id) as `count` FROM widget WHERE $familySql"; -// -// List> result = await database.rawQuery(sql, familyArg); -// if (result.isNotEmpty) { -// return result.first['count'] as int ?? 0; -// } -// return 0; -// } -// -// Future?> queryWidgetByName(String name) async { -// String sql = "SELECT * FROM widget WHERE name = ?"; -// List> result = await database.rawQuery(sql, [name]); -// if (result.isNotEmpty) { -// return result.first; -// } -// return null; -// } -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart deleted file mode 100644 index 21072e88..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter.dart +++ /dev/null @@ -1,16 +0,0 @@ -export 'dao/category_dao.dart'; -export 'dao/like_dao.dart'; -export 'dao/node_dao.dart'; -export 'dao/widget_dao.dart'; -export 'dao/article_dao.dart'; -export 'dao/columnize_dao.dart'; - -export 'model/category_po.dart'; -export 'model/node_po.dart'; -export 'model/widget_po.dart'; -export 'model/article.dart'; -export 'model/columnize.dart'; -export 'model/enums.dart'; -export 'model/widget_filter.dart'; - -export 'flutter_db_store.dart'; \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart index 7c747d0e..e78b638c 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter/flutter_db_store.dart @@ -3,8 +3,8 @@ import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:fx_dao/fx_dao.dart'; -import 'dao/columnize_dao.dart'; import 'package:widget_module/widget_module.dart'; +import 'package:artifact/artifact.dart'; class FlutterDbStore extends FxDb { @override @@ -28,6 +28,7 @@ class FlutterDbStore extends FxDb { @override Iterable get tables => [ ColumnizeDao(), + ArticleDao(), CategoryDao(), WidgetDao(), NodeDao(), diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart deleted file mode 100644 index aaca07de..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/category_po.dart +++ /dev/null @@ -1,86 +0,0 @@ -// /// create by 张风捷特烈 on 2020-04-17 -// /// contact me by email 1981462002@qq.com -// /// 说明: 收藏夹数据库-数据模型 -// -// // """ -// // CREATE TABLE IF NOT EXISTS category( -// // id INTEGER PRIMARY KEY AUTOINCREMENT, -// // name VARCHAR(64) NOT NULL, -// // color VARCHAR(9) DEFAULT '#FF2196F3', -// // info VARCHAR(256) DEFAULT '这里什么都没有...', -// // created DATETIME NOT NULL, -// // updated DATETIME NOT NULL, -// // priority INTEGER DEFAULT 0, -// // image VARCHAR(128) NULL image DEFAULT '' -// // );"""; //建表语句 -// -// class CategoryPo { -// final int? id; -// final String name; -// final String color; -// final String info; -// final DateTime? created; -// final DateTime updated; -// final String image; -// final int count; -// final int priority; -// -// const CategoryPo({ -// this.id, -// required this.name, -// this.color = '#FFF2F2F2', -// this.created, -// required this.updated, -// this.count = 0, -// this.priority = 0, -// this.info = '这里什么都没有...', -// this.image = '', -// }); -// -// factory CategoryPo.fromJson(Map map) { -// return CategoryPo( -// id: map['id'], -// name: map['name'], -// color: map["color"], -// created: DateTime.parse(map["created"]), -// image: map["image"], -// priority: map["priority"], -// count: map["count"], -// updated: DateTime.parse(map["updated"]), -// info: map["info"]); -// } -// -// factory CategoryPo.fromNetJson(Map map) { -// return CategoryPo( -// id: map['id'], -// name: map['name'], -// color: map["color"], -// created: DateTime.fromMillisecondsSinceEpoch(map["created"]), -// image: map["image"], -// priority: map["priority"], -// count: map["count"], -// updated: DateTime.fromMillisecondsSinceEpoch(map["updated"]), -// info: map["info"]); -// } -// -// Map toJson() => { -// "id": id, -// "name": name, -// "info": info, -// "created": created?.millisecondsSinceEpoch, -// "updated": updated.millisecondsSinceEpoch, -// "image": image, -// "count": count, -// "color": color, -// "priority": priority, -// }; -// -// @override -// String toString() { -// return 'CategoryPo{id: $id, name: $name, color: $color, info: $info, created: $created, updated: $updated, image: $image, count: $count, priority: $priority}'; -// } -// -// @override -// List get props => -// [id, name, color, created, image, info, updated, priority,count]; -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart deleted file mode 100644 index 097c34b6..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/enums.dart +++ /dev/null @@ -1,13 +0,0 @@ -/// create by 张风捷特烈 on 2020-03-07 -/// contact me by email 1981462002@qq.com -/// 说明: - -// enum WidgetFamily { -// statelessWidget, -// statefulWidget, -// singleChildRenderObjectWidget, -// multiChildRenderObjectWidget, -// sliver, -// proxyWidget, -// other, -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart deleted file mode 100644 index e25953c6..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/node_po.dart +++ /dev/null @@ -1,38 +0,0 @@ -// -// /// create by 张风捷特烈 on 2020-03-04 -// /// contact me by email 1981462002@qq.com -// /// 说明: 详情页节点-数据库-数据模型 -// /// -// class NodePo { -// final int id; -// final int widgetId; -// final String name; -// final int priority; -// final String subtitle; -// final String code; -// -// const NodePo({ -// required this.id, -// required this.widgetId, -// required this.name, -// required this.priority, -// required this.subtitle, -// required this.code, -// }); -// -// factory NodePo.fromJson(Map map) { -// return NodePo( -// id: map['id']??0, -// name: map['name'], -// widgetId: map["widgetId"], -// priority: map["priority"], -// subtitle: map["subtitle"], -// code: map["code"]); -// } -// -// @override -// String toString() { -// return 'NodePo{id: $id, widgetId: $widgetId, name: $name, priority: $priority, subtitle: $subtitle, code: $code}'; -// } -// -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart deleted file mode 100644 index 95620a52..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_filter.dart +++ /dev/null @@ -1,48 +0,0 @@ -// import 'enums.dart'; -// -// -// -// class WidgetFilter { -// final String name; -// final WidgetFamily? family; -// final List stars; -// final int page; -// final int pageSize; -// -// const WidgetFilter({ -// this.name = '', -// this.family, -// this.stars = const [-1, -1, -1, -1, -1], -// this.page = 1, -// this.pageSize = 20, -// }); -// -// int get offset =>pageSize*(page-1); -// -// WidgetFilter.family( -// this.family, { -// this.name = '*', -// this.page = 1, -// this.pageSize = 20, -// this.stars = const [1, 2, 3, 4, 5], -// }); -// -// WidgetFilter copyWith({ -// String? name, -// WidgetFamily? family, -// List? stars, -// int? page, -// }) { -// return WidgetFilter( -// name: name ?? this.name, -// family: family ?? this.family, -// stars: stars ?? this.stars, -// page: page ?? this.page, -// ); -// } -// -// @override -// String toString() { -// return 'WidgetFilter{name: $name, family: $family, stars: $stars, page: $page}'; -// } -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart b/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart deleted file mode 100644 index 10695353..00000000 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/widget_po.dart +++ /dev/null @@ -1,74 +0,0 @@ -// -// /// create by 张风捷特烈 on 2020-03-04 -// /// contact me by email 1981462002@qq.com -// /// 说明: 组件信息-数据库-数据模型 -// /// -// -// -// class WidgetPo { -// final int id; -// final String name; -// final String nameCN; -// final int deprecated; -// final int family; -// final double lever; -// final String info; -// final String linkWidget; -// -// const WidgetPo({ -// required this.id, -// required this.name, -// required this.nameCN, -// required this.deprecated, -// required this.family, -// required this.lever, -// required this.linkWidget, -// required this.info, -// }); -// -// factory WidgetPo.fromJson(Map map) { -// return WidgetPo( -// id: map['id'], -// name: map['name'], -// nameCN: map["nameCN"], -// family: map["family"], -// deprecated: map["deprecated"] ?? 0, -// lever: map["lever"].toDouble(), -// linkWidget: map["linkWidget"], -// info: map["info"]); -// } -// -// factory WidgetPo.fromDesc(Map map) { -// return WidgetPo( -// id: map['id'], -// name: map['name'], -// nameCN: map["localName"], -// family: map["family"], -// lever: map["lever"].toDouble(), -// linkWidget: map["linkIds"].join(','), -// deprecated: map["deprecated"] ?? 0, -// info: map["info"]); -// } -// -// Map toJson() { -// return { -// "id": id, -// "name": name, -// "nameCN": nameCN, -// "family": family, -// "deprecated": deprecated, -// "lever": lever, -// "linkWidget": linkWidget, -// "info": info -// }; -// } -// -// @override -// String toString() { -// return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, deprecated: $deprecated, family: $family, lever: $lever, info: $info}'; -// } -// -// @override -// List get props => -// [id, name, nameCN, deprecated, family, linkWidget, lever, info]; -// } diff --git a/modules/basic_system/storage/lib/src/db_storage/storage.dart b/modules/basic_system/storage/lib/src/db_storage/storage.dart index 2748c119..c07707a4 100644 --- a/modules/basic_system/storage/lib/src/db_storage/storage.dart +++ b/modules/basic_system/storage/lib/src/db_storage/storage.dart @@ -1,2 +1 @@ -export 'flutter/flutter.dart'; export 'flutter_unit/flutter_unit.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/artifact.dart b/modules/knowledge_system/artifact/lib/artifact.dart index bccd3eba..42e84e72 100644 --- a/modules/knowledge_system/artifact/lib/artifact.dart +++ b/modules/knowledge_system/artifact/lib/artifact.dart @@ -3,4 +3,5 @@ library artifact; export 'src/articles/view/artifact_page.dart'; export 'src/points/exp.dart'; +export 'src/articles/data/exp.dart'; export 'src/articles/view/desk_artifact_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart index 5b93edb4..5e73e1f6 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/bloc/article/bloc.dart @@ -1,5 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:storage/storage.dart'; + +import '../../data/exp.dart'; import '../../data/repository/article_repository.dart'; diff --git a/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart b/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart index 4f16c3ad..9fda14c6 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/bloc/columnize/bloc.dart @@ -1,6 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:storage/storage.dart'; - +import '../../data/exp.dart'; import '../../data/repository/columnize_repository.dart'; class ColumnizeBloc extends Cubit { diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart similarity index 100% rename from modules/basic_system/storage/lib/src/db_storage/flutter/dao/article_dao.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart similarity index 100% rename from modules/basic_system/storage/lib/src/db_storage/flutter/dao/columnize_dao.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart b/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart index d8486c55..4207924f 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/exp.dart @@ -1,2 +1,6 @@ export 'repository/article_repository.dart'; -export 'repository/columnize_repository.dart'; \ No newline at end of file +export 'repository/columnize_repository.dart'; +export 'model/article.dart'; +export 'model/columnize.dart'; +export 'dao/article_dao.dart'; +export 'dao/columnize_dao.dart'; \ No newline at end of file diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/article.dart b/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart similarity index 100% rename from modules/basic_system/storage/lib/src/db_storage/flutter/model/article.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter/model/columnize.dart b/modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart similarity index 98% rename from modules/basic_system/storage/lib/src/db_storage/flutter/model/columnize.dart rename to modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart index 564593ca..63c4debb 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter/model/columnize.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/model/columnize.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; class Columnize { final String? username; diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart index 49942f08..094a7a98 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/repository/article_repository.dart @@ -1,6 +1,9 @@ import 'package:storage/storage.dart'; +import '../dao/article_dao.dart'; +import '../exp.dart'; + // 仓储: 提供数据 diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart b/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart index d55e7090..60ac4d52 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/repository/columnize_repository.dart @@ -1,6 +1,8 @@ import 'package:storage/storage.dart'; +import '../exp.dart'; + // 仓储: 提供数据 class ColumnizeRepository { diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart index ecfdefc1..36718457 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/article_detail_page.dart @@ -1,11 +1,12 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:storage/storage.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; +import '../../data/exp.dart'; + class ArticleDetailPage extends StatefulWidget { final Article article; diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart index d8cf5fa5..cbbc67f9 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/column_detail_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:storage/storage.dart'; +import '../../data/exp.dart'; import 'sliver_article.dart'; class ColumnDetailPage extends StatelessWidget { diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart index 3b2a6c2b..d94bc90f 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -1,17 +1,14 @@ -import 'dart:convert'; + import 'dart:math'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - import 'package:intl/intl.dart'; - import '../../bloc/article/bloc.dart'; import '../../bloc/exp.dart'; -import 'package:storage/storage.dart'; - +import '../../data/exp.dart'; import '../../data/repository/article_repository.dart'; import 'column_detail_page.dart'; diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart index ac6abff2..f2e51774 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart @@ -7,7 +7,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../bloc/exp.dart'; -import 'package:storage/storage.dart'; + +import '../../data/exp.dart'; import 'article_detail_page.dart'; import 'columnize_page_view.dart'; @@ -33,34 +34,34 @@ class SliverArticlePanel extends StatelessWidget { class SliverArticle extends StatelessWidget { final List
    data; - const SliverArticle({Key? key, required this.data}) : super(key: key); - + const SliverArticle({Key? key, required this.data}) : super(key: key); @override Widget build(BuildContext context) { - - const SliverGridDelegate deskGridDelegate = SliverGridDelegateWithMaxCrossAxisExtent( + const SliverGridDelegate deskGridDelegate = + SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 420, mainAxisSpacing: 8, mainAxisExtent: 188, crossAxisSpacing: 8, ); - Widget child = isDesk? SliverGrid(delegate: SliverChildBuilderDelegate( - _buildItem, - childCount: data.length, - ), gridDelegate: deskGridDelegate) - : - SliverList( - delegate: SliverChildBuilderDelegate( - _buildItem, - childCount: data.length, - )); + Widget child = isDesk + ? SliverGrid( + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + ), + gridDelegate: deskGridDelegate) + : SliverList( + delegate: SliverChildBuilderDelegate( + _buildItem, + childCount: data.length, + )); return SliverPadding( - padding: const EdgeInsets.only(bottom: 0), - sliver: child); + padding: const EdgeInsets.only(bottom: 0), sliver: child); } Widget? _buildItem(BuildContext context, int index) { @@ -73,8 +74,8 @@ class ArticlePanel extends StatelessWidget { const ArticlePanel({Key? key, required this.article}) : super(key: key); - void toArticleDetail(BuildContext context){ - if(Platform.isAndroid||Platform.isIOS){ + void toArticleDetail(BuildContext context) { + if (Platform.isAndroid || Platform.isIOS) { Navigator.of(context).push( MaterialPageRoute( builder: (_) => ArticleDetailPage(article: article), @@ -88,7 +89,7 @@ class ArticlePanel extends StatelessWidget { print(url); Uri uri = Uri.parse(url); if (await canLaunchUrl(Uri.parse(url))) { - await launchUrl(uri,mode: LaunchMode.externalApplication); + await launchUrl(uri, mode: LaunchMode.externalApplication); } else { debugPrint('Could not launch $url'); } @@ -97,7 +98,7 @@ class ArticlePanel extends StatelessWidget { @override Widget build(BuildContext context) { return GestureDetector( - onTap: ()=>toArticleDetail(context), + onTap: () => toArticleDetail(context), child: Container( color: Theme.of(context).listTileTheme.tileColor, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), @@ -119,8 +120,8 @@ class ArticlePanel extends StatelessWidget { ), Expanded( child: Text('${article.username}', - style: - const TextStyle(color: Color(0xff6A6D76), fontSize: 12))), + style: const TextStyle( + color: Color(0xff6A6D76), fontSize: 12))), const Text( '掘金', style: TextStyle(fontSize: 12, color: Color(0xff6A6D76)), diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json new file mode 100644 index 00000000..4cd210d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "计时器模式", + "info": "禁用/启用子树的计时器(Ticker),动画控制器基于 Ticker 实现。", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "统一禁用/启用动画", + "desc": [ + "TickerMode 的 enabled 可以统一启用/禁用子树的动画效果。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart new file mode 100644 index 00000000..f602baac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/node1.dart @@ -0,0 +1,51 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class TickerModeDemo1 extends StatefulWidget { + const TickerModeDemo1({super.key}); + + @override + State createState() => _TickerModeDemo1State(); +} + +class _TickerModeDemo1State extends State { + bool _disable = false; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + buildOutSwitch(), + const SizedBox(height: 4), + TickerMode(enabled: !_disable, child: buildTestContent()), + ], + ); + } + + Widget buildOutSwitch() => Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text('TickerMode外的Switch:'), + Switch(value: _disable, onChanged: _onChanged) + ], + ); + + Widget buildTestContent() => Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 20, + children: [ + Switch(value: _disable, onChanged: _onChanged), + const CupertinoActivityIndicator(), + const CircularProgressIndicator(), + ], + ); + + void _onChanged(bool value) { + setState(() { + _disable = value; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json new file mode 100644 index 00000000..c2ae9df9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_zh-CN.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "撤销历史", + "info": "接收 ValueNotifier 可监听值,为该值提供撤销/重做功能;被用于 TextField 组件源码中。", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextField 中使用 UndoHistory", + "desc": [ + "该案例中通过外界按钮,进行控制 TextField 的撤销/重做功能。其中 undoController 参数可以传入 UndoHistoryController 对象,用于控制并影响输入文本内容。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart new file mode 100644 index 00000000..85a654a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/node1.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; + +class UndoHistoryDemo1 extends StatefulWidget { + const UndoHistoryDemo1({super.key}); + + @override + State createState() => _UndoHistoryDemo1State(); +} + +class _UndoHistoryDemo1State extends State { + final UndoHistoryController _undoController = UndoHistoryController(); + + @override + void dispose() { + _undoController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildToolBar(), + const Divider(height: 0.5), + Expanded( + child: TextField( + undoController: _undoController, + expands: true, + maxLines: null, + minLines: null, + decoration: InputDecoration( + filled: true, + hintText: '请输入...', + fillColor: Colors.white, + hoverColor: Colors.transparent, + border: InputBorder.none, + ), + )) + ], + ), + ); + } + + Widget _buildToolBar() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4), + child: ValueListenableBuilder( + valueListenable: _undoController, + builder: (BuildContext context, UndoHistoryValue value, Widget? child) { + return Wrap( + spacing: 4, + children: [ + _IconAction( + icon: Icons.undo, + onTap: value.canUndo ? _undoController.undo : null), + _IconAction( + icon: Icons.redo, + onTap: value.canRedo ? _undoController.redo : null), + ], + ); + }, + ), + ); + } +} + +class _IconAction extends StatefulWidget { + final IconData icon; + final VoidCallback? onTap; + + const _IconAction({super.key, required this.icon, this.onTap}); + + @override + State<_IconAction> createState() => _IconActionState(); +} + +class _IconActionState extends State<_IconAction> { + bool _hover = false; + + bool get enable => widget.onTap != null; + + Color? get color => (_hover && enable) ? Colors.grey.withOpacity(0.2) : null; + + @override + Widget build(BuildContext context) { + MouseCursor cursor = (_hover && enable) ? SystemMouseCursors.click : SystemMouseCursors.basic; + return MouseRegion( + cursor: cursor , + onExit: (_) => setState(() => _hover = false), + onEnter: (_) => setState(() => _hover = true), + child: GestureDetector( + onTap: widget.onTap, + child: Container( + decoration: BoxDecoration( + color: color, borderRadius: BorderRadius.circular(4)), + padding: const EdgeInsets.all(4.0), + child: Icon( + widget.icon, + size: 20, + color: enable ? null : Colors.grey, + )), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart index e4f9b7f4..b709b7e4 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateful_unit.dart @@ -188,4 +188,6 @@ export '../StatefulWidget/CupertinoCheckbox/node3.dart'; export '../StatefulWidget/CupertinoRadio/node1.dart'; export '../StatefulWidget/CupertinoRadio/node2.dart'; -export '../StatefulWidget/CupertinoRadio/node3.dart'; \ No newline at end of file +export '../StatefulWidget/CupertinoRadio/node3.dart'; +export '../StatefulWidget/UndoHistory/node1.dart'; +export '../StatefulWidget/TickerMode/node1.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 94287d7b..436fd151 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -10,7 +10,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { String name = '$widgetId#$nodePriority'; return switch (name) { - '96#0' => const ColumnNode1(), + '96#0' => const ColumnNode1(), '341#0' => const CustomMultiChildLayoutNode1(), '94#0' => const FlexNode1(), '94#1' => const FlexNode2(), @@ -331,9 +331,11 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '54#1' => const CursorTextField(), '54#2' => const ComplexTextField(), '199#0' => const CustomTextFormField(), + '246#0' => const TickerModeDemo1(), '50#0' => const CustomTooltip(), '50#1' => const DecorationTooltip(), '226#0' => const TweenAnimationBuilderDemo(), + '241#0' => const UndoHistoryDemo1(), '243#0' => const UniqueWidgetDemo(), '255#0' => const ValueListenableBuilderDemo(), '234#0' => const WidgetInspectorDemo(), @@ -492,6 +494,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '35#1' => const WidthVerticalDivider(), '10#0' => const CustomVisibility(), '10#1' => const ReplacementVisibility(), + _ => const SizedBox(), }; -} +} \ No newline at end of file From 5c21cf8037e1ea975cac4128f84d8e46a36a513f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 6 Dec 2024 09:53:12 +0800 Subject: [PATCH 113/149] add AnimatedSlide/AnimatedScale/AnimatedRotation/AnimatedFractionallySizedBox --- assets/flutter.db | Bin 1499136 -> 1515520 bytes .../desc_zh-CN.json | 31 ++++++ .../AnimatedFractionallySizedBox/node1.dart | 58 +++++++++++ .../AnimatedRotation/desc_zh-CN.json | 28 ++++++ .../AnimatedRotation/node1.dart | 76 ++++++++++++++ .../AnimatedScale/desc_zh-CN.json | 29 ++++++ .../StatefulWidget/AnimatedScale/node1.dart | 70 +++++++++++++ .../AnimatedSlide/desc_zh-CN.json | 26 +++++ .../StatefulWidget/AnimatedSlide/node1.dart | 94 ++++++++++++++++++ .../widgets/lib/exp/stateful_unit.dart | 4 + .../widgets/lib/node_display_map.dart | 4 + 11 files changed, 420 insertions(+) create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart diff --git a/assets/flutter.db b/assets/flutter.db index 54cda0c8f3df0a19157aaabeaa4b9d571a6d70a1..031a0940872eb384d586155085f7dc91c252612c 100644 GIT binary patch delta 19528 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 P`Ua6{?9(+;1M+_Wacal* diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json new file mode 100644 index 00000000..5408f22f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_zh-CN.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "动画分率盒", + "info": "FractionallySizedBox 的动画版本,当 widthFactor 或 heightFactor 变化时, 以及 alignment 改变时,都会在指定的持续时间内自动平滑过渡到子组件的目标尺寸和位置。", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "动画过渡效果", + "desc": [ + "该案例中,点击时会修改 heightFactor、widthFactor、alignment 参数,查看动画运动效果。", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 动画变换中心 【Alignment】", + "【curve】 : 动画曲线 【Duration】", + "【heightFactor】 : 高度分率 【double?】", + "【widthFactor】 : 宽度分率 【double?】", + "【turns】 : 旋转量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart new file mode 100644 index 00000000..c870a455 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/node1.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +class AnimatedFractionallySizedBoxDemo extends StatefulWidget { + const AnimatedFractionallySizedBoxDemo({super.key}); + + @override + State createState() => _AnimatedFractionallySizedBoxDemoState(); +} + +class _AnimatedFractionallySizedBoxDemoState + extends State { + bool selected = false; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 240, + child: Center( + child: GestureDetector( + onTap: () { + setState(() { + selected = !selected; + }); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildCell(), + const SizedBox(height: 4), + const Text('点击面板') + ], + ), + ), + ), + ); + } + + Widget _buildCell() { + return SizedBox( + width: 200, + height: 200, + child: ColoredBox( + color: Colors.red, + child: AnimatedFractionallySizedBox( + widthFactor: selected ? 0.25 : 0.75, + heightFactor: selected ? 0.75 : 0.25, + alignment: selected ? Alignment.topLeft : Alignment.bottomRight, + duration: const Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + child: const ColoredBox( + color: Colors.blue, + child: FlutterLogo(size: 75), + ), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json new file mode 100644 index 00000000..b36954d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_zh-CN.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "旋转动画", + "info": "给定的旋转量发生变化时,子组件可以自动调整相对于旋转值,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "旋转动画效果", + "desc": [ + "该案例中,拖拽调节 turns 参数,查看动画运动效果。旋转角度为: turns*2*pi", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【alignment】 : 动画变换中心 【Alignment】", + "【curve】 : 动画曲线 【Duration】", + "【filterQuality】 : 滤镜质量 【FilterQuality】", + "【turns】 : 旋转量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart new file mode 100644 index 00000000..beff715f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/node1.dart @@ -0,0 +1,76 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class AnimatedRotationDemo extends StatefulWidget { + const AnimatedRotationDemo({super.key}); + + @override + State createState() => _AnimatedRotationDemoState(); +} + +class _AnimatedRotationDemoState extends State { + double _turns = 0; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + child: SizedBox( + height: 200, + child: Center( + child: AnimatedRotation( + turns: _turns, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container( + color: Colors.red, + height: 40, + width: 40, + ), + ), + ), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('scale:${_turns.toStringAsFixed(2)}', + style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: 0, + max: 1, + value: _turns, + onChanged: (double value) { + setState(() { + _turns = value; + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json new file mode 100644 index 00000000..845ded52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_zh-CN.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "缩放动画", + "info": "给定的缩放量发生变化时,子组件可以自动调整相对于缩放值,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "缩放动画效果", + "desc": [ + "该案例中,拖拽调节 scale 参数,查看动画运动效果。", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【alignment】 : 动画变换中心 【Alignment】", + "【filterQuality】 : 滤镜质量 【FilterQuality】", + "【scale】 : 缩放量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart new file mode 100644 index 00000000..5f02a598 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/node1.dart @@ -0,0 +1,70 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + +class AnimatedScaleDemo extends StatefulWidget { + const AnimatedScaleDemo({super.key}); + + @override + State createState() => _AnimatedScaleDemoState(); +} + +class _AnimatedScaleDemoState extends State { + double _scale = 1; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + child: SizedBox( + height: 200, + child: Center( + child: AnimatedScale( + scale: _scale, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container(color: Colors.red,height: 40,width: 40,), + ), + ), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('scale:${_scale.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: 0, + max: 5.0, + value: _scale, + onChanged: (double value) { + setState(() { + _scale = value; + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json new file mode 100644 index 00000000..611a2879 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "滑动动画", + "info": "给定的偏移量发生变化时,子组件可以自动调整相对偏移量,且前后值有动画变化。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "滑动动画效果", + "desc": [ + "该案例中,拖拽调节 x,y 参数,查看动画运动效果。其中偏移量 = x,y * 方框宽高", + "【child】 : 孩子组件 【Widget】", + "【duration】 : 动画时长 【Duration】", + "【onEnd】 : 动画结束回调 【Function()】", + "【curve】 : 动画曲线 【Duration】", + "【offset】 : 偏移量 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart new file mode 100644 index 00000000..10da0649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/node1.dart @@ -0,0 +1,94 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + + +class AnimatedSlideDemo extends StatefulWidget { + const AnimatedSlideDemo({super.key}); + + @override + State createState() => _AnimatedSlideDemoState(); +} + +class _AnimatedSlideDemoState extends State { + Offset offset = Offset.zero; + + @override + Widget build(BuildContext context) { + final TextTheme textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + child: GridPaper( + color: Colors.blue.withOpacity(0.1), + // alignment: Alignment.center, + child: SizedBox( + height: 200, + child: Center( + child: AnimatedSlide( + offset: offset, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + child: Container(color: Colors.red,height: 40,width: 40,), + ), + ), + ), + ), + ), + SizedBox( + height: 200, + child: Column( + children: [ + Text('Y:${offset.dy.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: RotatedBox( + quarterTurns: 1, + child: Slider( + min: -2.0, + max: 2.0, + value: offset.dy, + onChanged: (double value) { + setState(() { + offset = Offset(offset.dx, value); + }); + }, + ), + ), + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('X:${offset.dx.toStringAsFixed(1)}', style: textTheme.bodyMedium), + Expanded( + child: Slider( + min: -4.0, + max: 4.0, + value: offset.dx, + onChanged: (double value) { + setState(() { + offset = Offset(value, offset.dy); + }); + }, + ), + ), + const SizedBox(width: 48.0), + ], + ), + ], + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart index b709b7e4..fc4ea71a 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateful_unit.dart @@ -99,6 +99,10 @@ export '../StatefulWidget/UniqueWidget/node1_base.dart'; export '../StatefulWidget/FutureBuilder/node1_base.dart'; export '../StatefulWidget/Hero/node1_base.dart'; export '../StatefulWidget/AnimatedAlign/node1_base.dart'; +export '../StatefulWidget/AnimatedScale/node1.dart'; +export '../StatefulWidget/AnimatedSlide/node1.dart'; +export '../StatefulWidget/AnimatedRotation/node1.dart'; +export '../StatefulWidget/AnimatedFractionallySizedBox/node1.dart'; export '../StatefulWidget/AnimatedContainer/node1_base.dart'; export '../StatefulWidget/AnimatedDefaultTextStyle/node1_base.dart'; export '../StatefulWidget/AnimatedOpacity/node1_base.dart'; diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 436fd151..a2e90fc9 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -175,6 +175,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '100#0' => const CustomAnimatedCrossFade(), '100#1' => const CurveAnimatedCrossFade(), '124#0' => const CustomAnimatedDefaultTextStyle(), + '260#0' => const AnimatedFractionallySizedBoxDemo(), '117#0' => const CustomAnimatedList(), '227#0' => const AnimatedModalBarrierDemo(), '118#0' => const CustomAnimatedOpacity(), @@ -182,6 +183,9 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '225#0' => const AnimatedPhysicalModelDemo(), '121#0' => const CustomAnimatedPositioned(), '122#0' => const CustomAnimatedPositionedDirectional(), + '259#0' => const AnimatedRotationDemo(), + '249#0' => const AnimatedScaleDemo(), + '247#0' => const AnimatedSlideDemo(), '116#0' => const CustomAnimatedSwitcher(), '224#0' => const AnimatedThemeDemo(), '57#0' => const CustomAppBar(), From 0a0642efd41fe8c6a60472517c82a6d26fbba8c9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 11 Dec 2024 09:57:31 +0800 Subject: [PATCH 114/149] add FilledButton --- assets/flutter.db | Bin 1515520 -> 1515520 bytes .../view/mobile/unit_navigation.dart | 4 +-- .../FilledButton/desc_zh-CN.json | 33 ++++++++++++++++++ .../StatefulWidget/FilledButton/node1.dart | 19 ++++++++++ .../StatefulWidget/FilledButton/node2.dart | 21 +++++++++++ .../OutlinedButton/desc_zh-CN.json | 4 +-- .../widgets/lib/exp/stateful_unit.dart | 2 ++ .../widgets/lib/node_display_map.dart | 2 ++ 8 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart diff --git a/assets/flutter.db b/assets/flutter.db index 031a0940872eb384d586155085f7dc91c252612c..57deb1351749aee014e66ff02bf987cd29c992bb 100644 GIT binary patch delta 9934 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 bbL51h8h|R%mN0^Ys=}4 _UnitPhoneNavigationState(); @@ -30,7 +30,7 @@ class UnitPhoneNavigation extends StatefulWidget { class _UnitPhoneNavigationState extends State { //页面控制器,初始 0 final PageController _controller = PageController(); - ValueNotifier _activeTab = ValueNotifier(AppTab.widgets); + final ValueNotifier _activeTab = ValueNotifier(AppTab.widgets); // 禁止 PageView 滑动 final ScrollPhysics _neverScroll = const NeverScrollableScrollPhysics(); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json new file mode 100644 index 00000000..ececec5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_zh-CN.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "填充按钮", + "info": "一个符合 Material Design 的填充按钮,通过 FilledButtonTheme 设置按钮样式。", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "基本使用", + "desc": [ + "【child】 : 按钮内容 【Widget】", + "【onPressed】 : 点击事件 【VoidCallback】", + "【onHover】 : 长按事件 【ValueChanged? 】", + "【onLongPress】 : 长按事件 【VoidCallback?】", + "填充按钮在视觉上仅次于 [FloatingActionButton],应用于重要的、最终完成流程的操作,例如: 保存、立即加入 或 确认。" + ] + }, + { + "file": "node2.dart", + "name": "色调变体", + "desc": [ + "FilledButton.tonal 是色调填充按钮,视觉上介于 [FilledButton] 和 [OutlinedButton] 之间,适用于需要比轮廓按钮稍强一些的强调但优先级较低的场景。例如 [下一步] 按钮 " + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart new file mode 100644 index 00000000..d083f55d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node1.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class FilledButtonDemo1 extends StatelessWidget { + const FilledButtonDemo1({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap(spacing: 10, children: [ + FilledButton( + onPressed: () {}, + child: const Text('FilledButton'), + ), + const FilledButton( + onPressed: null, + child: Text('Disabled'), + ), + ]); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart new file mode 100644 index 00000000..2d8d078c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/node2.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class FilledButtonDemo2 extends StatelessWidget { + const FilledButtonDemo2({super.key}); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 10, + children: [ + FilledButton.tonal( + onPressed: () {}, + child: const Text('FilledButton'), + ), + const FilledButton.tonal( + onPressed: null, + child: Text('Disabled'), + ), + ]); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json index 1322d244..6c10b7c3 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_zh-CN.json @@ -2,7 +2,7 @@ "id": 355, "name": "OutlinedButton", "localName": "边框按钮", - "info": "Material风格的边线按钮,表现和OutlineButton类似。可通过样式更改边框、颜色、阴影等属性。", + "info": "Material风格的边线按钮,表现和 OutlineButton 类似。可通过样式更改边框、颜色、阴影等属性。", "lever": 3, "family": 1, "linkIds": [ @@ -15,7 +15,7 @@ "file": "node1_base.dart", "name": "OutlinedButton基本使用", "desc": [ - "【child】 : 是否具有滚动主体 【Widget】", + "【child】 : 按钮内容 【Widget】", "【onPressed】 : 点击事件 【VoidCallback】", "【onLongPress】 : 长按事件 【VoidCallback】" ] diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/stateful_unit.dart index fc4ea71a..55fc154e 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/stateful_unit.dart @@ -176,6 +176,8 @@ export '../StatefulWidget/CupertinoTabView/node1_base.dart'; export '../StatefulWidget/TextButton/node1_base.dart'; export '../StatefulWidget/TextButton/node2_style.dart'; +export '../StatefulWidget/FilledButton/node1.dart'; +export '../StatefulWidget/FilledButton/node2.dart'; export '../StatefulWidget/ElevatedButton/node1_base.dart'; export '../StatefulWidget/ElevatedButton/node2_style.dart'; diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index a2e90fc9..0a6d5a49 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -251,6 +251,8 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '51#0' => const CustomExpandIcon(), '178#0' => const CustomExpansionPanelList(), '52#0' => const CustomExpansionTile(), + '359#0' => const FilledButtonDemo1(), + '359#1' => const FilledButtonDemo2(), '198#0' => const CustomForm(), '222#0' => const FormFieldDemo(), '172#0' => const CustomFutureBuilder(), From 736385bd6cb0a17d9e8fcc7faa79dbadfbaafba7 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 13 Dec 2024 13:06:12 +0800 Subject: [PATCH 115/149] add TapRegion --- assets/flutter.db | Bin 1515520 -> 1519616 bytes .../view/desktop/menu_bar_leading.dart | 1 - .../TapRegion/desc_zh-CN.json | 21 ++++++++ .../TapRegion/node1.dart | 45 ++++++++++++++++++ .../Localizations/desc_zh-CN.json | 21 ++++++++ .../StatefulWidget/Localizations/node1.dart | 11 +++++ .../lib/exp/MultiChildRenderObjectWidget.dart | 28 +++++++++++ .../lib/exp/{other_unit.dart => Other.dart} | 0 .../exp/{proxy_unit.dart => ProxyWidget.dart} | 0 ...art => SingleChildRenderObjectWidget.dart} | 30 +----------- .../lib/exp/{sliver_unit.dart => Sliver.dart} | 0 ...stateful_unit.dart => StatefulWidget.dart} | 1 + ...ateless_unit.dart => StatelessWidget.dart} | 0 .../widgets/lib/node_display_map.dart | 18 ++++--- .../widget_system/widgets/lib/widgets.dart | 7 --- 15 files changed, 140 insertions(+), 43 deletions(-) create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart create mode 100644 modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart rename modules/widget_system/widgets/lib/exp/{other_unit.dart => Other.dart} (100%) rename modules/widget_system/widgets/lib/exp/{proxy_unit.dart => ProxyWidget.dart} (100%) rename modules/widget_system/widgets/lib/exp/{render_object_unit.dart => SingleChildRenderObjectWidget.dart} (75%) rename modules/widget_system/widgets/lib/exp/{sliver_unit.dart => Sliver.dart} (100%) rename modules/widget_system/widgets/lib/exp/{stateful_unit.dart => StatefulWidget.dart} (99%) rename modules/widget_system/widgets/lib/exp/{stateless_unit.dart => StatelessWidget.dart} (100%) diff --git a/assets/flutter.db b/assets/flutter.db index 57deb1351749aee014e66ff02bf987cd29c992bb..2f86ad7b9f2ddecbb95eaad64bfba8abec7e962d 100644 GIT binary patch delta 15524 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 delta 13884 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Þpiqb-7D83`+1{V`9tIZ85(W7Un6e; z0Cz;rhyb(mJ0rO;*f}2^DFVF4y&8SkfYL-B<|EqSkv!OFWmm^W>M1b9i1vi0-Y-A8 zoa5q!p3xupAnxh@(Z0~v1tM1^K>b&t$N&OeK*zd~bMP4%Q3yJDU39Mm+&NSeg{C^5 z9p4mvO9Du3zBf7-Fug8vl0*Ki9f7X21IykTc}0X)9;t>VzhZf$mje8FVRfV{yku{r z6^8zy{ej4vFiYJLJtP7>kM4|4wLuWq!xXE)F1OPjj3zVt5}v@x{_STtEHiRE z3UgFBko=_tJ;HaPCarouselNode2())); }, child: CircleImage( image: AssetImage('assets/images/icon_head.webp'), diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json new file mode 100644 index 00000000..f74126f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "点击范围", + "info": "能够检测内部或外部点击回调的组件,通过 groupId 可以多个区域视为一体。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听点击组件内部和外部", + "desc": [ + "通过 Localizations.localeOf(context) 可以根据上下文获取最近上层的 Localizations 组件存储的 Locale 数据信息。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart new file mode 100644 index 00000000..57642455 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/node1.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class TapRegionDemo1 extends StatefulWidget { + const TapRegionDemo1({super.key}); + + @override + State createState() => _TapRegionDemo1State(); +} + +class _TapRegionDemo1State extends State { + String info = 'Tap any where'; + + @override + Widget build(BuildContext context) { + return TapRegion( + onTapOutside: _onTapOutside, + onTapInside: _onTapInside, + child: Container( + alignment: Alignment.center, + height: 64, + width: 160, + color: isOut ? Colors.grey : Colors.blue, + child: Text( + info, + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + + bool get isOut => info.contains('TapOutside'); + + void _onTapOutside(PointerDownEvent event) { + setState(() { + info = "TapOutside:\n${event.position}"; + }); + } + + void _onTapInside(PointerDownEvent event) { + setState(() { + info = "TapInside:\n${event.position}"; + }); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json new file mode 100644 index 00000000..c61848f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_zh-CN.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "国际化", + "info": "为子树节点提供国际化资源,底层依赖 InheritedWidget 实现。 MaterialApp 内部已集成该组件,其 locale 和 delegates 参数最终用于该组件。", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "获取当前语言", + "desc": [ + "通过 Localizations.localeOf(context) 可以根据上下文获取最近上层的 Localizations 组件存储的 Locale 数据信息。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart new file mode 100644 index 00000000..16c98c8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/node1.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class LocalizationsDemo1 extends StatelessWidget { + const LocalizationsDemo1({super.key}); + + @override + Widget build(BuildContext context) { + Locale locale = Localizations.localeOf(context); + return Text('Locale: ${locale.toString()}'); + } +} diff --git a/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart b/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart new file mode 100644 index 00000000..692ab395 --- /dev/null +++ b/modules/widget_system/widgets/lib/exp/MultiChildRenderObjectWidget.dart @@ -0,0 +1,28 @@ +library render_object_widget; + + +export '../MultiChildRenderObjectWidget/Flex/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_02.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_03.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_04.dart'; +export '../MultiChildRenderObjectWidget/Flex/node_05.dart'; + +export '../MultiChildRenderObjectWidget/Flow/node_01.dart'; +export '../MultiChildRenderObjectWidget/Flow/node_02.dart'; +export '../MultiChildRenderObjectWidget/RichText/node1_base.dart'; +export '../MultiChildRenderObjectWidget/RichText/node2_widget.dart'; +export '../MultiChildRenderObjectWidget/Stack/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Stack/node2_positioned.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node2_alignment.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart'; +export '../MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart'; +export '../MultiChildRenderObjectWidget/Column/node_01.dart'; +export '../MultiChildRenderObjectWidget/IndexedStack/node1_base.dart'; +export '../MultiChildRenderObjectWidget/Row/node1_base.dart'; +export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart'; +export '../MultiChildRenderObjectWidget/Viewport/node1_base.dart'; +export '../MultiChildRenderObjectWidget/ListBody/node1_base.dart'; +export '../MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart'; +export '../MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart'; diff --git a/modules/widget_system/widgets/lib/exp/other_unit.dart b/modules/widget_system/widgets/lib/exp/Other.dart similarity index 100% rename from modules/widget_system/widgets/lib/exp/other_unit.dart rename to modules/widget_system/widgets/lib/exp/Other.dart diff --git a/modules/widget_system/widgets/lib/exp/proxy_unit.dart b/modules/widget_system/widgets/lib/exp/ProxyWidget.dart similarity index 100% rename from modules/widget_system/widgets/lib/exp/proxy_unit.dart rename to modules/widget_system/widgets/lib/exp/ProxyWidget.dart diff --git a/modules/widget_system/widgets/lib/exp/render_object_unit.dart b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart similarity index 75% rename from modules/widget_system/widgets/lib/exp/render_object_unit.dart rename to modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart index 236af324..378281c5 100644 --- a/modules/widget_system/widgets/lib/exp/render_object_unit.dart +++ b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart @@ -1,32 +1,5 @@ library render_object_widget; - -export '../MultiChildRenderObjectWidget/Flex/node_01.dart'; -export '../MultiChildRenderObjectWidget/Flex/node_02.dart'; -export '../MultiChildRenderObjectWidget/Flex/node_03.dart'; -export '../MultiChildRenderObjectWidget/Flex/node_04.dart'; -export '../MultiChildRenderObjectWidget/Flex/node_05.dart'; - -export '../MultiChildRenderObjectWidget/Flow/node_01.dart'; -export '../MultiChildRenderObjectWidget/Flow/node_02.dart'; -export '../MultiChildRenderObjectWidget/RichText/node1_base.dart'; -export '../MultiChildRenderObjectWidget/RichText/node2_widget.dart'; -export '../MultiChildRenderObjectWidget/Stack/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Stack/node2_positioned.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node2_alignment.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node3_crossAxisAlignment.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node4_textDirection.dart'; -export '../MultiChildRenderObjectWidget/Wrap/node5_verticalDirection.dart'; -export '../MultiChildRenderObjectWidget/Column/node_01.dart'; -export '../MultiChildRenderObjectWidget/IndexedStack/node1_base.dart'; -export '../MultiChildRenderObjectWidget/Row/node1_base.dart'; -export '../MultiChildRenderObjectWidget/CustomMultiChildLayout/node_01.dart'; -export '../MultiChildRenderObjectWidget/Viewport/node1_base.dart'; -export '../MultiChildRenderObjectWidget/ListBody/node1_base.dart'; -export '../MultiChildRenderObjectWidget/ShrinkWrappingViewport/node1_base.dart'; -export '../MultiChildRenderObjectWidget/NestedScrollViewViewport/node1_base.dart'; - export '../SingleChildRenderObjectWidget/Align/node1_base.dart'; export '../SingleChildRenderObjectWidget/Align/node2_other.dart'; export '../SingleChildRenderObjectWidget/CustomSingleChildLayout/node1_base.dart'; @@ -97,4 +70,5 @@ export '../SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart'; export '../SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart'; -export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; \ No newline at end of file +export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; +export '../SingleChildRenderObjectWidget/TapRegion/node1.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/exp/sliver_unit.dart b/modules/widget_system/widgets/lib/exp/Sliver.dart similarity index 100% rename from modules/widget_system/widgets/lib/exp/sliver_unit.dart rename to modules/widget_system/widgets/lib/exp/Sliver.dart diff --git a/modules/widget_system/widgets/lib/exp/stateful_unit.dart b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart similarity index 99% rename from modules/widget_system/widgets/lib/exp/stateful_unit.dart rename to modules/widget_system/widgets/lib/exp/StatefulWidget.dart index 55fc154e..5cf2a9aa 100644 --- a/modules/widget_system/widgets/lib/exp/stateful_unit.dart +++ b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart @@ -178,6 +178,7 @@ export '../StatefulWidget/TextButton/node1_base.dart'; export '../StatefulWidget/TextButton/node2_style.dart'; export '../StatefulWidget/FilledButton/node1.dart'; export '../StatefulWidget/FilledButton/node2.dart'; +export '../StatefulWidget/Localizations/node1.dart'; export '../StatefulWidget/ElevatedButton/node1_base.dart'; export '../StatefulWidget/ElevatedButton/node2_style.dart'; diff --git a/modules/widget_system/widgets/lib/exp/stateless_unit.dart b/modules/widget_system/widgets/lib/exp/StatelessWidget.dart similarity index 100% rename from modules/widget_system/widgets/lib/exp/stateless_unit.dart rename to modules/widget_system/widgets/lib/exp/StatelessWidget.dart diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 0a6d5a49..0b413052 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -1,16 +1,18 @@ import 'package:flutter/cupertino.dart'; -import 'exp/other_unit.dart'; -import 'exp/proxy_unit.dart'; -import 'exp/render_object_unit.dart'; -import 'exp/sliver_unit.dart'; -import 'exp/stateful_unit.dart'; -import 'exp/stateless_unit.dart'; +import 'exp/Other.dart'; +import 'exp/ProxyWidget.dart'; +import 'exp/MultiChildRenderObjectWidget.dart'; +import 'exp/SingleChildRenderObjectWidget.dart'; +import 'exp/Sliver.dart'; +import 'exp/StatefulWidget.dart'; +import 'exp/StatelessWidget.dart'; + Widget mapNodeDisplay(int widgetId, int nodePriority) { String name = '$widgetId#$nodePriority'; return switch (name) { - '96#0' => const ColumnNode1(), + '96#0' => const ColumnNode1(), '341#0' => const CustomMultiChildLayoutNode1(), '94#0' => const FlexNode1(), '94#1' => const FlexNode2(), @@ -133,6 +135,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '294#0' => const SizeChangedLayoutNotifierDemo(), '76#0' => const CustomSizedBox(), '84#0' => const CustomSizedOverflowBox(), + '280#0' => const TapRegionDemo1(), '78#0' => const SkewTransform(), '78#1' => const TranslationTransform(), '78#2' => const ScaleTransform(), @@ -277,6 +280,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '145#0' => const CustomLicensePage(), '47#0' => const CustomLinearProgressIndicator(), '179#0' => const CustomListWheelScrollView(), + '290#0' => const LocalizationsDemo1(), '105#0' => const CustomLongPressDraggable(), '160#0' => const CustomMaterial(), '160#1' => const ShapeMaterial(), diff --git a/modules/widget_system/widgets/lib/widgets.dart b/modules/widget_system/widgets/lib/widgets.dart index 2a9b17f7..6454bac6 100644 --- a/modules/widget_system/widgets/lib/widgets.dart +++ b/modules/widget_system/widgets/lib/widgets.dart @@ -1,10 +1,3 @@ library widgets; export 'node_display_map.dart'; - -export 'exp/other_unit.dart'; -export 'exp/proxy_unit.dart'; -export 'exp/render_object_unit.dart' hide Box50,CornerCustomMultiChildLayout,CornerType; -export 'exp/sliver_unit.dart'; -export 'exp/stateful_unit.dart' hide ListModel; -export 'exp/stateless_unit.dart'; \ No newline at end of file From 33e1990e2256589a1a4f7c4936386affb2d0dc15 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 18 Dec 2024 09:30:42 +0800 Subject: [PATCH 116/149] add TextFieldTapRegion --- assets/flutter.db | Bin 1519616 -> 1523712 bytes .../lib/src/database/dao/widget_dao.dart | 3 +- .../TapRegion/desc_zh-CN.json | 5 +- .../TextFieldTapRegion/desc_zh-CN.json | 26 ++++++ .../TextFieldTapRegion/node1.dart | 85 ++++++++++++++++++ .../exp/SingleChildRenderObjectWidget.dart | 3 +- .../widgets/lib/node_display_map.dart | 1 + 7 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart diff --git a/assets/flutter.db b/assets/flutter.db index 2f86ad7b9f2ddecbb95eaad64bfba8abec7e962d..102e7776aa416d6cbb14afef3977300a578aeb65 100644 GIT binary patch delta 17470 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 Wf_4>H>Y|2M)QQbvA1#&YkpBfZ{H@3U delta 16436 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 diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart index 4b6ca183..7a585b02 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -10,8 +10,7 @@ class WidgetDao with HasDatabase, DbTable { String get name => 'widget'; Future insert(WidgetPo widget) async { - //插入方法 - String addSql = //插入数据 + String addSql = "INSERT INTO " "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " "VALUES (?,?,?,?,?,?,?,?);"; diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json index f74126f0..240f2dee 100644 --- a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_zh-CN.json @@ -14,7 +14,10 @@ "file": "node1.dart", "name": "监听点击组件内部和外部", "desc": [ - "通过 Localizations.localeOf(context) 可以根据上下文获取最近上层的 Localizations 组件存储的 Locale 数据信息。" + "【enabled】 : 是否可用 【bool】", + "【onTapOutside】 : 点击外界监听 【TapRegionCallback?】", + "【onTapInside】 : 点击内部监听 【TapRegionCallback?】", + "【groupId】 : 点击区域组标识 【Object?】" ] } ] diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json new file mode 100644 index 00000000..2b4b488f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "输入框点击范围", + "info": "groupId 为 EditableText 的 TapRegion,可以让其他组件的点击范围与输入框视为一体。", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听点击组件内部和外部", + "desc": [ + "案例中点击加号和减号,不会取消输入框的焦点,键盘仍然可以输入。", + "【enabled】 : 是否可用 【bool】", + "【onTapOutside】 : 点击外界监听 【TapRegionCallback?】", + "【onTapInside】 : 点击内部监听 【TapRegionCallback?】", + "【groupId】 : 点击区域组标识 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart new file mode 100644 index 00000000..7ca7d1c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +class TextFieldTapRegionDemo1 extends StatefulWidget { + const TextFieldTapRegionDemo1({super.key}); + + @override + State createState() => _TextFieldTapRegionDemo1State(); +} + +class _TextFieldTapRegionDemo1State extends State { + TextEditingController controller = TextEditingController(text: '0'); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 160, + child: Row( + children: [ + Expanded(child: _buildInput()), + const SizedBox(width: 8), + TextFieldTapRegion(child: buildButtons()) + ], + ), + ); + } + + Widget _buildInput() { + return TextField( + autofocus: true, + decoration: const InputDecoration( + border: OutlineInputBorder(), + ), + onChanged: _onChange, + controller: controller, + textAlign: TextAlign.center, + ); + } + + void _onChange(String value) {} + + Widget buildButtons() { + ButtonStyle style = circleStyle; + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + OutlinedButton( + style: style, + onPressed: _increment, + child: const Icon(Icons.add, size: 16), + ), + const SizedBox(height: 2), + OutlinedButton( + onPressed: _decrement, + style: style, + child: const Icon(Icons.remove, size: 16), + ), + ], + ); + } + + ButtonStyle get circleStyle => OutlinedButton.styleFrom( + shape: const StadiumBorder(), + padding: EdgeInsets.zero, + minimumSize: const Size(32, 32), + maximumSize: const Size(32, 32), + ); + + void _increment() { + int value = int.tryParse(controller.text) ?? 0; + _updateText('${value + 1}', collapsed: true); + } + + void _decrement() { + int value = int.tryParse(controller.text) ?? 0; + _updateText('${value - 1}', collapsed: true); + } + + void _updateText(String text, {bool collapsed = true}) { + if (text != controller.text) { + controller.value = TextEditingValue( + text: text, + ); + } + } +} diff --git a/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart index 378281c5..a40f2525 100644 --- a/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart +++ b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart @@ -71,4 +71,5 @@ export '../SingleChildRenderObjectWidget/PhysicalShape/node1_base.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; -export '../SingleChildRenderObjectWidget/TapRegion/node1.dart'; \ No newline at end of file +export '../SingleChildRenderObjectWidget/TapRegion/node1.dart'; +export '../SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 0b413052..45133133 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -136,6 +136,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '76#0' => const CustomSizedBox(), '84#0' => const CustomSizedOverflowBox(), '280#0' => const TapRegionDemo1(), + '281#0' => const TextFieldTapRegionDemo1(), '78#0' => const SkewTransform(), '78#1' => const TranslationTransform(), '78#2' => const ScaleTransform(), From 23b4ec9a9f08eb4a70b42b326cad3bc80f12341c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 26 Dec 2024 09:17:59 +0800 Subject: [PATCH 117/149] add CallbackShortcuts/KeyboardListener --- assets/flutter.db | Bin 1523712 -> 1536000 bytes .../CallbackShortcuts/desc_zh-CN.json | 25 ++++ .../CallbackShortcuts/node1.dart | 127 +++++++++++++++++ .../KeyboardListener/desc_zh-CN.json | 26 ++++ .../KeyboardListener/node1.dart | 133 ++++++++++++++++++ .../exp/SingleChildRenderObjectWidget.dart | 3 +- .../widgets/lib/exp/StatefulWidget.dart | 3 +- .../widgets/lib/node_display_map.dart | 2 + 8 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart diff --git a/assets/flutter.db b/assets/flutter.db index 102e7776aa416d6cbb14afef3977300a578aeb65..536b214d70fe923cbfd9e010a2184e62579431af 100644 GIT binary patch delta 18717 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 delta 14457 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 createState() => _CallbackShortcutsDemo1State(); +} + +class _CallbackShortcutsDemo1State extends State { + FocusNode focusNode = FocusNode(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + _initActionBindings(); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + + super.dispose(); + } + + void _onFocusChange() { + setState(() {}); + } + + int count = 0; + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) => focusNode.requestFocus(), + onTapOutside: (_) => focusNode.unfocus(), + child: CallbackShortcuts( + bindings: _actionBindings, + child: Focus(autofocus: true, focusNode: focusNode, child: _display()), + ), + ), + ); + } + + Map _actionBindings = {}; + + void _initActionBindings() { + _actionBindings = { + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.arrowUp): increase, + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.arrowDown): decrease, + const SingleActivator(LogicalKeyboardKey.keyR, control: true): reset, + }; + } + + void increase() { + setState(() => count = count + 1); + } + + void decrease() { + setState(() => count = count - 1); + } + + void reset() { + setState(() => count = 0); + } + + Widget _display() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: const EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: focusNode.hasFocus + ? _CounterDisplay(counter: count) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class _CounterDisplay extends StatelessWidget { + final int counter; + + const _CounterDisplay({ + super.key, + required this.counter, + }); + + @override + Widget build(BuildContext context) { + TextStyle style = TextStyle(fontSize: 12, color: Colors.grey); + + return Wrap( + direction: Axis.vertical, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + 'count: $counter', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Theme.of(context).primaryColor), + ), + Wrap( + spacing: 6, + children: [ + Text('【Ctrl+↑】:数字+1', style: style), + Text('【Ctrl+↓】:数字-1', style: style), + Text('【Ctrl+R】:归 0', style: style), + ], + ), + ], + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json new file mode 100644 index 00000000..85ed9352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_zh-CN.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "键盘监听器", + "info": "在获取焦点后, 通过 onKeyEvent 监听键盘的按键事件。 ", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "监听键盘事件", + "desc": [ + "案例中区域点击获取焦点,然后敲击键盘可以看到事件触发信息。", + "【focusNode】 : 焦点 【FocusNode】", + "【autofocus】 : 是否自动聚焦 【bool】", + "【includeSemantics】 : 包含语义 【bool】", + "【onKeyEvent】 : 按键回调事件 【ValueChanged?】", + "【child】 : 子组件 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart new file mode 100644 index 00000000..602cf0be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/node1.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class KeyboardListenerDemo1 extends StatefulWidget { + const KeyboardListenerDemo1({super.key}); + + @override + State createState() => _KeyboardListenerDemo1State(); +} + +class _KeyboardListenerDemo1State extends State { + FocusNode focusNode = FocusNode(); + List events = []; + ScrollController _ctrl = ScrollController(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) { + focusNode.requestFocus(); + }, + onTapOutside: (_) { + focusNode.unfocus(); + }, + child: KeyboardListener( + autofocus: true, + focusNode: focusNode, + onKeyEvent: _onKeyEvent, + child: _buildDisplay(), + ), + ), + ); + } + + void _onKeyEvent(KeyEvent value) { + events.add(value); + setState(() {}); + _scrollToEnd(); + print('${value.runtimeType}:${value.logicalKey.keyLabel}'); + } + + void _onFocusChange() { + if (!focusNode.hasFocus) { + events.clear(); + } + setState(() {}); + } + + void _scrollToEnd() async { + if (_ctrl.hasClients) { + await Future.delayed(Duration(milliseconds: 200)); + _ctrl.animateTo(_ctrl.position.maxScrollExtent, + duration: Duration(milliseconds: 100), curve: Curves.ease); + } + } + + Widget _buildDisplay() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: events.isNotEmpty + ? SizedBox( + width: 460, + height: 60, + child: ListView.builder( + controller: _ctrl, + itemCount: events.length, + scrollDirection: Axis.horizontal, + itemBuilder: (_, index) => KeyBoardBox( + event: events[index], + )), + ) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class KeyBoardBox extends StatelessWidget { + final KeyEvent event; + + const KeyBoardBox({super.key, required this.event}); + + @override + Widget build(BuildContext context) { + Color? color; + if (event is KeyDownEvent) { + color = Colors.blue; + } + if (event is KeyRepeatEvent) { + color = Colors.green; + } + if (event is KeyUpEvent) { + color = Colors.grey; + } + return Center( + child: Container( + margin: EdgeInsets.only(right: 4), + width: 32, + height: 32, + decoration: BoxDecoration(color: color), + alignment: Alignment.center, + child: Text( + event.logicalKey.keyLabel, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 8, height: 1), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart index a40f2525..6b519dcb 100644 --- a/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart +++ b/modules/widget_system/widgets/lib/exp/SingleChildRenderObjectWidget.dart @@ -72,4 +72,5 @@ export '../SingleChildRenderObjectWidget/ImageFiltered/node1_blur.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node2_color.dart'; export '../SingleChildRenderObjectWidget/ImageFiltered/node3_matrix.dart'; export '../SingleChildRenderObjectWidget/TapRegion/node1.dart'; -export '../SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart'; \ No newline at end of file +export '../SingleChildRenderObjectWidget/TextFieldTapRegion/node1.dart'; +export '../SingleChildRenderObjectWidget/CallbackShortcuts/node1.dart'; diff --git a/modules/widget_system/widgets/lib/exp/StatefulWidget.dart b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart index 5cf2a9aa..89ecce45 100644 --- a/modules/widget_system/widgets/lib/exp/StatefulWidget.dart +++ b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart @@ -197,4 +197,5 @@ export '../StatefulWidget/CupertinoRadio/node1.dart'; export '../StatefulWidget/CupertinoRadio/node2.dart'; export '../StatefulWidget/CupertinoRadio/node3.dart'; export '../StatefulWidget/UndoHistory/node1.dart'; -export '../StatefulWidget/TickerMode/node1.dart'; \ No newline at end of file +export '../StatefulWidget/TickerMode/node1.dart'; +export '../StatefulWidget/KeyboardListener/node1.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 45133133..9c3b9f69 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -327,6 +327,8 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '42#0' => const CustomSlider(), '42#1' => const DivisionsSlider(), '112#0' => const CustomSlideTransition(), + '283#0' => const CallbackShortcutsDemo1(), + '284#0' => const KeyboardListenerDemo1(), '242#0' => const StatefulBuilderDemo(), '233#0' => const StatusTransitionWidgetDemo(), '200#0' => const StepperDemo(), From 0d7232158cdb434df85f16143103e2cda434c274 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 29 Dec 2024 00:03:12 +0800 Subject: [PATCH 118/149] add Focus --- assets/flutter.db | Bin 1536000 -> 1548288 bytes .../lib/StatefulWidget/Focus/desc_zh-CN.json | 38 ++++++ .../lib/StatefulWidget/Focus/node1.dart | 72 ++++++++++ .../lib/StatefulWidget/Focus/node2.dart | 56 ++++++++ .../lib/StatefulWidget/Focus/node3.dart | 129 ++++++++++++++++++ .../widgets/lib/exp/StatefulWidget.dart | 5 +- .../widgets/lib/node_display_map.dart | 7 +- 7 files changed, 304 insertions(+), 3 deletions(-) create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart diff --git a/assets/flutter.db b/assets/flutter.db index 536b214d70fe923cbfd9e010a2184e62579431af..2cdf63a5a86b6a84d2f547128d49023193fa0be7 100644 GIT binary patch delta 12615 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 BGVcHY delta 10670 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 diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json new file mode 100644 index 00000000..accac233 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_zh-CN.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "焦点组件", + "info": "一个管理 [FocusNode] 的组件,用于允许键盘焦点被赋予该小部件及其子树节点。", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode 聚焦与失焦", + "desc": [ + "【focusNode】 : 焦点 【FocusNode?】", + "【onFocusChange】 : 焦点变化监听 【ValueChanged?】", + "【child】 : 子组件 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "自动聚焦", + "desc": [ + "【autofocus】 : 是否自动聚焦 【bool】", + "Flutter 框架内置了焦点切换的快捷键,比如横向滑动的列表 ←、→ 分别让前项和后项聚焦。Tab 键可以让下一个 Focus 节点聚焦" + ] + }, + { + "file": "node3.dart", + "name": "键盘事件回调", + "desc": [ + "【onKeyEvent】 : 键盘事件回调 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart new file mode 100644 index 00000000..f7814780 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node1.dart @@ -0,0 +1,72 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class FocusDemo1 extends StatefulWidget { + const FocusDemo1({super.key}); + + @override + State createState() => _FocusDemo1State(); +} + +class _FocusDemo1State extends State { + final FocusNode _focusNode = FocusNode(); + + @override + void dispose() { + super.dispose(); + _focusNode.dispose(); + } + + @override + Widget build(BuildContext context) { + return Focus( + focusNode: _focusNode, + onFocusChange: _onFocusChange, + child: GestureDetector( + onTap: _toggleFocus, + child: _FocusBox(active: _focusNode.hasFocus), + ), + ); + } + + void _onFocusChange(bool value) { + setState(() {}); + } + + void _toggleFocus() { + if (_focusNode.hasFocus) { + _focusNode.unfocus(); + } else { + _focusNode.requestFocus(); + } + } +} + +class _FocusBox extends StatelessWidget { + final bool active; + + const _FocusBox({super.key, required this.active}); + + @override + Widget build(BuildContext context) { + Color color = active ? Colors.blue : Colors.white; + Color borderColor = active ? Colors.lightBlue : Colors.grey; + Color? textColor = active ? Colors.white : null; + String text = active ? "点击失去焦点" : '点击获取焦点'; + return Container( + width: 120, + height: 60, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: borderColor), + color: color, + ), + alignment: Alignment.center, + child: Text(text, style: TextStyle(color: textColor)), + ); + } +} diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart new file mode 100644 index 00000000..f5506892 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +class FocusDemo2 extends StatelessWidget { + const FocusDemo2({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: 56, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemBuilder: (_, int index) => _FocusTiled( + 'Item $index', + autofocus: index == 0, + ), + itemCount: 50, + ), + ); + } +} + +class _FocusTiled extends StatelessWidget { + const _FocusTiled( + this.data, { + super.key, + required this.autofocus, + }); + + final String data; + final bool autofocus; + + @override + Widget build(BuildContext context) { + return Focus( + autofocus: autofocus, + child: Builder(builder: _buildTiled), + ); + } + + Widget _buildTiled(BuildContext context) { + FocusNode node = Focus.of(context); + bool focus = node.hasFocus; + Color color = focus ? Colors.blue : Colors.white; + Color? textColor = focus ? Colors.white : null; + return GestureDetector( + onTap: node.requestFocus, + child: Container( + padding: const EdgeInsets.all(8.0), + alignment: Alignment.center, + color: color, + child: Text(data, style: TextStyle(color: textColor)), + ), + ); + } +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart new file mode 100644 index 00000000..bbba3bef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node3.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class FocusDemo3 extends StatefulWidget { + const FocusDemo3({super.key}); + + @override + State createState() => _FocusDemo3State(); +} + +class _FocusDemo3State extends State { + FocusNode focusNode = FocusNode(); + List events = []; + ScrollController _ctrl = ScrollController(); + + @override + void initState() { + focusNode.addListener(_onFocusChange); + super.initState(); + } + + @override + void dispose() { + focusNode.removeListener(_onFocusChange); + focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: TapRegion( + onTapInside: (_) => focusNode.requestFocus(), + onTapOutside: (_) => focusNode.unfocus(), + child: Focus( + autofocus: true, + focusNode: focusNode, + onKeyEvent: _onKeyEvent, + child: _buildDisplay(), + ), + ), + ); + } + + KeyEventResult _onKeyEvent(FocusNode node,KeyEvent value) { + events.add(value); + setState(() {}); + _scrollToEnd(); + print('${value.runtimeType}:${value.logicalKey.keyLabel}'); + return KeyEventResult.ignored; + } + + void _onFocusChange() { + if (!focusNode.hasFocus) { + events.clear(); + } + setState(() {}); + } + + void _scrollToEnd() async { + if (_ctrl.hasClients) { + await Future.delayed(Duration(milliseconds: 200)); + _ctrl.animateTo(_ctrl.position.maxScrollExtent, + duration: Duration(milliseconds: 100), curve: Curves.ease); + } + } + + Widget _buildDisplay() { + Color color = focusNode.hasFocus ? Colors.blue : Colors.grey; + + return Container( + decoration: BoxDecoration(border: Border.all(color: color)), + width: 460, + padding: EdgeInsets.symmetric(horizontal: 12), + alignment: Alignment.center, + height: 60, + child: events.isNotEmpty + ? SizedBox( + width: 460, + height: 60, + child: ListView.builder( + controller: _ctrl, + itemCount: events.length, + scrollDirection: Axis.horizontal, + itemBuilder: (_, index) => _KeyBoardBox( + event: events[index], + )), + ) + : Text( + focusNode.hasFocus ? '键盘输入点东西吧' : '点击我获取焦点', + style: TextStyle(color: color), + ), + ); + } +} + +class _KeyBoardBox extends StatelessWidget { + final KeyEvent event; + + const _KeyBoardBox({super.key, required this.event}); + + @override + Widget build(BuildContext context) { + Color? color; + if (event is KeyDownEvent) { + color = Colors.blue; + } + if (event is KeyRepeatEvent) { + color = Colors.green; + } + if (event is KeyUpEvent) { + color = Colors.grey; + } + return Center( + child: Container( + margin: EdgeInsets.only(right: 4), + width: 32, + height: 32, + decoration: BoxDecoration(color: color), + alignment: Alignment.center, + child: Text( + event.logicalKey.keyLabel, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 8, height: 1), + ), + ), + ); + } +} diff --git a/modules/widget_system/widgets/lib/exp/StatefulWidget.dart b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart index 89ecce45..f90b2fa0 100644 --- a/modules/widget_system/widgets/lib/exp/StatefulWidget.dart +++ b/modules/widget_system/widgets/lib/exp/StatefulWidget.dart @@ -198,4 +198,7 @@ export '../StatefulWidget/CupertinoRadio/node2.dart'; export '../StatefulWidget/CupertinoRadio/node3.dart'; export '../StatefulWidget/UndoHistory/node1.dart'; export '../StatefulWidget/TickerMode/node1.dart'; -export '../StatefulWidget/KeyboardListener/node1.dart'; \ No newline at end of file +export '../StatefulWidget/KeyboardListener/node1.dart'; +export '../StatefulWidget/Focus/node1.dart'; +export '../StatefulWidget/Focus/node2.dart'; +export '../StatefulWidget/Focus/node3.dart'; \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/node_display_map.dart b/modules/widget_system/widgets/lib/node_display_map.dart index 9c3b9f69..a6929b0b 100644 --- a/modules/widget_system/widgets/lib/node_display_map.dart +++ b/modules/widget_system/widgets/lib/node_display_map.dart @@ -84,6 +84,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '77#0' => const CustomAspectRatio(), '278#0' => const CustomBackdropFilter(), '75#0' => const CustomBaseline(), + '283#0' => const CallbackShortcutsDemo1(), '86#0' => const CustomCenter(), '66#0' => const CustomClipOval(), '69#0' => const CustomClipPath(), @@ -257,6 +258,9 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '52#0' => const CustomExpansionTile(), '359#0' => const FilledButtonDemo1(), '359#1' => const FilledButtonDemo2(), + '282#0' => const FocusDemo1(), + '282#1' => const FocusDemo2(), + '282#2' => const FocusDemo3(), '198#0' => const CustomForm(), '222#0' => const FormFieldDemo(), '172#0' => const CustomFutureBuilder(), @@ -278,6 +282,7 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '351#0' => const InteractiveViewerDemo(), '351#1' => const InteractiveViewerDemo2(), '351#2' => const InteractiveViewerDemo3(), + '284#0' => const KeyboardListenerDemo1(), '145#0' => const CustomLicensePage(), '47#0' => const CustomLinearProgressIndicator(), '179#0' => const CustomListWheelScrollView(), @@ -327,8 +332,6 @@ Widget mapNodeDisplay(int widgetId, int nodePriority) { '42#0' => const CustomSlider(), '42#1' => const DivisionsSlider(), '112#0' => const CustomSlideTransition(), - '283#0' => const CallbackShortcutsDemo1(), - '284#0' => const KeyboardListenerDemo1(), '242#0' => const StatefulBuilderDemo(), '233#0' => const StatusTransitionWidgetDemo(), '200#0' => const StepperDemo(), From 29581813c34fe1153f5fda4807448bd374eac72d Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 31 Dec 2024 13:27:17 +0800 Subject: [PATCH 119/149] app upgrade/ global search --- lib/src/flutter_unit.dart | 1 + .../desktop/flutter_unit_desk_navigation.dart | 13 +- .../view/desktop/menu_bar_leading.dart | 80 +++-- .../view/desktop/menu_bar_tail.dart | 65 ++-- .../view/desktop/theme_model_switch_icon.dart | 14 +- .../view/desktop/unit_shortcuts_scope.dart | 48 +++ .../view/mobile/unit_navigation.dart | 3 +- lib/src/starter/fx_application.dart | 3 +- lib/src/starter/start_repository.dart | 8 +- .../view/splash/Flutter_unit_splash.dart | 2 +- .../app/lib/app/cons/global_value.dart | 2 +- .../app/lib/app/theme/app_theme.dart | 5 +- .../app/lib/app_update/bloc/bloc.dart | 71 ----- .../app/lib/app_update/bloc/event.dart | 44 --- .../app/lib/app_update/bloc/state.dart | 61 ---- .../http/flutter_unit/api/upgrade_api.dart | 30 +- .../app/lib/http/flutter_unit/unit_host.dart | 2 +- modules/basic_system/app/lib/http/http.dart | 3 + .../basic_system/app/lib/http/register.dart | 7 + .../app/lib/http/science/science_host.dart | 31 ++ .../http/science/science_rep_interceptor.dart | 48 +++ .../app/lib/view/setting/font_setting.dart | 2 +- .../app/lib/view/setting/setting_page.dart | 178 +++++------ .../lib/view/setting/theme_color_setting.dart | 2 +- .../app_update/lib/app_update.dart | 2 +- .../app_update/lib/bloc/bloc.dart | 83 +++-- .../app_update/lib/bloc/event.dart | 29 +- .../app_update/lib/bloc/state.dart | 39 ++- .../app_update/lib/model/app_info.dart | 66 ---- .../lib/repository/api/upgrade_api.dart | 15 +- .../lib/repository/model/app_info.dart | 70 +++++ .../lib/views/app_update_panel.dart | 50 +-- .../dialog/desk_feishu_update_dialog.dart | 288 ------------------ .../app_update/lib/views/dialog/top_bar.dart | 4 +- ..._update_dialog.dart => update_dialog.dart} | 131 ++++---- .../lib/views/update_red_point.dart | 2 +- modules/basic_system/app_update/pubspec.yaml | 7 +- .../app_update/test/app_update_test.dart | 27 +- .../view/article/columnize_page_view.dart | 2 +- .../articles/view/article/sliver_article.dart | 2 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 2 +- .../widget_module/lib/event/widget_event.dart | 16 + .../lib/views/desk_ui/desk_ui.dart | 4 +- .../desk_ui/widget_panel/desk_search_bar.dart | 1 - .../widget_panel/desk_search_bar_v2.dart | 184 +++++++++++ .../desk_ui/widget_panel/widget_panel.dart | 5 +- .../widget_module/lib/widget_module.dart | 1 + .../lib/src/database/dao/category_dao.dart | 151 +++++---- .../lib/src/database/dao/like_dao.dart | 5 +- .../lib/src/database/dao/node_dao.dart | 14 +- .../db_impl/category_db_repository.dart | 19 +- .../lib/src/database/po/category_po.dart | 27 +- .../lib/src/database/po/widget_po.dart | 2 +- .../lib/src/repository/widget_repository.dart | 2 - .../lib/StatefulWidget/Focus/node2.dart | 55 ++-- pubspec.lock | 8 + pubspec.yaml | 1 + test/app_update_test.dart | 11 + 58 files changed, 969 insertions(+), 1079 deletions(-) create mode 100644 lib/src/navigation/view/desktop/unit_shortcuts_scope.dart delete mode 100644 modules/basic_system/app/lib/app_update/bloc/bloc.dart delete mode 100644 modules/basic_system/app/lib/app_update/bloc/event.dart delete mode 100644 modules/basic_system/app/lib/app_update/bloc/state.dart create mode 100644 modules/basic_system/app/lib/http/register.dart create mode 100644 modules/basic_system/app/lib/http/science/science_host.dart create mode 100644 modules/basic_system/app/lib/http/science/science_rep_interceptor.dart delete mode 100644 modules/basic_system/app_update/lib/model/app_info.dart delete mode 100644 modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart rename modules/basic_system/app_update/lib/views/dialog/{feishu_update_dialog.dart => update_dialog.dart} (64%) create mode 100644 modules/widget_system/widget_module/lib/event/widget_event.dart create mode 100644 modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart create mode 100644 test/app_update_test.dart diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 25429c7f..0fbe58a0 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -9,6 +9,7 @@ import 'package:l10n/l10n.dart'; import 'package:widget_module/widget_module.dart'; import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:app_update/app_update.dart'; import 'l10n/gen/app_l10n.dart'; import 'navigation/router/app_route.dart'; diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart index 0bd86b16..34ba4c1a 100644 --- a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -2,6 +2,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; import 'package:flutter_unit/src/navigation/model/app_tab.dart'; +import 'package:flutter_unit/src/navigation/view/desktop/unit_shortcuts_scope.dart'; import 'package:go_router/go_router.dart'; import 'package:tolyui_navigation/tolyui_navigation.dart'; import 'menu_bar_leading.dart'; @@ -15,11 +16,13 @@ class AppDeskNavigation extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: Row( - children: [ - const DragToMoveWrapper(child: DeskNavigationRail()), - Expanded(child: content), - ], + body: UnitShortcutsScope( + child: Row( + children: [ + const DragToMoveWrapper(child: DeskNavigationRail()), + Expanded(child: content), + ], + ), ), ); } diff --git a/lib/src/navigation/view/desktop/menu_bar_leading.dart b/lib/src/navigation/view/desktop/menu_bar_leading.dart index 616e3b03..439cac9b 100644 --- a/lib/src/navigation/view/desktop/menu_bar_leading.dart +++ b/lib/src/navigation/view/desktop/menu_bar_leading.dart @@ -9,8 +9,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/tolyui.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:widgets/widgets.dart'; class MenuBarLeading extends StatelessWidget { const MenuBarLeading({super.key}); @@ -18,77 +18,69 @@ class MenuBarLeading extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.only(top: 20,bottom: 20), + padding: const EdgeInsets.only(top: 20, bottom: 8), child: Column( children: [ - Wrap( + Wrap( direction: Axis.vertical, - spacing: 10, + spacing: 8, crossAxisAlignment: WrapCrossAlignment.center, children: [ GestureDetector( - onDoubleTap: (){ - }, - child: CircleImage( + onDoubleTap: () {}, + child: const CircleImage( image: AssetImage('assets/images/icon_head.webp'), size: 60, ), ), - Text( + const Text( '张风捷特烈', style: TextStyle(color: Colors.white70), ) ], ), _buildIcons(), - const Divider( - color: Colors.white, - height: 1, - endIndent: 20, - ), - const SizedBox(height: 16,), + const Divider(color: Colors.white, height: 1, endIndent: 20), + const SizedBox(height: 16), ], ), ); } + final List menus = const [ + LinkIconMenu( + TolyIcon.icon_github, "https://github.com/toly1994328/FlutterUnit"), + LinkIconMenu(TolyIcon.icon_juejin, + 'https://juejin.im/user/5b42c0656fb9a04fe727eb37'), + LinkIconMenu(TolyIcon.icon_item, 'http://toly1994.com/'), + ]; + Widget _buildIcons() { return Padding( - padding: const EdgeInsets.only(bottom: 16, top: 16), + padding: const EdgeInsets.only(bottom: 8, top: 8), child: Wrap( spacing: 8, - children: [ - FeedbackWidget( - onPressed: () => - _launchURL("https://github.com/toly1994328/FlutterUnit"), - child: const Icon( - TolyIcon.icon_github, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => - _launchURL("https://juejin.im/user/5b42c0656fb9a04fe727eb37"), - child: const Icon( - TolyIcon.icon_juejin, - color: Colors.white, - ), - ), - FeedbackWidget( - onPressed: () => _launchURL("http://blog.toly1994.com/"), - child: const Icon( - TolyIcon.icon_item, - color: Colors.white, - ), - ), - ], + children: menus + .map((menu) => TolyAction( + style: const ActionStyle.dark(), + onTap: menu.launch, + child: Icon(menu.icon, color: Colors.white, size: 22), + )) + .toList(), ), ); } +} + +class LinkIconMenu { + final IconData icon; + final String url; + + const LinkIconMenu(this.icon, this.url); + + void launch() => _launchUrl(url); - void _launchURL(String url) async { - if (!await launchUrl(Uri.parse(url))) { - // throw Exception('Could not launch $url'); - } + void _launchUrl(String url) async { + if (!await launchUrl(Uri.parse(url))) {} } } diff --git a/lib/src/navigation/view/desktop/menu_bar_tail.dart b/lib/src/navigation/view/desktop/menu_bar_tail.dart index d862bdd5..ca5c5b7b 100644 --- a/lib/src/navigation/view/desktop/menu_bar_tail.dart +++ b/lib/src/navigation/view/desktop/menu_bar_tail.dart @@ -8,15 +8,21 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/src/flutter_unit.dart'; import 'package:go_router/go_router.dart'; import 'package:toly_ui/toly_ui.dart'; +import 'package:tolyui/basic/basic.dart'; import 'theme_model_switch_icon.dart'; +import 'package:app_update/app_update.dart'; -enum ActionType{ +enum ActionType { settings(path: '/settings'), collection(path: '/collection'); + final String path; + const ActionType({required this.path}); } @@ -28,35 +34,46 @@ class MenuBarTail extends StatelessWidget { return Column( children: [ const Divider(indent: 20, color: Colors.white, height: 1), - Wrap( - spacing: 12, - children: [ - FeedbackWidget( - onPressed: () { - context.push(ActionType.settings.path); - }, - child: const Padding( - padding: EdgeInsets.only(bottom: 16, top: 16), - child: Icon( - Icons.settings, - color: Colors.white, - ), - ), - ), - FeedbackWidget( - onPressed: () => context.push(ActionType.collection.path), - child: const Padding( - padding: EdgeInsets.only(bottom: 16, top: 16), - child: Icon( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 8, + children: [ + const SettingIcon(), + TolyAction( + style: const ActionStyle.dark(), + onTap: () => context.push(ActionType.collection.path), + child: const Icon( TolyIcon.icon_collect, color: Colors.white, + size: 22, ), ), - ), - const ThemeModelSwitchIcon(), - ], + const ThemeModelSwitchIcon(), + ], + ), ), ], ); } } + +class SettingIcon extends StatelessWidget { + const SettingIcon({super.key}); + + @override + Widget build(BuildContext context) { + UpdateState state = context.watch().state; + Color tipColor = Colors.redAccent; + Widget child = TolyAction( + style: const ActionStyle.dark(), + onTap: () => context.push(ActionType.settings.path), + child: const Icon(Icons.settings, color: Colors.white, size: 22), + ); + return switch (state) { + ShouldUpdateState() => Badge(backgroundColor: tipColor, child: child), + _ => child, + }; + } +} diff --git a/lib/src/navigation/view/desktop/theme_model_switch_icon.dart b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart index 3d05e3db..3aae39e6 100644 --- a/lib/src/navigation/view/desktop/theme_model_switch_icon.dart +++ b/lib/src/navigation/view/desktop/theme_model_switch_icon.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:tolyui/tolyui.dart'; class ThemeModelSwitchIcon extends StatelessWidget { @@ -11,16 +12,15 @@ class ThemeModelSwitchIcon extends StatelessWidget { bool isDark = Theme.of(context).brightness == Brightness.dark; return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( + child: TolyAction( + style: const ActionStyle.dark(), onTap: (){ context.read().changeThemeMode(isDark?ThemeMode.light:ThemeMode.dark); }, - child: Padding( - padding: const EdgeInsets.only(bottom: 16, top: 16), - child: Icon( - !isDark?TolyIcon.dark:TolyIcon.wb_sunny, - color: Colors.white, - ), + child: Icon( + !isDark?TolyIcon.dark:TolyIcon.wb_sunny, + color: Colors.white, + size: 22, ), ), ); diff --git a/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart b/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart new file mode 100644 index 00000000..96818bea --- /dev/null +++ b/lib/src/navigation/view/desktop/unit_shortcuts_scope.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fx_trace/fx_trace.dart'; +import 'package:go_router/go_router.dart'; +import 'package:widget_module/widget_module.dart'; + +class GlobalFind extends Intent { + const GlobalFind(); +} + +class UnitShortcutsScope extends StatefulWidget { + final Widget child; + + const UnitShortcutsScope({super.key, required this.child}); + + @override + State createState() => _UnitShortcutsScopeState(); +} + +class _UnitShortcutsScopeState extends State + with FxEmitterMixin { + @override + Widget build(BuildContext context) { + return Shortcuts( + shortcuts: { + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyF): const GlobalFind(), + }, + child: Actions( + actions: >{ + GlobalFind: CallbackAction(onInvoke: _onGlobalSearch), + }, + child: widget.child, + ), + ); + } + + @override + void onEvent(FxEvent event) { + if (event is SelectWidgetEvent) { + context.push('/widget/detail/${event.name}', extra: event.model); + } + } + + Object? _onGlobalSearch(GlobalFind intent) { + showDialog(context: context, builder: (_) => const GlobalFindDialog()); + return null; + } +} diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 9de0667a..5f757cfc 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -9,7 +9,6 @@ import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/src/navigation/model/app_tab.dart'; -import 'package:l10n/l10n.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; @@ -39,7 +38,7 @@ class _UnitPhoneNavigationState extends State { void initState() { super.initState(); if (Platform.isAndroid || Platform.isIOS) {} - context.read().add(const CheckUpdate(appName: 'FlutterUnit')); + context.read().add(const CheckUpdate(appId: 1)); } @override diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 750762c2..2d664604 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -9,7 +9,7 @@ import 'package:widget_module/blocs/blocs.dart'; import '../flutter_unit.dart'; import '../navigation/view/app_bloc_provider.dart'; import 'start_repository.dart'; - +import 'package:app_update/app_update.dart'; export 'view/splash/Flutter_unit_splash.dart'; export 'view/error/app_start_error.dart'; @@ -35,6 +35,7 @@ class FxApplication with FxStarter { @override void onStartSuccess(BuildContext context, AppConfig state) { + context.read().add(const CheckUpdate(appId: 1)); context.go(AppRoute.widget.url); } diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index fa0fb6d1..d0603d89 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -28,12 +28,13 @@ class FlutterUnitStartRepo implements AppStartRepository { // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); - FxDio().register(const UnitHost()); + registerHttpClient(); if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); AppConfigPo po = await SpStorage.instance.appConfig.read(); - List netConnect = await (Connectivity().checkConnectivity()); + List netConnect = + await (Connectivity().checkConnectivity()); AppConfig state = AppConfig.fromPo(po); if (netConnect.isNotEmpty) { state = state.copyWith(netConnect: netConnect.first); @@ -60,7 +61,8 @@ class FlutterUnitStartRepo implements AppStartRepository { await dir.create(recursive: true); } ByteData data = await rootBundle.load("assets/flutter.db"); - List bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + List bytes = + data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(dbPath).writeAsBytes(bytes, flush: true); print("=====flutter.db==== assets ======拷贝完成===="); diff --git a/lib/src/starter/view/splash/Flutter_unit_splash.dart b/lib/src/starter/view/splash/Flutter_unit_splash.dart index 110e0f8e..e9d55f1e 100644 --- a/lib/src/starter/view/splash/Flutter_unit_splash.dart +++ b/lib/src/starter/view/splash/Flutter_unit_splash.dart @@ -114,7 +114,7 @@ class SplashTopBar extends StatelessWidget { @override Widget build(BuildContext context) { - if (!isDesk) return const SizedBox.shrink(); + if (!kIsDesk) return const SizedBox.shrink(); return DragToMoveWrapper( child: Stack( children: [ diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart index b8ab307b..296a21dc 100644 --- a/modules/basic_system/app/lib/app/cons/global_value.dart +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -5,4 +5,4 @@ import 'package:flutter/foundation.dart'; double px1 = 1 / window.devicePixelRatio; -bool isDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; +bool kIsDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index 53e2601f..b68d6db4 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -113,7 +113,10 @@ ThemeData lightTheme(AppConfig state) { centerTitle: true, backgroundColor: Colors.white, titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black), + fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black, + fontFamily: '宋体', + + ), ), ); } diff --git a/modules/basic_system/app/lib/app_update/bloc/bloc.dart b/modules/basic_system/app/lib/app_update/bloc/bloc.dart deleted file mode 100644 index 5ee8657a..00000000 --- a/modules/basic_system/app/lib/app_update/bloc/bloc.dart +++ /dev/null @@ -1,71 +0,0 @@ -// import 'dart:async'; -// -// import 'package:flutter_bloc/flutter_bloc.dart'; -// import 'package:flutter_unit/app/utils/http_utils/task_result.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// import 'package:package_info_plus/package_info_plus.dart'; -// import 'package:r_upgrade/r_upgrade.dart'; -// -// import 'event.dart'; -// import 'state.dart'; -// -// class UpdateBloc extends Bloc { -// UpdateBloc() : super(const NoUpdateState()) { -// on(_onCheckUpdate); -// on(_onResetNoUpdate); -// on(_onDownloadEvent); -// on(_onDownloadingEvent); -// } -// -// void _onCheckUpdate(CheckUpdate event, Emitter emit) async { -// emit(const CheckLoadingState()); -// // await Future.delayed(Duration(seconds: 1)); -// // 检测更新逻辑 -// ResultBean result = await AppInfoApi.getAppVersion(appName: event.appName); -// PackageInfo packageInfo = await PackageInfo.fromPlatform(); -// -// if (result.status && result.data != null) { -// if (packageInfo.version == result.data!.appVersion) { -// emit(NoUpdateState( -// isChecked: true, -// checkTime: DateTime.now().millisecondsSinceEpoch, -// )); -// } else { -// if (result.data != null) { -// emit(ShouldUpdateState( -// oldVersion: packageInfo.version, info: result.data!)); -// } -// } -// } else { -// emit(CheckErrorState(error: result.msg)); -// } -// } -// -// void _onResetNoUpdate(ResetNoUpdate event, Emitter emit) { -// emit(const NoUpdateState()); -// } -// -// late int? id; -// late StreamSubscription? subscription; -// -// void _onDownloadEvent(DownloadEvent event, Emitter emit) async{ -// id = await RUpgrade.upgrade(event.appInfo.appUrl, -// fileName: '${event.appInfo.appName}.apk', isAutoRequestInstall: true); -// subscription = RUpgrade.stream.listen((DownloadInfo info) { -// double progress = (info.percent ?? 0) / 100; -// if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { -// progress = 1; -// subscription?.cancel(); -// add(const ResetNoUpdate()); -// } -// add(DownloadingEvent(state: DownloadingState( -// appSize: event.appInfo.appSize, -// progress: progress -// ))); -// }); -// } -// -// void _onDownloadingEvent(DownloadingEvent event, Emitter emit) { -// emit(event.state); -// } -// } diff --git a/modules/basic_system/app/lib/app_update/bloc/event.dart b/modules/basic_system/app/lib/app_update/bloc/event.dart deleted file mode 100644 index 0c75303c..00000000 --- a/modules/basic_system/app/lib/app_update/bloc/event.dart +++ /dev/null @@ -1,44 +0,0 @@ -// import 'package:equatable/equatable.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// -// import 'state.dart'; -// -// abstract class UpdateEvent extends Equatable { -// const UpdateEvent(); -// } -// -// // 检查更新 ---> 校验,转换状态 -// class CheckUpdate extends UpdateEvent { -// final String appName; -// -// const CheckUpdate({required this.appName}); -// -// @override -// List get props => [appName]; -// } -// -// class DownloadEvent extends UpdateEvent { -// final AppInfo appInfo; -// -// const DownloadEvent({required this.appInfo}); -// -// @override -// List get props => [appInfo]; -// } -// -// class DownloadingEvent extends UpdateEvent { -// final DownloadingState state; -// -// const DownloadingEvent({required this.state}); -// -// @override -// List get props => [state]; -// } -// -// // 将状态重置为 NoUpdateState -// class ResetNoUpdate extends UpdateEvent { -// const ResetNoUpdate(); -// -// @override -// List get props => []; -// } diff --git a/modules/basic_system/app/lib/app_update/bloc/state.dart b/modules/basic_system/app/lib/app_update/bloc/state.dart deleted file mode 100644 index b4804d69..00000000 --- a/modules/basic_system/app/lib/app_update/bloc/state.dart +++ /dev/null @@ -1,61 +0,0 @@ -// import 'package:equatable/equatable.dart'; -// import 'package:flutter_unit/point_system/api/app_info.dart'; -// -// abstract class UpdateState extends Equatable { -// const UpdateState(); -// } -// -// class NoUpdateState extends UpdateState { -// final bool isChecked; -// final int checkTime; -// -// const NoUpdateState({this.isChecked = false, this.checkTime = 0}); -// -// @override -// List get props => [isChecked, checkTime]; -// } -// -// class CheckLoadingState extends UpdateState { -// const CheckLoadingState(); -// @override -// List get props => []; -// } -// -// class DownloadingState extends UpdateState { -// final double progress; -// final int appSize; -// -// const DownloadingState({required this.progress, required this.appSize}); -// -// @override -// List get props => [progress, appSize]; -// } -// -// class CheckErrorState extends UpdateState { -// final String error; -// -// const CheckErrorState({required this.error}); -// -// @override -// List get props => [error]; -// -// @override -// String toString() { -// return 'CheckErrorState{error: $error}'; -// } -// } -// -// class ShouldUpdateState extends UpdateState { -// final String oldVersion; -// final AppInfo info; -// -// const ShouldUpdateState({required this.oldVersion, required this.info}); -// -// @override -// List get props => [oldVersion, info]; -// -// @override -// String toString() { -// return 'ShouldUpdateState{oldVersion: $oldVersion, info: $info}'; -// } -// } diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart index 5b22cfc7..ddbeed39 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -1,29 +1,17 @@ +import 'dart:async'; import 'package:app_update/app_update.dart'; import 'package:fx_dio/fx_dio.dart'; import 'package:app/app.dart'; -import 'package:tolyui/tolyui.dart'; class UnitUpgradeApi implements UpgradeApi { @override - Future> fetch(String appName) async { - Host unit = FxDio()(); - return unit.get('${UnitApi.appInfo.path}$appName', queryParameters: { - 'os': kAppEnv.os.name, - }, convertor: (dynamic data) { - dynamic ret = data['data']; - return AppInfo( - appName: ret['appName'], - appVersion: ret['appVersion'], - appUrl: ret['appUrl'], - appSize: ret['appSize'], - description: ret['description'], - sha256: ret['sha256'], - ); - }); - } - - @override - void toast(String message) { - $message.warning(message: message); + Future> fetch(int appId) async { + Host host = FxDio()(); + String path = ScienceApi.appVersion.path; + return host.get( + path, + queryParameters: {'app_id': 1, 'os': kAppEnv.os.name}, + convertor: AppInfo.fromMap, + ); } } diff --git a/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart index ba4ec516..a5dcce2e 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/unit_host.dart @@ -17,7 +17,7 @@ class UnitHost extends Host { ); @override - HostEnv get env => HostEnv.release; + HostEnv get env => HostEnv.dev; } enum UnitApi { diff --git a/modules/basic_system/app/lib/http/http.dart b/modules/basic_system/app/lib/http/http.dart index 1dbb145c..f1473952 100644 --- a/modules/basic_system/app/lib/http/http.dart +++ b/modules/basic_system/app/lib/http/http.dart @@ -1,2 +1,5 @@ export 'flutter_unit/api/upgrade_api.dart'; export 'flutter_unit/unit_host.dart'; +export 'science/science_host.dart'; +export 'science/science_rep_interceptor.dart'; +export 'register.dart'; diff --git a/modules/basic_system/app/lib/http/register.dart b/modules/basic_system/app/lib/http/register.dart new file mode 100644 index 00000000..141362fc --- /dev/null +++ b/modules/basic_system/app/lib/http/register.dart @@ -0,0 +1,7 @@ +import 'package:fx_dio/fx_dio.dart'; +import 'http.dart'; + +void registerHttpClient(){ + FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); + FxDio().register(const UnitHost()); +} \ No newline at end of file diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart new file mode 100644 index 00000000..32fa5bb6 --- /dev/null +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -0,0 +1,31 @@ +import 'package:fx_dio/fx_dio.dart'; + +class ScienceHost extends Host { + const ScienceHost(); + + @override + Map get value => { + HostEnv.release: 'api.toly1994.com', + HostEnv.dev: '192.168.109.244', + }; + + @override + HostConfig get config => const HostConfig( + scheme: 'http', + port: 3000, + apiNest: '/api/v1', + ); + + @override + HostEnv get env => HostEnv.dev; +} + +enum ScienceApi { + appVersion("/app_version"), + ; + + final String path; + final Method? method; + + const ScienceApi(this.path, [this.method = Method.get]); +} diff --git a/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart b/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart new file mode 100644 index 00000000..87848ae6 --- /dev/null +++ b/modules/basic_system/app/lib/http/science/science_rep_interceptor.dart @@ -0,0 +1,48 @@ +import 'package:dio/dio.dart'; +import 'package:fx_trace/fx_trace.dart'; + +class ScienceRepInterceptor extends InterceptorsWrapper { + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + handleResponse(response); + super.onResponse(response, handler); + } + + void handleResponse(Response response) { + if (response.statusCode == HttpCode.ok.value) { + bool success = response.data?['status'] == true; + String message = response.data['msg']; + if (success) { + response.data = response.data['data']; + response.statusMessage = message; + } else { + throw ApiTrace(message: message, error: response.data); + } + return; + } + throw ApiTrace(message: response.statusMessage ?? '', error: response.data); + } +} + +class ApiTrace with Code, Trace { + @override + final int? value; + + @override + final String message; + + @override + final Object error; + + ApiTrace({ + this.value, + required this.message, + required this.error, + }); + + @override + Code? get code => this; + + @override + StackTrace? get stack => null; +} diff --git a/modules/basic_system/app/lib/view/setting/font_setting.dart b/modules/basic_system/app/lib/view/setting/font_setting.dart index 30fed2e1..8321d6b9 100644 --- a/modules/basic_system/app/lib/view/setting/font_setting.dart +++ b/modules/basic_system/app/lib/view/setting/font_setting.dart @@ -24,7 +24,7 @@ class FontSettingPage extends StatelessWidget { BuildContext context, List fontFamilySupport, String fontFamily) { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), - crossAxisCount: isDesk?4:2, + crossAxisCount: kIsDesk?4:2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1.5, diff --git a/modules/basic_system/app/lib/view/setting/setting_page.dart b/modules/basic_system/app/lib/view/setting/setting_page.dart index c4f5a9be..789fc4c8 100644 --- a/modules/basic_system/app/lib/view/setting/setting_page.dart +++ b/modules/basic_system/app/lib/view/setting/setting_page.dart @@ -5,41 +5,41 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'language_setting.dart'; +import 'package:app_update/app_update.dart'; class SettingPage extends StatelessWidget { - const SettingPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - const Widget divider = Divider(height: 1); - + const Widget divider = Divider(height: 1); return DragToMoveWrapper( child: Scaffold( - appBar: AppBar(title:Text(context.l10n.appSettings)), + appBar: AppBar(title: Text(context.l10n.appSettings)), body: ListView( children: [ - Container( height: 15), + Container(height: 15), ListTile( leading: Icon( Icons.style, color: Theme.of(context).primaryColor, ), - title: Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state) { - String info = switch(state.themeMode){ + title: + Text(context.l10n.darkMode, style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) { + String info = switch (state.themeMode) { ThemeMode.system => context.l10n.followSystem, ThemeMode.light => context.l10n.lightMode, ThemeMode.dark => context.l10n.darkMode, }; - return Text(info, style: const TextStyle(fontSize: 12,color: Colors.grey) - ); + return Text(info, + style: const TextStyle(fontSize: 12, color: Colors.grey)); }, ), trailing: _nextIcon(context), - onTap: ()=> context.push('/settings/dark_mode'), + onTap: () => context.push('/settings/dark_mode'), ), divider, ListTile( @@ -47,27 +47,30 @@ class SettingPage extends StatelessWidget { Icons.palette, color: Theme.of(context).primaryColor, ), - title: Text(context.l10n.themeColorSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( + title: Text(context.l10n.themeColorSetting, + style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) => Text( state.themeColor.label(context), - style: TextStyle(color: state.themeColor.color,fontSize: 12), + style: TextStyle(color: state.themeColor.color, fontSize: 12), ), ), trailing: _nextIcon(context), onTap: () => context.push('/settings/theme_color'), ), // divider, - Container( height: 10), + Container(height: 10), ListTile( leading: Icon( Icons.translate, color: Theme.of(context).primaryColor, ), - title: Text(context.l10n.fontSetting, style: TextStyle(fontSize: 16)), - subtitle: BlocBuilder( - builder: (_,state)=>Text( - state.fontFamily,style: TextStyle(fontSize: 12), + title: Text(context.l10n.fontSetting, + style: TextStyle(fontSize: 16)), + subtitle: BlocBuilder( + builder: (_, state) => Text( + state.fontFamily, + style: TextStyle(fontSize: 12), ), ), trailing: _nextIcon(context), @@ -81,12 +84,15 @@ class SettingPage extends StatelessWidget { TolyIcon.icon_code, color: Theme.of(context).primaryColor, ), - title: Text(context.l10n.codeHighlightStyle, style: TextStyle(fontSize: 16)), + title: Text(context.l10n.codeHighlightStyle, + style: TextStyle(fontSize: 16)), trailing: _nextIcon(context), onTap: () => context.push('/settings/code_style'), ), // divider, - Container( height: 10,), + Container( + height: 10, + ), // _buildShowBg(context), divider, _buildShowOver(context), @@ -94,81 +100,77 @@ class SettingPage extends StatelessWidget { // _buildShowTool(context), divider, // Container( height: 10), - ListTile( - leading: Icon( - Icons.info, - color: Theme.of(context).primaryColor, - ), - title: Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)), - trailing: _nextIcon(context), - onTap: () => context.push('/settings/version'), - ), + VersionTiled(), ], ), ), ); } -//SwitchListTile( -// inactiveTrackColor: Colors.grey.withOpacity(0.3), -// // inactiveThumbColor: Colors.white, -// activeColor: Theme.of(context).primaryColor, -// value: state.showBackGround, -// secondary: Icon( -// TolyIcon.icon_background, -// color: Theme.of(context).primaryColor, -// ), -// title: const Text('显示背景', style: TextStyle(fontSize: 16)), -// onChanged: (show) { -// BlocProvider.of(context).switchShowBg(show); -// }, -// ) - - Widget _buildShowBg(BuildContext context) => - BlocBuilder( - builder: (_, state) => TolySwitchListTile( - secondary:Icon( - TolyIcon.icon_background, - color: Theme.of(context).primaryColor, - ), - title: const Text('显示背景', style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)) - , value: state.showBackGround, onChanged: (bool value) { - BlocProvider.of(context).switchShowBg(value); - }, - ),); - Widget _buildShowOver(BuildContext context) => BlocBuilder( builder: (_, state) => TolySwitchListTile( - secondary:Icon( - TolyIcon.icon_background, - color: Theme.of(context).primaryColor, - ), - title: Text(context.l10n.displayPerformanceFloatingLayer, style: TextStyle(fontSize: 16)) - , value: state.showPerformanceOverlay, onChanged: (bool value) { - BlocProvider.of(context).switchShowOver(value); - }, - )); + secondary: Icon( + TolyIcon.icon_background, + color: Theme.of(context).primaryColor, + ), + title: Text(context.l10n.displayPerformanceFloatingLayer, + style: TextStyle(fontSize: 16)), + value: state.showPerformanceOverlay, + onChanged: (bool value) { + BlocProvider.of(context).switchShowOver(value); + }, + )); - // Widget _buildShowTool(BuildContext context) => - // BlocBuilder( - // builder: (_, state) => SwitchListTile( - // value: state.showOverlayTool, - // secondary: Icon( - // TolyIcon.icon_layout, - // color: Theme.of(context).primaryColor, - // ), - // title: const Text('显示浮动工具', style: TextStyle(fontSize: 16)), - // onChanged: (show) { - // if(show){ - // OverlayToolWrapper.of(context).showFloating(); - // }else{ - // OverlayToolWrapper.of(context).hideFloating(); - // } - // BlocProvider.of(context).switchShowTool(show); - // }, - // )); + Widget _nextIcon(BuildContext context) => + Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); +} + +class VersionTiled extends StatelessWidget { + const VersionTiled({super.key}); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + Widget title = Text(context.l10n.versionInformation, style: TextStyle(fontSize: 16)); + + UpdateState state = context.watch().state; + if (state is ShouldUpdateState) { + title = Wrap( + spacing: 8, + crossAxisAlignment: WrapCrossAlignment.center, + children: [title, AppUpgradeTips(state: state)], + ); + } - Widget _nextIcon(BuildContext context) => Icon(Icons.chevron_right, color: Theme.of(context).primaryColor); + return ListTile( + leading: Icon(Icons.info, color: themeColor), + title: title, + trailing: Icon(Icons.chevron_right, color: themeColor), + onTap: () => context.push('/settings/version'), + ); + } +} + +class AppUpgradeTips extends StatelessWidget { + final ShouldUpdateState state; + + const AppUpgradeTips({super.key, required this.state}); + + @override + Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; + bool downloading = state.isDownloading; + String text = downloading ? state.progressDisplay : '新版本'; + Color color = downloading ? themeColor : Colors.redAccent; + return Container( + decoration: + BoxDecoration(color: color, borderRadius: BorderRadius.circular(4)), + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4), + child: Text( + text, + style: TextStyle(color: Colors.white, fontSize: 10, height: 1), + )); + } } diff --git a/modules/basic_system/app/lib/view/setting/theme_color_setting.dart b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart index e9678054..e43a687a 100644 --- a/modules/basic_system/app/lib/view/setting/theme_color_setting.dart +++ b/modules/basic_system/app/lib/view/setting/theme_color_setting.dart @@ -27,7 +27,7 @@ class ThemeColorSettingPage extends StatelessWidget { return GridView.count( padding: const EdgeInsets.only(top: 20, left: 10, right: 10), shrinkWrap: true, - crossAxisCount: isDesk?4:2, + crossAxisCount: kIsDesk?4:2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1.5, diff --git a/modules/basic_system/app_update/lib/app_update.dart b/modules/basic_system/app_update/lib/app_update.dart index 95089d3f..ee3abb43 100644 --- a/modules/basic_system/app_update/lib/app_update.dart +++ b/modules/basic_system/app_update/lib/app_update.dart @@ -3,7 +3,7 @@ library app_update; export 'bloc/bloc.dart'; export 'bloc/state.dart'; export 'bloc/event.dart'; -export 'model/app_info.dart'; +export 'repository/model/app_info.dart'; export 'views/app_update_panel.dart'; export 'views/update_red_point.dart'; diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index 3ea72bbc..63d12629 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -10,7 +10,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:r_upgrade/r_upgrade.dart'; import 'package:fx_dio/fx_dio.dart'; -import '../model/app_info.dart'; +import '../repository/model/app_info.dart'; import 'event.dart'; import 'state.dart'; @@ -21,22 +21,17 @@ class UpgradeBloc extends Bloc { UpgradeBloc({required this.api}) : super(const NoUpdateState()) { on(_onCheckUpdate); - on(_onResetNoUpdate); on(_onDownloadEvent); - on(_onDownloadingEvent); } void _onCheckUpdate(CheckUpdate event, Emitter emit) async { - print("========_onCheckUpdate=============="); emit(const CheckLoadingState()); - // 检测更新逻辑 - ApiRet ret = await api.fetch(event.appName); + ApiRet ret = await api.fetch(event.appId); if (ret.failed) { - emit(CheckErrorState(error: ret.msg)); + emit(UpdateErrorState(error: ret.msg)); return; } AppInfo result = ret.data; - print(result); PackageInfo packageInfo = await PackageInfo.fromPlatform(); if (result.shouldUpgrade(packageInfo.version)) { emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); @@ -46,57 +41,49 @@ class UpgradeBloc extends Bloc { } } - void _onResetNoUpdate(ResetNoUpdate event, Emitter emit) { - emit(const NoUpdateState()); - } + void _onDownloadEvent(DownloadEvent event, Emitter emit) async { + UpdateState curState = state; + if (curState is! ShouldUpdateState) return; - late int? id; - late StreamSubscription? subscription; + void onProgressChange(double progress) { + emit(curState.copyWith(progress: progress)); + } + onProgressChange(0.001); - void _onDownloadEvent(DownloadEvent event, Emitter emit) async { - emit(DownloadingState(progress: 0, appSize: event.appInfo.appSize)); - if (isDesk) { - String url = event.appInfo.appUrl; - Dio dio = Dio(); - Directory dir = await getTemporaryDirectory(); - String filePath = p.join(dir.path, p.basename(url)); - Response rep = await dio.download( - url, - filePath, - onReceiveProgress: (c, t) => - _onProgressChange(event.appInfo.appSize, c / t), - ); - if (rep.statusCode == 200) { - add(const ResetNoUpdate()); - OpenFile.open(filePath); - } + String url = event.appInfo.url; + if (kIsDesk) { + handleDesk(url, onProgressChange); return; } + handleAndroid(url, onProgressChange); + } - id = await RUpgrade.upgrade( - event.appInfo.appUrl, - fileName: '${event.appInfo.appName}.apk', + void handleDesk(String url, OnProgressChange callback) async { + Dio dio = Dio(); + Directory dir = await getTemporaryDirectory(); + String filePath = p.join(dir.path, p.basename(url)); + Response rep = await dio.download( + url, + filePath, + onReceiveProgress: (c, t) => callback(c / t), ); + if (rep.statusCode == 200) { + await OpenFile.open(filePath); + } + } + + late int? id; + StreamSubscription? subscription; + + void handleAndroid(String url, OnProgressChange callback) async { + id = await RUpgrade.upgrade(url, fileName: p.basename(url)); subscription = RUpgrade.stream.listen((DownloadInfo info) { double progress = (info.percent ?? 0) / 100; - if (info.status! == DownloadStatus.STATUS_SUCCESSFUL) { + if (info.status == DownloadStatus.STATUS_SUCCESSFUL) { progress = 1; subscription?.cancel(); - add(const ResetNoUpdate()); } - _onProgressChange(event.appInfo.appSize, progress); + callback(progress); }); } - - void _onProgressChange(int appSize, double progress) { - add( - DownloadingEvent( - state: DownloadingState(appSize: appSize, progress: progress), - ), - ); - } - - void _onDownloadingEvent(DownloadingEvent event, Emitter emit) { - emit(event.state); - } } diff --git a/modules/basic_system/app_update/lib/bloc/event.dart b/modules/basic_system/app_update/lib/bloc/event.dart index 11154945..e892c839 100644 --- a/modules/basic_system/app_update/lib/bloc/event.dart +++ b/modules/basic_system/app_update/lib/bloc/event.dart @@ -1,21 +1,19 @@ import 'package:equatable/equatable.dart'; +import '../repository/model/app_info.dart'; -import '../model/app_info.dart'; -import 'state.dart'; - -abstract class UpdateEvent extends Equatable { +sealed class UpdateEvent extends Equatable { const UpdateEvent(); } // 检查更新 ---> 校验,转换状态 class CheckUpdate extends UpdateEvent { - final String appName; + final int appId; - const CheckUpdate({required this.appName}); + const CheckUpdate({required this.appId}); @override - List get props => [appName]; + List get props => [appId]; } class DownloadEvent extends UpdateEvent { @@ -26,20 +24,3 @@ class DownloadEvent extends UpdateEvent { @override List get props => [appInfo]; } - -class DownloadingEvent extends UpdateEvent { - final DownloadingState state; - - const DownloadingEvent({required this.state}); - - @override - List get props => [state]; -} - -// 将状态重置为 NoUpdateState -class ResetNoUpdate extends UpdateEvent { - const ResetNoUpdate(); - - @override - List get props => []; -} diff --git a/modules/basic_system/app_update/lib/bloc/state.dart b/modules/basic_system/app_update/lib/bloc/state.dart index eb3c78bb..b149263d 100644 --- a/modules/basic_system/app_update/lib/bloc/state.dart +++ b/modules/basic_system/app_update/lib/bloc/state.dart @@ -1,9 +1,8 @@ import 'package:equatable/equatable.dart'; -import '../model/app_info.dart'; +import '../repository/model/app_info.dart'; - -abstract class UpdateState extends Equatable { +sealed class UpdateState extends Equatable { const UpdateState(); } @@ -19,24 +18,16 @@ class NoUpdateState extends UpdateState { class CheckLoadingState extends UpdateState { const CheckLoadingState(); + @override List get props => []; } -class DownloadingState extends UpdateState { - final double progress; - final int appSize; - - const DownloadingState({required this.progress, required this.appSize}); - @override - List get props => [progress, appSize]; -} - -class CheckErrorState extends UpdateState { +class UpdateErrorState extends UpdateState { final String error; - const CheckErrorState({required this.error}); + const UpdateErrorState({required this.error}); @override List get props => [error]; @@ -49,15 +40,31 @@ class CheckErrorState extends UpdateState { class ShouldUpdateState extends UpdateState { final String oldVersion; + final double progress; final AppInfo info; - const ShouldUpdateState({required this.oldVersion, required this.info}); + const ShouldUpdateState({ + required this.oldVersion, + required this.info, + this.progress = 0, + }); @override - List get props => [oldVersion, info]; + List get props => [oldVersion, info,progress]; @override String toString() { return 'ShouldUpdateState{oldVersion: $oldVersion, info: $info}'; } + + bool get isDownloading => progress > 0 && progress != 1; + String get progressDisplay => "${(progress * 100).toStringAsFixed(2)}%"; + + UpdateState copyWith({double? progress}) { + return ShouldUpdateState( + oldVersion: oldVersion, + info: info, + progress: progress ?? this.progress, + ); + } } diff --git a/modules/basic_system/app_update/lib/model/app_info.dart b/modules/basic_system/app_update/lib/model/app_info.dart deleted file mode 100644 index 9340471c..00000000 --- a/modules/basic_system/app_update/lib/model/app_info.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class AppInfo extends Equatable { - final String appName; - final String appVersion; - final String appUrl; - final int appSize; - final String? description; - final String? sha256; - - const AppInfo({ - required this.appName, - required this.appVersion, - required this.appUrl, - required this.appSize, - required this.description, - required this.sha256, - }); - - @override - List get props => [appName, appVersion, appUrl, appSize]; - - @override - String toString() { - return 'AppInfo{appName: $appName, appVersion: $appVersion, appUrl: $appUrl, appSize: $appSize}'; - } - - bool shouldUpgrade(String current) => needsUpdate(current, appVersion); -} - -bool needsUpdate( - String oldVersion, - String newVersion, { - int versionParts = 3, // 默认三位版本号 - String prefix = '', // 默认无前缀 -}) { - // 去除版本号前缀并将其解析为整数列表 - List parseVersion(String version) { - if (prefix.isNotEmpty && version.startsWith(prefix)) { - version = version.substring(prefix.length); // 移除前缀 - } - - final parts = version.split('.'); - if (parts.length != versionParts) { - throw FormatException( - '版本号格式错误,应为包含 $versionParts 位版本号的格式,如 ${prefix}1.0.0'); - } - - return parts.map(int.parse).toList(); - } - - final oldParts = parseVersion(oldVersion); - final newParts = parseVersion(newVersion); - - // 按位比较版本号 - for (int i = 0; i < versionParts; i++) { - if (newParts[i] > oldParts[i]) { - return true; // 新版本号更大,需要更新 - } else if (newParts[i] < oldParts[i]) { - return false; // 新版本号更小,不需要更新 - } - } - - // 版本号相同,不需要更新 - return false; -} diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart index 1965d52e..3c2d6cfd 100644 --- a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -1,13 +1,12 @@ -import '../../model/app_info.dart'; +import 'package:app/app.dart'; + +import '../model/app_info.dart'; import 'package:fx_dio/fx_dio.dart'; -abstract class UpgradeApi with CheckUpgrade, Toaster { -} +typedef OnProgressChange = void Function(double progress); -mixin CheckUpgrade { - Future> fetch(String appName); -} +abstract class UpgradeApi with CheckUpgrade {} -mixin Toaster { - void toast(String message); +mixin CheckUpgrade { + Future> fetch(int appId); } diff --git a/modules/basic_system/app_update/lib/repository/model/app_info.dart b/modules/basic_system/app_update/lib/repository/model/app_info.dart index 8b137891..4be0e71e 100644 --- a/modules/basic_system/app_update/lib/repository/model/app_info.dart +++ b/modules/basic_system/app_update/lib/repository/model/app_info.dart @@ -1 +1,71 @@ +import 'package:path/path.dart' as p; +class AppInfo { + final String version; + final String url; + final int size; + final String? description; + final String? sha256; + + const AppInfo({ + required this.version, + required this.url, + required this.size, + required this.description, + required this.sha256, + }); + + String get appName => p.basename(url); + + factory AppInfo.fromMap(dynamic map) => AppInfo( + version: map['version'] ?? '', + url: map['url'] ?? '', + size: map['size'] ?? 0, + description: map['description'] ?? '', + sha256: map['sha256'] ?? '', + ); + + @override + String toString() { + return 'AppInfo{appName: $appName, appVersion: $version, appUrl: $url, appSize: $size}'; + } + + bool shouldUpgrade(String current) => needsUpdate(current, version); +} + +bool needsUpdate( + String oldVersion, + String newVersion, { + int versionParts = 3, // 默认三位版本号 + String prefix = '', // 默认无前缀 +}) { + // 去除版本号前缀并将其解析为整数列表 + List parseVersion(String version) { + if (prefix.isNotEmpty && version.startsWith(prefix)) { + version = version.substring(prefix.length); // 移除前缀 + } + + final parts = version.split('.'); + if (parts.length != versionParts) { + throw FormatException( + '版本号格式错误,应为包含 $versionParts 位版本号的格式,如 ${prefix}1.0.0'); + } + + return parts.map(int.parse).toList(); + } + + final oldParts = parseVersion(oldVersion); + final newParts = parseVersion(newVersion); + + // 按位比较版本号 + for (int i = 0; i < versionParts; i++) { + if (newParts[i] > oldParts[i]) { + return true; // 新版本号更大,需要更新 + } else if (newParts[i] < oldParts[i]) { + return false; // 新版本号更小,不需要更新 + } + } + + // 版本号相同,不需要更新 + return false; +} diff --git a/modules/basic_system/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart index 01629aee..764aa23c 100644 --- a/modules/basic_system/app_update/lib/views/app_update_panel.dart +++ b/modules/basic_system/app_update/lib/views/app_update_panel.dart @@ -10,7 +10,7 @@ import 'package:l10n/l10n.dart'; import '../bloc/bloc.dart'; import '../bloc/event.dart'; import '../bloc/state.dart'; -import 'dialog/feishu_update_dialog.dart'; +import 'dialog/update_dialog.dart'; class AppUpdatePanel extends StatelessWidget { const AppUpdatePanel({Key? key}) : super(key: key); @@ -32,14 +32,16 @@ class AppUpdatePanel extends StatelessWidget { children: [ Text( '${(progress * 100).toStringAsFixed(2)} %', - style: const TextStyle(height: 1, fontSize: 12, color: Colors.grey), + style: const TextStyle( + height: 1, fontSize: 12, color: Colors.grey), ), const SizedBox( height: 5, ), Text( '${convertFileSize((appSize * progress).floor())}/${convertFileSize(appSize)}', - style: const TextStyle(height: 1, fontSize: 10, color: Colors.grey), + style: const TextStyle( + height: 1, fontSize: 10, color: Colors.grey), ), ], ), @@ -62,26 +64,28 @@ class AppUpdatePanel extends StatelessWidget { String info = context.l10n.checkUpdate; Widget trail = const SizedBox.shrink(); if (state is ShouldUpdateState) { - info = context.l10n.downloadNewVersion; - trail = Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text( - '${state.oldVersion} --> ${state.info.appVersion} ', - style: const TextStyle(height: 1, fontSize: 12, color: Colors.grey), - ), - const SizedBox(width: 5), - const Icon(Icons.update, color: Colors.green) - ]); + if (state.progress > 0) { + info = context.l10n.downloadingNewVersion; + trail = _buildProgress(context, state.progress, state.info.size); + } else { + info = context.l10n.downloadNewVersion; + trail = Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + '${state.oldVersion} --> ${state.info.version} ', + style: const TextStyle( + height: 1, fontSize: 12, color: Colors.grey), + ), + const SizedBox(width: 5), + const Icon(Icons.update, color: Colors.green) + ]); + } } if (state is CheckLoadingState) { trail = const CupertinoActivityIndicator(); } - if (state is DownloadingState) { - info = context.l10n.downloadingNewVersion; - trail = _buildProgress(context, state.progress, state.appSize); - } return ListTile( title: Text( @@ -95,17 +99,19 @@ class AppUpdatePanel extends StatelessWidget { void _tapByState(UpdateState state, BuildContext context) { if (state is NoUpdateState) { - context.read().add(const CheckUpdate(appName: 'FlutterUnit')); + context.read().add(const CheckUpdate(appId: 1)); } if (state is ShouldUpdateState) { showDialog( barrierDismissible: false, context: context, - builder: (ctx) => FeiShuUpdateDialog( + builder: (ctx) => UpdateDialog( result: state.info, onConfirm: () { - context.read().add(DownloadEvent(appInfo: state.info)); + context + .read() + .add(DownloadEvent(appInfo: state.info)); }, )); // if(Platform.isIOS){ diff --git a/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart b/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart deleted file mode 100644 index 13e91eea..00000000 --- a/modules/basic_system/app_update/lib/views/dialog/desk_feishu_update_dialog.dart +++ /dev/null @@ -1,288 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:typed_data'; -import 'dart:ui'; - -import 'package:crypto/crypto.dart'; -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; - -import 'package:async/async.dart'; -import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart'; -import 'package:convert/convert.dart'; -import '../../model/app_info.dart'; -import 'top_bar.dart'; - -class DeskFeiShuUpdateDialog extends StatefulWidget { - final AppInfo result; - // final ValueChanged? onDownloadSuccess; - - const DeskFeiShuUpdateDialog({Key? key, required this.result,}) : super(key: key); - - @override - State createState() => _DeskFeiShuUpdateDialogState(); -} - -class _DeskFeiShuUpdateDialogState extends State { - final TextStyle noticeStyle = - const TextStyle(color: Colors.grey, fontSize: 16); - final TextStyle cancelTextStyle = - const TextStyle(color: Colors.grey, fontSize: 16); - - final TextStyle subTextStyle = const TextStyle( - color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); - - final TextStyle okTextStyle = - const TextStyle(color: Color(0xffe16b5c), fontSize: 16); - - ValueNotifier progress = ValueNotifier(0); - - @override - Widget build(BuildContext context) { - return Dialog( - elevation: 0, - backgroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(8))), - child: Container( - height: 360, - alignment: Alignment.topLeft, - width: isDesk ? 400 : 320, - // color: Colors.green, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - buildTitle(), - Expanded(child: buildContent()), - Row( - children: [ - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - // 下载中,不能退出 - if (progress.value == 0) { - // UpgradeChecker.checked = true; - Navigator.of(context).pop(false); - } else { - // Toast.warning('请等待下载完成'); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: Colors.grey.withAlpha(88), - width: 1 / window.devicePixelRatio), - right: BorderSide( - color: Colors.grey.withAlpha(88), - width: 1 / window.devicePixelRatio))), - alignment: Alignment.center, - height: 50, - child: Text( - '稍后再说', - style: cancelTextStyle, - ), - ), - ), - ), - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - upgradeWindows(); - - }, - child: Container( - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: Colors.grey.withAlpha(88), - width: 1 / window.devicePixelRatio), - right: BorderSide( - color: Colors.grey.withAlpha(88), - width: 1 / window.devicePixelRatio))), - alignment: Alignment.center, - height: 50, - child: Text( - '立即升级', - style: okTextStyle, - ), - ), - )), - ], - ), - ], - ), - ), - ); - } - - Widget buildContent() { - return ValueListenableBuilder( - valueListenable: progress, - builder: (_, double progress, Widget? child) { - if (progress == 0) { - return _buildUpdateInfo(); - } - return downloadProgress(progress); - }, - ); - } - - Widget downloadProgress(double progress) { - return Center( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '下载中...', - style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), - ), - const SizedBox( - height: 10, - ), - LinearProgressIndicator( - minHeight: 10, - value: progress / 100, - ), - const SizedBox( - height: 10, - ), - Row( - children: [ - Text("${progress.toStringAsFixed(1)}%", - style: - TextStyle(height: 1, fontSize: 12, color: Colors.grey)), - Spacer(), - Text( - "${convertFileSize(((widget.result.appSize) / 100 * (progress)).toInt())}/${convertFileSize(widget.result.appSize)}", - style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), - ) - ], - ) - ], - ), - ), - ); - } - - Widget _buildUpdateInfo() { - return SingleChildScrollView( - child: Container( - width: 500, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '更新内容: ', - style: TextStyle(fontWeight: FontWeight.bold), - ), - const SizedBox( - height: 6, - ), - Text( - widget.result.description??'', - style: TextStyle(color: Colors.grey), - ), - ], - ), - ), - ); - } - - Widget buildTitle() { - return ValueListenableBuilder( - valueListenable: progress, - builder: (_, double progress, Widget? child) { - String text = - progress != 0 ? "正在下载更新.." : "蜜蜂 V${widget.result.appVersion} 准备就绪"; - - return FeiShuUpdateTopBar( - text: text, - ); - }, - ); - } - - void onDownloadWindowsSuccess() async { - Navigator.pop(context); - String? downloadUrl = widget.result.appUrl; - Directory dir = await getApplicationSupportDirectory(); - String savePath = path.join(dir.path, path.basename(downloadUrl)); - File file = File(savePath); - print("======下载成功:======${file.path}==========="); - - Digest digest = await getFileSha256(file.path); - // if (digest.toString() == widget.result.checkCode) { - // Toast.success('更新程序下载完成,即将重新启动!',short: false); - // // widget.onDownloadSuccess?.call(savePath); - // } else { - // Toast.error("文件校验失败,请重新下载"); - // } - } - - static Future getFileSha256(String path) async { - final reader = ChunkedStreamReader(File(path).openRead()); - const chunkSize = 1024 * 1024 * 2; - var output = AccumulatorSink(); - var input = sha256.startChunkedConversion(output); - - try { - while (true) { - final chunk = await reader.readChunk(chunkSize); - if (chunk.isEmpty) { - break; - } - input.add(chunk); - } - } finally { - reader.cancel(); - } - input.close(); - - return output.events.single; - } - - - String convertFileSize(int? size) { - if (size == null) return '0 Kb'; - double result = size / 1024.0; - if (result < 1024) { - return "${result.toStringAsFixed(2)} KB"; - } else if (result > 1024 && result < 1024 * 1024) { - return "${(result / 1024).toStringAsFixed(2)} MB"; - } else { - return "${(result / 1024 / 1024).toStringAsFixed(2)} GB"; - } - } - - void upgradeWindows() async { - // if (progress.value != 0) { - // Toast.warning('正在下载'); - // progress.value = 0.1; - // return; - // } - // String? downloadUrl = widget.result.url; - // if (downloadUrl == null) return; - // Directory dir = await getApplicationSupportDirectory(); - // String savePath = path.join(dir.path, path.basename(downloadUrl)); - // print('===downloadUrl:$downloadUrl====savePath:$savePath===='); - // - // context.read().api.dio.download(widget.result.url!, savePath, - // onReceiveProgress: onReceiveProgress); - } - - void onReceiveProgress(int count, int total) { - progress.value = (count / total) * 100; - if (total == count) { - progress.value = 100; - onDownloadWindowsSuccess(); - } - } -} diff --git a/modules/basic_system/app_update/lib/views/dialog/top_bar.dart b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart index a9466068..29ff58ec 100644 --- a/modules/basic_system/app_update/lib/views/dialog/top_bar.dart +++ b/modules/basic_system/app_update/lib/views/dialog/top_bar.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -class FeiShuUpdateTopBar extends StatelessWidget { +class UpdateTopBar extends StatelessWidget { final String text; - const FeiShuUpdateTopBar({Key? key, required this.text}) : super(key: key); + const UpdateTopBar({Key? key, required this.text}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart b/modules/basic_system/app_update/lib/views/dialog/update_dialog.dart similarity index 64% rename from modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart rename to modules/basic_system/app_update/lib/views/dialog/update_dialog.dart index 544c898f..2fc3a81b 100644 --- a/modules/basic_system/app_update/lib/views/dialog/feishu_update_dialog.dart +++ b/modules/basic_system/app_update/lib/views/dialog/update_dialog.dart @@ -1,4 +1,3 @@ - import 'dart:ui'; import 'package:app/app.dart'; import 'package:flutter/material.dart'; @@ -6,34 +5,35 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import '../../bloc/bloc.dart'; import '../../bloc/state.dart'; -import '../../model/app_info.dart'; +import '../../repository/model/app_info.dart'; import 'top_bar.dart'; -class FeiShuUpdateDialog extends StatefulWidget { +class UpdateDialog extends StatefulWidget { final AppInfo result; final ValueChanged? onDownloadSuccess; final VoidCallback? onBackHide; final VoidCallback? onConfirm; - const FeiShuUpdateDialog({ - Key? key, + const UpdateDialog({ + super.key, required this.result, this.onDownloadSuccess, this.onBackHide, this.onConfirm, - }) : super(key: key); + }); @override - State createState() => _FeiShuUpdateDialogState(); + State createState() => _UpdateDialogState(); } -class _FeiShuUpdateDialogState extends State { - final TextStyle noticeStyle = const TextStyle(color: Colors.grey, fontSize: 16); - final TextStyle cancelTextStyle = const TextStyle(color: Colors.grey, fontSize: 16); - - final TextStyle subTextStyle = - const TextStyle(color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); +class _UpdateDialogState extends State { + final TextStyle noticeStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle cancelTextStyle = + const TextStyle(color: Colors.grey, fontSize: 16); + final TextStyle subTextStyle = const TextStyle( + color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold); @override Widget build(BuildContext context) { @@ -46,11 +46,12 @@ class _FeiShuUpdateDialogState extends State { child: Dialog( elevation: 0, backgroundColor: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8))), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8))), child: Container( height: 360, alignment: Alignment.topLeft, - width: isDesk ? 400 : 320, + width: kIsDesk ? 400 : 320, // color: Colors.green, child: Column( mainAxisSize: MainAxisSize.min, @@ -68,11 +69,10 @@ class _FeiShuUpdateDialogState extends State { } Widget buildContent(UpdateState state) { - if (state is DownloadingState) { - return downloadProgress(state.progress); - } - if (state is ShouldUpdateState) { + if (state.progress > 0) { + return downloadProgress(state.progress); + } return _buildUpdateInfo(); } return const SizedBox.shrink(); @@ -103,10 +103,11 @@ class _FeiShuUpdateDialogState extends State { Row( children: [ Text("${(progress * 100).toStringAsFixed(1)}%", - style: TextStyle(height: 1, fontSize: 12, color: Colors.grey)), + style: + TextStyle(height: 1, fontSize: 12, color: Colors.grey)), Spacer(), Text( - "${convertFileSize(((widget.result.appSize) * (progress)).toInt())}/${convertFileSize(widget.result.appSize)}", + "${convertFileSize(((widget.result.size) * (progress)).toInt())}/${convertFileSize(widget.result.size)}", style: TextStyle(height: 1, fontSize: 12, color: Colors.grey), ) ], @@ -156,21 +157,47 @@ class _FeiShuUpdateDialogState extends State { Widget buildTitle(UpdateState state) { String text = ''; - if (state is DownloadingState) { - text = "正在下载更新.."; - } - if (state is ShouldUpdateState) { - text = "FlutterUnit v${state.info.appVersion} 准备就绪"; + text = "FlutterUnit v${state.info.version} 准备就绪"; + if (state.progress > 0) { + text = "正在下载更新.."; + } } - - return FeiShuUpdateTopBar( - text: text, - ); + return UpdateTopBar(text: text); } Widget buildButtons(UpdateState state) { if (state is ShouldUpdateState) { + if(state.progress>0){ + // 下载中 + return Row( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // widget.onBackHide?.call(); + Navigator.of(context).pop(); + // UpdateCubit.isShowDialog = false; + }, + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), + height: 50, + child: Text( + '后台执行', + style: TextStyle( + color: Theme.of(context).primaryColor, fontSize: 16), + ), + ), + )), + ], + ); + } return Row( children: [ Expanded( @@ -184,9 +211,11 @@ class _FeiShuUpdateDialogState extends State { decoration: BoxDecoration( border: Border( top: BorderSide( - color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio), + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), right: BorderSide( - color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), alignment: Alignment.center, height: 50, child: Text( @@ -199,48 +228,24 @@ class _FeiShuUpdateDialogState extends State { Expanded( child: GestureDetector( behavior: HitTestBehavior.opaque, - onTap: (){ + onTap: () { widget.onConfirm?.call(); }, child: Container( decoration: BoxDecoration( border: Border( top: BorderSide( - color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio), + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio), right: BorderSide( - color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), + color: Colors.grey.withAlpha(88), + width: 1 / window.devicePixelRatio))), alignment: Alignment.center, height: 50, child: Text( '立即升级', - style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 16), - ), - ), - )), - ], - ); - } - if (state is DownloadingState) { - return Row( - children: [ - Expanded( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - // widget.onBackHide?.call(); - Navigator.of(context).pop(); - // UpdateCubit.isShowDialog = false; - }, - child: Container( - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: Colors.grey.withAlpha(88), width: 1 / window.devicePixelRatio))), - height: 50, - child: Text( - '后台执行', - style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 16), + style: TextStyle( + color: Theme.of(context).primaryColor, fontSize: 16), ), ), )), diff --git a/modules/basic_system/app_update/lib/views/update_red_point.dart b/modules/basic_system/app_update/lib/views/update_red_point.dart index 64d28965..607b7df1 100644 --- a/modules/basic_system/app_update/lib/views/update_red_point.dart +++ b/modules/basic_system/app_update/lib/views/update_red_point.dart @@ -7,7 +7,7 @@ import '../bloc/state.dart'; class UpdateRedPoint extends StatelessWidget { - const UpdateRedPoint({Key? key}) : super(key: key); + const UpdateRedPoint({super.key}); @override Widget build(BuildContext context) { diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 8798d106..5d10b963 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -6,15 +6,15 @@ publish_to: none environment: sdk: ">=3.5.0 <4.0.0" flutter: ">=1.17.0" + resolution: workspace + dependencies: flutter: sdk: flutter flutter_bloc: ^8.1.6 # 状态管理 dio: ^5.7.0 - convert: ^3.1.2 - equatable: ^2.0.5 # 相等辅助 shared_preferences: ^2.2.3 # xml 固化 r_upgrade: ^0.4.2 # 应用升级 @@ -22,11 +22,14 @@ dependencies: url_launcher: ^6.3.0 # url package_info_plus: ^8.0.0 path_provider: ^2.1.5 + fx_dio: ^0.0.3 + utils: path: ../utils app: path: ../app + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/modules/basic_system/app_update/test/app_update_test.dart b/modules/basic_system/app_update/test/app_update_test.dart index e68d1c97..41b0517b 100644 --- a/modules/basic_system/app_update/test/app_update_test.dart +++ b/modules/basic_system/app_update/test/app_update_test.dart @@ -1,12 +1,15 @@ -// import 'package:flutter_test/flutter_test.dart'; -// -// import 'package:app_update/app_update.dart'; -// -// void main() { -// test('adds one to input values', () { -// final calculator = Calculator(); -// expect(calculator.addOne(2), 3); -// expect(calculator.addOne(-7), -6); -// expect(calculator.addOne(0), 1); -// }); -// } +import 'package:app/app.dart'; +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void main() async { + FxDio().register(const UnitHost()); + + Host host = FxDio()(); + String path = UnitApi.appInfo.path; + ApiRet info = await host.get(path, queryParameters: { + 'app_id': 1, + 'os': kAppEnv.os.name, + }, convertor: (dynamic data) => AppInfo.fromMap(data['data'])); + print(info.data); +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart index d94bc90f..c53ba0ed 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -96,7 +96,7 @@ class _ColumnizePageViewState extends State { _position = index; }, ); - if(!isDesk){ + if(!kIsDesk){ return child; } diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart index f2e51774..155a5696 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/sliver_article.dart @@ -47,7 +47,7 @@ class SliverArticle extends StatelessWidget { crossAxisSpacing: 8, ); - Widget child = isDesk + Widget child = kIsDesk ? SliverGrid( delegate: SliverChildBuilderDelegate( _buildItem, diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 79392b23..34808eb5 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -26,7 +26,7 @@ class WidgetsBloc extends Bloc { /// 切换页签,以 [family] 为过滤项 void _onEventTabTap(EventTabTap event, Emitter emit) async { emit(const WidgetsLoading(operate: LoadOperate.load)); - int size = isDesk ? 1000 : 20; + int size = kIsDesk ? 1000 : 20; WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size); try { final List widgets = await repository.searchWidgets(filter); diff --git a/modules/widget_system/widget_module/lib/event/widget_event.dart b/modules/widget_system/widget_module/lib/event/widget_event.dart new file mode 100644 index 00000000..0a38e6e5 --- /dev/null +++ b/modules/widget_system/widget_module/lib/event/widget_event.dart @@ -0,0 +1,16 @@ +import 'package:fx_trace/fx_trace.dart'; + +import '../widget_module.dart'; + +class SelectWidgetEvent extends FxEvent { + final String name; + final int? id; + final WidgetModel? model; + + + SelectWidgetEvent({ + required this.name, + this.id, + this.model, + }); +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart b/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart index b080b5ac..77d7097a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/desk_ui.dart @@ -1,3 +1,5 @@ export 'widget_detail/widget_detail_page.dart'; export 'category_panel/desk_category_page.dart'; -export 'widget_panel/widget_panel.dart'; \ No newline at end of file +export 'widget_panel/widget_panel.dart'; +export 'widget_panel/desk_search_bar.dart'; +export 'widget_panel/desk_search_bar_v2.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart index 0af02889..f41f2f1a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar.dart @@ -114,7 +114,6 @@ class _DeskSearchBarState extends State { color: Colors.grey, ), focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.all(Radius.circular(8)), ), diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart new file mode 100644 index 00000000..d8126f28 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart @@ -0,0 +1,184 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:l10n/l10n.dart'; +import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/event/widget_event.dart'; +import 'package:widget_repository/widget_repository.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:fx_trace/fx_trace.dart'; +class GlobalFindDialog extends StatefulWidget { + final ValueChanged? onChanged; + + const GlobalFindDialog({Key? key, this.onChanged}) : super(key: key); + + @override + State createState() => _GlobalFindDialogState(); +} + +class _GlobalFindDialogState extends State { + late TextEditingController _controller =TextEditingController(); + // final PopoverController controller = PopoverController(); + + @override + void initState() { + _focusNode.addListener(_onFocusChange); + + super.initState(); + } + @override + void dispose() { + super.dispose(); + _focusNode.removeListener(_onFocusChange); + } + void _onFocusChange() { + // if (_focusNode.hasFocus) { + // controller.open(); + // } else { + // controller.close(); + // } + } + @override + Widget build(BuildContext context) { + return Dialog( + surfaceTintColor: Colors.transparent, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + child: SizedBox( + width: 400, + height: 400, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + SizedBox(height:32,child: _buildFieldView()), + Expanded(child: _buildOptionsView()), + ], + ), + ), + )); + ; + } + + void onSelected(WidgetModel model) { + final FocusScopeNode focusScope = FocusScope.of(context); + if (focusScope.hasFocus) { + focusScope.unfocus(); + } + _controller.clear(); + Navigator.of(context).pop(); + FxEmitter().emit(SelectWidgetEvent(name: model.name)); + } + + Iterable options = []; + + void searchByArgs(String text) async{ + WidgetRepository repository = context.read().repository; + options = await repository.searchWidgets(WidgetFilter( + name: text + )); + setState(() { + + }); + } + + Widget _buildOptionsView() { + return Align( + alignment: Alignment.topLeft, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: 400), + child:ListView.builder( + itemCount: options.length , + padding: EdgeInsets.symmetric(vertical: 10), + itemBuilder: (_,index) { + WidgetModel model = options.elementAt(index); + return InkWell( + onTap: ()=>onSelected(model), + child: Ink( + padding: EdgeInsets.symmetric(vertical: 6, horizontal: 15), + child: Row(children: [ + Expanded(child: Text.rich(formSpan(model.name,_controller.text),maxLines:1, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 12))), + // Spacer(), + const SizedBox(width: 10,), + Text(model.nameCN,style: TextStyle(fontSize: 12),), + ],), + ), + ); + }), + ), + ); + } + final FocusNode _focusNode = FocusNode(); + FocusNode get focusNode => _focusNode; + + Widget _buildFieldView() { + bool isDark = Theme.of(context).brightness == Brightness.dark; + + return TextField( + autofocus: true, + controller: _controller, + onChanged: (value){ + searchByArgs(value); + }, + style: const TextStyle(fontSize: 12), + maxLines: 1, + + focusNode: focusNode, + decoration: InputDecoration( + prefixIconConstraints: BoxConstraints( + minWidth: 30, + ), + filled: true, + hoverColor: Colors.transparent, + contentPadding: EdgeInsets.only(top: 0), + fillColor: isDark?null:Color(0xffF1F2F3), + prefixIcon: Icon( + Icons.search, + size: 18, + color: Colors.grey, + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Theme.of(context).primaryColor), + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + + enabledBorder : OutlineInputBorder( + + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(8)), + ), + hintText: '搜索', + hintStyle: TextStyle(fontSize: 12, color: Colors.grey)), + ); + + } + + final TextStyle lightTextStyle = const TextStyle( + color: Colors.red, + fontSize: 12, + fontWeight: FontWeight.bold, + ); + + InlineSpan formSpan(String src, String pattern) { + bool isDark = Theme.of(context).brightness == Brightness.dark; + Color? textColor = Theme.of(context).listTileTheme.textColor; + + List span = []; + RegExp regExp = RegExp(RegExp.escape(pattern), caseSensitive: false); + src.splitMapJoin(regExp, onMatch: (Match match) { + span.add(TextSpan(text: match.group(0), style: lightTextStyle)); + return ''; + }, onNonMatch: (str) { + span.add(TextSpan( + text: str, + style: lightTextStyle.copyWith(color: isDark?textColor:const Color(0xff2F3032),fontSize: 12))); + return ''; + }); + return TextSpan(children: span); + } + +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index fc5c5ebf..2733c5aa 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -4,8 +4,9 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:widget_module/event/widget_event.dart'; import 'package:widget_repository/widget_repository.dart'; - +import 'package:fx_trace/fx_trace.dart'; import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; @@ -58,6 +59,8 @@ class _DeskWidgetPanelState extends State{ WidgetFamily widgetFamily = WidgetFamily.values[index]; BlocProvider.of(context).add(EventTabTap(widgetFamily)); } + + } class WidgetList extends StatelessWidget { diff --git a/modules/widget_system/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart index 6b58ec71..c00ce4b5 100644 --- a/modules/widget_system/widget_module/lib/widget_module.dart +++ b/modules/widget_system/widget_module/lib/widget_module.dart @@ -3,6 +3,7 @@ library widget_module; export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; export 'views/widgets_bloc_provider.dart'; +export 'event/widget_event.dart'; export 'package:widget_repository/widget_repository.dart' show WidgetFilter, diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart index 451e24c7..5347b35b 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart @@ -1,10 +1,7 @@ - import 'package:fx_dao/fx_dao.dart'; import '../../../widget_repository.dart'; - - //""" // CREATE TABLE IF NOT EXISTS category_widget( // id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -18,86 +15,81 @@ import '../../../widget_repository.dart'; // ); //"""; -class CategoryDao with HasDatabase, DbTable{ +class CategoryDao with HasDatabase, DbTable { @override String get createSql => ''; @override String get name => 'category'; - - Future insert(CategoryPo category) async { - //插入方法 String addSql = //插入数据 "INSERT INTO " "category(id,name,color,info,priority,image,created,updated) " "VALUES (?,?,?,?,?,?,?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ - category.id, - category.name, - category.color, - category.info, - category.priority, - category.image, - category.created?.toIso8601String(), - category.updated.toIso8601String(), - ])); + return await database + .transaction((tran) async => await tran.rawInsert(addSql, [ + category.id, + category.name, + category.color, + category.info, + category.priority, + category.image, + category.created?.toIso8601String(), + category.updated.toIso8601String(), + ])); } Future update(CategoryPo widget) async { - //插入方法 String updateSql = //插入数据 "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " "WHERE id = ?"; - return await database.transaction((tran) async => - await tran.rawUpdate(updateSql, [ - widget.name, - widget.color, - widget.info, - widget.priority, - widget.image, - widget.updated.toIso8601String(), - widget.id, - ])); + return await database + .transaction((tran) async => await tran.rawUpdate(updateSql, [ + widget.name, + widget.color, + widget.info, + widget.priority, + widget.image, + widget.updated.toIso8601String(), + widget.id, + ])); } - - - Future addWidget(int categoryId,int widgetId,) async { - String addSql = //插入数据 - "INSERT INTO " + Future addWidget( + int categoryId, + int widgetId, + ) async { + String addSql = "INSERT INTO " "category_widget(widgetId,categoryId) " "VALUES (?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ - widgetId, - categoryId, - ])); + return await database + .transaction((tran) async => await tran.rawInsert(addSql, [ + widgetId, + categoryId, + ])); } - Future addWidgets(int categoryId,List widgetIds) async { - String addSql = //插入数据 - "INSERT INTO " + Future addWidgets(int categoryId, List widgetIds) async { + String addSql = "INSERT INTO " "category_widget(widgetId,categoryId) VALUES "; - String args = ''; - - for(int i=0;i< widgetIds.length;i++){ - args+= "(${widgetIds[i]},$categoryId)"; - if(i==widgetIds.length-1){ - args+=";"; - }else{ - args+=","; + for (int i = 0; i < widgetIds.length; i++) { + args += "(${widgetIds[i]},$categoryId)"; + if (i == widgetIds.length - 1) { + args += ";"; + } else { + args += ","; } } addSql += args; - return await database.transaction((tran) async => await tran.rawInsert(addSql)); + return await database + .transaction((tran) async => await tran.rawInsert(addSql)); } Future existByName(String name) async { - String sql = //插入数据 - "SELECT COUNT(name) as count FROM category " + String sql = "SELECT COUNT(name) as count FROM category " "WHERE name = ?"; List> rawData = await database.rawQuery(sql, [name]); if (rawData.isNotEmpty) { @@ -109,10 +101,10 @@ class CategoryDao with HasDatabase, DbTable{ Future>> queryAll() async { List> data = await database.rawQuery( "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" - "FROM category AS c " - "LEFT JOIN category_widget AS cw " - "ON c.id = cw.categoryId GROUP BY c.id " - "ORDER BY priority DESC,created DESC", + "FROM category AS c " + "LEFT JOIN category_widget AS cw " + "ON c.id = cw.categoryId GROUP BY c.id " + "ORDER BY priority DESC,created DESC", []); return data; } @@ -120,50 +112,44 @@ class CategoryDao with HasDatabase, DbTable{ Future> categoryWidgetIds(int id) async { List> data = await database.rawQuery( "SELECT categoryId FROM `category_widget`" - "WHERE widgetId = ?", + "WHERE widgetId = ?", [id]); - return data.toList().map((e)=>e["categoryId"]).toList(); + return data.toList().map((e) => e["categoryId"]).toList(); } - - Future deleteCollect(int id) async { await database.execute( "DELETE FROM category_widget " - "WHERE categoryId = ?", + "WHERE categoryId = ?", [id]); return await database.execute( "DELETE FROM category " - "WHERE id = ?", + "WHERE id = ?", [id]); } Future clear() async { - await database.execute( - "DELETE FROM category_widget " - "WHERE categoryId >0"); - return await database.execute( - "DELETE FROM category " - "WHERE id > 0"); + await database.execute("DELETE FROM category_widget " + "WHERE categoryId >0"); + return await database.execute("DELETE FROM category " + "WHERE id > 0"); } Future removeWidget(int categoryId, int widgetId) async { - //插入方法 - String deleteSql = //插入数据 - "DELETE FROM " + String deleteSql = "DELETE FROM " "category_widget WHERE categoryId = ? AND widgetId = ? "; return await database .transaction((tran) async => await tran.rawInsert(deleteSql, [ - categoryId, - widgetId, - ])); + categoryId, + widgetId, + ])); } Future existWidgetInCollect(int categoryId, int widgetId) async { - String sql = //插入数据 - "SELECT COUNT(id) as count FROM category_widget " + String sql = "SELECT COUNT(id) as count FROM category_widget " "WHERE categoryId = ? AND widgetId = ?"; - List> rawData = await database.rawQuery(sql, [categoryId, widgetId]); + List> rawData = + await database.rawQuery(sql, [categoryId, widgetId]); if (rawData.isNotEmpty) { return rawData[0]['count'] > 0; } @@ -172,7 +158,6 @@ class CategoryDao with HasDatabase, DbTable{ Future toggleCollect(int categoryId, int widgetId) async { if (await existWidgetInCollect(categoryId, widgetId)) { - //已存在: 移除 await removeWidget(categoryId, widgetId); } else { await addWidget(categoryId, widgetId); @@ -183,22 +168,22 @@ class CategoryDao with HasDatabase, DbTable{ await toggleCollect(1, widgetId); } - Future>> loadCollectWidgets(int categoryId) async{ - String querySql = //插入数据 + Future>> loadCollectWidgets(int categoryId) async { + String querySql = "SELECT * FROM widget " "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - return await database.rawQuery(querySql,[categoryId]); + return await database.rawQuery(querySql, [categoryId]); } - Future> loadCollectWidgetIds(int categoryId) async{ - String querySql = //插入数据 + Future> loadCollectWidgetIds(int categoryId) async { + String querySql = "SELECT id FROM widget " "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - var data = await database.rawQuery(querySql,[categoryId]); + var data = await database.rawQuery(querySql, [categoryId]); return data.map((e) => e["id"] as int).toList(); } } diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart index 92ca842c..02b48903 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart @@ -1,7 +1,6 @@ import 'package:fx_dao/fx_dao.dart'; -import 'package:sqflite/sqflite.dart'; -class LikeDao with HasDatabase, DbTable{ +class LikeDao with HasDatabase, DbTable { @override String get createSql => ''; @@ -64,6 +63,4 @@ class LikeDao with HasDatabase, DbTable{ } return false; } - - } diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart index a8f6c2e8..4a23d5fe 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -2,9 +2,7 @@ import 'package:fx_dao/fx_dao.dart'; import '../po/node_po.dart'; - class NodeDao with HasDatabase, DbTable { - @override String get createSql => ''; @@ -12,12 +10,11 @@ class NodeDao with HasDatabase, DbTable { String get name => 'node'; Future insert(NodePo widget) async { - //插入方法 - String addSql = //插入数据 - "INSERT INTO " + String addSql = "INSERT INTO " "node(widgetId,name,priority,subtitle,code) " "VALUES (?,?,?,?,?);"; - return await database.transaction((tran) async => await tran.rawInsert(addSql, [ + return await database.transaction((tran) async => await tran.rawInsert( + addSql, [ widget.widgetId, widget.name, widget.priority, @@ -26,9 +23,8 @@ class NodeDao with HasDatabase, DbTable { ])); } - Future>> queryAll() async { - return await database.rawQuery("SELECT * FROM node"); - } + Future>> queryAll() async => + database.rawQuery("SELECT * FROM node"); //根据 id 查询组件 node Future>> queryById(int id) async { diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart index fc5b8755..456c216d 100644 --- a/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/category_db_repository.dart @@ -4,19 +4,14 @@ import 'dart:convert'; import 'package:storage/storage.dart'; import 'package:widget_repository/widget_repository.dart'; -import '../../repository/category_repository.dart'; -import '../dao/category_dao.dart'; - /// create by 张风捷特烈 on 2020-04-21 /// contact me by email 1981462002@qq.com /// 说明: class CategoryDbRepository implements CategoryRepository { - CategoryDao get categoryDao => AppStorage().flutter(); - LikeDao get likeDao => AppStorage().flutter(); - // CategoryDbRepository({required this.categoryDao,required this.likeDao}); + LikeDao get likeDao => AppStorage().flutter(); @override Future addCategory(CategoryPo categoryPo) async { @@ -79,10 +74,7 @@ class CategoryDbRepository implements CategoryRepository { for (int i = 0; i < data.length; i++) { List ids = await categoryDao.loadCollectWidgetIds(data[i]['id']); - collects.add(CategoryTo( - widgetIds: ids, - model: CategoryPo.fromJson(data[i]))); - + collects.add(CategoryTo(widgetIds: ids, model: CategoryPo.fromJson(data[i]))); if (i == data.length - 1) { completer.complete(collects); } @@ -92,7 +84,7 @@ class CategoryDbRepository implements CategoryRepository { } @override - Future syncCategoryByData(String data,String likeData) async { + Future syncCategoryByData(String data, String likeData) async { try { await categoryDao.clear(); List dataMap = json.decode(data); @@ -100,11 +92,12 @@ class CategoryDbRepository implements CategoryRepository { CategoryPo po = CategoryPo.fromNetJson(dataMap[i]["model"]); List widgetIds = dataMap[i]["widgetIds"]; await addCategory(po); - if (widgetIds.isNotEmpty&&po.id!=null) { + if (widgetIds.isNotEmpty && po.id != null) { await categoryDao.addWidgets(po.id!, widgetIds); } } - List likeWidgets = (json.decode(likeData) as List).map((e) => e).toList(); + List likeWidgets = + (json.decode(likeData) as List).map((e) => e).toList(); for (int i = 0; i < likeWidgets.length; i++) { await likeDao.like(likeWidgets[i]); } diff --git a/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart index 6046d5d8..0a017711 100644 --- a/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart +++ b/modules/widget_system/widget_repository/lib/src/database/po/category_po.dart @@ -1,19 +1,20 @@ + /// create by 张风捷特烈 on 2020-04-17 /// contact me by email 1981462002@qq.com /// 说明: 收藏夹数据库-数据模型 - -// """ -// CREATE TABLE IF NOT EXISTS category( -// id INTEGER PRIMARY KEY AUTOINCREMENT, -// name VARCHAR(64) NOT NULL, -// color VARCHAR(9) DEFAULT '#FF2196F3', -// info VARCHAR(256) DEFAULT '这里什么都没有...', -// created DATETIME NOT NULL, -// updated DATETIME NOT NULL, -// priority INTEGER DEFAULT 0, -// image VARCHAR(128) NULL image DEFAULT '' -// );"""; //建表语句 - +/// +/// """ +/// CREATE TABLE IF NOT EXISTS category( +/// id INTEGER PRIMARY KEY AUTOINCREMENT, +/// name VARCHAR(64) NOT NULL, +/// color VARCHAR(9) DEFAULT '#FF2196F3', +/// info VARCHAR(256) DEFAULT '这里什么都没有...', +/// created DATETIME NOT NULL, +/// updated DATETIME NOT NULL, +/// priority INTEGER DEFAULT 0, +/// image VARCHAR(128) NULL image DEFAULT '' +/// );"""; //建表语句 +/// class CategoryPo { final int? id; final String name; diff --git a/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart index 752a0a36..c90072f1 100644 --- a/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart +++ b/modules/widget_system/widget_repository/lib/src/database/po/widget_po.dart @@ -2,7 +2,7 @@ /// create by 张风捷特烈 on 2020-03-04 /// contact me by email 1981462002@qq.com /// 说明: 组件信息-数据库-数据模型 - +/// class WidgetPo { final int id; final String name; diff --git a/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart index e0fdbb04..8e6bef6b 100644 --- a/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart @@ -1,6 +1,5 @@ import '../model/model.dart'; -import '../model/widget_filter.dart'; /// create by 张风捷特烈 on 2020-03-03 /// contact me by email 1981462002@qq.com @@ -8,7 +7,6 @@ import '../model/widget_filter.dart'; abstract class WidgetRepository { // Future> loadWidgets(WidgetFamily family); - /// Future> loadWidget(List ids); Future queryWidgetByName(String? name); diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart index f5506892..da663acc 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/node2.dart @@ -1,31 +1,30 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'package:flutter/material.dart'; -class FocusDemo2 extends StatelessWidget { - const FocusDemo2({super.key}); +/// Flutter code sample for [Focus]. + +void main() => runApp(const FocusExampleApp()); + +class FocusExampleApp extends StatelessWidget { + const FocusExampleApp({super.key}); @override Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 24), - height: 56, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemBuilder: (_, int index) => _FocusTiled( - 'Item $index', - autofocus: index == 0, - ), - itemCount: 50, - ), + return const MaterialApp( + home: FocusDemo2(), ); } } class _FocusTiled extends StatelessWidget { const _FocusTiled( - this.data, { - super.key, - required this.autofocus, - }); + this.data, { + super.key, + required this.autofocus, + }); final String data; final bool autofocus; @@ -53,4 +52,24 @@ class _FocusTiled extends StatelessWidget { ), ); } -} \ No newline at end of file +} + +class FocusDemo2 extends StatelessWidget { + const FocusDemo2({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 24), + height: 56, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemBuilder: (_, int index) => _FocusTiled( + 'Item $index', + autofocus: index == 0, + ), + itemCount: 50, + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 1a32fa21..86ee3890 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -301,6 +301,14 @@ packages: url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+1" + fx_trace: + dependency: "direct main" + description: + name: fx_trace + sha256: bba16febf583d4464cd5cae11bd19d441c82d9ca6a7d9bb71c05cae7379a619a + url: "https://pub.flutter-io.cn/" + source: hosted + version: "0.0.3" go_router: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5840ab7a..20127368 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,7 @@ dependencies: fx_dao: 0.0.1+2 # 数据库 fx_dio: 0.0.3 fx_boot_starter: 0.1.1 # app 启动器 + fx_trace: 0.0.3 # 异常追踪/监听 # 数据与持久化 dio: ^5.4.3+1 # 网络请求 diff --git a/test/app_update_test.dart b/test/app_update_test.dart new file mode 100644 index 00000000..0833cb4f --- /dev/null +++ b/test/app_update_test.dart @@ -0,0 +1,11 @@ +import 'package:app/app.dart'; +import 'package:app_update/app_update.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void main() async { + FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); + + UpgradeApi api = UnitUpgradeApi(); + ApiRet info = await api.fetch(1); + print(info.data); +} From b753fc217a3dacd4e89a5afac3de2ed9cdadacca Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 1 Jan 2025 11:09:59 +0800 Subject: [PATCH 120/149] app upgrade --- .../view/mobile/unit_navigation.dart | 12 +- lib/src/starter/fx_application.dart | 2 +- .../app/lib/app/router/app_route.dart | 2 +- .../app/lib/app/theme/app_theme.dart | 18 +- .../http/flutter_unit/api/upgrade_api.dart | 8 +- .../app/lib/http/science/science_host.dart | 4 +- .../app_update/lib/bloc/bloc.dart | 12 +- .../app_update/lib/bloc/event.dart | 12 +- .../lib/repository/api/upgrade_api.dart | 2 +- .../lib/views/app_update_panel.dart | 6 +- .../project_ui/default/empty_search_page.dart | 6 +- .../lib/project_ui/default/error_page.dart | 1 - modules/basic_system/l10n/lib/arb/app_en.arb | 2 + modules/basic_system/l10n/lib/arb/app_zh.arb | 2 + modules/basic_system/l10n/lib/ext.dart | 4 +- .../l10n/lib/gen_l10n/app_localizations.dart | 12 ++ .../lib/gen_l10n/app_localizations_en.dart | 6 + .../lib/gen_l10n/app_localizations_zh.dart | 6 + .../lib/src/gallery_card_item.dart | 4 +- .../lib/src/view/mobile/mobile_tool_page.dart | 19 ++ .../treasure_tools/lib/treasure_tools.dart | 1 + .../views/mobile/search_page/search_page.dart | 169 ------------------ .../search_page/standard_search_bar.dart | 3 +- .../search_page/standard_search_page.dart | 7 +- pubspec.yaml | 2 +- test/app_update_test.dart | 2 +- 26 files changed, 117 insertions(+), 207 deletions(-) create mode 100644 modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart delete mode 100644 modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 5f757cfc..ad4bcec9 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -9,7 +9,7 @@ import 'package:draw_system/draw_system.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/src/navigation/model/app_tab.dart'; - +import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; @@ -38,7 +38,9 @@ class _UnitPhoneNavigationState extends State { void initState() { super.initState(); if (Platform.isAndroid || Platform.isIOS) {} - context.read().add(const CheckUpdate(appId: 1)); + String locale = + context.read().state.language.locale.toString(); + context.read().add(CheckUpdate(appId: 1, locale: locale)); } @override @@ -61,7 +63,7 @@ class _UnitPhoneNavigationState extends State { StandardHomePage(), GalleryUnit(), AlgoScope(child: ArtifactPage()), - CollectPageAdapter(), + MobileToolPage(), UserPage(), ], ), @@ -71,7 +73,6 @@ class _UnitPhoneNavigationState extends State { bool get isDark => Theme.of(context).brightness == Brightness.dark; - // 由于 bottomNavigationBar 颜色需要随 点击头部栏 状态而改变, // 使用 BlocBuilder 构建 Widget _buildBottomNav(BuildContext context) { @@ -80,7 +81,8 @@ class _UnitPhoneNavigationState extends State { ValueListenableBuilder( valueListenable: _activeTab, builder: (_, value, __) => PureBottomBar( - onTap: _onTapBottomNav, activeTab: value, + onTap: _onTapBottomNav, + activeTab: value, )), const Positioned(right: 22, top: 8, child: UpdateRedPoint()) ], diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 2d664604..234f2f64 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -35,7 +35,7 @@ class FxApplication with FxStarter { @override void onStartSuccess(BuildContext context, AppConfig state) { - context.read().add(const CheckUpdate(appId: 1)); + context.read().add(CheckUpdate(appId: 1,locale: state.language.locale.toString())); context.go(AppRoute.widget.url); } diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart index db486dd7..7e0762b7 100644 --- a/modules/basic_system/app/lib/app/router/app_route.dart +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -27,7 +27,7 @@ enum AppRoute { codeStyle('code_style', url: '/setting/code_style'), themeColor('theme_color', url: '/setting/theme_color'), fontSetting('font_setting', url: '/setting/font_setting'), - version('version', url: '/setting/version'), + version('version', url: '/settings/version'), ; final String path; diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index b68d6db4..a61794e9 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -66,8 +66,12 @@ ThemeData lightTheme(AppConfig state) { statusBarIconBrightness: Brightness.dark, ); + String fontFamily = state.fontFamily; + if (kAppEnv.isWindows) { + fontFamily = '宋体'; + } return ThemeData( - fontFamily: '宋体', + fontFamily: fontFamily, primaryColor: state.themeColor.color, scaffoldBackgroundColor: const Color(0xffF3F4F6), useMaterial3: true, @@ -96,6 +100,9 @@ ThemeData lightTheme(AppConfig state) { }), tabBarTheme: TabBarTheme( dividerColor: Colors.transparent, + // labelStyle: TextStyle(fontFamily: fontFamily), + // unselectedLabelStyle: TextStyle(fontFamily: fontFamily), + splashFactory: NoSplash.splashFactory, overlayColor: WidgetStateProperty.resolveWith( (Set states) { @@ -112,10 +119,11 @@ ThemeData lightTheme(AppConfig state) { elevation: 0, centerTitle: true, backgroundColor: Colors.white, - titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black, - fontFamily: '宋体', - + titleTextStyle: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + fontFamily: fontFamily, ), ), ); diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart index ddbeed39..8d80b3b0 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -5,12 +5,16 @@ import 'package:app/app.dart'; class UnitUpgradeApi implements UpgradeApi { @override - Future> fetch(int appId) async { + Future> fetch(int appId,String locale) async { Host host = FxDio()(); String path = ScienceApi.appVersion.path; return host.get( path, - queryParameters: {'app_id': 1, 'os': kAppEnv.os.name}, + queryParameters: { + 'app_id': 1, + 'os': kAppEnv.os.name, + 'locale': locale, + }, convertor: AppInfo.fromMap, ); } diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart index 32fa5bb6..aa622d4a 100644 --- a/modules/basic_system/app/lib/http/science/science_host.dart +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -5,7 +5,7 @@ class ScienceHost extends Host { @override Map get value => { - HostEnv.release: 'api.toly1994.com', + HostEnv.release: 'toly1994.com', HostEnv.dev: '192.168.109.244', }; @@ -17,7 +17,7 @@ class ScienceHost extends Host { ); @override - HostEnv get env => HostEnv.dev; + HostEnv get env => HostEnv.release; } enum ScienceApi { diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index 63d12629..0eb04d78 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -22,11 +22,12 @@ class UpgradeBloc extends Bloc { UpgradeBloc({required this.api}) : super(const NoUpdateState()) { on(_onCheckUpdate); on(_onDownloadEvent); + on(_onProgressChangeEvent); } void _onCheckUpdate(CheckUpdate event, Emitter emit) async { emit(const CheckLoadingState()); - ApiRet ret = await api.fetch(event.appId); + ApiRet ret = await api.fetch(event.appId,event.locale); if (ret.failed) { emit(UpdateErrorState(error: ret.msg)); return; @@ -46,8 +47,9 @@ class UpgradeBloc extends Bloc { if (curState is! ShouldUpdateState) return; void onProgressChange(double progress) { - emit(curState.copyWith(progress: progress)); + add(ProgressChangeEvent(progress: progress)); } + onProgressChange(0.001); String url = event.appInfo.url; @@ -86,4 +88,10 @@ class UpgradeBloc extends Bloc { callback(progress); }); } + + FutureOr _onProgressChangeEvent(ProgressChangeEvent event, Emitter emit) async{ + UpdateState curState = state; + if (curState is! ShouldUpdateState) return; + emit(curState.copyWith(progress: event.progress)); + } } diff --git a/modules/basic_system/app_update/lib/bloc/event.dart b/modules/basic_system/app_update/lib/bloc/event.dart index e892c839..f1fcfdae 100644 --- a/modules/basic_system/app_update/lib/bloc/event.dart +++ b/modules/basic_system/app_update/lib/bloc/event.dart @@ -9,8 +9,9 @@ sealed class UpdateEvent extends Equatable { // 检查更新 ---> 校验,转换状态 class CheckUpdate extends UpdateEvent { final int appId; + final String locale; - const CheckUpdate({required this.appId}); + const CheckUpdate({required this.appId,required this.locale, }); @override List get props => [appId]; @@ -24,3 +25,12 @@ class DownloadEvent extends UpdateEvent { @override List get props => [appInfo]; } + +class ProgressChangeEvent extends UpdateEvent { + final double progress; + + const ProgressChangeEvent({required this.progress}); + + @override + List get props => [progress]; +} diff --git a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart index 3c2d6cfd..683c1264 100644 --- a/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart +++ b/modules/basic_system/app_update/lib/repository/api/upgrade_api.dart @@ -8,5 +8,5 @@ typedef OnProgressChange = void Function(double progress); abstract class UpgradeApi with CheckUpgrade {} mixin CheckUpgrade { - Future> fetch(int appId); + Future> fetch(int appId,String locale); } diff --git a/modules/basic_system/app_update/lib/views/app_update_panel.dart b/modules/basic_system/app_update/lib/views/app_update_panel.dart index 764aa23c..32e0741f 100644 --- a/modules/basic_system/app_update/lib/views/app_update_panel.dart +++ b/modules/basic_system/app_update/lib/views/app_update_panel.dart @@ -1,9 +1,6 @@ -import 'dart:io'; - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:r_upgrade/r_upgrade.dart'; import 'package:utils/utils.dart'; import 'package:l10n/l10n.dart'; @@ -99,7 +96,8 @@ class AppUpdatePanel extends StatelessWidget { void _tapByState(UpdateState state, BuildContext context) { if (state is NoUpdateState) { - context.read().add(const CheckUpdate(appId: 1)); + String locale = Localizations.localeOf(context).toString(); + context.read().add( CheckUpdate(appId: 1,locale: locale)); } if (state is ShouldUpdateState) { diff --git a/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart b/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart index f003dfe9..de90b8d7 100644 --- a/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart +++ b/modules/basic_system/components/lib/project_ui/default/empty_search_page.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; class NotSearchPage extends StatelessWidget { - - const NotSearchPage({Key? key}):super(key: key); + final String tips; + const NotSearchPage({Key? key, required this.tips}):super(key: key); @override Widget build(BuildContext context) { @@ -18,7 +18,7 @@ class NotSearchPage extends StatelessWidget { Container( padding: const EdgeInsets.only(top: 16.0), child: Text( - "哥们,搜点啥...≧◔◡◔≦", + tips, style: TextStyle( fontSize: 20, color: color, diff --git a/modules/basic_system/components/lib/project_ui/default/error_page.dart b/modules/basic_system/components/lib/project_ui/default/error_page.dart index 49c2b002..ceaa6213 100644 --- a/modules/basic_system/components/lib/project_ui/default/error_page.dart +++ b/modules/basic_system/components/lib/project_ui/default/error_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; - class ErrorPage extends StatelessWidget { const ErrorPage({Key? key}):super(key: key); diff --git a/modules/basic_system/l10n/lib/arb/app_en.arb b/modules/basic_system/l10n/lib/arb/app_en.arb index 4ed8fe51..63d25fa6 100644 --- a/modules/basic_system/l10n/lib/arb/app_en.arb +++ b/modules/basic_system/l10n/lib/arb/app_en.arb @@ -193,5 +193,7 @@ "my":"My", "picture":"pics", "widgetInn":"Widget Collection", + "emptySearch":"No Result \n(≡ _ ≡)/~┴┴", + "searchSomething":"Search Something ≧◔◡◔≦", "slogan":"The unity of flutter, The unity of coder." } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_zh.arb b/modules/basic_system/l10n/lib/arb/app_zh.arb index 7116962e..1569b6a4 100644 --- a/modules/basic_system/l10n/lib/arb/app_zh.arb +++ b/modules/basic_system/l10n/lib/arb/app_zh.arb @@ -194,5 +194,7 @@ "my":"我的", "picture":"幅", "widgetInn":"组件酒肆", + "emptySearch":"没数据,哥也没办法\n(≡ _ ≡)/~┴┴", + "searchSomething":"哥们,搜点啥...≧◔◡◔≦", "slogan":"Flutter 的联合,编程者的联合" } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/ext.dart b/modules/basic_system/l10n/lib/ext.dart index e65fed43..86cc2fba 100644 --- a/modules/basic_system/l10n/lib/ext.dart +++ b/modules/basic_system/l10n/lib/ext.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'gen_l10n/app_localizations.dart'; - +export 'gen_l10n/app_localizations.dart' show AppLocalizations; const l10nDelegates = AppLocalizations.localizationsDelegates; const l10nLocales = AppLocalizations.supportedLocales; extension AppLocalizationsX on BuildContext { - AppLocalizations get l10n => AppLocalizations.of(this)!; + AppLocalizations get l10n => AppLocalizations.of(this); } diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart index 36e9ea81..f9a128a2 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart @@ -1181,6 +1181,18 @@ abstract class AppLocalizations { /// **'组件酒肆'** String get widgetInn; + /// No description provided for @emptySearch. + /// + /// In zh, this message translates to: + /// **'没数据,哥也没办法\n(≡ _ ≡)/~┴┴'** + String get emptySearch; + + /// No description provided for @searchSomething. + /// + /// In zh, this message translates to: + /// **'哥们,搜点啥...≧◔◡◔≦'** + String get searchSomething; + /// No description provided for @slogan. /// /// In zh, this message translates to: diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart index f43fece8..f665029d 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_en.dart @@ -549,6 +549,12 @@ class AppLocalizationsEn extends AppLocalizations { @override String get widgetInn => 'Widget Collection'; + @override + String get emptySearch => 'No Result \n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => 'Search Something ≧◔◡◔≦'; + @override String get slogan => 'The unity of flutter, The unity of coder.'; } diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart index f2f8a20b..eb94d85f 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_zh.dart @@ -549,6 +549,12 @@ class AppLocalizationsZh extends AppLocalizations { @override String get widgetInn => '组件酒肆'; + @override + String get emptySearch => '没数据,哥也没办法\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '哥们,搜点啥...≧◔◡◔≦'; + @override String get slogan => 'Flutter 的联合,编程者的联合'; } diff --git a/modules/painting_system/draw_system/lib/src/gallery_card_item.dart b/modules/painting_system/draw_system/lib/src/gallery_card_item.dart index f91e7052..9bded395 100644 --- a/modules/painting_system/draw_system/lib/src/gallery_card_item.dart +++ b/modules/painting_system/draw_system/lib/src/gallery_card_item.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:toly_ui/toly_ui.dart'; - +import 'package:l10n/l10n.dart'; import 'gallery_factory.dart'; @@ -72,7 +72,7 @@ class GalleryCardItem extends StatelessWidget { padding: const EdgeInsets.only(left: 6, right: 6, top: 2, bottom: 3), child: Text( - "$count 幅", + "$count ${context.l10n.picture}", style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.white, diff --git a/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart b/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart new file mode 100644 index 00000000..f7ab0049 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/view/mobile/mobile_tool_page.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:l10n/l10n.dart'; +class MobileToolPage extends StatelessWidget { + const MobileToolPage({super.key}); + + @override + Widget build(BuildContext context) { + AppLocalizations l10n = context.l10n; + String title = l10n.treasureTools; + String building = l10n.knowledgeConstruction; + return Scaffold( + appBar: AppBar(title: Text(title),), + body: Center( + child: Text(building), + ), + ); + } +} + diff --git a/modules/tools_system/treasure_tools/lib/treasure_tools.dart b/modules/tools_system/treasure_tools/lib/treasure_tools.dart index 20382c4a..c61f6a34 100644 --- a/modules/tools_system/treasure_tools/lib/treasure_tools.dart +++ b/modules/tools_system/treasure_tools/lib/treasure_tools.dart @@ -1,3 +1,4 @@ library treasure_tools; export 'src/code_gen_page.dart'; +export 'src/view/mobile/mobile_tool_page.dart'; \ No newline at end of file diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart deleted file mode 100644 index bcf16ae5..00000000 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/search_page.dart +++ /dev/null @@ -1,169 +0,0 @@ -// import 'package:app/app.dart'; -// import 'package:components/components.dart'; -// import 'package:flutter/material.dart'; -// import 'package:flutter_bloc/flutter_bloc.dart'; -// -// // import 'package:old_fancy_mobile_ui/old_fancy_mobile_ui.dart'; -// import 'package:widget_module/blocs/blocs.dart'; -// -// import 'package:widget_repository/widget_repository.dart'; -// import 'app_search_bar.dart'; -// -// -// // SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc -// // 不必单独提供 SearchBloc 增加复杂性 -// class SearchPageProvider extends StatelessWidget { -// const SearchPageProvider({Key? key}) : super(key: key); -// -// @override -// Widget build(BuildContext context) { -// return BlocProvider( -// lazy: false, -// create: (BuildContext context) => WidgetsBloc( -// repository: BlocProvider.of(context).repository, -// ), -// child: const SearchPage(), -// ); -// } -// } -// -// class SearchPage extends StatefulWidget { -// const SearchPage({Key? key}) : super(key: key); -// -// @override -// _SearchPageState createState() => _SearchPageState(); -// } -// -// class _SearchPageState extends State { -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// body: CustomScrollView( -// slivers: [ -// _buildSliverAppBar(), -// SliverToBoxAdapter(child: _buildStarFilter()), -// BlocBuilder(builder: _buildBodyByState) -// ], -// ), -// ); -// } -// -// Widget _buildSliverAppBar() { -// return const SliverAppBar( -// pinned: true, -// title: AppSearchBar(), -// actions: [ -// Padding( -// padding: EdgeInsets.only(right: 15.0), -// child: Icon(TolyIcon.icon_sound), -// ) -// ], -// ); -// } -// -// Widget _buildStarFilter() => Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Padding( -// padding: const EdgeInsets.only(top: 10.0, left: 20, bottom: 5), -// child: Wrap( -// spacing: 5, -// crossAxisAlignment: WrapCrossAlignment.center, -// children: [ -// const Circle( -// radius: 5, -// color: Colors.orange, -// ), -// Text( -// '星级查询', -// style: TextStyle( -// color: Theme.of(context).primaryColor, -// fontWeight: FontWeight.bold), -// ), -// ], -// ), -// ), -// MultiChipFilter( -// data: const [1, 2, 3, 4, 5], -// avatarBuilder: (_, index) => -// CircleAvatar(child: Text((index + 1).toString())), -// labelBuilder: (_, selected) => Icon( -// Icons.star, -// color: selected ? Colors.blue : Colors.grey, -// size: 18, -// ), -// onChange: _doSelectStart, -// ), -// const Divider(), -// const SizedBox( -// height: 10, -// ) -// ], -// ); -// -// Widget _buildBodyByState(BuildContext context, WidgetsState state) { -// Widget noSearchArg = const SliverToBoxAdapter(child: NotSearchPage()); -// if (state.filter.name.isEmpty) { -// return noSearchArg; -// } -// -// if (state is WidgetsLoading) { -// return const SliverToBoxAdapter(child: LoadingShower()); -// } -// -// if (state is WidgetsLoadFailed) { -// return const SliverToBoxAdapter(child: ErrorPage()); -// } -// -// if (state is WidgetsLoaded) { -// if (state.widgets.isEmpty) { -// return const SliverToBoxAdapter( -// child: EmptyShower( -// message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", -// ), -// ); -// } -// return _buildSliverList(state.widgets); -// } -// return const SliverToBoxAdapter(child: NotSearchPage()); -// } -// -// Widget _buildSliverList(List models) => SliverList( -// delegate: SliverChildBuilderDelegate( -// (_, int index) => Padding( -// padding: const EdgeInsets.only( -// bottom: 10, top: 2, left: 10, right: 10), -// child: InkWell( -// customBorder: HomeItemSupport.shapeBorderMap[index], -// onTap: () => _toDetailPage(models[index]), -// child: TechnoWidgetListItem( -// data: models[index], -// ))), -// childCount: models.length), -// ); -// -// void _doSelectStart(List select) { -// List temp = select.map((e) => e + 1).toList(); -// if (temp.length < 5) { -// temp.addAll(List.generate(5 - temp.length, (e) => -1)); -// } -// WidgetsBloc widgetsBloc = BlocProvider.of(context); -// final WidgetFilter filter = widgetsBloc.state.filter.copyWith( -// stars: temp, -// ); -// widgetsBloc.add( -// EventSearchWidget(filter: filter), -// ); -// } -// -// void _toDetailPage(WidgetModel model) { -// //收起键盘 -// final FocusScopeNode focusScope = FocusScope.of(context); -// if (focusScope.hasFocus) { -// focusScope.unfocus(); -// } -// BlocProvider.of(context).queryDetail(model); -// Navigator.pushNamed(context, UnitRouter.widget_detail,arguments: model); -// } -// } -// diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart index 3e91374f..0db7d89a 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_bar.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:l10n/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; @@ -68,7 +69,7 @@ class StandardSearchBarInner extends StatelessWidget borderRadius: BorderRadius.all(Radius.circular(8)), ), - hintText: "搜索组件", + hintText:context.l10n.searchWidget, hintStyle: TextStyle(fontSize: 14)), ), )), diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart index e3f58222..1ff58e30 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -5,6 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; +import 'package:l10n/l10n.dart'; import 'package:widget_repository/widget_repository.dart'; import '../widget_page/widget_model_item.dart'; @@ -52,15 +53,15 @@ class StandardSearchPage extends StatelessWidget { } Widget _buildBodyByState(BuildContext context, WidgetsState state) { - Widget noSearchArg = const NotSearchPage(); + Widget noSearchArg = NotSearchPage(tips: context.l10n.searchSomething,); if (state.filter.name.isEmpty) { return noSearchArg; } if (state is WidgetsLoaded) { if (state.widgets.isEmpty) { - return const EmptyShower( - message: "没数据,哥也没办法\n(≡ _ ≡)/~┴┴", + return EmptyShower( + message: context.l10n.emptySearch, ); } return ListView.builder( diff --git a/pubspec.yaml b/pubspec.yaml index 20127368..d527d10e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -90,7 +90,7 @@ flutter: assets: - assets/images/ - assets/data/ - - assets/data/web/ +# - assets/data/web/ - assets/images/head_icon/ - assets/images/widgets/ - assets/flutter.db diff --git a/test/app_update_test.dart b/test/app_update_test.dart index 0833cb4f..235abe89 100644 --- a/test/app_update_test.dart +++ b/test/app_update_test.dart @@ -6,6 +6,6 @@ void main() async { FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); UpgradeApi api = UnitUpgradeApi(); - ApiRet info = await api.fetch(1); + ApiRet info = await api.fetch(1,'zh'); print(info.data); } From 37793e797d6598e2352fba2cb691503d52f7fea9 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 1 Jan 2025 16:34:44 +0800 Subject: [PATCH 121/149] app upgrade --- .../app_update/lib/bloc/bloc.dart | 26 +++++++++++++++++++ pubspec.yaml | 2 +- test/size.dart | 14 ++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test/size.dart diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index 0eb04d78..b07d5356 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -70,10 +70,36 @@ class UpgradeBloc extends Bloc { onReceiveProgress: (c, t) => callback(c / t), ); if (rep.statusCode == 200) { + if(kAppEnv.isMacOS){ + await addQuarantineAttribute(filePath); + } await OpenFile.open(filePath); } } + Future addQuarantineAttribute(String filePath) async { + try { + // 检查文件是否存在 + if (!await File(filePath).exists()) { + throw Exception('File not found: $filePath'); + } + + // 添加 com.apple.quarantine 属性 + final result = await Process.run( + 'xattr', + ['-w', 'com.apple.quarantine', '0083;602b8b1a;Chrome;', filePath], + ); + + if (result.exitCode == 0) { + print('Successfully added quarantine attribute to $filePath'); + } else { + print('Error adding quarantine attribute: ${result.stderr}'); + } + } catch (e) { + print('Exception: $e'); + } + } + late int? id; StreamSubscription? subscription; diff --git a/pubspec.yaml b/pubspec.yaml index d527d10e..78ffb45d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.0.9 +version: 3.1.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts diff --git a/test/size.dart b/test/size.dart new file mode 100644 index 00000000..d942eabe --- /dev/null +++ b/test/size.dart @@ -0,0 +1,14 @@ +import 'dart:io'; +import 'package:path/path.dart' as p; +void main() async{ + Directory directory=Directory(r'D:\Projects\Flutter\Github\FlutterUnit\build_tools\output'); + List files = directory.listSync(); + Map map = {}; + for(FileSystemEntity file in files){ + if(file is File){ + map[p.basename(file.path)] = file.statSync().size; + } + } + + print(map); +} From 1fffef42a168fe6e60c6e7c61afeecf6ead3785c Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 1 Jan 2025 16:54:41 +0800 Subject: [PATCH 122/149] app upgrade --- .../app_update/lib/bloc/bloc.dart | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index b07d5356..473ae886 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -10,6 +10,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:r_upgrade/r_upgrade.dart'; import 'package:fx_dio/fx_dio.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../repository/model/app_info.dart'; import 'event.dart'; @@ -61,6 +62,10 @@ class UpgradeBloc extends Bloc { } void handleDesk(String url, OnProgressChange callback) async { + if(kAppEnv.isMacOS){ + launchUrl(Uri.parse(url)); + return; + } Dio dio = Dio(); Directory dir = await getTemporaryDirectory(); String filePath = p.join(dir.path, p.basename(url)); @@ -70,35 +75,10 @@ class UpgradeBloc extends Bloc { onReceiveProgress: (c, t) => callback(c / t), ); if (rep.statusCode == 200) { - if(kAppEnv.isMacOS){ - await addQuarantineAttribute(filePath); - } await OpenFile.open(filePath); } } - Future addQuarantineAttribute(String filePath) async { - try { - // 检查文件是否存在 - if (!await File(filePath).exists()) { - throw Exception('File not found: $filePath'); - } - - // 添加 com.apple.quarantine 属性 - final result = await Process.run( - 'xattr', - ['-w', 'com.apple.quarantine', '0083;602b8b1a;Chrome;', filePath], - ); - - if (result.exitCode == 0) { - print('Successfully added quarantine attribute to $filePath'); - } else { - print('Error adding quarantine attribute: ${result.stderr}'); - } - } catch (e) { - print('Exception: $e'); - } - } late int? id; StreamSubscription? subscription; From 7ad3431c8fcc32769efa85176497a0bbca998b00 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 1 Jan 2025 16:58:02 +0800 Subject: [PATCH 123/149] app upgrade --- modules/basic_system/app_update/lib/bloc/bloc.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index 473ae886..a83fc373 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -46,6 +46,12 @@ class UpgradeBloc extends Bloc { void _onDownloadEvent(DownloadEvent event, Emitter emit) async { UpdateState curState = state; if (curState is! ShouldUpdateState) return; + String url = event.appInfo.url; + + if(kAppEnv.isMacOS){ + launchUrl(Uri.parse(url)); + return; + } void onProgressChange(double progress) { add(ProgressChangeEvent(progress: progress)); @@ -53,7 +59,6 @@ class UpgradeBloc extends Bloc { onProgressChange(0.001); - String url = event.appInfo.url; if (kIsDesk) { handleDesk(url, onProgressChange); return; @@ -62,10 +67,6 @@ class UpgradeBloc extends Bloc { } void handleDesk(String url, OnProgressChange callback) async { - if(kAppEnv.isMacOS){ - launchUrl(Uri.parse(url)); - return; - } Dio dio = Dio(); Directory dir = await getTemporaryDirectory(); String filePath = p.join(dir.path, p.basename(url)); From 9641cdb76b16dd657042134dede491121410ae01 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 23 Jan 2025 09:38:46 +0800 Subject: [PATCH 124/149] update Flutter SDK: 3.24.x -> 3.27.3 --- .gitignore | 1 + lib/src/flutter_unit.dart | 1 - lib/src/starter/fx_application.dart | 8 +- linux/flutter/generated_plugin_registrant.cc | 8 +- linux/flutter/generated_plugins.cmake | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 8 +- .../lib/flutter_ui/toly_date_picker.dart | 2 +- .../node_display/code_display.dart | 2 +- .../toly_date_picker.dart | 2 +- pubspec.lock | 666 ++++++++++-------- pubspec.yaml | 4 +- .../flutter/generated_plugin_registrant.cc | 6 +- windows/flutter/generated_plugins.cmake | 2 +- 13 files changed, 395 insertions(+), 317 deletions(-) diff --git a/.gitignore b/.gitignore index cf3dd2c0..732e6a8c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ /build_tools /libs /pubspec_overrides.yaml +modules/game_system \ No newline at end of file diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 0fbe58a0..25429c7f 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -9,7 +9,6 @@ import 'package:l10n/l10n.dart'; import 'package:widget_module/widget_module.dart'; import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:app_update/app_update.dart'; import 'l10n/gen/app_l10n.dart'; import 'navigation/router/app_route.dart'; diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 234f2f64..2cdd5449 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -26,7 +26,9 @@ class FxApplication with FxStarter { void onLoaded(BuildContext context, int cost, AppConfig state) { debugPrint("App启动耗时:$cost ms"); context.read().init(state); - context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); + context + .read() + .add(const EventTabTap(WidgetFamily.statelessWidget)); if (!kAppEnv.isWeb) { context.read().add(const EventLoadLikeData()); context.read().add(const EventLoadCategory()); @@ -35,7 +37,9 @@ class FxApplication with FxStarter { @override void onStartSuccess(BuildContext context, AppConfig state) { - context.read().add(CheckUpdate(appId: 1,locale: state.language.locale.toString())); + context + .read() + .add(CheckUpdate(appId: 1, locale: state.language.locale.toString())); context.go(AppRoute.widget.url); } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 4554882f..eda95fde 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,7 +7,7 @@ #include "generated_plugin_registrant.h" #include -#include +#include #include #include @@ -15,9 +15,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) open_file_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); - g_autoptr(FlPluginRegistrar) screen_retriever_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); - screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 740cb314..712d4590 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,7 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST open_file_linux - screen_retriever + screen_retriever_linux url_launcher_linux window_manager ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index b698ecb9..9556a44b 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,11 +9,12 @@ import connectivity_plus import open_file_mac import package_info_plus import path_provider_foundation -import screen_retriever +import screen_retriever_macos import share_plus import shared_preferences_foundation -import sqflite +import sqflite_darwin import url_launcher_macos +import webview_flutter_wkwebview import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -21,10 +22,11 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart b/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart index 58cd66f3..7d7bc385 100644 --- a/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart +++ b/modules/basic_system/components/lib/flutter_ui/toly_date_picker.dart @@ -1387,7 +1387,7 @@ class _DateRangePickerDialogState extends State with Rest cancelText: widget.cancelText ?? localizations.cancelButtonLabel, helpText: widget.helpText ?? localizations.dateRangePickerHelpText, ); - final DialogTheme dialogTheme = Theme.of(context).dialogTheme; + final DialogThemeData dialogTheme = Theme.of(context).dialogTheme; size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); shape = dialogTheme.shape; diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart index c7da0f9b..d72b69ed 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/node_display/code_display.dart @@ -7,7 +7,7 @@ import 'package:flutter/services.dart'; import 'package:share_plus/share_plus.dart'; import 'package:toly_ui/code/code.dart'; import 'package:toly_ui/toly_ui.dart'; -import 'package:tolyui/tolyui.dart'; +import 'package:tolyui/tolyui.dart' hide TolyCollapse,CollapseController; // import 'package:flutter_highlight/flutter_highlight.dart'; import 'collapse.dart'; diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart index e304e801..0ca4acc6 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/toly_date_picker.dart @@ -1387,7 +1387,7 @@ class _DateRangePickerDialogState extends State with Rest cancelText: widget.cancelText ?? localizations.cancelButtonLabel, helpText: widget.helpText ?? localizations.dateRangePickerHelpText, ); - final DialogTheme dialogTheme = Theme.of(context).dialogTheme; + final DialogThemeData dialogTheme = Theme.of(context).dialogTheme; size = orientation == Orientation.portrait ? _inputPortraitDialogSize : _inputRangeLandscapeDialogSize; insetPadding = const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0); shape = dialogTheme.shape; diff --git a/pubspec.lock b/pubspec.lock index 86ee3890..ca67bc7d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,39 +6,39 @@ packages: description: name: archive sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.6.1" args: dependency: transitive description: name: args - sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" - url: "https://pub.flutter-io.cn/" + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev/" source: hosted - version: "2.5.0" + version: "2.6.0" async: dependency: transitive description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.11.0" bloc: dependency: transitive description: name: bloc - sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" - url: "https://pub.flutter-io.cn/" + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev/" source: hosted - version: "8.1.2" + version: "8.1.4" boolean_selector: dependency: transitive description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.1" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" clock: @@ -54,31 +54,31 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.flutter-io.cn/" + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev/" source: hosted - version: "1.18.0" + version: "1.19.0" connectivity_plus: dependency: "direct main" description: name: connectivity_plus - sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" - url: "https://pub.flutter-io.cn/" + sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" + url: "https://pub.dev/" source: hosted - version: "6.0.5" + version: "6.1.2" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.1" convert: @@ -86,7 +86,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.2" cross_file: @@ -94,55 +94,55 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.flutter-io.cn/" + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev/" source: hosted - version: "3.0.3" + version: "3.0.6" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be - url: "https://pub.flutter-io.cn/" + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev/" source: hosted - version: "1.0.5" + version: "1.0.8" dash_painter: dependency: "direct main" description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.flutter-io.cn/" + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev/" source: hosted - version: "0.7.8" + version: "0.7.11" dev_build: dependency: transitive description: name: dev_build - sha256: f526d1fbe68875f6119ffc333f114dfe6aa93ad04439276d53968f7977cc410e - url: "https://pub.flutter-io.cn/" + sha256: "933f14357d4e58da298ce2395e8271728dd90e8760e1c7677ca1d5fa065f2b4a" + url: "https://pub.dev/" source: hosted - version: "1.0.0+11" + version: "1.1.1+7" dio: dependency: "direct main" description: name: dio sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.7.0" dio_web_adapter: @@ -150,23 +150,23 @@ packages: description: name: dio_web_adapter sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.0" equatable: dependency: "direct main" description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.flutter-io.cn/" + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.dev/" source: hosted - version: "2.0.5" + version: "2.0.7" fake_async: dependency: transitive description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.1" ffi: @@ -174,25 +174,33 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.3" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.flutter-io.cn/" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev/" source: hosted - version: "6.1.4" + version: "7.0.1" file_picker: dependency: "direct main" description: name: file_picker - sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" - url: "https://pub.flutter-io.cn/" + sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 + url: "https://pub.dev/" source: hosted - version: "8.1.2" + version: "8.1.7" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev/" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -203,7 +211,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.6" flutter_lints: @@ -211,7 +219,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" flutter_localizations: @@ -223,24 +231,24 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "85cc6f7daeae537844c92e2d56e2aff61b00095f8f77913b529ea4be12fc45ea" - url: "https://pub.flutter-io.cn/" + sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 + url: "https://pub.dev/" source: hosted - version: "0.7.2+1" + version: "0.7.5" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e - url: "https://pub.flutter-io.cn/" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" + url: "https://pub.dev/" source: hosted - version: "2.0.20" + version: "2.0.24" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.2.1" flutter_star: @@ -248,7 +256,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.0" flutter_test: @@ -266,7 +274,7 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.1.1" fx_dao: @@ -274,7 +282,7 @@ packages: description: name: fx_dao sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1+2" fx_dio: @@ -282,103 +290,111 @@ packages: description: name: fx_dio sha256: c2a525ff6a8a70d9f39e26d335fac0eff1a605749b80affa50f9e2155288859f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" fx_go_router_ext: dependency: "direct main" description: name: fx_go_router_ext - sha256: a82d719d6f2026eaff97e466c7f8c34d75a55a58cfce469807df8a2211d91652 - url: "https://pub.flutter-io.cn/" + sha256: "4eee6121b0c10ed9cf77ceafd8cca024cfaaf1777deb61fe8936ac7a7173961b" + url: "https://pub.dev/" source: hosted - version: "0.0.3" + version: "0.0.5" fx_platform_adapter: dependency: "direct main" description: name: fx_platform_adapter - sha256: da5920bc99ef7f732d04742c2556702376e717bb0c0b8daa56840127d133c206 - url: "https://pub.flutter-io.cn/" + sha256: "229d966a6b90f6ddb96913426c5d9f14552a17dbdd8747d23ce08065db94498b" + url: "https://pub.dev/" source: hosted - version: "0.0.2+1" + version: "0.0.2+2" fx_trace: dependency: "direct main" description: name: fx_trace sha256: bba16febf583d4464cd5cae11bd19d441c82d9ca6a7d9bb71c05cae7379a619a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" go_router: dependency: "direct main" description: name: go_router - sha256: "2ddb88e9ad56ae15ee144ed10e33886777eb5ca2509a914850a5faa7b52ff459" - url: "https://pub.flutter-io.cn/" + sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" + url: "https://pub.dev/" source: hosted - version: "14.2.7" + version: "14.6.3" http: dependency: transitive description: name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 - url: "https://pub.flutter-io.cn/" + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev/" source: hosted - version: "1.2.2" + version: "1.3.0" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.flutter-io.cn/" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev/" source: hosted - version: "4.0.2" + version: "4.1.2" image: dependency: "direct main" description: name: image - sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" - url: "https://pub.flutter-io.cn/" + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev/" source: hosted - version: "4.2.0" + version: "4.3.0" intl: dependency: transitive description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.19.0" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev/" + source: hosted + version: "4.9.0" jwt_decoder: dependency: "direct main" description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.1" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" - url: "https://pub.flutter-io.cn/" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev/" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" - url: "https://pub.flutter-io.cn/" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev/" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.1" lints: @@ -386,31 +402,31 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.flutter-io.cn/" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev/" source: hosted - version: "1.2.0" + version: "1.3.0" markdown: dependency: transitive description: name: markdown - sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 - url: "https://pub.flutter-io.cn/" + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + url: "https://pub.dev/" source: hosted - version: "7.2.2" + version: "7.3.0" matcher: dependency: transitive description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.12.16+1" material_color_utilities: @@ -418,7 +434,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.11.1" meta: @@ -426,23 +442,23 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.15.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.flutter-io.cn/" + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev/" source: hosted - version: "1.0.4" + version: "2.0.0" nested: dependency: transitive description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" nm: @@ -450,23 +466,23 @@ packages: description: name: nm sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.5.0" open_file: dependency: transitive description: name: open_file - sha256: "737641e823d568a12b63494855010ceef286bcdf8f88d0a831e53229a5e850e8" - url: "https://pub.flutter-io.cn/" + sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e + url: "https://pub.dev/" source: hosted - version: "3.5.9" + version: "3.5.10" open_file_android: dependency: transitive description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.6" open_file_ios: @@ -474,7 +490,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_linux: @@ -482,23 +498,23 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.5" open_file_mac: dependency: transitive description: name: open_file_mac - sha256: dd1570bd12601b4d50fda3609c1662382f17ee403b47f0d74d737de603a39ec6 - url: "https://pub.flutter-io.cn/" + sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" + url: "https://pub.dev/" source: hosted - version: "1.0.2" + version: "1.0.3" open_file_platform_interface: dependency: transitive description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_web: @@ -506,7 +522,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.4" open_file_windows: @@ -514,31 +530,31 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" package_info_plus: dependency: transitive description: name: package_info_plus - sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 - url: "https://pub.flutter-io.cn/" + sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + url: "https://pub.dev/" source: hosted - version: "8.0.2" + version: "8.1.3" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 - url: "https://pub.flutter-io.cn/" + sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + url: "https://pub.dev/" source: hosted - version: "3.0.1" + version: "3.0.2" path: dependency: transitive description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.9.0" path_provider: @@ -546,71 +562,71 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a - url: "https://pub.flutter-io.cn/" + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev/" source: hosted - version: "2.2.12" + version: "2.2.15" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 - url: "https://pub.flutter-io.cn/" + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev/" source: hosted - version: "2.4.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" - url: "https://pub.flutter-io.cn/" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev/" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" - url: "https://pub.flutter-io.cn/" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev/" source: hosted - version: "2.2.1" + version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 - url: "https://pub.flutter-io.cn/" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev/" source: hosted - version: "5.4.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.flutter-io.cn/" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev/" source: hosted - version: "3.1.0" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.8" pool: @@ -618,47 +634,39 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.5.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.flutter-io.cn/" - source: hosted - version: "4.2.4" process_run: dependency: transitive description: name: process_run - sha256: "112a77da35be50617ed9e2230df68d0817972f225e7f97ce8336f76b4e601606" - url: "https://pub.flutter-io.cn/" + sha256: a68fa9727392edad97a2a96a77ce8b0c17d28336ba1b284b1dfac9595a4299ea + url: "https://pub.dev/" source: hosted - version: "1.2.0" + version: "1.2.2+1" provider: dependency: transitive description: name: provider - sha256: e1e7413d70444ea3096815a60fe5da1b11bda8a9dc4769252cc82c53536f8bcc - url: "https://pub.flutter-io.cn/" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev/" source: hosted - version: "6.0.4" + version: "6.1.2" pub_semver: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.flutter-io.cn/" + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + url: "https://pub.dev/" source: hosted - version: "2.1.4" + version: "2.1.5" r_upgrade: dependency: transitive description: name: r_upgrade sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.2" refresh: @@ -666,382 +674,446 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" screen_retriever: dependency: transitive description: name: screen_retriever - sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" - url: "https://pub.flutter-io.cn/" + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev/" source: hosted - version: "0.1.9" + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev/" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev/" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev/" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev/" + source: hosted + version: "0.2.0" share_plus: dependency: "direct main" description: name: share_plus - sha256: "38658034f9f3c29f3b37ab0068db15caea9df2dd70d83e99300991a0d756c2a6" - url: "https://pub.flutter-io.cn/" + sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da + url: "https://pub.dev/" source: hosted - version: "10.0.1" + version: "10.1.4" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" - url: "https://pub.flutter-io.cn/" + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b + url: "https://pub.dev/" source: hosted - version: "5.0.0" + version: "5.0.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 - url: "https://pub.flutter-io.cn/" + sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a + url: "https://pub.dev/" source: hosted - version: "2.2.3" + version: "2.3.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" - url: "https://pub.flutter-io.cn/" + sha256: "138b7bbbc7f59c56236e426c37afb8f78cbc57b094ac64c440e0bb90e380a4f5" + url: "https://pub.dev/" source: hosted - version: "2.2.1" + version: "2.4.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" - url: "https://pub.flutter-io.cn/" + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev/" source: hosted - version: "2.4.0" + version: "2.5.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a - url: "https://pub.flutter-io.cn/" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev/" source: hosted - version: "2.3.1" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a - url: "https://pub.flutter-io.cn/" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev/" source: hosted - version: "2.3.1" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf - url: "https://pub.flutter-io.cn/" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev/" source: hosted - version: "2.2.1" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f - url: "https://pub.flutter-io.cn/" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev/" source: hosted - version: "2.3.1" + version: "2.4.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev/" + source: hosted + version: "7.0.0" sqflite: dependency: transitive description: name: sqflite - sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d - url: "https://pub.flutter-io.cn/" + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" + url: "https://pub.dev/" + source: hosted + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev/" source: hosted - version: "2.3.3+1" + version: "2.4.0" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" - url: "https://pub.flutter-io.cn/" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" + url: "https://pub.dev/" source: hosted - version: "2.5.4" + version: "2.5.4+6" sqflite_common_ffi: dependency: transitive description: name: sqflite_common_ffi - sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" - url: "https://pub.flutter-io.cn/" + sha256: "883dd810b2b49e6e8c3b980df1829ef550a94e3f87deab5d864917d27ca6bf36" + url: "https://pub.dev/" source: hosted - version: "2.3.3" + version: "2.3.4+4" sqflite_common_ffi_web: dependency: transitive description: name: sqflite_common_ffi_web - sha256: "5178ccee7a65f4737ff29d5a0fced0122805e4127589faee01c36a1b42c27383" - url: "https://pub.flutter-io.cn/" + sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" + url: "https://pub.dev/" source: hosted - version: "0.4.5+1" + version: "0.4.5+4" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" + url: "https://pub.dev/" + source: hosted + version: "2.4.1+1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev/" + source: hosted + version: "2.4.0" sqlite3: dependency: transitive description: name: sqlite3 - sha256: "45f168ae2213201b54e09429ed0c593dc2c88c924a1488d6f9c523a255d567cb" - url: "https://pub.flutter-io.cn/" + sha256: "35d3726fe18ab1463403a5cc8d97dbc81f2a0b08082e8173851363fcc97b6627" + url: "https://pub.dev/" source: hosted - version: "2.4.6" + version: "2.7.2" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.flutter-io.cn/" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev/" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.flutter-io.cn/" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev/" source: hosted - version: "1.2.0" + version: "1.3.0" synchronized: dependency: transitive description: name: synchronized - sha256: "7b530acd9cb7c71b0019a1e7fa22c4105e675557a4400b6a401c71c5e0ade1ac" - url: "https://pub.flutter-io.cn/" + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + url: "https://pub.dev/" source: hosted - version: "3.0.0+3" + version: "3.3.0+3" term_glyph: dependency: transitive description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" - url: "https://pub.flutter-io.cn/" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev/" source: hosted - version: "0.7.2" + version: "0.7.3" toggle_rotate: dependency: "direct main" description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" tolyui: dependency: "direct main" description: name: tolyui - sha256: bbe7335016275812ba28120ee5115a6c4ad15a1b17ebb21c6e3ebd8b364bcb50 - url: "https://pub.flutter-io.cn/" + sha256: "103a1d4b9994d4c7b2db93aada29d647a84328f1aada28412ad5609575e0c28b" + url: "https://pub.dev/" source: hosted - version: "0.0.2+19" + version: "0.0.4" tolyui_color: dependency: transitive description: name: tolyui_color sha256: "410c378344d47a5f170e70a78cc1ac6a4f2665ea40f02c9aaa67da4072fde0e1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" tolyui_feedback: dependency: transitive description: name: tolyui_feedback - sha256: "0d76846141e3ea0d2172d87508f7f6a98a79204611aa0d2519eb5c064d905bf1" - url: "https://pub.flutter-io.cn/" + sha256: "1a35f0c874d8ffd5a700a661ff60c4f818dec7c1c7b7e7f281a495905c838117" + url: "https://pub.dev/" source: hosted - version: "0.3.4+7" + version: "0.3.5" tolyui_message: dependency: transitive description: name: tolyui_message sha256: "4e9046d65d1a5f98f0ebd423815be683c7fbf637caa9e0bf88d83148b42764cb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.2" tolyui_navigation: dependency: transitive description: name: tolyui_navigation - sha256: b18ba71e890313ad0494c3a77754f8df36224dc6201a050bbb14764d22e5c6f4 - url: "https://pub.flutter-io.cn/" + sha256: b7f10c7efc41228be3c3c2aed8fd64e80eeee0e7426e0d5af8b54d04a4243058 + url: "https://pub.dev/" source: hosted - version: "0.0.8+9" + version: "0.1.0" tolyui_rx_layout: dependency: transitive description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.flutter-io.cn/" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev/" source: hosted - version: "1.3.1" + version: "1.4.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" - url: "https://pub.flutter-io.cn/" + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev/" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf - url: "https://pub.flutter-io.cn/" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + url: "https://pub.dev/" source: hosted - version: "6.3.3" + version: "6.3.14" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" - url: "https://pub.flutter-io.cn/" + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + url: "https://pub.dev/" source: hosted - version: "6.3.0" + version: "6.3.2" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 - url: "https://pub.flutter-io.cn/" + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev/" source: hosted - version: "3.1.1" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" - url: "https://pub.flutter-io.cn/" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + url: "https://pub.dev/" source: hosted - version: "3.2.0" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" - url: "https://pub.flutter-io.cn/" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + url: "https://pub.dev/" source: hosted - version: "2.3.3" + version: "2.4.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" - url: "https://pub.flutter-io.cn/" + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev/" source: hosted - version: "3.1.2" + version: "3.1.4" uuid: dependency: transitive description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" - url: "https://pub.flutter-io.cn/" + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev/" source: hosted - version: "3.0.7" + version: "4.5.1" vector_math: dependency: transitive description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" - url: "https://pub.flutter-io.cn/" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev/" source: hosted - version: "14.2.5" + version: "14.3.0" web: dependency: transitive description: name: web sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" webview_flutter: dependency: "direct main" description: name: webview_flutter - sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" - url: "https://pub.flutter-io.cn/" + sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + url: "https://pub.dev/" source: hosted - version: "4.8.0" + version: "4.10.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc - url: "https://pub.flutter-io.cn/" + sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59" + url: "https://pub.dev/" source: hosted - version: "3.16.4" + version: "4.3.1" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" - url: "https://pub.flutter-io.cn/" + sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" + url: "https://pub.dev/" source: hosted - version: "3.13.1" + version: "3.17.0" widget_repository: dependency: transitive description: @@ -1053,50 +1125,50 @@ packages: dependency: transitive description: name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 - url: "https://pub.flutter-io.cn/" + sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" + url: "https://pub.dev/" source: hosted - version: "5.5.1" + version: "5.10.0" window_manager: dependency: transitive description: name: window_manager - sha256: ab8b2a7f97543d3db2b506c9d875e637149d48ee0c6a5cb5f5fd6e0dac463792 - url: "https://pub.flutter-io.cn/" + sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" + url: "https://pub.dev/" source: hosted - version: "0.4.2" + version: "0.4.3" wrapper: dependency: "direct main" description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f" - url: "https://pub.flutter-io.cn/" + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev/" source: hosted - version: "0.2.0+2" + version: "1.1.0" xml: dependency: transitive description: name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" - url: "https://pub.flutter-io.cn/" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev/" source: hosted - version: "6.3.0" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.flutter-io.cn/" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev/" source: hosted - version: "3.1.2" + version: "3.1.3" sdks: - dart: ">=3.5.0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 78ffb45d..a3a7af86 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,7 +43,7 @@ dependencies: ## fx 架构 fx_platform_adapter: ^0.0.2+1 # 平台适配器 - fx_go_router_ext: 0.0.3 # 路由 + fx_go_router_ext: 0.0.5 # 路由 fx_dao: 0.0.1+2 # 数据库 fx_dio: 0.0.3 fx_boot_starter: 0.1.1 # app 启动器 @@ -63,7 +63,7 @@ dependencies: share_plus: ^10.0.1 # 文字分享 # 视图展示 - tolyui: 0.0.2+19 # tolyui + tolyui: 0.0.4 # tolyui refresh: ^1.0.1 # 下拉刷新 dash_painter: ^1.0.2 # 虚线 flutter_star: ^1.0.2 # 星星组件 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 6e00ae0c..6ce2ee62 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,7 +7,7 @@ #include "generated_plugin_registrant.h" #include -#include +#include #include #include #include @@ -15,8 +15,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); - ScreenRetrieverPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 1610a5e5..710ab798 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,7 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST connectivity_plus - screen_retriever + screen_retriever_windows share_plus url_launcher_windows window_manager From d174b621729ccd478a2cb940ef5fa455241d3e14 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 23 Jan 2025 09:38:50 +0800 Subject: [PATCH 125/149] update Flutter SDK: 3.24.x -> 3.27.3 --- README-EN.md | 8 ++++---- README.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README-EN.md b/README-EN.md index 1684651a..228cc638 100644 --- a/README-EN.md +++ b/README-EN.md @@ -34,10 +34,10 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the #### Flutter Version ``` -Flutter 3.24.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 2663184aa7 (3 months ago) • 2024-09-11 16:27:48 -0500 -Engine • revision 36335019a8 -Tools • Dart 3.5.3 • DevTools 2.37.3 +Flutter 3.27.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision c519ee916e (31 hours ago) • 2025-01-21 10:32:23 -0800 +Engine • revision e672b006cb +Tools • Dart 3.6.1 • DevTools 2.40.2 ``` #### Build Application diff --git a/README.md b/README.md index 0e7dd361..863974bb 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,10 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut ``` ·]>> flutter --version -Flutter 3.24.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 2663184aa7 (3 months ago) • 2024-09-11 16:27:48 -0500 -Engine • revision 36335019a8 -Tools • Dart 3.5.3 • DevTools 2.37.3 +Flutter 3.27.3 • channel stable • https://github.com/flutter/flutter.git +Framework • revision c519ee916e (31 hours ago) • 2025-01-21 10:32:23 -0800 +Engine • revision e672b006cb +Tools • Dart 3.6.1 • DevTools 2.40.2 ``` #### 构建应用 From 40c41979b61f1cac4d0b7898f9893b8e0b605dce Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 26 Jan 2025 10:52:45 +0800 Subject: [PATCH 126/149] feature: widget logo --- assets/images/widgets/Card.svg | 10 +++ assets/images/widgets/Container.svg | 19 ++++ assets/images/widgets/Container.webp | Bin 3514 -> 0 bytes assets/images/widgets/GestureDetector.svg | 11 +++ assets/images/widgets/ListView.svg | 6 ++ assets/images/widgets/Text.png | Bin 0 -> 30254 bytes assets/images/widgets/Text.svg | 11 +++ assets/images/widgets/Widget.svg | 14 +++ .../desktop/flutter_unit_desk_navigation.dart | 18 ++-- .../icon_font_gen/icon_font_class_parser.dart | 2 +- .../lib/blocs/widgets_bloc/widgets_state.dart | 4 +- .../lib/views/components/widget_logo_map.dart | 46 ++++++++++ .../lib/views/desk_ui/like_tag.dart | 48 ++++++++++ .../widget_panel/desk_widget_model_item.dart | 85 +++++++++++------- .../desk_ui/widget_panel/widget_panel.dart | 45 +++------- pubspec.lock | 56 +++++++++++- pubspec.yaml | 3 +- 17 files changed, 298 insertions(+), 80 deletions(-) create mode 100644 assets/images/widgets/Card.svg create mode 100644 assets/images/widgets/Container.svg delete mode 100644 assets/images/widgets/Container.webp create mode 100644 assets/images/widgets/GestureDetector.svg create mode 100644 assets/images/widgets/ListView.svg create mode 100644 assets/images/widgets/Text.png create mode 100644 assets/images/widgets/Text.svg create mode 100644 assets/images/widgets/Widget.svg create mode 100644 modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart create mode 100644 modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart diff --git a/assets/images/widgets/Card.svg b/assets/images/widgets/Card.svg new file mode 100644 index 00000000..b4a6081d --- /dev/null +++ b/assets/images/widgets/Card.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/widgets/Container.svg b/assets/images/widgets/Container.svg new file mode 100644 index 00000000..7a6d9cfc --- /dev/null +++ b/assets/images/widgets/Container.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Container.webp b/assets/images/widgets/Container.webp deleted file mode 100644 index 0cc509a9a355f8e9a36eae3005888b9e1897a967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3514 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 diff --git a/assets/images/widgets/GestureDetector.svg b/assets/images/widgets/GestureDetector.svg new file mode 100644 index 00000000..28d2d6e4 --- /dev/null +++ b/assets/images/widgets/GestureDetector.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/widgets/ListView.svg b/assets/images/widgets/ListView.svg new file mode 100644 index 00000000..3f2228aa --- /dev/null +++ b/assets/images/widgets/ListView.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/widgets/Text.png b/assets/images/widgets/Text.png new file mode 100644 index 0000000000000000000000000000000000000000..5f690258fa1b9a908cecbb7f22eded75620170ec GIT binary patch literal 30254 zcmeFY>0i=$^fs=JWlal}m6<7Oqiv?Ccew(Um6fGamdlt@;xaR)WR4qaWo5ZUWx0$C zl{HRj5|UdAWTv>&ridu0XsDowvadHy-QV9|@O$=sg1mh2;k}%5UDvtJ`P}~1-*?r| zn}0SiFj#f$=%LdF21fd?Mh454>i>w-z9FE_<=_iPM{tlFkpmZt^tx>Eoss`+vCg|TKCucFREMO4z&xdFlqTq(L{mA*K-h&>Gd@Sm)ZR9 z$N!$e|Hi@p-)W$OBqk?I@@Na6X$vc83&pgBTv%hGMC*}uTWRH<;&ij8n!Fj3EeoNp z&c9U}3GaD9pwZLg1+AN`GWrKYQSBE`;Cdre?L_q?QT>sq{zOEHLohWuneQ^23Fw-} zwZLvCtM0sDR&nD8*sjp?sN@nNV_V6L?>ML`qP{*@kjqC8&Jl3Lf45e;e};;z#oAXptWb4Ves-I|xNFtL~oJtl1kZ32pkULVAU?-C$Ci0!Qid6GYT&UFvcDx_&yCP=g^I9zT-f zCchwN?GM`PfE51*YE`b7qUyX|m4%qnP$)r`0!jV0Xw7iHBp}?kFn5|4 z5!>Tn?~QfPh3kYxYYujpZ-GAoW?1~Wr^y5FL%jgyd7=f+6!X2X)v zIWh_;h8s)lyVxTjzibyPbJ)~B>31~A%ECZYl`i$L2!lXhf(iBQp8r!!_XT zK@4I11&PoQMgl*^vuKhe1QO63M4f|}Aqm78zA#=YG-UEu$j@8bTwg}B7^lCsn0RjS z?+19-vaBU7#fvkWB$$LtbM9kjAeZNogGGH8huO&iYkAdu_%;>&3!lXAZSNf-I}K*b z^f7iT4NJCaTCHiu3#lg8*DO39|C21_zzbVu?7g#XNZMPoBg2U&VmI z#rr^?p7j@UkWkRR>{O+P#+{ERG8oegP$tu3ZR@&3@1>f}3nLqW(^SB>Cyu3=s&_Z+ z_?cue^#UA6kXyI+Duakc>#wmRuJX8&SAc0QJvw=W$&cK^uV}v@I2XiNB~=;=T4gL4 zDMiR1MTUi|zU(a%e1F_%mlj3%0DnNT_ygBFL#lg~^>UoIr)k=R*Y2NKn$)LAM_8_C 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 A`~Uy| literal 0 HcmV?d00001 diff --git a/assets/images/widgets/Text.svg b/assets/images/widgets/Text.svg new file mode 100644 index 00000000..05e1636a --- /dev/null +++ b/assets/images/widgets/Text.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/widgets/Widget.svg b/assets/images/widgets/Widget.svg new file mode 100644 index 00000000..8fb23f42 --- /dev/null +++ b/assets/images/widgets/Widget.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart index 34ba4c1a..c812a82c 100644 --- a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -15,15 +15,15 @@ class AppDeskNavigation extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - body: UnitShortcutsScope( - child: Row( - children: [ - const DragToMoveWrapper(child: DeskNavigationRail()), - Expanded(child: content), - ], - ), - ), + return Scaffold( + body: UnitShortcutsScope( + child: Row( + children: [ + const DragToMoveWrapper(child: DeskNavigationRail()), + Expanded(child: content), + ], + ), + ), ); } } diff --git a/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart index 8eb70951..224bd81e 100644 --- a/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart +++ b/modules/tools_system/treasure_tools/lib/src/icon_font_gen/icon_font_class_parser.dart @@ -10,7 +10,7 @@ class IconFontClassParser{ void gen(IconFontGenConfig config){ final inputStream = InputFileStream(config.srcZip); // 将压缩包有用资源解压到目标文件 - final archive = ZipDecoder().decodeBuffer(inputStream); + final archive = ZipDecoder().decodeStream(inputStream); for (var file in archive.files) { if (file.isFile) { if (file.name.endsWith('.ttf')) { diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart index 2add619c..ad3fa517 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart @@ -7,7 +7,9 @@ part of 'widgets_bloc.dart'; /// 对于一个可查询、可分页的数据集 /// 状态类持有过滤数据 Filter, 任何衍生状态都需要感知过滤的信息,比如加载异常,点击重试,可以基于最后的过滤状态。 /// 分页加载 信息需要 了解 总数据、页数、每页含量 -abstract class WidgetsState extends Equatable { +/// + +sealed class WidgetsState extends Equatable { final WidgetFilter filter; final LoadOperate operate; const WidgetsState({required this.filter, required this.operate}); diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart new file mode 100644 index 00000000..0582c483 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -0,0 +1,46 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_svg/flutter_svg.dart'; + +class WidgetLogo extends StatelessWidget { + final Color background; + final String widgetName; + + const WidgetLogo( + {super.key, required this.background, required this.widgetName,}); + + @override + Widget build(BuildContext context) { + return Container( + width: 110, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform:GradientRotation(270*180/pi) , + colors: [ + background, + background.withValues(alpha: 0.5) + ]), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), + bottomLeft: Radius.circular(6) + ), + ), + child: SvgPicture.asset( + 'assets/images/widgets/${widgetLogo(widgetName)}'), + ); + } +} + + String widgetLogo(String widgetName) { + return switch(widgetName){ + 'Container' => 'Container.svg', + 'Text' => 'Text.svg', + 'GestureDetector' => 'GestureDetector.svg', + 'Card' => 'Card.svg', + 'ListView' => 'ListView.svg', + _ => 'Widget.svg', + }; + } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart new file mode 100644 index 00000000..bc03a382 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../../blocs/blocs.dart'; +import '../../widget_module.dart'; +import '../components/collected_tag.dart'; + +// typedef test = +typedef Calc = bool Function(); + +class LikeTag extends StatelessWidget { + final WidgetModel widget; + + const LikeTag({super.key, required this.widget}); + + @override + Widget build(BuildContext context) { + bool show = context.select( + (LikeWidgetBloc bloc) => bloc.state.widgets.contains(widget), + ); + if (show) { + return GestureDetector( + onTap: (){ + context.read().add(ToggleLikeWidgetEvent(id: widget.id)); + }, + child: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.3), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), + bottomRight: Radius.circular(8), + ) + ), + child: Icon(Icons.star,color: Colors.white,size: 16,), + ), + ); + } + return const SizedBox(); + // BlocBuilder(builder: (_, s) { + // bool show = s.widgets.contains(model); + // if (!show) return const SizedBox(); + // return const CollectedTag(); + // }), + return const Placeholder(); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 25448ebb..f2753e3c 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -5,9 +5,12 @@ import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/views/components/collected_tag.dart'; import 'package:widget_repository/widget_repository.dart'; - +import 'package:flutter_svg/flutter_svg.dart'; import 'package:wrapper/wrapper.dart'; +import '../../components/widget_logo_map.dart'; +import '../like_tag.dart'; + class DeskWidgetItem extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; @@ -26,30 +29,50 @@ class DeskWidgetItem extends StatelessWidget { Color? textColor = Theme.of(context).listTileTheme.textColor; bool isDark = Theme.of(context).brightness == Brightness.dark; textColor = isDark ? textColor : Color(0xff2F3032); - - return InkWell( - borderRadius: BorderRadius.circular(6), - onTap: onTap, - child: Ink( - decoration: - BoxDecoration(color: tileColor, borderRadius: BorderRadius.circular(6), boxShadow: [ - BoxShadow( - color: Theme.of(context).primaryColor.withOpacity(0.1), - blurRadius: 2, - ) - ]), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), - // margin: - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildTitle(Theme.of(context).primaryColor, textColor, isDark), - _buildContent(textColor), - _buildFoot(isDark) - ], + Color color = Theme.of(context).primaryColor; + return Stack( + children: [ + InkWell( + borderRadius: BorderRadius.circular(6), + onTap: onTap, + child: Ink( + decoration: + BoxDecoration(color: tileColor, borderRadius: BorderRadius.circular(6), boxShadow: [ + BoxShadow( + color: Theme.of(context).primaryColor.withValues(alpha:0.1), + blurRadius: 2, + ) + ]), + // padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + // margin: + child: Row( + children: [ + GestureDetector( + onLongPress: (){ + context.read().add(ToggleLikeWidgetEvent(id: model.id)); + }, + child: WidgetLogo(background: color, widgetName: model.name,), + ), + Expanded( + child: Padding( + padding:const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildTitle(Theme.of(context).primaryColor, textColor, isDark), + _buildContent(textColor), + _buildFoot(isDark) + ], + ), + ), + ), + ], + ), + ), ), - ), + LikeTag(widget: model,) + ], ); } @@ -63,20 +86,16 @@ class DeskWidgetItem extends StatelessWidget { spacing: 8, children: [ Text( - model.name, + model.name+"#${model.id}", maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( - fontSize: 15, + fontSize: 14, color: textColor, fontWeight: FontWeight.bold, ), ), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - if (!show) return const SizedBox(); - return const CollectedTag(); - }), + ], ), ), @@ -116,7 +135,7 @@ class DeskWidgetItem extends StatelessWidget { ), const Spacer(), Wrapper.just( - radius: 2, + radius: 4, color: isDark ? Color(0xff292A2D) : const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( @@ -124,7 +143,7 @@ class DeskWidgetItem extends StatelessWidget { style: TextStyle( color: isDark ? Color(0xffCCCCCC) : Color(0xff878D96), height: 1, - fontSize: 12, + fontSize: 10, shadows: [ Shadow( color: isDark ? Colors.black : Colors.white, diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index 2733c5aa..cb697c42 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -12,14 +13,13 @@ import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; class DeskWidgetPanel extends StatefulWidget { - const DeskWidgetPanel({Key? key}) : super(key: key); + const DeskWidgetPanel({super.key}); @override State createState() => _DeskWidgetPanelState(); } -class _DeskWidgetPanelState extends State{ - +class _DeskWidgetPanelState extends State { @override Widget build(BuildContext context) { WidgetsState state = context.watch().state; @@ -27,59 +27,42 @@ class _DeskWidgetPanelState extends State{ return Scaffold( body: Column( children: [ - Shortcuts( - shortcuts: { - const SingleActivator(LogicalKeyboardKey.keyQ): VoidCallbackIntent(() { - print("hello"); - }), - }, - child: DeskWidgetTopBar( - onTabPressed: _switchTab, - ), - ), + DeskWidgetTopBar(onTabPressed: _switchTab), const Divider(height: 1), Expanded( - child: _buildByState(state), + child: switch (state) { + WidgetsLoading() => const CupertinoActivityIndicator(), + WidgetsLoaded() => WidgetList(state: state), + WidgetsLoadFailed() => Center(child: Text("${state.runtimeType}")), + }, ), ], ), ); } - Widget _buildByState(WidgetsState state) { - if (state is WidgetsLoaded) { - return WidgetList(state: state); - } - return Center( - child: Text("${state.runtimeType}"), - ); - } - void _switchTab(int index) { WidgetFamily widgetFamily = WidgetFamily.values[index]; BlocProvider.of(context).add(EventTabTap(widgetFamily)); } - - } class WidgetList extends StatelessWidget { final WidgetsLoaded state; - const WidgetList({Key? key, required this.state}) : super(key: key); + const WidgetList({super.key, required this.state}); @override Widget build(BuildContext context) { - SliverGridDelegate gridDelegate = - const SliverGridDelegateWithMaxCrossAxisExtent( + SliverGridDelegate gridDelegate = const SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 400, mainAxisSpacing: 10, - mainAxisExtent: 130, + mainAxisExtent: 110, crossAxisSpacing: 10, ); return GridView.builder( - padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), gridDelegate: gridDelegate, itemBuilder: _buildItem, itemCount: state.widgets.length, @@ -91,7 +74,7 @@ class WidgetList extends StatelessWidget { return DeskWidgetItem( model: model, onTap: () { - context.push('${AppRoute.widgetDetail.url}${model.name}',extra: model); + context.push('${AppRoute.widgetDetail.url}${model.name}', extra: model); }, ); } diff --git a/pubspec.lock b/pubspec.lock index ca67bc7d..8e6fa40c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: "direct main" description: name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" url: "https://pub.dev/" source: hosted - version: "3.6.1" + version: "4.0.2" args: dependency: transitive description: @@ -259,6 +259,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.2.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + url: "https://pub.dev/" + source: hosted + version: "2.0.17" flutter_test: dependency: "direct dev" description: flutter @@ -345,10 +353,10 @@ packages: dependency: "direct main" description: name: image - sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" url: "https://pub.dev/" source: hosted - version: "4.3.0" + version: "4.5.2" intl: dependency: transitive description: @@ -557,6 +565,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev/" + source: hosted + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -637,6 +653,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + url: "https://pub.dev/" + source: hosted + version: "6.0.1" process_run: dependency: transitive description: @@ -1058,6 +1082,30 @@ packages: url: "https://pub.dev/" source: hosted version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + url: "https://pub.dev/" + source: hosted + version: "1.1.15" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev/" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev/" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a3a7af86..9ac42678 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,7 +58,7 @@ dependencies: # 平台功能 connectivity_plus: ^6.0.3 # 网络状态 url_launcher: ^6.1.14 # url - archive: ^3.6.1 # 解压 + archive: ^4.0.2 # 解压 file_picker: ^8.0.5 # 文件选择器 share_plus: ^10.0.1 # 文字分享 @@ -72,6 +72,7 @@ dependencies: wrapper: ^1.0.2 # 气泡包裹 webview_flutter: ^4.2.4 # webview flutter_markdown: ^0.7.2+1 # markdown + flutter_svg: ^2.0.17 # svg 展示 # 逻辑处理 image: ^4.0.17 # 图像处理 From b76f6875f71fa1087a19c806769fc4b742ab7ecb Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 27 Jan 2025 10:40:26 +0800 Subject: [PATCH 127/149] add:widget logo --- .../lib/views/components/widget_logo_map.dart | 45 +-- .../lib/views/desk_ui/like_tag.dart | 8 - .../widget_panel/desk_search_bar_v2.dart | 108 ++++--- .../widget_panel/desk_widget_model_item.dart | 16 +- pubspec.lock | 306 +++++++++--------- 5 files changed, 248 insertions(+), 235 deletions(-) diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart index 0582c483..570ea682 100644 --- a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -8,8 +8,11 @@ class WidgetLogo extends StatelessWidget { final Color background; final String widgetName; - const WidgetLogo( - {super.key, required this.background, required this.widgetName,}); + const WidgetLogo({ + super.key, + required this.background, + required this.widgetName, + }); @override Widget build(BuildContext context) { @@ -18,29 +21,27 @@ class WidgetLogo extends StatelessWidget { decoration: BoxDecoration( color: background, gradient: LinearGradient( - transform:GradientRotation(270*180/pi) , + transform: const GradientRotation(270 * 180 / pi), colors: [ - background, - background.withValues(alpha: 0.5) - ]), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(6), - bottomLeft: Radius.circular(6) - ), + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), ), - child: SvgPicture.asset( - 'assets/images/widgets/${widgetLogo(widgetName)}'), + child: + SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}'), ); } } - String widgetLogo(String widgetName) { - return switch(widgetName){ - 'Container' => 'Container.svg', - 'Text' => 'Text.svg', - 'GestureDetector' => 'GestureDetector.svg', - 'Card' => 'Card.svg', - 'ListView' => 'ListView.svg', - _ => 'Widget.svg', - }; - } +String widgetLogo(String widgetName) { + return switch (widgetName) { + 'Container' => 'Container.svg', + 'Text' => 'Text.svg', + 'GestureDetector' => 'GestureDetector.svg', + 'Card' => 'Card.svg', + 'ListView' => 'ListView.svg', + _ => 'Widget.svg', + }; +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart index bc03a382..ad6b1249 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/like_tag.dart @@ -5,8 +5,6 @@ import '../../blocs/blocs.dart'; import '../../widget_module.dart'; import '../components/collected_tag.dart'; -// typedef test = -typedef Calc = bool Function(); class LikeTag extends StatelessWidget { final WidgetModel widget; @@ -38,11 +36,5 @@ class LikeTag extends StatelessWidget { ); } return const SizedBox(); - // BlocBuilder(builder: (_, s) { - // bool show = s.widgets.contains(model); - // if (!show) return const SizedBox(); - // return const CollectedTag(); - // }), - return const Placeholder(); } } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart index d8126f28..701ed44a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_search_bar_v2.dart @@ -9,6 +9,7 @@ import 'package:widget_module/event/widget_event.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:tolyui/tolyui.dart'; import 'package:fx_trace/fx_trace.dart'; + class GlobalFindDialog extends StatefulWidget { final ValueChanged? onChanged; @@ -19,7 +20,8 @@ class GlobalFindDialog extends StatefulWidget { } class _GlobalFindDialogState extends State { - late TextEditingController _controller =TextEditingController(); + late TextEditingController _controller = TextEditingController(); + // final PopoverController controller = PopoverController(); @override @@ -28,11 +30,13 @@ class _GlobalFindDialogState extends State { super.initState(); } + @override void dispose() { super.dispose(); _focusNode.removeListener(_onFocusChange); } + void _onFocusChange() { // if (_focusNode.hasFocus) { // controller.open(); @@ -40,26 +44,27 @@ class _GlobalFindDialogState extends State { // controller.close(); // } } + @override Widget build(BuildContext context) { return Dialog( surfaceTintColor: Colors.transparent, backgroundColor: Colors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - child: SizedBox( + child: SizedBox( width: 400, height: 400, child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ - SizedBox(height:32,child: _buildFieldView()), + SizedBox(height: 32, child: _buildFieldView()), Expanded(child: _buildOptionsView()), ], ), ), )); - ; + ; } void onSelected(WidgetModel model) { @@ -74,44 +79,52 @@ class _GlobalFindDialogState extends State { Iterable options = []; - void searchByArgs(String text) async{ + void searchByArgs(String text) async { WidgetRepository repository = context.read().repository; - options = await repository.searchWidgets(WidgetFilter( - name: text - )); - setState(() { - - }); + options = await repository.searchWidgets(WidgetFilter(name: text)); + setState(() {}); } Widget _buildOptionsView() { - return Align( + return Align( alignment: Alignment.topLeft, child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 400), - child:ListView.builder( - itemCount: options.length , - padding: EdgeInsets.symmetric(vertical: 10), - itemBuilder: (_,index) { - WidgetModel model = options.elementAt(index); - return InkWell( - onTap: ()=>onSelected(model), - child: Ink( - padding: EdgeInsets.symmetric(vertical: 6, horizontal: 15), - child: Row(children: [ - Expanded(child: Text.rich(formSpan(model.name,_controller.text),maxLines:1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 12))), - // Spacer(), - const SizedBox(width: 10,), - Text(model.nameCN,style: TextStyle(fontSize: 12),), - ],), + constraints: const BoxConstraints(maxWidth: 400), + child: ListView.builder( + itemCount: options.length, + padding: const EdgeInsets.symmetric(vertical: 10), + itemBuilder: (_, index) { + WidgetModel model = options.elementAt(index); + return InkWell( + onTap: () => onSelected(model), + child: Ink( + padding: + const EdgeInsets.symmetric(vertical: 6, horizontal: 15), + child: Row( + children: [ + Expanded( + child: Text.rich( + formSpan(model.name, _controller.text), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 12))), + // Spacer(), + const SizedBox( + width: 10, + ), + Text( + model.nameCN, + style: const TextStyle(fontSize: 12), + ), + ], + ), + ), + ); + }), ), - ); - }), - ), ); } + final FocusNode _focusNode = FocusNode(); FocusNode get focusNode => _focusNode; @@ -121,40 +134,34 @@ class _GlobalFindDialogState extends State { return TextField( autofocus: true, controller: _controller, - onChanged: (value){ + onChanged: (value) { searchByArgs(value); }, style: const TextStyle(fontSize: 12), maxLines: 1, - focusNode: focusNode, - decoration: InputDecoration( - prefixIconConstraints: BoxConstraints( - minWidth: 30, - ), + decoration: InputDecoration( + prefixIconConstraints: const BoxConstraints(minWidth: 30), filled: true, hoverColor: Colors.transparent, - contentPadding: EdgeInsets.only(top: 0), - fillColor: isDark?null:Color(0xffF1F2F3), - prefixIcon: Icon( + contentPadding: const EdgeInsets.only(top: 0), + fillColor: isDark ? null : const Color(0xffF1F2F3), + prefixIcon: const Icon( Icons.search, size: 18, color: Colors.grey, ), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Theme.of(context).primaryColor), - borderRadius: BorderRadius.all(Radius.circular(8)), + borderRadius: const BorderRadius.all(Radius.circular(8)), ), - - enabledBorder : OutlineInputBorder( - + enabledBorder: const OutlineInputBorder( borderSide: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(8)), ), hintText: '搜索', - hintStyle: TextStyle(fontSize: 12, color: Colors.grey)), + hintStyle: const TextStyle(fontSize: 12, color: Colors.grey)), ); - } final TextStyle lightTextStyle = const TextStyle( @@ -175,10 +182,11 @@ class _GlobalFindDialogState extends State { }, onNonMatch: (str) { span.add(TextSpan( text: str, - style: lightTextStyle.copyWith(color: isDark?textColor:const Color(0xff2F3032),fontSize: 12))); + style: lightTextStyle.copyWith( + color: isDark ? textColor : const Color(0xff2F3032), + fontSize: 12))); return ''; }); return TextSpan(children: span); } - } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index f2753e3c..12dce678 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -71,7 +71,19 @@ class DeskWidgetItem extends StatelessWidget { ), ), ), - LikeTag(widget: model,) + LikeTag(widget: model), + Positioned( + bottom: 2, + left: 6, + child: Text( + "#${model.id}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + color: Colors.white70, + ), + )) ], ); } @@ -86,7 +98,7 @@ class DeskWidgetItem extends StatelessWidget { spacing: 8, children: [ Text( - model.name+"#${model.id}", + model.name, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( diff --git a/pubspec.lock b/pubspec.lock index 8e6fa40c..96bb0c42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.2" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.6.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.11.0" bloc: @@ -30,7 +30,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.4" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.1" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" clock: @@ -54,7 +54,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" collection: @@ -62,7 +62,7 @@ packages: description: name: collection sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.19.0" connectivity_plus: @@ -70,7 +70,7 @@ packages: description: name: connectivity_plus sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.1.2" connectivity_plus_platform_interface: @@ -78,7 +78,7 @@ packages: description: name: connectivity_plus_platform_interface sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" convert: @@ -86,7 +86,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.2" cross_file: @@ -94,7 +94,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.4+2" crypto: @@ -102,7 +102,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.6" cupertino_icons: @@ -110,7 +110,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.8" dash_painter: @@ -118,7 +118,7 @@ packages: description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" dbus: @@ -126,7 +126,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.11" dev_build: @@ -134,7 +134,7 @@ packages: description: name: dev_build sha256: "933f14357d4e58da298ce2395e8271728dd90e8760e1c7677ca1d5fa065f2b4a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1+7" dio: @@ -142,7 +142,7 @@ packages: description: name: dio sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.7.0" dio_web_adapter: @@ -150,7 +150,7 @@ packages: description: name: dio_web_adapter sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" equatable: @@ -158,7 +158,7 @@ packages: description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.7" fake_async: @@ -166,7 +166,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.1" ffi: @@ -174,7 +174,7 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.3" file: @@ -182,7 +182,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.1" file_picker: @@ -190,7 +190,7 @@ packages: description: name: file_picker sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.7" fixnum: @@ -198,7 +198,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" flutter: @@ -211,7 +211,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.6" flutter_lints: @@ -219,7 +219,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" flutter_localizations: @@ -232,7 +232,7 @@ packages: description: name: flutter_markdown sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.5" flutter_plugin_android_lifecycle: @@ -240,7 +240,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.24" flutter_spinkit: @@ -248,7 +248,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.2.1" flutter_star: @@ -256,7 +256,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.0" flutter_svg: @@ -264,7 +264,7 @@ packages: description: name: flutter_svg sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.17" flutter_test: @@ -282,7 +282,7 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.1" fx_dao: @@ -290,7 +290,7 @@ packages: description: name: fx_dao sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1+2" fx_dio: @@ -298,7 +298,7 @@ packages: description: name: fx_dio sha256: c2a525ff6a8a70d9f39e26d335fac0eff1a605749b80affa50f9e2155288859f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" fx_go_router_ext: @@ -306,7 +306,7 @@ packages: description: name: fx_go_router_ext sha256: "4eee6121b0c10ed9cf77ceafd8cca024cfaaf1777deb61fe8936ac7a7173961b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5" fx_platform_adapter: @@ -314,7 +314,7 @@ packages: description: name: fx_platform_adapter sha256: "229d966a6b90f6ddb96913426c5d9f14552a17dbdd8747d23ce08065db94498b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+2" fx_trace: @@ -322,7 +322,7 @@ packages: description: name: fx_trace sha256: bba16febf583d4464cd5cae11bd19d441c82d9ca6a7d9bb71c05cae7379a619a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" go_router: @@ -330,7 +330,7 @@ packages: description: name: go_router sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "14.6.3" http: @@ -338,7 +338,7 @@ packages: description: name: http sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" http_parser: @@ -346,7 +346,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.1.2" image: @@ -354,7 +354,7 @@ packages: description: name: image sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.2" intl: @@ -362,7 +362,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.19.0" json_annotation: @@ -370,7 +370,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.9.0" jwt_decoder: @@ -378,7 +378,7 @@ packages: description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" leak_tracker: @@ -386,7 +386,7 @@ packages: description: name: leak_tracker sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.0.7" leak_tracker_flutter_testing: @@ -394,7 +394,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.8" leak_tracker_testing: @@ -402,7 +402,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.1" lints: @@ -410,7 +410,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" logging: @@ -418,7 +418,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" markdown: @@ -426,7 +426,7 @@ packages: description: name: markdown sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.3.0" matcher: @@ -434,7 +434,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.12.16+1" material_color_utilities: @@ -442,7 +442,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.11.1" meta: @@ -450,7 +450,7 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.15.0" mime: @@ -458,7 +458,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" nested: @@ -466,7 +466,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" nm: @@ -474,7 +474,7 @@ packages: description: name: nm sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.5.0" open_file: @@ -482,7 +482,7 @@ packages: description: name: open_file sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.5.10" open_file_android: @@ -490,7 +490,7 @@ packages: description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.6" open_file_ios: @@ -498,7 +498,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_linux: @@ -506,7 +506,7 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5" open_file_mac: @@ -514,7 +514,7 @@ packages: description: name: open_file_mac sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_platform_interface: @@ -522,7 +522,7 @@ packages: description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_web: @@ -530,7 +530,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4" open_file_windows: @@ -538,7 +538,7 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" package_info_plus: @@ -546,7 +546,7 @@ packages: description: name: package_info_plus sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.3" package_info_plus_platform_interface: @@ -554,7 +554,7 @@ packages: description: name: package_info_plus_platform_interface sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.2" path: @@ -562,7 +562,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.9.0" path_parsing: @@ -570,7 +570,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" path_provider: @@ -578,7 +578,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.5" path_provider_android: @@ -586,7 +586,7 @@ packages: description: name: path_provider_android sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.15" path_provider_foundation: @@ -594,7 +594,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" path_provider_linux: @@ -602,7 +602,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -610,7 +610,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" path_provider_windows: @@ -618,7 +618,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.0" petitparser: @@ -626,7 +626,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.0.2" platform: @@ -634,7 +634,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -642,7 +642,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.8" pool: @@ -650,7 +650,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.5.1" posix: @@ -658,7 +658,7 @@ packages: description: name: posix sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.0.1" process_run: @@ -666,7 +666,7 @@ packages: description: name: process_run sha256: a68fa9727392edad97a2a96a77ce8b0c17d28336ba1b284b1dfac9595a4299ea - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.2+1" provider: @@ -674,7 +674,7 @@ packages: description: name: provider sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.1.2" pub_semver: @@ -682,7 +682,7 @@ packages: description: name: pub_semver sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.5" r_upgrade: @@ -690,7 +690,7 @@ packages: description: name: r_upgrade sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.2" refresh: @@ -698,7 +698,7 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" screen_retriever: @@ -706,7 +706,7 @@ packages: description: name: screen_retriever sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_linux: @@ -714,7 +714,7 @@ packages: description: name: screen_retriever_linux sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_macos: @@ -722,7 +722,7 @@ packages: description: name: screen_retriever_macos sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_platform_interface: @@ -730,7 +730,7 @@ packages: description: name: screen_retriever_platform_interface sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_windows: @@ -738,7 +738,7 @@ packages: description: name: screen_retriever_windows sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" share_plus: @@ -746,7 +746,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -754,31 +754,31 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.0.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a - url: "https://pub.dev/" + sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "138b7bbbc7f59c56236e426c37afb8f78cbc57b094ac64c440e0bb90e380a4f5" - url: "https://pub.dev/" + sha256: "986dc7b7d14f38064bfa85ace28df1f1a66d4fba32e4b1079d4ea537d9541b01" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.2" + version: "2.4.3" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -786,7 +786,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -794,7 +794,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_web: @@ -802,7 +802,7 @@ packages: description: name: shared_preferences_web sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.2" shared_preferences_windows: @@ -810,7 +810,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" sky_engine: @@ -823,7 +823,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.10.0" sprintf: @@ -831,7 +831,7 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.0" sqflite: @@ -839,7 +839,7 @@ packages: description: name: sqflite sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" sqflite_android: @@ -847,7 +847,7 @@ packages: description: name: sqflite_android sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.0" sqflite_common: @@ -855,7 +855,7 @@ packages: description: name: sqflite_common sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.4+6" sqflite_common_ffi: @@ -863,7 +863,7 @@ packages: description: name: sqflite_common_ffi sha256: "883dd810b2b49e6e8c3b980df1829ef550a94e3f87deab5d864917d27ca6bf36" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.4+4" sqflite_common_ffi_web: @@ -871,7 +871,7 @@ packages: description: name: sqflite_common_ffi_web sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.5+4" sqflite_darwin: @@ -879,7 +879,7 @@ packages: description: name: sqflite_darwin sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1+1" sqflite_platform_interface: @@ -887,7 +887,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.0" sqlite3: @@ -895,7 +895,7 @@ packages: description: name: sqlite3 sha256: "35d3726fe18ab1463403a5cc8d97dbc81f2a0b08082e8173851363fcc97b6627" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.7.2" stack_trace: @@ -903,7 +903,7 @@ packages: description: name: stack_trace sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.12.0" stream_channel: @@ -911,7 +911,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" string_scanner: @@ -919,7 +919,7 @@ packages: description: name: string_scanner sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" synchronized: @@ -927,7 +927,7 @@ packages: description: name: synchronized sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.3.0+3" term_glyph: @@ -935,7 +935,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.1" test_api: @@ -943,7 +943,7 @@ packages: description: name: test_api sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.3" toggle_rotate: @@ -951,7 +951,7 @@ packages: description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" tolyui: @@ -959,7 +959,7 @@ packages: description: name: tolyui sha256: "103a1d4b9994d4c7b2db93aada29d647a84328f1aada28412ad5609575e0c28b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4" tolyui_color: @@ -967,7 +967,7 @@ packages: description: name: tolyui_color sha256: "410c378344d47a5f170e70a78cc1ac6a4f2665ea40f02c9aaa67da4072fde0e1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" tolyui_feedback: @@ -975,7 +975,7 @@ packages: description: name: tolyui_feedback sha256: "1a35f0c874d8ffd5a700a661ff60c4f818dec7c1c7b7e7f281a495905c838117" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.5" tolyui_message: @@ -983,7 +983,7 @@ packages: description: name: tolyui_message sha256: "4e9046d65d1a5f98f0ebd423815be683c7fbf637caa9e0bf88d83148b42764cb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.2" tolyui_navigation: @@ -991,7 +991,7 @@ packages: description: name: tolyui_navigation sha256: b7f10c7efc41228be3c3c2aed8fd64e80eeee0e7426e0d5af8b54d04a4243058 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.0" tolyui_rx_layout: @@ -999,7 +999,7 @@ packages: description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" typed_data: @@ -1007,7 +1007,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" url_launcher: @@ -1015,7 +1015,7 @@ packages: description: name: url_launcher sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.1" url_launcher_android: @@ -1023,7 +1023,7 @@ packages: description: name: url_launcher_android sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.14" url_launcher_ios: @@ -1031,7 +1031,7 @@ packages: description: name: url_launcher_ios sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.2" url_launcher_linux: @@ -1039,7 +1039,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.1" url_launcher_macos: @@ -1047,7 +1047,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -1055,7 +1055,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.2" url_launcher_web: @@ -1063,7 +1063,7 @@ packages: description: name: url_launcher_web sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.0" url_launcher_windows: @@ -1071,7 +1071,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.4" uuid: @@ -1079,7 +1079,7 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.1" vector_graphics: @@ -1087,7 +1087,7 @@ packages: description: name: vector_graphics sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.15" vector_graphics_codec: @@ -1095,7 +1095,7 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -1103,7 +1103,7 @@ packages: description: name: vector_graphics_compiler sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.16" vector_math: @@ -1111,7 +1111,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" vm_service: @@ -1119,15 +1119,15 @@ packages: description: name: vm_service sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "14.3.0" web: - dependency: transitive + dependency: "direct overridden" description: name: web sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" webview_flutter: @@ -1135,7 +1135,7 @@ packages: description: name: webview_flutter sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.10.0" webview_flutter_android: @@ -1143,7 +1143,7 @@ packages: description: name: webview_flutter_android sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.3.1" webview_flutter_platform_interface: @@ -1151,7 +1151,7 @@ packages: description: name: webview_flutter_platform_interface sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.10.0" webview_flutter_wkwebview: @@ -1159,7 +1159,7 @@ packages: description: name: webview_flutter_wkwebview sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.17.0" widget_repository: @@ -1174,7 +1174,7 @@ packages: description: name: win32 sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.10.0" window_manager: @@ -1182,7 +1182,7 @@ packages: description: name: window_manager sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.3" wrapper: @@ -1190,7 +1190,7 @@ packages: description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" xdg_directories: @@ -1198,7 +1198,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" xml: @@ -1206,7 +1206,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.5.0" yaml: @@ -1214,7 +1214,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.3" sdks: From e20ec49c9c30475d7de667946ca1c4c6aeb2e4e0 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 31 Jan 2025 12:16:15 +0800 Subject: [PATCH 128/149] feature:note --- android/app/build.gradle | 2 +- android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- lib/src/navigation/model/app_tab.dart | 6 +- lib/src/navigation/router/app_route.dart | 1 + .../router/widgets/collection_route.dart | 9 + lib/src/starter/bridge/unit_bridge.dart | 10 + lib/src/starter/start_repository.dart | 5 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- .../app/lib/app/router/app_route.dart | 1 + .../basic_system/app/lib/http/register.dart | 1 + .../app/lib/http/science/science_host.dart | 25 +- modules/knowledge_system/note/.gitignore | 31 ++ modules/knowledge_system/note/.metadata | 10 + modules/knowledge_system/note/CHANGELOG.md | 3 + modules/knowledge_system/note/LICENSE | 1 + modules/knowledge_system/note/README.md | 2 + .../note/analysis_options.yaml | 4 + modules/knowledge_system/note/lib/note.dart | 4 + .../note/lib/src/bloc/bloc.dart | 1 + .../note/lib/src/env/env.dart | 25 ++ .../src/repository/article_repository.dart | 94 +++++ .../lib/src/repository/model/article.dart | 97 +++++ .../note/lib/src/repository/model/model.dart | 3 + .../note/lib/src/repository/model/query.dart | 9 + .../note/lib/src/repository/model/status.dart | 21 ++ .../note/lib/src/repository/repository.dart | 0 .../note/lib/src/view/article_admin.dart | 325 ++++++++++++++++ .../note/lib/src/view/article_editor.dart | 200 ++++++++++ .../note/lib/src/view/article_item.dart | 45 +++ .../note/lib/src/view/article_list.dart | 196 ++++++++++ .../src/view/components/button/button.dart | 41 ++ .../note/lib/src/view/view.dart | 1 + modules/knowledge_system/note/pubspec.yaml | 57 +++ .../knowledge_system/note/test/note_test.dart | 3 + pubspec.lock | 350 +++++++++--------- pubspec.yaml | 7 +- 37 files changed, 1416 insertions(+), 182 deletions(-) create mode 100644 lib/src/starter/bridge/unit_bridge.dart create mode 100644 modules/knowledge_system/note/.gitignore create mode 100644 modules/knowledge_system/note/.metadata create mode 100644 modules/knowledge_system/note/CHANGELOG.md create mode 100644 modules/knowledge_system/note/LICENSE create mode 100644 modules/knowledge_system/note/README.md create mode 100644 modules/knowledge_system/note/analysis_options.yaml create mode 100644 modules/knowledge_system/note/lib/note.dart create mode 100644 modules/knowledge_system/note/lib/src/bloc/bloc.dart create mode 100644 modules/knowledge_system/note/lib/src/env/env.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/article_repository.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/model/article.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/model/model.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/model/query.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/model/status.dart create mode 100644 modules/knowledge_system/note/lib/src/repository/repository.dart create mode 100644 modules/knowledge_system/note/lib/src/view/article_admin.dart create mode 100644 modules/knowledge_system/note/lib/src/view/article_editor.dart create mode 100644 modules/knowledge_system/note/lib/src/view/article_item.dart create mode 100644 modules/knowledge_system/note/lib/src/view/article_list.dart create mode 100644 modules/knowledge_system/note/lib/src/view/components/button/button.dart create mode 100644 modules/knowledge_system/note/lib/src/view/view.dart create mode 100644 modules/knowledge_system/note/pubspec.yaml create mode 100644 modules/knowledge_system/note/test/note_test.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 35b52b0f..8c833670 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { compileSdkVersion 34 - + namespace = "com.toly1994.flutter_unit" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/android/build.gradle b/android/build.gradle index c3fc3e20..4c72b4e0 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:8.3.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 0bc3d49c..78d3f62f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,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 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart index d6024a2c..fa9e2d00 100644 --- a/lib/src/navigation/model/app_tab.dart +++ b/lib/src/navigation/model/app_tab.dart @@ -1,12 +1,14 @@ import 'package:app/app.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; import 'package:tolyui/tolyui.dart'; enum AppTab { widgets('/widget', TolyIcon.icon_layout), - painter('/painter', TolyIcon.dingzhi1), + note('/note', Icons.note_alt_outlined), knowledge('/knowledge', TolyIcon.icon_artifact), + painter('/painter', TolyIcon.dingzhi1), tools('/tools', TolyIcon.icon_fast), mine('/account', TolyIcon.yonghu); @@ -23,6 +25,7 @@ enum AppTab { AppTab.knowledge => l10n.deskTabKnowledge, AppTab.tools => l10n.deskTabTools, AppTab.mine => l10n.deskTabMine, + AppTab.note => '匠心巧记', }; } return switch (this) { @@ -31,6 +34,7 @@ enum AppTab { AppTab.knowledge => l10n.mobileTabKnowledge, AppTab.tools => l10n.mobileTabTools, AppTab.mine => l10n.mobileTabMine, + AppTab.note => '匠心巧记', }; } diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart index e175386d..5ca9aabf 100644 --- a/lib/src/navigation/router/app_route.dart +++ b/lib/src/navigation/router/app_route.dart @@ -11,6 +11,7 @@ import 'widgets/widgets_route.dart'; RouteBase get appRoute { List body = [ widgetsRoute, + noteRoute, collectRoute, settingsRoute, ...systemRoutes, diff --git a/lib/src/navigation/router/widgets/collection_route.dart b/lib/src/navigation/router/widgets/collection_route.dart index 3b348bf7..94e6098c 100644 --- a/lib/src/navigation/router/widgets/collection_route.dart +++ b/lib/src/navigation/router/widgets/collection_route.dart @@ -1,6 +1,7 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:widget_module/widget_module.dart'; +import 'package:note/note.dart'; GoRoute get collectRoute => GoRoute( path: AppRoute.collection.path, @@ -10,6 +11,14 @@ GoRoute get collectRoute => GoRoute( ], ); +GoRoute get noteRoute => GoRoute( + path: AppRoute.note.path, + builder: (_, __) => const ArticleAdmin(), + // routes: [ + // GoRoute(path: AppRoute.collectionDetail.path, builder: collectionDetailBuilder), + // ], +); + Widget collectionDetailBuilder(BuildContext context, GoRouterState state) { Object? extra = state.extra; CategoryModel? model; diff --git a/lib/src/starter/bridge/unit_bridge.dart b/lib/src/starter/bridge/unit_bridge.dart new file mode 100644 index 00000000..27718a27 --- /dev/null +++ b/lib/src/starter/bridge/unit_bridge.dart @@ -0,0 +1,10 @@ +import 'package:fx_dio/fx_dio.dart'; +import 'package:fx_dio/src/client/host.dart'; +import 'package:note/note.dart'; +import 'package:app/app.dart'; + +class UnitNoteBridge with NoteModuleBridge{ + + @override + Host get host => FxDio()(); +} \ No newline at end of file diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index d0603d89..fb2914d1 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -1,6 +1,6 @@ import 'dart:convert'; import 'dart:io'; - +import 'package:note/note.dart'; import 'package:app/app.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -14,6 +14,8 @@ import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; import 'package:utils/utils.dart'; +import 'bridge/unit_bridge.dart'; + class FlutterUnitStartRepo implements AppStartRepository { const FlutterUnitStartRepo(); @@ -29,6 +31,7 @@ class FlutterUnitStartRepo implements AppStartRepository { await SpStorage.instance.initSp(); registerHttpClient(); + NoteEnv().attachBridge(UnitNoteBridge()); if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9556a44b..7657b60c 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import connectivity_plus +import file_picker import open_file_mac import package_info_plus import path_provider_foundation @@ -19,6 +20,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) @@ -27,6 +29,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) - FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin")) + WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart index 7e0762b7..bf313620 100644 --- a/modules/basic_system/app/lib/app/router/app_route.dart +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -10,6 +10,7 @@ enum AppRoute { collection('collection', url: '/collection'), collectionDetail('widgets/:id', url: '/collection/widgets/'), + note('note', url: '/note'), painter('painter', url: '/painter'), knowledge('knowledge', url: '/knowledge'), tools('tools', url: '/tools'), diff --git a/modules/basic_system/app/lib/http/register.dart b/modules/basic_system/app/lib/http/register.dart index 141362fc..bca3a6ad 100644 --- a/modules/basic_system/app/lib/http/register.dart +++ b/modules/basic_system/app/lib/http/register.dart @@ -3,5 +3,6 @@ import 'http.dart'; void registerHttpClient(){ FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); + FxDio().register(const ScienceHostPure()); FxDio().register(const UnitHost()); } \ No newline at end of file diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart index aa622d4a..ed633439 100644 --- a/modules/basic_system/app/lib/http/science/science_host.dart +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -6,7 +6,7 @@ class ScienceHost extends Host { @override Map get value => { HostEnv.release: 'toly1994.com', - HostEnv.dev: '192.168.109.244', + HostEnv.dev: '127.0.0.1', }; @override @@ -17,7 +17,28 @@ class ScienceHost extends Host { ); @override - HostEnv get env => HostEnv.release; + HostEnv get env => HostEnv.dev; +} + + +class ScienceHostPure extends Host { + const ScienceHostPure(); + + @override + Map get value => { + HostEnv.release: 'toly1994.com', + HostEnv.dev: '192.168.1.2', + }; + + @override + HostConfig get config => const HostConfig( + scheme: 'http', + port: 3000, + apiNest: '/api/v1', + ); + + @override + HostEnv get env => HostEnv.dev; } enum ScienceApi { diff --git a/modules/knowledge_system/note/.gitignore b/modules/knowledge_system/note/.gitignore new file mode 100644 index 00000000..eb6c05cd --- /dev/null +++ b/modules/knowledge_system/note/.gitignore @@ -0,0 +1,31 @@ +# 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 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/modules/knowledge_system/note/.metadata b/modules/knowledge_system/note/.metadata new file mode 100644 index 00000000..ab15d7af --- /dev/null +++ b/modules/knowledge_system/note/.metadata @@ -0,0 +1,10 @@ +# 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: "c519ee916eaeb88923e67befb89c0f1dabfa83e6" + channel: "stable" + +project_type: package diff --git a/modules/knowledge_system/note/CHANGELOG.md b/modules/knowledge_system/note/CHANGELOG.md new file mode 100644 index 00000000..41cc7d81 --- /dev/null +++ b/modules/knowledge_system/note/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/modules/knowledge_system/note/LICENSE b/modules/knowledge_system/note/LICENSE new file mode 100644 index 00000000..ba75c69f --- /dev/null +++ b/modules/knowledge_system/note/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/modules/knowledge_system/note/README.md b/modules/knowledge_system/note/README.md new file mode 100644 index 00000000..e316598f --- /dev/null +++ b/modules/knowledge_system/note/README.md @@ -0,0 +1,2 @@ +#### 匠心巧记 模块 +打造便捷使用的 [全端同步] 笔记 \ No newline at end of file diff --git a/modules/knowledge_system/note/analysis_options.yaml b/modules/knowledge_system/note/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/modules/knowledge_system/note/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/modules/knowledge_system/note/lib/note.dart b/modules/knowledge_system/note/lib/note.dart new file mode 100644 index 00000000..90e30e16 --- /dev/null +++ b/modules/knowledge_system/note/lib/note.dart @@ -0,0 +1,4 @@ +export 'src/view/view.dart'; +export 'src/bloc/bloc.dart'; +export 'src/repository/repository.dart'; +export 'src/env/env.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/bloc/bloc.dart b/modules/knowledge_system/note/lib/src/bloc/bloc.dart new file mode 100644 index 00000000..b9f78bb0 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/bloc/bloc.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/env/env.dart b/modules/knowledge_system/note/lib/src/env/env.dart new file mode 100644 index 00000000..40fd925f --- /dev/null +++ b/modules/knowledge_system/note/lib/src/env/env.dart @@ -0,0 +1,25 @@ +import 'package:fx_dio/fx_dio.dart'; + +class NoteEnv with NoteModuleBridge { + static NoteEnv? _instance; + + NoteEnv._(); + + factory NoteEnv() { + _instance ??= NoteEnv._(); + return _instance!; + } + + NoteModuleBridge? _bridge; + + void attachBridge(NoteModuleBridge bridge) { + _bridge = bridge; + } + + @override + Host get host => _bridge!.host; +} + +mixin NoteModuleBridge { + Host get host; +} diff --git a/modules/knowledge_system/note/lib/src/repository/article_repository.dart b/modules/knowledge_system/note/lib/src/repository/article_repository.dart new file mode 100644 index 00000000..2dd81915 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/article_repository.dart @@ -0,0 +1,94 @@ +import 'package:fx_dio/fx_dio.dart'; + +import '../env/env.dart'; +import 'model/model.dart'; + +typedef PaginateList = ({List list, int total}); + +abstract class ArticleRepository { + Future> create(ArticleCreatePayload payload); + + Future> open(int id); + + Future> write(int id, String content); + + Future>> list(SizeFilter filter); + + // Future> update(ArticlePo article); + + Future> delete(int id); + + Future> update(int id,ArticleUpdatePayload payload); +} + +class HttpArticleRepository implements ArticleRepository { + Host get host => NoteEnv().host; + + @override + Future> create(ArticleCreatePayload payload) { + return host.post( + '/article', + data: payload.apiData, + convertor: (rep) => rep['status'] == true, + ); + } + + @override + Future> delete(int id) { + return host.delete( + '/article/$id', + convertor: (rep) => rep['status'] == true, + ); + } + + @override + Future>> list(SizeFilter filter) { + return host.get>( + '/article', + queryParameters: { + 'page': filter.page, + 'page_size': filter.pageSize, + }, + convertor: (rep) { + return ( + list: rep['data'].map(ArticlePo.fromApi).toList(), + total: rep['total'] ?? 0, + ); + }, + ); + } + + + @override + Future> open(int id) { + return host.get( + '/article/open/$id', + convertor: (rep) => rep['data'], + ); + } + + @override + Future> write(int id, String content) { + return host.post( + '/article/write', + data: { + 'article_id': id, + 'content': content, + }, + convertor: (rep) { + return rep['status'] == true; + }, + ); + } + + @override + Future> update(int id, ArticleUpdatePayload payload) { + return host.put( + '/article/$id', + data: payload.apiData, + convertor: (rep) { + return ArticlePo.fromApi(rep['data']); + }, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/article.dart b/modules/knowledge_system/note/lib/src/repository/model/article.dart new file mode 100644 index 00000000..ae802966 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/article.dart @@ -0,0 +1,97 @@ +class ArticlePo { + final String title; + final String? subtitle; + final String url; + final String? cover; + final int create; + final int update; + final int id; + final int status; + final int type; + + ArticlePo({ + required this.title, + this.subtitle = '', + required this.url, + this.cover = '', + this.update = 0, + this.create = 0, + this.status = 0, + this.type = 0, + this.id = -1, + }); + + factory ArticlePo.fromApi(dynamic map) => ArticlePo( + id: map['article_id'] ?? 0, + title: map['title'] ?? '', + type: map['type'] ?? '', + status: map['status'] ?? '', + create: DateTime.parse(map['create_at']).millisecondsSinceEpoch, + update: DateTime.parse(map['update_at']).millisecondsSinceEpoch, + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', + ); +} + +class ArticleCreatePayload { + final String subtitle; + final String title; + final String url; + final int type; + final String cover; + final String createAt; + + ArticleCreatePayload({ + required this.subtitle, + required this.title, + required this.url, + required this.type, + required this.cover, + required this.createAt, + }); + + Map get apiData => { + "title": title, + "create_at": createAt, + "subtitle": subtitle, + "url": url, + "type": type, + "cover": cover, + }; + + Map toJson() => apiData; +} + +class ArticleUpdatePayload { + final String? subtitle; + final String? title; + final String? url; + final String? cover; + + ArticleUpdatePayload({ + this.subtitle, + this.title, + this.url, + this.cover, + }); + + Map get apiData { + Map ret = {}; + if (title != null) { + ret['title'] = title; + } + if (url != null) { + ret['url'] = title; + } + if (subtitle != null) { + ret['subtitle'] = title; + } + if (cover != null) { + ret['cover'] = title; + } + return ret; + } + + Map toJson() => apiData; +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/model.dart b/modules/knowledge_system/note/lib/src/repository/model/model.dart new file mode 100644 index 00000000..cb729d99 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/model.dart @@ -0,0 +1,3 @@ +export 'status.dart'; +export 'article.dart'; +export 'query.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/repository/model/query.dart b/modules/knowledge_system/note/lib/src/repository/model/query.dart new file mode 100644 index 00000000..3bae3eb8 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/query.dart @@ -0,0 +1,9 @@ +class SizeFilter { + final int pageSize; + final int page; + + SizeFilter({ + this.pageSize = 20, + this.page = 1, + }); +} diff --git a/modules/knowledge_system/note/lib/src/repository/model/status.dart b/modules/knowledge_system/note/lib/src/repository/model/status.dart new file mode 100644 index 00000000..fe57eceb --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/status.dart @@ -0,0 +1,21 @@ +sealed class TaskStatus { + const TaskStatus(); +} + +class TaskNone extends TaskStatus { + const TaskNone(); +} + +class TaskLoading extends TaskStatus { + const TaskLoading(); +} + +class TaskSuccess extends TaskStatus { + const TaskSuccess(); +} + +class TaskFailed extends TaskStatus { + final Object? error; + final StackTrace? trace; + const TaskFailed(this.error, [this.trace]); +} diff --git a/modules/knowledge_system/note/lib/src/repository/repository.dart b/modules/knowledge_system/note/lib/src/repository/repository.dart new file mode 100644 index 00000000..e69de29b diff --git a/modules/knowledge_system/note/lib/src/view/article_admin.dart b/modules/knowledge_system/note/lib/src/view/article_admin.dart new file mode 100644 index 00000000..3a3993c8 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_admin.dart @@ -0,0 +1,325 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:app/app.dart'; +import '../repository/article_repository.dart'; +import '../repository/model/model.dart'; +import 'article_editor.dart'; +import 'article_item.dart'; +import 'components/button/button.dart'; +import 'article_list.dart'; + +class ArticleAdmin extends StatefulWidget { + const ArticleAdmin({super.key}); + + @override + State createState() => _ArticleAdminState(); +} + +class _ArticleAdminState extends State { + ArticleRepository _repository = HttpArticleRepository(); + + @override + void initState() { + super.initState(); + _queryScienceArticle(); + } + + List articles = []; + int total = 0; + int currentIndex = 1; + ArticlePo? active; + TaskStatus status = const TaskNone(); + + TextEditingController ctrl = TextEditingController(); + TextEditingController titleCtrl = TextEditingController(); + + Future _queryScienceArticle() async { + setState(() { + status = const TaskLoading(); + }); + ApiRet> ret = await _repository.list(SizeFilter()); + if (ret.success) { + articles = ret.data.list; + total = ret.data.total; + setState(() { + status = TaskSuccess(); + }); + } else { + status = TaskFailed(ret.trace); + setState(() {}); + } + } + + void updateTitle(int id, String title) async { + ApiRet ret = + await _repository.update(id, ArticleUpdatePayload(title: title)); + if (ret.success) { + _loadArticleContent(id); + _queryScienceArticle(); + titleCtrl.text = ret.data.title; + setState(() { + active = ret.data; + }); + } else { + print(ret.trace?.error); + } + } + + @override + Widget build(BuildContext context) { + Widget table = switch (status) { + TaskNone() => Scaffold(), + TaskLoading() => const CupertinoActivityIndicator(), + TaskSuccess() => ArticleList( + articles: articles, + activeId: active?.id ?? -1, + onTap: (ArticlePo article) { + if (article.type == 1) { + _loadArticleContent(article.id); + } else {} + titleCtrl.text = article.title; + + setState(() { + active = article; + }); + }, + onUpdateTitle: updateTitle, + ), + TaskFailed() => Scaffold(), + }; + return Scaffold( + backgroundColor: Colors.white, + body: Row( + children: [ + Container( + width: 240, + decoration: BoxDecoration(color: Color(0xfffafbfc) + // gradient: LinearGradient(colors: [ + // Color(0xffe9f1f8), + // Color(0xffebf2f8), + // ]) + ), + child: Column( + children: [ + DragToMoveWrapper( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12), + height: 46, + child: Row( + spacing: 6, + children: [ + Icon( + Icons.note_alt_outlined, + color: Theme.of(context).primaryColor, + ), + Text( + '匠心巧记', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Color(0xff242a39)), + ), + Spacer(), + TolyAction( + child: Icon( + Icons.sync, + size: 20, + color: Color(0xff242a39), + ), + onTap: () {}, + ), + ], + ), + ), + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: () async { + await _repository.create( + ArticleCreatePayload( + subtitle: '', + title: '新建文档', + url: '', + cover: '', + type: 1, + createAt: DateTime.now().toIso8601String(), + ), + ); + _queryScienceArticle(); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.add, + color: Colors.white, + ), + Text( + "新建", + style: TextStyle(fontSize: 12), + ), + ], + ), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ), + ), + ], + ), + const SizedBox(height: 16), + Expanded(child: table) + ], + ), + ), + VerticalDivider(), + Expanded( + child: Column( + children: [ + Container( + height: 46, + child: Row( + children: [ + if (active != null) + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 12.0), + child: TextField( + onTapOutside: (_){ + updateTitle(active?.id ?? 0, titleCtrl.text); + }, + onSubmitted: (String value) { + updateTitle(active?.id ?? 0, value); + }, + controller: titleCtrl, + decoration: + InputDecoration(border: InputBorder.none), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + if (active == null) Spacer(), + WindowButtons() + ], + ), + ), + Divider(), + Expanded( + child: TextField( + style: TextStyle(fontSize: 14), + onChanged: (String value) async { + if (active?.id != null) { + ApiRet ret = + await _repository.write(active!.id, value); + print(ret.msg); + } + }, + maxLines: null, + minLines: null, + controller: ctrl, + expands: true, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: + EdgeInsets.symmetric(horizontal: 8, vertical: 8)), + ), + ), + ], + )) + // Expanded( + // child: Column( + // children: [ + // Container( + // height: 52, + // child: Padding( + // padding: const EdgeInsets.symmetric(horizontal: 12.0), + // child: Row( + // children: [ + // Spacer(), + // Button(onPressed: () => showAddDialog(context)), + // ], + // ), + // ), + // ), + // Expanded(child: table), + // Padding( + // padding: const EdgeInsets.all(8.0), + // child: TolyPagination( + // pageSize: 20, + // total: (total*1.0), + // initIndex: currentIndex, + // onPageChanged: _onPageChanged, + // ), + // ) + // ], + // ), + // ), + ], + ), + ); + } + + void _onPageChanged(int value) { + queryArticle(value); + } + + Future queryArticle(int page) async { + setState(() { + status = const TaskLoading(); + }); + ApiRet> ret = + await _repository.list(SizeFilter(page: page)); + if (ret.success) { + articles = ret.data.list; + total = ret.data.total; + setState(() { + status = const TaskSuccess(); + }); + } else { + status = TaskFailed(ret.trace); + setState(() {}); + } + } + + void showAddDialog(BuildContext context) { + showDialog( + context: context, + builder: (context) { + return EditArticleDialog( + onCreate: (payload) async { + // 在这里处理更新后的文章 + ApiRet ret = await _repository.create(payload); + if (ret.success) { + currentIndex = 1; + queryArticle(currentIndex); + } + }, + ); + }, + ); + } + + void _loadArticleContent(int id) async { + ApiRet ret = await _repository.open(id); + if (ret.success) { + ctrl.text = ret.data; + } + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_editor.dart b/modules/knowledge_system/note/lib/src/view/article_editor.dart new file mode 100644 index 00000000..a1f5bddb --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_editor.dart @@ -0,0 +1,200 @@ + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +import '../repository/model/model.dart'; + + +class EditArticleDialog extends StatefulWidget { + final ArticlePo? article; + final Function(ArticlePo po)? onSave; + final Function(ArticleCreatePayload payload)? onCreate; + + const EditArticleDialog({ + this.article, + this.onSave, + this.onCreate, + }); + + @override + _EditArticleDialogState createState() => _EditArticleDialogState(); +} + +class _EditArticleDialogState extends State { + late TextEditingController _titleController; + late TextEditingController _subtitleController; + late TextEditingController _urlController; + late TextEditingController _coverController; + late TextEditingController _columnController; + + @override + void initState() { + super.initState(); + if (widget.article != null) { + _titleController = TextEditingController(text: widget.article!.title); + _subtitleController = + TextEditingController(text: widget.article!.subtitle); + _urlController = TextEditingController(text: widget.article!.url); + _coverController = TextEditingController(text: widget.article!.cover); + _columnController = TextEditingController(); + } else { + _titleController = TextEditingController(); + _subtitleController = TextEditingController(); + _urlController = TextEditingController(); + _coverController = TextEditingController(); + _columnController = TextEditingController(); + } + } + + @override + void dispose() { + _titleController.dispose(); + _subtitleController.dispose(); + _urlController.dispose(); + _coverController.dispose(); + super.dispose(); + } + + bool get editModel => widget.article != null; + + @override + Widget build(BuildContext context) { + Palette foreground = const Palette( + normal: Color(0xff606266), + hover: Color(0xff096dd9), + pressed: Color(0xff096dd9)); + Palette border = const Palette( + normal: Color(0xffd9d9d9), + hover: Color(0x44409eff), + pressed: Color(0xff096dd9)); + Palette bg = const Palette( + normal: Color(0xff1890ff), + hover: Color(0xffecf5ff), + pressed: Color(0xffecf5ff)); + return AlertDialog( + title: Text( + editModel ? '编辑文章' : '新增文章', + style: TextStyle(fontSize: 16), + ), + content: SizedBox( + width: 420, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + Row( + children: [ + Text('文章标题: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _titleController, + ), + ), + ], + ), + // TextField( + // controller: _titleController, + // decoration: InputDecoration(labelText: 'Title'), + // ), + Row( + children: [ + Text('文章摘要: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _subtitleController, + ), + ), + ], + ), + Row( + children: [ + Text('文章链接: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _urlController, + ), + ), + ], + ), + Row( + children: [ + Text('专栏收录: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _columnController, + ), + ), + ], + ), + if (_coverController.text.isNotEmpty) + Image.network(_coverController.text), + if (_coverController.text.isEmpty) + Row( + children: [ + Text('文章封面: '), + const SizedBox(width: 6), + Expanded( + child: TolyInput( + controller: _coverController, + ), + ), + ], + ), + ], + ), + ), + ), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text("取消"), + style: OutlineButtonPalette( + foregroundPalette: foreground, + borderPalette: border, + backgroundPalette: bg, + ).style, + ), + ElevatedButton( + onPressed: () { + ArticleCreatePayload payload = ArticleCreatePayload( + subtitle: _subtitleController.text, + title: _titleController.text, + url: _urlController.text, + cover: _coverController.text, + type: 1, + createAt: DateTime.now().toIso8601String(), + ); + widget.onCreate?.call(payload); + }, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + "保存", + style: TextStyle(fontSize: 14), + ), + ], + ), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ) + ], + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_item.dart b/modules/knowledge_system/note/lib/src/view/article_item.dart new file mode 100644 index 00000000..a8879bd6 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_item.dart @@ -0,0 +1,45 @@ +// import 'package:flutter/material.dart'; +// import 'package:tolyui/tolyui.dart'; +// +// import '../repository/model/model.dart'; +// import 'article_editor.dart'; +// +// class ArticleItem extends StatelessWidget { +// final ArticlePo article; +// final int index; +// const ArticleItem({super.key, required this.article, required this.index}); +// +// @override +// Widget build(BuildContext context) { +// return Container( +// color: index % 2 == 0 ? const Color(0xfff7f9f9) : Colors.white, +// padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 12), +// child: Row( +// children: [ +// Text( +// article.title, +// style: const TextStyle(fontWeight: FontWeight.bold), +// ), +// const Spacer(), +// TolyAction( +// child: const Icon(Icons.edit, size: 20), +// onTap: () { +// showDialog( +// context: context, +// builder: (context) { +// return EditArticleDialog( +// article: article, +// onSave: (updatedArticle) { +// // 在这里处理更新后的文章 +// // print('Updated Article: ${updatedArticle.}'); +// }, +// ); +// }, +// ); +// }) +// ], +// ), +// ); +// } +// } +// diff --git a/modules/knowledge_system/note/lib/src/view/article_list.dart b/modules/knowledge_system/note/lib/src/view/article_list.dart new file mode 100644 index 00000000..f4d09e5c --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/article_list.dart @@ -0,0 +1,196 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/gestures/events.dart'; +import 'package:note/src/repository/model/model.dart'; +import 'package:tolyui/tolyui.dart'; + +class ArticleList extends StatelessWidget { + final List articles; + final ValueChanged onTap; + final int activeId; + final OnUpdateTitle onUpdateTitle; + + const ArticleList( + {super.key, + required this.articles, + required this.activeId, + required this.onTap, required this.onUpdateTitle}); + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: articles.length, + itemBuilder: (_, index) => ArticleItem( + onTap: onTap, + active: articles[index].id == activeId, + article: articles[index], onUpdateTitle: onUpdateTitle, + ), + ); + } +} + +typedef OnUpdateTitle = Function(int id, String title); + +class ArticleItem extends StatefulWidget { + final bool active; + final ArticlePo article; + final ValueChanged onTap; + final OnUpdateTitle onUpdateTitle; + + const ArticleItem({ + super.key, + required this.active, + required this.article, + required this.onTap, + required this.onUpdateTitle, + }); + + @override + State createState() => _ArticleItemState(); +} + +class _ArticleItemState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + child: GestureDetector( + onTap: () => widget.onTap(widget.article), + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: 8), + margin: EdgeInsets.symmetric(horizontal: 6), + width: 240, + decoration: BoxDecoration( + color: widget.active + ? Color(0xffd7e2ff) + : _hovered + ? Color(0xffe1e6ed) + : null, + borderRadius: BorderRadius.circular(4)), + height: 32, + child: Row( + spacing: 6, + children: [ + Icon( + widget.article.type == 1 ? Icons.event_note : Icons.wordpress, + size: 20, + color: widget.active ? Color(0xff5b89fe) : Color(0xffa6aebd), + ), + Expanded( + child: _editMode + ? TextField( + focusNode: _focusNode, + decoration: InputDecoration( + isCollapsed: true, border: InputBorder.none), + style: TextStyle( + fontSize: 14, + fontWeight: widget.active ? FontWeight.bold : null, + color: widget.active ? Color(0xff5b89fe) : null), + onTapOutside: (_) { + _updateTitle(); + setState(() { + _editMode = false; + }); + }, + onSubmitted: (v) { + _updateTitle(); + setState(() { + _editMode = false; + }); + }, + controller: _ctrl, + ) + : Text( + widget.article.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: widget.active ? FontWeight.bold : null, + color: widget.active ? Color(0xff5b89fe) : null), + ), + ), + if (_hovered) + TolyAction( + child: Icon( + _editMode?Icons.check: Icons.edit, + size: 16, + color: Color(0xff4e5a70), + ), + onTap: () { + if(_editMode){ + _updateTitle(); + setState(() { + _editMode = false; + }); + return; + } + + widget.onTap(widget.article); + _ctrl = TextEditingController(text: widget.article.title); + _focusNode = FocusNode(); + Future.delayed(Duration(milliseconds: 20)).then((_) { + _focusNode!.requestFocus(); + _ctrl!.value = _ctrl!.value.copyWith( + selection: TextSelection( + baseOffset: 0, + extentOffset: _ctrl!.text.length)); + }); + setState(() { + _editMode = true; + }); + }), + ], + ), + ), + ), + ); + } + + void _updateTitle(){ + String value = _ctrl?.text??''; + if(value.isEmpty) return; + widget.onUpdateTitle(widget.article.id,_ctrl?.text??''); + } + + bool _hovered = false; + bool _editMode = false; + TextEditingController? _ctrl; + FocusNode? _focusNode; + void _onEnter(PointerEnterEvent event) { + setState(() { + _hovered = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hovered = false; + }); + } +} + +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第一篇',style: TextStyle(fontWeight: FontWeight.bold,color: Color(0xff5b89fe)),), +// ), +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// // color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第二篇',style: TextStyle(color: Colors.black),), +// ), diff --git a/modules/knowledge_system/note/lib/src/view/components/button/button.dart b/modules/knowledge_system/note/lib/src/view/components/button/button.dart new file mode 100644 index 00000000..a861394b --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/components/button/button.dart @@ -0,0 +1,41 @@ + + + +import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; + +class Button extends StatelessWidget { + final VoidCallback onPressed; + const Button({super.key, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: onPressed, + child: Wrap( + spacing: 6, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + Icons.add, + size: 20, + color: Colors.white, + ), + Text( + "新增", + style: TextStyle(fontSize: 14), + ), + ], + ), + style: FillButtonPalette( + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/view.dart b/modules/knowledge_system/note/lib/src/view/view.dart new file mode 100644 index 00000000..9ccda86b --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/view.dart @@ -0,0 +1 @@ +export 'article_admin.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml new file mode 100644 index 00000000..7b2a145a --- /dev/null +++ b/modules/knowledge_system/note/pubspec.yaml @@ -0,0 +1,57 @@ +name: note +description: "A new Flutter package project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.6.1 + flutter: ">=1.17.0" + +resolution: workspace + +dependencies: + flutter: + sdk: flutter + fx_dio: 0.0.4 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^4.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 packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, 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 in packages, see + # https://flutter.dev/to/font-from-package diff --git a/modules/knowledge_system/note/test/note_test.dart b/modules/knowledge_system/note/test/note_test.dart new file mode 100644 index 00000000..cbe75440 --- /dev/null +++ b/modules/knowledge_system/note/test/note_test.dart @@ -0,0 +1,3 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:note/note.dart'; diff --git a/pubspec.lock b/pubspec.lock index 96bb0c42..b706760a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,12 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + ac_string_ext: + dependency: transitive + description: + name: ac_string_ext + sha256: "267c8efd424a72840d41e9373cdaec2a07dc68fcffeb9da075006f77acbe7ae6" + url: "https://pub.dev/" + source: hosted + version: "0.0.2" archive: dependency: "direct main" description: name: archive sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.2" args: @@ -14,7 +22,7 @@ packages: description: name: args sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.6.0" async: @@ -22,7 +30,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.11.0" bloc: @@ -30,7 +38,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.4" boolean_selector: @@ -38,7 +46,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.1" characters: @@ -46,7 +54,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" clock: @@ -54,7 +62,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1" collection: @@ -62,7 +70,7 @@ packages: description: name: collection sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.19.0" connectivity_plus: @@ -70,7 +78,7 @@ packages: description: name: connectivity_plus sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.1.2" connectivity_plus_platform_interface: @@ -78,7 +86,7 @@ packages: description: name: connectivity_plus_platform_interface sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.1" convert: @@ -86,7 +94,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.2" cross_file: @@ -94,7 +102,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.3.4+2" crypto: @@ -102,7 +110,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.6" cupertino_icons: @@ -110,7 +118,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.8" dash_painter: @@ -118,7 +126,7 @@ packages: description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" dbus: @@ -126,7 +134,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.7.11" dev_build: @@ -134,31 +142,31 @@ packages: description: name: dev_build sha256: "933f14357d4e58da298ce2395e8271728dd90e8760e1c7677ca1d5fa065f2b4a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1+7" dio: dependency: "direct main" description: name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.flutter-io.cn/" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev/" source: hosted - version: "5.7.0" + version: "5.8.0+1" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.flutter-io.cn/" + sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a + url: "https://pub.dev/" source: hosted - version: "2.0.0" + version: "2.1.0" equatable: dependency: "direct main" description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.7" fake_async: @@ -166,7 +174,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.1" ffi: @@ -174,7 +182,7 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.3" file: @@ -182,23 +190,23 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.0.1" file_picker: dependency: "direct main" description: name: file_picker - sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 - url: "https://pub.flutter-io.cn/" + sha256: c9943dd7d702ab4199d199bc151a2d79c86db031a02ad84566dab58c494d2adc + url: "https://pub.dev/" source: hosted - version: "8.1.7" + version: "8.3.1" fixnum: dependency: transitive description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1" flutter: @@ -211,7 +219,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.6" flutter_lints: @@ -219,7 +227,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" flutter_localizations: @@ -232,7 +240,7 @@ packages: description: name: flutter_markdown sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.7.5" flutter_plugin_android_lifecycle: @@ -240,7 +248,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.24" flutter_spinkit: @@ -248,7 +256,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.2.1" flutter_star: @@ -256,7 +264,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.0" flutter_svg: @@ -264,7 +272,7 @@ packages: description: name: flutter_svg sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.17" flutter_test: @@ -282,7 +290,7 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.1.1" fx_dao: @@ -290,23 +298,23 @@ packages: description: name: fx_dao sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1+2" fx_dio: dependency: "direct main" description: name: fx_dio - sha256: c2a525ff6a8a70d9f39e26d335fac0eff1a605749b80affa50f9e2155288859f - url: "https://pub.flutter-io.cn/" + sha256: "480b529e516c1eb24bef3671761fad84c79e31384d393a7d1d4280d3dcfab2cb" + url: "https://pub.dev/" source: hosted - version: "0.0.3" + version: "0.0.4" fx_go_router_ext: dependency: "direct main" description: name: fx_go_router_ext sha256: "4eee6121b0c10ed9cf77ceafd8cca024cfaaf1777deb61fe8936ac7a7173961b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.5" fx_platform_adapter: @@ -314,7 +322,7 @@ packages: description: name: fx_platform_adapter sha256: "229d966a6b90f6ddb96913426c5d9f14552a17dbdd8747d23ce08065db94498b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.2+2" fx_trace: @@ -322,7 +330,7 @@ packages: description: name: fx_trace sha256: bba16febf583d4464cd5cae11bd19d441c82d9ca6a7d9bb71c05cae7379a619a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" go_router: @@ -330,7 +338,7 @@ packages: description: name: go_router sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "14.6.3" http: @@ -338,7 +346,7 @@ packages: description: name: http sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" http_parser: @@ -346,7 +354,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.1.2" image: @@ -354,7 +362,7 @@ packages: description: name: image sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.5.2" intl: @@ -362,7 +370,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.19.0" json_annotation: @@ -370,7 +378,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.9.0" jwt_decoder: @@ -378,7 +386,7 @@ packages: description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.1" leak_tracker: @@ -386,7 +394,7 @@ packages: description: name: leak_tracker sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.0.7" leak_tracker_flutter_testing: @@ -394,7 +402,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.8" leak_tracker_testing: @@ -402,7 +410,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.1" lints: @@ -410,7 +418,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" logging: @@ -418,7 +426,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" markdown: @@ -426,7 +434,7 @@ packages: description: name: markdown sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.3.0" matcher: @@ -434,7 +442,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.12.16+1" material_color_utilities: @@ -442,7 +450,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.11.1" meta: @@ -450,7 +458,7 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.15.0" mime: @@ -458,7 +466,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.0" nested: @@ -466,7 +474,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" nm: @@ -474,7 +482,7 @@ packages: description: name: nm sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.5.0" open_file: @@ -482,7 +490,7 @@ packages: description: name: open_file sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.5.10" open_file_android: @@ -490,7 +498,7 @@ packages: description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.6" open_file_ios: @@ -498,7 +506,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_linux: @@ -506,7 +514,7 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.5" open_file_mac: @@ -514,7 +522,7 @@ packages: description: name: open_file_mac sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_platform_interface: @@ -522,7 +530,7 @@ packages: description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_web: @@ -530,7 +538,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.4" open_file_windows: @@ -538,23 +546,23 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" package_info_plus: dependency: transitive description: name: package_info_plus - sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" - url: "https://pub.flutter-io.cn/" + sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 + url: "https://pub.dev/" source: hosted - version: "8.1.3" + version: "8.1.4" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.2" path: @@ -562,7 +570,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.9.0" path_parsing: @@ -570,7 +578,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" path_provider: @@ -578,7 +586,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.5" path_provider_android: @@ -586,7 +594,7 @@ packages: description: name: path_provider_android sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.15" path_provider_foundation: @@ -594,7 +602,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" path_provider_linux: @@ -602,7 +610,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -610,7 +618,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.2" path_provider_windows: @@ -618,7 +626,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.0" petitparser: @@ -626,7 +634,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.0.2" platform: @@ -634,7 +642,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -642,7 +650,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.8" pool: @@ -650,7 +658,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.5.1" posix: @@ -658,7 +666,7 @@ packages: description: name: posix sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.0.1" process_run: @@ -666,7 +674,7 @@ packages: description: name: process_run sha256: a68fa9727392edad97a2a96a77ce8b0c17d28336ba1b284b1dfac9595a4299ea - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.2+1" provider: @@ -674,7 +682,7 @@ packages: description: name: provider sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.1.2" pub_semver: @@ -682,7 +690,7 @@ packages: description: name: pub_semver sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.5" r_upgrade: @@ -690,7 +698,7 @@ packages: description: name: r_upgrade sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.2" refresh: @@ -698,7 +706,7 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" screen_retriever: @@ -706,7 +714,7 @@ packages: description: name: screen_retriever sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_linux: @@ -714,7 +722,7 @@ packages: description: name: screen_retriever_linux sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_macos: @@ -722,7 +730,7 @@ packages: description: name: screen_retriever_macos sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_platform_interface: @@ -730,7 +738,7 @@ packages: description: name: screen_retriever_platform_interface sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_windows: @@ -738,7 +746,7 @@ packages: description: name: screen_retriever_windows sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" share_plus: @@ -746,7 +754,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -754,31 +762,31 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.0.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e - url: "https://pub.flutter-io.cn/" + sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a" + url: "https://pub.dev/" source: hosted - version: "2.4.0" + version: "2.5.1" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "986dc7b7d14f38064bfa85ace28df1f1a66d4fba32e4b1079d4ea537d9541b01" - url: "https://pub.flutter-io.cn/" + sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f" + url: "https://pub.dev/" source: hosted - version: "2.4.3" + version: "2.4.4" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -786,7 +794,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -794,7 +802,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" shared_preferences_web: @@ -802,7 +810,7 @@ packages: description: name: shared_preferences_web sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.2" shared_preferences_windows: @@ -810,7 +818,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" sky_engine: @@ -823,7 +831,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.10.0" sprintf: @@ -831,7 +839,7 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.0.0" sqflite: @@ -839,7 +847,7 @@ packages: description: name: sqflite sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" sqflite_android: @@ -847,7 +855,7 @@ packages: description: name: sqflite_android sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.0" sqflite_common: @@ -855,7 +863,7 @@ packages: description: name: sqflite_common sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.5.4+6" sqflite_common_ffi: @@ -863,7 +871,7 @@ packages: description: name: sqflite_common_ffi sha256: "883dd810b2b49e6e8c3b980df1829ef550a94e3f87deab5d864917d27ca6bf36" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.4+4" sqflite_common_ffi_web: @@ -871,7 +879,7 @@ packages: description: name: sqflite_common_ffi_web sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.5+4" sqflite_darwin: @@ -879,7 +887,7 @@ packages: description: name: sqflite_darwin sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1+1" sqflite_platform_interface: @@ -887,7 +895,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.0" sqlite3: @@ -895,7 +903,7 @@ packages: description: name: sqlite3 sha256: "35d3726fe18ab1463403a5cc8d97dbc81f2a0b08082e8173851363fcc97b6627" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.7.2" stack_trace: @@ -903,7 +911,7 @@ packages: description: name: stack_trace sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.12.0" stream_channel: @@ -911,7 +919,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.2" string_scanner: @@ -919,7 +927,7 @@ packages: description: name: string_scanner sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" synchronized: @@ -927,7 +935,7 @@ packages: description: name: synchronized sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.3.0+3" term_glyph: @@ -935,7 +943,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.1" test_api: @@ -943,7 +951,7 @@ packages: description: name: test_api sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.7.3" toggle_rotate: @@ -951,23 +959,23 @@ packages: description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" tolyui: dependency: "direct main" description: name: tolyui - sha256: "103a1d4b9994d4c7b2db93aada29d647a84328f1aada28412ad5609575e0c28b" - url: "https://pub.flutter-io.cn/" + sha256: e643cbb496ba8478ba05b35f6475904501cf7afe62b7e3193f5bc70d420fe5e7 + url: "https://pub.dev/" source: hosted - version: "0.0.4" + version: "0.0.4+2" tolyui_color: dependency: transitive description: name: tolyui_color sha256: "410c378344d47a5f170e70a78cc1ac6a4f2665ea40f02c9aaa67da4072fde0e1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" tolyui_feedback: @@ -975,7 +983,7 @@ packages: description: name: tolyui_feedback sha256: "1a35f0c874d8ffd5a700a661ff60c4f818dec7c1c7b7e7f281a495905c838117" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.3.5" tolyui_message: @@ -983,7 +991,7 @@ packages: description: name: tolyui_message sha256: "4e9046d65d1a5f98f0ebd423815be683c7fbf637caa9e0bf88d83148b42764cb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.2" tolyui_navigation: @@ -991,7 +999,7 @@ packages: description: name: tolyui_navigation sha256: b7f10c7efc41228be3c3c2aed8fd64e80eeee0e7426e0d5af8b54d04a4243058 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.1.0" tolyui_rx_layout: @@ -999,7 +1007,7 @@ packages: description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" typed_data: @@ -1007,7 +1015,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.0" url_launcher: @@ -1015,7 +1023,7 @@ packages: description: name: url_launcher sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.1" url_launcher_android: @@ -1023,7 +1031,7 @@ packages: description: name: url_launcher_android sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.14" url_launcher_ios: @@ -1031,7 +1039,7 @@ packages: description: name: url_launcher_ios sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.2" url_launcher_linux: @@ -1039,7 +1047,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.1" url_launcher_macos: @@ -1047,7 +1055,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -1055,7 +1063,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.2" url_launcher_web: @@ -1063,7 +1071,7 @@ packages: description: name: url_launcher_web sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.0" url_launcher_windows: @@ -1071,7 +1079,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.4" uuid: @@ -1079,23 +1087,23 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.5.1" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" - url: "https://pub.flutter-io.cn/" + sha256: "7ed22c21d7fdcc88dd6ba7860384af438cd220b251ad65dfc142ab722fabef61" + url: "https://pub.dev/" source: hosted - version: "1.1.15" + version: "1.1.16" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -1103,7 +1111,7 @@ packages: description: name: vector_graphics_compiler sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.16" vector_math: @@ -1111,7 +1119,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.4" vm_service: @@ -1119,7 +1127,7 @@ packages: description: name: vm_service sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "14.3.0" web: @@ -1127,7 +1135,7 @@ packages: description: name: web sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" webview_flutter: @@ -1135,7 +1143,7 @@ packages: description: name: webview_flutter sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.10.0" webview_flutter_android: @@ -1143,7 +1151,7 @@ packages: description: name: webview_flutter_android sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.3.1" webview_flutter_platform_interface: @@ -1151,17 +1159,17 @@ packages: description: name: webview_flutter_platform_interface sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" - url: "https://pub.flutter-io.cn/" + sha256: "8e0593559bfecd35eb1757d6907ed6b995a41ef82607d6113df897c2805ce6be" + url: "https://pub.dev/" source: hosted - version: "3.17.0" + version: "3.18.0" widget_repository: dependency: transitive description: @@ -1173,16 +1181,16 @@ packages: dependency: transitive description: name: win32 - sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" - url: "https://pub.flutter-io.cn/" + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e + url: "https://pub.dev/" source: hosted - version: "5.10.0" + version: "5.10.1" window_manager: dependency: transitive description: name: window_manager sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.3" wrapper: @@ -1190,7 +1198,7 @@ packages: description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" xdg_directories: @@ -1198,7 +1206,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" xml: @@ -1206,7 +1214,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.5.0" yaml: @@ -1214,9 +1222,9 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.3" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.6.1 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9ac42678..11771b8d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ workspace: - modules/knowledge_system/artifact - modules/knowledge_system/awesome - modules/knowledge_system/layout + - modules/knowledge_system/note - modules/painting_system/draw_system @@ -45,7 +46,7 @@ dependencies: fx_platform_adapter: ^0.0.2+1 # 平台适配器 fx_go_router_ext: 0.0.5 # 路由 fx_dao: 0.0.1+2 # 数据库 - fx_dio: 0.0.3 + fx_dio: 0.0.4 fx_boot_starter: 0.1.1 # app 启动器 fx_trace: 0.0.3 # 异常追踪/监听 @@ -56,14 +57,14 @@ dependencies: path_provider: ^2.1.3 # 路径 # 平台功能 - connectivity_plus: ^6.0.3 # 网络状态 + connectivity_plus: ^6.1.2 url_launcher: ^6.1.14 # url archive: ^4.0.2 # 解压 file_picker: ^8.0.5 # 文件选择器 share_plus: ^10.0.1 # 文字分享 # 视图展示 - tolyui: 0.0.4 # tolyui + tolyui: 0.0.4+2 # tolyui refresh: ^1.0.1 # 下拉刷新 dash_painter: ^1.0.2 # 虚线 flutter_star: ^1.0.2 # 星星组件 From d3d96969d9145e72a42f1f6837177fb2a8aa043f Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 1 Feb 2025 00:49:36 +0800 Subject: [PATCH 129/149] fx:article --- android/app/build.gradle | 77 +- android/app/proguard-rules.pro | 2 + android/app/src/main/AndroidManifest.xml | 4 +- android/build.gradle | 19 +- android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- android/settings.gradle | 30 +- modules/ability/r_upgrade-0.4.2/CHANGELOG.md | 80 ++ modules/ability/r_upgrade-0.4.2/LICENSE | 174 +++++ modules/ability/r_upgrade-0.4.2/README.md | 364 +++++++++ modules/ability/r_upgrade-0.4.2/README_CN.md | 367 ++++++++++ modules/ability/r_upgrade-0.4.2/_config.yml | 1 + .../r_upgrade-0.4.2/analysis_options.yaml | 0 .../r_upgrade-0.4.2/android/build.gradle | 43 ++ .../r_upgrade-0.4.2/android/gradle.properties | 4 + .../android/libs/r_upgrade_lib.aar | Bin 0 -> 395470 bytes .../r_upgrade-0.4.2/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 25 + .../r_upgrade/RUpgradeFileProvider.java | 6 + .../com/example/r_upgrade/RUpgradePlugin.java | 105 +++ .../r_upgrade/common/DownloadPermissions.java | 139 ++++ .../r_upgrade/common/DownloadStatus.java | 24 + .../r_upgrade/common/RUpgradeLogger.java | 27 + .../example/r_upgrade/common/ResultMap.java | 43 ++ .../r_upgrade/common/UpgradeNotification.java | 143 ++++ .../common/UpgradeNotificationStyle.java | 31 + .../r_upgrade/common/UpgradeSQLite.java | 220 ++++++ .../r_upgrade/common/UpgradeService.java | 693 ++++++++++++++++++ .../common/install/BaseInstallFactory.java | 14 + .../common/install/NormalInstallFactory.java | 32 + .../common/install/SilentInstallFactory.java | 150 ++++ .../common/manager/HotUpgradeManager.java | 140 ++++ .../manager/IncrementUpgradeManager.java | 50 ++ .../common/manager/UpgradeManager.java | 591 +++++++++++++++ .../tasks/CheckGooglePlayVersionTask.java | 43 ++ .../tasks/CheckTencentStoreVersionTask.java | 43 ++ .../tasks/CheckXiaoMiStoreVersionTask.java | 43 ++ .../tasks/GenerateAndInstallAsyncTask.java | 133 ++++ .../GenerateAndInstallByPathAsyncTask.java | 110 +++ .../common/tasks/VersionCallBack.java | 5 + .../method/IRUpgradeMethodHandler.java | 13 + .../method/RUpgradeMethodCallHandler.java | 22 + .../r_upgrade/method/RUpgradeMethodEnum.java | 103 +++ .../src/main/res/values/r_upgrade_value.xml | 8 + .../src/main/res/xml/provider_paths.xml | 4 + .../ios/Classes/RUpgradePlugin.h | 4 + .../ios/Classes/RUpgradePlugin.m | 8 + .../ios/Classes/SwiftRUpgradePlugin.swift | 132 ++++ .../r_upgrade-0.4.2/ios/r_upgrade.podspec | 22 + .../r_upgrade-0.4.2/lib/r_upgrade.dart | 484 ++++++++++++ modules/ability/r_upgrade-0.4.2/pubspec.yaml | 64 ++ .../r_upgrade-0.4.2/test/r_upgrade_test.dart | 20 + modules/basic_system/app_update/pubspec.yaml | 7 +- pubspec.lock | 27 +- pubspec.yaml | 4 +- 55 files changed, 4806 insertions(+), 97 deletions(-) create mode 100644 android/app/proguard-rules.pro create mode 100644 modules/ability/r_upgrade-0.4.2/CHANGELOG.md create mode 100644 modules/ability/r_upgrade-0.4.2/LICENSE create mode 100644 modules/ability/r_upgrade-0.4.2/README.md create mode 100644 modules/ability/r_upgrade-0.4.2/README_CN.md create mode 100644 modules/ability/r_upgrade-0.4.2/_config.yml create mode 100644 modules/ability/r_upgrade-0.4.2/analysis_options.yaml create mode 100644 modules/ability/r_upgrade-0.4.2/android/build.gradle create mode 100644 modules/ability/r_upgrade-0.4.2/android/gradle.properties create mode 100644 modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar create mode 100644 modules/ability/r_upgrade-0.4.2/android/settings.gradle create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/AndroidManifest.xml create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml create mode 100644 modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml create mode 100644 modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h create mode 100644 modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m create mode 100644 modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift create mode 100644 modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec create mode 100644 modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart create mode 100644 modules/ability/r_upgrade-0.4.2/pubspec.yaml create mode 100644 modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 35b52b0f..6dba3de2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,74 +1,49 @@ -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' +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 34 + namespace = "com.toly1994.flutter_unit" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + jvmTarget = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.toly1994.flutter_unit" - minSdkVersion flutter.minSdkVersion - targetSdkVersion 30 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - multiDexEnabled true - archivesBaseName = "FlutterUnit.apk" - ndk { -// abiFilters 'arm64-v8a' -// abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' - } + applicationId = "com.toly1994.flutter_unit" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = 1 + versionName = '1' } - 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 + signingConfig = signingConfigs.debug + shrinkResources true // 移除未使用的资源 + minifyEnabled true // 启用 R8 代码压缩 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + ndk { + debugSymbolLevel "none" + } } } } flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + source = "../.." } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 00000000..e9ffa01a --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,2 @@ +-dontwarn javax.annotation.** +-keep class javax.annotation.** { *; } \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f72473c0..a413fb36 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + @@ -31,6 +30,7 @@ android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" + android:exported="true" android:windowSoftInputMode="adjustResize"> + + + + + + +``` + +#### 1. Add Upgrade Download Listener +```dart +RUpgrade.stream.listen((DownloadInfo info){ + ///... +}); +``` +info: + +| param | desc | +| - | - | +| (int) id | download id | +| (int) max_length | download max bytes length (bytes) | +| (int) current_length | download current bytes length (bytes) | +| (double) percent | download percent 0-100 | +| (double) planTime | download plan time /s (X.toStringAsFixed(0)) | +| (String) path | download file path | +| (double) speed | download speed kb/s | +| (DownloadStatus) status | download status
    `STATUS_PAUSED`
    `STATUS_PENDING`
    `STATUS_RUNNING`
    `STATUS_SUCCESSFUL`
    `STATUS_FAILED`
    `STATUS_CANCEL`| + +#### 2. Upgrade your application +This upgrade have two part. +`useDownloadManager`: +- `true`: Use system `DownloadManager`to download + - advantage:Simple, use system. + - Inferiority:can not use http download , can not click the notification pause downloading, can not pause and continue download by network status etc... + - support: `RUpgrade.stream`、`install`、`cancel` +- `false`: Use `Service` download(default use) + - advantage:Power, support http/https download, support auto pause and continue download by network status etc.. + - Inferiority:No bugs found yet. If you find a bug, you are welcome to issue + - support: `RUpgrade.stream`、`install`、`cancel` +```dart + // [installType] downloaded finish will use install type to install apk. + // [apkName] apk name (such as `release.apk`) + // [notificationVisibility] notification visibility. + // [notificationStyle] download notification show style about content text, only support [useDownloadManager]==false. + // [useDownloadManager] if true will use DownloadManager,false will use my service , + // if true will no use [pause] , [upgradeWithId] , [getDownloadStatus] , [getLastUpgradedId] methods. + // [upgradeFlavor] you can use [RUpgradeFlavor.normal] , [RUpgradeFlavor.hotUpgrade] , [RUpgradeFlavor.incrementUpgrade] flavor + void upgrade() async { + int id = await RUpgrade.upgrade( + 'https://raw.githubusercontent.com/rhymelph/r_upgrade/master/apk/app-release.apk', + apkName: 'app-release.apk', installType: RUpgradeInstallType.normal,); + } +``` +New upgraded flavor:(no support use DownloadManager) +```dart +enum RUpgradeFlavor { + normal, // full upgrade + hotUpgrade, // hot upgrade + incrementUpgrade, // increment upgrade +} +``` + +#### 3. Cancel Download +```dart + void cancel() async { + bool isSuccess=await RUpgrade.cancel(id); + } +``` + +#### 4. Install Apk + +- use download id install +```dart + void install() async { + bool isSuccess=await RUpgrade.install(id); + } +``` +- use file path install +```dart + void installByPath(String path) async { + bool isSuccess=await RUpgrade.installByPath(path); + } +``` +- install type +```dart +/// [RUpgrade.upgradeWithId]、[RUpgrade.upgrade]、[RUpgrade.install]、[RUpgrade.installByPath] +enum RUpgradeInstallType { + normal,//normal install + silent,//silent install + none,// not install +} +``` + +#### 5. Pause Download +```dart + void pause() async { + bool isSuccess=await RUpgrade.pause(id); + } +``` + +#### 6. Continue Download +```dart + void pause() async { + bool isSuccess=await RUpgrade.upgradeWithId(id); + /// return true. + /// * if download status is [STATUS_PAUSED] or [STATUS_FAILED] or [STATUS_CANCEL], will restart running. + /// * if download status is [STATUS_RUNNING] or [STATUS_PENDING], nothing happened. + /// * if download status is [STATUS_SUCCESSFUL] , will install apk. + /// + /// return false. + /// * if not found the id , will return [false]. + } +``` + +#### 7. Get the last upgrade id +```dart + void getLastUpgradeId() async { + int id = await RUpgrade.getLastUpgradedId(); + } +``` + +#### 8. Get the download status from id +```dart + void getDownloadStatus()async{ + DownloadStatus status = await RUpgrade.getDownloadStatus(id); + } +``` +#### 9. Increment Upgrade +- 1.Download [bsdiff](https://github.com/rhymelph/r_upgrade/releases/download/v0.3.0/bsdiff) to local. +- 2.Prepare two installation packages, one is the one to be upgraded( old.apk ), an installation package that you need to update( new.apk ) +- 3.Switch to the 'bsdiff' directory downloaded above on the command line, and run the command`./bsdiff old.apk new.apk increment.patch` +- 4.Put the` increment.patch `Upload to server +- 5.use `RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)`download file +- 6.use `RUpgrade.install(id)` install apk. + +The code is as follows: +```dart + int id; + void incrementUpgrade(){ + id = await RUpgrade.upgrade( + 'https://mydata-1252536312.cos.ap-guangzhou.myqcloud.com/r_upgrade.patch', + fileName: 'r_upgrade.patch', + useDownloadManager: false, + installType: RUpgradeInstallType.none, + upgradeFlavor: RUpgradeFlavor.incrementUpgrade, + ); + } + + void install(){ + try { + await RUpgrade.install(id); + } catch (e) { + _state.currentState + .showSnackBar(SnackBar(content: Text('failure!'))); + } + } +``` + +#### 10. Hot Upgrade +- you can use this id to hot upgrade,but download file is zip. include three file [isolate_snapshot_data]、[kernel_blob.bin]、[vm_snapshot_data].Your can use `flutter build bundle` generate. +``` + flutter build bundle +``` + +- generate file path form ./build/flutter_assets and packaged into zip. + +``` +|- AssetManifest.json +|- FontManifest.json +|- fonts + |- ... +|- isolate_snapshot_data * +|- kernel-blob.bin * +|- LICENSE +|- packages + |- ... +|- vm_snapshot_data * +``` + +- use `RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`download file. +- download complete you can use download `id` to hot upgrade + +```dart + bool isSuccess = await RUpgrade.install(id); + if (isSuccess) { + _state.currentState + .showSnackBar(SnackBar(content: Text('Hot update succeeded, exit the application after 3S, please enter again'))); + Future.delayed(Duration(seconds: 3)).then((_){ + SystemNavigator.pop(animated: true); + }); + }else{ + _state.currentState + .showSnackBar(SnackBar(content: Text('Hot update failed, please wait for update package download to complete'))); + } +``` +> At present, the hot update is still in the testing stage, only supporting the change of the flutter code, not supporting the resource file, etc. the author of the plug-in is not responsible for all the consequences caused by the hot update, and the user is responsible for it. + +## Android Platform Notification Bar +If you want to customize the content displayed in the download notification bar, you can do so, modify or add files `project/android/app/main/res/values/r_upgrade_value.xml`,add the following code +```xml + + + %.0f kb/s + %.0fs left + Download finished + Download paused + Download failed + +``` +And then.When you use `upgrade` method,you should set the `notificationStyle` param. +```dart +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, // 100kb/s 1s left + planTimeAndSpeech, // 1s left 100kb/s + speech,// 100kb/s + planTime, // 1s left + none, // +} +``` + +## IOS Platform + +### 1.Go to the AppStore Upgrade +```dart + void upgradeFromAppStore() async { + bool isSuccess =await RUpgrade.upgradeFromAppStore( + 'your AppId',//such as:WeChat AppId:414478124 + false + ); + print(isSuccess); + } +``` + +### 2.Get the last version form AppStore +```dart + void getVersionFromAppStore() async { + String versionName = await RUpgrade.getVersionFromAppStore( + 'your AppId',//such as:WeChat AppId:414478124 + false + ); + print(versionName); + } +``` + +## LICENSE + Copyright 2021 rhymelph + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/modules/ability/r_upgrade-0.4.2/README_CN.md b/modules/ability/r_upgrade-0.4.2/README_CN.md new file mode 100644 index 00000000..9d0c8d17 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/README_CN.md @@ -0,0 +1,367 @@ +# r_upgrade +[![pub package](https://img.shields.io/pub/v/r_upgrade.svg)](https://pub.dartlang.org/packages/r_upgrade) + +![](screen/r_upgrade.png) + +Android和IOS的升级应用插件==Flutter应用升级插件 + +- [✔] 跳转链接方式升级 +- [✔] `Android`跳转到应用商店升级 +- [✔] `Android`获取已安装的应用商店列表 +- [✔] `Android`获取应用商店版本号(目前仅支持GooglePlay、小米、应用宝) +- [✔] `Android`使用下载链接下载APK + - [✔] 监听下载信息 + - [✔] 取消/暂停/继续下载 + - [✔] 根据ID安装应用 + - [✔] 根据ID获取下载状态 + - [✔] 获取最后一次下载ID(根据版本名和版本号) + - [✔] 修改通知栏显示的信息 +- [✔] `Android`热更新 +- [✔] `Android`增量升级 +- [✔] `Android`普通安装,静默安装 +- [✔] `IOS`根据APPID跳转AppStore升级 +- [✔] `IOS`根据APPID获取AppStore当前上架版本 + +# 外卖红包🧧 +微信扫一扫下方的二维码关注公众号,领取外卖红包,点外卖最高可免单!(希望点外卖的时候都能领取一下,我会得到几毛钱的收益,也是对这个插件的支持,非常感谢!) + +![](screen/extension.png) + +# 目录 + +- [r_upgrade](#r_upgrade) +- [外卖红包🧧](#外卖红包) +- [目录](#目录) + - [开始吧](#开始吧) + - [1.使用插件:](#1使用插件) + - [2.使用打开链接的方式进行更新(`Android`和`IOS`通用)](#2使用打开链接的方式进行更新android和ios通用) + - [Android平台](#android平台) + - [1.获取应用商店列表](#1获取应用商店列表) + - [2.获取对应的应用商店上架版本号](#2获取对应的应用商店上架版本号) + - [3.跳转到应用商店升级](#3跳转到应用商店升级) + - [4.通过下载链接进行apk下载](#4通过下载链接进行apk下载) + - [1.添加升级下载进度监听](#1添加升级下载进度监听) + - [2.立即升级你的应用](#2立即升级你的应用) + - [3. 取消下载](#3-取消下载) + - [4. 安装应用](#4-安装应用) + - [5. 暂停下载](#5-暂停下载) + - [6. 继续下载](#6-继续下载) + - [7. 获取最后一次下载的ID](#7-获取最后一次下载的id) + - [8. 获取ID对应的下载状态](#8-获取id对应的下载状态) + - [9. 增量升级](#9-增量升级) + - [10. 热更新](#10-热更新) + - [安卓平台通知栏](#安卓平台通知栏) + - [IOS平台](#ios平台) + - [1.跳转到AppStore进行更新](#1跳转到appstore进行更新) + - [2.获取AppStore中你的应用最后的版本名](#2获取appstore中你的应用最后的版本名) + - [LICENSE](#license) + + +## 开始吧 + +### 1.使用插件: + +在`pubspec.yaml`文件添加下面代码 +```yaml +dependencies: + r_upgrade: last version +``` + +### 2.使用打开链接的方式进行更新(`Android`和`IOS`通用) +```dart + void upgradeFromUrl()async{ + bool isSuccess =await RUpgrade.upgradeFromUrl( + 'https://www.baidu.com/', + ); + print(isSuccess); + } +``` + +## Android平台 + +### 1.获取应用商店列表 +```dart + void getAndroidStores() async { + final stores = await RUpgrade.androidStores; + } +``` + +### 2.获取对应的应用商店上架版本号 +```dart + void getVersionName() async { + final versionName = await RUpgrade.getVersionFromAndroidStore(AndroidStore.TENCENT); + } +``` + +### 3.跳转到应用商店升级 +```dart + void upgradeFromAndroidStore(){ + bool isSuccess = await RUpgrade.upgradeFromAndroidStore(AndroidStore.BAIDU); + print('${isSuccess?'跳转成功':'跳转失败'}'); + } +``` + +### 4.通过下载链接进行apk下载 + +> 注意,在Android应用中,请确保`AndroidManifest.xml`中声明以下权限,并在6.0系统上进行动态授权,不然会调用升级方法将抛出权限异常 +```xml + + + + + + + + +``` + +#### 1.添加升级下载进度监听 +```dart +RUpgrade.stream.listen((DownloadInfo info){ + ///... +}); +``` +info 里包含的信息如下: + +| 字段 | 含义 | +| - | - | +| (int) id | 当前下载任务的id | +| (int) max_length | 所需下载的总大小 (bytes) | +| (int) current_length | 当前已下载的大小 (bytes) | +| (double) percent | 当前下载进度(0-100) | +| (double) planTime | 计划下载完成所需时间/秒 (需要.toStringAsFixed(0)) | +| (String) path | 当前下载的文件路径 | +| (double) speed | 当前下载的速度kb/s | +| (DownloadStatus) status | 当前下载状态
    `STATUS_PAUSED` 下载已暂停
    `STATUS_PENDING`等待下载
    `STATUS_RUNNING`下载中
    `STATUS_SUCCESSFUL`下载成功
    `STATUS_FAILED`下载失败
    `STATUS_CANCEL`下载取消| + +注意: 部分http下载链接可能返回 `max_length = -1`,请自行判断 + +#### 2.立即升级你的应用 +目前分为两部分 +`useDownloadManager`: +- `true`: 调用系统的`DownloadManager`进行下载 + - 优势:接入简单,无需担心操作,下载全由系统管理 + - 劣势:无法使用http方式进行下载,无法在下载过程中点击通知栏进行暂停,无法根据有无网络进行暂停和继续下载,适配机型问题等 + - 支持的方法:`RUpgrade.stream`、`install`、`cancel` +- `false`: 调用`Service`进行下载(默认使用) + - 优势:功能较全,支持http/https下载,支持网络断开后自动暂停下载,连接上后继续下载,支持断点续传,支持查询最后一次下载等 + - 劣势:暂无发现,如果发现bug欢迎提issue. + - 支持的方法:默认全部 +```dart + // [installType] 下载完成后的安装类型,详情可以看[RUpgradeInstallType] + // [apkName] 安装包的名字(需要包含.apk) + // [notificationVisibility] 通知栏显示方式 + // [useDownloadManager] 是否使用DownloadManager,默认不使用(DownloadManager不支持http下载,下载手动暂停,断点续传等,不建议使用) + // [upgradeFlavor] 升级的口味,默认全量升级(默认) + void upgrade() async { + int id = await RUpgrade.upgrade( + 'https://raw.githubusercontent.com/rhymelph/r_upgrade/master/apk/app-release.apk', + apkName: 'app-release.apk',installType: RUpgradeInstallType.normal,); + } +``` +新增升级的口味:(不支持使用DownloadManager下载) +```dart +enum RUpgradeFlavor { + normal, // 全量升级 + hotUpgrade, // 热更新 + incrementUpgrade, // 增量升级 +} +``` + +#### 3. 取消下载 +```dart + void cancel() async { + bool isSuccess=await RUpgrade.cancel(id); + } +``` + +#### 4. 安装应用 + +- 使用下载的id进行安装应用 +```dart + void install() async { + bool isSuccess=await RUpgrade.install(id); + } +``` +- 使用文件路径进行安装应用 +```dart + void installByPath(String path) async { + bool isSuccess=await RUpgrade.installByPath(path); + } +``` +- 新增安装类型 +```dart +/// [RUpgrade.upgradeWithId]、[RUpgrade.upgrade]、[RUpgrade.install]、[RUpgrade.installByPath] +enum RUpgradeInstallType { + normal,//普通安装 + silent,//静默安装 + none,// 不进行安装 +} +``` + +#### 5. 暂停下载 +```dart + void pause() async { + bool isSuccess=await RUpgrade.pause(id); + } +``` + +#### 6. 继续下载 +```dart + void pause() async { + bool isSuccess=await RUpgrade.upgradeWithId(id); + // 返回 false 即表示从来不存在此ID + // 返回 true + // 调用此方法前状态为 [STATUS_PAUSED]、[STATUS_FAILED]、[STATUS_CANCEL],将继续下载 + // 调用此方法前状态为 [STATUS_RUNNING]、[STATUS_PENDING],不会发生任何变化 + // 调用此方法前状态为 [STATUS_SUCCESSFUL],将会安装应用 + // 当文件被删除时,重新下载 + } +``` + +#### 7. 获取最后一次下载的ID +该方法只会寻找当前应用版本名和版本号下下载过的ID +```dart + void getLastUpgradeId() async { + int id = await RUpgrade.getLastUpgradedId(); + } +``` + +#### 8. 获取ID对应的下载状态 +```dart + void getDownloadStatus()async{ + DownloadStatus status = await RUpgrade.getDownloadStatus(id); + } +``` + +#### 9. 增量升级 +- 1.下载[bsdiff](https://github.com/rhymelph/r_upgrade/releases/download/v0.3.0/bsdiff)工具到本地 +- 2.准备两个安装包,一个是即将需要升级的安装包(old.apk)、一个是你需要更新的安装包(new.apk) +- 3.在命令行切换到上面下载的`bsdiff`目录下,运行命令`./bsdiff old.apk new.apk increment.patch` +- 4.将上面生成的`increment.patch`上传到服务器 +- 5.调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.incrementUpgrade)`方法进行下载,即可 +- 6.调用`RUpgrade.install(id)`进行安装 + +代码如下: +```dart + int id; + void incrementUpgrade(){ + id = await RUpgrade.upgrade( + 'https://mydata-1252536312.cos.ap-guangzhou.myqcloud.com/r_upgrade.patch', + fileName: 'r_upgrade.patch', + useDownloadManager: false, + installType: RUpgradeInstallType.none, + upgradeFlavor: RUpgradeFlavor.incrementUpgrade, + ); + } + + void install(){ + try { + await RUpgrade.install(id); + } catch (e) { + _state.currentState + .showSnackBar(SnackBar(content: Text('增量更新失败!'))); + } + } +``` + +#### 10. 热更新 +- 你可以使用升级返回的`id`进行热更新,下载的文件需要将新版本生成的`isolate_snapshot_data`、`kernel_blob.bin`、`vm_snapshot_data`打进zip文件中下载 +步骤: + - 运行 `flutter clean` 清理build文件 + - 运行 `flutter build bundle` 生成需要的产物,下面标记星号为必须文件 +``` +|- AssetManifest.json +|- FontManifest.json +|- fonts + |- ... +|- isolate_snapshot_data * +|- kernel-blob.bin * +|- LICENSE +|- packages + |- ... +|- vm_snapshot_data * +``` + - 将标记星号的文件打包成zip文件,上传到服务器 + - 调用`RUpgrade.upgrade(...,upgradeFlavor:RUpgradeFlavor.hotUpgrade)`方法进行下载 + - 下载完成后,将上面获取到的id进行热更新,调用如下代码 + +```dart + bool isSuccess = await RUpgrade.install(id); + if (isSuccess) { + _state.currentState + .showSnackBar(SnackBar(content: Text('热更新成功,3s后退出应用,请重新进入'))); + Future.delayed(Duration(seconds: 3)).then((_){ + SystemNavigator.pop(animated: true); + }); + }else{ + _state.currentState + .showSnackBar(SnackBar(content: Text('热更新失败,请等待更新包下载完成'))); + } +``` + - 重启应用即可 + +> 注意:目前热更新尚处于测试阶段,只支持Flutter代码的变更,不支持资源文件等,热更新造成的一切的后果插件的作者概不负责,由使用者承担。 + + +## 安卓平台通知栏 + +如果你想自定义通知栏显示的内容, 可以这样做, 修改或添加文件路径为`project/android/app/main/res/values/r_upgrade_value.xml`,添加下面代码 +```xml + + + %.2fkb/s + 预计%.0f秒后完成 + 下载完成 + 下载被暂停 + 下载失败 + +``` +然后.当你使用`upgrade`方法时,你应该设置参数`notificationStyle`,默认为显示预计完成时间. +```dart +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, // 100kb/s 预计1秒后完成 + planTimeAndSpeech, // 预计1秒后完成 100kb/s + speech,// 100kb/s + planTime, // 预计1秒后完成 + none, // +} +``` + +## IOS平台 + +### 1.跳转到AppStore进行更新 +```dart + void upgradeFromAppStore() async { + bool isSuccess =await RUpgrade.upgradeFromAppStore( + '您的AppId',//例如:微信的AppId:414478124 + ); + print(isSuccess); + } +``` + +### 2.获取AppStore中你的应用最后的版本名 +```dart + void getVersionFromAppStore() async { + String versionName = await RUpgrade.getVersionFromAppStore( + '您的AppId',//例如:微信的AppId:414478124 + ); + print(versionName); + } +``` + +## LICENSE + Copyright 2021 rhymelph + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/_config.yml b/modules/ability/r_upgrade-0.4.2/_config.yml new file mode 100644 index 00000000..c4192631 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/analysis_options.yaml b/modules/ability/r_upgrade-0.4.2/analysis_options.yaml new file mode 100644 index 00000000..e69de29b diff --git a/modules/ability/r_upgrade-0.4.2/android/build.gradle b/modules/ability/r_upgrade-0.4.2/android/build.gradle new file mode 100644 index 00000000..7842e40a --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/build.gradle @@ -0,0 +1,43 @@ +group 'com.example.r_upgrade' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + flatDir{ + dirs project(':r_upgrade').file('libs') + } + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 33 + namespace "com.example.r_upgrade" + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} + +dependencies { + implementation 'androidx.core:core:1.0.2' + implementation 'org.jsoup:jsoup:1.14.3' + implementation(name:"r_upgrade_lib",ext:"aar") +} diff --git a/modules/ability/r_upgrade-0.4.2/android/gradle.properties b/modules/ability/r_upgrade-0.4.2/android/gradle.properties new file mode 100644 index 00000000..755300e3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M + +android.useAndroidX=true +android.enableJetifier=true diff --git a/modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar b/modules/ability/r_upgrade-0.4.2/android/libs/r_upgrade_lib.aar new file mode 100644 index 0000000000000000000000000000000000000000..2eef399f4c7ffb26f32d979cf83b8727db58d111 GIT binary patch literal 395470 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 Z| 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

    tl0Fe&KHwL5Wa* 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%0A~l^Zj_{_4GmANDoLGf- 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 z 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 a0 zd0dp#PeQ#KwdC2YB1Z}I(#=M##FJ$?R1!EERX5KEa(H?WgN#>DnG%#WHo%3zArZEx z@~K36B@Qxih0&(CT`cVdkQ?66pgY7a3$-FYKwrxWb@^IK z+v+0r-IIhiOXTK9TX8gLOZOz#nuj@9b=!D(2Rx;YE6^L6>_`K)@pLkQ3)LEWwwYn2 z+Sj6$a#&4U12-tRtOTn(l7x!N)j^7(B=hQFc4hWG>a1w%q+TxMYiCz9E*XGU+tQohs zAI@}ic9@l|>y=x@trroBiSYG_DR9rB!PcRV;iw>E3Yn$? z%yTJHM+qt7Hk+#?Q_+2A=}}C@vYzXOPtkiQa!Wb)K^HGAr#@jyyO8(8$bpwscRRA_ zRaB}#=M{wQ_m3l?9h1!JlGl%&|7HK!!9oxd)`>HqO;sN|)7wv|wux;Z_1>%|K@Yg|hEQC5PSc`_kD}F2d*iZB;iI2x zZmOZlO0r9ihF@lWOux7KEk~@$Ca~I9a0xv9X)nG&nu*moM3=~yLNk5l)|FVctRU0NcHz;kmq3U(8`0dgo*ivo13P2Wi$P=x!dbd`&BL*hCf$+Wa zI!yhE-CYxJz7tb&&8jM z6u3x%ixjv>fr}KlNP&wK_?@J{p34N|^}j2|>lJ@{`7~q?`*KsVejbchDA?K**id!8 zlKP1VhYj^h@o)X?5bB}i%Ibg?wW0oD{OiBvvsvv1ENi z{X{qbRUv!x0j{H!+gg z7FPf}Re-8mJ^;8Xt)NAe$5ZB}!v6_bs5lN#CD#U@kB0h{{13Xtx4B08)etBpzlwp5 zxfa-1S7kZ@)7_qIo>f;jt@y%KGVlMl!S;Rm>%STEu9Fm$$Yo4MlBKj^ zX=f@8lsnk!p_<2v<9}UVw`>yeYVF(y!Muxfj3GFoW~O^E@KEc! zNdLPGbwbFsZCEL4m1Ba~Fn%rUW+8Lo!oWb?XZamp)eVGJ`$wpRr5GoeR!P_~Eto4G zQE}BkDk{6sz6XEj-pu>hyJ|LE=-m;*tbG);Y^XnbYPSX&!T$wwdhWdv0>Kt~H-%@d z-ep;hg?N>8d~PTWO1Z^UlLgW&=8~FquffmNC#mzoi$m&MkA=Ze$%c}odHlOfUq{kx zu=8Z0WF3K|cyNhF7mln$$#!d2YPi21oU3Gk1y@DrlbT0zp^kI5vR3n#O%C|ntj2ss z=1ZSw{y!e^GU3QS*xB4rzl{IECQ_y<4}CT&1y^S~bFDa(_#anL9!3hb!fzeZdLRGe z3brKHA+d8lY59|`569rk&yN&J*uqth54Ld+*#~Q2*5m+*=dSa^45}vXI{$NW*ZH+@ z*ZH+^S1lIqd>MDe2cP8{Rbp{#l^L4#kX`26q!)>`x~!Z@7+I|)61(Px6Xdo3fMcUzF#2OE>AjBU&^ZY>?G zAN(CtAA52H%a{z}?Jb#x>c@gP%FBi+J0+IAD$2VI;%+y`7c!N^| zZ*4dOBp-zZUy6MGmfWVQ*cE@D-J8t7**v@9?gsx^V{StmAEufbD(<~I0-5anQCNv6 z*^ErhG77_=n&eXBr{@J;ew;|b1#bOLq&h@SsVe+Vm%kA#_{Vc@VZ=&Zeg_&wJjgYQ z#Na>Hww-LD?Z+-|l^y(={tCC15%Fw=8*qA}F=&UD)Qvp;hyfQK1Lz~_NUGNRohxQg3;c;ZtZ z!8Nz{hb5I@%}v(rO2Foxobe6yKh6LP(l`Wq3Gb$7?H{rn7VA_!7kJKo+s6UULz2av zfgU13CPemFoAog>>@?Ntgz%4S>Ez(O}jGp@Lm5&p0{Lj3d* z$SGm=s#zpvw(waTPRf!WhI<>LRkUNEsC-DnCJ>K;l8q)ow@9RsbtDW$Pf5F&Vr2ch zI9e&{?^HZ-2MoWm%>C^MqKOT^FR>g8y_N)0io16)XHU35%*hh)C4j z*RzvudFUH6g?tms=R*sE?KenK{^L`VP1#+<-~D6Gzmb~nI({o#g@XU@qzd{sXi&8O zPn$kehyPvtxk!QEMhd(>UljZQk1F=39bGjoJN-AoqNBQ}#~AA>*UXUisy)#bOg2Xt zA_#qYNQ4Te+7LXCvxBlB*eawBwy1hCHe$>ysB3(BDSBJQqVpq--d?HXt+z!Ry(6wDyf~>b zp0uCoT%=TN7Zd5^(~)wq9R&2KmupQ_?IA5dq$ugM*juF%I{z@wL%TyP2UPHwC1S;K zU5$Yks7x`&pH)m>teVxRPmS1L{;}p%j&bh(KJ=Sxbnnd9v=`y0aSfYGYV9_wph@8_ z(#Dq#%?)5dz`7LFEzJ+;mi(TJ{BD-JlO{uQVsIj^U&Pz+Vy9MA(vrO9q=v6JTS1P!FxU~#Tav>aL|!!1GXg!IyG8hD?iN@{npaU^zU8K811t3U zM#E<#a&+LU{+n3~Nk#W6=Hg`xYd|90bj-1ju>G$=cS$FfK_S$Em0nCY zYUgaraO}e79$*SnRZPt##UiVon z-|3BlZ$4C91Tkw%6k%hQrW8Jzp-@!`yV&HnbW>mcg?r2-hI`K%ll^h=gaP%_Mh?K z;!okW(oYfZ@>D^iiWr;zuwXU`f|1QC6bE7y08Ij#5iERy{*eNdAwpZDFi2DwgMDT@ zHOU2|tIJ`LymhGr(Ut-y0GkR5Z*s0F-qFTnX%%|Ds$Ww8{6*bQ>%a_=QlV3$y94Q< z6m==kVZ`U4KSqGl_)gSC6zlU9`9y znO_6jZa;o8*l5~|3chE4bavE9L5Jq&$AF;AXza4o6xw{{F!)4A2PlE*sh(itM>WET z+=o;fW}<{TvNv2{JAq3?bkN>EK)5+X?^jwGuAWRwVSedJMk*GX6u852ZjAhygiBOm z5JiHRY@|EVqX4rboqV_xX<7`omWn`f^O?14r2@K}*U6+S&j0`|Gdb6md=VShmwtj? zr~21xuY+9MeGP|+CQuW6z%YUr-1{fJ#B9UC?ZJtkPITl59u`BjYTSGBrjt*1 z;ESpFrpuW(dy3oF8e-u!LB^;&C6n{-46yW`1~q_1R%7lIO%G#;M52gN+0->j1$t(n77Ad`TM4$+~m`Lv$=T!pa5LxysbKdYaX5 zM(N*SW>yw7$1H{LWt{+1ZSy#bfS*JfF?QUE!t$IxE={}ZoQG`C;zk+zC26>&}q6+_VVf#)W0S340j^@nzcFX4-L}LiAeNrSC zIU)k!Sn=1d0OpEFo+_@S#kA3)hkj@+L*))E< zCsIS;UkcwXwGb%ltA)qhttu8il{lmhNWSpFaJR#82i&UvN`c<(5o#x41MpD-N-iLn z7}PRBb1$!t0)Y=0p!hhT)92@xl2|Gmw)i@++IlY#^uV7l{%UOB0c5X;xn&I(%dqbW zzKZ{C8ZI6Xq*+3@m?_6GT+40Cg6QugqHFg-!r_3JMKtsp`l4-BRh3m}!0)Po*O#&R zeRJmn*GVeI3sZ08v8@AY|NPshNsi*+aPduTR8FvnC#StW1q{Qc*<xcDk(5=$7r1m;Di!{1su&X9N_ z=^2pBwi&xN*Q?-sWbn1@+H%aPip)OLDGpV4Ez(s~N1&>W?FV6_sv}WVJPCqLR7akw z^>7Fcx$wdHUjdzKyUswRLn3x%j2!Qc)Y6n1^Gi*bv$ch_?wnA&36*G7a$R^X^TyC7 zV=zI0e?S3;#4xmgKzovdx#SrrFsUak%b8&`Z>o9&0&d_qVJ?oc6GwAnY+PMhjb1nP zuXNWtpuFQtf#e*>76t8_d{jki*W;K&VVSd{@TF z+bOneo6=I%gJ7lWw0=9FoC!5Dg$v=MqI6@P5-Q!?R9LNGsM#s;e`?PXSP8hCLk|wE zLfr7mSih~+4D}l7Jf%uE%sqLMH?$9GH)zG6(TQoTGS~kit%e!?qv#j(TF4^Pxdy5> z!Kt90D}FMov-?0>9fU2ZwVepBcg@IiUDHOV8=AdvXCge_Us*zEZp}7$MR^7OZB=E*XZD!!^#?mvrL`&W@e_ zwqU-bf#3=w0i5K10sL;Xzf)q-p+u|z&}I8TM2_RF<<^mC^-GuyrhXwk%_D+)r1r&{e)r{TB z?w>T-cV3i~!LrrNevLU5G=K45mDC8Srn0H}aA(vBS zhU03>{1?7eN<%706f}Lc?`b7wcZUTHV~=Kpq+H=rQ4VdE%firsbr7czIN~RfbjEtu z0=#MboRUZvoK377+Anb4p-Y0F$BAE38<1pA+SpoJi;k}9H;x53z#!(UW0m`eHFIZ- zS;(Z!j5(~#72(Ua&STs*)p1hok8xZxAGQTE=T%)q+t!$ad!CQ7w@ar|h6&dM;?Oj3Bj2iQNRU3Nc)8m0OdlES*{1wI*xC&`1*_cB?_FD1xN`HyHw!HU2 zcP2cBtAZw8l06$@1GU@}Z2noPEuHvs?gvKbyn`*7U)-%UY9_(IOj2K)XKE2 zIo>R3`M%?~5pK=vg4pgWtqNCBv&Yq!Qkavc3hF08Mjc~sF(wv2zil`JZkYmx_L%_x zC1Cx9jUQduel%RK=FGWbuGn~EsTEy)tj}lFv0X(D-(uIqE?8T7_97c^43{p;^gD5K zpJV~vJO0-Dx_Y@iYEk4wY%RM6$B&qlD-p&O=FQ=1f&RG8>mswYtae?LP7%$!s@cOW zBG14?-!7yy?jL_|la6Rg+<4-(!HHj<@+P+Tz}hr%YDaCncw)!i@plGT(Hh)d+b$Uo zsx?!Y`+lzG!u&Q&l?!h&*>fP#vkZUS{=bpfE85 z7Badb7A{E5+1{FT3K^48O$+Bz04l~4i5=1mze%qh?oWsHD=+hjjvpQHh`LP?0#x>655B~n=oy`_#)jXq}8esz0JxrGgHsOTUG@oUa!}Iw7+~_%@CIK(<H@`L74qtea< zViHYU(gjYV6s~m=O~4wu54(o!I9)v4lK5uj4H;80SpETc=wt5CbEZnprhxn=6Tk~R zw&=0-^w7yuD0I=tJmpX#2T&LQcktF;dv3Q6?(Wgf&UdS$(oNGXS^dzQf0B zpQoh`<-y*48S90*D;b7q>m7- z(R&C*vzQW7DTgbNhh4+b=yqZf`Srm2!bIi0)i41wLZ%sL0NJGGk1yU|%3+$G+^9~% z+)npqk;ol^955m!y&o|2s$(h;DaG5FqPE4!k;c`seVM7<~~D!5@#jW-fS~<}w~_FKTl8)dSm9-m`IZ z_w(ltoYu*$dOP%M$k(-tk+o$%RQX2eTA>fuJBQ8=oIL*vbCH|UU2x>syJt_oH}b}5 z^gp)qWjZ-HSE0t)ffMl68X4@;DH(nB`E zK38$3@=7^lE809N<%q3SD`s~3uXc=_ zcvt7tskV6juJ_ZHyIC3e;8b~GA#36Lr3?*L*9R;XF_vstc#5!toDdskz@jvXSsNDS z(`PX(u&}e%j~TWIipZu?3dHPd9(s|LKb%mKR8p$~7WWq=`;> z|Nn!!JLZ`AM^~&)p7haK{d1B_(m;c#}`!9Rz(swTXy-O0) zPfweeb_ELKr|@9^pIlxyt-d>V-2(NKSxy(5=G0^DUPos-M@fx0GIhKWS1krWCv(X) zxKwqv*C*NmaAO>YQeHOW{H#*mygTN4YY5F_mGkRTNyyVp=~NSLNts43v%q~du&s0T!mHre~ba$S-gw` z8agVzWsHkQm~{$)F70`YY&FnaAV5H*2)^L84dEz=9!Eqg#s=|)gVP9Gd=_J~zjJ8K zz%AzGL&Li3AqOOZ5P+UQ?%dz#J)8t$Os)g1VN^II#olQ4Rcpyn!v83HZ2YI+1 zaKiGf31BcJvy5<~@Q;4s;zz)Ce|G#ilQ1KGWNos!5!rSDG$uVJ&JQMSHiVpK+`%$P_Jsmzr_=+>3`sw)H;(c!*@P4(8n9lV=A9AzML2Q~6AftI;=(j=p?+?DX-` zJsXF+3g>^Zb8Pbw{<7of$f?8U4s13lQoFj9-LC7u4xPHUcq2Nc9v5(l*b26Kh|Vl0 z$SUD@0GAxN|G3}jBw>At;EG`fFk2Yqr@g{sr9Lgy!CoUFbbtd7z#By@->_?w|H2+l zmyYAoG#pouZyNoe69xS}*oPC|nGa3A>w!-gx>mAb8cmR zF{fFW3y=4I1AU#-{WJ7+V#oXAy9N<;i*xy&~7eX zhoOz`cpf`oxVUq;`;+0~hjwJaXbO0@M@lgyrK=De*KlDU_eSBZ;qFbtg^fs%Jkq!Q z>?yRmjVXT%r-uu#VdsRJMLyrXo3VMMz`JOWy1 zO5(l$HX64rAhGZk_Z4;A{&xS@G0J(}*JG3q+e18;!FdDlyo`GSuElvz23Hz&oLEnx znTs6MZJB0!PIn;m3aO;>(3)YjL79ow2EK2PZ@b=_ni@s_n!u?I^)=SEeAgVA4)aW*c);;{djs zT29O8rY5PeXTi_uZ3_?JL>uHIsOqBBwDnd&uWe=@M4(+AtByTh$dJJd#uSHjHF5G@y-9O>% zJU95t*y)nq4^`WtPjC$D!`Voc<`iZ;oKI{YIov(Evukwsz{n@Xb0>Swp8Oc6^x1)~ zu}$xv9oPaz%DKMxO>CV#W*_Lk248)=dojLxW;dJ-;kPKa7kG5x(gDxXh#z82g>b-a z;SGpBsRcQnkI28rd0L*v*-Ed}Q)nG-yS~;B$Moqlhv9zqJPY$8gwu5Z4X6)m|CwX# z5l-X+MS#=zz)>_I&XQ+No5S;({;P$GZ5R)!gR>K6uc1Bg6w^Psu{(GW63`H|Qlp3!KcQ}8`Gd z&h5Vn9a_@;C+N_H7Y8QZDz5AEPSSMcJKmO8=iTAo- z!ha!p^nJVkO7wYI_gB#8bI10be`6z7;8^h#kC;G2Sd~|L_POQB!*OTVa5s*&4;dSV zc1*P7E;-A#;811cBu-2@0Uzccg}n!vNOaES@nTVTv+%**U=NYs{KPjA^8FOBJt$!xEHmA^OR-^r}HNz(59*J|r9wI~gxmx#w z-_>Izg#VI$@ow$bWG>U0oAZ~rnc*4Maj;{!1p;siJ?6R;gQIjUhqVdoT3XK{-v2L| z{$btKiJAWe|GD^ckpjQz6zIQ!c>fcxcm0>T8FkaI*s)~V>fZ#o|7)&PBwe|l!9JyO zg&61VN#aI@^9MGl9FF}2#L5V+F6@Tb;T5VjJZq73{{^vfq2F24PR_B=TVj8Wg4Y@x z+{d$tjsTQ0^nkF|t^umHpL?z%%x!qcfmWcS74Z$Z2*}iwnvEh)R>%kz@D`z(#u$}z zjhfFofQ-zh`2%fGIEC0U)-$>6V#;IIa1Vl35eVcluT>P4HX`3%(nS7j!B_R;h9WlI z5y#k2AEt)tO3H9!Gwlz<01kOta`u|vBmF_jqD=c5c_*dZU!ij09)&;tYnckk5*X@& z5~I>gtWLvF9aBCB3!|mnQr=&(EAga3?gftaOrAbl^!iwe;i2kRF<~99nMX3vjwPEP zNjBx74ofGs*$5T1o?b&9G1&21Q2%O7q|*)N*CxQu1MD%|FmLXxKxQ#J`*9rtn)tu; z8iNk*+=)-h))>58GUD|UO&g}&|Me`vDmcYNT(+s5&5CE*1d{>5zHzJEyu<5_>*TO_ zRS%1qTT;KthsEbRCs^xW<%sa0Kb-uK@Y6N~a+Esm7dbn?^X=&|KX`gnJU_h1p;@+J z%^9T!Y#f&@Tl-9lFgb^1DYxFL@L1$Ni!iXbv%XTdwZrG$Eu2H@2GPS;?`|j$gk?3M zj>eP-chKL3=(+<6|J)n!`QPUT9REMf27K{bb^r9GOKZ2^GJpOxSKb2l3EJipO?kxq z6XFjb1-Q)3yYr5D-??r6+`03=_taC3xI$fnq%cle3;4m7Z@<`-MbshKJKN{md#j>N zh)f9h`y@m|`5g>w5z@%VmXowH!ud?Zzyk7JM}G#=!vLa!!jIxB$OaW zJzk(OOr@I}mhxYI6d#i*#(!O!50m1uaJ;xX0xH(?BHOt!izM}%8?PqkuN)$3_xis}txUQfVK39@H9V80&Pk4&Fbc!-mm zt_tHa>A18uF|^s)y{QSIB~~l_D3fZoVOFlHW8JZpJ1Ag7(1*#Po&E~)@kl#rQeVGq zI^D%!nY?_2S5}U(_t^L9)qZ0>N;^xD=tTJWAS~56xcSj2k0~An@m%O zBC7viyKNeVes6J_KkqQoIQ=M`aHHc7PdL0mVb|tVBY?Am6a(~j;u*5m$!B{xjV(gu zsZF$BPrOvrQvqfXPBegeV`o~2`=f1j81Aibo^UfA8lU>%24;DoF)ipdR$HzS1{lQN2?wdyeuOME(K1q2w3ZlTA`3tJZUXqAcr z+FMAJ{u*QZZubT^Yc#v48*p?~f$gdDG)KzTx-l!d{+92|f7c0nQF{`1R#-M$X@xgn zxD_T4uBDv8mW=y`nLzQEEj(3v4ued<7mG`i6Ij*#IXdpZw!9C1GBCKomFz7|ScgmpY^Bp|E zN8UOyy3^UW!hZR5)UCle*KDK+13uUD?z!&c+OOyq4J;rv%c%xO3p*LWv>SVL;~jc8 zR_q^r?cnIZ0DNfGH%6Nf-IA#u5Dv6bmEvayUO2z&7iUkre0JcMFcgO9^hxjeJtt`~ zJp3kd7{Nq1();n*ldp`t)Xxr!-}da$1A9mI_Rwm$aSMDu&kmfn?$SN?m7c{cJh$mG zHw$Op3|aZ2Ry$br;4}ks9^GYvJt13hqLvOR7R*PMAN$72Az{=|CNg1X_TrN#03=hG zbkfdLK<06u6dBHZrpo-Cc~{+iJYw+Bd?_A7f`r13bb&yp=^#|Yth%OT2$gD{IRN|T z09`}j6jkP<C5!U&96dAME#UU{ipVHLvoSP^m3(h8oZ}(uwwSbG zDrG4K-+;m>!eB*3YWVZg229+&8&!aavSRPEfkWdT4j5E`@gs3D_BDpo$M5h9Ti>5J zxfhOQlWuTlV)uQ<{FPGU<{m$E2)<$-zt{sbX>l&AVIx;7Kd}=oXnkn!Al(6Aho_xC zxY%jxzkslKI;R<@wWH(v;d(gUy<>bI{0O9m+kF$Sb%~eUu0goWjUViS6M#4I>id`n zbeV0BZ+Y2csD814=SM#~dF$;b7N&3dqay`+odc!=%?z4~O&EJ|M7uaO-ekFT5Or^G@>O zfZn~y_`_P4h~dI6yuvY!@^04QP>54|xPZ3kYdBo^x%>}a6bEr=kM_T2-3o&a6TJU_ zrEXu{SH61foNK;&_4lq?aOKh~9-6uK^7S)rzU+@Lz5kN6)BZbN|EvFWKd=qnelr&L zXk6B7-z&eQi2pZZ5gXN+VPY~Xljp@>|Jx-;A0gE-^IJsN>bdRDzNR3q*~ ztKl%W9%xGRVw1zE5@}b^{VlN?CkR~kq+~3G!vt1edBjZ6qg`uNBC~kE!;ub-@EThf z=~s|ymYVh%XdS3trD8$%8 zV=13RiHQJYruabW)e3U?VcangRKU;#{c>gP!kL#4lLjA6xv&H-OJ*YrN?-SV+pb~I z+qB}(oStDym%Y$p2f+e*2LN?4#sdDF9UIGE9J}{AxR%^O1!`D_VTe@fCg~ik?OT9ooF*h(dtQDfp`tlc)dwlRm8)N zZE#J6-uN3r%AnrZ1b8?PqVUSHR}e;MNHmCae9|RV`Fc~nn4H?!X;^E~8Os-_M~+h% zD|pyXx54`rdd9VG`9$w`RaOX`*^%qZ>ueLtKn8JJX>sJ$nX5MOzRDM4rCPh@x%O*{ zvQe%-)Dy?HpkvHzgSRZ^RS}NMdAxt|2+ylV$@p*e6O+#CBv+sE$-PiGilCSa+e;>l zM!!>;F(6z9@it!MJBBT2Y)soWxZKXTKVSz4v&Pu_pU?Xl5L9@7e9zv1D>SZ)6Gx8n z&NBXSmv*t*49lPn@J2I!WG^whYM$ZG1_mUgXj9MlJ4bOpnxqXGaQ7A4;K&QZ$0C34 zh8Hfgm-x9Y!V~S{h9JNPOKG1co$#72LgmxW1TsiyA!#@?%t*gidE$B2_ic~;oSA)% z8Ct*Xav_E)ZORXQUST4-Sby$?0O*6m!UohVnS?G-{gzHA0m_G zAYTvC;YGL=;~RTT2n&;aAS63$GvfW;Sny6rMfc7%gtylUc&8F%1} z2M2F;rd_C;V2aElYHgw&M2KAbT~La9f}%d)`~N#Mi?j$VH8-y3t!246R-d=wJq9A*ic40bCt=ucT878`K{91iCUu z0;myjy(YO9`FlI^joxxZPa}S74Scu#kZK9uUY=@~LN2iS8~w8p{_(BuORlRsq5vfd zqk(7|{gXzRO|Jsy!bNN0)#&cyqgy^W-*uAlU%TEJ`QS}PS#Lpf7qL=CH@z~l_jUbU zqpU~!pC`VJyu~%@+{-6{q=M@X3_GJQzBBsr$L7@=Z;l-*$}Ok(c>m4l*s6^WqGJf? z0^Wqk-F=j~VKLYYahbu+TPb&cBC2}`=2Z*E#C5s42#|(70fAp~-RP2lG7;fFR_UK1 zUt+@G-G%lA#$Owoku^@>@1uB*dzD6qspvhRH-|yFZ?QGzk>I81lsut$PNRz*9`6AR z9Rn^0>>wyeqlDZhq$2Jh=pt_;V&LE=WK{DsplHmM$lRM!12Sh+bb6Q~G+gM#jNePwl=8In~Or0t}siekB3(f!8*4 zBAriRm(l4a0iF(nMibKWCcN~}higy>h!*tt3Zg!sEI@}H9=MIZFfS;G?D#MDkMG%K{_tb$^f8q8MzJP24eM0J~OM3FAKI~H2Hzy?g2`P5TOdc8u?_WXp`SX;2i=-wLu9Pe+xS0 zvAxfaZa-umc5fT`;H`685seoLE4Ocv01h2P?nmg*j|~^!qhy9C!2ZIyk6%Y_zVomA zT!cQdF4IC+!PbQghX8lz-(NBv!?(5~KE5=v^_Ai77c_)j1+r{^y)5?y{&H7P8pi$w zmb+Q&{yVJoKs=zo9yRAZcKMV$o-G%~yn|;YPvY z*IZud2nf4LoHKWE+Cc=ROu91;T)F57P?A$>( zB6BHt>2RBOuA_&YMy_-4L;LCIfjB|Iz{KZ6Xg8hha*O8PR}wIM7XDKVi|6oh#U_eP z7W#7bBn)MPu_G#;&&}8^GEV3dsF_U;y_bPk5x$P_q7F#Qkx`jg`p*7uVf1s{=nac& z=GX#LZbqI^-XU)#tY0B%{28}Qj(|9h%Q+^;k*)#nlc75HR)%V0=GejD;O{UUnXxBAZ_#vrIOuAV5oMJYrc#KHCgA)aD3Ng-sssp>lPn}ppUY; z={pIaM*)G9LxT?js5Mak6SRnsIj(uP$Srct)BQKfc1Ae*k)W6;OV~bGP249AI@!L~ zju(rX5*-&KK?nuA5b|3KrArTo5eAoR&FY`F9SD~Y1RWtDG1`cHBR2}X4x3$K!FO`a z33x7Q^L!C#%4>ljD)5scGZJJ+#Y9T9?cO6pgH3C*oh_IT=FkJOqOqT#7iuf`{r(#u zAyZmh07eK=PtowehT+4bPt-I3!A^DHkn_$CzRqj=vBRUA--AYf^wqwxQ||*fh?1qq zf$wf*>Z6Pe?CIMeq?wh!XM-;b*JLLm@c|NN4gMm^_rgAS5B}3=w^ZJ!Nosj?()F zlG%}J5*&mwCY>Ti55@w)4hrc{yC9LFO_AV==phi-C>V-r{SZ0WW&0+TNUn_KoToiHA2vwB^(<*9X~)-w5Y68K`cK*Px+EHM#a z%!yANHo((xt%MH;VGVGRY=Xl^j2H%CZMJ}J0iZx}(x71Vg|4Ky*jfxRa&=X4KGy%I zGJ^HjEx7RF;KcDAqBpak{r)3WX#kWUEO&zmAbK|}*`0<>fyfvJ)L3?<72CbTay6Yu}iryr=h z=J)Z>#h;55_)Vt3%RgZ(*@Yb@mTdp6bw_Yu!#d^FBWiFhG+_%{Gz96EHbhcofjr#^ zwNAeNyA1e}_%I2vVr&s^YL@g5<@@@lW|PfN+&cHk>rL!a;OV@%v5yh&7gu^g{NwM$ zKfX2o@on*sZ;yX`NBrYE-Qy>*JUwKH&U>qna2ig{Sc{9ixw2@#XjmL$&6<~Ho^}Ck z>j`wb&;uP@7@6qkf&6a;b+>X|rC|6ir>C(Ehz}ZWuYrmZr-%G}ZRX*u#(aiz+F)bO zprZEW|9f}=#wcxgoc+52uwZE*g~6k$IR}u1xpRZn-9^C$b1n2508O5J8g8r|$#xeI z$WI}TIEjcmFo6aWN*SOmOM8pGIrHGsA`NIjoYs5Jk;Q)7h0Af4!bI{``2&|Fi8~h{ zBwSZaY+|@lfU3Tm+Co|OjnbWmS{!K?`Afp}3zLy(e>BnYQ2TvJAh`kP0@=`mp@*&V zSb`?`wxKBx66ru0Rk{p!`(!rI3mv#w1!V!*<}KWWb4#91#3wGwVC{^?|6G((sd34r&Tt}W`` zFYia--&%=mX7cGvTDCB3LqY%rLO1KP0*xJT3-&RNKj$ECDJeT8*C^l~@gyn_n%7Rm zl@7+M$CnD$TAgX$K&Q&MWmYR)?IMg&Q|LpMMvUO#;;KyCNl7Z6fR;^GBBY|K7$`*W z&9a?^l?sr=n29xAUdAq)2?_OF>6vM10XJRfJtY5aXuNf{*LZ7?sCI<_aV2YEQOXf= zA|NPFhFb{!6^0$qC8u;X%TGFNdF`UREwOL7@up{GNR8_f0Dr+5#NIq@D$ToXRwEpJ zA4s<38}69x)z7WxDfJk1i`iw+-!{y8?gkvWh>7k^2xiELh?&!7_AOaZvy@r0j5+VN zFDhd;i{o)f)|yPVlqz3Lrj#b)Wl1k6MEd2b36FlMu#g-S8l{X87U_(DAbda$!-ad1 zoO@r2lq3hVe8_E*;L&Wp=(dJ&7q|P;_hA)i^s=(Hjo-Hg zuTlUh_kHJqjKf`4x(H!WiN}%YdeeWq#hgH6;{UIl_J?)X{`J)(SFMHR|2s22x%7X$ zWZm@d;^F^~f4cv48`1&Hc&L~VC$D$w;^Pen65zyTdTr3R31SZ1>=Dq)%OAAh@(|q0 zXyc8;hg^A#EQI3p`EUwyD-cUFPT%aS*2Ui=P>7Xf{jfh)JeJB%^mN*FFl&^K`MO(G zQW4%HE{cE^oKL$SLU8*wq!XBtDryJ;Ni=B)K^1yI7-y$w8zO=TMAWsGVi4CWbvlk@ zXvxvc=;&)D7^;SJ^8vkl#V!QthWe3sfGFuiz2E(VZOB_N<4%*7h0zy23yQeQ`HTqj zg7%HCych+vPsT-yiy#!pGP1E(Rr*@YXH%7fS=7p)76GkQDb#||!0Lkn{}RFP*Yd)? z&{MZ0ElbnhPg*BJ&7cuNKj0Q3ht0*PUM#t7NV70w!^TyzUrEs^`KF5jtwQk7ncdLu z8>bl97vSYh7j;=ul}LYP8_X3&7zOCXLjMzSIS*SBq=DE;A?^GCBYxhRBVc|I=NcrH zv0bP%L4M>gJX{ceORGk36lVs-kzSl#PQ$dqKH4||%7c~XFxc|vY&9~=XD0W}FPnCa zNqA}-(pAh@+^c@{oc5?sd9|5^OCs!aLwnQ+*_^V$xRs{$L1tWOqpBvEg|)Ww3`Sza z9)%efMivJD4jsU)Xp%6dWiY=!_5ZQ=?qOEfcb;bfS}I;Ly_t+p_iT5cByGS6lp0MN zO^l6*##W;dOgeFFbErBLN9scA0zx_+>QsS+90U(yP(dL<0dJs!A{Xu1n(2L>-Dh{O zXJ+@0-RbQer~;(encZieXXfd>%)Z{A&-Zsbm#V_fTpx*nbAIRh`(8ia&-e5FT;894 zVx&mxAoGul2668u*2!)F(-)-CpExHrh0ybJ&pr7&dXS z^1Rtv&NYhk^*Ii5n=`pk%dYZd?^Z2BwVlfQTC)h|g+AC)Au~wxz3XPwS%lc>+H6a& zMKJF*YY~iE16xm)Fg?9`a$v|zSk-RVjh4jHN<4Y8^eeMR1vrDc9Ia|Uqz!B42On%) z6E9Ak-YU%n*0a5q%i=98W?sW2JETrUX1SZ7ma3I%WNT}%VrFV9t*DS6rTLb%*TgGk zyh^@9av7h5QGrbE?m@wWyV0U7Tuxf8d><;-3+GdJ#(A@l!a6!;72#EZ%{AIFHr0YI zcXoy9y1Jv2EJn71iC(T+gNS9Nox*GOin&M)exXA8mgWc6-k;1oC_weHDNnQrcUm&A zRrp2W`=kWU6N&(KR%i(TVK0)+IPm!2j<4ayYS^~>OW=%C-1J8aeEzVE+l~JtA z5aX46*!`;1X{%z=#i*`{^Kqg&s@9|-2wTme zz8_LL7ZN4;`5pGr)E2}tlW9}rv?s!=jn{*f0M;yQiTa(KbR|-C)E#BIf~sYRwniZZ zgIBWx25Tn!|K&}OH(hn)$|tV4Yv#Yc>>phERP#T%cx1-Ep1z33zs5gU4mcZJ||S;AG9q(Yc)z zHeId_3LOzaz!MtexbN<=6T~zCsNq6)gP@@3%^To%MVO~?i7f+ki} zqOXV}p%j#)I3y`p(4l<1woY0r`JOf$VS`yc@iG-&U__CLcvGAF6EC?F>jgy>H5^0L zDovu#sa`f$<=j}o<+=HRq03@2*7Ycs55Pr;PK}tVsVGay;yUIoA8Xr*9|S>oDS%}* zId#}lgZbAq)(cU(fH{sd@jA5&)_G}j8ug=U4wHi$4_?#AR8N~JV@lUm@W^hyf5`O! z^>=@bQYJfV1o@9|*pZ2f%7sX&MxAXiX;sd=*=Q#p`P9fW6Z|yQDXZ0=R8N@)@PD_0 z4|elCLknU`t0k?;7-s!2Dq`%3{Evdpr%r5Ah}3!rXG5eeWcq@JLwVIQ!BbP6$;SGP z>KS#_MoR^saAwqDKt+T#s*Q;`YP4~=%tr!yk&R2hdc!U^AVH%q@c{G}R>YHxf2wVp z4z_C8j|ThJ)e_6B-T2VgA!RCw(zh!(n>Rl;j&4MAf#FNM zi~ha99nAFA3DCNL*?XvNv{u7zRLx#p1wu8=x$fYO3K{4*FJ{HNICEY^Q5B6Xw1^-P z*(FrRBrYvJ{^^d3ByKAc@O1%`cjpx1zot5snF9nY{OVbZ@Bd$DdZy`fzkk(zS1!Av z_wpakeB!dFFZnl@{J8nQX}<5`6Bp+%`llCtamL0OS4{ujwEub9wG{pL`)A;9m+w$q zn-Y-!mVqK9SNM6!GI>ZFRu!DSdvlM(=n0R`A@Qa%zyg9wN{W@aWrbCXyYoG50sWlk z#K7f2_iyj=Vtq@=>WR-?J3)tnr7N;$dixiX#g|;31dBz{Xn(IfPl1LdGI7%{fVk)0 z8*!=vvc4`Dv8G{le^2iFi0s^ki0Cr3@k|#LEk?JAksNss7RUWWY2UkYi}HvssBRtT zJ5PWZC3`99cUg-i>s1Ju8^{;u`#YC`C&-(t`{nVvIzk&*S^fh$d(FVzS5Ipn-SztD z+O-}n=J8{v-*|O&^KhJ{H+N@2(~(n{SgI_6V4kx*cNcECQ5u6qOMzv`oq6lS)5i(m zRc81Iwl3sqzqx!nO)o6{CQYCC1*Xdoy%h|h6J=~C^h#k`3gWU*EVE6%gB?{U1bQ*b z(i?iL@{}d;U*YvhI2qa5J*Z##Yoi>oK}1)U^_uZ`Y}TKazfI4t8@QLAhwSPAE21Y_ zikc&d%mPXzJhQkgB0`DIO46>!ed8eGF{(RH2SFkfX-kM?B~eQCgoe%mZMf;VL~4(+x` z^eC~q!#iD9{uX_@t@OJ_N?_vfR_*Oc&A+R}v*wP)hNdY4dpKRpnb~?poXUA(?p4dRu#z zX{0Bp!F8!MHsnG`ZO4*}LI=@U;db_7o4lRlZrPO{na&_PYxN`*x5|Am^HlV9q356s8Qel{U-XT{8z3^4nfO$x7gGv8T-wc@KQP z{QCqIUQ?QO^-ZqtIKAc7)9asfMht%?v6uL+yVC63G)HhS+sXB%&^~@RJGl4M@r|Qz ztsi^#L)X#FNr(H6J+*Cg)6TJNAD(?-^Qprd#-97Y3lZMua4(?%vB3tB8O8Aqe!l#5 zy7k!FyRW|KM9RIzLRka1g|{jySI#alS%IDW%A7>Rn%BUn0~)+B=Cm6~y*d=KYj`Nc z)8dX&#i|AC_#P!3pe6Xa7-zSzS`{Z6HzVHMB~HZLy=w&}^8$ zIJ~(|)8=>+qJx)|Z(>=#K6v%jH_cm(DeiGgapSjBbO#R;`%Az(rrnH2fyi|k8C&yq zAjJvIm4Q5;Tb`%5w9u^}xWtz$NgqN}%;!dS5fjHTwY<<;T%u565L@K@M`;4sFe3LP z{xLnWd@6}hhjP9kB&X}kFU}XAAkG+lE1)f|!=^~E4EtL}YWFDON6R-d(pi9~-4yQn z=LgpSxsv26CzW{wzjEMN!h9{b_uS^~IWPgwy*DJVmJE)I1@#^v9=RTtieL{x2qgL# zhmdnGfy0u9fZ^5gozH-S4xW0>BA9pP3~c?S;RJC-Mb5tjLX4b2(xJqZ9N(}riBNVW z!`~@?jRAgj$Tz-46MtmDa=_fJIWzo*yJm!oy1-39p4&r^Zxq$*J{d2=07i#Fzyo)j z%RK*Oaa&52vuigZip8)gnVWkQk_>CG)3bgJ@CZBAL3MfgWC_%8zytQ4-hJe{vpZh$ zPimgyegJ$IMJ8un82AVT7ppx1&Ep7f9CAF+SH6Lnxn=OWt8aR+h{UV&2-uDUjzvc_ zSY14p{KQA_Ixq=(u669M9EVW~cZGH7g0E9JCdMKb-W*Q^KH^lp6i5;gHIY+oyxtow z_Us~|714ZeFFOUA?&L)8QDwMZ<$lycTgO^`@(;_n3abut5T0#0B4LRSRewu3^u_W%M|HF7m7s(C}*ix&V zUzz)U8@5v}2&A^hUcmh#!d>AuZ)4}QU+sV{2p`(Lv?PZHeI^~X&z`FeT8nerNUlU` zdF|#Hhh=16l3@*_7NS5ueJOGS3s@{m%GWW#xr4vU!YcYT__PR$#m6VRr}UtXzY?)6 z$2Va1JAn|_a@4Xayh?V#reIoH(UCXBsOa3h4j=_J7pO>ESyl!w^ftlsFo5vc7+_e} zTz?Lny$*ynWVS5(0w08kVNycdpj(S67M4e-lkv2tw-CTr?kcx1(l3(?>?UK*ZMj7( z=sc&;e8=47{bV$gAum!{i=Y{O-%=7R330{NFrnC9QEVVquBDm*#i-F0QSCBp$;z;` z5-G~bRYpS0iawbJvl0_OC@owuRyrRBV1+r8H4)kX3?_P;3R_HilKuapX$x;|x4~zaoqNkAEBj*ms~xAZh9R?&Yh<(z3LVh}Ro#%5lSvGiid{xKyE8 zPnl_S|>R`~}}#xIo5}0xexRbILJLjS8yQwA`Bt$@jo{ zQ{E_(>J1R|WTEm&;n_d!?T2Z!pyBzMLRu6BmdPQyQ1QRtN?!POP5686vE)}PT@$QS z^?SC1nYw?f_G_}8E{R}030JbZlr6M=%F`9(sYKt?E5@M&)*jX7V~ig&PV|4d$KrZh zvOg)Lr+OZO^2kD!r<6<8IvPhp#Z8gqH2$25MY7WK&E>@MAg8{^rOe)RYwm8eA$Y>w zS?D9pdUra=7pI^6a$fK2ZU=wLs)%0>(Zl>|&lSy1j$c??x z8Jp$Dy1P=nw9FW}5J(kGdn$bVr$%16T$o$0A=S}jv5HG_vy(YWx)d#DX5sp|?zi^$ z8Zl^1e@60mc4g>5rf5%r)4R9N`ka*4aOjhDE2ILp5=>B*PC4Ft0})v5PNj0$$@xS= zRjLee2XDV*mXi%O2d;zs0Sbe0nihYp{cW+Uhj(XlCUf zw3ROfiR#JU{xz(8l^9aZJ?pRh4ga22KE2)(p=hKh{XgUa*Kh0Bv9#-cq@_LY!t%6B zH{N*Dl=pO0u%+cX{xiugS;gzb1`VA?ced+f6D`Que<5GUk^}}dXeQd zlg07N8$fUU%|iL3T5Njih{jdGO=_^djNGVTc2Mb<{;25?)}N8uFPK5v1w5)TCdc3& z9L4A>v~#xp>TT)e_MfmU^Yo5N8Jqjk*){9OHtajI|IIUd*L*1{S>+!ZOC}O4T4b=8 z*RgzQe)jJtZ`8VmCIS0DO^#}e3|)P*XZ@Z@ptGF2=|oPraqQFU%7#MQt+^$6gvI#S zP58fYr$>BAGK4<++6XBn%|CVjzqDy%(^X%*V(!eZTzYr&V<7(D%Y*+Ie+F-@pg?N= z=DM$%OUIwBX&6zCFM|ykcN!!u&zh3S~{7+5LP99z_9&c#{Cn$`IuMwJT-FDz*cSOa8sqrKrisriXSj zH*c9VO&GUUqBLB%yg)g$26J)?NjHw;F$lFNXysx6pTw%BP?X)Os4K_pkZP~3(C4PE z!K*4L#R%qkz*bKI9+|B)K;h3Dkk96;YmX4MjzI)0Dr~pa_J0ov5%NYNq%CDA~G0J zzyKKDF}i01xW8^a^xlR*3=4`M`qRo>R^;cy-SLWiDo1Fs{%FTJxCMQvHXCB!n=C!s zWJ_xKzB7hCnb?j}GYGqJrUvC&Q&xs|unQilvqY(tuT!DyhU?^u;=%duCz7r*gt2Cc zDMKQ4YNeZkFIF0fsduz4Eycn0A$NG4B;k!{>O?k*zP_muQ)Jc^YzpL-UTWDwEkmF3 za$r`)f*KiuKg>{|Idu=VRmgfm(3j`D6i+b6&{R(ENJCyrWIADCXCp`OKX6TV9Bwor zC1rxXMs{K|Kzq{DhS3yb4>4aOd-6DhPe3`D3JCVIz%NV+lf9l$Nu~z6(1z-S{7aKo zQA-l4$-}Vzu{`#JxM-Im4r`D2C(kh11Zu&}B3c0V(|_4$kyxZZooil$!O zw)@;Gho{hL?P5}irw<2Az?(CzN?`VNmy%b^?u^AcvN`*k7jj;V9~?H2?!kfcgWEBj zD|7i2aTv^)Jv5_2BAMpzJ?Xx-HAg$&>ma}dR z)^QH|x+d^?%NC+HnY(li2mzzJNxE0Z3SO_0%-W~x8Qlc>_S7n=O9G!xTu4mx1MWwV z$!~Wd)G#`{V{H4&r=NOnY%Oj9dx8r>4G4tKN!aD)SU0%5LZY4K+n@C8mN7R^BN#*% zu^M^7czG8NaBk8kw8yx}Wcz%6;#Et0A(C*9#m^EL&(XkDF6G^yJ+c!TNL3L+c;zfF zc!No*$WTD47HrE??M7V!uuX5E54{%>%nLb3KHYLiaIb|=!`G>3p&XF0NwW;hDu59o ztT)Zs9XsKX3Mqz~7p{9amLVVRtAm{|E5q*_t$uJhh|mb8wD^{}raj*;pAYUUxQg_V zswTiGOt|LuW)ihM;j6W4ZEv^rC<)EP%{EwLM^fNbt+5mPRJeUr1cW^DpUa{?t(5?%sdq z)#uK3%{AU@~h zC_8G2W63#IK6M1&IOW(F+p_W0aq^YD9{G;D|6K4`JM|$a-SEkQ15|kGqaCAfZsWt~ z#&>aD8{JeIeQGCPPyh1Bnb$U|(Sd#DPA6A44{y7^f@gE{S3{`LKlpxIM78}o^iyK=G6CWMlHFklD)!_^ISP`lD`sk@!|_I5cr z;Y@sOza}@J&=FV=u{Oc?Ng^7g{pX$MO|(~1ry)KqUVbu7Uh+9r18NHn-f{oRrx6%pn%_B z6s-`*0+jn6laBC)Bv7Hp92TJ^GyW^DJA61Ym zWLmuy`s(k6<#Dz;WHV9=<2I?8>jgh=A1+5ERe&;S7pbQcB|UByB)MxJ*-PjJ?cj|^ zz9gwT1!TouPC%y9nq%Phr1}a`pie}K}(ORzz!xbdH<1x{cQ5C zzDMn_9ek*Q*M0Mi>spgNQ7cPDvQuVn$k#H=nUUy3+oDQ>kZAkie=|V5HlfHpmb*~YAiomq zKFKbSOJtw#gF>%SKM_Ep|Na$n@~yHR3w#q~;&D>DAQH#xZh}>H_W;?!gzjVBu7z+WnESmldKvH$DtmSw zTSKQpFK&RG3So11=2xL*679nl7I#~>kX()YdpJzsCAR-boYzG`-vDj-Hf0sV4fSym zK8z%J`H_W0E5Vlf3XeJ_&@C1G{hPnM&Ou5fH>DJT^+;YyCo!qen@OoYV#M@%$^@Uh zLnJ9S4h$TkR>&m=O8PWsfsWZm)m78|f_Q{cSQg|dx{pX8I(La@ZAkR1hedQPHy!|!ID6gnrq2G$&hWa%~tf@WA6k~Enfj%i(9K*hK@m_@S{vL>w=Y)zgahyyTX0c#E zo~nW{#WtM6_4b27PT$=}M8smkz;i$9@1#zo{31+LrrSq;fC-||^JuUtyU|wm|Cvqy zQ`1!+UGe{3{#P?EyY#P`ufOP?>Bp!2IS>D{{WH)}nGb0^R$6AH@lXEj$4%xLE9Yx= zH^KY8guQ68wO)4?EZ#mmVuPAruFARyW-qwd64zqJdWvQoiBrYN_R5^oLhr~i)@voH zXVqMz>jiJ>E}!ygFa-Se0*emmWWWWoC!wc{?X3Ws(0t9{jqz5%8V#)0=%#I_j&G^6 z53nGI64{9VGkeyZ*|YxC;ipa=-Eiv2)78v*v{J66{8JxnIQxr(1{Y8woR!zkZePRw zeQf`;XO6!$dUT891f1TxarD>`g5ORZd6DZppXuPKt^?Q&q!camK{8 zC*;M5k7u`jL=$O?{)LDRb>6P##A$2>LWEN*wH6JEFIK$^A`3Hm^+zaYS)z z1;~l!2i6s15O%5dCq0J=tCG42wz|~Yvh;TJ~r((q)AM|<@5iQ)e zqgd0a%lrw#!0=U|?7RGUh%qqML*T3p#wZl@MSc>BR>tWdN3^n{hRYuhQ=BdziF^}I zkl0p;6+-DB^yp)GEDTa%h;%+;A3nkf;xG+b@bo~akJqTpLX-6~b$D`RkTsZlW|oL% z+C4_p@(xX@tw@yaIH~tQ?vWGEY93YJqaLBWc1{I&kLK3(E(&VPU4TnTmc^OB0`o-k z@2Qt`iEbzDhin85#U(afmCFNTK0sY$W44&HNi3{1x z)l~uz$Rx_i#MXS0PTJ8j1>}@^qz-`)`3}8(#6&1=-4E4}XjYi@Hfs z;@J~=bt2ckRfzt_8$MnOwP_qOsmSWW{vcRJ5&N@s8?E%7*E}p>krQlxBlOZ^EMt2z3i`BiN*H_tc4Uezr zTww@lm5NHYZW?LDVsa|$q6{(ukE#2`Eqq)HdRi&r4H?|EQh=!M< z0;r?@{hYL-tO04)>tBNupRAM~f@KJL8Uaims=B1RhL%f~3iWhLd+91#?(43i4h-c!Ik0tn*MUzC&=GRVzwj&wM?gQE+XLvr3kSxBc8(8kAKyNt-_Moa zQh(_dunp&4ePevvZfj}h09XtO97Aq=+b~HHX<~dw`O(m(xwQ;_y8=*9^Q?7u$MPd? zGUwhUH3|KGVPE#RawH~NO`Mb_I+|+1D5oMtp4;{I`DcgD?F4s%8OeJ5T*whLVLjE7 zWfnckr?hIN>j{=QpVB}L<9JlrYWV_(Z{Tel+CKivwKHd3C)YJ6P=Tm)7RaZQCrYD>;kpINahW8@E+}S8Bd($jz}L zZ_qal^b!XhKsCVQ1X+{M!?nboJ2|jFF5TFSDNv3oOJ>GANBWUk!p9>DccZhZb`}d}1e|rUG%UX!OrIrEuW%=NpL{0#ede`~P7ahuKU!;MP;j)$qeHK8 zOBy{wl9n>JBumxu{>j0oY>1dFUq36WB^Vu+#U(=Oi0z)aN6gB4_)$Efwx2A0#GIIE zQ}_SBHSLL}&wb~rUtIZ@SNzK>ZoYio%)ZP1<)#1UrN7<$Z!SK2(YYCw>CaH$vp>Jq z87O_B{1B*Bw+|MtZu;|#Ymu~%o&6mq9Atk$0~Gx*2N8kOAE^PTogV&`*%nzs62a1Z zr*MDx2>c)#{&2>$@iPJpAP~~Z_gXV|p&M#Lp(NlQUXbm|Owp}{<$}oQjw&WOb#D2{ zuJ&RVz?LZ>u8$(Yo#VOjWzh=OLPnOcCK2!yBBl8lO zqxL9s(wc#I3iV|01$Dc0m=?!|aoB*%RSf?K=SkQPKOHr94!knN7-KT9cT=O*43J>T zd$OKNf<{6t4#cAUW4pJX*$Z}(oIt9(6tO{v1zcTzKtOSW^Rrv7v%9UoqZ^ZavOAD5 z^$f>|k$3QvXe|)x!p_2MAzv>!F;KwJve+3JaG-c{G1|v4LGiBY!@~fN2^=c4U4>98 zbB%2)c9p^3#B<1wLbyj{MEggB!8-58nXthOn1~JL*8I@tsG@j6gRy>Q`MZq%n}a`y zM(_S@W>H~d=CP|{gS9!R{l$TY#BNq}7acE%5b@2aQ zwA#X7?FKA&AJ*5H-@wK&?}(FGgp-{0m>LH=j3)&?gZ{p&r_e4>P+p0+jlE6NFu&#W zsXwqAjS6WUxWt&tIC$`v%J(xHw*gpP&3=~{pOW{${FqycnI_Nu#@1hO1`ITn{PVGt z_Xm?3&so@r3Ag4u7wej*rwv(fTVZkDvED}Zb)+UmR}|>Q*}GMdV#H}k#?%b0ip+Y@ zO2mn+<-m%mFg2Deuwy(+X0#o6uzVl0bZx1hS<(y=ix3VF`(_KR;{?FQrFb40vXO`c zYz{32L=kTq{4096KI=U{b>f!;U=aXEse$|2Gw}W%O!s|DNruzD6gyLV-pEWS3z5u1 zK1%k9#)V0VLoInnE&BQ5aFMIa_cEp%2X7B!5)wiR%J)v}GkT@!ac&uaWN~g-S{gal zlN%WdN`9<7X#3#>X#6>H%@(A{xUOWpsV1=IbS?*+n;1ITn}C&+VWz8RW-xU`xWEI`%74h{uNim*=po0X@VGds z*I8KVS1k)|$2Ul?mv zkD+e0&@1bJbgzct_;K0P$Z^b*>8Pk0)hg<|ptP1!Sembc=%EZW62;mf*ZE~~grL4+ z4DZvG4FUIYZuvXR$PJ}g%t*Y)%-xx#5cY7qTiioQHoq?7ak7I>X%=wU;5dOZNz)?X z3w;to7`Qtf(mwPS9ydv@xVV4hO}+~NlKr#NVX%=L;Z$8C@4~h6fMM(Z@2v;YE zZ@j5|HyysEG?xya-}J`#(cN~hOUY`f<&YTk$-y;T(IdFxR5^sHIl1$t-O>VVAuJ`T z%ryXL20lPrFf_h%KQh=RCS7>7z7^o4f(Nkw5$VlN*O8bcW9?=A{toloXSz^Uuf z%D~+6opgL&>FTKCkxbHAMC*nB*K+&<`l2D&kCHIVrLRu+dn1Q1?F-yq={$9K$Jr4$ zP{O@u5muld_*wg6Ukz3U%s>F0n62^IqO;Z0>M&eLx$f%9CogDKa| z*rUGM^~<)UO*d-DI{me@bmq#H*~lE-p*Br-YBw{{@-e8|$AW#+$%Vi#31M)Z8@v zvK`m{mk5|E@ZIZT$X`S6#T7tlIhLT@a9R9O!{9~v)+V=rF2MS3`*sd(!@T9oXG{DXc z?dD*=#*^WostdV0;OD984C^xuwHm!=>r#bP?3QGF%!?gup8}&dAJu&;_nLI~@N3|j zMx}B@=bu8)Y-^(cuIFR+$!4x*g0&Q(PpM)P_skZ|Tx_{;6hKI|2QA%8M4 zPB>DuF@&&bkgWDk`mryu;nz7SPaQ}#my5blZ+qEbZ5K{ucO|8N{cxDIGu(K7dsh*> z$X0BfO+-s^wbrKN*4)=_ibk5tMXIry9(nMTU4sCX!Gwe7({~j~dHpY&&!V|{2YuS)!AeWnU5AWrE&kD{;RR?`U z`}$U|CU@Iyxikc9GBj^|K4|XH($|wRQHjhlbIMPf-rvN3pZ)o42L8j$z>7^L)%`P< z>ZTp~>9pUP9znJOZ@dh%->t+Z_rdzEtHEn-RB-b20ykzkSY4FWn1S6mDFZX3Qj!AT z#tG94+-Rj6rx)$MiAIH+xlU|~=?CuuI}T3k~QH0otnsMn1P7SHC}!5tqR;bFO=E5raSbF*_ZS4yQ$q*%1TRL1C`}3(?@cIJrRT3<;gMOQe(PK;~%a z>*-HWWz|mH6(DCLnoHHGjzpw}M45calnE`nBnh-P*>6^5Mw5&z`V=2hnyILThYGzU z?@2c^+eTwsLL%CnsAN?-2OKy^fg{SCjY+h>5EEjZG!JB6@N<4q_kymrINbs<&xX?b zQ>y^G9Z(mYg+;5D7k+l@?}djQ-R&eM>Yx+KN^&28cpX2B0eyp@8THV|(t@OiRjn<( z0c?k5H%>Oi#24e0hy~|3Uq~+O_m)=BQhVawL)2PLaw+<@HMIB49DA#okz-X@)zunp zI!kULR-r}-RMm{8n$54wgOqevzY=`3V4cXXDzwdxlD*IF#7_*%4Htp7UIel0uea-| zy2Nx_rJl~au&8^se^+KN1@5ezbqo7`nbM6Qs=w~tAifvC9_~=S>UuMj)L= zshPG$H&Z9)s^Sq*#;nTrsw=e~OU+eQa;jGSxE3bjygqGkTulQsffg!VRZ8%yPJ3h1 z9&3CuV$swk1Y;z(J0}TZh*+!Dt>AjPd1v>^t_3=>QvB7X2hL-!dv=`gcHr&Rl{{2f zUdZ=NQVrax&^2*A4=KKTDO=Jz$yTtXjtr3MXwI?+ znS#eRo_(y<^Keu*$b=Kt-!xfskjc9G#8Gd}ePd3{CT~cODft|I%Iqa>e4m^4Pn)h< zbJYwG0B2tQ%*_3l{qdzoF8S}9Z@>8HMgQZBWz+u`e*Wywe?~J)R{fMI{Q3f-PI@vRmIqdl!>M93GfiAUJTyl_%-2jrTCR&Ue)(& zWBF=P5pXB0>!#&ZI1lD6cYeB}LL@=+_XcjUY4~S<@Z+W^)q>&X*>*M8>6G6RV@mEY z9=I60edCJbM@RKbskwL{z70ifX=V%&uk=_2$NuKuUF)H!|8&idn@I2IrUaUe^?Tkb zUQTjUlHYkgx1?YGdn$oCgd2uOp4tioeBPP(uP+gr)5`9iWw9-3DV}?+-90!8_I2ae zDqrh%1ZLt*848|T?wc(4ay#w?E0`er2`vi$Ap|S0rAI!_^0zInc7>|<;$N)WjH~*; zSXZ(B3VAT|7rT8z>)q|!)RMU@@R%37qaf$qWofazptJJ zx=mOl0i2zr=*6)qSQ%`J2Z|M3{G0P72UyEeekYNXc%+5Nv^i)qOm;@E`K={+o0Qbz zO5UG<&^1+#Ays#FFM!NbetAoZ?Hxb>+FHl-?SpNq;L+c_U|?=c-w&BjzC77dsd|Hd zTOG=F7ykOiQ^T%L(~f9&X$3!ea(>LWK8U98Pdn(vG>hS+mc}!_eCeXzctqNSCDf8O zv^=sG=>cuBFtP^J=< zz7gyk=o>2UGcpe@gb*)nbEB3BDLakA5r`}%Ke2LCiq4^I+Ga5T8?^7sdw?SZO-{d2 z8=zJK2W-jRC#)<3I5x63AH~|rtu|19AJt%MF|e$Hw|;XWMf};dphf!5mZRHF z+I+YxQtJGT$)BNtuvPHr4WD@%bljTJ@RZoR(Z4x$x|3xU`TKBl6&(4S3j_DZuiT8h+`_RPr5xUfTDDN1$X=A8;Ru-aGJKq0`~@WY9HAJ zHy7inX8v-BHCNA8IF{JHm8{427j#H?mUnlOHMrQ-+R?vCo~#6wSma6M_iZkv#`Qh2 zBzTh=2%@S0MQt^|B;>CZWG16?fNh|?Pzf-D%3vBQia5J~?}SB_Tg4WHAKK@5Tlff^ z;N^-Q*t|k%)Rj;fzO0TNm}c-Ek@CkCLI;{3C_QEqDh3}-=qhzTjK?OUF=0ogrYypM zr^xQKm`Xn~ZBjGUOr5UX0eESVc%Lj+w-K(W5DC!y&4Dk+RLy;Gu`~jXV33RCiaG=w zmo##ZLvJRh)vmeyy`^g_xb%Y*;4Meui8F{=68*u_0%@Xqg!(1|4GhHw6!GnJBI|^K zqdYV>hrYQ=c@CxZwW7u5{hm-qFPMB>6}#F2ObAeL;=T&_5#_01LZ8C@la1Zv6oP)D zjsTgaEY`p_tSEvPVQ+Wgf?#%8%b^|kbO(5U>Zlm+vcf70VRGges<5|=OS-FqM-hFe zLL5Q!ZKVY<9a<4d2!S=LzvQ1KfmpR9?UhZL_`G-sr;23^dwohoH(%G)$cw#-;p>=6*fl$5GEx9{dOgs>joDrx(!vyn}P$}qstU*VfVjkUv4NH#ivX+G-NTjw&@Z=m^~x3kaCXxO-B}PIkyqosU+4o^uqCH3HAr@@ z_0)sYs_G-IEUG|ZXxMz_-rLp9u%bF_{^kGwxuy@AuDb8aSFbpF`5(;u2bZ0^^x&l} z&HwJAH)j0rGk$aW?@Zgz&;RND8R)6xA)NceCHFi>>)qI7+AQ}SoACRdoKB#7E7-}3 zkb{0q1?3m4hjma*0btLeZ01`uV}P=Wwu6%6So&wQlUC_WHZG4|j6LScNAP|6KdtV#f{LI+VXJ}gmhJSHp*Iw;9qOG*&Mu*pp z4!?fpt$m~GH=f<~0WgK5o1f-G)X$RGI~5Wtb?WFVlygKuLLPl<;to*SU z6QNTQ-Lh9nFGnO6Ilp}#mL$@KGE(}0QjPdtiI)g!1c3{9t_YToP{#KOjwCsrz_u*pQ4n5=qpXUO{CGnh z0<(8MeT}J!s(;zEWO73fRQ^6o(mVXyF*TmpeBvF0I6D?V-+;_x1V{J=GG7u$dYIvQ z#y~PaR7=~60=>XWvQ&LyH`N1uMxZJYrhGmU9XEn06Rep}9%+WulS2R!z7WwHkcbCNDl>?;xDz&&lXs$CV-|8t?5!P!0UqwF zl}EHYW(>LlL)-ksZl=P+k5go$5vV8X=ErN&({R8m)DDNXsu)4i(-e(Q!VJ_%=)Z6g z1-)l5d31qAv&qtg@$G|bKm6F43d?{Nob1+wdLXQ-IBV~3ta7p)I555PBX;230}i*8 zQK@p~E|AH}Zla4k&bSVzh)y(J(fn4fPtpCBnGSkA$sovM`en@BQ7lhJhmQ17vAC`%$xz za#PD}txcUu=O^LGDCTNXcG~Fvr1Ap>H*etD_;gER$rJoE2mh%>>hva;2a^W z5r>~6hF?wW0wD0UeT2^wS+7))kg{og)Hb+q{3mES+9tgIO-c&-&#~ab14ZP=f&2!7 zw0mQ~I5N6b|EMdxW3-ow<*#~kC^sIEn&R$zEPs3DVW$3(lII-FN@#H%>|$Y5Og+cDqup?;~dh@rL* zJP=cPHO4?HRahP5rdq4k1-K6-; zP5>Q%Y)6`}4Rtq&Dj$5q;1PD790br0WU2iIhOl2y3|ZqQR}7G-#$E(n53mJb7J$$L zdjWt25EWhzAPkP)Fi<{yXz1j?M`u0+TJ98MR6iiS;NEGFi0W#9t_al_RF~CcYo`1ERnz7-UDbc(p)3C3<>zPqtC=${ z`|>4!b;nP>(|ca^!6gC%wU)lF~AlgA`zMO{)l;^_iPRevkz z;SZHJh%_WJ4;7aPn87_IbKQ#{$6%BOQ0nv()by98hwIICFL77QsA4QwC{58znO@W4 zRM0prAv>2WOVVWZEXiY2<)c+&PEOvD++w^Rm9ZmLe@hNmJ%q5O`96D^>6*HY-UwYs zuC)h;B3{P!iW_detH2;h{9!p%q;2*0LevWhJ9ySZ3Jna;eHbaETNQF|;R(0)3hZkM zmI0}HTTH83>Mf&gnEuVR*QRF@B{QioG?B}g$a{suqzoS3*xU!0zhxkbfu=;-3)%D} zW`U_B4W>T!BvZ%ZdHua8@|L10YInV#GBfbp;GLwwD|V(^!vxM;qFyA^2B}#X@A(6%D@s5d?DA_bIUVe{)_@4h(t(uUk30Z4_~j&DD8_=wUDuNgS|#S2Tgc9tPQQ4V90rkot7Mvu(vQlI((N0E zeonVfyv+TD>!n?YxZWP)_F4NVjSEG2P{bXY9b|KX@n=BL`CZ8h;;ZdDhAEZBqO!|m z4}joY*GLXvcXY07T$An6YW)FA3@=o>7M= z;9%%Lr2F-gf$6DK0rBp_Q(>654x{!v~HV0(uLFHIK_wxD(7J29Pb3?n&z4~Tuk-$h3Tu|i4^IP{O_*CI16#^Ui+{Ocl z*uY#F>Xl=L8qU?T2hQzK9~~GgV45DxIUtrGMq?;tzn|P*=EgpK{?ILqE|Cfb5tXvI znz7tb`;#GvY6j}MUa{SgWTLFA5_uxnVgws-jU_Hc7*`t&&T0@T3Er?s0$5cqkW(xz zIsCz}u!Ls}GeHcCrJw3ofEP8ULHP&@^!3q?$OOAh0vlOg_kU<#O&Akq7s4K57TD10 zhu}*E82#GGlF5)E3wn^W+>h+NPAgoCt!6qh)|(Ag>fT!<_YbwT@0Aog5MegH(o-`4m9psAhiTUz*;8e;9!IYPs-!D)}1Ck?%@ z;hEz`vco~eM=0q})zU}M3{YMBY?I>|JvE*NMkmWj z4gzz{5H9Cb789{*LXNfy=L%R_Yv5@CLUdIaYK$mKV@765l16&7kzHN(UgWZ3ss32C z2zN9Yy5(Rb=B0OTp?6?m8D#~mZU%!lmS#|#^K7J!o9RMeSD_#TO_Dok#7KM+@q#RA z@5Li`CQjhHZ1DKj8K5-cDjZzIo3o`}B(5z1Q6x-4iiejIqs~IfM4nz!-cu>BWF-+p zAe-AN4arBAhG%9oY)e z)>VsNk}k&%$2uOFNW6WG30Mje2__B}96 zT|9F!Ed5#Xm07#So_=NQ+4sQW#O8&FrE%M``zsR9%^s)b?EGlU!M6$GFV(jRV~z#(h#y-T2MUm(Titxl^v>?WKm-~cOlV50HA}Hlu;B+ zzkBTh`d^FinU>*d;6GD8rlmP#ABArzoD1^9Usk>^R5;c|R!Eb`RTtV?{VC-Na9 z8SU5{(uH7|Au*JTi!OvAHVO;WKu2BD3P7Ps&*RB&4u8B(Sfeuj$g=Z(g7`|UK#F?q z9ERgYqL4EOz*DO`N`J$mdfaB*MIH$x!2z~_r@C>vq~2@BoaLT^+Ew;s*c?0_ zPkz#Zppc+Y&F6R|;TESxHe9bR5<^mW_D^wayj|XTKf4y+3X9pF&9__iNWn}B!pa2W zJ(j#|=TjJ!eRk-q>JkOM;PAS(Y@HhzkzNDN8`71k1gRd zBOrFK-tYBM7F_>-L3mI-opBIne0YN>;BYgNrpVI~BQeDxX*Q2h7vrbhUBThWD)?y< z?6EvkdS9(M?n<1W* z&{p^-id($7QGw8ofSokwCUjIyU{YfU8MN-_^vXiT5Y86#)*WblI~b4$9Y){4p<1qV z!FZuZ!GTF_(Wi76rB{7V*Yf_pI|=6Z;QNOC$&o!xNsDjI0aT&Z?ZrFnSqAl91*S-8!K%BUnL+JJ?thXa&EbL#568H|w03Gk#>PC{d@938}zEe#)Al>b?;}1X> z5xjw-hnb@OLQApNqV`jv$03||7Wn^T!|#u7-gxTpMi9rP&E0oIM~B9e4gKxv@93}} zjHgy%$z{f6=7RYgBrG@gJo`6pJG6`g>2HiFkbt+JsBbgAIu<}miqwe<9ggb_WF(#&7B%7LdNX;P@IW)tscKFT% zWT~%CRZvr!<{lD>7TO-d9EdfmF7^2YI8%Kn-&X7gOT}r?zZtGz_}B^wOA#{r2C!D5 zW%mkTJjK3_nApW=XU`hjwE6VzBeSYY+CT&(CsOOPQ)Tw7Q^$9b{dx4Q7f4Tc`qiVO z$H>jS8x_Im=3m@iQ-f4iygR{x-C%o1ofXDVyg^)^X-oqGFsdGdD#~mlAF&UiroZW( z8Fk^;*~2Ahil*Ad(M`{dy*E6CE+(gdx}2VXYjd~X9_@bMoYZ*4n6*W??_AaNQq$*d zy6Rh3{?QdHE+3xx;bs5rrNfu}cg;&LzGTLe)BiR<{zv;$>Zx?&QF7Z__jmvQ{_Mw1 z_XxtJtzU|6G-8P+2B(s+``ovFKEY=_Iyo&wRJvNWYnLLGf`?BKrh>KlTZ_IOeDsA% z#kE(?qR`WwhJ-a9r54^3LI3GEF-__scT_dL2fAX){MyU~l6@B}bAJ5;$ z<=+AX(3PV$3}FTfQHbv)`%kfhFy*M@k$V{9?e1Dg0;EuQe$eToszw8e!ap)ckp2o? ztmh9?CA=6*k_#=uJn95}@IdwMN*A+!dk9od&ARPmDdpoDYNtK8JVbGzKJA}s(p5!R zjY%e*09^BiKwTQv1M;Y9b82(G03K&LcG7>?Ts4~S5Na(+0*$aDBzyDyD+=ud>Jea@ z$v-ynlzTq1KdE%ulzSLdddkU@MmXz)lpdy>z&P4=LdQF`YW!0rbWJ&c0UiE&V>0)C z#WU_-v*b0kDPM>MtG91tSB{&Ak$TkiMpNG)%$F{=_cQ%?&|;fe!fi>%pJL}HBzX_i zeYDcS{NFOziW3YqcD=2h;(NN5;$h9L&3$e{s_uAsra;&8$e-TTPRw3U--J|c^XGP%UZ!}N z@s#Z7YNog@=e|c=gx8fV^$@pjy!X_^B2wJ1IMn&*S$e4RLdek=vGR6t#hE z?#%PeN|D}o4*t~WL%l!o5?(d#2BW{_0>cBhZj?P*DUOWLNTC}O^1RC@p1sfrhdSe) zC{U_87$XE61&fP~b@J(%uz`&E2#b*TSnc$AU`B6cDbsi3;5G5|J>1)!yJKWmuRI9g zsI@aRe`4?YI@9q`l7~{J_v$Rezp{pw7}1XGGR~_mPd*Fv>*Y3PSyJl{+d~`fs2C|nA-IR6y|@^FPa5U;o#IZ7>!Nc}{@(hO>EJv+uCy`2`K9i7Js<8v zy6LrWa>;2vQg^A#vM$@0jnPl)3^c<1LHe^eW%&iE4d08F1b2$VOls2hLjbQoMn_=j ztF#);I&y$^pH`7fkED%>h)+0 zjT?nJ&Mpu4Dq%5REOn^YKp0}TnaQ`PstBtY`@2kaOTtf4%%xtddvKUsru+YlY2~KN zUu*sg{`u_Bf5aJh>YFm&{;Tm|ynVK}>92p?#@p*|x$bKhYP*ec2w}WjiTBk5I7&I{ z?LA#>V9{|%D?LcoqFW8X>dM23Ye?a)#t^IbftK+tQ)GV|moj)7(U{77^oVP;f{GhE z6z>0zeEs@IzZlf9*&hIbZtx41xdy-7*zlK|8vgS2hQIuN!(VQ0_{%pM{&Gw0FF=Ub z8NZ&^8N43X8Mz+U8MYqR8M7YO8L%GL8Lb}I8LA%F8K)j6gH+lAt#`)6@8Zn`7|3f( zwUOhyfHbTW6RlNWK=#IU@+eN*7P%3p+CA=LvF zk7hK539iSnMM}H39$0m@o)rGJUTCR7-%g50pJHnk8twJ>8y9^maM3M<68*Zls9a#a zcFW(y1;%23g61O2IVbXkNx${!onq3pOyV6=Q?!wrOijV;pdx>nbTN0F>AFptM#uaA3HP z9;KZZd~}$4{X=RG1tp@)hkZ|ge%6&=o-&wfBgx3B$M{usb$JphUqX^Wv5C`#dQ=w*JYrcQEkXDri0(RD@Vdo?=uS+@mU{5y?p1r-XBoVKg zH_UeS5BfXq1qgBrdU`zfkcI6h|T&bzL#-?NnvK%nMUuW|;(w=#IN{w?*VJE3Pef>gcb~R=UFS)ZsUA zZ}%uh4>9zh!&66|=IiMC*5q?(OcLKkO1CLuxrqV+v zH`BvYAG|!e>9w)#>(6}j{Hepcfvuv3v0wc1^w4`CZl(S1HNcP7hUc#i5J_qE#bKIj z&K!C_QU;gY(;v@$FEjT3(b1=NCQgbuO~#H_Jez|Rab6==|F?H##xQz(OR4}MWE#AT z139AO$KKsK_KWva+4?n%fjP3WMlQLt_z^`>p4jXe zXwDAWFZHA)-Tyz=^y8+hc3;_g`M;fc&825Az4DSfntLwZdeJ|c@yU$8GyTqKIez}s ze+Ir)`BQWyx0lSY`IncYE6JRiRocyP0=ky6%0OYE^?pV-via!54et)`7~QjBZ0iA{ zi{a!bKq9M}pSq#cvC`O^ubesx-S4tOfyJ9MfZHW_9zy(kal zKt4CGw|C^tF4Ew2v^F#Z!I!Jv5gre%0Jh7Lb^-@# z#%AsjrEgUF7~9;TuWOn9dDg?{)X@#6k8Z3!p9N&{)(2xR4V_)HbM*PWKE1IF-$(|* zLnLw>gwY{{jIIe8Zldl7Q8aQHbf}ZjCyyhoRJB1}Q}7dX&|M_!v8@4ntdX;c-xMU5 zBQ>X-GU7qixR#g@H26TJm$|!pogMHtcPA=>77^qLVuC@6q@rT0C(=TEk30J5$Ae&N z3ho39%?xOY1@8)h)YmV%PflT)vl5THio9>qOTbC3mU^ld0QlBHiXZuS9UdkKJRc=7 zwZN<#uIkX#)&yW$4O8fy1}$?mz=s+}jg7F;8cpaDqOKW|>W3z!NviV&;32@Qk@Jc8 zZZv^4OKLJ(slC#}lHR^{TD%>Co7>2q5ga-4?lDr=Aq!oJ`PQcV4M&bdPJ3~?Q&>2r zk~%nArs8kt{fhk!{cDz1rnWS=)w;hSr}m2ACD~{(Vyi#%(VOoeuHQgDW3-!W`!!Q- z!er^T%1?~*+#XMLJW09nb>&YE2#_!-- z#b0f}dK^~edqZX_SOZkWKbCoWjWD|?_2{SWo~=}Sd)fblWntR z0v*HVk1ES;0{iPs;OT=Oz`d&{&{_A%!7YaMvIar3YIIYWLKjm<*X*8f3LSIi>~p{T z)ZBaf`q8I80Ntih! zyzA2c>yno)UU*Sq#-iyD@%XbpsTnAJsf-Wn^!C9=u5S8kS6R0?55!rMl-8^BokCjy z1-QS^V|ce6BX1JGSLj{Pk?Sgsye%B7R8lqG5{wlN|GYn^^ zi1LznNW&@RYfc^?>?UT~P_7*XCjkD(N2~^9J?XcEI*v7niQXKdO&K+Z946{SXaB0) z$PpZpT5=0;0*)Jpy@s~JP{1Jp5`~0RB*K8j%WtYz87w-vMR&FJ;QvXYpSwuY(p$_2 zkeNR%Kh7-OPR@X)zxKq<#3&Kkl8-8@cD~u_|msOQ1yKNlT&qC3GbkH(?gh$aB4`G$#R%rgUW)U)Je247M`^ zBik1jdX)J?>$=RmB>=;@mv8jJP-WK< zb^2EaXJL#THJw{5RRbL}R(_IDGFQ|4brAt5kEO8o{mCNW>?$ z^VG2jB_^YHL-*!zFG8<*3Rw@KGT5OeM8By)khfYSa2pn202`D~^?@3tpXUKEL_l-4 zj$}-U#*#e^z~)1t9D;F!#Hn5)-l89L1*7Q@4J99ul&lE6u_0g|)*G|H2VKedjyZTM zVS@J(zNdp5VbUUcu9E87e?ZDX}|IV0J&Kj8m3%u(-rnJz$E$l!Y}q5eGm<6${9+ zCd4|TqJTpUOg2dUDaEKo5=qW4Dw~l*%W`t0z-0~6F}@0*#c-ciJ7EOZ*pho-F<~1R zbcFHNo$VGV^;|Oyz@9PybQE>IAZC-M6K^uODL9b+US=~AWu3>#6yrx9C}n2#@{(;z~y_^jPKlf zek=It0fc<}v2*)KwUN9zzG3(I=ho-O9r#hO>#ywv?EL)DfpdEX0{FVu9^llyWD3m@ z9Q1Rq90pVUFfW~ddYi!2K@z8`PY%5?KJ<3F`4|H|H~y<*fJNGGJ2#K-0Os65Av0qD z*gZ?E!b3+}j0CO@j1TUhe#5Rjm;=WB+$KYjA0HeB4j$C_@elUW889ffQ?hP1OhO<0 zLK$!8={K*{oF-b^l=$tPI$3({3~Py zdKt!#pz8>cym

    U!8gNIU!>U=Q|Pg9g#8=8%V$)Pj5YNasZ&m4JQSb{;rhD0)qqx z(;&cw-d!2nv*Gmq^`Z3$aQmcs^;W|n4D9!x0y|&;Ix!@azkcfY_Oap32HySJ$$=rO z7i7zwC&8KI>l(`JFl=*xF1^5B26J}c>CyGpS8yrmpWw{_s|2h36#;@jf8_MDFZ+D? zDKxf*$%@c6qfVQ6U;1tt7wzdc549QtNkU>H4RrT|{oN#+bomHL5xhSn3NZJOq+$jl zweIr%k#`aXLck*zVv9;eBqXsf4h>OEZmioD2XO}CsfUG0-HLEUc2r>~Ivi%wC1SwL zCm!FjP`BYy=aCd?ZdSHaNN-);R&7tuE`jaS_Oj1uV(fYS2j^S&5wlu4s0%05cqV0 z$e9YrMNlMRd>kvQ)U>qe@ZYPA+qTk3y05GfNn;t#a-`Og*O)9=^~gS=W2viiz1h_f&aaG9U!DSQDlP4wQ$XnQ`!AZ4vg}|qmI8bM)wM>4u z>9=I(S>ku3kB4-tuQ|~~C#0(r#IHl)@GJOjC_4Tua<>2kdw+?GooYK zsU~C*OE?QH(v{=1XXH(;hdtdZER~EhcoWX-c*#COn`SUX{kEq2|5Z(QHC^==SMIsu zzRO!?{?4U;a>?7xPhI@dMVn_lJ^jgPPw?ZUe@ZQ73~|WitOvu}IJh$i%-hbDIDJ82&bH4{Y57XxW}{(j%YCQN z(;a%Dv-TXFN1>M+-$m*b0G@-~@QZax?iJT*U0%k-H+}vf5T37(u6-Nr{mIfVPY!N4 zIk?NrqMn$-4yn=sAa_y+WjGnXc5-01j>Bh97oh1&K=<%%UXKCUKmiB5{e=I z+hM025X^ig8%24-Rx5Vaa$p4{fC| z9lYf@0R_*ua02={HKUAC5VY|Jn2vc}#m>CLCP4EX7eq~s3@e>*Z;=S`_&OgQS6$t3 zA;Ply^6f3T?**kvQ5*{das=G|u33@PD)kBH%PgG$`8l8>$F?_p1XEWh4<`x&Xuch> zx(Ba$musr$L56KTub9&7O;jbj2L?6(nGRSvbEZo$T?Yr?f0?19T;z5+kqx^y&Ceu6JT;)0ZL9fgdz*e;oJwbZeqS z)JT{Pb$}y79q5jF%-Nt;y;EU2RtH_$(lSO%pvT2m7cNCUX+!-K)~Yt8h$v1_X-GJz zgW`erx;{;ctzLdL!W0mavcaR!BGZ_Fh*Wn%2OjAU>Gxt^22&hm8!&Mz3v{+`rIeJA zxuqB}ZJVS5?GnopqTh|~jSAxAAl9^c$ICeSB_d&=#SsF&T*k;aeclk@)UV%-&av1* z8_94{(n$e^y3*8Hf@8iRq*M~bq+-zj4loBs2)(iETAh6>~$iWFtYaQkpD#2)#04LHsvGsQ|F<_21~Js(Az z_N-D|pj(-n`*@??j10K`-jh_R42mdlO!J0{$Mai~<1r|1GOd~ti@b^(KOQpml@xBC zQZrkx`h&KI{2|gkq09jQny#UgU;_tdeEpN`UiO6_O5K;_{KOQ-Hfx_q}1 zUs1;LHa$Q1bymoA_ld)yVp!Mb634hIb#=+a4*S&_7k%HWZuUwhcGs{#F@0s_6>{A7eg}WO?J;cAtA^ zDEWT=neFITaL98{Kxt5tAC+qFDU$MS4+-PQ+<`2cJGZqwM>-@D_$i$pdLyOsL)ny0 z%O`n~f|f|c+Q?yirFaW(uIJ_Ya`m1y=k}Cy=Lhf)+_CN4{=*Vw$I}vNwEof!h4D(v zR-e~yS7Q;L0uMYrpf@}I(%O*K&t=*ll);Uf-Z?}bp}($9h9=Dq$`;aYke|)fFNaT- z-nOsO!@#lxCU+3kNV)1=S8_-}f;t2(jilE-s7X#8ehS8AA}Z>T{rKVA*V;U6C|6!S z`@)OJsr8$F3MU^Dh9H?f4{w6eRSVlL1=BGUP2@D;Yw4-c;}~sUKm9tg?Jny>kY~eQ zLJJh8Qi>b(dfiDjuJ??HS27Z#>Y3KRULL? zFWMnft;$x0Tx_zlHl%;$c8}7g7cDGJ)R)jHV#YXHgA+(4K+#URicpOOQk!#FI*-r= z1o`xk%m9h;OsqmM4*V(^yR#S(EnSKBs4HmxUKuE->5mQeCQ}u_$l6Bs=~57cS!Qo! zA9+RX>wU8d0tvz(hrvtIsiw+GfE?Pv5A;6tF`6V*Dk1qN{j(U;66rTWg*`SolDU_X zaaMX8J~B;IAx72Tp;t|-;u@7mRfL4EIl?xHnyd?@nyXzjaO6Mv4l9S-tCC*F1clB69wdjD|C-=duxACCK5kJi@a9`x`nsm?h|Dr8dP}}?;CbiYaU8$}W zRj6GX+4WVUwvFKCx@ORq^`VV#J2rd z$FWY-^F-AcS|!%@a3Uo2~yz#^`;mF5jt^H10)?+(r}JZz$NQDd)7`WZ~HAH^$JSiHIHt<5wz;_4((w%f$Trv$6s|^(<=nM&6vYlND|$+;65{OP#4BV>u?~ednKhWlH4c zcby5REegTfJ~X~_zn6^3%I_-IZMjG+E;VP9vAC0i+hm3vls74t6g2je`EAxtm|1f% z<(lPrN_Etkt}{mud(P=8%@)_038xAMc(U~B${vW)ejmAJ%XFsg#-YpNGo(&1SKaC3BA3tgaYrzZ^_<}nhaOElYrJR|4!h0h zwIwxk-C(9tw&DB}Q=KTk&`iq4YC_TCi82YRbnTXDMqgh{CJOorGFIaW602X0Iv-`b zd_*yA)(o}|VcFcuq##AK`_4{SMWgw0JAwRSu_8~Mu)O5tbhWhjcsNMn$#THr&u?kc zWDS~6yluvm3|TW-x8@?)Us(Z`f=Q&SwB?<|8$)q=jR`9I?vid&g*Se;dYW#{%|k?k zNs!Ob3`{hoCoz&yB#{N_EM(_UkLpbhKO2zV%3_<~z$leWi&8w@n!7hR+4#?u4nyWYb+VnG+z@y72}PYo~5<0f9{ zB2VU0IowW(dfcOTqP=F3ckKnT>~vv8VKlhIV04J?HSvU*sIU9~Z#3cm|L?Bsz2YBU z{=Z&+)yywlHuKUeo6lT)=Hlryx~G3Iede^EHT@41X&U(LjWf}#e4+H^tDCkxz+mTT zx54Atde~`ElW2um>{*3;zs!_9*g=;40In+)2p_rA)0JM798zW!dr=NsDO45siZJui zSzz75K$Gk4ryleez{8+2VF+%_bcF{BDK}T%k8Z${n0aXFoQ;>!!D~u4cn8e~KMyGQ zck(Dy>Syp zbf9Qx$avpVWpRv>C#~Q)O~w87(9z2_a?hInn*%H9??c7q0EjKH1OT2bwa1>AZVuOX zxt>Qom3c2SpZU0EpDeAnXKqDp*4C3>8BZ$#Ot1h=bu@`l7S*qAyoAnt*(UD?Iwr}7 zN{;*cmA#(P7ILYFUAYzLyrS+%Gn49$^;p|yj`Uz5sj9h(Yw~_nfZSySQw^^0!5(O8 zA4m#27hPLs>$`%_(S#+Dq>&x$Ya6*2OjFYOuZ+I<;pz2HhJ2>a?giduY}5}%soC?qOXB2zQjY&x;cj8ywDknE}`T+RTQRIttMm(qZv6(dr|6@ z@ANP~$*d=v7O75yJxxt!N*i4GJ7Kh8I%VbhxYTmup!--4EZ)dXVA|IQKX>(4QnxMf z1#zNIKwU8m*_Ou^yI9_9sIiSpk-|Q4V9w)y+%8CLkIs?(9~RT|lYW8>VIQ4^&XIRv zRV4e8*Bb1N6R{tSdT&dv#)lg(=x&R)$>kp>XCe%fOKh3u+*| z(NkEC?#XVVyw=wmvfTg4Muhiiw+upfa$eeh*e-fU50Zxd+)&w!P~oYZsoa94>m9Zt zASiO#B=_gb*r1N#1ikNBIXl1l1|NrZtCAPXScv%c>KnLUVL%El&sed}ZP^~XL%lSd zxI^W}cVf4CMi;>G4Lh)bVPqOyW7UU?-uZ2~dhIi}>Mh%;`@pty?;Z+YbLY0aUEk^z zJ4*X~?~5Ce!l%t2{Q1>i!DDK4a8q5ksOTr$pZ3B)BBx{kC@}os&HIt8-JT;JQ;^I! zyUe8YI^4iKw{YPCn~Bf(S?MBmauCA~7O(yG5cAb>`)cuirS&HV-_+N^YKP;q1N)S- zevsPiS1Oc^2)8aQXVzAU6!ut<`1Lt+55}j9+EV4^IsB{@pbyb=`55mznYdiXzF5!O z4R2u8MkMfQH;PD7TcOy=M&Nw5Ys+d&WiLw%ZdvA6i06#FhG#{^*c9>=j{I_QOavqr zN>z4nnVi@O-C-jjlXNRFJysMq1J$=6LE3oe2snewCR+^EuUT$!F_lroXg?{iq`wz2 z1j7h2d8@?A>H?gr>=3&XvO`*1-S?{Ww>KhDPrGh#RT#WoSK1gBT)=N^k-U;$La2of zQ5lNtcLiDCaVAIE;3SJfjXbuLEJwEtv4dF{+VmnW!9;l3-MDjPUndT+^bk)g{Av+8 zkRlL$5GUBxZUKQqG;sXlmdD&M)LG2Ra$I>CI7TM?e3banKKbwRw%Ugo3wUZ(9c)lC zNJTXi)I2WBWCpWJ#5r83T3SY=hClw@3{lXkjl7F1dJv7ANp{NT8@WjKMlazJC|tYU z5f`^TvgD{A)WMYGdzg|H;%y0Gw23Za{zwybLmDHN*N{mTR)bEbsdhT3;gWWFb1vxu z*&mictD5%JQt|4q+@o~|R53`;q>XG-ykT2Wp`LiV;n}Pb1mZ1aP38ZjNJD`FQg8_= z2ssE+1iuRJ1RSWkdzRt*(4)mQ>lSNU?Z>4XTC$wXO5f6M0vE%Q+DLN5jN&%Il|jp^ zBV~C3-*NwQJ zeimjSJ9&=9D{{28E)7qAK+I;LXK8mwToS2vWec6OP)0ZH4Scl>{uE;Wb$E{9)q3j4 z>!VNY6)TV2m)xF*w<=PgM3napIk5{Q}Pjvw$yI16#J67S$hbu4O~7jncV4yq9uGxTE!8;latOEg{2ulOEi zhxjz&VI_&PqoUfLF^ERddOoC&*Ct(g#~lwFb@~5i?_Hpytg>~{@Ct9-{czj%%fEdQ zT1a?kt0>wbBC-KNKy4dstRzKJl2oOu5-@n|O;rN&DnYA2R8;VRV59O9!b^Lc+;hi$ zoP7q~JH{RNjc#=U2sd%rp7TI*l`Uw=J<+PZg}wnOEwf4%3N zYp%KG{3gvCE7kCMQp(@6+X0F-d=3RGi@T|q@QLk7YBx2469d#UcH*VjIpb>TJNMNw z|5GfR`x4kxIhw-Rh~w1AcTgI{`)-322IuuPZ383PK9>)g;JHS4*g}}n3%WDL*A$U} z5Fg6b6dnbvxN6T$(F^JPKfLUYvJsEr*ARX-{UxE1{=?sG_`9<5vSDMk-*WTBaV5i% zmYipN$RNuatDZ1-MSvr>B}8R{0+?IF!Lan^<)Oonvfn|1TUr`I%=#SXdU;gEn?s@s z*>|F=$lg}DE?nDkJs>BMgAuXxO)4=jZ3HwpDHgQyD%zMSF);QjEA_Nao9V&%6$_c;Ekaobqzh^rudr6m?f_K< zxZan4%nb4tGsy5U$8Ib8{SY`rVT(gxKt--?cVNc&?5*ef(x>{jobJc<3`{38r_Y@J zg@MRvYw|*M2eXLeyQjBH;*l$)5AIDPb!iR@azi9lRY*2JjX(lUZ;^eMUY&}_f5EJU ze}rtXQ;~<3P=9&nmJM6;4Bk=M#HSHIx`^D+KAY-cSZ<26ETiPRrd6H3TxZ$^E5jqJ zXujQ9$hT`zo~qs^U)?1l>%#KFs>fuL_o3@+()T@H9RWMcjXiyTq!pqAdxTY$+dch> zh*o-~h#zAWJZvmQjs9$A2HRLel#XCJEpWAdP%&+KKbh_LkfVQ5Y0bZ3Magep4T3>}a7}>3LA9Z}H2{Kv zMW2aZUB@LVaiou8tES*$!;{|kS-{~+i###;v!~u62|7(C)PVb0e{#7)$tvV2!vTDb zzK$^Mx|IHmJH-5%!-XiR&1cOJ6^&bx%WYlp=JGn2gJMnfrrA(S%iK^LGr|9w#}41$ zgM=W3xW`)eu*X;%t8b?{*U1RnewQWyhb97zR4OC{%}d3^pn0*dAT+NP5QUE83PX2# zjMQM6QB?(pe`p2wAPhiD5WkE04J1j(y_^~WJ(hF9!L z-SQj9(V!A2=3fPQe@dl%QyilBWg!l+& z{t;#Wec8A>N8W&c{+a%4TE>U1&%_!rEd8^aN0e-g_$rTDMlO-Lb}_7@yfGS)RKO-N z*HhxF)Nq0hKx%a{S?nd=BocbNx@^EEoc1zu8)w>U-Pe}>=Zu7`Fl;{ ztfSL~QLucwq4)4WuhS0~F-tO=4gMZx=Ug8&`B)o?i>R1Vi3^KJYsK}I*H2kF;|a4^ z*kRqZz`E(hRMX*Zw%f-ubM-3b+Vj1ehkqlOD-3(4V-B7x+FQc1pCe?5jwj}uN_jBV znJgbB%VNkMi^8j0b6%x~=5_kRQ)C&LnsUnUQ&WilQl${UTI27Md4>|^v-`fUS9n8p zNqutP^mhg?=$`10>g8HKzvcAAevHo8e|ie~x+L$ZUb%mGiun5`uj%etf2mSRlagbW zSw33W3f7fE+Q=|flqpK-GZM;HD8OhzdMcugv_mB;XBG42~muSjzv%^$u!NLuztc6r3|eQl*szORr+ zpc`?{z{yqZ>EYE9TjW$m9?7;e88P`K^Zxe9;Hrbk-Hc(`?yF3M^gAP>k`&!5G%=KVe= zbEdbn=bGwn{hj2%lO#l%p=gAxlcCVFUI%LCl{xV`c#Rz>7ML3NL*-(%DInY9ddo5G%sbFbf^ z&r*TJf|3hCg=Pm9Dj-T$lX0JQY*);btolJtn8j2SWZ2zvHRno(m6es1JQs`L|FNpJ z4K|YHFm%^7R!q@WETb>d02L8>-_+SU)qx|IDvUJ5jO*Q7D{p$*6eVCf&5~;>u&G0> zs%JPL40vZJDEh!ukJtuWM%M82d`+r7f{#Ob&t0keL+dUI3(x=c;v(34WCy&CuXh)R zUQ;t>m!!wcXvhZZvbPx-eN8{HXiXz|yufZyQOg@ROcEk#l&EnFLpIcUHV(Z&dF*I7 z@sAuavuwh}aUYF#@ZsB^Z)f1!87MFV&()FQ^Pm187yDy()RgV{N;IEe3^BjBwlyIT zLzD!MN)ddmuiq`{_;Q76h7$KWki(c%a<%o9cTAt|N-HJ8)q&NOntH>Iu8}RtR7jFi zZP+4_E$a-2eYV0Khpab=szeCM7FbVLM^7qCKfJN#xivQz@UyU&yW0;H(_0Yj^4@RU z-clTtr>|7dx}x&i%GI`GOii>s<&^iFC(N#f?OhB8?yON`^rQNddw(cj)9-vYi8JzA zs8yxB15Uh!qiQQOXTnBY7Cnx2AA-P2WR^0lia_za_e6Cz~C$|3_`x$O7 zJsY2{#=8sCQ_pMe*ZPxDWpK=SZX9#_S>g6E&wu9|!tHX-5w{$0vG<@8%Z)-X3;P)wrXaIP8`>HBikPSURk6!&%1e4$y@MO?|Uj!fV;-J(yx2`W&Q*#x;(Nz zTo1xE%%DgIyPF|Ry{}mZY)vV&kt%OYcbD;9g2c&Ez6w~Yt(7g&hU-nW;6*lw^Bn07 zj$H2$aT04@v|`!ZiaVz|GjE^jz|x0*om>3(srEjNAd4nbbr8X9`VN!Jpdy#;*WEm_ zWODf`ZwEz&FXPyal2tbA^*;fTcn;9K^n48F-bzn$?9A3xl1mt0+r8in%fC=$q^9W{ zBeGXW!)3z|l@j9OQpaOAOrzy)e$~^*6UD8>63mlh-*H%H;+s|IcVE`!9^L={v@BY7 z)!UQ)yGeIU{C5*;C;Yz?-WuOG{;~1H$GtZ0ma+eC%zqm5ll)<32I@&xtz&ow!u?}RPaPC#2UI2x1_V(eOJZt^ z3DOJBI zFBRZug(v1TCbS{#!2TCl=;yaelNOWemXp_ID$#UZaxpjk>t8-uRztVYz?UI&qFbF6 zL+KqXy)Df%y9D9m&@1MS8t*bC=T!aknRn8>*e~+rB$s8Tp^Gb1l1}?EbkQ?Auz{0n zuPljwEzpYiCFgdrT7NY^jC295@pildOQi$ccJkyx&>}!S0WL~Gl$3CWs>U(`Fam*# zrZ9pOLj+$Miqbo7v?}6ZkpKYABRm$fNvKEgBjONK9#t$e6{Pi8yO8}K{9|%MT60z$ zJDm*1vp$GQ(m}94zg?DFPOW%%D!15@xdkn@uap)+V@oM07qOR=B#dG=v4I0sRfpwL zWUUIs1ucLQFa(_3MS~G;QiVN5RS{|O$;{8ufB;gB zkopkBJin&MUBx^UKI^g$2ct$ZQ>ck&qzQ})v_Wg-310O!VY5uo+h7+o;$;>Ie7!nT z!F(#&(1lq9>IiTqSPpKu*^R5U$K~=#jlz3HBg|_=cQo=`HqpJ)RR*w#bnL0jWOQs^ z2j_17qhb;C25Buo{|4UHoo0ScYapa#b;(e64qJrVR`Ws-Um#?d83Pb196THkHS>yc z;4ffY@RXJ{m|p<@0|;OOv+X|A013(^g>_h*609$nhq#9_!71J$Pj(*d%FNAJ@_AvK zb$F~M;@P|2hGAqnt;lF_3MSt0iOl8L%uSffwss;_A4BCZ?fVK!sC8}TMhta9%w?cvxbCP_6fXDZxN4#zSC5vZ z?M~XePrY~d;TY#NnH$i^;%99ZLRd3ch=C(Co)xVF_cV%Td_3fTJ$T2Fi0Z${T#xx( zp5)}$e>6J|vMYguxT0ngrENFK{GrJeJBkRo;v8gE8Nff%r$;hBL!TC>1j1JF4;KUt zVsi3Snkc2Q zPjSFn*fW5G25Dd%2Xqf>M&Jx80F-A?sYVoC%7`5d>Yyr-W+Is%pqa&@`q8OkQEUyJ zBOVFI8{*w3k#ads*lz^O!Dv{CAR3+6nQPG2d{;dR zz)$crWDEA(cZ12BTS|_}{3R%AVe)oE-hxa=SYV3{f`e~ZE`jHRu?x_OOl1MoEq!@B zb2a)hFC}u1sJpr?p;7e&V8YuGAC+63F@zeR4?zx-lmR*gq3S82PH<(&Qlw88(-z8! zK@tl&jooh}^LK-dwE?tBs1<-yTdE=rRC;cTVIr$I;bQ2-M1pVeSmyg!)oNF&`@l22 zV{^H{3$c;I1qT1`CuJMTt~xO3%%ty3d~;&;g#T$mVtjV|uyJpWn?Lq{8T<5@563v8 zKN|gL`JwXbM~xj>J>tU=-yMExcAeGX>5=!6mg5D?ae#k>5sD6UvC#_mCTOLaZ`BJJ*UYmJf3{C`Nlh<yGa9uQBE!ihldkXwn7ZUMRgd zW57@moEv)haL#cB#}hGRL#l7kOB;tig*ENl6FEej6#TvKp+*=qrmnMTBD+8S>O?w z`#^GS$q|Nw?Rm*TZp_aFW@oaN2z~P*Kjw10bmQll8d{(0k~bNqzwi=@YrIOZXJFG8 zPV-}j8nvM*@f6rbcm|Y7ODs4R26yZb3}$a` zDmgy$ORWAvYonu-1#B*sqqYX3w3@RHG61J6iEDMQ0RBa|mH}KU-IgYHoYlo3%qznK zc{FnmmT-=%)0ttYle#qm!#8@81n(}FQMl%KW)5n8#yzGpd=-qo1W&4h00^Yn1t+D? z8f=e^zjRRdTYjmu5R??w1*USNzslT=M(=V@>Mq9Uz{w2*Cp(cKV%Na-4MDU%aQp(D$djpuRyHJC|dmY$;;IXI$sc+0TUc;%n{PjW#TR!|_^H(yh>+XA!agb8cJZlhrBVKY{l z3L0RYt8WSe4i&rPJc31~ehq_a}}@MPg%L?g@>ET0fFp;410h%vUkUJe2WjC z?fRr|`xbt(yYJ*?dh+`{7tegqyJJu9_T3lHYy%Q1!4(-qRo#Tx5vX8#YwyRMZo%_! z_HR82-22|6ulH?$`6k8IfYfi(*P`3EZ=8Z|UwGe2vJ5oR9XR}Uc^=X+1?Let0|D_g z2{oQxLxSYz35y;|J>ilPuBWK#bgstN+eoV?OjS>LlmH4UUO0{CD!p><3zUM560za` zx#bBtpD{#%j7o^9bTZJGqJl-w2&e#GMJ)<&z90y`LatZiV&Ho^W+Epw5L1%?v+rc2 z{&NK3O4zENnz;)nFeM%6Z5LT3k}^I%9O95FD5t3r=^tRy@9J29NoR6}A(ON|B=JDj z4%SNNNj7FYtZSk?i1f82_291wV;HcKa1=pS27ph}*YYBveYG?p;~EzO_&2QP1i-CS z@upa`0ocxfN3H`HFkRG8^4R9KddUxsYG9CV4WUH=(~sg(FekG!Y24n0Y0z(AnoVC`zojM zR91!#ybr+nbatRCYySMatLyV)+ns^UodfTjK%zBhK&K7@?H&c76aicRwR89lFnnj= z_=eAqok!N?69dNx9iP>w&3gv7?IUFULnx^l7Of3`9@&Ee0TsP>aBw#u@(JsHk2AO_ zjf`z2q26DYhLwJJ4KU5icCjV^OnU5#0FOURTTsVqJsrpS0~87U6(uAFXgxnkeW!R0+28+g0MR_4A;+`sEo-&W*Ddx_pj0p9*CZsM%Mt?vNtJ}~UDd*U~e$ZzR; z^#p%@nO*~4e(J^E9oRNs=-siqC$*Iu^7M_eGh4!@$5$as9ZD4qoO`4s716Gzq zlhsv5wvUI}84n*o?2r^J(on*#k{vd5njx7~K;Q$1Ut!;`O@9wlGNXewSrVM^e-X)v zNeLw&GXclwP6$g(O7jd^iTgUAtmG-c3@Bo0X=_So*ABV}H!@PZ585FzK^t5giMG|%!4Ke^j1}GBjGPd ze-|Ua1$Sx~xg;W@2_TwKf6_uC@B~a!2ecI09wKY$BATBQGnnOGgZ8k}!V-F%z|4hv zIPT3F^_t6kp__EkN_hG*!gfW^Lg8o$BOt_hw|Js41n?IsCAp1gA;a(y0Bo87;kT#1 z!<0?SXeoZtY0JWtuPYW^NMoU)tbu12sMvl9v(ntMy8G>DL#s0n7q1P`2>Aq(_9w-l zwA}~J4>zshTJYy0kZ^sx`hvyN40 z_ri0&3K&z*;21M@WfiMOCyss53EV|9@53m90E$E`CBYN`5USiEY zsUBKUdgb8f$Io%1Ae}uH8qMd&_dypj$%O{??4;~L(2$VN2L_;bklu%smd{Uh!KQ-8 zWI4LLYp>~$GiawHdVS--w#@_E-mVmz*bV6krkg^gs+%}6Tb;zFk8kNW&O;~QE&ig; z)B1bSNz}9KnMW(i2_Sr%c_bVjby!%^M7U8q(4lWG4Z+yFN|M3?r+AvFy

    s<`R`JfoqhxS?vJAAQPja;9+u}sRq?cI7 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

    gG*NZdDv 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̾#nXN?_lQgo{8oByK2aA6$hN8LmJhm{r zHir@T%#WH#P!xS(RPo>uL(k%90Sj4C0zFZ}Qx)t)3C~13@V)30zb$SewGV|Z4SFhh zA(c;J(Zf{jjg`-nySu(9mys0EAgaBRN8vWowu)8*_h6uIpd>z{=5)I4fl>hp`@Gu& zykgb(k7zmfZhkjLcq+_WnWp9QQw2+$r0r{>p&o8abQYNr7nTZ3Q%zdX0_HbsUsXT7 z;bt36%znEzj8s~2O@uO!%ehk2KFExC(YshH@0ey$U8Nxpg2{4~;Aw%!rW zE0LXjB~g%}+`^v(4}j1Z*+IOyd4Vbmh7aq9GI=QD;~#ESBE3=D>~&J9$!k>hdYy9m zg4*h7LWpe2VwtRBeFyX3T;BgD)lR6n;y+w*(d7p&J2i35rMoV<@8X|b)IZ_m_$A{W z$5;RC|CAr@1#q!$M%QwQ-(YmVucT zeGtd`Xw-&@(qN_V^Z=Yu;3=_KHdsOM?noQKK%hki`9*_U@o{#`qX3|jv?*JHV}ls= z!cm_5$Bn_lvToT#S)JI9AymMkpapG#IJ?QieP3(93I* zC?Z^OhfHy!M`s2@udE+(wD%K-_LGT!b|6sD?d!piPaJ5B7lNhBSduqF;+f^GPha#( zQUd)y>jiERv+D^rySzDI!lu1XFe@s$5`4OLGa#kG;FkSp6!4`;CEz%8Upy|*)Aiuu zMK>(}|4VO!3mB+bHeE|MuvU4P_}3i)NdAXjd`|KatlKiw^&UH{a9m(wkyjul7jF(A zf=S`I;7_0=G}8fw?GWA{?Ai>@;i`yT1FjWZY^2GZ8-_YNrUrv=?Ln)i21uHKF4#N; z7A96~1G_AQ@V)5-2gF!||@E)95+5U$Rz z_5%7?cjH=>L5!RPC25qd2BeQm8*g)|NAaOCXL?FywDGVt~fCxKA=5SsEbDS`*8z$bL zXWsW8gBuy>Oq)BRm_bqr`0Rx%Iu-7A*#G0Zp=KTXaW7Dqb+>gr=61S=6*Y~R32+pI zCtsu|V5~+|m9haCHfmg!0L2EVRZms?U|`;^OI~4ej1oT0V^jjPa)^~cau#=PGEoNL zvcy-rbJKyVZP5)ABdxNaZDPr-Y!hJP_W0E1w%JS|ivX#BTL);(_6*L?Ov3pI>54WE zx1c#do0;{P{IVIGp-oMOJbO_uG9J~H%Clk_G^E}v?orPYdB|+6}u6ork_Nz5g=AEdoVXZvQz*r992nMgjY%83S)bm z;L}5vo}y;)ZJ`N_!+L2^$0~yN&`8 z?fjIK;|@zNiWWmC5%Y-LK>*F7wemmbiH1lb$_?bY`JAkFg1-3@mY=o)(VHb`TWAsI z3#JWz0(u)zVO6=5G~%bdNU2n}%0#Y5_Zt)K$c5$5=oT$bk@%tlq+K(Y=zKAOK#6bq z{Njr1QgqU)#EE0}nt5cCPyd_~2g?iC@04VE^5+crdX#L~a&ZZuy}Y2e6+N8MwK$wH zpvAD$P0cE<^)g$q^wDscF7hC@7YXk)`-@#N++0?09#PU) zVQx`NhaJRiGt|@j-!po;#t7Won}tXp_VyTW(FA(GMHGcB00R8=+sE<AI)_#W4tUmULi6kOnMxgIw%4RbXbrDWFf@q1A05g=W++;p(*z<1IJT-ahE7i`)R*%o9wK!61I5R~ri6;Q{`jg1=#baHb?BUiB< z{UZ7G5aA&}6kgF>{=YBPUS4zMC6gL1|KrQPHnI8AeV1N($10+ zE?Thk0@ImcIb=F#2k^gJ0!yQhn|Pa9eHTMg8BbEf(brT8WIn>wD?b%6E$@FnhdGY; z8Eg@brEn#pV;)SkP(gx9In~k&&P^{jokjG~%7%ovok%TS%sNz9Y`e?Spf9vh>kUD2 zvnU2Cg{uMT3nxuYl>(+*q)gerhc z0o7T|48^Q)szgYPh*T$U#2m{8u8fCgfBhmzG!Th?{)1;prE$XKo_AF}lJK6=-Yo08 z2<=;m6epzPVf)6yV(2O$zX{{Xv^~Oob3!7qKOplU!q7+E7qIRivRxvx5kcI zWVxyi9Q1-L2MtwQHP>1E@TbNelP7(J#(+M`c{-c93uVXyx7J4?Oi|W4X7z#=r|!{m ztsDDckKKd@BWmYf+u|`uR@z*_<1(^n_1K%)3vQgcg=T5RjI@q2#c{0+2w#e_xQB*_ zf#)|T+!sbeyJF0(BndsaX<#c&sj-WtCSw%+o)-%}3|IGp8K>_0&YMNpF|(@fV5nW2 z8NC`P-MoJG@sZ=_U*E2b^~%Q$z8G+Jqe`TzhQSkbRp)=XRZXBuJ>yH{+&d>B4l#jh zS3zSORs5CJ21hOBCyB6CVZfVUTleX0Sn=kyXEwck{`DO(d*;CYV*~FV@l#oUxpy@! z>t8aQqZ~9Ou8wl8><{^5w%Y5{M;%JKg6xhTZTM(2(n5Q(IkhYPWjMaf4V^H+e&T75 zy5%G&h&BCmoVI1+saK&G90705Z)|eOQ@@!VAQLtyYoL1w=dpf`beIQD9cHR*RDSBP zwp4DG;Jb-U5z!htAL#{mPu*kd=D9g>YI}87=g{Ekb0?FM=C~&HmM-AeFk7ZD^?U#& zX%n(tqQ#Q&+sQV})a?mX?xG~=kq&Bd&In@=BtiH!BEr zOzjO5{Z1HCq4*e#L@HE4Q;0SpZ>LR_j(q2!@7aoWF@gCrA8o)WuT@4NNR9myI->pf z`-p%41iGjOM@%j^T~#~(AZFW^d^d=6h7+m^bXyc9BE0I@md}3__rcH9)#21LnS;io3SjSu) zdMEEl^<2rGbbdALiKG}vDN#kL)Ye{P-esZZhaRVlZNgV!@7hc=&Sc6aD?o$*!!)Gg z3cVV3X;5S|1oMiTXn7c73f!Ar`T~lL)DCjVZ|&dR|7r%sz$zdT)Rx1jwq$ilF49U@ z(ed@3E68S226@_jKJ6QhS#l!@bsO`?SgNF+M?HL}IutAiAKfGIkLvVF&tCc8z%;L?FbB`TD16Tm<@vn0YRJ6roGldYzazn>}W)1fE721 zNe$2u&;H=ySxkcJND~C8g1aq-od@0GM#xXptHd4Gn}> zRPv^EzI3{C-|5chP6HTGegm)x%ZWw=h(!*J#7nydjAlRuyh`K%(o~ZWEeWgO=b^4> zNwfpRJ;YmPK^Y@csg3Ws6e3*Ed81o3=?vU`S(*jNfyPPJT54AYGULNf;Sj{a@K+F= z8;;yexWvqa7JoYlw1A&BR8^!{vlAEA6yJ`HgMf89e|bXyN4yfEg>Z)uB%p^SR%pBy z785NP>X%SuAs;(&4Xy!c<63X;fxUm+oKB>EzwaUS8}m@I{#h7OnsB(eZ9^>}LIhWo z1r7hO^ZxQh?Y?y%dtPAKKEy+vF;W~FQQ{Fg#Mu$lYMvY zPoF#u`&@kYBmr7D81Y6M0jOV7w@@KIgCR~m($=S&HCt%4YSERbI3kYf_-3kBpvE3p z=%HUMhG_JTrEF=RQ5*E!MPZLsAW1r*b--BVk3yxj2;%~^Fxr_BbU_&M$Ia-Zngk%f zm)nW%lP^jk^m_Ms)xt^*bOrDT(H_Tj!LRhdgbzOQ%RpVMeB@vkKfmkvz>Ym?uQfU7 zU>H$-5H=UJ+rSc{s-otzx54~52)qwk+NunYMNKR&+Z1 zS|_x$diTW*Idc7lX#iRu@4~bt7^e!x~o#$8{Y0s%Jm@6DC~bO8f6dY3k&>|}yeBHWw+IqccN{mb9yRU)`rN7=tYKfl2Sa?}8UL?f-QfoB69hWMGh(ZFu$f$IQw$h*;CAawzw9Yk`* zp|xvtKzvn*x{j)0z{d`CL7OsZlMW4SI}wm_cJF>bU&BHSPcFc{39cEz^1ikMP+db- z3xKdGQCV#PqQwU@rUuu*$#wSF0sf>Phd&KGYo9SM zyxljj_3$;8Oed_Om0VC^@#nXFIB=|w<=n@=X0-C}v+o_`KdlL`FJBgY|J5$ z`;ipZ)XaYdc0Mz3^6;5W8~6)8Vrj~O#EfCzb5j1kqA_m|7Rel&8njLgmM;Sg4ouPb z3BTuo2y1G7+`Vt(u#*yTyI@vu9OtuHM?5=Q62>>Que0a{{B-wwbS(3!Cjdr)6L!k^|yc|EeyT|9w3-8 zs;6d->Zw_ydg_KzJoU5_N?<({7S7<%3;^$1;6cTA4Xv5x=1BOuVi?UkcM71f0ojo} zIa3;fZFGUzfczobvkA&ZS{;mlkdb0akgIDp48R0NE>z;KJlwFpY-KpXVLV%=l|M3I z2Ww5W)z`yj)jB1({rlRH2lFfI!*{-?d*k;PMPFnigRtYV=Igio+g>(CCoLFdzPm*@=k*p=yN)&PQ(=a)6&zEr%4_A~&7HF3`L_Ds~~_ty;(wU&diO-CU^J!ZC^j zfGpyts|`#Wl0d%kV-ErVUGec|u2b-3Mz+gdnA`csAA*u48OZ$6{w z#x|}M8-w3G(=-ONH-mY+Ug_*+2eZJ}nAq$pO-`Dkk5BO!>RD++d!FZy$HZV?)8j4{ z{crUVr4nBV2P!c4Ty8jx0vHeFcb$X&Clqe{cM3cHna&S<%F^7C2oB^-Q5Us1gB!F0 zSWEdi%l3X`vEHv{#-T_u5JTG^KW?yQ;-5|UTl{n3&jktmbCp2n&v?iC+pXq~_siRB z{_2aq<4v1BYuc=_Uh?#cH?L607gVj;1>9MfN4roQVs6uq|JHbN)Gk^ z@E^@kZ(CkF|BD{#>uHN~A=+A6RNj+m~Frz}5dECxCqcNd|cv9eN6Dnj_8pZ?`KK?sc zE4(CHfnWp3&3Q6Y^zL|cA4fiFD8hl1o`+Ow*;P(Jva;l6s`JsCIChP-A|ElrS7*a| zvU~5@XEvSfd2wLJ{&O!s0~?B2nD^l2dj3^x$mEvh7bDu77pBN8N+|A~oddgGIKS85sG%V=_mzCwe6S8A~hh>e!$BW*%w z=#doObd$fiX$$Q}p>^nQ4NaK>&^f6>{fvm^%(f?54L4-FJjvIe%|^dpRzUhNuN5<9 zgsljFG7D^RWGEJ5UL!k_eac@1;fbI0N^}#8QF2B|+>+h~V1i)4LK^?b&-G%ls`_XJ z$7Vt&w9JTm;d@C18oJFDKsYVV6c?Hq0K@MhrcDCT0P`K0f2>h9(jis(M&n;Fif5#; zZr;cCOK-dM_Q2xuOxt287ArFOQqhhQ4#D27qbF#~ z8K6?Ov<7jRhUm0dfP|Qn69^4dj1KyTj$0~&P=m#753;kQ2Ec{l)L12gB>f1SJ)*K( znc0SVF-sb@I5OHJI1;CCKRUuB+W-95%kv6PTpr6kY)D!?~Dw z)9@FPvxI>am?IJ}5edBDycuoK1#*EZvKDt@$b-xXAq@hYPmmsqn~DUJtC0*Y-JB|= z!T$0fBQ2I-1%P-(xDw|1@fxw48gEV#AA$;idI|{-!j34~RHRoCrcs{Ihp3vmdpc)` zAjzZ=*}-L9`iuvNZPb+1m5)(~CVWz2EfC#-fM!4HG4jrE!H<3Ab0?3U*|qM>Ylp## z05G--ggp1g+Vj2pHU80sfdJGODOy^MIi>L+k*|mX^a4FC7O-n#-<6CiyL6pKYf}(o zVpQ;P(o($_g9m^gIS~+vXQJ=`?mKzvsEO}G*a>1mfUna?kVtE#B+50!3XVRa1SrNM z8oOfOPQW4(6Bwy-*mx2I`4P~#|J1QCpmcL^>Y%_Ei3|i>62T`frVkM_CaTXu8wF?x z6k@}vLk$4}Z%`DGm671lDiF(PJM9>|zJ<}67DEXENL&vELF^);T@Zr9E>sn`0vpTs z_aS(xZb8=_ZdJrNCo0BUSX}+X&YX2FLIvlF>(`B{^nrCMgMDv@9Jf=0AwzgN^h)m#Xf_6a_1+W#bXE|gI%?WraQm~QYpv`7wk08Yi9bZF;sC0a;YSjFL4Gi|`p05oV3qUhD!Cmp{ewJ_Pdm0B`VklnjAln7A4qOgs-a?l8hzGNicln)suQK_{ko6X$s zS^wT;$hIwfFd7YoE=Fp$%c3%P$?vtH>QqJ2I}l8i(vm&|sbSVH3x@$bkCB_9_mWg; z?}xGLp~zlthY$%T0gji-_UeR>g*E9}H|l$$*B~o>8^`1wof2h5(POIXl*e_(UL+ZX z$Q;n|1Z}}uesv?y<+^NKfdgLn)sh5UVh1MF8RjA z3+sM;(ZEI5Pk3T{$GG=k3pj>{@Ta4$=NiO1e5WIQRn1?Wf8phG@4joIswMRL%=VLK zcOU!s$eNFjyrtiM{Nb)M9q%%*=6Kh~$KPk<&9T=9j%_=CylY_JON^@7v1b4n#jVes z`|y`%_iQ2+%kixPM~Zp)RAc}|FCoJhW6mkaDh^BZ8ybXRpAxct$X5)9p z=OEMvpPq!WOQwzv=&;hj!}2!*Xz(_=g%+^sn^2+`X@kdAUEK^;lTONlg_@|Exjg~I zHKY76#MNj+G08I^URduF4XhERG5sXSrV(m`)CO4XbUffL2-;S7U}Yl@mLgB6kXW^* zvn|jJ)$RcYFSg_?o>|INx{QU^kZV{#a37~pgaOzzo)pu$75VH6G9S}k0@gemo-I)~ z2(vWths`$F=Dwb*CDiC?Z7W4IL16C zQOuy3Kf33W{axTV+yBXd4@g!&xc124D{G)Ft{Hk^kAzFh%Nj^C6^#2k2KVm>J~?;- z8ler|L3GX=CxXF)hY<6_D&O3UtN|wm_irBx!=*(fBccAA2*BC4F&2P>@a=D+KaHJV zL4Qt{_nhwBE1F85L>nJDU4HX)XXok8_2E~YyZA}@xIBgjo=5l^7TxI%KMJ`@gfR)* zU&ih9+;4V+U;SL?<})w9i@0YjMk+%cUBC%rRf5;umbvXT$k=gFesR;;m$9z*F-W?+ z9<=S}`Zk^Jz<;1%7ryfjd2CHLRxaq@J!J^r_M9&N3Y99)+U%Zhpuf|~^Uz;o2S&iL z-~rP9EQARovl^VUh&slGW^HG3)`MwT{b0*7m_r#w1Yj>MF3oc~g8CZ=1sq_Qjht`G zG60lfazPE^7tu*b_Td$oY^kkHrXMy>Hvv(ARWK0hrR-}nd;SEizpi|<*ZRp=51?j# z7-WwbIHcS4Ef*r3TDmj?dU7F%HtxHi*}OwiUf5&E>Vddha(2`Bl@5NMDgojc6sbv& zbq!&_$`TD#f@eQy1oCZdvZ}CX`uBqV8tv92IcM9A7U)shac9rhrPYsmt=4tVR^wz+ zvJw~U3n9w-Z_Oj^Ewl|0IM)BqWxo&r2G>70G>yQ2o(EfX7K|pio^tWS!IHu$21Diw z;brGW(1eWuA;oU_g9!oaKZU&nql4FJ3iX7~m(AMOqpIWEJztYvd>y@z`4W<^%?UdJ z<5s$vWL~Mez*vuJ-mC2BU6tZU*8GJ1eJU1)uRnlH?#N_fAbJS{xSnlfiD%wd(nVP@4E8UV!7pCb%p9iL4Gv&c* zV(oK58s6DLpig2SZ7$^iZZCjcy%78mc=B{%SpnN@fKYbSnI*R{LVCf>k2b8#6qX4TnN#2)yC@T`PpTqqAQnw5n;SD{^v zT`9Edlt;62^3)-mfoc`w;r~yGTt)g54dne?oGR2G#K7k$U!W2&s@6BlhI96n7`GZW7kAr0fSUH&dav)+InuvHPW} z5T~e2@Vv>DFh$)|sFY&;_iQ9pSWw3Gz}YwMy3R+#5w>NxKI?`TY9hMhp?%hm{P}24%$V!`r-p)t zpu!EDLm~on8&fOp>5h1>p?YDzj?99Q2~YI?zoX`g^^>l??AeKba>>7{d*!0ui)K&w zy9ui%d}aKB@ehyt-^OjJ{oiX}t=aKg2Lr?^==eq7cW8*~{L)pVI{pZDPiRocMGAVn zN7O$_?S@1l4A^+IC7sSbl1Z;@%NN?=B4qH-JSfvS{PG-lZ-Kvqz7sHBW7^$?{`dP| zH3YcL`4X6Y@z6xPr3gmz2D0%$Eh>V?9n4#WX{Z!Nz}3Kx;6YoHVoS~2f=HPQK+H0D zeYKE#kti<>Q;&QGniLdOC@pUXZ=e+8THZ*;bnjK6&b`0y+jSuSepm$1{}&KI2osO^ zPuKQ>*cP2M1{g8AXax(9C8voZP*&To_FW5^KGiYB6*(4%q*wi^S7FQ`zX*v|VafPt z)9e66`8JjP;wU>w8%E5kf{u5m)I`qRE^(Aznheu2G>xyQWPA4nDYUq?oxLVk8I z-;P}Y&^g+`0!RICDFyKL_J7Alyx()Had(VgjfUq7&I=#{mDuk{9lZ|>&R|KJ)N zwGi;9#-f1qbs$MUcqmqlxJ~}NFJM2^a2Xr5n73r$#5Op$QLedgM=$rW!sP<})4r=Y zC6uPx3CYlud;Nig5ch-dBNRSgP@{5NPDQWM(NT~)Zd2bkQNaRDhA9>BxQkoAC&#Pm z-_wpGZ??T<1<1MOZobi4gc!WJ?;Dhn`o(QGJmYS(`2Jlo*4*H*o(s??S&`mIVVg47 z)MzzA==5mcpRk&g8}S(EC0Y#yhBZDLTCc)RRB&dWaFbQYxLf+Zj*=H;T*<>hMUtw) zj)W*yLNsvUzaP6=LGEDDPAGwPsSh{by4#_Qa3dsk$KU278$k%92vs3kwnu_c$kQW$ zCj=w`RZ*=(4n?7R4kO{WeMq<3$)o2E?@Yo{ge~$=6k4&xPedfSujR8McDGtIb^T9 z4hLaxonkQyZE18d>1ampw|IhvZ@SkkSRx5EXc(ul-|;vzPZIlvUC(n5Rl`?=Ef+T^ zy;@WvD``ie4fXG0J_2Zu?mBJI6>WVmv((L5tNK@b+ld~SzLZ5+Bf=@5Lq&4PT5(0_ zvb?*tMO2K0kpSR=rvJfTA-U}#pezJkK~AkLLnvb75g&q~r+EM$0ek^?_NBK6_rIqp zXJgrK0|&i`h&BOqA>Vs&i_l0gifeo4Wqq*0)HSYEhWWV6W7jH!rKa;MhMm5GvdcM^K$w8i*OfoeEh-7XJ7t6 zff?`~I0jX})0o_FfOy`9KHHNB=;AY*0RT^isi*>;44=ain;6E!dyW-!fnxm5=pGZb zAdC`mVK$o3cp&aMTI;#b5JiEUqTFT(#!$D2f|G#(#0Q~w#Q-i8WNY$}j)=U7tcWP) zB5DGmnF1RQ4U5iRp^lYudmqeIbqm*C9B$)DYG?F<>w^+TfLl}wn&~~q2(C~uC)q7T z-Ut9Ca>d6^p#KWmK;BSs?I^gVgbb;)XQ+k@zbZb4NkjH`yS@9J^Q<9aedRsJ?~!cs z?9gxq5`(ue@2P7@?*FxS)m(YQ75{S5e>dsc%bPEIZsPwrao(j9FKNGcU)|r=O}OZ) z311pNZrr!=(1kx$B+&8aJvYFXbYuDHt7>m)gaZuMPuk8UlX5!Ol7E0%J)!0Uf5fO6 ze8-#sxVe-v@KnK*1~;GBe{cwc+J9N0e;3T=L_q?h0~Z-lpFG1`v5;XpKnwwf8ebL> z{TdE!~1v6$6kL%&ii#%=W*DpK>I(d{SDtly^k9?C?&z#wI{RKn`DM z3Mepb_$~juXBK)ltNaV}4r$^CH}(cY+jk@9``~Nq>G;-PoFsg+#_7@pB#X59G>}Cka6B6e`k97!RKI5-@k)L=HQzf1~HE?#F38^K=J1?eCm<^*#Ph-#%V@{`}5Y#83X~v-@`qY}pQ{`k5UY z1~wk0cU^O;GsQTnK`AH>@I|}@Ab=nkd9tB`ZKpfm79hak)1AFIG*OHF5YN9R-{J?H zzwZp}-Y~HFMbzu6JNx>vb8l^ldw&K_`pp)!msS*6vY$4ZB zHVb37PI$Pdjh{c$GaXWx*9mUnTNakkWC}qOKtljn9bCS-rZj$p&44?36NG@CwHNyL zAo7K)Q4QwJ>C%&wL0e0PJmjblK`(_BX}ZW!0Di~X4hzKY@0M~qj}y~zXMZUoOAg&Wrrc zN{|wte-JL^Oe=RMw~e)=kb@qZO#!XeSp|Ez)0Aw3=f#0U2QM~vwIrQ)mh~`&{c03 zg9R8n#2MX#1m+NMy5RSUU;>2jz(yRjuLJ@SEeEA`0auLrgO(+Ne*S&sP$EGjCY!F)B` z{z0^em3WTjHD^+?W(XKCu|NG?v|-~*LLo58?}VvZ8oeZ)X=TwAcu`B|_Y2UXrP+QY zn@I-@sW+d2IyM=3WAwCbObCEc0U^Fag}J~3U1Hj@(%zKf%Xwm zaBSPad*zQ$?mYLK7Zp!3fL}6jD1y9 zmIUEVjW>q+4siqk3+_A=3_iO@v#2iUsYmM;mFJ*!Jm_&p#v$Gb3?1|V9O&@j{|YC* z{Jc~CUXPo6_+mPpzb%anuh5X&tGZ|f)U!IIEJz@qNr(aMg<@Nqq#4WX;7|@5I zo#M#D=iEHPQ=b?#_|S4q1a|Q!9yJ;6p(VVbB~b%*^JS0R#WI{Q=^XTdBDoY%uFMzg zeW+u^`J$M=KkfNbH2=o(AF=sRXfUUN7?XcFebWy^Gg^V)pD01eQLrBxg@cw~;!sXw z3uexC9Q*RQyxg=(+lr$bH}U?xitocA4$NP1+DH?-JwBN<+3K_&I84XgR{n-3XvhYb z95$NmNrm!7%{acHap7J;8Oqmut|jwxJzrI_d^@rfsbJW(hyekl4@+^?@Jn%3yuq4o zV`k5{(coESq;IXLu~Ihf44hS8d{1o*$)vdpsOY3LdeXSlZ&5otE@Q&%(Y(pToxUR#Z#2HILX!eojKNJ!s48GH)W9&Cjs2jx8L9yAPLLeoKZ zuz?e=oqyw*Gg}Uy-Ej15=X%cCnbT)Z|2*X2ZtB`qLwc~8QFf7Jmhj{^>z^u8U20gK zUiCDIBFHeoC%-3@Dc=X0l&U2*Xs}T%Qu+z`rr1Efmqj;DfBaj9|HA)x#`NURL6MgD z{H!XU-%#cA8>@VNQvAF>35Trnx6=URfzczqPE$5h3_;g## zDgbmG`SzXp5>BJsGA;W7{n8Qh@C7iX6;jI<;^NwVXSyW?N|*wC{qc_)a7-53BQ@D$ z=uR@?r}0vKQ~Q%l*{VhXVP>gVO_82y^;lO7#-yoWb^y-r>9<6x(T9pSnSl!crFFuW zxSa_|;Xzsez-X87NCrK;A+03#Wl}6w$?2ip{eJGgz%ey4dLlO2Pb{9N`2+B~pKIQY(pW|&6L%${9 z<0}ivs+~;pHzGNpT~<~MaVowgSwt=*44fTXg{9Ru+&DF8sNh9pp*{m&!lm__E?@KRjufJt#FnRi9PKAdN z+EQqQgROqb)7Rhx0#ETX^X0JqH+ooKvJ;wDwKMp?yuLgX;!cqN{uD%gj zd%e@)!ciUWwDOaGib8oBW~=?ZIz}m*k&jY7m2jNO$G^8nYHSLD=GJ}kk9Mx|{$G2^ zf!{+3Y|Y3W``_vvyY|)jwbzdO=X1%P^_g$kvo2h- ze;=;dyfc43mh#VP6PFw^Fgm&fhdy2X@2|mpL}PhXL-`0sa{p@YnLv0u4M^lNKedds z6}0mUp}nH~n-DX9e^c$F4-BHCcR5R4=CXo%rk@%Z2{G zHy8TXuB*Lve6?ZtFVAa!!)LzG-*DkV|NC&Ezi^!gIPUil|Aw0~b8X&*)LVK*pWaXj zaKeQeVM%jx%@50Uona(}1<1*nXC(%;cG;a1FS+!AOByeJxb7Pl z-8JF+;~yGVU;AfxV1z&A%lmEwf5U>#+l0S?Tz#bBVSGA*5fKIBMci0p7&u76C8cC} za~T9wbg{;hO`H$HK@oh2zbB^<$chDkSF5u2sqF=UEDSNyP$GH3R;%AvC+ssuG>J1p z2tF);HuxC<#Tmp_YW)uGE2chcc|)-pG<07d7y;^TE-w^${LNqdtY$8FAySOf3;>|d z%U09B7afUhS1JgB_c9oVY!dnw;&};IMFcftc_ycxOcX@5O-+l{9S*T{63E#iVZu@v zhlxbJ?I1Fb$yY*)%JqHV0H|AN(g*%c&ChD)AW9U$yIy3m6Nwcydgq%{wGHMy5Ezs| zLY>pvmVibDUz33`Vqeu)9!epG8Zp+<8Y`!PZ%NfR8_8{60LmDWv*OH`+BgdGI<2jy z-eC>5TH1rK?Un*3HcT(XP)Rwa{Tha~v=58|b&Jc3W$gd`4?x?vbSa}IB>3F|!1-&E z#5}XN)+$VXO0O3yp;7|IB(5($0=`R;3>=YbnwF4&3C5{xvDk-eDEZ9~`vPKxUrwwoe6<_T-;tTsg7f^Rc`LS@dBWYVU zwK}DN^Psnv6%TT3?SQYK7>TEW=+5*XWP~;Ti@c4!OxM2f6$EMU@F$366iXlVBWDL_ z_E7^O1Vca#fc_RA&cY*((y*B}m>$>hdNlKJN$&%wqJWAT* z&t>^@L`Nc3`ywx~L`k+H%aXMuP83D1m4pQXG#1HH+A)9vNsu53Z~;jXTt%w5hy=kM zBtWveHS=|Mx+g>RY?fLZ$5ezr?B*&Wpq0MfDmwg52vHF*iA5&#wK*x)?A@?PbVdAS9=?Nb1# zI555D=%3-{UmAb!n6meKM`ZW2Hn8Y4te(lxL)n%9)mx>CFb-#4PY~z{4)TOqEfoqb z2Wm;Id3l#$)sjF-AIyPmaGS47@pa|g*9V*S61IUcod^)2VD>o>1uEnO8Ui_7x#~s+ z*09;z5IP!uG_|kxxysm;!BI@7g=Q@?q1x^%Ps3^V^fKYq{##-euF(J?_>lRV?0XP93sYJNsR<8u*1A z;0L$81f+#hnOd(Zf=$}x&uhULz%UeG zPI2)R+xs!QjBH8<)AxEc2Ta0kPj@Lqubk~w*tzabD0`vmLmigp3^&I)AVO13P8nVI zvNMpw{bsS953jd@&3=?~&46zs@$7@$IosUnPTIIl3))*dpU#21aNFm*zG28H8}~P% zg}{AF?eq)ix~&idD1m8rZ*mFUtlktAy?v>J70x!LJiD>2iJe`!?P}P?We@el+rcYu zSrTtd@QSU1e-6TqV3@Zs%c`MGWp~$?bD%EV_G0%Z^@V1c7jkaGoT{u9cUF1IJ^f5V zFkGB_+qCUW`A(3RvE_@(3!9#$n*>?r+KVxHbJOOgDcz8g+v1JVi^n{2X2&;EuUfk2 z1so?spB+Go1P_O7jVazpftPs|lhu8+<8 z_w(+(<5zBf=C;qz{r;_gaLdLyugqS>1=IiOdNlXAG`YSd`yI1NA}KEI5_lW~ODyp3 z24%)=O=lozq&4*jU%9)oY|W~L$fex|xkiBIJ7{BLnm+Rj&G+blW5ALHW(ORbDORUk zyj}`ASOz;qt_Vc z0pBoI!*}b@DJq{Y*jHE)00$b2V6p{auy(q|2l7pUI#x&YDKmsx;VnYjS6CZLvAm-o_X((^&j z;VXxhgKIh6cE5Uhz;kuq`m4RPf^u%8wPp9!?FXtByas&(s7%l|!KCtBeQV^(>5kIl ztHv@&Rb9W3`*r62#jJKG5tpF*vd$U``X)n8xu^9jgSpM4%D2HZ+Jt?>v~M?gD}T^= z5(uvk2G)D7^t}b}s6J(83WPwG4ge=UyxDVQ_nIqfHvw-t)ua`@>xtZ#Sd*u^v|)i5 z1C!U}>R|s5&OqC32Ou#^Q`(WX5nx|X(RpMtJ69O`R|f`!6@D@^ZS^*TcDWj6A zQRjR2So`){Zym7qZDv$=3RNR1l&dfId3lL$#qXbbgEEMY$xBT3+}U5*tz~;JcOJal zxq`m0`nYQ!!+P(uFFJX*UhX<-kZoDsEmrTq`1$Snn3?U@Vs7)q%5}Ot0*u$S;j#eb zp17RtFrzClulCBVd=CYy`)clC7VVj9?qFH@&fUd}>%r{J@7&JPP1?iyy#Wda^mmWJ z?!8z=CE1%5yV%;kzc4anb?lqs!YMX!Veq7Np?k^|RtES?F2=jOm`z?|5A!Y#Ebt+x z!}g?I3@7I|pSAkw_6sM!ZLkPe2+DBRDfzkU+!PZo-^-IR3(Y_kJ4%OePLAuHz6SGf zrGY&>t|*9h^8y<$@t|;1m%ZZCZgwU4Q@JS16e^3=>C>g3HPG8?_Q$8&<E z4UXReWx!Rp1z&i&sO7cyItsV*Y`o5(egnH@z=|~thT>7}Pcfm#t}o^yyv{eeKjG@! zPd4c-YD!EKi=Djt(YgsHn<$_2sB3Te@}+R@)Mri>^^^C1mEzstX#rxGc&n`=&rA$3 zcSrX&J)@o2ZD}DZg2VQEY3z1MF3bYHT;aYaeg}zZ_eb~+ylaJ_bot8R+NmVLv+Blc zF%04k@LFx!H=&>g$9b=D@yRPWg=8oZ0#4NLd4A=s=3OQJ|BJJppLNgwefJ|D`Se|% zzw`I!wchdG9rxdU`1ViT);;&?+~2x&d@la_lX#2JcKQuqHAmaS9`lJ#vAtoT{k;hY8)y=94X96aZZ@w0G%_EF1XbWM z^Zi$8rUmeE)ddZ$j{p_=2yv@c9i`-HCdHw4+Z?G1C^6Xp|O zKFvpZgML=J>dvR*O>YRBa3Hib;HZ;6pn^QviaqJ!G3LdjGqwcz0H|s-z?3aE!gJTJ z=YET|d(qyzvUb;MD>lVK(t%CTnRRy4ETml1f<a9PVW!&)&T)Um^Ti!8E&%9?RWdxU{*IIo?$4B3>#yYJ1z4=ugVD$qaT^L-S zKh-<2=PbQxw6)?(xfjI`HV^n!i3G@_XVR@~@)Ry@#i=y4+idd1W%D&IF?>-1^i0z+ z138VmZJ1`zIIN`S*Kr00V!FbW_C8I%z=0OOoZ?p->}h;lc6aDIb1$&4&vZuIx2tNj zHF-`i(%!usE#F@L@~JMfJ7YA^fxLmM+nQ6D&in^^D!_fI=Y{d%*gYvek$axmJl*+{ zJDbUmuk27Y`TMeYOzPt#-7GeO2wm3H!t=qvkt>G|nno1WeJrY)N_2iK_ncWQZR0dG z7oq}{GvYPphZY>UILS~gJFzx zHpw2Mp-k$_V7Eq?mwU$0F;tow4ys4r+XL{Vsn(-0auA7%|d!{4D^Sd@y%v8_I zFXVoMb$GJt(`Fr}_LZ@cjFlhgna<2M-_!e8y69Hwx09^v{F;5%x?ZbeY>Eq~(4p13 zwt7}fcGT$n6S*hN{Fj>fOW12N9ScJp)>>Q{7YmyXu-Mh!G1w2IT0XUg&sj&W7r@e1 z7s{&o5{}_q z^ustq*iY09x4r0e`_6QVmaBRsj%Ol)s3a2Mv!inoK%T>F0a``x^Yv=uQcI>m4-`s6({ zSwPVGTe^tok}2`{;20!2h1MypaLp()lNtnh<&~rvigY_MYO1`n`NVFILd%k=sKs2Q zXNoNV?6ok|>H1{u38?dWR?lydF_(^*g`jsX+=X_{zAVXz;b+sI-B}*@WHSpS_Wv)> z+BWN+4fou6ckm+r3w-1afXjh)c?H*_O-RseM@_XLNzuoDW!;OQSj&q*xyoC`AgLc5@ zr`W2d`H*xk8Z)-7d?<+=+a-lVwxncsoTled)^r}DDofYf5d|V-WRNlE>1v*SZSbqi z_kpE6&E*qWtcEwA1qfW*#%nJ#cSI}|&wG1XUK66CZQC!S_T`g_ zc=RN_fv$9~;g|A-xcXLybE}81q-BsaGVI;QPYX>j>30X8V5}#b8OyZqFcMH$K6y4nD?!3zE)Kwn`Q}#dI*Qj7Mg!6rog17L^Eyxpk0e{+v&BF1~km%v!h08oW?gwNkX;p`C?w!^UBy zJ4trS?hzt``YX-L)W?)JZO+;o_+H&x>L9R=?aX)VxBA!Uhjd6Q_8hh@^jO2|(Jl+U zhaCk|JyBgR4-%Q5^AbJLXU9aPcz-z?<|O-1ld(9Ys~Wzur;dozM>QZl=@fmNLE4jP5Y3$DX*S7BG!vB?nkb1KpTXI4%;#1Hq>zCx?H@_FKw7 z@)Y~l2idcdKrFkAYL@oaIBuNQ<~JM2m9d>@-x?&wKW9PqW4s1Q2Ukwe9DT>hD@RAJ z?(fjYmp5Y7`w`sba<3uAyOpJ3132oeJU6;F7(+;h@0cmUx zw881BM$ys86e6AQA5L(X?l~> zbhV5x;U&7IphVamS*29VuqHCR@=7yfnw_-2cf7128<#cSZ@xlESN2f#wBx&NGd-;x zu5Ej7w?wi`*YwurCQ3P_F}7r=%E$H-aQIW2)Tk_5VqQ2`qN}tSqtw@S8NNJ7lzz?w z*}I($SbEb%_v0p#@y*Mc!^_!&#tkT&5Ko}Yu%+@cdm733GNW%&aH!qfv~631gshAZ zdY%oayYan)ZSNg4zB=d4+B{UfH8jT29&s=3X8WT8nk($lIVxFRnIdnfb&1;2n?2f^ zZf~?5kH0%e=$;p(0j)}yCRf5dE^fkdQaZ0!C1NTsvLC;UZgApRr05NAI~8;0b2(@E z*=d$4zqYrw(`S~>(v7z4nJjuJ3z09EHn^h4eu&VHjPW<6>(b_&N!La_LdYMMT5Od=r`^HBO(R&ib=Rv(Rzw4dC_Fk*!On&olVPMU~ zj<@q$PFo}U@u_ix)wh+#)cNdkYsD$YZs_{`g8)V1@f zs0d;PVB>N^Q z56|*6JE|x4|D0R?msz)W^4HBjH&@{13jBRuftB|Q;@2M^R>ZG6);%@*(=%#T`7>x& zS#FiT&`d@T{Ujer#h0Ot)e6FPogr#MW6OxG=Fv7}=slTc&leq--}{S4-%-2VI(s^Q zd=L2^3EJ!zkiB!`?kWL-R!@9rBvyGpEp zp{#T!f1;6aIH!Jo4*{6d1Re9+J0|v==742DyPuu-0fw^jds6U&J#ruF!XwL;dB(?f zTg%_!tCGin6#sZz8(rJQ6QT?0;ndBa7-00`+wbCaAmqmZ%Ovi1Urwg8rjvKVt(P~U zIqT@z;;}upyF|hh9_CRzxvO|`uhlbXjh^F5v7Aosu5hV1#IyY%+{1LWd3%1#ZmWN7 zvG>@-V7IK#NQdYJXO0!O^jWKSjgPG3TlZCDc6OW5pALSzy5pbQg2;vllJ=wvUvFqz zVwYjh_b&8(&c%764P6QkveUosarpAdCaTO^B}hHr=Pg}H5&v*uHAKBr!hF07NjYHzq-yanwI zW=);3fSY+0^X1`;a^XWi1wP|+LrSqBF2_=n+**Z69YBsr?2cBvyP8KhS#D(78|@8Y zTA`U*;EKy@k`Wc`_)7WHa2DcKNt(94=I8mQ=j7yT<_oP27^6;k@)eaRhF>Uu%9lK5 z_D&YxuX|o;5F6AGwhG+twdMvi|E30dPBJrQWA60OnVY!P!m=;8ndqG7mB!|H$`~L| zv@|b$1UtN~b-u|{ZfkwWJcWN)wpW&<_eTW z$75Dq-qjwL7>(PdbSa%drCx*FMW-p~)72j>B>6g-e*Cp`Q{x-1lrUSmMS#~{awMup zAjk+Gxr56yod?KkJnV7CmfsdGZK&*GJLQlvhQkUK1IrhNJ`da6;7(1xkw33%(_P;r zWP6XtS*@wQE6b9d5~bcFWo@O5*oQq8d7BHDka=4*6-V6Zv_u*UVWlzZ{QD<8?fz?B zJ^4}hmw~8zJTI3$xqO`e_6U=SH?~%H1}J}HS?g)n+1xyXg>Gzqy_R)$R=+|(7=bjU zl(BWLCS22>W^v`attFF2C*OH)3}p6If8+mfn@KKe#m`Y~yNE+??(i}rk5P{ST2 zGSrw}C{v$rZnWnr83kX!z4j%Vz~lDh9=Ua4q8)gUmWA=w7x^wK7tJ@HYwgUFP4XZD z(&jTF$&1^T*q=E<&X#Q{@QqSwSDu@J+#&HOHZL_FnP-2_rIScVtev}OeP-4@r|$l} zk9_LRqw}7){l~XGJomHY{QKs7cJ_R}>YANPlS2{Dn!Lj+cg_0NtS1R+G^cD_yvo?3 zqZQgJy(E}%2AD?7nl|ywVibO@mO+l<2a~Y9$&n~m>wgP1ZIS4}Pd9wGq3H`Re2JS) zwwipV11&1WSPU$mUEiRGk$rh8ooHYDJb-O9s%}lTG?+|6y`2pB*Cg&MAKL(b5_0Ey zosCkTYqciija-UFNM>hCnos#6m>dD|^p;Qmx~m|ecLN9~YtUZT`827;S*@?H zFK*U@w-%VeMDt>Ca2ry%FRw6fcjS`hP zQR@=eETOL;_+X}_K9ye9F2Qa=Vyj#W1$b)DC1fqS-k7u&1}BO4nh_)D#ZFR5U29-W zMb`yB(=~wMv1Z8j)jh53T=n7xAm{a5T*N@v_uUsKoh9?$*b?K=#-Uutd-LE0lHc*F zT?%guoK=XcFR?uY7fr3)A(n+_!l3P*wpQ zr7FkK&B_z_CBIYjbCoZ8*ywQ1Ib%zu*F{6KuNpe9m$3Zyw`KKA6Yp-V{M{~vf zo#Z$#G>M_vNbVIDrG5FU!Vf=?MJW%?<4(UO?u)a4m5XK^=#z32uD6IJk&Z~xAl_~} z2XM;Ol+->v-xATEbXoPXa@`3W=#rCQJo3hoeo7~D&D9m3yaXSNo1RdB#{>|FPT;YZ zaDt>?+WC=_mYp0ZNxeA1CG{mXNUhLG9;5M&Q##5RSrdc@B+qJ0(-*p)&ix*w`+T<+ zf(YrVN_nQHj?picUXL1I!##oot!CUZwtl1$?Q7Bn)g&;*WpSy^b2Wr(uDmJ2lk5nA zg1A8t91?Z zgvrZ&IZF!2UP%}1x@c|eES@+t&6*>pFL(CI%bOgrDHBXgGD`8_iNeWYzQ5eL<8tSo z%U!E3cWt0>qOhEtl`W=}jA3^3ikCZqo6+3DuFvOQGLm9}yWS!xoJb@;q;z1{p1 zbDBt`%$clNurF&qz7}zJG>Cl^VBdUCO* zT2m8yMH^6tO+$Om^Fyz>v|-E;fmx$ACumk)3L`S7nmHj`^+FN9Xk6A69g zm%psKT$zM61qz5~$Ir}hPSK+HgT&rdbO}?QP}bPs3u;8UUKiuw<}=D8?Au+zEy;h9 zszrVj`G#iWJRM&qzAlOqB#%y=u;ylGyi__9N1-bFrg~J+>bXeb7Bb0-C-5rO<8rrX zEn3f^Lp@4uhrNZ&)$)6~#lBEt5|26c9eTa|>hyVNqynTBL*BfM_^ZpWl?U1L|4qSo zNX8oK2 z+9{1Q*QS;%V=c5+KL@Ti;RWaBdPvQZ-VeDKH)$@XLt-c_Sl*3|?Q(vVy~{KtHjcLJ zi@Bw;nO7{X*vw@I+w`P0&MVgowQkie#}>+Q^4Guw#|3m&$StmNt15nXbe;b>M?Hestfl||F+KU2Mzjpkm3OwX*) zP=_3**Md2il4g2xE)YW5+*=FHDysREtLmj1F|j6+L{fyWFKZ8LRvqdy>Z07MQikwId#gK^+rvvYvA=>?Y`Z8y-OQN@~tSsK0Y%a{H2{FJg;U5DTT&uDCxp>{WU*< z{G$_@;Q|1UeZhD@rQma#x-he_wJy!2ZN_ujg=^I~l`l{?IwC2|W_-NNc4oFXcEx2Y zC0(|Q)m=la2EQw}gf&cNKkKgHlN$9c4HsET8i!A#F^*<4v~Olijkt#ysc zqnSDfgrA18%BJKlhk_5cV`|U=;WmD5opo%Wu` z3+FCMO@Gf8Yv?>bIFi_x)Wb@Ky0~{6S(ndSgMM}2CciJQ$ ziX+Q5!J5?zsR&XJg89+bpuK-g`lrB&+ZYT2(BTl@#^(5qLBLvP$GTp+x9NlBYa~@< zWRs^Hj>G*_0BIeJ4TH;3ew6{_;Lup>FogpN%J;3TL*!7 zg^};Qx9M_rg#ql}Y_c1s0@{hF%StMg_=ji9Z2+X=`gCc@eN(xRaa${CPme z2y<#~MMVHj8MG?Y1&1b+z#iZ>HylbQ13OLIWl=z64!GpCQ8=0hL8P4>0$WA*oB`Wl z%Q5A~biCc{IrEu|aA6QQTv!c>k=WOMmyJh+K+-4324IZVWpqAg2eKS;Sq0ukn|KBl z>_+~T7bXH^Hl%s&>Nu4wMwx@ziTc>cZeL@<0_K*wU$e5^S2ideFUY%yn9)wpUmJXy zR}Rn{pi0chdt5`xIEWkOGG+=ghJoUs%Wa92P|^?*_+MAf$ZN$-QUZ%&2WXUr$*N$7 z{W_03L{z9cVJTP4uvqTVp2dGR|J+=Gn=5d01#Ygu-~9><++%PV{?t@? z&%Wc(Cz__KqFze*ZVP#13#HCmin||r=pnn%n9?ziHMVe%^XnCHbl7Y8ax_ss()b?;S)Cs@xB#_vTronP*YiJ`h_(hNV$^82ap!V9r z{^9!`^xQ`gL*d+U`AI)6{UjIzdX0U<;hfcX=02x#&K=ORv~u`~fs6EXlX1Q#fBBZm z--Tl*K`NvwDwU+nFPy9Z44pI^5&S?I9fFw<9IVo4a zV8&>bzYF^}$Um)9+%83kWw%>HtE^pT<>Ehj%iRBn{9XF=ktv3FwQ`6;_K3B5&^nUK zj~uj@9|YN~tqnNC{%Yo3b+--BM+fk4N%@=$G!@2D5_f4Ymrob`HkGG}&~&Un)WOc)U`P z{oQnGQ7OJZKk8jrhFd}W$K$K%Dt}E^1!}q~Si@D{a~H*fvTu@3oP>@?oO}*@rKZdQ zpr$@W*=^YNw3d0u{5 z2o_;Os=V^rNw0j^uvO)A7A}o1n?GM*{tZloqk_*b-Q%R+y;OOlkPLhQgH>3@Bl@xP zx5G$eUQBb1Jb9s%PM58abGQ6!zn_YDNq98xI3H`Hxy9rYHMg`b6!?_#7cLF(xv4*X zRuNUEnbWoLR-)C6TY8%Py7r=!zr1{96ZgGK1>sB7qpJQPm}$+RP0Z^f>VF` z^I-s4*BMOn<Nq9U9+nVK|m|uD)=O;avsG2Vaba6EmBaJn~!XtZ)W5eSBOes^A ze4C?0L5TV{k+Cs}ik#)$R7 z=5jSG>?@^k!8ITC1;nEEz}QZNT}PWS+gy^iTmphICS7BD?I^w^c9RESUJp!cd2N0dd}#^R3oNy1 z-F4jaexIa*UpmWYHhPAx!!%VGCX}CjF4qEsMOGNN6}P0(ZMqp3p9vxTNlYZW{--E| zl45khr6`N$|CGGqjEJq<^4?x5iYOa0X#yqEURzQK;meDRuEz)>H!5=vY%ZEH-6>*p zE1;HOKr|6YELA{Bz5~5e+Xeo=>|Lgzs>wFbhH~G5s<9QHackQQD^vnxTsb~4iLB-6 z3?6~5(3}PH+?oV^Dd*v*q~{MthE0zYH;1C^-AisaTaG83vKl15n}AWaTGylHr0fiR z*o-N8bvck6-6PUCgIILVt_&VoKdf3a0%)0>XCrTqU{2WQ>$<&S**&Trn)bzA4H zxj9Gq;KTMO`}@6@&Yk-6|B$^j`|eruW0drMVB%z@dqMzYqij{Lf} z3n$<9{9})m>l!~lKr`3;&VFsRO8>gTxmu z6I+HR-rg!u*k^ZHBWv>82kl|aLj{`BJd_Kp^Bc#{@1E#fY4r^2Q}kXULh`NYL_e`( zcX8z*>&!83EOxJ_;!LL0w->P`UV7#W!1-wR z=L(}eCd5KzbVpr5b}DX!IHK;2~j-Hz$L zi$fFd3>OaPJc|s5I90+X$*k35fu}D)ci|g2N1A!}3n#E#daG=4=kDUgL1~bEZbiO# zBN@TMFzbdHVe*wA?f==>HjhT5Wy_I9Ov@xtO+EQDX9Uy#*r+=!X<<~trl9uxw3~A3PY3DuAc~`dGkailm zp5G%)grxmY-+FfQ#HOLb;8yG6yQD<$Gu;K~TSRiO!F)}&gK%Lx2eu#3I}7g~mDM!& zv-u!g)evkg?c`vMjDUAo>{w%6Tu${IcX2Uo)HzB#i`rTmJr8)E@Z|fqbHMP0^U)%Y zwQsG}bDB(Vwy$#<<+r?D=svB|Tc7RD#yYnNj*xkD?d3^a#>4V`{o@w~MaU0rql<+5 zeq2`EPa4De@pHZ7qo?If%p0pz;(^7BZ&|~~cn6L%mjQxdcCiv{2Sf6VVPK)6tp~C?AfOb1006|^kC1%X1ul4fnlvV zJF$GN=ULKWX}~3*&mCm`mVRedw2ueh^hzfxY0N32n;l-dN~Ja{TReIaVG8D-J>0|8 zj3Zm+PQEQ1J}ld;?;V&(=~~$J&P3-%DCAB+9yrob*uPd!p~5-o9pat}aF+eKIhx8Z zMjzoyX}huOoSfpN2OoB+8uUg3QEw2b9SaAe?8KQd{c`qIL)AmhLEX?jd!|%veZ8TLKFvy1YxQojJ#30jtX#{9ZVl}z z?qA_?E?a&=_WzMBbV}L6forWl06}D9R$riH9Qjk7g#*3$b^F_vM*Df%t^l`S(=@_#vY{{QEK>HX*&_*-Gj^)l?4u)cpkT(?YBZ$$^%G9%(_p&z_ z;=f=d7RdO5fpjtgx2zRt&X)51KZJkY`uMabhWkbAWh~<9d?YCF2w3Q zZKUpc&SrWrRE})u^A=vw;?cF^kjO|)Pkz${TKw<;kF|C1(;jQZ+QR5Y^dzG}_PCE= z(-$vn-3fu8)%?Tn6fR@}eJTEDt@bXC4*J(9Vw?jU4E;L~78Wrp50 zK01nVqAx6rfvqyq>ry-%^u{>2L*ZaB5Di5m?mn+sArB>^r1z7J5lp6ofp9v8$Vdg^ zv1BBTsuoGsxzCOC4jGE~I{UmmJI@gOwyBTr7l}-JtTSk#t7(GdX?W&&7An7OOL5h4 zTZS(`Ad=ZA*}B{9Bh=h!IN*SF_Jq|ptk*acF<&D>S!gb@H}F^o2HV7*vxUJS;Rds} zof|y)o!zuHaxZ2p+XH*_L`FJT=lURrDt1637uW8!&W=d)!=b&HX5=+#Gacup3Zs3c z_wu;(i*iavVxgFrL!pQ_I&=CZgWgao;$ydmGC_ZeLZoESAISvM{&2>Z@%!tf-+gNv zmq`Bq?X%yXb@z|&%Fi3S{ZHrqvs?a%UvK{T`?>#YOMH|iu(iHboY_Q}yBD5$E(SZDBSoM8nK>d3!B=eyX%T$~>|r8&%U zp5eT>u-tu=9Jc+K&gZa<3p>!XZ1spE99IoPan@qqkS`2Ltd-|P{u;Xo!sL(alL31U z76w-r21ii8(2cC~Z!=}g;Ztz32UnP<(A!1+GSuIf-`V+RV}sVlEog=GgRzEob3^g$ z5&n}5=W{upho@xx++cC_vHZzVd6Tujg|Vt!vB6849ECErM(R{IGp z+Z#<~A}K$1R3;pc22;LxDwgo40x@qgovv4c_YZ%w`BEpJjBP~^6E_KG;rQ9*;=o$9R_N8U9_aXJzuf#Y+puDf2D{9wy-GO#++p=x!SZJMv53q z47t=(Zi$y~Q<((D+=U@LvOJq^icP8J*Kz3#!5L>T`C*zu*I8@jsI~7T?cZU|@v&{z z7@vquAwou59UIxBZe8Jo^Be8EP}N5_kDp&#I6tJ0Sgv>3BNp@_5xg<+vG{|&l7Gcl zD|>`u-asIbNTf1JEIQP+R4VNaMlJN=a9_0^!E$*y+w za?g`w20tMv&Ejk_VnSRKs}HEKKo_5Ufh$LZ7u4xBk=tx7?@}ic`%e69~s4MqTJ+2H`V+^Rd@X;N4AWg-$-YU{O*-%S}}|| z%Z&}_eC_CN_{~Co{NQZ=D5Qv#NL%yH#|i2WCL%Gc>R2$1;P;0R1m1W&8c3)8kwo1) zKk&`&PZ{0&|8b=K_qt!arnJW%E*@P0RVOy(5csY>-26HlWhY`bKe`^Ga^6pD>!&Yi z$;P5pY4PHE7Fe&-EhAx#?H&1JU9$U5pDGM)M)Ygv5PcGRN4_#1GZhU|ku6*^DnFRm zh`P!0YveG%Hp+MGfFiQ>R=maD6kUVJ#=ia5(CPB9jL_T|NqS1l^~6s`*vqTo7Q{ZY z7qJhm&)_XP!Hem(U%OqN@CE&Wgg4+zMR2kO)> z{?Ckb-)cDJhk8cfKc8nS2G`aK3j_4K-7Ks!yh817&!TwKYsCCjYaGA0!#c8+b+>!n z*cLgJITKq?j*pEMhQz;mxns4nBlR{ZvR}J}!^X+DHu?P?Qk;qX|ijy9_wxq@|`9Y4EUTqYgs=+K+reFolumqe==UZ1D+ zd|xjcoCuyU3=u#AU={BGC9M_9t)a73FT=!@>*c)b6g6>tWP9z(uY)2pmL znUN@-J4EGG<WRq3GBMuXcaV2##xWgBwe=iLWj7%yzc=w&vHqt>m}Qa!d#b zY`wdiJ*;bEAGF(76;JP#{j;Zs?!;!xNl42+5T+YjECo?G`c~U?gevUrRnkV-e)_I+ zg*_bQtGUwZ+bs@5Gpi|N#c*Hod`^Nj0}@M+oxZ*Y@h3Dko)~UKObJo5=S8nD;}mus zoY;Cwk20CQ?dHLzIdR}&&tf{8>MoE7pf8kJ=CVT6&r$BfT<}FASPv!1P_xD0PvCXW zgu-}yaoC_J@V{i7h+PbB@Ta|Xv%+8h6NCRZ>npSF`NT)QeCN0Bc=@*9yY=}wkMP0F z{$!ht5_;JcFrUckSv0rG>?F&=5eC*6>ij#{TzFa#28DI>sg{tAhoVFFw3JSOn=U%2 zL|aepMmoS``HgF#f!B5a;U7HJ3v#OMt+#K2YA}>2pnXS+7k3s$j}!*iTm9mw^JwS< z-ww8_u$45#-hPNJ+O)x+u&w}F6+Y?)td(<;!=7Ae>qn?4nkLS*fj~-^K`Rq~D zRdE=JOZS||+PD@UlB87Xt-^w)qn5s`+E2n;+gEv>`|eAPl%2H$1O2j^!zeSOhcRDm z2J#WHBM=`8_#%IAA8DCKPlQzE>Q+*-E_k2#i!##-69P)f*qbfxNy7$8Cj z6BPv_PBOmk| zR4cz{!ONG?*9Lb^?71Mn%fcQTAfZO|E`EU*@<;Z{q1}fUeVtr_`oL)Uj!|*tUod!F z`}P-44Px#i<}Y`wwU-=H7cQ*he6f0V5cx$SNkm^BmD{Y-5TnM-7d4T(dtb!E*u|ry z0Oj0yPHd5r117<@VJ$z&VTTG^ym(#}Wr)iw=2vaZcO0_Tt|TOAIFM@QBMgP=!@U#B zM+%#^7khKX3wvd#{tLJ_s7e=gV`v0+;X{WNBB2Nj5JW6Q!mva=7D^-*@rC7J@p@C_ zZN%gLWGWuSYKi+04yn51LF>Qp*V#5B9RA3$P+Ge+I#8XoRTv`VHGrRi^cPV#k8B}9 zV|?Vec#(QnM4kTiE zXD?veNCOsAlWue)t6NKg!eb@?cXpRd&KxJ=o)`vg;E;9kl!)}@JsdjrU1lmmtO~Ql zcs0;T0kcvpw1G8uGvA zkU!o1shQ}RDiW<7{aEX`mWyk$7Sd9)^;k}VzY}k-mue4ZT`SCsf9#PE{kb*RyW-1s zhmoU3j}62h7#Dz}yFLXV+??qwR1QgxB9 z)be$|m0^vUi99Hb9VGO}HLkr`ahc|H@UkeeL)gD7=!+FB%pYaaf=|`{a~| z0ojYzx&!!atrKHyotJvPle^$RpWVp&TT49rX54oG$%BP~kiqZNYj`MfQzd{34a7WiW z;(A)zC6&aJ-^0;rtRNH@ZF9bo^@d zylXp|O+FbeVmJVCt~(k7z+{sc2eJAa8P1p@CVNA)w$;0(S;GaOKJ5?@S|G=U>yeT< zKhl(HX>Le8-`1XLXcnoX<2s}zAIpo&2xy)Nfu&%iB)x0a?1Pz1IFd?4lcA75m?Q%? zlTP})Nj7gLo(X2^)#Hrk_;<|Keb?E#uV!DaL3*=Wsw0UDJh+3b^T#-K3nx~q7!&bm zw02vGMr$weh(si95pA3{k}+A~v?0YVze9GkJ@D=`oYq2!?YmH+>;#=ho4@;*r2589 zUv3Tz4RSCrH|kNL89B^F1BsY#%nnNs+UX!V<%!Or!uf+Rh@KesLyZG~hl*a`u}hTt zjveTBGMeO*xkL{7$*m#d#)qW#lFQ+mZ#Bzj;{Hi8Fav4Qr-KQ<7sU)G08R!n@j~HL zz1es7_5Z73wg30dy63TveCy6$NAwBt#+*- zg+CcDwJ#V61Y@a0B9utP#4D756*AF!vp?nNP#3_DRy#+>ce+0_<&Lcs`L2UGziK76 zkLu&HLrvs1zk3hNeB<{f`}R7Uv*dg%83m@!NR z9$e4QfERq%;|1Fsb;WYI;b5DiP6=8${i?WnYN_Jdrxm1!X6b!Ke1HO3usfFuv%j{&N|LUIGpUOUNNIwJ5@U9KE zXZXx9l5MS3o6CHn`R(V>6U&7o`w!2l_~uG3WZZYOR#Wf4R9@^SSa8zLV=+1WtE$|{ zcI*)q&WR-uO(d|rix9O*^u<4T@f7C-{!6y52BlQY>#2)?cWxD?1*cOta+$}+v~#4j zo!AQ}2IMNOCg2tOy1?{&EZ!EEu}8>rw<8x0&BG*!_yR%1H2V_kJT!B`ACHEmB#%*|vArs)}rs9RHy2;hpgku=>df`O z|J|(5(3o@rG0;%a@9t`tfr|b_qjcbCOw$52nHIHKb#*baOio9kYYgLy1re9O@%~DR zLB+P8Gz2%RGA7xe&o?%JT;b^C%a0Mo5s_;w0tm^4#h$~GFtT=_(0f=#x!Cm;u6)_* zng_(aq>~WsMXQHLswYo`+2F~RXcr0xyiuR{>7yaSYp%eq*}Mux6F#3mK}A+D7>otN zaVh{foTFriq?3X4Pot@;{r}LcyZ_>@|1$5#xBty;AHDSxa~95eXc~)N13EwY6F1KP z@oajAXL_-V;wO>s8vj=Ttr^+I8W%fFeWNPhJs4gjagLwcH-2t|Tw#(nWPkLnoyhgT zEq#*Rvx*E7Im%^c8po1*j_Y%1fyl8fvcK#sFP-9Ncd6wk*4q>9ZPHKNu#V;+=+4Bg zBlWgC+2{f;qc~O!?gEMazxbr>VlYCYgJLxf7rE=qJ6r*0+WslK07VT`hg)zI#W2GO z_J^p|r6AkomYS9MSSW-&A4?Gr!kf=uskl#${6s7nieoI+alHTeUsHa+Vd;Tv!WiTK zmwUYbitX;L`FI~6qvx*4^2nE~boP>yUOHKyv%j-#Xp_bP8?cBdU}9q9c%f9cyrNeb zK=-wsEQUJgkkwGpra{{h0ifz^ZhE|>rMU&=;Q|>0sxqo>rr|bKACU>;=S_yAWR|T$ zAs~?uh9T?J8C)l64}c89oZE6*D|X=k7{XlW65GV>{E=WR81qGaQLjtvnvZU7mb^o9 z%Bkdv;?BX zCC#r_y$YA0PzVQ@D3+Wc>vo}fs2<_cJm3ulLs7qvMA0xs1tpr-yutmEaM~+~8fXJS zUm})>f!RSG2uU1KVz~7L?1ko^T>s~PZEx^@>TdAQ+S%eYZ}5q?Z1HY;a}+e=bPqr& z8d_)XN}|5e%dHEC3hOwjr^x2f4O-Z}sc`VLv%A&!uK;`|s2VT$q{tWgvW;SjaLi71Gt0p!KN%YhlWxBvOen$td zx1&W}G{lDLRDklgr})-+wy>kviz8Qo7UT*ud8raI`86WwDfQm5lXxDoUca@|L7m`} zFcG!F*#qLSCEE9Vn}ebQcn;ONQZq#90A*eEynEY5`-c$s-lj`C3 zrqlHVecWCCh9Ue3cbCtzDSxf1T@%TW>>N9B&6p|Di)8nh)w7b!OiVPm!CJXOKlJa@j$s?CywN)L(qq_=Q z#9W+sdpiZoB(0NERLt(NHcG~q)OurlZeQhYeu>zl`FjcTN}^uLMPIYg7QhP^OOOIi zcsH2gJolwz*m2P?ftFY%SkLA+NJ<-S_1b>fgYM~mmu;EX7P*&l=}F;|vM7raFS+q@ zAY20v*j`%O^XEiX%#N2++tioH<~E*#!irt_E--u6D6}gc0&B%73GO>KB~Sv|qeom4 z0;tNVvhO5vphS5|_(oEPywNCC-*vcT#G~&AnIn`S#FGleqp741fgdJ+19*;PJ!ia7 z-UMgnnB8xKG*Aq3d-q3;+^_b@Odn6R_MWx1cuXO(?j>$Yz{aF$tH0xCu=%e`cuWEe zLYwwtD3~~{Dh`+kkPVuveE_w^XfQ=&(AiNtw7y^RK19|pmojN{SqIn-3gf0`hn5jq z?`)woMB;=THBXe7A&R0$7Pr?cWq!drEIOb%xHXavgwnt@MEwbB(b9=zCgKgJ(y_F! z4jsUVf%SjcZ|eW&d~DV|4}RqCdH?y2Pt5%I!6&A|3u>2;IQIF@4`o zwx~|ob&gT>+(`X={|c0Y@sVx#+cmESO<#Q+Ht>pjyCR z>~pC7JsW(jS`p+Z7^hxy6*V+Hg$-m#uJ=Ifir0TTM{JF-w6&dF8+@Y%;6*a{%I>qp zEafeOBM4rtEtixG)5MMhc%P4)8UEUWXUA0k$+EjSosy+dSu!Z6ch9hf;bjcT_4meP zjNs%kq|8UAoUfcJA9ZPzi9mu@8}d~AHqs>CS>6QoXBr^HhKmFWGz+Mbuh1s?J=zd6I|Mk)1S* zJ`+-DmLS7$R15b|z;kX;=Cx|2y8CD&P`q$KHaaskI9zBCT&D43^8T46*W1oMqxFdE zK;6Rn7~l*9AX49uFHt=KljGr%+U0VHAg|%=4U+_lln9sH12tO+X>i(nNpM;t0YEoH z{&}amJCPrE@sdG*wqQMMq#LH!K5}6h?Q5UcYafz{i;C3?Wg)$k=KC zh(MD?4?KVn==_cNYjFXLB_IoFr4)?%Jo^sW>L!995=SQ_m(%~RVOiTlFTCNBlptFG zq$V$Z*>H$*PgmU6?9z?k+eu|ofs_w$MY4h^+7sCyqb59)jHT+y)>e`Z|AJzL{OE5= zB<=p}3`uJB5#-b|&7K|9Z>l=&COk|>QahJ|r6YvmAt0iDbJ=?%hZOBaWG&|SJLlQU zx`nCCq`sWJ$Le!RoFV2e!kWTgs?pUU$Mz&&k6oPK#R+APWVlLjR)r7f5jnhG5F$w6 zC;BtmL7BKUwwjD@zEwaQ{mL%ZS~sdw;})I;7=UD9U=kc4lCwtgmrqOLv2g=~b#u;+ zQJQB7&cvBx`6Gy;;liH7#q1i-BhL~ID)|J2nuOH}zk(-0kfvk|)XW~KNQg@CkQXEg ze=rmE#na$=0>&!9yCiYcQx~r6vCoE*`4Pc-8)o+xyYHXQGIaGn6E|1k3}Ybn$YMlv z7WZ~qs}7+@X~)<_jSb7Bv%MjWa6(~h zBf1_i6+jpX-Me$ex7Ncsa4u0}H3BvBL)_S7ySYYWzak4s;=$-!^0ovpjmKNRl8ZEa zDeS!6bsP};^OD#T_W4N34d6U>rAN&Ng3lib#Zv?b$mR*AQpu<{F5)B>N~C?6c&MII zUuBQ2yR%Ok$H9aui}N06&jt*4)aEh54=1~Qbg$=8%3uH&QopguqF#ODxxs%us{n4$ z88OTJmOjA)Sbf?e;#cWv_f~9JzZtwmVlK&D(~H#@5KNbEB27X)Q6wU zt;42*LTa{q205+OVFp;+K;gheG&Jh4sf*CEhvLyQoU2l4XFPS~H|UkfQ$(_0?z_1_ z*q3(n5Y=F{&QB-d`Fi}dhQ+4(hi%$u=h(U^0XAwsdYvMQn~95HKffYBaFWuALgy(e z#AzB}va>}8u=X87J>eSl`-&^@tRNA}SKvEr-VQ<{0-bkoHou>;AF12Ja+hR|a2*02 zeIZF$msmaqzX0h+2?r&-$s{2C83wJ>1~k!L0~h!gSCsg(A85_C8i9U$74_{hHqX}| zdkU+n1L=qHzv$`st5m2MN5439R;&@HiK(2&>w3ezJTo}m#VN6BEr?Rs2MBj&C#>?) z0`odY$4DKOj~2WvY5XM)dekiC)nnm=eb$pM?-9y!y=J#}eL=1!EdY$5=m zAlR>UczojNfImfG-wR4JHT}_en!s;>1b=@9Lm*Rc?C-vf8+O|p{!caNJNtp}*`dGb z{Cn6#IK6nqiLIw4_~-N-z?#ahBVBnf*1Ps~mzsv2cW*f1uX~Uq8gyo^?SR+;ME}pm zb_s>mki@{VuLAqbK=A`f9DM0DhSf4wRHRgh~kcvyd zPpUdG-PrtfnDkM9hC?2x-&iJz$p>7V*GC#|0vQtbu&h& zTg-;9mG~xQOTC|N?+T}v#f^6BUN?isoe>)v6TZ}41M%#ViUdz+40TJ^Jn%nUP#E2x zUv&||U}M~w{vZ1`8)XlBMzDlD4Xq2}1U^pyM!@HV(UbYr`*1%w8$aL=6X^B&WB7C= zz>*&7A(Efib(LQ2m zKZUCo2}queBr>W>i(TiKd$_&CJ7%C5COTH-dk+E?d&Bqqb#p!JAfKHKF7R*SS0IDh zN%P;P6Sol>j&%^NRjZBDToZk*a|3)R^fovUrI#~U_vK*l%;z3dd-|}+06);A z++__-iFjk9$4;@=GINsl%!Qf*_jlum3r`=M_g^<8o@&7G)isLWeevkdpsRwY5j1=+de^{0G^aExeeGD+W#02tx*q;8qh zdhUG!wq>;RXYtg07F1-qiR1A0i|UP$ZWJ^*>Um4GskstF@Da> zLCl@#s^sBenbXf@=At~~qu&-@p$H8Z2^2=+!3eg3K#YUA6^*Cr73G_6+1>q7!yMaO z=J3_U9H#ts8s>0Cg+^4_fF$^kyL00?BX&La{m+{-!u%nohvp~IxKgff&0-@JOpxdA zOU8)h1-%(kf4vEU`EfixB>Vd7$@Mj2W8klfiqZO)V5rz)Dn+QxvJ+$Mf_;-9C^NLlsJ5oxN?zrV~!CWUe8 zBjW^iuPKG!-#JhI2GWCXO@jR~Mx)yyIYfjC?0Op+6JYgSwnA;5!YyjSQ7Vtq#;NqS z!NBCSH$C<6$`@&e-T$sYuqyDf+I^_%!+rVH9o88E`O}$;|MJ|s;uO-0$D}8iM>Buy zcA^hrI#6Or92XN3^m@LOG$Tr1P5>VZBGgVCj-pfacjG3KH!}VH7~fGVK!QgbkR)I~ z#hEdG$t_s3YsgFUWDEg1#zeqyj>ZWGQdHzmk|Rdjk-CcX)d}#vr+c<>0tixv$@xro zYm1N?xk1-a8mo4lW$mT2 zFDO%(K?PTVn9T{v#S=aPW7A=o{FYvTr0sfOQxQZI$HbA)4h0B;bQH8e0NzPrw_n5j z3>>IfkJ^jXG{&;l(t1w1$*5VVhNZL)1e1b%QD+JC(F*UQwjy(Od4U!}#Du5{q6!dj z$2#1E31GFtbPvfy!^vPKkW6IaL7zW`ZV||YLV>z-KsNr*(QL}_!e1#b5D>IGY*(q^ zC4Z3E!!BM!c`U6e{$?BDPR70G(Ppv$mX>04Qu)uGc1&@BW@bIzR=jLJD6URAH^`{g zxNwUBSJ4d$7n(*t(q=P%v4a?%qDjhSPWMi`LKmtTJjYT^xv6A=zSvD*g%JuQv`6KD z0}{y?Fd$Mu#9z;0`F7|$u}MCecvt$nQzir=jJ%vnZXo}t{vjp=YB!BGOCi9Tx4zGp z2>LQfn+SUo0ItCvl!Vl4@(=v`e#Ke*@p_jZez8V= zsPGPI9={lHXNL4dMNm8&Z^2g>|L&sZrOTR|(oJnQo)xYe+5dU70xm%>As(=}slg4F zL_^K25J6{S47&Kz{nJZTr(aqIQWpr1`RNNL4k5rUy@L` zHpC;$lkrC$Q7D6S2nV7Rd)IwB-1jHl_ZYVLKV7zXs2;XZ@UCgtLIno? zyW)BBVAgrQ)*MeYH2obxJ6*#O?7uz^fVPbJxiLl%lY)vLbO$VgGIvkSY6C4INFAm- zXo3`ApuS?^cqmPNd-;|>p8c=?!5ZFw zuU}l|`Z4f(Cu zZCi%#ySz}VWmwJ&ss>c?f}I#|x`2<5ZT(rOguV~?*)QeSV#filNl7O@eU}w#RtX8_ z_*0a0rE%{97nX=iTcDI+JS2$(hwFD5ZTM#Pca78NU%9L>*T!M5&ipOUezYC=lhuEQdf|pNFq1^0z-sMMlnoJPXHf;nh zIelaSACijlO?y^Y53VQhg&-9i3M4{ufI^&g*i$^5B0 zq`zu-h2tBnBmI))KDtX?L2V650Gi)uZA&k89YTLc5Kq@o?R+0{)s7;6KslsE9xg&` z!jea*<|6=b$4oetj0BVP;tfP234DX$AQc~JSc8%J+tp6;aBk+?yiF& zG;^?uA?#lX!0ulwki9qBEhK$buMO$*b9M^}_I`|38q!He9E7g?uQ~fC5Knk1`}QLJ zW3>2AQ2`c1j+XyPZEUw z3XndJ z!60A`pgc!t0FWU8AV79;-Td%BdDQ-Ych=qi?_F2t{oC8$pZm{mIXnB^zt?8)f2)(% zoV}lr{B4&4eB7?yti2RKPxJh?lO)Jc64|;$P~4=v<;WI$H#>MtH+ZGrgP}u*xan#L!1Sk3@WR9P5z?Ef!<+ zX-lIfk`NFLW#VDM_D<2$i;Ca6#khAk`+d>%e^QG6-d&??D7kygnGQ6*bWa|lcliL! zpv55hBRPtErI2R0`-XGEhx9bB-~^iPd1GjIl=Dd>c;<2;9t_gMEfT`}hh9haCIe+a z^zo;?lzFEUb#ua3J=s4noY3KF`yZXDwr}T+nYM*`D!>V@a%XZh4T#zeXNBu`;`}+A zeW>^`p#Jgy65jEbfw|Re_E9c^nV*aR^GPazpWdqh+Imo6L>tdUAW&~+=Y0du|FIT* z{P-s>Bh*^-Q4$Hg7pVN#r2i=xfi_y!`t#QM1K?@e`Ls9O5%6Kp7DFab1P)Xqy}o@| z?lTt+RQ1!}B@hqMz$us_cbLEc$3%vj!ax*1VcnwPr32l!8i$bOstli)sc69V(`2z} znZm~69Fgu>J~ z5U>6~-Ee*bt-qXo)3C#TblKtdI@m!I#;Vvs)ds}`zwu1)Vb2*0k*-hu4?Woe{NOJ+ z2Wt-w5&uudgPBk&844yc(O4uE#|Z!~j5LA`)Sp562baYDzhl;SX5IahyM8?H&u{;; z+wQpau{q!7gB$fnn-2Zt&p4J$tx>XDL4~VpjY{?GPSucIwzdA*c-s<>*49{kTWLIF z*W&DW2R1AY2~acLI`jf588O#LX@)_8P%JOcqIlD5@m7JJrua*sehtctd+kKmUNT^L zjypi9cV*UrPRr9k6}AV{yRE*S(zON>%Ub`o)UlcF-V~FFU+nN6y_oVMt8X_+ zGXNFiOxF*|)YlfWK!(ym4g+oc;!u9m+0rc+vkXYA3N$KOSl9+DWhQhDk*2_2KQJO* ze;wk6uoMQX*Po(|7`Qc*n8Z?<5HaqM4>+?--JZwI>91y=F^Z{l2{nZOPWF*0v8T!i zPfZu(0^b)kWMaD*sCLiCuf~@Vk$NJXPDw5TfM12NtvXQ($-;%+JT*I zYiMfLE}+k)GcD=XC3fM1jc;TkhXP6~)m{P~B*;MpbB0;{bQT;Cl<;#aU?A9mn!kK^ zAF)D1%HDkMDzL&8MjRwDKnH++wE<)e;xN(0rp3ZX(B0ZQtnZQU-o*&?qO$teNt-!3 z3z$Z-Oh7np`5DSFsDN`_5o8Lm)xmTn4~VM2Qh<3T2T3I9&tQB;p)Dn2L4T48he!fj zCPCbxUcF+|?)ll6q3nNhC>zfzsB|@qpy2IEg_p4&uqixGJh60Hda)<8&1+EcMIvXFaZn#Ic)yauNR^@u@&=hGPKBW6@%f(3 zp5OTTlV%*#CaBoGp4g~BL2JwIzO|sg=nSZWqZZz?=pn@uw;RT|H1v@;Or#JmK5=CF z1G&0k&DKIBlmZ)!PB77AIEW`W9t$T!fw*L%kUS@jq`0@UUnq z6A5L=7^U}1JQbya%tr-T8b3kZHsGe8*h>FTN?9Ve%$Nf-Lr@@JS6_q=OxNRe6Pt!W zfdj~&V#6D*@_$G(11p$-7CjQVkN9c-R$la5v(k?Y$JSv#j_;vL0v!Eh2jLqmod-4R?jgwq%4DSBFG+%Q z`c85b#C=gBilJmWUcVFQlP3TFj#;7qpS?GMj_bVcJW1`;mc?<#o*Ylga_p8&1FU_4 zJ4cqOHI{6}RJ=q{ORuV4k+49320%%)>$5F?S@{^Plh4rv-8kjr&U;7NnnEyiVRUp`9*Con5Jaq|hn3}pmdN&ryr znA)&Kc*eJnK-!w?eBJjiFZ#kn^__;T7HZ-x`OY2S%OjBZ>%n*LA|nLw6^2`KJ^jFW zD8bOQ8zt<66J+}RO4z{U^kre2apDjF!LMw^HPj$b;Xed57!ygIz1X@fpB2&}!bj)0 z{diH`qB&3ZyP>@BLPf#>@Pl9vrZ`lA7YP?sC>cn`Fhg{dWkOcK%4C3zjfLz$$O={J zMH<|AGidmO!)iZd{Xa0j^?zcuwbFjHwhkIqJMF`O_^2Z>NAqsJh-YatR<^bv_O_4{0;;dq~ZD=(u1Vi9>DJph?h zB4L1Mrgogy><%G{Cj$(LVnM(W@bjPYVbeLA5XQ$s8C;NLFhaO!rxTC{z!e|M_!%z? zR6J;CWT46DfIY4cvC@%&_sruFF$g8s$-`c4N#J@+oA%Fl_lMtm^{FQc-S6O@sr^^z z85g+tcfm0#^dAEW*l-8<^ebulhJc71kej*cmOMi#{b;gMM2+OB0IC5xif@l3=x3$| zhTYXC%IAM!88QL&IS?pypUmBZ1W_;rQ@9dP@#ZXe2&p7AQfkiHIDd{67t&OQbMi>LZoT~T2Z zCw&5G#vdQ04PTSpyrLP7bP{H}lpim@@8ZvO6Tb&cxOjGY!};Fc;^YYAYp06Y%Zd#s z^%dX>hY#Z1iB3Az%XeT=;WXqse9ZeYR9XzIAv^$EK!e9tIQ+nd^U#-ETU(bVy*MU# zxf^;)0zmLi=?~DpNH74Wo42XwEC4C`z@t{$4){R`O{OED0HV&rrdJ4R_)0yw`?j}t zW}h*7TsS_>rncUJ?b(oT3b5J;Gf^XwyH7RLH#L{sTGSgF52nSR>oUjQTUQ6F@xYwB zlbtzykX!S`{U0|anDOyh-eu9j0nD`y75aB#@tqG-bDKIOx#Fn}xc!voC|n$ZEkJ8= zrR9xNk0IHMiKb2#sz7HmPiCj!YPC{OxY8${2vFz+?J}+uK#Z`LeCeBIk#ITRbWgJ~+XBhei5fOX%84VMX}2lxC%TE9Hl}bG_ZV zQB;#sODk+AYd$PH%bbPRbEbsq@GF{tOCIx3Oa645=whhCD7keUG8L9C35>?KI`z)c zW1NaW(SqtYE~E_{j8tk>PZ2$3#q|>MmU9Wd z9^EU7<&QH?T3?j@$Z3g9jLpw&-_3dQyHDju&dJvy674w$zay76ukX*FIh#KZJ!+dE z2YM1h<&IzuA_r`+pVqgn;rlWJjswQRStfxZ)wP?XNiX|LmfB zKXmuQcYgJbmfK#vWyMW{i?Z(){x9%*3U>E{zjhr9tNp22g%lekBc`1@2^I*wBz)M{ z>A;W>Q*@um^-}U1o9gHh;nayy#6#=A`bi~r&Rt?di%UM$xcZKaM~kI=NvXk3iW7VywAq@7i8T zNw4bMIC5r)r}RblE4D!-!FQm;Ep15Wx^S-%__D{ z11mq2tunUBD=V+gE`BG6v*ephY>|M%^sb8MdE!KFaFB&mpOPmbu_n*+aK=E};s=_kv>CzJR~k`hpfi^k=S51N{pQ0k{s)iUu-- zama+OsGPmGQyM=^4N+G8at~>&TnFswdwnl>8oBHXz2L1Ic>$U|;3*)Tlc35lf0dGo z5MuTCaqS-1b}8l6|$fA^ubU%K_y_sk6F zf}xLjel@gaNQ8)PMUV6Ra_dKOZ@kH0&7}|Xk`{!9|B1HowX9CurkcpY~+v+aN;2g}|$*dWEwlB*j3$1A~d7 zsXzpZVF|X@kPuhX#vylVZc_@wePTiG*Gcta$0U{yi*7I8KG3jaDoLv;Dgt zz(Ez3Avw_f-ro070n^cS0E-2<)8(|$7ne1yX=rL*CcFYNl^jceSQiU`SXF8pne+Zm zv5TRYiNH}0OMNn&B#a~-9g2|9w)v&fwvmBPwP^q05B}7Zlcx3$n*IHra-w+`q^0Sl zl`_2~NdhKS%tP?q&zd~oYJb!(8*3a5&{e!}K%Sr;1TcZP|6oL$_99t#mKX;>CCT@! zm)d#Gbbwuc1Dm0nbG@O70_g-K{0YU&<=q*ev-X$Jhz&8sh}TD`V_! zvOcme=;j+c=RO(3%NCSwu`YTnPvE?CCBHcK~;pU?WkB#Z(PibO(POP8H2 zOXrAM;o>AJ{2|&PfylPgnTr=(gg;Ex9WLWS_Vn4wl!A zm5};@l8V9{On7Vzf`cyNa0S4hu%A7j8-AmBq>Uan5{-P^`7+*8v8#ohI#nt425547N1_7FQ&&*)yF^*<)r(4P$ zHPB={-%A}ewk^BN`-mQ_IYJ(CaqDjCC_Y_C?;tmM*vaEI4xRC-8GE^6aX?bF(HUS!BClTp7WXp`KX-^*%^xo(?F078=@l?=qNiylV{~L0NeBa z>~m)O0ve%f+T|GVi| z7v1~N-A~*Zz9Vp3)h)lpukZi)g?$1#H~1FCeSsNRvb6Q)_K!Z;cF(Q1&bhn8H=~FS z7%2FG4UMIOze&zWl0p?Sdrx~h;xjro*k6S3zMwl4Y`o&5GqA&Een|B5=r{)0Vf;fs zcfjv6ttA9oAQ#<0^X>+dUx5|6lWq}s?|h*ETH%<4QdEPD^;Ull_ISA;Q}j2s#BhLi z9L23CQ9$`p%=qa&Oon)|K3`9w4`^tQ?;~}NcVLo?IQ`>lv0P)|r^th*AP2*kP!tTI z`TKI9O4BA3^{0Yq$^$k`LD7(HTgen)^U_N=KP9oaON#vZuZ|SIwOa$VB}<#;D-aJi zS}RvtN!qN5c6{>NGgjkDoASXt1;Hczx^V>on+`_20LDc4F;t4y=Iqo*BUT~}B%x4Q z06LMf0!e=csQEx78MUCNyADAxeLrvYyMj-T3F9Yrj z@C_^jY-A$!7_cKjCJ0I%!<=Ox6iu7Pk93M)E)@<~iBKAdQ833DBT8iESu>ud3|PL~zTX=QJVk!2q4EQOZM)Ln3}9mybYmN_wkEM!4|MaK_PZp#fF z$PJA=TjgA-aOGgtbEHqV5MyvA-?THE<|{%(j5rotirFKavh3PE*ei(y_21&D-IN+N zSA)f-2!rAxd^v`%AZbBnP5B168+t}gXNbX^BWMs|M#cw#i23^ngqh$}1fpq}DFK+H zj1afORB(tKt!T`er&@T>)eH9xY`#Cc+60V{PiVmS)py9|dIDiGvE_OpH$+n$W+Ei;)8uPoN#KU#DZfoSsAa=G zF+Z1}Y~8=HFB>-N{(X1dzmTn(RTpSB#mm!>R>^no)p;S1ret>*LT;^y=)1nB8*1xm z5q{()8TZtEC?&aGDWEW+eRZr8-(3s#A~}>$O_PR`#CLFtak}*aTBOrU8vlJKT}gb1 zl%H(WZC7%=(D!xAem1v4X&K~W`WC15q7b&^`cBAYK|7u#i*cZ^uT{ANi=`L=8-7o+h)^e$hwE%6O+0hJz!yaz`~hi#iKw2 zFO4ex-^NAv{PkVmUGhh_pS$(&&AS(G{DlpE{{g>v`yIxrvXLZVPTYO#e7$Ri+MAji zt=f7!{n>_B=--J`E|?bfmelGT18;Y#_6GH}sg5Ruwj~I*TM*(@W@|j7I%h|VnkX#Y z6i3r>&^i26=HdE7S6gv^8pnH{{adb0H9htQ%j+#VW28H;g20;&#?*@oA_(r>?F}pl z;V_f=jP8=Jl`4rR2y?EL)8A`{gA8w{Vw6~H)<1%twuC~^3Z!E5tfrLYYW+BvqJAiuwOGBKb8MB*l{AIAbO42arq&;98Rs`5y%OdiI z>KUr;Xe^ja+YAKLDS91g7{&2=>yKS&_~-ML21&hS>Ka~NC@bNPMumia7;dzE$)0BgTx-F#~C&VRr#`29=k6KFTv^@m3)->whU*RB@zEm(Jw z6lk1n!_IfRdQ@yT=yoL|K%Xp)I*c&T92sMr!P~BLcKta)JWb>u4@OgANPZKx-=AhG zLdac%B;MzjZY|%gO7iu?K~E|c&sT{ruWf|N>!FvdW@}*t;s*EgL?8h9hNF#W5Z3p2 z*_6zj1tJqlOZT-u5Fr-imt-oPVj7GV>QvkUkl{K6!uWYV+~zs|^Y-(eUbU{NHf7bV zSY@rT7eqze;C`NrR4~a4vNJ&Krczs^)Gl{f> zhSwnxi^R|SVYizdczM1W;^EqtYSRm3EpBkkONO4gWhDA)2;ARyx3d#r3%S2JrodS*(T0AJ02c^k|*^N-cd`v|&H;${MRaEoeOq zsH|86h)CnSTXzCCcpsmL15qD(Aqw&vAdvp3=RC|g0t|;zz=TDCe`F?u!CwLDW%577 zI5=c6iR*A4lo0Z*pSYUg>+{tN%dN(R$shY2KF1r^iHw8#NLnWzq6ZI4QGtc9na+r$ zKza|S(_t%+PLKis9VSFRnmOC(JSXp_IgyJ^CP0`$j9OSXUpX-O!i7p6-{9?h=!7_q zA8bKE837>GTPiWm*+c;B4j3%zB)}8^d1I>nDX2nY0^BXsAeDOy8vhS0y63;&Rao*L zZ~v29uiSiW@xc2*_&@Ly&}M)i{-0i)H}7VEM*)m^rqQa`y5HYk9`eoXlb>(sf5ZB6 zwzlf9QyFXqr$;*Epz?*d#k1aX-l@R01R0jKW6>1MJ%DriX{`%^-s`7`NWfS5PHkUe z{Ce1Xoc@s8=c~5egwPl8-fElIErd+munt{GCJcd(UkKkoZ}OLUbaT$$hNBrK{K8fw z8cNduMlXKUiU!lbLIwFfcpVKQS_%H)e{n7O{2hF>#1r*qUS}c1!DDQ@aUDC_W`(`Zgp_~D1_glG@MK}m<^n0Au9wdE19Y3%5PJx%lNFHJjbu7t zUq`T~Eki&2cdjhVyJhH^+SH47<5Lakg^`9Ezmt%WjUcVLB>jO(A-h|FG>`y{22!xZ z;DwMFPGUHy11Ev$Nn7L`ufut`**Fi*h<*hPWM8Uns!i6`Es)y~xbfQwNdwUd%JdHH zrGEbBNyD5IL1~b`4f_LtTJ(j46Z8xT1ZW~1OsC-mybfv56fvy;GOMv<>AX|KPh079 zEv!}x&`TJ&@p}nL4GRkd^&hYvDw^fOAdp*55>`<8kEY=UO=j!>{QyAx+Ek}17X^*~ zFH8LY=S%+h_RF^p-rTwP@;`9&`~KzU_5`w@5v~3s8O+wszhBATI=@l<&o?yJW~ly2 zZ}5|~P0coK0<$@P3ik=|nLwgD%z7(QjSY2mU#hiV_9=Ot5*{e}6wtc-0AoVFWjDiY z`E3_KDP**UxdXVo9%ual0H5RO#;LA;9vPl*Z!D;yIV$| z$Gq57_9&A=oSKOsFS-vvb;lf4I1~am6Pm>Nt7N#DtrR%=7I^GX^FqjxqQ#eNzYWns zXuha<({i$A`r}92OOf0I^IOS>YnxWrHesae-osz}M}v)E0KCCXyr8rpGI8l3^qkw5 z-`yv3TBDnQ#nhp%-0ocfHz6Up%@eFUxPeCOPVu53FBswwLFqeqgx5IzBRA&EU}{Ka_%am$3hd`n33o4GW?wZrGl|l6b(@iBll(E%+5A_dL&H z&bh%9U8Es~0c`R?j1|%YkVrCv#AqT7<(&9BRE5U>|J_v;^N#-)u!3~MHVc-C0-Sw8 z97N#zWp=F86EtV5kxWNZHW|Ti5(okM1PS@$mJQgKMG+|(yABsZ;{Q7qePz)-e|z_5 z?tJEs_S=4T%fG*Aj2Eu+Py3gQYx3_AF%3i zES?_$KW;Uc*0prAo0@i}p>g%21fLBr6C? zLI2jCG{;K7$8yyMaH<6Ld#Rq6{Oq4R(a~51H6HA36Rx$}_1v#)Z z=<)(aN1@9P*nFshHrK!Zo`lVR|GoBKG6ME*RfjDGl-VGx_#Be$woG2F@=ufz^O zPwTtfD)@%_v)lvHWPs_x98&bceAgAerobqh^hAk^Vx8wY+n@Gle z1AqIScAt@q|4p5r#Y?c;nRR#{YGpsRy{B8lN%vapGOZfQ=R*}4% zwwhKwzlLcVU}*r?=<*n(prw(mY?eXHg%8Z4-Q|c%>t^@l9dV=oi^8>>uWq z@|(ts=f-jy&u~#!RHBr-AwOgGITT=uI$i>^o3kSn$pr0$6%9)VMi>OEM4GUPNIFE} z9AJeCmB@VqfA&h-t4375jB@>lRcHV(!}I}rG~?2qx+xxM6*7V0tSFbuldPhU2^ixs zbzt+o))4f`okGV?l5 z5F%CLvSI)2(d;8;6~^6Fu(A)DRhS7WSVHgD$LY}t>(fUtYhZap8w!aFpsTEc1J`8m zym`oQ^<2GTJPU)+uN%yJyn0q+Fx_=it_?BD`haCOvB%A>#I~Cg9J>lG_~kb_1_ZOh zW~hoc2_^98Nn_*%4NlMElECirJsWrqhN8hifaf_zKFBTa?8g8r$W^`zmXiZC+LJaf zTzXSK&ZT|Ny6YJWl65wmmFh;n_v`UKzeRxu2&G9M>$T7V5H%Vua<0$sOXE^#eG!OG*>x##jVi z=VPpG@v<-*W?GHVSLxb~92+Gd-zp5cX+wyw|F z3@$~}^qr=PP`q?Q$rPy0pLnAo^bpYj_7Go^6Xh+2=Tz?G)e6Gs(F}taG zZKI8EZ2T+*{GWD$a+NOtrkgh8H^blq`wD1r-4MFUpsl-HP;n6C3Hc5q013c+y~uyg zUUMXtpe~V2MAC7pRY_(9!^{Fi6Y#xR_~I2BJmWRrW|r%Kml*nB`#tZmUdkzhuASN@ zl+8k|!NVdEWQvAQKzV7%(yxx56X(ESY35Gu$h92};F%UK?ZAw|yxIoTrP*CQ`QE-6 zCs5FAQJaR9voNt+*pUwI0w|X4R321ao!DNAs5G3~whQtG@qUdNlq(M%E&qsU?4GkQ zK5>Bf#>&~P^~YW``ALYO@VMBMQ*RJ$K^Z?jbsWlgr`QO)l;{GZ2+-9qKk40ayu3I* z=;498d~3V7ice~(oOet8GgaS5^q0j^#V35SI zP1>+BXITWo)c+S9TXgTTyYIjAp4(A zpR&PAJcsy?NGO0z30216l|q+zGZ;2@iTg!*Bw!!hC%}~lj|gez!PAAIy&}1n*9#ja z449J}%5PD&PFZ}(_fbLbX$EX`3vBFk zEJz-Vh_M1xHDkMWSRZQttdS@gk0eJ$pm=-7ugqPf5++%-b*g2bK4TT3+{pp_a|mH_ z6XQ7(J}DU`yo@*z5Cb5A!bery*e2nZ<6|5XyXOX54t!}X;`+R4Zm=7x(^g}%QM4P> zncPbqmuv%as+aXbcp_9e(vYGd3KDPbyC{lx;slzTE(?69A}2vk$BgHxa@u>0fD{ff zfn!z=$XE4=mCc{_<-0Ey&+XQqm8OcbI;1;-iG1=6(c2ph@~LsEL}agIb3OgV?d{Hv zIkgS3(+7j&r5BQWATfffT(dUWw8lOX>NSJl(%^;)dIeTFA= zm2?7OIDa9DU%q06NYThS39U!_V4d~Vfz)9&R;_Hb(zObEy8&`4u&1X6Wb^YWghoD_ zYHH&5eEVL*Ojzo+VSNf+WAIkWb~mX-Tp_tozV~F|2$ro|gaT%wvBR1SygES!Yfxx? zFJaKuLqd6VbbFzHljw(oN2Ugjib^qT7$uHubFadROlo1rDX@42N>?<(CRJinaJ4$e zv}m-%%7c!}jbm?%8&9Lnd=L6Ct@w4a3&x7G+>PU7oD-ruL|9si+IwL| zl>0HqgVZhbs^&r{Ai3c&0x$8&Ik+&fzPLf2nH*#KKjcXb?;_#BU+8+upF5w`2ru7% z4$yJ^m(S+b_pnb{E~K$c6shju;DHnwjpCc*mwQg$oNYQpJ`4#nFid72aHnv>hTx0Y z;b?+}@KD8BjUA7CtG(Jdd4KPU;`1Gv)tG51uOanrSYzYWH8g^?+*cSLD4aMf4L6rB zqr$wmgePm;FuU1%Vm@;oiFdb|ZktnM-p4sc&mfCvI=?)&PRC4+^b(NM1%@PuFc|Zs z3o*+jS$I`tEVeJ-a}ha5-ArBC3GXftHhS-8(`Qyx%PLM-&vPs>g7+c7_OUhG1;?|BxbytXG6HJHf@-13`@E1(P^R~#6L7A0vZcpL!y*a zpR-O0Arwq6hSM2vW+Jwo3}&btTG1o`@EHaPDiw`jJo}mv4VgZqWqk3{bq?*v%uH!{ z+JmQ?Ki|#s%k@c8OcE^vy^^%++mt_fNSy{Y2uWlFW!eY(HW!YcQgt%z4RRym(=ukp zE(F^e5fXL3{bX_SBx_J2cW3R%5}9NQZjYmDdip7*sB7<21LdPsQkWRZZ4##4@;d;_ z9qu|Y9H#W4-iipU-q}!3ZsUGmrfzLBlKK4F`r78_o9sqVRfQZ-j}fwp6>A#FOnkPX z0gr4y3{e;IeJ2q@uH`U3kmu0qQ@I#~!h#kTB}W4T5Rf4AH!Vr3&2cHXS!wv<;d5pT z)y`xxiIg95&p^dq&V4(wj~X%fOIJhGW)nt3%=B`8$8Hv#;M8RWRw#F1B)513AsE8)-ETr5p5NE&?0@6ztBg@z;Zl6Ad_hUwF~<=J0O%Q@SGa-}LSSPfU;x6h zPOnia0~#dT8NeVWgFuJORM7vgG0-plvc~@}EV}3Wcm4j7U%&0IZ}}HD^)7m0;llrR zlOO!?A0aRrWBrr%h>@6?$$e+{xoJF;9`uF9J2v%GWmxky+09^@H`_ij+C*5S$Oq4% z+BuFaJS4B;#`f$-pD0f#0Z;L0i`4gpngN;yl2OyI#FC03AHJX|*<5dr1XaeZ#U1r6 zUrVZMwMjBMedr==ZU9yOHk)4!0}ceG2n5W%5OyKo)q*A|N!yhH{9Yublshm%l26hS zSQs;q%YU_jSAKAs15S1oPIeh_zl=kg-#13`0z-tjb4jH*=d2t+4nX5bHIrrHh!|3} zrGS(0Gwe=H&E0To<~*51Ldyol*!F{o%viH+rQ@M=BnkeJP36|E*vxd^-~LZTzx;U2 z3(2eIBQB8{;)0Nn6)tYd<_6FCzG$1e?Pn#UVKuIMUt;DVF|jzjr4lJ8P-T@Ao8sX_ z(h5R}kcKHC5(4B5A17nMoB$?DEK&i+l`63I&$Rz9MqvjRo&Em4 zpv+xRU^Esx=Z`Y(=8r{6*}ge@u&|CNQ<(@YAoQ15$#epV3CEzXOHuZZ+ZC2R?%UDw zmG+MsL6J(8TB486M^Iu$40@cO1}gprj)o~$hH(80QyDHPYllW-*^;uIUi z40$z%+^J1kiNG#9(sMsS&jV_mnX#Y`0QzZ6wx%|mpvClxkr*=`L8&QF!v!Il-3uSx z2|Xc!DSov?9=HUQJkA}Js8<_8ID>mDP7PvDJC2j%B#iAJ#ph(1Ij4!-xhtu<4UOc@6-&>-CD4`Rq?EzC`1%q$ zYfFY(bvIw!oLC;s&m=ClFlPQ{Ypxb2T; z0M_<1*Jp#m4$5|=5p&&lIt+mGkB2S@7B43qb?OV6%chE6^p!LxaG zJR-;2bBkWk5%Z#o3yX?ps&yt6RFV4VpD9*pFEK3+(`|pc;yNr&$YEW?TELvziA94SZv ziz2B9vOlT1TAvgXOoS(QYi?qiJkSP0xe3PzILLUJrJJ)nfHve$GHwJaNSdN2V*m*| z8BL}L!Q!xnR9pkK7wP=}Z!Ws$yLTO1(sKKXTW`7P2aA7m;o|>)AVaF$a;bQM*0>`aG1byrJVF&qJ|Hh%lCA?^ zu-e!3^|iMB4exTHYG1n6T5XfY{G#;pxVOR0X+C2^v3wfnYoxfo6|9H=ya1#4141lN5pxhKJ22|0{Qs z|MQNI&bG;~kp*|{ad7DZ$?cT(YoB>hC^w|R2&0CBf*81msvJ34Ngfx*5ih5396*CZ z#o;qfp~4VBOO>OzADbssv$Fm5v(lmAo{eWr##W#s16oumRhI#fJF4?=(L%0>R=R&rZtE7|L~w8jyfAx?BbhW!jh zMq`ZD(aS&TpUZGSiw&sa31QD95j@G%AHp1%%5^qWRl z{@nA&KQf=JQ~--qmWx8wvr;mP(`oF`kx8c0IOP4($Q(-}!mG`MOh}q=0Q{(+^lAg| zfvlwisRXQ_fs_?V1(W2vX@d-;{D}%s+cnX>^?U6fGm`QhPf|WUA4v%!204tw?l+uD z+H|pTx;9Qvye}grR;~zGjmX;7caHiR?eD1EDlT7Hh*G& zu5XK*N23Y3@9OwL4Ny!>)0^A8o+QGf4UI4Qv^D(du0i+)w^@PyH`muQBb+ zem$O{7tc8pbVhP{xLauJ77u(IHK6g_=;6Zd79GzcR+W+hJ-1^L^^?R95B&1Jsbfc{ zj$JC8xsp3%>RA$MNM$EK!1Hb40p?F0CS$<6`K}&WCNul!HJj&$j&WupjH%uGG!T`@ zlPx2YDU6p49o3vNCn}!W?b8rdZjFJjmWkq(E&0tya-A1)8wW||lkt)Zf}znuckpRI z0eL0AZGxGye9v%Uf|YDXOz3hZ^59-%yuEKTGor`U#sdx#|<@~(^Qeq&tOfvazFAX|%1x7hXM~m%SXmI8m5QlLk!f!$-vP1I9 zXb+#43&^u(sK$M!&VZ`Sz@4EhRj``X>o8aEeh~(6u?Xuqskf(sKm+wo%?qD^egT68m&=sNIu{c9%i-A4y_2{U{%H(;@OHJ)ULDpA~EeQa41!ir*qpGy+ZIJM$n% zyB~YWrzwW27e`NRB7}Rh(n=ZgyzyT79;|I3m$7aEu)Rmid(+^ZeN>8 zvH#>UCfIZquWkLbF()${1h3UpqN7NDA{C+%&h5_a-;*2JmLELBGtGDJ&Gm^Os3uo) zAWN=K$y5k8=Qr-)P+8?!KP{GrMJi0}Ee`LeG|J+rad#&>{b72U=-CEOL5SeXp6i@F zJKM^zvy!2d6rpkX;r@$aPS}IY07oj10RHkr?E$mlXpD0DT|VCayR+J99&D9o1M)3L z$iMldd_iBK^w2`%Fm?{LW>nWcp0o~dqoL&4&?4!jl1bS)6f+cajYq?OpS0FBtd*Wd z7ov&Uo-bM3OpAW2X{((67UC;X4x&!~CJ9!_TWzDEUI^-h@*!r%;bslf3`la`X~EUzmDm9KnH5oH)dAM`dh zteyaDkOz{Qtv_6Q0q)u~Jq%(tE4kIHkjGQJZ&nO?x z4IY!b>6y;k%iz1dC{pcUXwVJP!lwkVVza1VcCvw_aeh{L(AO3Jo1dMk|CLUvh?FW#Z}e}BB_-skT=eCOaD7j7H6{Ok-d=>QxHDS^KBn=}>5uNPI0r_*f z1@}S|W7iz4=hZ^L31QCT?)MiqpUSt#E+#)X(NIg79uw4d&Eb!J2M<_Ft8 zJS)(bqa*VB#s5GuuxHLopLn^pKHczgla7$(Ms`n~8PZ9A=K$3|pYqXQSsWgg!KR6W z5+9lYAyHgrHeT!F^58`dCi^(T`8-el%X$eX^}zuEMld0(zstg@Zt8tq&@x##6GXE7 z-OdOme$1M>wJU4u<=9Q*jDZ_*)5ONKlh?S33>uT7Q9$ zNyv%-{06O2%;7$q@ABQZvwtM}qFKHjo@YifW| z-r>T|iQLe*2)bzobnpqv*F`?^32XJ5Pk-!{VD!_|o}vT~;%i>+m&v0|9nQkBGOp0f z{G7Dvkb(eBkR@_v9OdG~rDOfMk@4KAQ78K(rv_%vM60r#luReKJMV!uhrRNy;(jU6 zl>~|bi$wNIJt3=3W*UB4%3bsTIf=&kuX_DH zh4}ob$7w? z_r!MW&O+-*vFnU%n!S4o&#yU{C6I>O@gsVOY~Z9bO!So1$d;3szV{TGS|TLUmt>NL zcabVCUfj*WQ%oWaALN)v7yy2vUQ}K6H|)j+(c3*|1?FscSN^2ot{^MK8k+O?th(Bj z^-o*%(qbjZQ*sp7={uZ1Gg-WRPGMX*hn^ltj*L~;WZ$pfN&*<-7hY{{Tx%1$e2O+9 zlm)4-T<S(jQM(Slu$}{P&GMaEK2UFa2irDI*v&UEpc9{>ye!47~&><=euCt(c(; zd<^f(?62_|$$1v`ohuxdzC1C!2an}D-f&&xNm^2+QEuqyO2CP2pLA&X=)fslKJzJQ zUnXNPwwC}^Jpp|Kh(f$a5g+!aGYH&qIvDXURVfvZQc!{bcRY+kDpo?W=2r&Q6nMEn zWKGdoL zP)0)!9&zSEWwjmM0KAQ6i*lFyt5>H>%CYMP{ANH8i*D zyvo`-2E)Mph#dfBko*YF8D9a_1vZqXrNrqGZ9;d>a2G`;%#q08#DyGyu_Ido{*TLL zMV!pcEJA{#;)(*DF#^^UrpO52NibZhX3tp^5^3-U7{meS2`CB@STyW0PLWQ>GHDP9 zD;9-kKa@3yCO`SUm&^J{+lqJE@IJQ_*PGJS-C!)jmm94$^w#Pt@~q7K1J7#e(1>Pp zB&O}$AO?ASo90yk#g^Vzg2~RLdZF3+Jw?zs9h!DMO8H2me5kc)jLAv)ZP84oWTFa~BST zKx%~mfr#CWMnk1uxH*TH>2Ls5O*koiO#!kN7So!cbSh{^Q;?NZKw52@R(5{wmF%yZ zL{ian+-`2u2I^U|yY9MahE{MQF89m!)xm7qGHQHNAf^rBA&nJ|j7Zz-!E?E6uj~R- zw=45?oHVbV#5_4OFQrdTR>?z!kkf!raim*TNiR)mf>-5JTr|IXlC4(rH0|4sR&BFM zS>iZIYM9Q&OOlv0=QHD04!TFs%x}93gkr_3_6NxR01F8zq-ROzyg-piED4E(U?|7K zRy@SaKXpQy7E|#6T#%JcMeYon`2Y5snik#rFYo?OcmDYut8QC)^Z(7S@BexK3H-dC zKwGnM-tulN{$kthCYGBy7l-ra>}Ymceq&4S;t{j~`k8=PognFG6R&;4xqLr^ge~|? zWjcUvY*FchqlNLq`5lLHCl6HdM*}CUfPPk^EAz%EV`oAjN7%3Kn&uf%{6tQu_!_DG zb)6|}?ygzhP}k7-Xl)(ggq@ZTyL(-8A!PK!fPMI3mh<-dbwpL+WnrSKKsXcx$;Sc! zF`jTHe&!!l{ms7iubIdHUtPEA`HpXzG}$a}mFokU=yK}7UhJXvwTKI?)q6Z@F@}e? zPwhX?16RXJwin%vf^-~F8aD_*=t2bm38anu0HshNOTfhHi)u`HkpQdNN&>CI&!U;Z z>*?H(?_rLt^jW=zM3&zNQ6P&HYlD_Dgv@~!&#gklbSu2zqAb}S{&@nBbaWL zBK5cRj_~?%AH^Yb`|WYwIXhT#`YE}rLpwNfS%COkcac}~pyo7%AXOj(r%0hb*U`bL z6~?&Ox(!$o!V1m;rl=0&u4z=uBc1c&-Qm@5WzKwvN*oLWE#B=AegJRoPMMWOYASPd zn2~#fj;ajMx?7K*v z&xjpuJB2Qpkd}a67mTuPu6G~nfe5l$vC#5_TQ<``;SgGkPdpHJ^2Uayrbp?` zlE-WO01@P~2qZ`p)ass86mi+<6EW{PgRU-Qx1hlqxPQWC7E%S256Y)5 z?x!n3{@q{(u2@V75KYwX;9gT)lv0CJpk!w#QX@m7tD8Or4j}(VJ33wIgs9B}5Y33pf+X<5%Yp$BfP_T{njhey6nuA;3cz-tZN<^m!FG~alf6`sB+4$#)Y)USgkrdVUVB9GB*CvnpBXnDy% zk)f}0z1#B_I-MiLk=#3u3P{#9qj`D1ckm_)Zj%aqpM2z$+UX*L~h@2D3(3kNAZY5yB+L zm@FW5Gh#sZwt7_Cs0hn3J!dt^obTSsHW8hLCL!sgx399TTsQe0`*I^>l_kDWX)lK= z)^l;;Yt#)r?l7HFX`T-9QE9p#X)`v?qCmzxg>3_L<#@I8S2us=&#p7lCgebh^|3g+ z?z-~DtF6?G9FYi%$@}U`x-!dwB5C>-l*b5InM>m1ZO3()@hb5i4_k}^-9?(WK5pi0 zK$6rsDbxJuf{h4`fGiFjY?^L7eyY%YqHx@#l?Y^<>zgDt2Wf8FH(SzJZus4k#+X%= zn`?xCrUS|L3Z?Qw_&E`(K4=^}7!C{5dD?~{vr>)oullmj85#Ir)y-V8v?)vb%dF)< zpEJld)=ftU{buf3ikI`~THyw82kvyOS>I_dvvu?h2^puqqv>d^qdh*`Z0>a8_Rs~Va;yCiQq1!i~5k}^Hc07(l|B9}%pouHE~y!8V0KH2aDsMD^; zoB4gCxyh_54M{r`Ixnb3)Nvt97zaIH21)6Z_9DRuUIjR}3sWRuk^QpH8Obd~K=uv? z{1w)QBp2KkGV6TF^=Dgun<4@0JWDv?W*C+|EFjq+wBiIvFJURvGhmc zfpxVu18Qs`^TQ{xKdt6XJ?v#N0<3xIgXXB|b~!3juaOuGp{11CbvR}eM&;=R8GsI? z(vfgT(rcCOl5^je`u~zejf?IXxa-*^NA7t1w#HkAZ|+|F?|A9w^r!82Wxam(C!TJ; zrNy;h_A5CiXbZ@KS z^Kf9%p3cy%@zvNc>?f%J?L11rDdqaE!Ca?H!=igZeC!DR8L%@8658Qn@fSh|mJft*5xZ!GalJGYHcW!_SOkCuCAh)|u7#hqQ&IdxEdpd*n-UlQv*U?qzIHIpi z+lu~hoEEHDkPd-T4(>X(A}fb3i)O4?iY5iyP6vZ22a{m_ix>HB+lS2J9c1yCMFCWKAdDWH7vU6W+Rjp@m( ztlW{v93r4I+rouLk`*u~|ku|tnKilnvkq@+e z!91kd!bm4WA-%huub0fanmh?4eEA&|diPSH(>P6n_mc-{3MjU;xC1NCH^BhP!^82C zcDen>iRWw9G&Zb+1E)zmJv|48Q;GonBQ^DFSBu=1Ue0bW>^NMLv6{ssdoQc}*JNtz z>P#{T3u6o9tog-wkV+vT6C?V z%Yw^-(#yeV{V)(gLkoXYrTM2__dT8coDuWaJsq_q`@whe&EIti%?b{H9DG7UaLS(& zA;VcBAu`!R9*klNb0oh~{-kE-y`uR-Z44(mlER(P@=WrtE({*cYZHx<`jR{p^taT(wBv1ZPs9Bwx^4QXn0vPo^~``y(|nX z{4D*`qZ2$eO@S6W_vCs<YbC;!i-rSCPf5ws}7{CDj zkD>jAP;~4FNkaHRUrQw!!2k^;UE!9Hz(fZye)_hzCE6J-oyDM+>Kx@;LbThAsT46X zK;NC-udp(7Vx#@NV{}jn6iRlEG@U?14b=~fCtyu)hNgH>IA#qvRDNPV2?73P`b~`A z$Y~u<$Zfcc1@jO*WW|L3O!!_~3MaO4J^mWw2EsKwGzLaZvlBXWBS7p9Xp2JPm=j*T zw2!3dXYFs)%4RjxxdfB%0}^@A0B~=9v)CeYfg+hb{p2%*AxRpsrH5fnowe@y zq&Z2@&>_*UFUema(mwVyZ|Vht(t)GOS)yRQ8yNns$z3pxP2*#jvdV%u@}XtHIIfGh?8l#J|7W63fBFMgcD~;6dq$nkbOw=~jIt2SkR4Af$SLMKcLeZ% z@@L=3pC?ry=8GXZL_>Dl#-n)3(syqNDd>Ku?!fDCT237kQ4*&J4crC9%1K@)oOcxxbFn@JTqQIC=Q$*gms%g z3iRuHm`V^~K%Sife-B_YTX`O$dfAG&$P;w&#N*q=7joBuZL*NaVP^Bi9LN3M(2+L3LVph8HMmGkkCH+3pUc(&A)Y(0`Gi~I<@~8KSh<3fnQkR9otEwk78t`ii)XE{o?ym^MQjd~7DO|0^~{|i`^wk_`(T$Qa6-TgMMu#<%OwDde7?lXO1nRIq@%}yqmGAA7c zYhU4==a`V=;owBo0}JSb*{m zYDX30!)8P_P$RAbU4qaocXa0a_E3_dbGk+_6JT)dg!-&gJdWKhf$C5VmP2$hG`oAi zHw>#gJ^g}#>PXqk&dmm^r>`ON1`$wAF~bYBh9;9{1KtKRN{B)dxrPc2@UE>pvY#-E z*p9~13epFhMZ6}HRt2@qnD5a?SFf>GhO2|{%~U<-TmED%6l0{)7%juxwSGkaW1Zjm z)g`>r1Ij+DtR>G@amun+tDZCG)1%$9dA~UcA^rW?s^YnkX&;pW`o7jQyDM#1(MU{1 z${C?I&8Dm9|Hp6t>hFCCt!mmv@y(Tkv3$X(Oh^25px`u3=YOcE;^%BSBBZDdP)V8` zIjswzlT^B3-QR9AEuugBiR&@7-u2~KZOpSI$j*(-T(5aNBu2ML84F`)zQ2Pas`wC+ zKR9#6^bX6zp7G#lkdFBSl;^MC{yPs2SCa>q0f!D!uMi`p6{j7uZ)Lw?BKN=ZB>na* z#JaOsXPz9Lk-1~93rIIIUIxCv{FuNos9dRYq#0uLn1Wp*T;#4!(O8>1bqPuy_DNy< z4TfHV)j=A4g4H2D%nu@bie0<0pKjS;b=cI%H*5Nr?Gdbw&|S?)H?Ie)qw21qz$6EA z`Hf(8468$DEk7gGSH~eEm7jyvaV-i2s}ow4=UwUd=y}80KHgWmItCg;)gvo{C`}-2 zR9CXOs;Y9`8$dhdMI-|``5ebI<-3aGmkf~^;W==*jzIc)@&}<6)0XjO1+)EQuSPZ$I<-GUFa1A zajEmZb_ZYum}g;62|_~G;8${6+xbfr^H91WY5TtNus8?GvCAMgts=)Z<@%0PS5LRX zJUp7aX!egK7REKkk20=Qh7kY@q+SbLjEY_3^l1ABjo=EDs#@WQ^l{AMO1aN2cYYIY z4A6BvAFXO%9Xn0Q&jZ#$9`h~zQa+#D<9vvR2FY#y$e{EKp4p$@GD=$IZ!fi?xTvK| z=y9gCIN1Smw$Z>SF`~I$t}UT- z3-Kry%^zl#;4mLyXK}mE-EiKT`#4fitqd|Si5$t+>=T@47L~U+M5gdv#sYoCd{4UI zj&X_H_RD@wS+e4?#~g*fFj5)Xo|@y%VMo&j58!DcC6` zOP>s&RM#*d&#%xq{SgwSNb5h;SqqZ3CuuLHAp<^GG|JdjB9g3l#&Xv~eOmv2X3;%A zzB_-{2bX;H_Wy9(@>|+&`jbV^R37}d*UPHB{eQUu?eps)&zU8lMdvMFy0m!V0Letu zopGE6-B&35Mntt85sWM-`()Q-&q~v#snbYukd~YAZi0Oi1D#>mRT|t5_T+cB$#!nt zN~(sp^ds0Exd=PX5asZ?Z0%E*_z2Ks#nz2-w#$+?a!7@1nCmDUX)#Sy`#yz`NUBwl zk53-1zh)-#XYlzY0o>5O*1vOo9 z*=5fHBDPWPK{2}(CqpLC2Zs%A>mIq5fetGS2{v?|IaMhR9?kX3=)Vkg_H@d5Ov|Ze ze?`;n8OR;%C(~N??Q&br^VghjpCpADaNKj`Ds!z{MJ>@wm_OYnC~D?I<-$z2AGJj@ z&EhZN)l^y}5o7C@G4W`cV4hhcnB@RIt+eH9S8iYSlSc5adXe|ywy(Z}9f@CawR(;x6-{5<(zTxG1U*p<3TZS`NTQAza+GZk#+s_z)M0y8gdy(=I*U@a$ESj{28y)^)R$)742HFyCEdSEg(XD{N1o0h7 zJr~#lg!b8}qp@~Z}_oLE75s*#D` z`TP^Pi-!c_vlotyes-fCU;e2eBPZ{Ar)Uk#booIwff>6l0Y?=u!^9X1;^O+3vGqV3 zwnI#lK_6?upH^w){TJWK8m!5;|AV*dmb9^gvj&ibiA$uMjBCr}^C+`?d~7To?ah&>(?SfUKxDun2#Bwf#FyU>%35Gd%|isbWYFvIfaCa7%{heyE+g#bbE z6$@83tNulk@&O7VsxGC71^VK-4OCH3l$749X83W_7bHqSSDO0b3((W2YS1LF;P;J$ zA?!}TqZ+St+G5v#EVh~U=eNJ@8sMfj4DhTAQXIZQpeNZp*tGT@5_A!UF42bCeX^(9 zAF0CJf?oY>5fgWQ1e?hWEC0$sb{+M~lcX&;x-HuvRn)U-f#VGou~ zA_1+aslQT#g>tUI+9s9bCRB|@bmp22Ss-tjZQd(~~Q7rGTW6Ferix zWVU5UhPq=SW>ew_CE?z#bVz2`5nuKj=Aj&MrTjSo0Q_PDy=-K zqGTX!s^t<5WUxpEs*C52<=#A|hV6cBzf<;6(#G)Uuh(tk_H)h@1F-al@i}@4EZD zcYS5a-`w%wZA)%hansLu>HR+o{{*tPu;(tc$WW3dG;f#TcXA`w)P~(g7$O@w9n@uZ zQiKSil-7G%y+L@HZlIUX0HKok3sgVTXxp0X!$>RY1!jU==I60F+K`8(aDI0VG_y+X zd!ZUR(mREkkYKg2{Z2c#lS?$6v$I+H0Kn6s2ysSuK@tWOz9eA)8F(m?iiOiKGF3d5 zJovRWZNFodgV`Zzy;!nzb*s(}&2aw9?7SMoPfRoSz9;He*^S^orS*By5hU~Fw6Wsb z9^DTVwR%`is~i}kJ5L3xwXlTai#rD~f!O2yovg@=lg;{2sdbP+4Uw5$2*bidm4YJ4 zdi*Cp9o|tuMl1B527muM*`?;8p7&(@fwtLuflH6IaJV^wr5_5LEL({>||`O=#J zbnzmDvNAp`uZF6%Z<|+jo?2fHJ7-v`pINF0MXCYIBq036%H~fStms`|lmc1sNjuZ5 zpNm%Wx_d)a;ES88mhFMY03v$nR{U?q|IE?&N@h|%~~WrNkrt@@X&CZ})H zfSqB;s;_-j!&mZf=6w1aCXOvF9I3VS%<j#<+QdxN zPG7-g1MqH;AFv4=8my*5VNPKp^XVI$(HogBW0Nn?Qki0EIv7d@{ONcCwo{itZr(xA zVCY+INwZeKY3dIDW~d%<$?_Y!^4)KW zzp;D2w3C^w%bw89&g;5?1*O9~5>&kL;|khwb%Hu|KQtMHQtXcR%)x<%6{XW!FiaQ1 z2qw&wQxuPaM$uF-CKKqD23Ldk-_f?#JnW6GXJNH{!1#IBcouHi*R6tK01eghp*=Lz zkTT%8JtPpIj-5k)O58VIrL%idTKLUj z%ACW&WI>U08vJvl^hP^#^l_XzL`jS^pjm+#H#=R}BY_AdV!$I8N-t?#15hw%=@8G5 z-K(&F&rF5iZ=OH>drIupptBb+R&ebVH^6*4 zt*?&pj7J7nNKn#K@$1J+FseLgbU9N-{!}nwNBx;Vg&u$bRW-m+Z~qVUgA1B5d-aSQ zJj^+x`A$G{CJOzB?ibjVQyU(r68IFr$UmX82%i9?MDoLi@ykonOQzSf=`)UpI0{nc zajBy!*w)o6lV}V*Eh1>z97s+wwQx)#lT*9FQ6#NTn?v#3m<;L-2+F^F+*}Jkn;T(9 z2}{b0QntM^Amm^>1ul>iirJUjhm2&kDa4uIKHF&3r&dYRk-Ybm-3W*)y-V^-qn)&x zY#%r4OX^Wo8CYvqK3e;V@9{?-diW0mOp@asjI4KFy~ch+el9#8f#3p+?dhV6v!0Gc z;^|~E92DHfO5^{*JHBoD{};Ck{{O$Z^Jhz9xBu+6);}~)LFOCHQ+RgidprdP6nAL2`ao6w|PX!)tyt;I`!Pw^YB z@zF}{g0p2L%nX5QREKk5^nlT^!et1e7BL9T3NzBxjCY68RS70w7f3?HI;BF))uw2G z&P3vNrGrX?g*65O_(F>}5!clAbt57(C*nMlE;tBY=Bzk4$X3CB2V+~<(;Rb7@uhh2 zJeh;tJM+|^-Gek$rZv!qlC^cU&Fji@WD-_50m;Gbxgl7_+;~9>p5?!j6(%9fn1pkD zaZ?s@8?wXz#0wW;C&4Y{7Dg>DgC>?UXQR+keSx@w*w7IBP3^dl zA7Jf%Cd&!ZMB%V3v0_X_r3IH^R7i4kbW>hH^q5UA8%0w+%!z;y$86531 zLlYNT3T~A0d@G$BOzmIeCcDPR@$ek$<5Fo!SYa~2wCgiWBo3SVmLyPMg08LACZ6Nx`)4dd+vp_YaQlA87S`~U_010GrXhF9Zps_t9Y_4h1bGTW-zaZd4OBa! zz4MmosA0SX4UYLGNW?`m3e0&!cFpup05-z_yrD3rm=Agg*)1*CPqj#@MYP+rPdF?= z<^m|R8YLHU?%D7Nm6aXzWyenfTyRgHXgBA4`Z8@GGxj9S;Pl*p*tQ@6Y+L~UqN%9g zVz=9&G!xAghcd0-%PujC`KRt;J}(n{vp|rP$_~?9Y5IWqD}7?)4AoMMS?{mT_o2O{ zGf61Fm?J-R4g=)Ip*1UNSFfqFAFj3P8diqNUVo_0Zfw5x<>hP1Ei)_vBh^o{rQ+ongG6RPu~9fkTp(T(L6?;kL!ml(HrnD8s|)P{a51v<6QDzl3BX7+z930qR!7>@QgjOX?UW6<0Br!3YQVxWd;>N>3 zn&&#&bC>q&C#MNbJf47-2M{)YWI+@yftYC8WF|}+AQNUdnhjo|&#lazOrss?;XEUchDljQXjvg?+8uZDsSbT|SNBID97 zd+fZcKtoS_$UsD1X#FGCO1|psx0#+RMoEhBrpxK-=ovI}Rn=pSR=Un!s%s%V)}4Kn z%YHk*;dP1+xk;$%HqfU^J7Enyg5+@vou_lH7kOJABI7WV$2rdUJch4D&tvx6&^uhxA5a1u7_&sG0jKZK(UUc@8j73Gu{4W%KQlwh zJO#lW%1k$8cVVJOC~*%;&5xc`Ca~*qSPUQ=DGzr)8&ENhz?Wh&D(Ko{y)~`AyKCp_ z01=nH9y66pBC@N3fnXd$W&qk2Xkm<>L+*s?NdiRBR3=`jMvU}je@%SPRyu~&&uJ3h za~3~m`tu&^_TmS99BRSbqLlK^Iy)**?a~=&!h%S`eZe$g+n`kP{JMJb*$$9BruIvz z+63k9Vfr~uHR*+N<`u!|7I>B(XH&Db|kheAmN$lXFI zJ!$Ap`Jtz?;~A)v!Jn*jc^>#~_93%8(*JAR(3RPb&AL3#y6ahFX{cjOsXFwFr zs9wLflkhcG)R`{*vY|x`m}z6cs_2^nM@8SY6u-Jbx(Ye((@JK45m)X$7xYMONF>FxFy$jB2mq3Bp2t5 zh1T+nUNLKV zNY`@7(yz9C)U4&qoYjn_e6-GfMOmA3!%Ue_7dSxYZfOnWebGAxs#DdR{!HBMLUwA8 zFxB_h4Ae)rTMBmmo33rdK}2u9CS;wjeWua=`dVH}zoz7xtHHjLH%vKywO!x*+EZn( z%-l{fz;fyDTd3{iEJ21ol2jxbOEP0r*>>_O#TQx!T{HCMb{+722cMnop$?eR2rylb zhM{L#GukGBbY)ob940@=A~^1v!?BH4yLkBOl_SdbhI?R=>N3b+s8war4F5(@GEvh{ zq*o|~XqrsXWU;`oGMQvZ5c#>3cAs&O`XMroe{uqMh_o|~BOzq|B0R7AWZrkfgcDkj z+)=_9!zB~qe)5}lfKjH>;(alF46`_nLK_u_#cyGz%Gh@%QiR!)v`r!vN&BOf7GQ>c zb(O*Gz0lgvzSH)AnyXUKSox1bHl6!Ceqgy9$`S4A_#V`K+i{HOcS7K&Hn1YU>9d zyyx1I0k}rA&=L+wo{C&$Q=M(EL9RvI_)mR9b8TiFKYXpBwx0heK}FSbRR2w88Af`^ z<%)tjd(b@K9^8ulhlFRG%5f0KJ>A$)n|{iwpZGD@;{*{)$1DdBcwEZ%}bhVu-jWe!xNC zCSI}{u?$n&hNrI*gw}pC?9@FL$QzadRx%0UuANCSL>^C9Fnh17^y>Ev(ba`E4?Fb5 z_FsALRpPtKt{Cql1yVfUi?)yz!U)4)toBfMB5-d<*aiv_EzRvR3n{29um~9h;C)jq zdqste^iGXU0zj01-Jp~Z-oP(Eb`~ByX(m0i!L**3-3812p)vUT3I~pg8`#oP*uI6F z5V<5N2s_yX#Zs9t`33F!JH1~nb4b|SqzrbFLG$Bs&%6pOX5l38l`ZrY%dh7znArd+ z9GKne5UrPgJIRw6e zm!V_^*T70gDhO^>2C^eb+ z>Pe^0^hh#kn@qz!5KqTW+PX<5N&9*4{r`*I#Zsczn`B~>Bay)W-2J`Z@BQBKecyKv zE0sAQ187S$z2#hLbgD)whP6j|P5R0amZy*)Bv>Kx4@Ozd+NO7!h#$#Xfw`X^gl51| z2Dt#{6U;MC%(IcT0tq?uY+(wKp$r6wkenDl&c)9%H13rReF4DOH^5arOFl-BSiYi4l&^z%GJJ6=-YLQ^$x;j!3k6% zb5m?vyOv$X9$+T3arL7Qd5iO~OR|5HLMHm^%X@)(9^&fEywjYKQwivi#KP5R#ted= zwTZh@r0jfNXFL_$COmZZ(Z2RfeaGSC0d&47BW`dO;D zXMEcp#I77vu9b#Z zT@1pmcsv*hl-mbFJ@22B3EK6)-3j`&1ayMbSU2nZtQ(KRUmxLXand~)}oB*SC zNSB>`QUBba~y$fiSAzHsw8qw;^)?6Ie0(~`0*Ee@Gt$d^P zZ3*j27X~C`#9T#V0IO5bPfN1;iWI?+tB{aEL!8o%x_EtqKkD_Di^v%GrQxJ>w7TB) z-)*)&R=qS)vI?Vk#WF*r&RFf3ZM_l-pq7B0Hj?LilJGFtP2dVcUvDB$?bW{lI_pZcJ)BXa#gbJQQn;#p888 zvPxx6Q&A{Z|NobBo*I4fHy{7Mk0l7&O;ELc0KYrmeHS;n=&WujRAL@K2>g=;X%Pynb9{cY zi|7k)ZxAPcOqQ*_kK~j7>)fDprgFmsU2pH@2BkgHH*C458(>wikHimmy}>?A;Trd` z5mDD2st^VX4^gtl5nqFsq<;_(G!iVMNY|{|iLWOQLy?&KX==8^ zvP5WPE7BC{!a9llsb|G2qi+nn&NQm0S{rBFJ%vA4G)DCSKx(l5S7y6rj3h%C@%tM| zW&|6;sKGJ{P;88@zmp8;7zxv`E`@0Fqa~NZig!l`0Eo-&FMUb6k#~()po7Jb zhYf{aVyz{xcm`&fo|2F8a%(d@Qhq9(6Y%x}mEgSd%z%^Nb;4M=S6XJ7fE3M=+P-(Q zmsh994yG;+ruJ=y1=L<&BtEi&REJRXSrJ4M4ZnrRBNB)}TtGgm(O+K<?#plT}Wf~$h?(8{y9L}TjO%Bqa~T}Dh{*D8xx_Fj*kq^-w3_nA zrV1KDA}SQB<1<#%PaTU$Wz%fz#yiFPVz`ug~x7~lBE_3tm&He z+BFK=K}#!nf%9t>mln#G?l{sY2ZK5<+RMOxMF*B{y|ylzx|Wt)7tUDDlYE#P?oIFB zoxLPul|g+@p4=_^ZKyN(zR*D&Z(FbyYiqL662F(Efv!EdwHJQ}@*GB&6*2dg9kzmu^|2 zwB`|NV^@Db&jt&*MI9JfDO9alE&eU(F$(C_;H4ScVW*Z=64C7)+Vb0YX$D|d8D&b` zncS0_5F6RNEGjja*x8<|Oun2?_pJ898aM-8##``0ZcgtVv69|-!P2tBXzZ*1jBXZf^ZbYjayn z7%;Dm!5rrnClR!yIU2!d(-N98pNYrnvX>sC)HSotm(w7=74L8z@C5+l5*G zv;Hy3t81T8$%ky|<+G!fs?C2!ZfK0@p(_ixy0(G5QkCcq#kAxm0Y6vuTx{nQ2$h{wSw)OH znA%7vQ88{*2%h|SPT};e`g3A4)+(%c<{D;W^N)jmkd}|c4&X$f^ng%!h z3u7SRy&4hWv80U5!BrVZe^c2rd}LnY1(k7*nsZ^-N(}-Q%lHegEoIG0unDWyDsCok5(j1PVI9w_jW$Qx+fD1u z^T`pTEfO+Z@=%A)a8T;0DI&-of;?jgqM!6|FGr~@ECO=&uJ&3JsX23^bLE=KZGfA>%{La+Ks+yNOI@Z;!mR>Rt z8IwA?l)%8QN*_+JJqd}_*d@&F`32$$hGC}@s8xlU$zjz>2rV4+#v{I1W4sP%Y1!7n z^ydwAlN@z7s-`4dY9%%*<4JbNTxs|=vX_>fn57u^=`&|Z?6DW%ldP&){_^sg)uzjA zuM(xB&|I<=3zsfm8E<P#yZPHrFsWR+{s2O`8){1kQ$*+ z6f!#>5_NXaw&oZyQ5JVR`bMiMJ71AhX=zjM5vrAnMBR|8q;2stgLTj_QLPpz2TNtE zF72smpkojc?y@(>$qNM*SoLShw#?A zM@^GTuZmlmGLQ*kAKv;zL61K)!8`aaELVT-K5H~*cQcW0A1sn$5HGM~_au<(N zq!AtHbF* zKs!PK$Ebrp5iG=cii9pZrkg@yvR#KWn@+jF?iZT~L`WCM+fJ&R1(6*&B_Ip+6>22Q zZyY?DM4?rblvuD92NUpmQPj!51)~=b^N=-<{c*wyW07suGW&;*~ILwW7f2N zSzFL-S1+wt_T}aCp8G0x9SI1`P}7D?Djs3_7}R?`Bq=I7!VPo- z)NO?S^LWBEC8Twhk^f?szvKwBtyvsLhuShl;1`ByGTy)Z`DGY*`Ko5Yx>)OHqOC2B zO>1h|d!&WqS6+T$#S3gj%T_%9!istPpfcg#mlwXa_?4Hyn3&9D`RGTzAkOpb7 zQV}DMc`EKMU2X#ra&V2F#& ziJi3Z2c$H8_5`*La94-Xzzvfl&*vi@5g~KKhNNsTGkH3_sbdw?{du@fKpasA#Y5TZpg1GW$Z zkRJ?JWMgw>7KGU~fLj=d#>&nZ{o9Wxzotv&Pu!)l&?)dJHf#zrMt}oZGlm_^PYK$1 zn1hWJ(_2mpak+Iap_qU3?(~&omQNBVvHpKqNY_TI^1#ju&A^a^0SJ1Ya zi7IhI3QHUVSUH1$UBR&ne9;c_5G!F-u!~C4iV$#c@;;J4SMoj*Yu7H-2uoG!$OIgn z0%cSSYd(Aq7mEVx&}9%b^VLJ7REhmn+z|eY_`r|~emFwrq-_6k>SfFS|M{G!UU~9c zk6(Oj=_B8J__rVW`3LsR{qw&$=l}kj{x(J+`LwL@O~6K-jA!D7l14!j{L2(KQh9Ch ztsE?8RgGjH1rVS}Vj?a1i(Z_){XOQeP*p6KeyaFU#J@)+nl9x4z2ncyHKHGKErcg7 z`}M|`+FIAI%e#Bg8&GrGr*WCp(nqcmgG~>QgH2}3mPf5?)X-IKv`om%QcdQkaAzC=tlyJm#&AEYk6~IL%dDmK~2%P z8*wgiN)#!3r3P7z9(ytUpxPQE+@%WKUpxD*B60XAWx@%8$gUDP5^)IKMc4-D`e%V*X-7%N)3 z!h79(DzF0OMoitfT_myqPyqf1ELWlX zsl)Tl(q3bU1(d$lPpjtCrrmd@hF8^SYqORPm?pFfmzG(zwk&FkqYkU)n+hr(7rOEQ zZwD+

    a`1(C>?T>fptu7eF~2@HQ@wb|zNpxcrf;S)!88FTq=P_i%DwX5yNKlQI4- zO%h9|9}-GbMvsoYdN4&v^d6J{D$%M zCI72CeIt^#FEPLbKJQHICI4x2iA<-%;j?>tb7U=TYw-}XQ&W&QOYhhU ztriWR*HOCWjd=KvuEOO82LAL9k}vCO0kdTW=$DdkbsX!Uf*X_qx$XN+hP(;2m^&!%)21;%+V674ftct%?5k~TYKaty)Q4fC zT^A~{zxcHs3@xJR5nUG&EM?i2(!d`-o&2XNQqW=+t$kbgiAtVLS#QQm!+MH;W8?Nn;Y34EHNluMoD7NLHNB8mBZUfOEa(Z9J87J*+2 ziU{~on;r3mDNU>|dlCN6D)Ijxo%?HZp8D96tDpFLkN(*s4?gtV18p3*|L5<@2qb@A z7Tu;CfN)Ks>0Z4PvAlNON*_Lu9_&;f#qstEea6!6h;wPa6O!{42Z_WQI#FwPwEoaJ zDH|VN;ZCZF`=#9azy&GZaUW*xhq1A|+KR8V(se`}&qPj9Bj#Rbh$esGf&*^jBe?4K z)>ov6(QDphDCBFDW}7jux3Qd#n`VN4A)8bL)23f_bz~%2IvG>KH_6Z(y6aqK+s#aJ z2(U{;vk|niS3)=E*L-=G@C-FMuIh!`3@i$M+Ib-RAuSDwm1<;2?4ywzGatkFcfh8@8F#8n z@WHzdT19?ct#wB$k|)j9y*^J}owp)e9`cm5Qi%S%5pbmS;Yee+j3PIa=Sy>vL0x{6 zt~^&ev^d4F@_hWRZ1RfDl;Pv&lSfxM`*E-!*s!+sIVf*4ggkyu?oe#VQ(ZJ zfvXV+X_vb~k3+?m=2WR7v%2;WruI#zEK_1yf@9U$9C*)4iFsz=ejf* zuq#EIyB2R<5p;uk?-0%;1tS&lB#}4?VT3N-Nj;%RED-aS(ICv0?X#Xu7XH5A3jNJZ zr6E|kWeYS^s?q35$|#QShs28kTlKx0eGN?=*ss$UkX+wtnEQlobo7$QEyv>LTn<@< zoaF)DYVYT~o|+mK4w*q3lFSyWnYeH=q_>?nJs|uyARfEVrTPE{_2=&f=vQVBa)I`S zFfLCsk{T!Jws$CX;b7+d2?zvP&ye8Ge3>i61Ba>r3u-INuFT$R*-g73nol2^psO&I z+`z=5;HX< z-W!5YB@&^>T9C?vaxt-k)n^jFs2cs0J2fI*#uhnCqi^Y?y%>_f2M2T|(?L@rsa*sY zZb)L}7*tHxL7{>#d0y&<#lv81rFK%u?edq8fKcAhEnR9@*2Z1Khuzbt=J1d}mlq8r zDTjbJ08>+?z&k?K2xuo1iqDj8S1cca7E?y@mDi-k1tt&0{uC;!Bvz|yr~icgbD$SpU- zEZ+kZy$BRF&n0v|RF!0yyRRX!>4Vp#J_~{afB_olL4di>M&4M3ige%N3t|22m5KoD zn?jip9QK0>4&iQB!XG5rp)&ITH}(YMR9SihWp9Q*_x)r{CqFcQPFgUzwxrA)^VA_j z?}g!O7a9ajHajgyxY*h%q`?bL?tpiM5{K;Ane24|s!osJPG25M??cILMT9k}ol}|q zZI~q4o+}QbpqtjZ{a7oYx+T|jWQtwPQKgfIa^3!{Uc+XN%>j%P=xc-!ck?wiI9}!u zHQt1|Xt!s^{l7DQLXZUNRfs&CI_HX9ux$Kt9ImuH?p{LXD zACkkx;;v^G^alLiisb)iQjHBHUwCT3(@-vgaqu5Ks{a3+e?8};KX~#N9^dxp&WDdY zxbq{E9QZr*C#k@$ZW!sDs8jL-9pL<^(@RTgURas#JqX0h3d;e$*VJT32U16lXU=US z!NaT+nlWWm)=T!Lwv4bhqwS}s4$0&=GKF41!&sN#?klN2smBuDZOga~y^pS7=4jzM zF7M2FawbzZILZ8xo59$+C$ADk-bV=A&ezneX@0&f^7aeOaVaBe$9%8N+}xAee3>cj z7?cjZiiR$UYK>h=_n&4p@>F=ac?VbWH_C{N`T6q{Bj;Y0>b_vF;dtTHt@n87T}6-R z%77Z_DyC*THlcKo3Die`^_6S3f1}E3__}l4XKy=Q2#U99M^hDw{e_jj8L^LVQL(26 z-ow2Xk#=vvr_K>+o51hf7+f$txr<;4SER?c&XPFx_jD&Vy_kkzjo1x@TTU3&Ytsj( zD7+K>;~I`%X{Cmt_8Ww(h3n1^b3P5;duR{wPd&dP-a>p^yVw^_9xK_)|GZVqHr77;{fQE|e^ciOtfqfLgiRq{e9x*OR(< z2ni6j!f1Gg*2ub1#OptMLlhgYT&^IA{aEKS{ zs_x7!G^b5mX?l4G;I4H}4QMbR8F}Z)5&Ca2(Q27h^7a-Eu= z5S*F$`F8S~PTu}=(DN5B(6EvflcKcNj!lf zT)!fABg&VjxZ8euPd{$BYyv}xZa=T0u)5iy3 z&^;hr0nNvbwcvLjv(v*{c1zS4qMOJoYzNG93VJ|a+-ISAa z;ZX|Whh3N7juA{@pp58=9V=FYSsaXYq1vI)OHdYI<cZl%KyDrP zNcDbt_@*qLysOM>5pMfV7>n(*^Uw{Sd*>O;45fxhM*BRTXDG;l*-1W-EuVY^i?t)z zsKTWob$y<&@Y_`cp2pG;bHo#kP+R3`jE6k2vOUqh<;f0}{BOCI=!PW0>k@)5;fdNl zlzMLzsvS`#xAyS^!)oZJs^yE8&UbVjuvfhbX%uW>+$CM`whfVrgC${AnhZJZ5~(V? zaALJKy3yMtx&yBE>hOa6nT2wc-ZQ+D_(K)UFAxXKmu*idRQp6cy_>UF2diSw&Ckt_ z+{fS+Qa4q68VPmheTFJ2O22h{zH|iy-iGI-g#GpbDR5LO8rxq*QPMOz#EZmF5eA+jK&A@i^))}}Wg13!vL_NNn|Nbz%Nv{Ks`&q1ZsC9Ihn4@*<$hU8 zo4bV;NMUX!e<(Tf0BVqO6e!I!0Vr}R6Kb3R$x(3;^3fuvuIyZK*TLksbS~UdZrWdC7+rYf^AT2k`u5vTzy7B%TwLL%($-? z)~4J_)s?=3%n0#IR%q{8k?hT3@gh}_viQcalJYfzObXqPG(2e65keqRs7LcJW#1^= zq;Mpq{BrOlWDqn+?HM-?2@`L6d?)`&uZJ#&pb88vn4|2m(G-eAq0XZCxMs&eqLD;J z3(ptN0+6VF@crHjZ3r5V^2W%C1^qFvKO8SRGxqLi@*nFg7;|UAH=X7HcbNtG@#dAS z>sw;WTU(o}*G1Rb%5_%Qp1wP`2J)wYZ43+7$C_GYs^RwfWVBxj!MAZ#6)j%&^?h0>P|-1&6QGC$l@ zM3PTY6;zQZZ+6>CxHmJ)wK3}TG{#_REIV+x;Wv`?DyUpDPDNzh+s?fxvNqlpk>#TP zghgBn#G?&Q9poAipYapKA<~0M!R73|k{uai@e@HZ0G!D(4@t~Yus2viq^&-Rk~2HW zp8~m%V6tQt4d_Ed553^A8Ae+!&A@8&f;BTN=nseLMfoJZK}Ilm)yI z7q)1ni3o8ZAbPK?02}H9bq!F*N6H3Ztp9`Lr&NIF+(^*ZoZdtCu+nUJg`ncD5>!l` zLwa~*T$0u|u1_C_SCziD`G;8s&ePnu&ZpYfYgwb!e>oMXm^`l0yO{>a%m~(-19r3+ zU;aZe)fN3}FXR>GK`OK9^0xR}3LLc5gmkFjy%zE9KPyLLRLLPDO9dvS}9w zzxk)uQMx+^mw7u;8a`LTP%cWpj(1v|ep^qrvzs45rx~{OmF0^VDjB(fiR?&UF5e;v zIU@1tt4CoIbDj92d<*0i$zOq-kZ}>$?&s@pMB_|hl@JVI_)ipFx8Pa z0N`RMAxK81wmHPC#6s^(?6&q-v`$LzKa}e0BKg2x4?;IP0_F7R^yPufRDWvM6#>ck zplhn}!cpl_cYE_8@G2}7(gRFSoUzU=xZq|LPVehUpS;Q8nwpJrtNg{bP{2WMA4wjC zfz~qtQ$O}&=O8d~DqK##$L|(Hz_K&aa=Ss+i|b_YBLq{H#Uuq?W0*C<=Y^{w5D;=v zu-Cx~fS;(0bQebnKu=@7dwl8$A z(mPM^OeuY@nJF`<;hPgOiAZC*xA0u)_LYCgp27snU39l2pZw$} zJlHy>7D<`NPCa!=^lSgob)HFClpf?Z;Xu4TiZd4~Kgsy}uP3w<=jN@hl)FAklJNsq zZqTHxEoJbuNY+(nCU4U3KuFb&^~y?iwl_=W+JXkrxk4=ecnsscBhs>_IsP0LeY`EL z4T4GBNkop&-RO>LAUKG(co+lHj3`hM{EZExM96}%I&ZK(;D6T`>TE9d{?mmpp3g{H72%IDQTR};@Kfz2Qs&MDlzU=6pG<_0AnN{2Eg3RRRZ1QNq z1=rqZz_@_Cy-epZLJ1Sk(4vrE(w7fqF7K9`ul5iM#jMMYo=WxYA_XpruShLJiD1wV zYtrDD^gOah3J(<=u+6CSndE$Su&GpJXU+}h(DE~iU6wB|FeJQs;nlj{_TQi!zIssv z3YB&uYQ@q8tLZ11Q;BS>Nml}3L3q-_p-?Q`Slv zjvOs}I*}R~!f+Eka#IX0Gpn4fMoW=oBn@R-crnMZz5A($evf25zb$KMR~}kB#(}Eb zt>&-uYIwtNRaSJdZ@%i<>eaX4xTxatX3}u;xk(w5g|S+kz{ie$2?_VnVh$< zrD<)XqqS{b>f-hE0VfG*9I*MD0w2&J32_-hUW+uZkGpp>{1%1A<#gn5bCeu8>9N2~uX>DARqHXJ1o9}w{@<_)U+?w}hS>QW+?X}AgPtkCN zJYjDz1ovhIHiz(MnDZ`Xox*;=>y3?`a_Q;@PyDOodX?J$%Ef&j5;Q4V?Jmw|ZuFdB zABu;BsKonfYQC`S3(KS>!}%%dAfR)%z#IFAtqF%&1yHmbp2LN)w9$$EsexX6#m(LP zYsU!8X|J-}#Uwiiq^T+oqui4DAYc=2xOl_X7{PZ)2DzNMPFDa#ZXx zPgCzXngqdMNHLx-@XqTa7!nf6>+BX#*w{$6{~Vh+1yRzr z+{|D*Ax1nzp#lzD$fyTw=LZi`AyZg;W&|7K{-{3|3P227zPj5t&+`8_ z<~-H<U{DOu~ zo{^LvK**i_)byFbg#IEOxpG|_t)iZTFRz+%2Q#q(P7whIoOn9u9YegN(zz@>#dEmda_ zIEL%%D^Yr8JFV271RLrB`Oqm>*agew!W#VU)5+&ma3@{C#gp?tL~uTh`&r~eI)V#_ z?qoGVNNT|8j>PY!1U5l*lW^fo7RMXZ_@qiLedua>;6T3AfKI2k?{W~y6q{;3C$;mm zy&!XB_r}cSEt%u}6dv&yP45s`#dXha-Mx{Y(vU%HJ>#Bo+)>x*w2v%vgJRRuyCotE zbZg&jf~*81x=&|!oy%@LCB=n%s9`M@XFZ)mLO!^8Dzy%!o+Q{nYO{`RzFu!bsO$h{ zrYiZEigU=_PM0MXe~38!Di`a@k~ZuX_VD~tGNf3yAcNx#@w+X$oCKNww)AYwztR+2 z6Ymh`zneBURO5AE>bAGrVSqe(q;Y+-9q<)jA?v*Rk}!)1?1cZ$nqyxi6Vhw=n}LwO zVlvU_O4QQ`HE*NeN9)J3%gvF=!zzKKUUs36zq_w)xdBHpkzwETpzPdT*u| zhn$h<)}^BWXc#qs9riPQF*g$1C3&`SdXkdw69hRoA`ifl?&@&Kh0S1Xq^U(tENpIC(;^kw8<*xCDG~^tzppL?DM_WmUD^~SND{2k zABe;~-dNc^tOoz^^XmV9;VdYh%V6n68ADcQ^7v6j{tySl0!FLPv;V_sf;~3NEmPnzLdYRw{dx=7Tu3SZbW#bi&_yO7e)O`|K^~ zOA=Egn)Z!S=tG4OkLM;{*0*nZ&y;kH(NB|mtG-Oift<6ux94u1xss2rAiY`7U09SR zLNi0L8V+FoRAjrP+(A`yT`17t_r^W-abK)l)qM14f5!;1Hvg5oT{a0JR*8VpJ~j)LiT8vNZ(`fJ zbxl>vo8E~x&s!dEo41(63F%gFC|A-WJF?p@rAEdX|5S1ZbuI9}&x>*S^Q|2pbg^J? z_l?dXi>Li3T_s32RxGk7rFVo18+=h{#`qI0x2oXiQ=#NS9aVZ17;R1bF8n26N2It| z$-~gAeAmp`uFUY&D#zV0UMEqXL#Qb22D(3X7&mV-zJQ|0gDc)FD z_6k9k%E1d*#gXNkiPBsZxfL>fct_^^UP~i!kanC@gw)jhVdvKA!>k=4O#Q>oZRsl% z%R2q%rw5N(4Gw8wSuRRc!75XhNx0)DD2$fPa?=pNe=d+plKlhe^UC}KrtiR+)YvKd z&KJD`i?|Wp5wkXCWx0$JL&*Y@|l+nL2q(K7k%_IPOl~DiW8E)+=Pa z0`(QZm#eFo;5v;AYd4(Ry;2t?^2NNpbZV}C7+$RDiriVD@# zy&Q4eK7B|4y}=rt-3s&5DYX$nW8K3}<@wWANekqD{QrG7KogQESYXZSi(Y+sx2$sg9)3>f&}#<%Y>2eMU*s%GX}1SqBaVjzMYnqYyCE zG3}7>+JUW~hToo+Ob622Cs;g8D)f|9(kxK(lkkvL&O}|30OoGj4m8q#8$h&^{M$fJ!nK zy@2FjG?*2|O;AU;J%2-E@-nhab!%O&Z<;=K1H2w*z*K0f#_INHd%J}&vEX)IATwo< zo9ScM06!RdqE^EN%E=UKdaKF;0}=qcc*{$J!GA_I>AH8ooKY-iE5q79@EZ7aa>tIH zOLarSTt`LS-l3x9AQ;X-2&7-7P!S4>fcP^eOg@2dprKqNWbm&JD*k`Y&(C>k&XeDM z{5y|+`{A(%FFf!oADPRc+@ItMSu#EU(bbl#lQaz~;TgDopoTvYEkb{;sY800s4WL3 zszg1NVVeuuzN1x(?h|`l{X-pg(|pF*fI73M7qw!597bOXGYmx^1bWQKcULBJL@n}O z(cW4xY1kW^IC|u)^BG_WyL60&e0vZMUATVvKEQBLjwk{lX`=U|_D=WL+R55Ah4KgB zSx=i!P$HE9fB=Nn#q9IPV&OntBwiN_c*@-h>t0T@sc?VO6>isDP`o8@o~}N0!GdXx zk0N5JRio5b2Lr}a0>{()25M@aYg)4=XS3$4Qsl>I362(r-UTi)+!CWR-&>1a?Fbhm z)sd6-Dj_NFI?T{Z2ybFf6_!o*cE1!(iTB`cP>xz)^*Uq-BYOd71JaxBOb8`16G=Zf z&wjCq_JEN!aVfaVYXxG8$R=9hmo<^oB7_{Pz9b?Y$t6(STqUh z{T`scG>H!9AfiXTUr(sn*z<4Dq>8a!zv=@Q7T7?r=NdP$<;7r&e!V)FI(9TQx|gsp zST0Z=Kscb%*OGAD1<_^`r^w%6#x3~ri_2u}_gi*GEN zu+mqiKJ2geSH^yK2#kXMFytJx#0}MX8_TW5K3en6rbkt4T}5lzOn5>Vj7scDKjPr# zPX#3H!Jg~OTs$T$>xZFM!3^vzGD|Q%2B4Ob#&=>XUxfws!gTVMByA=;>A*mg@mW~E z2tK+;u=K`j z2inDaB0IwYQGbH6XFtjF3c9aBL=2~u_~y=0vW7T<>hTLvg0h! zA(o%8O}B0ZTg7EU=CW6$Bnj8^d(G73v83k_iu8_?5@RZ4$n|oSl`;sj_aKa>9Hyd( zGhAvA?A(QH07Kkg@;EQGf zIsy2880zT?g(`howc?Lc^Y7)ax}dM@E#lK>jIXKZm}}0oif3Q$EXd^rP?!1ApOw*= zx$uKy*=}BA=6cOOnrz)91cJ2%$>9>KJa?HJ+0I?O5)fx|d`VNwoAKD9Hz?U-%H^$j z(*mNMa>_(vhE7uo63b{C=qT~|-Hb?~%nbmh`P zAN};1gqGX%9CU4|Z$--&Jkwu1g`ESLtH;yByTmfkSigwo)^YrSTp(YV13avl*3`fyJs%=;)$vDwOO(A{KIxRZ^z3xCX6vT8m_&Dto2gCm6Gd=Q}s$~vHaQELiK)seZ^LdMnVIzaJa56 zP9F(>tXw=ISwHdrpO_n+^HlQ5T~EC7*nfDm=aFB1Cx1_e}d zd?YDgh5$^e4TaQL!gSguj`pcIq4Rz7YoX+YgiOrNfz8|?6>7wyF;w_UeOn2OYcz%S zgNNmaQ(i`TV+2jhDG8%Ph^5dpF}Sgj?TB_xu&7Sqii3yVANJ7B)Z?G=wZH!Pgp$hi z?sxZx4Wwv3TnsQD5#2Yk_j{CsZrhk_LgXd`qe+zZc!$BYOiE_o$rlzb(@hqnv@auR zA++M~n3dNr2U*ks7HmUvyp|`g`qYbymn_-1^3@f~zWBmM`T1)LUwQs(_B)Mm1+Boq zr^d<99JYHGMb_D!&wcsTS2wO$Hfyv5(gk9Arg-(}FTI}lx=vcz7c?^Q750S>7%eD_ z=sKnG2`omwqmYD22MoxN&Xky>X2(MLdTRjOgi`4e*0Ij?W)oYajwfM|N`nL`SHpI3 zO19OgmH@I@+RRVsLcWJNoTIK}<`OZ|wirw!YmCPPnm)8iOdv`rN2lgHBd!mb?wrg{ z?ef;Pwn(cDxWHK@Zg5cFD*Snw+mqRmT|9t546m2DD81kGkt`(d`Lmein zAF5|J@Xk!kS9=rh>QHZSx8Sayy63T$)ZD}=3N5RxrZ88GYC$XuRawf05PQBH#CvhS z-3-B;`jI6cm3s)vr2lLftg6*FHVdLwTH?)ni^Ob+5DzR(?s|A zd(jWebW&j{n%ixmWj^r-{5m^0C&9Boolx1$eC#FTT?^!6_xwd}rFNC9(|6*xLN=DS zQZtEj)7@jK&fTbQc*S&&*~&_jR)nLM7-VUaK>@1L*qhU7g5a}@*SdW_&V*zF(O61_ zoZfm%QlWB}tlU|U3>qN?yu$ucmpAq=e<$%d{SsgyOx?UoO6kMY4UY%2PX5gjNu=9s ztFnb$jdv?hiOCCh==OBvdM*TQoGacMuipZ8qOS8VRW*=LGA?CjFnAWIEEB(d0-1pt z5adbt^4cfSVb)abgJR>1G*)~r9%;e1(j6YfPxzP<^rLRqMlinG8D6RWyl%ODZ~zQ= z=NHXkD$9gY3T)}jWOzQCP}16-@4D`9*JJp$WjTO!QqrAD1%ID7p-j7bDzLKQn|2=OovtCis1K2EX~i z^b1A$Olslj>@oqd&U^AP`5sm#;Y>d5l$^i!IZV|$YZp}I$8rgc0gcJ*AIWS>@EGQ8 z_B|Ro%CXB^vJ>a1xR^eB#;*q~TDN1El)&rDRuFK_Yd)C0I6?nwhR%(-%IDI)LsB0C zYc~&vG6k+@%_(I^_Hlp)o?tQTDSCfa?1@gJJcTRT>LGH~Ov9HS6B3%L9 zf|sUG%+?Bp?6l=e&>L>_Q7{!J3mGaKc>1}II~mB|br+4mkMFLsthfd>g`Fu@obEk# zkln~eAb+Wt;AdZH^kziJthK3XcPu{5U5j)s9V6U2a>IEYBHDYMY!A)TEW6DCtwVM! zNcW(<-+gxOTBjeACWv$<p8VFFr^Y_Int$&9xjzE;N8tVl z+#iAaBXEBN?vKFz5x74B_ebFV2>f-7K-X6^-U{;6Vt!3st4sNPK;`H)LwqvTyBnXc zrpARCYqkL-Xid$M)-_F0V_CIY%$E4u^UR5pe31qs#LM2-OAngq0~g`5&IKs&5Am~z zQ>MDdaJi{&#aG1r0v<_G4*z|D)^~C<9ks7@J3)<|rwg1b+F($Q;;##O>hs{8Z#EOnhQ!B6F-W7XTxaX4oL^G>7&@ddx~; zdoE(VfH;tx)%g3&SxGnLeJgrycF1Z0xxv2X z7v*aLp>8Q0St7-Lf2f}3KzUK3SXJT|b?%&ZNA_FE4~iK$!Fr|Py_aY`DGEC7P-Y{c z8orKAEq>61njDZ8K2=n2k@m3Q88d_w)O--i5-z8fW<PO=S!kQY1nB9quAf*ky#XsfR`A)+&s^!K;NTg<`x>H+)Ry^9ewzi`Phag!| PG9J((<@x_#|NQ?4f#eN* delta 58197 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 diff --git a/assets/images/widgets/GridView.svg b/assets/images/widgets/GridView.svg index a79f4422..8140d70c 100644 --- a/assets/images/widgets/GridView.svg +++ b/assets/images/widgets/GridView.svg @@ -1,52 +1,22 @@ - - - - - - + + - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 3eb82971..413085ef 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -39,35 +39,43 @@ class _FlutterUnit3State extends State { _initWeb(); } + void _onLocaleChange(BuildContext context, AppConfig state){ + BlocProvider.of(context).changeLocale(state.language.locale); + } + @override Widget build(BuildContext context) { AppConfig state = context.watch().state; ThemeData dark = darkTheme(state); ThemeData light = lightTheme(state); - return DefaultTextStyle( - style: TextStyle(fontFamily: state.fontFamily), - child: TolyMessage( - themeMode: state.themeMode, - darkTheme: dark, - theme:light, - child: MaterialApp.router( - routerConfig: _router, - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - localizationsDelegates: const [ - AppL10n.delegate, - AppLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - FlutterQuillLocalizations.delegate, - ], - supportedLocales: l10nLocales, - locale: state.language.locale, + return BlocListener( + listenWhen: (p,n)=>p.language!=n.language, + listener: _onLocaleChange, + child: DefaultTextStyle( + style: TextStyle(fontFamily: state.fontFamily), + child: TolyMessage( themeMode: state.themeMode, darkTheme: dark, theme:light, + child: MaterialApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: const [ + AppL10n.delegate, + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, + ], + supportedLocales: l10nLocales, + locale: state.language.locale, + themeMode: state.themeMode, + darkTheme: dark, + theme:light, + ), ), ), ); diff --git a/lib/src/l10n/arb/app_de.arb b/lib/src/l10n/arb/app_de.arb new file mode 100644 index 00000000..de3fcfa0 --- /dev/null +++ b/lib/src/l10n/arb/app_de.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Widget-Sammlung", + "deskTabPainter": "Zeichnungssammlung", + "deskTabKnowledge": "Wissensdatenbank", + "deskTabTools": "Werkzeugkasten", + "deskTabMine": "App-Info", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Malen", + "mobileTabKnowledge": "Wissen", + "mobileTabTools": "Werkzeuge", + "mobileTabMine": "Mein" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_es.arb b/lib/src/l10n/arb/app_es.arb new file mode 100644 index 00000000..7cd0a401 --- /dev/null +++ b/lib/src/l10n/arb/app_es.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Colección de widgets", + "deskTabPainter": "Colección de dibujos", + "deskTabKnowledge": "Centro de conocimiento", + "deskTabTools": "Caja de herramientas", + "deskTabMine": "Info App", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dibujo", + "mobileTabKnowledge": "Conocimiento", + "mobileTabTools": "Herramientas", + "mobileTabMine": "Mi" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_fr.arb b/lib/src/l10n/arb/app_fr.arb new file mode 100644 index 00000000..33845557 --- /dev/null +++ b/lib/src/l10n/arb/app_fr.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Collection de widgets", + "deskTabPainter": "Collection de dessins", + "deskTabKnowledge": "Base de connaissances", + "deskTabTools": "Boîte à outils", + "deskTabMine": "Infos App", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dessin", + "mobileTabKnowledge": "Connaissances", + "mobileTabTools": "Outils", + "mobileTabMine": "Moi" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_it.arb b/lib/src/l10n/arb/app_it.arb new file mode 100644 index 00000000..5ed6083b --- /dev/null +++ b/lib/src/l10n/arb/app_it.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Raccolta widget", + "deskTabPainter": "Raccolta disegni", + "deskTabKnowledge": "Hub conoscitivo", + "deskTabTools": "Cassetta degli attrezzi", + "deskTabMine": "Info App", + "mobileTabWidgets": "Widget", + "mobileTabPainter": "Disegno", + "mobileTabKnowledge": "Conoscenza", + "mobileTabTools": "Strumenti", + "mobileTabMine": "Io" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ja.arb b/lib/src/l10n/arb/app_ja.arb new file mode 100644 index 00000000..1fe1cbeb --- /dev/null +++ b/lib/src/l10n/arb/app_ja.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "ウィジェット集", + "deskTabPainter": "描画集", + "deskTabKnowledge": "ナレッジハブ", + "deskTabTools": "ツールボックス", + "deskTabMine": "アプリ情報", + "mobileTabWidgets": "ウィジェット", + "mobileTabPainter": "描画", + "mobileTabKnowledge": "知識", + "mobileTabTools": "ツール", + "mobileTabMine": "マイ" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ko.arb b/lib/src/l10n/arb/app_ko.arb new file mode 100644 index 00000000..889be2b0 --- /dev/null +++ b/lib/src/l10n/arb/app_ko.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "위젯 모음집", + "deskTabPainter": "그림 모음집", + "deskTabKnowledge": "지식 허브", + "deskTabTools": "도구 상자", + "deskTabMine": "앱 정보", + "mobileTabWidgets": "위젯", + "mobileTabPainter": "그리기", + "mobileTabKnowledge": "지식", + "mobileTabTools": "도구", + "mobileTabMine": "내 정보" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_pt.arb b/lib/src/l10n/arb/app_pt.arb new file mode 100644 index 00000000..a3f82ab1 --- /dev/null +++ b/lib/src/l10n/arb/app_pt.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Coleção de widgets", + "deskTabPainter": "Coleção de desenhos", + "deskTabKnowledge": "Hub de conhecimento", + "deskTabTools": "Caixa de ferramentas", + "deskTabMine": "Info App", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Desenho", + "mobileTabKnowledge": "Conhecimento", + "mobileTabTools": "Ferramentas", + "mobileTabMine": "Meu" + } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ru.arb b/lib/src/l10n/arb/app_ru.arb new file mode 100644 index 00000000..37f546e4 --- /dev/null +++ b/lib/src/l10n/arb/app_ru.arb @@ -0,0 +1,12 @@ +{ + "deskTabWidgets": "Коллекция виджетов", + "deskTabPainter": "Коллекция рисунков", + "deskTabKnowledge": "База знаний", + "deskTabTools": "Инструменты", + "deskTabMine": "Информация", + "mobileTabWidgets": "Виджеты", + "mobileTabPainter": "Рисование", + "mobileTabKnowledge": "Знания", + "mobileTabTools": "Инструменты", + "mobileTabMine": "Мои" + } \ No newline at end of file diff --git a/lib/src/l10n/gen/app_l10n.dart b/lib/src/l10n/gen/app_l10n.dart index b77aeb31..d15c0eef 100644 --- a/lib/src/l10n/gen/app_l10n.dart +++ b/lib/src/l10n/gen/app_l10n.dart @@ -5,7 +5,15 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; +import 'app_l10n_de.dart'; import 'app_l10n_en.dart'; +import 'app_l10n_es.dart'; +import 'app_l10n_fr.dart'; +import 'app_l10n_it.dart'; +import 'app_l10n_ja.dart'; +import 'app_l10n_ko.dart'; +import 'app_l10n_pt.dart'; +import 'app_l10n_ru.dart'; import 'app_l10n_zh.dart'; // ignore_for_file: type=lint @@ -91,7 +99,15 @@ abstract class AppL10n { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ + Locale('de'), Locale('en'), + Locale('es'), + Locale('fr'), + Locale('it'), + Locale('ja'), + Locale('ko'), + Locale('pt'), + Locale('ru'), Locale('zh') ]; @@ -165,7 +181,7 @@ class _AppL10nDelegate extends LocalizationsDelegate { } @override - bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['de', 'en', 'es', 'fr', 'it', 'ja', 'ko', 'pt', 'ru', 'zh'].contains(locale.languageCode); @override bool shouldReload(_AppL10nDelegate old) => false; @@ -176,7 +192,15 @@ AppL10n lookupAppL10n(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { + case 'de': return AppL10nDe(); case 'en': return AppL10nEn(); + case 'es': return AppL10nEs(); + case 'fr': return AppL10nFr(); + case 'it': return AppL10nIt(); + case 'ja': return AppL10nJa(); + case 'ko': return AppL10nKo(); + case 'pt': return AppL10nPt(); + case 'ru': return AppL10nRu(); case 'zh': return AppL10nZh(); } diff --git a/lib/src/l10n/gen/app_l10n_de.dart b/lib/src/l10n/gen/app_l10n_de.dart new file mode 100644 index 00000000..bff5eca8 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_de.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for German (`de`). +class AppL10nDe extends AppL10n { + AppL10nDe([String locale = 'de']) : super(locale); + + @override + String get deskTabWidgets => 'Widget-Sammlung'; + + @override + String get deskTabPainter => 'Zeichnungssammlung'; + + @override + String get deskTabKnowledge => 'Wissensdatenbank'; + + @override + String get deskTabTools => 'Werkzeugkasten'; + + @override + String get deskTabMine => 'App-Info'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Malen'; + + @override + String get mobileTabKnowledge => 'Wissen'; + + @override + String get mobileTabTools => 'Werkzeuge'; + + @override + String get mobileTabMine => 'Mein'; +} diff --git a/lib/src/l10n/gen/app_l10n_es.dart b/lib/src/l10n/gen/app_l10n_es.dart new file mode 100644 index 00000000..f38a4c82 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_es.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class AppL10nEs extends AppL10n { + AppL10nEs([String locale = 'es']) : super(locale); + + @override + String get deskTabWidgets => 'Colección de widgets'; + + @override + String get deskTabPainter => 'Colección de dibujos'; + + @override + String get deskTabKnowledge => 'Centro de conocimiento'; + + @override + String get deskTabTools => 'Caja de herramientas'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Dibujo'; + + @override + String get mobileTabKnowledge => 'Conocimiento'; + + @override + String get mobileTabTools => 'Herramientas'; + + @override + String get mobileTabMine => 'Mi'; +} diff --git a/lib/src/l10n/gen/app_l10n_fr.dart b/lib/src/l10n/gen/app_l10n_fr.dart new file mode 100644 index 00000000..647d5c3d --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_fr.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class AppL10nFr extends AppL10n { + AppL10nFr([String locale = 'fr']) : super(locale); + + @override + String get deskTabWidgets => 'Collection de widgets'; + + @override + String get deskTabPainter => 'Collection de dessins'; + + @override + String get deskTabKnowledge => 'Base de connaissances'; + + @override + String get deskTabTools => 'Boîte à outils'; + + @override + String get deskTabMine => 'Infos App'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Dessin'; + + @override + String get mobileTabKnowledge => 'Connaissances'; + + @override + String get mobileTabTools => 'Outils'; + + @override + String get mobileTabMine => 'Moi'; +} diff --git a/lib/src/l10n/gen/app_l10n_it.dart b/lib/src/l10n/gen/app_l10n_it.dart new file mode 100644 index 00000000..44bfe331 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_it.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Italian (`it`). +class AppL10nIt extends AppL10n { + AppL10nIt([String locale = 'it']) : super(locale); + + @override + String get deskTabWidgets => 'Raccolta widget'; + + @override + String get deskTabPainter => 'Raccolta disegni'; + + @override + String get deskTabKnowledge => 'Hub conoscitivo'; + + @override + String get deskTabTools => 'Cassetta degli attrezzi'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get mobileTabWidgets => 'Widget'; + + @override + String get mobileTabPainter => 'Disegno'; + + @override + String get mobileTabKnowledge => 'Conoscenza'; + + @override + String get mobileTabTools => 'Strumenti'; + + @override + String get mobileTabMine => 'Io'; +} diff --git a/lib/src/l10n/gen/app_l10n_ja.dart b/lib/src/l10n/gen/app_l10n_ja.dart new file mode 100644 index 00000000..d862a666 --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ja.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppL10nJa extends AppL10n { + AppL10nJa([String locale = 'ja']) : super(locale); + + @override + String get deskTabWidgets => 'ウィジェット集'; + + @override + String get deskTabPainter => '描画集'; + + @override + String get deskTabKnowledge => 'ナレッジハブ'; + + @override + String get deskTabTools => 'ツールボックス'; + + @override + String get deskTabMine => 'アプリ情報'; + + @override + String get mobileTabWidgets => 'ウィジェット'; + + @override + String get mobileTabPainter => '描画'; + + @override + String get mobileTabKnowledge => '知識'; + + @override + String get mobileTabTools => 'ツール'; + + @override + String get mobileTabMine => 'マイ'; +} diff --git a/lib/src/l10n/gen/app_l10n_ko.dart b/lib/src/l10n/gen/app_l10n_ko.dart new file mode 100644 index 00000000..a6052d5b --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ko.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppL10nKo extends AppL10n { + AppL10nKo([String locale = 'ko']) : super(locale); + + @override + String get deskTabWidgets => '위젯 모음집'; + + @override + String get deskTabPainter => '그림 모음집'; + + @override + String get deskTabKnowledge => '지식 허브'; + + @override + String get deskTabTools => '도구 상자'; + + @override + String get deskTabMine => '앱 정보'; + + @override + String get mobileTabWidgets => '위젯'; + + @override + String get mobileTabPainter => '그리기'; + + @override + String get mobileTabKnowledge => '지식'; + + @override + String get mobileTabTools => '도구'; + + @override + String get mobileTabMine => '내 정보'; +} diff --git a/lib/src/l10n/gen/app_l10n_pt.dart b/lib/src/l10n/gen/app_l10n_pt.dart new file mode 100644 index 00000000..33c7876e --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_pt.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Portuguese (`pt`). +class AppL10nPt extends AppL10n { + AppL10nPt([String locale = 'pt']) : super(locale); + + @override + String get deskTabWidgets => 'Coleção de widgets'; + + @override + String get deskTabPainter => 'Coleção de desenhos'; + + @override + String get deskTabKnowledge => 'Hub de conhecimento'; + + @override + String get deskTabTools => 'Caixa de ferramentas'; + + @override + String get deskTabMine => 'Info App'; + + @override + String get mobileTabWidgets => 'Widgets'; + + @override + String get mobileTabPainter => 'Desenho'; + + @override + String get mobileTabKnowledge => 'Conhecimento'; + + @override + String get mobileTabTools => 'Ferramentas'; + + @override + String get mobileTabMine => 'Meu'; +} diff --git a/lib/src/l10n/gen/app_l10n_ru.dart b/lib/src/l10n/gen/app_l10n_ru.dart new file mode 100644 index 00000000..eace25ce --- /dev/null +++ b/lib/src/l10n/gen/app_l10n_ru.dart @@ -0,0 +1,38 @@ +import 'app_l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppL10nRu extends AppL10n { + AppL10nRu([String locale = 'ru']) : super(locale); + + @override + String get deskTabWidgets => 'Коллекция виджетов'; + + @override + String get deskTabPainter => 'Коллекция рисунков'; + + @override + String get deskTabKnowledge => 'База знаний'; + + @override + String get deskTabTools => 'Инструменты'; + + @override + String get deskTabMine => 'Информация'; + + @override + String get mobileTabWidgets => 'Виджеты'; + + @override + String get mobileTabPainter => 'Рисование'; + + @override + String get mobileTabKnowledge => 'Знания'; + + @override + String get mobileTabTools => 'Инструменты'; + + @override + String get mobileTabMine => 'Мои'; +} diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart index a7273250..97610f47 100644 --- a/lib/src/navigation/model/app_tab.dart +++ b/lib/src/navigation/model/app_tab.dart @@ -33,7 +33,7 @@ enum AppTab { AppTab.knowledge => l10n.deskTabKnowledge, AppTab.tools => l10n.deskTabTools, AppTab.mine => l10n.deskTabMine, - AppTab.note => '匠心巧记', + AppTab.note => '留言板', }; } return switch (this) { diff --git a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart index c812a82c..29a55ee6 100644 --- a/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart +++ b/lib/src/navigation/view/desktop/flutter_unit_desk_navigation.dart @@ -41,7 +41,7 @@ class _DeskNavigationRailState extends State { Widget build(BuildContext context) { return TolyRailMenuBar( cellBuilder: FlutterUnitMenuCell.create, - width: 130, + width: 140, gap: 8, padding: EdgeInsets.zero, backgroundColor: const Color(0xff2C3036), diff --git a/lib/src/navigation/view/desktop/locale_change_menu.dart b/lib/src/navigation/view/desktop/locale_change_menu.dart new file mode 100644 index 00000000..4d944715 --- /dev/null +++ b/lib/src/navigation/view/desktop/locale_change_menu.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:l10n/l10n.dart'; +import 'package:tolyui/tolyui.dart'; +import 'package:app/app.dart'; + +class LocaleChangeMenu extends StatefulWidget { + const LocaleChangeMenu({super.key}); + + @override + State createState() => _LocaleChangeMenuState(); +} + +const List kWeekZH = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日']; +const List kWeekEN = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; + +const Map > kWeekMap = { + 0:kWeekZH, + 1:kWeekEN, +}; + +class _LocaleChangeMenuState extends State { + int _activeLocal = 0; + List local = ['中文简体','English']; + int _activeDay = 0; + + @override + Widget build(BuildContext context) { + List labels = Language.values.map((e)=>e.label).toList(); + + DropMenuCellStyle lightStyle = const DropMenuCellStyle( + padding: EdgeInsets.symmetric(horizontal: 4,vertical: 0), + borderRadius: BorderRadius.all(Radius.circular(6)), + foregroundColor: Color(0xff1f1f1f), + backgroundColor: Colors.transparent, + disableColor: Color(0xffbfbfbf), + hoverBackgroundColor: Color(0xfff5f5f5), + hoverForegroundColor: Color(0xff1f1f1f), + textStyle: TextStyle(fontFamily: '微软雅黑') + ); + + return + IconTheme( + data: IconThemeData(color: Colors.white), + child: DefaultTextStyle( + style: TextStyle(color: Colors.white), + child: TolySelect( + fontSize: 14, + cellStyle: lightStyle, + data: labels, + selectIndex: _activeDay, + iconSize: 16, + height: 30, + width: 110, + minWidth: 100, + maxHeight: 200, + padding: EdgeInsets.symmetric(horizontal: 8), + onSelected: (int index) async { + Language type = Language.values[index]; + context.read().switchLanguage(type); + setState(() { + _activeDay = index; + }); + }, + + ), + ), + ); + } +} + diff --git a/lib/src/navigation/view/desktop/menu_bar_tail.dart b/lib/src/navigation/view/desktop/menu_bar_tail.dart index ca5c5b7b..f5b0c847 100644 --- a/lib/src/navigation/view/desktop/menu_bar_tail.dart +++ b/lib/src/navigation/view/desktop/menu_bar_tail.dart @@ -14,6 +14,7 @@ import 'package:go_router/go_router.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:tolyui/basic/basic.dart'; +import 'locale_change_menu.dart'; import 'theme_model_switch_icon.dart'; import 'package:app_update/app_update.dart'; @@ -33,6 +34,8 @@ class MenuBarTail extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ + LocaleChangeMenu(), + const SizedBox(height: 10,), const Divider(indent: 20, color: Colors.white, height: 1), Padding( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), diff --git a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart index 826b9fc0..1e18cdbc 100644 --- a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart +++ b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart @@ -19,7 +19,8 @@ class FlutterUnitMenuCell extends StatelessWidget { const FlutterUnitMenuCell.create(this.menu, this.display, {super.key}); - Color? get foregroundColor => display.selected ? Colors.white : Colors.white70; + Color? get foregroundColor => + display.selected ? Colors.white : Colors.white70; @override Widget build(BuildContext context) { @@ -41,16 +42,23 @@ class FlutterUnitMenuCell extends StatelessWidget { return Align( alignment: Alignment.centerLeft, child: Container( - alignment: Alignment.center, + padding: EdgeInsets.only(left: 12), + alignment: Alignment.centerLeft, decoration: BoxDecoration(color: color, borderRadius: br), - width: _widthTween.transform(anim) * 130, + width: _widthTween.transform(anim) * 140, height: height, - child: Wrap( + child: Row( spacing: 6, - crossAxisAlignment: WrapCrossAlignment.center, + // crossAxisAlignment: WrapCrossAlignment.center, children: [ Icon(menu.icon, color: foregroundColor, size: iconSize), - Text(menu.label, style: style), + Expanded( + child: Text( + menu.label, + style: style, + maxLines: 1, + overflow: TextOverflow.ellipsis, + )), ], ), ), diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 175ef155..9c7519c1 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -50,25 +50,26 @@ class _UnitPhoneNavigationState extends State { super.dispose(); } + /// extendBody = true 凹嵌透明,需要处理底部 边距 @override Widget build(BuildContext context) { - return Scaffold( - extendBody: true, - endDrawer: const HomeRightDrawer(), - body: PageView( - physics: _neverScroll, - controller: _controller, - children: [ - StandardHomePage(), - GalleryUnit(), - AlgoScope(child: ArtifactPage()), - ArtSysScope(child: MobileArticlePage()), - // MobileToolPage(), - UserPage(), - ], - ), - bottomNavigationBar: _buildBottomNav(context), + return Scaffold( + extendBody: true, + endDrawer: const HomeRightDrawer(), + body: PageView( + physics: _neverScroll, + controller: _controller, + children: [ + StandardHomePage(), + GalleryUnit(), + AlgoScope(child: ArtifactPage()), + ArtSysScope(child: MobileArticlePage()), + // MobileToolPage(), + UserPage(), + ], + ), + bottomNavigationBar: _buildBottomNav(context), ); } diff --git a/modules/basic_system/l10n/lib/enum/language.dart b/modules/basic_system/l10n/lib/enum/language.dart index e3a6287b..47dfbe81 100644 --- a/modules/basic_system/l10n/lib/enum/language.dart +++ b/modules/basic_system/l10n/lib/enum/language.dart @@ -2,7 +2,16 @@ import 'dart:ui'; enum Language { zh_CN(locale: Locale('zh','CN'), label: '简体中文'), - en_US(locale: Locale('en','US'), label: 'English'); + en_US(locale: Locale('en','US'), label: 'English'), + ru_RU(locale: Locale('ru','RU'), label: 'Русский'), + fr_FR(locale: Locale('fr','FR'), label: 'Français'), + ko_KR(locale: Locale('ko','KR'), label: '한국어'), + de_DE(locale: Locale('de','DE'), label: 'Deutsch'), + ja_JP(locale: Locale('ja','JP'), label: '日本語'), + it_IT(locale: Locale('it','IT'), label: 'Italiano'), + pt_PT(locale: Locale('pt','PT'), label: 'Português'), + es_ES(locale: Locale('es','ES'), label: 'Español'), + ; final Locale locale; final String label; diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index cf0cf99e..3249dd4b 100644 --- a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_repository/widget_repository.dart'; @@ -22,9 +24,9 @@ class WidgetDetailBloc extends Cubit { WidgetModel get currentWidget => _modelStack.last; - void push(WidgetModel model) { + void push(WidgetModel model,{String? locale}) { _modelStack.add(model); - queryDetail(model); + queryDetail(model,locale: locale); } Future pop() async { @@ -40,10 +42,10 @@ class WidgetDetailBloc extends Cubit { } } - void queryDetail(WidgetModel widget) async { + void queryDetail(WidgetModel widget,{String? locale}) async { emit(DetailLoading()); try { - final List nodes = await nodeRepo.loadNode(widget.id); + final List nodes = await nodeRepo.loadNode(widget.id,locale: locale); final List links = await widgetRepo.loadWidget(widget.links); if (nodes.isEmpty) { emit(DetailEmpty()); @@ -55,4 +57,9 @@ class WidgetDetailBloc extends Cubit { emit(DetailFailed()); } } + + void changeLocale(Locale locale) { + String localeStr = '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + queryDetail(currentWidget,locale:localeStr); + } } diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 34808eb5..0e1b233e 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:ui'; import 'package:app/app.dart'; import 'package:equatable/equatable.dart'; @@ -27,7 +28,7 @@ class WidgetsBloc extends Bloc { void _onEventTabTap(EventTabTap event, Emitter emit) async { emit(const WidgetsLoading(operate: LoadOperate.load)); int size = kIsDesk ? 1000 : 20; - WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size); + WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size,locale: event.locale); try { final List widgets = await repository.searchWidgets(filter); emit(WidgetsLoaded( @@ -126,4 +127,11 @@ class WidgetsBloc extends Bloc { )); } } + + void changeLocale(Locale locale) { + add(EventTabTap( + state.filter.family??WidgetFamily.statelessWidget, + locale: '${locale.languageCode}-${locale.countryCode}'.toLowerCase() + )); + } } diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart index 99a0e601..7dcdacbd 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_event.dart @@ -12,8 +12,9 @@ abstract class WidgetsEvent extends Equatable { class EventTabTap extends WidgetsEvent { final WidgetFamily family; + final String? locale; - const EventTabTap(this.family); + const EventTabTap(this.family,{this.locale}); @override List get props => [family]; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index a99115a4..a9fed0ea 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -55,12 +55,17 @@ class _DeskWidgetDetailPageScopeState extends State { Widget build(BuildContext context) { if (_model == null) return const Center(child: CupertinoActivityIndicator()); + Locale locale = context.read().state.language.locale; + // Locale locale = Localizations.localeOf(context); + // String? countryCode = locale.countryCode; + // if (countryCode == null) {} + String localeStr = '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); return BlocProvider( create: (_) => WidgetDetailBloc( widgetRepo: widgetRepository, nodeRepo: nodeRepository, - )..push(_model!), + )..push(_model!, locale: localeStr), child: DeskWidgetDetailPage( model: widget.model, ), @@ -78,12 +83,19 @@ class DeskWidgetDetailPage extends StatelessWidget { WidgetDetailBloc bloc = context.watch(); DetailState state = context.watch().state; WidgetModel widget = bloc.currentWidget; - return Scaffold( - backgroundColor: Theme.of(context).appBarTheme.backgroundColor, - endDrawer: CategoryEndDrawer(widget: widget), - body: Builder(builder: (ctx) { - return _buildContent(ctx, bloc, state); - }), + return BlocListener( + listenWhen: (p, n) => p.language != n.language, + listener: (_, state) { + BlocProvider.of(context) + .changeLocale(state.language.locale); + }, + child: Scaffold( + backgroundColor: Theme.of(context).appBarTheme.backgroundColor, + endDrawer: CategoryEndDrawer(widget: widget), + body: Builder(builder: (ctx) { + return _buildContent(ctx, bloc, state); + }), + ), ); } @@ -147,5 +159,4 @@ class DeskWidgetDetailPage extends StatelessWidget { } return detailBloc.pop(); } - } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 12dce678..1255f86c 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -127,7 +127,7 @@ class DeskWidgetItem extends StatelessWidget { model.info, maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 14, color: textColor), + style: TextStyle(fontSize: 13, color: textColor), ), ); } @@ -141,11 +141,14 @@ class DeskWidgetItem extends StatelessWidget { margin: const EdgeInsets.only(right: 6), decoration: const BoxDecoration(color: Color(0xff86909c), shape: BoxShape.circle), ), - Text( - model.nameCN, - style: const TextStyle(fontSize: 12, height: 1, color: Color(0xff86909c)), + Expanded( + child: Text( + model.nameCN, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 12, height: 1, color: Color(0xff86909c)), + ), ), - const Spacer(), Wrapper.just( radius: 4, color: isDark ? Color(0xff292A2D) : const Color(0xffF3F3F5), diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart index 4a23d5fe..bfabb06a 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -27,11 +27,21 @@ class NodeDao with HasDatabase, DbTable { database.rawQuery("SELECT * FROM node"); //根据 id 查询组件 node - Future>> queryById(int id) async { - return await database.rawQuery( - "SELECT name,subtitle,code,priority " - "FROM node " - "WHERE widgetId = ? ORDER BY priority", - [id]); + Future>> queryById(int id, {String? locale}) async { + String sql = """ +SELECT + node.priority, + node.code, + node_desc.name, + node_desc.subtitle +FROM node +INNER JOIN node_desc + ON node.id = node_desc.node_id +WHERE node_desc.locale = ? +AND node.widgetId = ? +ORDER BY priority +"""; + + return await database.rawQuery(sql, [locale ?? 'pt-pt', id]); } } diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart index 7a585b02..2df6bb8a 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -10,8 +10,7 @@ class WidgetDao with HasDatabase, DbTable { String get name => 'widget'; Future insert(WidgetPo widget) async { - String addSql = - "INSERT INTO " + String addSql = "INSERT INTO " "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " "VALUES (?,?,?,?,?,?,?,?);"; return database.transaction((tran) async => await tran.rawInsert(addSql, [ @@ -30,7 +29,10 @@ class WidgetDao with HasDatabase, DbTable { return database.rawQuery("SELECT * FROM widget"); } - Future>> queryByFamily(WidgetFamily family) async { + Future>> queryByFamily( + WidgetFamily family, { + String locale = 'zh-cn', + }) async { return database.rawQuery( "SELECT * " "FROM widget WHERE family = ? ORDER BY lever DESC", @@ -63,10 +65,31 @@ class WidgetDao with HasDatabase, DbTable { if (arguments.stars.reduce((a, b) => a + b) == -5) { starArg = [1, 2, 3, 4, 5]; } - return database.rawQuery( - "SELECT * " - "FROM widget WHERE (name LIKE ? OR info LIKE ? OR nameCN LIKE ?) $familySql AND lever IN(?,?,?,?,?) ORDER BY lever DESC LIMIT ? OFFSET ?", + + String searchSql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE +widget_desc.locale = ? +AND (widget.name LIKE ? OR widget_desc.info LIKE ? OR widget_desc.name LIKE ?) +$familySql +AND lever IN(?,?,?,?,?) +ORDER BY lever DESC LIMIT ? OFFSET ? +; + """; + + return database.rawQuery(searchSql, [ + arguments.locale?? 'zh-cn', "%$name%", "%$name%", "%$name%", diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart index 7eb091b6..743fb4ca 100644 --- a/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/node_db_repository.dart @@ -9,8 +9,8 @@ class NodeDbRepository implements NodeRepository{ NodeDao get nodeDao => AppStorage().flutter(); @override - Future> loadNode(int widgetId) async{ - List> data = await nodeDao.queryById(widgetId); + Future> loadNode(int widgetId,{String? locale}) async{ + List> data = await nodeDao.queryById(widgetId,locale: locale); List nodes = data.map((e) => NodeModel.fromJson(e)).toList(); return nodes; } diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart index f38b22db..def1f4ea 100644 --- a/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart @@ -18,6 +18,7 @@ class WidgetDbRepository implements WidgetRepository { @override Future> loadLikeWidgets() async { + return []; List likeIds = await likeDao.likeWidgetIds(); List> data = await widgetDao.queryByIds(likeIds); List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); @@ -33,9 +34,9 @@ class WidgetDbRepository implements WidgetRepository { @override Future> loadWidget(List id) async { - List> data = await widgetDao.queryByIds(id); - List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); + // List> data = await widgetDao.queryByIds(id); + // List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); + // if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); return []; } diff --git a/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart index d1889760..02f24ba9 100644 --- a/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_node_repository.dart @@ -24,7 +24,7 @@ class MemoryNodeRepository implements NodeRepository { } @override - Future> loadNode(int widgetId) async { + Future> loadNode(int widgetId,{String? locale}) async { await initData(); return _nodeCache! .where((element) => element.widgetId == widgetId) diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart index 999e0b66..a4a6469e 100644 --- a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart +++ b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart @@ -11,6 +11,7 @@ enum WidgetFamily { class WidgetFilter { final String name; + final String? locale; final WidgetFamily? family; final List stars; final int page; @@ -18,6 +19,7 @@ class WidgetFilter { const WidgetFilter({ this.name = '', + this.locale = 'zh-cn', this.family, this.stars = const [-1, -1, -1, -1, -1], this.page = 1, @@ -30,6 +32,7 @@ class WidgetFilter { this.family, { this.name = '*', this.page = 1, + this.locale = 'zh-cn', this.pageSize = 20, this.stars = const [1, 2, 3, 4, 5], }); @@ -39,12 +42,14 @@ class WidgetFilter { WidgetFamily? family, List? stars, int? page, + String? locale, }) { return WidgetFilter( name: name ?? this.name, family: family ?? this.family, stars: stars ?? this.stars, page: page ?? this.page, + locale: locale ?? this.locale, ); } diff --git a/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart index 7cd03f63..fe3ff0d0 100644 --- a/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/node_repository.dart @@ -3,7 +3,7 @@ import '../model/model.dart'; abstract class NodeRepository{ - Future> loadNode(int widgetId); + Future> loadNode(int widgetId,{String? locale}); } From f7e85cd0487318b588da706dd5e2b9053ae280dd Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 14 Feb 2025 09:49:50 +0800 Subject: [PATCH 133/149] feature json parser --- assets/images/widgets/Autocomplete.svg | 30 ++ lib/src/l10n/arb/app_de.arb | 1 + lib/src/l10n/arb/app_en.arb | 2 +- lib/src/l10n/arb/app_es.arb | 1 + lib/src/l10n/arb/app_fr.arb | 1 + lib/src/l10n/arb/app_it.arb | 1 + lib/src/l10n/arb/app_ja.arb | 1 + lib/src/l10n/arb/app_ko.arb | 1 + lib/src/l10n/arb/app_pt.arb | 1 + lib/src/l10n/arb/app_ru.arb | 1 + lib/src/l10n/arb/app_zh.arb | 1 + lib/src/l10n/gen/app_l10n.dart | 6 + lib/src/l10n/gen/app_l10n_de.dart | 3 + lib/src/l10n/gen/app_l10n_en.dart | 3 + lib/src/l10n/gen/app_l10n_es.dart | 3 + lib/src/l10n/gen/app_l10n_fr.dart | 3 + lib/src/l10n/gen/app_l10n_it.dart | 3 + lib/src/l10n/gen/app_l10n_ja.dart | 3 + lib/src/l10n/gen/app_l10n_ko.dart | 3 + lib/src/l10n/gen/app_l10n_pt.dart | 3 + lib/src/l10n/gen/app_l10n_ru.dart | 3 + lib/src/l10n/gen/app_l10n_zh.dart | 3 + lib/src/navigation/model/app_tab.dart | 4 +- .../view/desktop/locale_change_menu.dart | 77 ++-- .../view/desktop/menu_bar_tail.dart | 6 +- .../view/desktop/toly_unit_menu_cell.dart | 54 ++- .../flutter_unit/flutter_unit_db_store.dart | 2 - .../treasure_tools/lib/src/code_gen_page.dart | 7 +- .../lib/src/desk_widget_top_bar.dart | 3 +- .../src/view/json_display/json_display.dart | 362 ++++++++++++++++++ .../widget_detail_bloc.dart | 23 +- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 2 +- .../lib/blocs/widgets_bloc/widgets_state.dart | 22 +- .../widget_panel/desk_widget_model_item.dart | 25 +- .../lib/src/database/dao/widget_dao.dart | 28 +- .../db_impl/widget_db_repository.dart | 12 +- .../src/memory/memory_widget_repository.dart | 2 +- .../lib/src/repository/widget_repository.dart | 2 +- 38 files changed, 588 insertions(+), 120 deletions(-) create mode 100644 assets/images/widgets/Autocomplete.svg create mode 100644 modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart diff --git a/assets/images/widgets/Autocomplete.svg b/assets/images/widgets/Autocomplete.svg new file mode 100644 index 00000000..653b4f5a --- /dev/null +++ b/assets/images/widgets/Autocomplete.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/src/l10n/arb/app_de.arb b/lib/src/l10n/arb/app_de.arb index de3fcfa0..1fcfc219 100644 --- a/lib/src/l10n/arb/app_de.arb +++ b/lib/src/l10n/arb/app_de.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "Wissensdatenbank", "deskTabTools": "Werkzeugkasten", "deskTabMine": "App-Info", + "messageBoard": "Pinnwand", "mobileTabWidgets": "Widgets", "mobileTabPainter": "Malen", "mobileTabKnowledge": "Wissen", diff --git a/lib/src/l10n/arb/app_en.arb b/lib/src/l10n/arb/app_en.arb index 5e07a771..e9137e99 100644 --- a/lib/src/l10n/arb/app_en.arb +++ b/lib/src/l10n/arb/app_en.arb @@ -4,7 +4,7 @@ "deskTabKnowledge": "Knowledge", "deskTabTools": "Treasure", "deskTabMine": "About", - + "messageBoard": "Message Board", "mobileTabWidgets": "Widgets", "mobileTabPainter": "Painter", "mobileTabKnowledge": "Knowledge", diff --git a/lib/src/l10n/arb/app_es.arb b/lib/src/l10n/arb/app_es.arb index 7cd0a401..94785206 100644 --- a/lib/src/l10n/arb/app_es.arb +++ b/lib/src/l10n/arb/app_es.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "Centro de conocimiento", "deskTabTools": "Caja de herramientas", "deskTabMine": "Info App", + "messageBoard": "Tablero de Mensajes", "mobileTabWidgets": "Widgets", "mobileTabPainter": "Dibujo", "mobileTabKnowledge": "Conocimiento", diff --git a/lib/src/l10n/arb/app_fr.arb b/lib/src/l10n/arb/app_fr.arb index 33845557..d63ea4df 100644 --- a/lib/src/l10n/arb/app_fr.arb +++ b/lib/src/l10n/arb/app_fr.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "Base de connaissances", "deskTabTools": "Boîte à outils", "deskTabMine": "Infos App", + "messageBoard": "Tableau de messages", "mobileTabWidgets": "Widgets", "mobileTabPainter": "Dessin", "mobileTabKnowledge": "Connaissances", diff --git a/lib/src/l10n/arb/app_it.arb b/lib/src/l10n/arb/app_it.arb index 5ed6083b..c2b555db 100644 --- a/lib/src/l10n/arb/app_it.arb +++ b/lib/src/l10n/arb/app_it.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "Hub conoscitivo", "deskTabTools": "Cassetta degli attrezzi", "deskTabMine": "Info App", + "messageBoard": "Bacheca", "mobileTabWidgets": "Widget", "mobileTabPainter": "Disegno", "mobileTabKnowledge": "Conoscenza", diff --git a/lib/src/l10n/arb/app_ja.arb b/lib/src/l10n/arb/app_ja.arb index 1fe1cbeb..0fd96aab 100644 --- a/lib/src/l10n/arb/app_ja.arb +++ b/lib/src/l10n/arb/app_ja.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "ナレッジハブ", "deskTabTools": "ツールボックス", "deskTabMine": "アプリ情報", + "messageBoard": "掲示板", "mobileTabWidgets": "ウィジェット", "mobileTabPainter": "描画", "mobileTabKnowledge": "知識", diff --git a/lib/src/l10n/arb/app_ko.arb b/lib/src/l10n/arb/app_ko.arb index 889be2b0..23a8c292 100644 --- a/lib/src/l10n/arb/app_ko.arb +++ b/lib/src/l10n/arb/app_ko.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "지식 허브", "deskTabTools": "도구 상자", "deskTabMine": "앱 정보", + "messageBoard": "게시판", "mobileTabWidgets": "위젯", "mobileTabPainter": "그리기", "mobileTabKnowledge": "지식", diff --git a/lib/src/l10n/arb/app_pt.arb b/lib/src/l10n/arb/app_pt.arb index a3f82ab1..300c0150 100644 --- a/lib/src/l10n/arb/app_pt.arb +++ b/lib/src/l10n/arb/app_pt.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "Hub de conhecimento", "deskTabTools": "Caixa de ferramentas", "deskTabMine": "Info App", + "messageBoard": "Quadro de Mensagens", "mobileTabWidgets": "Widgets", "mobileTabPainter": "Desenho", "mobileTabKnowledge": "Conhecimento", diff --git a/lib/src/l10n/arb/app_ru.arb b/lib/src/l10n/arb/app_ru.arb index 37f546e4..930cfafa 100644 --- a/lib/src/l10n/arb/app_ru.arb +++ b/lib/src/l10n/arb/app_ru.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "База знаний", "deskTabTools": "Инструменты", "deskTabMine": "Информация", + "messageBoard": "Доска сообщений", "mobileTabWidgets": "Виджеты", "mobileTabPainter": "Рисование", "mobileTabKnowledge": "Знания", diff --git a/lib/src/l10n/arb/app_zh.arb b/lib/src/l10n/arb/app_zh.arb index faf93717..72c253cc 100644 --- a/lib/src/l10n/arb/app_zh.arb +++ b/lib/src/l10n/arb/app_zh.arb @@ -4,6 +4,7 @@ "deskTabKnowledge": "知识集锦", "deskTabTools": "工具宝箱", "deskTabMine": "应用信息", + "messageBoard": "留言板", "mobileTabWidgets": "组件", "mobileTabPainter": "绘制", diff --git a/lib/src/l10n/gen/app_l10n.dart b/lib/src/l10n/gen/app_l10n.dart index d15c0eef..b0e40388 100644 --- a/lib/src/l10n/gen/app_l10n.dart +++ b/lib/src/l10n/gen/app_l10n.dart @@ -141,6 +141,12 @@ abstract class AppL10n { /// **'应用信息'** String get deskTabMine; + /// No description provided for @messageBoard. + /// + /// In zh, this message translates to: + /// **'留言板'** + String get messageBoard; + /// No description provided for @mobileTabWidgets. /// /// In zh, this message translates to: diff --git a/lib/src/l10n/gen/app_l10n_de.dart b/lib/src/l10n/gen/app_l10n_de.dart index bff5eca8..3580b245 100644 --- a/lib/src/l10n/gen/app_l10n_de.dart +++ b/lib/src/l10n/gen/app_l10n_de.dart @@ -21,6 +21,9 @@ class AppL10nDe extends AppL10n { @override String get deskTabMine => 'App-Info'; + @override + String get messageBoard => 'Pinnwand'; + @override String get mobileTabWidgets => 'Widgets'; diff --git a/lib/src/l10n/gen/app_l10n_en.dart b/lib/src/l10n/gen/app_l10n_en.dart index fa71578d..52ca28e5 100644 --- a/lib/src/l10n/gen/app_l10n_en.dart +++ b/lib/src/l10n/gen/app_l10n_en.dart @@ -21,6 +21,9 @@ class AppL10nEn extends AppL10n { @override String get deskTabMine => 'About'; + @override + String get messageBoard => 'Message Board'; + @override String get mobileTabWidgets => 'Widgets'; diff --git a/lib/src/l10n/gen/app_l10n_es.dart b/lib/src/l10n/gen/app_l10n_es.dart index f38a4c82..489193a5 100644 --- a/lib/src/l10n/gen/app_l10n_es.dart +++ b/lib/src/l10n/gen/app_l10n_es.dart @@ -21,6 +21,9 @@ class AppL10nEs extends AppL10n { @override String get deskTabMine => 'Info App'; + @override + String get messageBoard => 'Tablero de Mensajes'; + @override String get mobileTabWidgets => 'Widgets'; diff --git a/lib/src/l10n/gen/app_l10n_fr.dart b/lib/src/l10n/gen/app_l10n_fr.dart index 647d5c3d..cedbaf35 100644 --- a/lib/src/l10n/gen/app_l10n_fr.dart +++ b/lib/src/l10n/gen/app_l10n_fr.dart @@ -21,6 +21,9 @@ class AppL10nFr extends AppL10n { @override String get deskTabMine => 'Infos App'; + @override + String get messageBoard => 'Tableau de messages'; + @override String get mobileTabWidgets => 'Widgets'; diff --git a/lib/src/l10n/gen/app_l10n_it.dart b/lib/src/l10n/gen/app_l10n_it.dart index 44bfe331..6270dac2 100644 --- a/lib/src/l10n/gen/app_l10n_it.dart +++ b/lib/src/l10n/gen/app_l10n_it.dart @@ -21,6 +21,9 @@ class AppL10nIt extends AppL10n { @override String get deskTabMine => 'Info App'; + @override + String get messageBoard => 'Bacheca'; + @override String get mobileTabWidgets => 'Widget'; diff --git a/lib/src/l10n/gen/app_l10n_ja.dart b/lib/src/l10n/gen/app_l10n_ja.dart index d862a666..127830a9 100644 --- a/lib/src/l10n/gen/app_l10n_ja.dart +++ b/lib/src/l10n/gen/app_l10n_ja.dart @@ -21,6 +21,9 @@ class AppL10nJa extends AppL10n { @override String get deskTabMine => 'アプリ情報'; + @override + String get messageBoard => '掲示板'; + @override String get mobileTabWidgets => 'ウィジェット'; diff --git a/lib/src/l10n/gen/app_l10n_ko.dart b/lib/src/l10n/gen/app_l10n_ko.dart index a6052d5b..e0685775 100644 --- a/lib/src/l10n/gen/app_l10n_ko.dart +++ b/lib/src/l10n/gen/app_l10n_ko.dart @@ -21,6 +21,9 @@ class AppL10nKo extends AppL10n { @override String get deskTabMine => '앱 정보'; + @override + String get messageBoard => '게시판'; + @override String get mobileTabWidgets => '위젯'; diff --git a/lib/src/l10n/gen/app_l10n_pt.dart b/lib/src/l10n/gen/app_l10n_pt.dart index 33c7876e..4b868fea 100644 --- a/lib/src/l10n/gen/app_l10n_pt.dart +++ b/lib/src/l10n/gen/app_l10n_pt.dart @@ -21,6 +21,9 @@ class AppL10nPt extends AppL10n { @override String get deskTabMine => 'Info App'; + @override + String get messageBoard => 'Quadro de Mensagens'; + @override String get mobileTabWidgets => 'Widgets'; diff --git a/lib/src/l10n/gen/app_l10n_ru.dart b/lib/src/l10n/gen/app_l10n_ru.dart index eace25ce..f14739e6 100644 --- a/lib/src/l10n/gen/app_l10n_ru.dart +++ b/lib/src/l10n/gen/app_l10n_ru.dart @@ -21,6 +21,9 @@ class AppL10nRu extends AppL10n { @override String get deskTabMine => 'Информация'; + @override + String get messageBoard => 'Доска сообщений'; + @override String get mobileTabWidgets => 'Виджеты'; diff --git a/lib/src/l10n/gen/app_l10n_zh.dart b/lib/src/l10n/gen/app_l10n_zh.dart index 6c2e1bbb..09e8b109 100644 --- a/lib/src/l10n/gen/app_l10n_zh.dart +++ b/lib/src/l10n/gen/app_l10n_zh.dart @@ -21,6 +21,9 @@ class AppL10nZh extends AppL10n { @override String get deskTabMine => '应用信息'; + @override + String get messageBoard => '留言板'; + @override String get mobileTabWidgets => '组件'; diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart index 97610f47..1f6b17ff 100644 --- a/lib/src/navigation/model/app_tab.dart +++ b/lib/src/navigation/model/app_tab.dart @@ -33,7 +33,7 @@ enum AppTab { AppTab.knowledge => l10n.deskTabKnowledge, AppTab.tools => l10n.deskTabTools, AppTab.mine => l10n.deskTabMine, - AppTab.note => '留言板', + AppTab.note => l10n.messageBoard, }; } return switch (this) { @@ -42,7 +42,7 @@ enum AppTab { AppTab.knowledge => l10n.mobileTabKnowledge, AppTab.tools => l10n.mobileTabTools, AppTab.mine => l10n.mobileTabMine, - AppTab.note => '巧记', + AppTab.note => l10n.messageBoard, }; } diff --git a/lib/src/navigation/view/desktop/locale_change_menu.dart b/lib/src/navigation/view/desktop/locale_change_menu.dart index 4d944715..54b1cf72 100644 --- a/lib/src/navigation/view/desktop/locale_change_menu.dart +++ b/lib/src/navigation/view/desktop/locale_change_menu.dart @@ -4,68 +4,55 @@ import 'package:l10n/l10n.dart'; import 'package:tolyui/tolyui.dart'; import 'package:app/app.dart'; -class LocaleChangeMenu extends StatefulWidget { +class LocaleChangeMenu extends StatelessWidget { const LocaleChangeMenu({super.key}); - @override - State createState() => _LocaleChangeMenuState(); -} - -const List kWeekZH = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日']; -const List kWeekEN = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; - -const Map > kWeekMap = { - 0:kWeekZH, - 1:kWeekEN, -}; - -class _LocaleChangeMenuState extends State { - int _activeLocal = 0; - List local = ['中文简体','English']; - int _activeDay = 0; - @override Widget build(BuildContext context) { - List labels = Language.values.map((e)=>e.label).toList(); + List labels = Language.values.map((e) => e.label).toList(); DropMenuCellStyle lightStyle = const DropMenuCellStyle( - padding: EdgeInsets.symmetric(horizontal: 4,vertical: 0), - borderRadius: BorderRadius.all(Radius.circular(6)), - foregroundColor: Color(0xff1f1f1f), - backgroundColor: Colors.transparent, - disableColor: Color(0xffbfbfbf), - hoverBackgroundColor: Color(0xfff5f5f5), - hoverForegroundColor: Color(0xff1f1f1f), - textStyle: TextStyle(fontFamily: '微软雅黑') - ); - - return + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 0), + borderRadius: BorderRadius.all(Radius.circular(6)), + foregroundColor: Color(0xff1f1f1f), + backgroundColor: Colors.transparent, + disableColor: Color(0xffbfbfbf), + hoverBackgroundColor: Color(0xfff5f5f5), + hoverForegroundColor: Color(0xff1f1f1f), + textStyle: TextStyle(fontFamily: '微软雅黑', fontSize: 12,)); + Language language = + context.select((AppConfigBloc bloc) => bloc.state.language); + int index = Language.values.indexOf(language); + return Stack( + alignment: Alignment.centerLeft, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 6.0), + child: Icon(Icons.translate,color: Colors.white,size: 14), + ), IconTheme( - data: IconThemeData(color: Colors.white), + data: const IconThemeData(color: Colors.white), child: DefaultTextStyle( - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), child: TolySelect( - fontSize: 14, + fontSize: 12, cellStyle: lightStyle, data: labels, - selectIndex: _activeDay, + selectIndex: index, iconSize: 16, - height: 30, - width: 110, + height: 26, + width: 100, minWidth: 100, - maxHeight: 200, - padding: EdgeInsets.symmetric(horizontal: 8), + maxHeight: 180, + padding: const EdgeInsets.only(right: 6,left: 24), onSelected: (int index) async { Language type = Language.values[index]; context.read().switchLanguage(type); - setState(() { - _activeDay = index; - }); }, - - ), + ), ), - ); + ), + ], + ); } } - diff --git a/lib/src/navigation/view/desktop/menu_bar_tail.dart b/lib/src/navigation/view/desktop/menu_bar_tail.dart index f5b0c847..17b33129 100644 --- a/lib/src/navigation/view/desktop/menu_bar_tail.dart +++ b/lib/src/navigation/view/desktop/menu_bar_tail.dart @@ -34,11 +34,11 @@ class MenuBarTail extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - LocaleChangeMenu(), - const SizedBox(height: 10,), const Divider(indent: 20, color: Colors.white, height: 1), + const SizedBox(height: 8,), + const LocaleChangeMenu(), Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), + padding: const EdgeInsets.only(left: 8, right: 8,bottom: 8,top: 2), child: Wrap( crossAxisAlignment: WrapCrossAlignment.center, spacing: 8, diff --git a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart index 1e18cdbc..4a9a7a5e 100644 --- a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart +++ b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart @@ -7,6 +7,7 @@ // Contact Me: 1981462002@qq.com import 'package:flutter/material.dart'; +import 'package:tolyui/tolyui.dart'; import 'package:tolyui_navigation/tolyui_navigation.dart'; final Tween _widthTween = Tween(begin: 0.82, end: 0.95); @@ -15,9 +16,11 @@ final Tween _fontSizeTween = Tween(begin: 14.0, end: 15); class FlutterUnitMenuCell extends StatelessWidget { final MenuMeta menu; + final bool enableTooltip; final DisplayMeta display; - const FlutterUnitMenuCell.create(this.menu, this.display, {super.key}); + const FlutterUnitMenuCell.create(this.menu, this.display, + {super.key, this.enableTooltip = false}); Color? get foregroundColor => display.selected ? Colors.white : Colors.white70; @@ -38,30 +41,43 @@ class FlutterUnitMenuCell extends StatelessWidget { TextStyle style = TextStyle(color: foregroundColor, fontSize: fontSize); Radius radius = Radius.circular(height / 2); BorderRadius br = BorderRadius.only(topRight: radius, bottomRight: radius); - - return Align( + Widget child = Container( + padding: EdgeInsets.only(left: 12), alignment: Alignment.centerLeft, - child: Container( - padding: EdgeInsets.only(left: 12), - alignment: Alignment.centerLeft, - decoration: BoxDecoration(color: color, borderRadius: br), - width: _widthTween.transform(anim) * 140, - height: height, - child: Row( - spacing: 6, - // crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(menu.icon, color: foregroundColor, size: iconSize), - Expanded( - child: Text( + decoration: BoxDecoration(color: color, borderRadius: br), + width: _widthTween.transform(anim) * 140, + height: height, + child: Row( + spacing: 6, + // crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(menu.icon, color: foregroundColor, size: iconSize), + Expanded( + child: Text( menu.label, style: style, maxLines: 1, overflow: TextOverflow.ellipsis, - )), - ], - ), + ), + ), + const SizedBox( + width: 2, + ) + ], ), ); + + if (enableTooltip) { + child = TolyTooltip( + placement: Placement.right, + message: menu.label, + child: child, + ); + } + + return Align( + alignment: Alignment.centerLeft, + child: child, + ); } } diff --git a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart index b1cf40e9..868f4ac6 100644 --- a/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart +++ b/modules/basic_system/storage/lib/src/db_storage/flutter_unit/flutter_unit_db_store.dart @@ -16,7 +16,6 @@ class FlutterUnitDbStore extends FxDb { @override int get version => 1; - @override void afterOpen(String dbpath) { super.afterOpen(dbpath); @@ -26,5 +25,4 @@ class FlutterUnitDbStore extends FxDb { @override Iterable<(int, MigrationOperation)> get migrations => []; - } diff --git a/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart b/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart index 058a0b42..25a872bb 100644 --- a/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart +++ b/modules/tools_system/treasure_tools/lib/src/code_gen_page.dart @@ -8,6 +8,7 @@ import 'model/class.dart'; import 'model/field.dart'; import 'popable/class_gen_field.dart'; import 'popable/toly_select.dart'; +import 'view/json_display/json_display.dart'; class A {} @@ -58,11 +59,7 @@ class _CodeGenPageState extends State { controller:_ctrl, children: [ IconFontGenPage(), - Center( - child: Text( - '敬请期待' - ), - ), + JsonAnalysisTool(), Center( child: Text( '敬请期待' diff --git a/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart b/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart index cd337ba8..a966facb 100644 --- a/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart +++ b/modules/tools_system/treasure_tools/lib/src/desk_widget_top_bar.dart @@ -17,7 +17,7 @@ class DeskCodeGenTopBar extends StatefulWidget { class _DeskCodeGenTopBarState extends State with SingleTickerProviderStateMixin { late TabController tabController; - static const List _tabs = ['IconFont', '数据类' , '状态管理', 'Json 解析',]; + static const List _tabs = ['IconFont','Json 解析', '数据类' , '状态管理',]; @override void initState() { @@ -30,6 +30,7 @@ class _DeskCodeGenTopBarState extends State with SingleTicke Color themeColor = Theme.of(context).primaryColor; bool isDark = Theme.of(context).brightness == Brightness.dark; + return DragToMoveWrapper( child: Container( height: 64, diff --git a/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart b/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart new file mode 100644 index 00000000..41f572a2 --- /dev/null +++ b/modules/tools_system/treasure_tools/lib/src/view/json_display/json_display.dart @@ -0,0 +1,362 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +/// 颜色定义 +class FieldColor { + static const keyColor = Colors.grey; + static const intColor = Colors.deepOrange; + static const stringColor = Colors.green; + static const nullColor = Colors.blueGrey; + static const arrayColor = Colors.blue; + static const objectColor = Colors.purple; +} + +/// 基础类型抽象类 +abstract class BaseValue { + final String? key; + final T value; + bool isExpanded; + + BaseValue(this.value, {this.key, this.isExpanded = true}); + + Widget buildValue(); +} + +/// 整数值 +class IntValue extends BaseValue { + IntValue(super.value, {super.key}); + + @override + Widget buildValue() { + return Text(value.toString()+",", + style: const TextStyle(color: FieldColor.intColor)); + } +} + +/// 字符串值 +class StringValue extends BaseValue { + StringValue(super.value, {super.key}); + + @override + Widget buildValue() { + return Text('"$value",', + style: const TextStyle(color: FieldColor.stringColor)); + } +} + +/// Null 值 +class NullValue extends BaseValue { + NullValue({super.key}) : super(null); + + @override + Widget buildValue() { + return const Text('null', style: TextStyle(color: FieldColor.nullColor)); + } +} + +/// 数组值 +class ArrayValue extends BaseValue> { + ArrayValue(super.value, {super.key}); + + @override + Widget buildValue() { + return StatefulBuilder(builder: (context, setState) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + isExpanded = !isExpanded; + }); + }, + child: Row( + children: [ + Icon(isExpanded ? Icons.arrow_drop_down : Icons.arrow_right, + color: FieldColor.arrayColor), + Text('(Array)${isExpanded?'【':'【...'}', + style: TextStyle(color: FieldColor.arrayColor)), + + if (!isExpanded) + const Text('】', + style: TextStyle(color: FieldColor.arrayColor)), + ], + ), + ), + if (isExpanded) ...[ + Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: value.map((e) => parseJson(e).buildValue()).toList(), + ), + ), + const Text('】', style: TextStyle(color: FieldColor.arrayColor)), + ] + ], + ); + }); + } +} + +/// 对象值 +class ObjectValue extends BaseValue> { + ObjectValue(super.value, {super.key}); + + @override + Widget buildValue() { + return StatefulBuilder( + builder: (context, setState) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + isExpanded = !isExpanded; // 触发 UI 重新渲染 + }); + }, + child: Row( + children: [ + Icon(isExpanded ? Icons.arrow_drop_down : Icons.arrow_right, + color: FieldColor.objectColor), + Text('(Object)${isExpanded?'{':'{...'}', + style: TextStyle(color: FieldColor.objectColor)), + if (!isExpanded) + const Text('}', + style: TextStyle(color: FieldColor.objectColor)), + ], + ), + ), + if (isExpanded) ...[ + Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: value.entries + .map((e) => + KeyBlock(keyText: e.key, value: parseJson(e.value))) + .toList(), + ), + ), + const Text('}', style: TextStyle(color: FieldColor.objectColor)), + ] + ], + ); + }, + ); + } +} + +/// 键值对组件 +class KeyBlock extends StatelessWidget { + final String keyText; + final BaseValue value; + + const KeyBlock({super.key, required this.keyText, required this.value}); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('$keyText: ', + style: const TextStyle( + color: FieldColor.keyColor, fontWeight: FontWeight.bold)), + Expanded(child: value.buildValue()), + ], + ); + } +} + +/// 解析 JSON 数据 +BaseValue parseJson(dynamic json, {String? key}) { + if (json == null) return NullValue(key: key); + if (json is int) return IntValue(json, key: key); + if (json is String) return StringValue(json, key: key); + if (json is List) return ArrayValue(json, key: key); + if (json is Map) return ObjectValue(json, key: key); + return StringValue(json.toString(), key: key); +} + +/// JSON 解析工具 UI +class JsonAnalysisTool extends StatefulWidget { + const JsonAnalysisTool({super.key}); + + @override + State createState() => _JsonAnalysisToolState(); +} + +class _JsonAnalysisToolState extends State { + final TextEditingController _controller = TextEditingController( + text: """ +{ + "id": 1, + "name": "Container", + "localName": "容器组件", + "info": "用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "可用于显示一个指定宽高的区域", + "desc": [ + "【width】 : 宽 【int】", + "【height】: 高 【int】", + "【color】: 颜色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "可以在区域中放入一个子组件", + "desc": [ + "【padding】 : 内边距 【EdgeInsetsGeometry】", + "【margin】: 外边距 【EdgeInsetsGeometry】", + "【child】: 子组件 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "可对子组件进行对齐定位", + "desc": [ + "【alignment】 : 对齐定位 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "可对子组件进行装饰", + "desc": [ + "【decoration】 : 装饰 【Decoration】", + "可装饰: 边线、圆弧、颜色、渐变色、阴影、图片等内容" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container还具有变换性", + "desc": [ + "【transform】 : 变换矩阵 【Matrix4】", + "基于Matrix4的矩阵变换,变换详情见线性代数" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container的约束性", + "desc": [ + "【constraints】 : 约束 【BoxConstraints】", + "会约束该区域的尺寸,不会小于指定的最小宽高,也不会大于指定的最大宽高。" + ] + } + ] +}""", + ); + BaseValue? _parsedData; + String? _error; + + final ScrollController _hCtrl = ScrollController(); + final ScrollController _vCtrl = ScrollController(); + + @override + void initState() { + super.initState(); + _parseJson(); + } + + void _parseJson() { + setState(() { + _error = null; + try { + final parsed = jsonDecode(_controller.text); + _parsedData = parseJson(parsed); + } catch (e) { + _error = 'JSON 解析失败: $e'; + _parsedData = null; + } + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + style: TextStyle(fontSize: 14,fontFamily: '楷体'), + controller: _controller, + onChanged: _onChanged, + expands: true, + maxLines: null, + decoration: const InputDecoration( + fillColor: Colors.white, + filled: true, + labelText: '输入 JSON', + border: OutlineInputBorder(), + ), + ), + ), + ), + VerticalDivider(), + Expanded( + child: Align( + alignment: Alignment.topLeft, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(4) + ), + margin: EdgeInsets.all(8), + child: Scrollbar( //-> ::tag1:: + thumbVisibility: true, + //-> ::tag6:: + notificationPredicate: (ScrollNotification notification) => notification.depth == 1, + key: const Key('debuggerCodeViewVerticalScrollbarKey'), + controller: _vCtrl, + child: LayoutBuilder( + builder: (context,cts) { + final double boxHeight = 800; + return Scrollbar( //-> ::tag2:: + key: const Key('debuggerCodeViewHorizontalScrollbarKey'), + thumbVisibility: true, + controller: _hCtrl, + child: SingleChildScrollView( + controller: _hCtrl, //-> ::tag3:: + child: SingleChildScrollView( + controller: _vCtrl, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 8,vertical: 6), + child: SizedBox( + width: boxHeight, + child: _error != null + ? Text(_error!, style: const TextStyle(color: Colors.red)) + : _parsedData?.buildValue() ?? const Text('请输入 JSON'), + ), + ), + ), + ); + } + ), + ), + ), + ), + ), + ], + ), + ); + } + + void _onChanged(String value) { + _parseJson(); + } +} diff --git a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart index 3249dd4b..be4d555d 100644 --- a/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widget_detail_bloc/widget_detail_bloc.dart @@ -20,13 +20,13 @@ class WidgetDetailBloc extends Cubit { required this.nodeRepo, }) : super(DetailLoading()); - final List _modelStack = []; + List _modelStack = []; WidgetModel get currentWidget => _modelStack.last; - void push(WidgetModel model,{String? locale}) { + void push(WidgetModel model, {String? locale}) { _modelStack.add(model); - queryDetail(model,locale: locale); + queryDetail(model, locale: locale); } Future pop() async { @@ -42,11 +42,13 @@ class WidgetDetailBloc extends Cubit { } } - void queryDetail(WidgetModel widget,{String? locale}) async { + void queryDetail(WidgetModel widget, {String? locale}) async { emit(DetailLoading()); try { - final List nodes = await nodeRepo.loadNode(widget.id,locale: locale); - final List links = await widgetRepo.loadWidget(widget.links); + final List nodes = + await nodeRepo.loadNode(widget.id, locale: locale); + final List links = + await widgetRepo.loadWidget(widget.links, locale); if (nodes.isEmpty) { emit(DetailEmpty()); } else { @@ -58,8 +60,11 @@ class WidgetDetailBloc extends Cubit { } } - void changeLocale(Locale locale) { - String localeStr = '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); - queryDetail(currentWidget,locale:localeStr); + void changeLocale(Locale locale) async { + String localeStr = + '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + List ids = _modelStack.map((e) => e.id).toList(); + _modelStack = await widgetRepo.loadWidget(ids, localeStr); + queryDetail(currentWidget, locale: localeStr); } } diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index 0e1b233e..f7b038b4 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -26,7 +26,7 @@ class WidgetsBloc extends Bloc { /// 切换页签,以 [family] 为过滤项 void _onEventTabTap(EventTabTap event, Emitter emit) async { - emit(const WidgetsLoading(operate: LoadOperate.load)); + // emit(const WidgetsLoading(operate: LoadOperate.load)); int size = kIsDesk ? 1000 : 20; WidgetFilter filter = WidgetFilter.family(event.family, pageSize: size,locale: event.locale); try { diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart index ad3fa517..e9fd3efc 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_state.dart @@ -12,6 +12,7 @@ part of 'widgets_bloc.dart'; sealed class WidgetsState extends Equatable { final WidgetFilter filter; final LoadOperate operate; + const WidgetsState({required this.filter, required this.operate}); @override @@ -19,8 +20,10 @@ sealed class WidgetsState extends Equatable { } class WidgetsLoading extends WidgetsState { - const WidgetsLoading( - {super.filter = const WidgetFilter(), super.operate = LoadOperate.load}); + const WidgetsLoading({ + super.filter = const WidgetFilter(), + super.operate = LoadOperate.load, + }); } /// [full] 是否已满,用于加载更多到底的标识 @@ -39,7 +42,7 @@ class WidgetsLoaded extends WidgetsState { }); @override - List get props => [widgets,full,filter,operate,fetchTime]; + List get props => [widgets, full, filter, operate, fetchTime]; @override String toString() { @@ -52,16 +55,15 @@ class WidgetsLoaded extends WidgetsState { LoadOperate? operate, WidgetFilter? filter, int? fetchTime, -}){ + }) { return WidgetsLoaded( - widgets:widgets??this.widgets, - full:full??this.full, - operate:operate??this.operate, - filter:filter??this.filter, - fetchTime:fetchTime??this.fetchTime, + widgets: widgets ?? this.widgets, + full: full ?? this.full, + operate: operate ?? this.operate, + filter: filter ?? this.filter, + fetchTime: fetchTime ?? this.fetchTime, ); } - } class WidgetsLoadFailed extends WidgetsState { diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index 1255f86c..bf427216 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -1,5 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -7,7 +8,7 @@ import 'package:widget_module/views/components/collected_tag.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:wrapper/wrapper.dart'; - +import 'package:tolyui/tolyui.dart'; import '../../components/widget_logo_map.dart'; import '../like_tag.dart'; @@ -97,15 +98,21 @@ class DeskWidgetItem extends StatelessWidget { crossAxisAlignment: WrapCrossAlignment.center, spacing: 8, children: [ - Text( - model.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 14, - color: textColor, - fontWeight: FontWeight.bold, + GestureDetector( + child: Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14, + color: textColor, + fontWeight: FontWeight.bold, + ), ), + onLongPress: () async{ + await Clipboard.setData(ClipboardData(text: model.name)); + $message.success(message: '名称复制成功!'); + }, ), ], diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart index 2df6bb8a..1f66742d 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -39,14 +39,30 @@ class WidgetDao with HasDatabase, DbTable { [family.index]); } - Future>> queryByIds(List ids) async { + Future>> queryByIds(List ids, String? locale) async { if (ids.isEmpty) { return []; } - String sql = "SELECT * " - "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; + String searchSql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE + widget_desc.locale = ? AND + widget.id in (${'?,' * (ids.length - 1)}?) +ORDER BY + lever DESC, widget.id ASC; + """; - return database.rawQuery(sql, [...ids]); + return database.rawQuery(searchSql, [(locale?? 'zh-cn'), ...ids]); } Future>> search(WidgetFilter arguments) async { @@ -83,7 +99,9 @@ widget_desc.locale = ? AND (widget.name LIKE ? OR widget_desc.info LIKE ? OR widget_desc.name LIKE ?) $familySql AND lever IN(?,?,?,?,?) -ORDER BY lever DESC LIMIT ? OFFSET ? +ORDER BY + lever DESC, widget.id ASC +LIMIT ? OFFSET ? ; """; diff --git a/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart index def1f4ea..3f2bef0e 100644 --- a/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/database/db_impl/widget_db_repository.dart @@ -18,9 +18,9 @@ class WidgetDbRepository implements WidgetRepository { @override Future> loadLikeWidgets() async { - return []; + // return []; List likeIds = await likeDao.likeWidgetIds(); - List> data = await widgetDao.queryByIds(likeIds); + List> data = await widgetDao.queryByIds(likeIds, null); List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); return widgets.map(WidgetModel.fromPo).toList(); } @@ -33,10 +33,10 @@ class WidgetDbRepository implements WidgetRepository { } @override - Future> loadWidget(List id) async { - // List> data = await widgetDao.queryByIds(id); - // List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - // if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); + Future> loadWidget(List id,String? locale) async { + List> data = await widgetDao.queryByIds(id,locale); + List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); + if (widgets.isNotEmpty) return widgets.map(WidgetModel.fromPo).toList(); return []; } diff --git a/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart index ed73883a..955d418b 100644 --- a/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/memory/memory_widget_repository.dart @@ -44,7 +44,7 @@ class MemoryWidgetRepository implements WidgetRepository { } @override - Future> loadWidget(List id) async { + Future> loadWidget(List id,String? locale) async { await _initData(); var data = widgets.where((element) => id.contains(element.id)); return data.map(WidgetModel.fromPo).toList(); diff --git a/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart index 8e6bef6b..684d9109 100644 --- a/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart +++ b/modules/widget_system/widget_repository/lib/src/repository/widget_repository.dart @@ -7,7 +7,7 @@ import '../model/model.dart'; abstract class WidgetRepository { // Future> loadWidgets(WidgetFamily family); - Future> loadWidget(List ids); + Future> loadWidget(List ids,String? locale); Future queryWidgetByName(String? name); From 89c654631981fce987ebaa99b718c02242d632b5 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 15 Feb 2025 16:44:56 +0800 Subject: [PATCH 134/149] fix: fit desktop --- assets/images/widgets/Banner.svg | 23 +++ assets/images/widgets/Card.svg | 31 +++- assets/images/widgets/Card.webp | Bin 2402 -> 0 bytes assets/images/widgets/Chip.svg | 38 +++++ assets/images/widgets/Chip.webp | Bin 4224 -> 0 bytes assets/images/widgets/CircleAvatar.svg | 13 ++ assets/images/widgets/Container.svg | 38 +++-- assets/images/widgets/FilterChip.svg | 43 +++++ assets/images/widgets/FlutterLogo.svg | 6 + assets/images/widgets/GestureDetector.svg | 14 +- assets/images/widgets/GridView.svg | 32 ++-- assets/images/widgets/Icon.svg | 21 +++ assets/images/widgets/InputChip.svg | 45 +++++ assets/images/widgets/InputChip.webp | Bin 5028 -> 0 bytes assets/images/widgets/ListView.svg | 40 ++--- assets/images/widgets/MaterialButton.svg | 23 +++ assets/images/widgets/RichText.svg | 6 + assets/images/widgets/Text.svg | 14 +- assets/images/widgets/Widget.svg | 20 +-- lib/src/flutter_unit.dart | 2 +- lib/src/starter/fx_application.dart | 4 +- .../basic_system/app/lib/app/cons/cons.dart | 10 +- .../basic_system/l10n/lib/enum/language.dart | 2 + .../toly_ui/lib/ti/circle_image.dart | 22 ++- .../basic_system/toly_ui/lib/ti/panel.dart | 5 +- .../lib/blocs/action/widget_action.dart | 20 +++ .../lib/blocs/widgets_bloc/widgets_bloc.dart | 2 +- .../lib/views/components/widget_logo_map.dart | 45 +++-- .../widget_detail/widget_detail_page.dart | 23 +-- .../widget_detail/widget_detail_panel.dart | 157 +++++++++++++----- .../widget_panel/desk_widget_model_item.dart | 16 +- .../desk_ui/widget_panel/widget_panel.dart | 3 +- .../widget_page/standard_home_page.dart | 6 +- .../widget_module/lib/widget_module.dart | 1 + .../lib/src/database/dao/widget_dao.dart | 53 +++--- .../lib/src/model/widget_filter.dart | 10 +- .../lib/src/model/widget_model.dart | 12 +- .../StatelessWidget/Banner/node1_base.dart | 8 +- .../FilterChip/node1_base.dart | 27 ++- .../MaterialButton/node1_base.dart | 11 +- .../MaterialButton/node2_onLongPress.dart | 10 +- pubspec.yaml | 1 - 42 files changed, 596 insertions(+), 261 deletions(-) create mode 100644 assets/images/widgets/Banner.svg delete mode 100644 assets/images/widgets/Card.webp create mode 100644 assets/images/widgets/Chip.svg delete mode 100644 assets/images/widgets/Chip.webp create mode 100644 assets/images/widgets/CircleAvatar.svg create mode 100644 assets/images/widgets/FilterChip.svg create mode 100644 assets/images/widgets/FlutterLogo.svg create mode 100644 assets/images/widgets/Icon.svg create mode 100644 assets/images/widgets/InputChip.svg delete mode 100644 assets/images/widgets/InputChip.webp create mode 100644 assets/images/widgets/MaterialButton.svg create mode 100644 assets/images/widgets/RichText.svg create mode 100644 modules/widget_system/widget_module/lib/blocs/action/widget_action.dart diff --git a/assets/images/widgets/Banner.svg b/assets/images/widgets/Banner.svg new file mode 100644 index 00000000..e4f8b66d --- /dev/null +++ b/assets/images/widgets/Banner.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Card.svg b/assets/images/widgets/Card.svg index b4a6081d..b69099b8 100644 --- a/assets/images/widgets/Card.svg +++ b/assets/images/widgets/Card.svg @@ -1,8 +1,31 @@ - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Card.webp b/assets/images/widgets/Card.webp deleted file mode 100644 index 9f8452a43d33cfcbe2173c62cd8d23511855683f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2402 zcmdUvX*3&%7RN*BtE#njIvBAAgS4nELQ5>Q4bj@yv_&Y&)D~K6Ewwc*wWNt*l-Q!R zG+K&CNk^q9v4v7qO6)>3=AGBRGd=I~dmrBYbkDu#o_qiQ^E=nc%EH2p2LN!rXyyQS z(3i9OXYLRQDC1De=iKHnp!6{W1(08YA6a53%FUs9*K1bss^`<2cOB_cZzh~)M5fk1Pi5aTIDhu+n0 zy-+lXvqe&sbeH~@jbbt6FE(>e!a{1DW@zwAA~MNE`#RqbTSlWkgmcX_$ny7L{e% zy?LcmXA>9b_F(nsJ=3@EoOuM-F!Be}0(9$ttuRxwM1q-Bn2L@oQ@+Kz9Ib3ZhbFh!4*`Rc4z?}ZPHeS>wV12WyG(8YsA zt81tqvvsIt);qCFTc)|Bc*pM0b)NNVk4TC<)%p*x_0=>)Wq#QE-(bHz3BW!wfR5YB6o7gDh~Ak(P0M z<8b^_Pv?Pm96EC2B@>-wdHf#X2^VR>1aKaez|pjCNTFyV_8G2)u3ka;&3OYHxD{bc zNXfBMcZ&L1;MNHUD4j%L!iS9Knk<92f!cO{2{9xyP9F{8NAE2pn!e;7u@HDCAmfn$?2V}= zd(hFvUn2d$D7u5pVonQ~ChsRRTo|`xHg}}&$0#d+UQY5$8>tjOj6&e)T{H&iow)`S z98x+hI>d;96p?*rzcxxvpE{rfFg{1~J`Nr&tYWv5`e*Q%s=}1R%;=*wQ@;4OCV#xj zHLyQG*2)^9nE0@h39%glonPZ*M~L!(i~z61T^obru%)_SK^3ou*)dsdoA`mv7x^lX z(wr3HM`Mk_ZvA`RzJ%QPw2MWzEL&@zXh<*nJ$?)WIVg7ZkG}Ldc_m>NAXqhSEIwKI zw0X@!#q85|TI{6oVA%_RfWc#kJe2smnq!#${wT`(OzO%l)a1-&sa!;F&{t` z;(xpW2`h`EUNYGa`h1qdA}ul3#`i|?gq6XnxF(UH&L6m^i3CKpJLIN#p%RDVxwG)i2V~`osTi$0Y zsX7Az7)6gK!>y=WHMsPhB|rT6$q5GERt{P56PFT~+M*uOpJ!rSSYCH+-L0vJn})0v z>9Bqw!{hOZIc zTLVlTpY7$g>-MWL+y^5+{LlKA{3D%+{F5m_}ED}Mo$tD>a< diff --git a/assets/images/widgets/Chip.svg b/assets/images/widgets/Chip.svg new file mode 100644 index 00000000..cea4cbee --- /dev/null +++ b/assets/images/widgets/Chip.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/Chip.webp b/assets/images/widgets/Chip.webp deleted file mode 100644 index 1be3bfa81ec7c4aba65d5805c4a3548846b71737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 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 + + + + + + + + + + + + diff --git a/assets/images/widgets/Container.svg b/assets/images/widgets/Container.svg index 7a6d9cfc..be18043d 100644 --- a/assets/images/widgets/Container.svg +++ b/assets/images/widgets/Container.svg @@ -1,19 +1,33 @@ - - - - + + + + - - - - - - - + + + + + + + - + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/FilterChip.svg b/assets/images/widgets/FilterChip.svg new file mode 100644 index 00000000..7a3f6fdd --- /dev/null +++ b/assets/images/widgets/FilterChip.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/FlutterLogo.svg b/assets/images/widgets/FlutterLogo.svg new file mode 100644 index 00000000..6a82787f --- /dev/null +++ b/assets/images/widgets/FlutterLogo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/widgets/GestureDetector.svg b/assets/images/widgets/GestureDetector.svg index 28d2d6e4..8d3a0001 100644 --- a/assets/images/widgets/GestureDetector.svg +++ b/assets/images/widgets/GestureDetector.svg @@ -1,11 +1,5 @@ - - - - - - - - - - + + + + diff --git a/assets/images/widgets/GridView.svg b/assets/images/widgets/GridView.svg index 8140d70c..2d7f6874 100644 --- a/assets/images/widgets/GridView.svg +++ b/assets/images/widgets/GridView.svg @@ -1,22 +1,12 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/assets/images/widgets/Icon.svg b/assets/images/widgets/Icon.svg new file mode 100644 index 00000000..dd64950c --- /dev/null +++ b/assets/images/widgets/Icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/InputChip.svg b/assets/images/widgets/InputChip.svg new file mode 100644 index 00000000..b739a7ae --- /dev/null +++ b/assets/images/widgets/InputChip.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/InputChip.webp b/assets/images/widgets/InputChip.webp deleted file mode 100644 index c6bb788343dcbbbc1dca570c070e16b49f261706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5028 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 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/MaterialButton.svg b/assets/images/widgets/MaterialButton.svg new file mode 100644 index 00000000..7ace688c --- /dev/null +++ b/assets/images/widgets/MaterialButton.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/RichText.svg b/assets/images/widgets/RichText.svg new file mode 100644 index 00000000..0dd5f661 --- /dev/null +++ b/assets/images/widgets/RichText.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/widgets/Text.svg b/assets/images/widgets/Text.svg index 05e1636a..2b327a5d 100644 --- a/assets/images/widgets/Text.svg +++ b/assets/images/widgets/Text.svg @@ -1,11 +1,5 @@ - - - - - - - - - - + + + + diff --git a/assets/images/widgets/Widget.svg b/assets/images/widgets/Widget.svg index 8fb23f42..f9299096 100644 --- a/assets/images/widgets/Widget.svg +++ b/assets/images/widgets/Widget.svg @@ -1,14 +1,8 @@ - - - - - - - - - - - - - + + + + + + + diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 413085ef..20e5b21a 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -84,6 +84,6 @@ class _FlutterUnit3State extends State { void _initWeb() { if (!kAppEnv.isWeb) return; GoRouter.optionURLReflectsImperativeAPIs = true; - context.read().add(const EventTabTap(WidgetFamily.statelessWidget)); + context.initWidgetData(); } } diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 2cdd5449..8c4bddf0 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -26,9 +26,7 @@ class FxApplication with FxStarter { void onLoaded(BuildContext context, int cost, AppConfig state) { debugPrint("App启动耗时:$cost ms"); context.read().init(state); - context - .read() - .add(const EventTabTap(WidgetFamily.statelessWidget)); + context.initWidgetData(); if (!kAppEnv.isWeb) { context.read().add(const EventLoadLikeData()); context.read().add(const EventLoadCategory()); diff --git a/modules/basic_system/app/lib/app/cons/cons.dart b/modules/basic_system/app/lib/app/cons/cons.dart index 5cd60f3e..28212cbc 100644 --- a/modules/basic_system/app/lib/app/cons/cons.dart +++ b/modules/basic_system/app/lib/app/cons/cons.dart @@ -31,12 +31,12 @@ class Cons { ]; static const Map kWidgetFamilyLabelMap = { - WidgetFamily.statelessWidget: "Stateless", - WidgetFamily.statefulWidget: "Stateful", - WidgetFamily.singleChildRenderObjectWidget: "SingleChild", - WidgetFamily.multiChildRenderObjectWidget: "MultiChild", + WidgetFamily.stateless: "Stateless", + WidgetFamily.stateful: "Stateful", + WidgetFamily.singleChildRender: "SingleChild", + WidgetFamily.multiChildRender: "MultiChild", WidgetFamily.sliver: "Sliver", - WidgetFamily.proxyWidget: "Proxy", + WidgetFamily.proxy: "Proxy", WidgetFamily.other: "Other", }; diff --git a/modules/basic_system/l10n/lib/enum/language.dart b/modules/basic_system/l10n/lib/enum/language.dart index 47dfbe81..2fbd17a5 100644 --- a/modules/basic_system/l10n/lib/enum/language.dart +++ b/modules/basic_system/l10n/lib/enum/language.dart @@ -13,6 +13,8 @@ enum Language { es_ES(locale: Locale('es','ES'), label: 'Español'), ; + String get code => '${locale.languageCode}-${locale.countryCode}'.toLowerCase(); + final Locale locale; final String label; diff --git a/modules/basic_system/toly_ui/lib/ti/circle_image.dart b/modules/basic_system/toly_ui/lib/ti/circle_image.dart index c1146cb8..bb7d20cc 100644 --- a/modules/basic_system/toly_ui/lib/ti/circle_image.dart +++ b/modules/basic_system/toly_ui/lib/ti/circle_image.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:storage/storage.dart'; +import 'package:widget_module/widget_module.dart'; class CircleImage extends StatelessWidget { @@ -36,13 +38,19 @@ class CircleImage extends StatelessWidget { ), child: Padding( padding: EdgeInsets.all(borderSize), - child: DecoratedBox( - decoration: BoxDecoration( - image: DecorationImage( - image: image, - fit: BoxFit.cover, - filterQuality: FilterQuality.low), - shape: BoxShape.circle, + child: GestureDetector( + onTap: () async{ + var data = await AppStorage().flutter().queryWidgetByName('Container'); + print(data); + }, + child: DecoratedBox( + decoration: BoxDecoration( + image: DecorationImage( + image: image, + fit: BoxFit.cover, + filterQuality: FilterQuality.low), + shape: BoxShape.circle, + ), ), ), ), diff --git a/modules/basic_system/toly_ui/lib/ti/panel.dart b/modules/basic_system/toly_ui/lib/ti/panel.dart index e655ad4c..2fc3bd77 100644 --- a/modules/basic_system/toly_ui/lib/ti/panel.dart +++ b/modules/basic_system/toly_ui/lib/ti/panel.dart @@ -6,15 +6,16 @@ class Panel extends StatelessWidget { final double radius; final Color? color; final Widget? child; + final EdgeInsetsGeometry? margin; - const Panel({Key? key, this.radius = 5.0, this.color, this.child}) : super(key: key); + const Panel({Key? key, this.radius = 5.0, this.color, this.child, this.margin=const EdgeInsets.all(10)}) : super(key: key); @override Widget build(BuildContext context) { return Container( alignment: Alignment.centerLeft, - padding: const EdgeInsets.all(10), + padding: margin, decoration: BoxDecoration( color: color ?? const Color(0xffF6F8FA), borderRadius: BorderRadius.all(Radius.circular(radius))), diff --git a/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart new file mode 100644 index 00000000..7feaea34 --- /dev/null +++ b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart @@ -0,0 +1,20 @@ +import 'package:flutter/cupertino.dart'; +import 'package:app/app.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:widget_module/blocs/blocs.dart'; + +import '../../widget_module.dart'; + + +extension WidgetContext on BuildContext{ + + void initWidgetData(){ + switchWidgetFamily(WidgetFamily.stateless); + } + + void switchWidgetFamily(WidgetFamily family){ + String locale = read().state.language.code; + read().add(EventTabTap(family,locale: locale)); + } + +} diff --git a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart index f7b038b4..3da35ffc 100644 --- a/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart +++ b/modules/widget_system/widget_module/lib/blocs/widgets_bloc/widgets_bloc.dart @@ -130,7 +130,7 @@ class WidgetsBloc extends Bloc { void changeLocale(Locale locale) { add(EventTabTap( - state.filter.family??WidgetFamily.statelessWidget, + state.filter.family??WidgetFamily.stateless, locale: '${locale.languageCode}-${locale.countryCode}'.toLowerCase() )); } diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart index 68972270..9c49bf5f 100644 --- a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -7,7 +7,6 @@ import 'package:flutter_svg/flutter_svg.dart'; class WidgetLogo extends StatelessWidget { final Color background; final String widgetName; - const WidgetLogo({ super.key, required this.background, @@ -16,23 +15,24 @@ class WidgetLogo extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - width: 110, - height: 110, - alignment: Alignment.center, - decoration: BoxDecoration( - color: background, - gradient: LinearGradient( - transform: const GradientRotation(270 * 180 / pi), - colors: [ - background.withValues(alpha: 0.9), - background.withValues(alpha: 0.5) - ]), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), - ), - child: - SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}',width: 100,), + return Container( + width: 110, + height: 110, + alignment: Alignment.center, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform: const GradientRotation(270 * 180 / pi), + colors: [ + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), + ), + child: + SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}',width: 90,), + ); } } @@ -42,11 +42,20 @@ String widgetLogo(String widgetName) { 'Container' => 'Container.svg', 'Text' => 'Text.svg', 'GestureDetector' => 'GestureDetector.svg', + 'CircleAvatar' => 'CircleAvatar.svg', 'Card' => 'Card.svg', 'ListView' => 'ListView.svg', 'GridView' => 'GridView.svg', 'SingleChildScrollView' => 'SingleChildScrollView.svg', 'PageView' => 'PageView.svg', + 'InputChip' => 'InputChip.svg', + 'Chip' => 'Chip.svg', + 'FilterChip' => 'FilterChip.svg', + 'MaterialButton' => 'MaterialButton.svg', + 'FlutterLogo' => 'FlutterLogo.svg', + 'RichText' => 'RichText.svg', + 'Banner' => 'Banner.svg', + 'Icon' => 'Icon.svg', _ => 'Widget.svg', }; } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart index a9fed0ea..c6ed4726 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_page.dart @@ -119,27 +119,8 @@ class DeskWidgetDetailPage extends StatelessWidget { SliverToBoxAdapter( child: Column( children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: DeskWidgetDetailPanel(model: bloc.currentWidget), - ), - const SizedBox(width: 20), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 16), - linkText(context), - if (state is DetailWithData) - LinkWidgetButtons( - links: state.links, onSelect: bloc.push) - ], - )) - ], - ), - const Divider() + DeskWidgetDetailPanel(model: bloc.currentWidget, state: state,), + const Divider(height: 18,) ], ), ), diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index 44dbc632..4ded52a2 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -1,63 +1,140 @@ - import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:widget_repository/widget_repository.dart'; +import 'dart:math'; + +import '../../../blocs/blocs.dart'; +import '../../components/widget_logo_map.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:l10n/l10n.dart'; +import 'link_widget_buttons.dart'; class DeskWidgetDetailPanel extends StatelessWidget { final WidgetModel model; + final DetailState state; - const DeskWidgetDetailPanel({Key? key, required this.model}) : super(key: key); + const DeskWidgetDetailPanel( + {Key? key, required this.model, required this.state}) + : super(key: key); @override Widget build(BuildContext context) { + Color color = Theme.of(context).primaryColor; + return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8,vertical: 16), - child: Column( + padding: const EdgeInsets.all(12.0), + child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - _buildLeft(model, context), - _buildRight(model), - ], - ), - // const Divider(), + _buildLeft(model, context), + const SizedBox(width: 12), + _buildRight(color, model), ], ), ); } + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + ], + ); + Widget _buildLeft(WidgetModel model, BuildContext context) => Expanded( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Panel( - color: Color(0x33E5EAE1), - child: Text(model.info)), - ), - ); - - Widget _buildRight(WidgetModel model) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - height: 100, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Hero( - tag: "hero_widget_image_${model.id}", - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(8)), - child: model.image == null - ? Image.asset('assets/images/caver.webp') - : Image(image: model.image!))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Panel( + color: Color(0x33E5EAE1), + child: Text(model.info), + + ), + const SizedBox(height: 16), + linkText(context), + if (state is DetailWithData) + LinkWidgetButtons( + links: (state as DetailWithData).links, + onSelect: (v) {}) + ], ), - ), - StarScore( - score: model.lever, - star: const Star(size: 15, fillColor: Colors.blue), - ) - ], - ); + ); + + Widget _buildRight(Color color, WidgetModel model) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Hero( + tag: "hero_widget_image_${model.id}", + child: WidgetLogo( + widgetId: model.id, + background: color, + widgetName: model.name, + ), + ), + const SizedBox( + height: 6, + ), + StarScore( + score: model.lever, + star: Star(size: 15, fillColor:color), + ) + ], + ); +} + +class WidgetLogo extends StatelessWidget { + final Color background; + final String widgetName; + final int widgetId; + + const WidgetLogo({ + super.key, + required this.background, + required this.widgetName, required this.widgetId, + }); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + width: 240, + height: 160, + alignment: Alignment.center, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform: const GradientRotation(270 * 180 / pi), + colors: [ + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: BorderRadius.circular(6), + ), + child: SvgPicture.asset( + 'assets/images/widgets/${widgetLogo(widgetName)}', + width: 140, + ), + ), + Positioned( + bottom: 2, + left: 6, + child: Text( + "#$widgetId", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12, + color: Colors.white70, + ), + )) + ], + ); + } } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart index bf427216..69c2c370 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart @@ -11,7 +11,7 @@ import 'package:wrapper/wrapper.dart'; import 'package:tolyui/tolyui.dart'; import '../../components/widget_logo_map.dart'; import '../like_tag.dart'; - +import 'package:l10n/l10n.dart'; class DeskWidgetItem extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; @@ -52,7 +52,9 @@ class DeskWidgetItem extends StatelessWidget { onLongPress: (){ context.read().add(ToggleLikeWidgetEvent(id: model.id)); }, - child: WidgetLogo(background: color, widgetName: model.name,), + child: Hero( + tag: "hero_widget_image_${model.id}", + child: WidgetLogo(background: color, widgetName: model.name,)), ), Expanded( child: Padding( @@ -88,7 +90,15 @@ class DeskWidgetItem extends StatelessWidget { ], ); } - + Widget linkText(BuildContext context) => Row( + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); Widget _buildTitle(Color color, Color? textColor, bool isDark) { return Row( children: [ diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index cb697c42..3e95d40e 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -6,6 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/event/widget_event.dart'; +import 'package:widget_module/widget_module.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:fx_trace/fx_trace.dart'; @@ -43,7 +44,7 @@ class _DeskWidgetPanelState extends State { void _switchTab(int index) { WidgetFamily widgetFamily = WidgetFamily.values[index]; - BlocProvider.of(context).add(EventTabTap(widgetFamily)); + context.switchWidgetFamily(widgetFamily); } } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index dfed3a0a..f7835cf2 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -1,4 +1,5 @@ import 'package:l10n/ext.dart'; +import 'package:widget_module/blocs/action/widget_action.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:toly_ui/toly_ui.dart'; @@ -6,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; - import 'home_drawer.dart'; import 'standard_home_search.dart'; import 'widget_page.dart'; @@ -51,10 +51,10 @@ class _StandardHomePageState extends State void _switchTab(int index) { WidgetFamily widgetFamily = WidgetFamily.values[index]; - WidgetsBloc bloc = BlocProvider.of(context); + WidgetsBloc bloc = context.read(); if (bloc.state.filter.family == widgetFamily) return; PrimaryScrollController.of(context).jumpTo(0); - BlocProvider.of(context).add(EventTabTap(widgetFamily)); + context.switchWidgetFamily(widgetFamily); } @override diff --git a/modules/widget_system/widget_module/lib/widget_module.dart b/modules/widget_system/widget_module/lib/widget_module.dart index c00ce4b5..90affcab 100644 --- a/modules/widget_system/widget_module/lib/widget_module.dart +++ b/modules/widget_system/widget_module/lib/widget_module.dart @@ -4,6 +4,7 @@ export 'views/desk_ui/desk_ui.dart'; export 'views/mobile/mobile_ui.dart'; export 'views/widgets_bloc_provider.dart'; export 'event/widget_event.dart'; +export 'blocs/action/widget_action.dart'; export 'package:widget_repository/widget_repository.dart' show WidgetFilter, diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart index 1f66742d..f25c2648 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -9,35 +9,6 @@ class WidgetDao with HasDatabase, DbTable { @override String get name => 'widget'; - Future insert(WidgetPo widget) async { - String addSql = "INSERT INTO " - "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " - "VALUES (?,?,?,?,?,?,?,?);"; - return database.transaction((tran) async => await tran.rawInsert(addSql, [ - widget.id, - widget.name, - widget.nameCN, - widget.deprecated, - widget.family, - widget.lever, - widget.linkWidget, - widget.info - ])); - } - - Future>> queryAll() async { - return database.rawQuery("SELECT * FROM widget"); - } - - Future>> queryByFamily( - WidgetFamily family, { - String locale = 'zh-cn', - }) async { - return database.rawQuery( - "SELECT * " - "FROM widget WHERE family = ? ORDER BY lever DESC", - [family.index]); - } Future>> queryByIds(List ids, String? locale) async { if (ids.isEmpty) { @@ -77,11 +48,9 @@ ORDER BY String familySql = hasFamily ? ' AND family = ?' : ''; List familyArg = hasFamily ? [arguments.family!.index] : []; List starArg = arguments.stars; - // 保证在星级参数是 [-1,-1,-1,-1,-1] 时,搜索全星级 if (arguments.stars.reduce((a, b) => a + b) == -5) { starArg = [1, 2, 3, 4, 5]; } - String searchSql = """ SELECT widget.id, @@ -132,9 +101,25 @@ LIMIT ? OFFSET ? return 0; } - Future?> queryWidgetByName(String name) async { - String sql = "SELECT * FROM widget WHERE name = ?"; - List> result = await database.rawQuery(sql, [name]); + Future?> queryWidgetByName(String name, {String? locale}) async { + String querySql = """ +SELECT + widget.id, + widget.name, + widget.family, + widget.linkWidget, + widget.lever, + widget_desc.name AS nameCN, + widget_desc.info +FROM widget +INNER JOIN widget_desc + ON widget.id = widget_desc.widget_id +WHERE +widget.name = ? AND +widget_desc.locale = ? +; +"""; + List> result = await database.rawQuery(querySql, [name,locale??'zh-cn']); if (result.isNotEmpty) { return result.first; } diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart index a4a6469e..3482da8e 100644 --- a/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart +++ b/modules/widget_system/widget_repository/lib/src/model/widget_filter.dart @@ -1,10 +1,10 @@ enum WidgetFamily { - statelessWidget, - statefulWidget, - singleChildRenderObjectWidget, - multiChildRenderObjectWidget, + stateless, + stateful, + singleChildRender, + multiChildRender, sliver, - proxyWidget, + proxy, other, } diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_model.dart b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart index 10c615af..c1510e9c 100644 --- a/modules/widget_system/widget_repository/lib/src/model/widget_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart @@ -91,21 +91,21 @@ class WidgetModel extends Equatable { static WidgetFamily toFamily(int id) { switch (id) { case 0: - return WidgetFamily.statelessWidget; + return WidgetFamily.stateless; case 1: - return WidgetFamily.statefulWidget; + return WidgetFamily.stateful; case 2: - return WidgetFamily.singleChildRenderObjectWidget; + return WidgetFamily.singleChildRender; case 3: - return WidgetFamily.multiChildRenderObjectWidget; + return WidgetFamily.multiChildRender; case 4: return WidgetFamily.sliver; case 5: - return WidgetFamily.proxyWidget; + return WidgetFamily.proxy; case 6: return WidgetFamily.other; default: - return WidgetFamily.statelessWidget; + return WidgetFamily.stateless; } } } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart index b49c4429..884b6103 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/node1_base.dart @@ -9,9 +9,10 @@ class CustomBanner extends StatelessWidget { Map get data => { BannerLocation.topStart: Colors.red, - BannerLocation.topEnd: Colors.blue, BannerLocation.bottomStart: Colors.green, - BannerLocation.bottomEnd: Colors.yellow, + BannerLocation.bottomEnd: Colors.orange, + BannerLocation.topEnd: Colors.blue, + }; @override @@ -25,8 +26,9 @@ class CustomBanner extends StatelessWidget { width: 150, height: 150 * 0.618, child: Banner( - message: "Flutter 2.2.3发布", + message: "Flutter 3.29.0 发布", location: location, + textStyle: TextStyle(fontSize: 8,height: 1), color: data[location]!, child: const Padding( padding: EdgeInsets.all(20), diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart index 276c893a..ff56da99 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/node1_base.dart @@ -21,11 +21,12 @@ class _CustomFilterChipState extends State { @override Widget build(BuildContext context) { + Color themeColor = Theme.of(context).primaryColor; return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Wrap( - children: map.keys.map((key) => _buildChild(key)).toList(), + children: map.keys.map((key) => _buildChild(themeColor,key)).toList(), ), Container( padding: const EdgeInsets.all(10), @@ -34,20 +35,30 @@ class _CustomFilterChipState extends State { ); } - Padding _buildChild(String key) => Padding( + Padding _buildChild( Color themeColor,String key) { + bool select = _selected.contains(map[key]); + return Padding( padding: const EdgeInsets.all(4.0), child: FilterChip( - selectedColor: Colors.orange.withAlpha(55), + selectedColor: themeColor, selectedShadowColor: Colors.blue, - shadowColor: Colors.orangeAccent, + side: BorderSide.none, + shadowColor: themeColor, pressElevation: 5, - elevation: 3, - avatar: CircleAvatar(child: Text(key)), - label: Text(map[key]!), - selected: _selected.contains(map[key]), + elevation: 2, + avatarBoxConstraints: BoxConstraints( + maxWidth: 22,maxHeight: 22 + ), + checkmarkColor: select?Colors.white:null, + avatar: CircleAvatar( + backgroundColor: select?Colors.blueAccent:null, + child: Text(key,style: TextStyle(fontSize: 12,color: select?Colors.transparent:null),)), + label: Text(map[key]!,style: TextStyle(color: select?Colors.white:null),), + selected: select, onSelected: (bool value) => _onSelected(value, key), ), ); + } void _onSelected(bool value, String key) { setState(() { diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart index 19fa2123..40b063c6 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node1_base.dart @@ -12,11 +12,14 @@ class CustomMaterialButton extends StatelessWidget { return MaterialButton( height: 40, elevation: 5, - color: Colors.orangeAccent, + color: Colors.blue, textColor: Colors.white, - splashColor: Colors.blue, - padding: const EdgeInsets.all(8), + splashColor: Colors.orangeAccent, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), child: const Text("MaterialButton"), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); + onPressed: () { + + // Navigator.of(context).pushNamed('AboutMePage'); + }); } } \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart index 34fda962..a0d3c2ca 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/node2_onLongPress.dart @@ -15,9 +15,13 @@ class LongPressMaterialButton extends StatelessWidget { color: Colors.blue, highlightColor: Colors.green, textColor: Colors.white, - padding: const EdgeInsets.all(8), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), child: const Text("MaterialButton"), - onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), - onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); + onLongPress: () { + // Navigator.of(context).pushNamed('AboutMePage'); + }, + onPressed: () { + // Navigator.of(context).pushNamed('AboutMePage'); + }); } } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 821d08e4..29a3670a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,7 +73,6 @@ dependencies: webview_flutter: ^4.2.4 # webview flutter_markdown: ^0.7.2+1 # markdown flutter_svg: ^2.0.17 # svg 展示 - # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 From 7f00e334feb54f8edd1dc238f1ccc6bfcfce5157 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 9 Mar 2025 22:50:54 +0800 Subject: [PATCH 135/149] fix:fx_dio version --- assets/images/widgets/Image.svg | 0 modules/ability/r_upgrade-0.4.2/pubspec.lock | 189 ++++++++++++++++++ modules/basic_system/app_update/pubspec.yaml | 2 +- modules/knowledge_system/note/pubspec.yaml | 2 +- .../widget_page/standard_home_page.dart | 27 +-- .../lib/src/database/dao/node_dao.dart | 2 +- .../TweenAnimationBuilder/node1_base.dart | 58 +++--- pubspec.yaml | 2 +- 8 files changed, 241 insertions(+), 41 deletions(-) create mode 100644 assets/images/widgets/Image.svg create mode 100644 modules/ability/r_upgrade-0.4.2/pubspec.lock diff --git a/assets/images/widgets/Image.svg b/assets/images/widgets/Image.svg new file mode 100644 index 00000000..e69de29b diff --git a/modules/ability/r_upgrade-0.4.2/pubspec.lock b/modules/ability/r_upgrade-0.4.2/pubspec.lock new file mode 100644 index 00000000..461388fe --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/pubspec.lock @@ -0,0 +1,189 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev/" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev/" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev/" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev/" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev/" + source: hosted + version: "1.19.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev/" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev/" + source: hosted + version: "10.0.7" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev/" + source: hosted + version: "3.0.8" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev/" + source: hosted + version: "3.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev/" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev/" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev/" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev/" + source: hosted + version: "1.9.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev/" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev/" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev/" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev/" + source: hosted + version: "1.3.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: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev/" + source: hosted + version: "0.7.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev/" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev/" + source: hosted + version: "14.3.0" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 27068efb..26573fc3 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: url_launcher: ^6.3.0 # url package_info_plus: ^8.1.4 path_provider: ^2.1.5 - fx_dio: ^0.0.3 + fx_dio: 0.0.4+2 utils: path: ../utils diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml index 3edac7c5..e8eb0234 100644 --- a/modules/knowledge_system/note/pubspec.yaml +++ b/modules/knowledge_system/note/pubspec.yaml @@ -12,7 +12,7 @@ resolution: workspace dependencies: flutter: sdk: flutter - fx_dio: 0.0.4 + fx_dio: 0.0.4+2 flutter_bloc: ^8.1.6 # 状态管理 two_dimensional_scrollables: ^0.3.3 flutter_quill: ^11.0.0-dev.21 diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index f7835cf2..b90b2cd6 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -20,21 +20,18 @@ class StandardHomePage extends StatefulWidget { class _StandardHomePageState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - - List get _tabs =>[ - context.l10n.stateless, - context.l10n.stateful, - context.l10n.single, - context.l10n.multi, - context.l10n.sliver, - context.l10n.proxy, - context.l10n.other, - ]; + List get _tabs => [ + context.l10n.stateless, + context.l10n.stateful, + context.l10n.single, + context.l10n.multi, + context.l10n.sliver, + context.l10n.proxy, + context.l10n.other, + ]; late TabController tabController; - - @override void initState() { super.initState(); @@ -95,7 +92,11 @@ class _StandardHomePageState extends State bool isDark = Theme.of(context).brightness == Brightness.dark; return [ - const SliverSnapHeader(child: StandardHomeSearch()), + // const SliverSnapHeader(child: StandardHomeSearch()), + const SliverFloatingHeader( + snapMode: FloatingHeaderSnapMode.scroll, + child: StandardHomeSearch(), + ), // SliverOverlapAbsorber( // sliver: SliverPinnedHeader( diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart index bfabb06a..b4bf1334 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -42,6 +42,6 @@ AND node.widgetId = ? ORDER BY priority """; - return await database.rawQuery(sql, [locale ?? 'pt-pt', id]); + return await database.rawQuery(sql, [locale ?? 'zh-cn', id]); } } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart index 89a97218..384ed3cd 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/node1_base.dart @@ -9,40 +9,50 @@ class TweenAnimationBuilderDemo extends StatefulWidget { const TweenAnimationBuilderDemo({Key? key}) : super(key: key); @override - _TweenAnimationBuilderDemoState createState() => + State createState() => _TweenAnimationBuilderDemoState(); } class _TweenAnimationBuilderDemoState extends State { - Color _value = Colors.red; + List get colors => const [ + Colors.red, + Colors.orange, + Colors.yellow, + Colors.green, + Colors.blue, + Colors.indigo, + Colors.purple + ]; + + int _activeIndex = 0; + + Color get begin => colors[_activeIndex % colors.length]; + + Color get end => colors[(_activeIndex + 1) % colors.length]; + + void nextColor(){ + _activeIndex++; + setState(() {}); + } @override Widget build(BuildContext context) { - return TweenAnimationBuilder( - tween: ColorTween(begin: Colors.blue, end: _value), - duration: const Duration(milliseconds: 800), - builder: (BuildContext context, Color? color, Widget? child) { - return GestureDetector( - onTap: () { - setState(() { - _value = _value == Colors.red ? Colors.blue : Colors.red; - }); - }, - child: Container( + return GestureDetector( + onTap: nextColor, + child: TweenAnimationBuilder( + tween: ColorTween(begin: begin, end: end), + duration: const Duration(milliseconds: 800), + builder: (BuildContext context, Color? color, Widget? child) { + return Container( width: 40, height: 40, - child: child, decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(5) - ), - ), - ); - }, - child: const Icon( - Icons.android_outlined, - color: Colors.white, + color: color, borderRadius: BorderRadius.circular(5)), + child: child, + ); + }, + child: const Icon(Icons.android_outlined, color: Colors.white), ), ); } -} +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 29a3670a..c0d0a4d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,7 +45,7 @@ dependencies: fx_platform_adapter: ^0.0.2+1 # 平台适配器 fx_go_router_ext: 0.0.5 # 路由 fx_dao: 0.0.1+2 # 数据库 - fx_dio: 0.0.4 + fx_dio: 0.0.4+2 fx_boot_starter: 0.1.1 # app 启动器 fx_trace: 0.0.3 # 异常追踪/监听 From aeaeb6a83e4c9dfa1da3e0560dec8133233a2d3e Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Fri, 4 Apr 2025 23:22:48 +0800 Subject: [PATCH 136/149] fix:NavigationRail --- lib/src/starter/fx_application.dart | 5 +- .../starter/view/error/app_start_error.dart | 24 +++++-- .../app/lib/app_config/bloc/state.dart | 60 +++++++++--------- .../widget_detail/widget_detail_page.dart | 5 +- .../lib/src/model/node_model.dart | 5 +- .../NavigationRail/node1_base.dart | 40 ++++++------ .../NavigationRail/node2_extend.dart | 50 ++++++++------- .../NavigationRail/node3_dark.dart | 63 +++++++++---------- pubspec.lock | 16 +++-- pubspec.yaml | 2 +- 10 files changed, 148 insertions(+), 122 deletions(-) diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index 8c4bddf0..ff4cdce5 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -35,9 +35,8 @@ class FxApplication with FxStarter { @override void onStartSuccess(BuildContext context, AppConfig state) { - context - .read() - .add(CheckUpdate(appId: 1, locale: state.language.locale.toString())); + CheckUpdate event = CheckUpdate(appId: 1, locale: state.localeValue); + context.read().add(event); context.go(AppRoute.widget.url); } diff --git a/lib/src/starter/view/error/app_start_error.dart b/lib/src/starter/view/error/app_start_error.dart index 3c499e53..ab3784fd 100644 --- a/lib/src/starter/view/error/app_start_error.dart +++ b/lib/src/starter/view/error/app_start_error.dart @@ -11,24 +11,36 @@ class AppStartErrorPage extends StatelessWidget { return Scaffold( appBar: PreferredDragToMoveWrapper( child: AppBar( - title: const Text("App 启动异常",style: TextStyle(fontFamily: '宋体'),), + title: const Text( + "App 启动异常", + style: TextStyle(fontFamily: '宋体'), + ), actions: const [WindowButtons()], ), ), body: Center( child: Column( children: [ - Expanded(child: Center(child: Wrap( + Expanded( + child: Center( + child: Wrap( direction: Axis.vertical, children: [ const Text('应用启动异常:'), - Text(error.toString(),style: const TextStyle(color: Colors.redAccent),), + Text( + error.toString(), + style: const TextStyle(color: Colors.redAccent), + ), ], ))), - TolyLink(href: 'https://github.com/toly1994328/', text: 'Github 开源地址: FlutterUnit', onTap: (l){}), + TolyLink( + href: 'https://github.com/toly1994328/', + text: 'Github 开源地址: FlutterUnit', + onTap: (l) {}), const Text("联系邮箱: 1981462002@qq.com"), - const SizedBox(height: 12,), - + const SizedBox( + height: 12, + ), ], ), ), diff --git a/modules/basic_system/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart index 5743b832..15293b1e 100644 --- a/modules/basic_system/app/lib/app_config/bloc/state.dart +++ b/modules/basic_system/app/lib/app_config/bloc/state.dart @@ -4,15 +4,13 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:l10n/l10n.dart'; import 'package:storage/storage.dart'; -import 'package:toly_ui/code/code.dart' ; - +import 'package:toly_ui/code/code.dart'; /// create by 张风捷特烈 on 2020-04-11 /// contact me by email 1981462002@qq.com /// 说明: 全局状态类 class AppConfig extends Equatable { - /// [fontFamily] 文字字体 final String fontFamily; @@ -54,19 +52,21 @@ class AppConfig extends Equatable { this.netConnect = ConnectivityResult.none, }); + String get localeValue => language.locale.toString(); + @override List get props => [ - fontFamily, - themeColor, - showBackGround, - codeStyleIndex, - itemStyleIndex, - themeMode, - showOverlayTool, - showPerformanceOverlay, - netConnect, - language, - ]; + fontFamily, + themeColor, + showBackGround, + codeStyleIndex, + itemStyleIndex, + themeMode, + showOverlayTool, + showPerformanceOverlay, + netConnect, + language, + ]; AppConfig copyWith({ String? fontFamily, @@ -90,23 +90,23 @@ class AppConfig extends Equatable { showOverlayTool: showOverlayTool ?? this.showOverlayTool, itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex, themeMode: themeMode ?? this.themeMode, - showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay, + showPerformanceOverlay: + showPerformanceOverlay ?? this.showPerformanceOverlay, netConnect: netConnect ?? this.netConnect, ); - // 将 AppState 状态数据转换为配置对象,以便存储 AppConfigPo toAppConfigPo() => AppConfigPo( - showBackGround : showBackGround, - showOverlayTool : showOverlayTool, - showPerformanceOverlay : showPerformanceOverlay, - fontFamilyIndex : Cons.kFontFamilySupport.indexOf(fontFamily), - themeColorIndex : themeColor.index, - codeStyleIndex : codeStyleIndex, - themeModeIndex : themeMode.index, - itemStyleIndex : itemStyleIndex, - languageIndex: language.index, - ); + showBackGround: showBackGround, + showOverlayTool: showOverlayTool, + showPerformanceOverlay: showPerformanceOverlay, + fontFamilyIndex: Cons.kFontFamilySupport.indexOf(fontFamily), + themeColorIndex: themeColor.index, + codeStyleIndex: codeStyleIndex, + themeModeIndex: themeMode.index, + itemStyleIndex: itemStyleIndex, + languageIndex: language.index, + ); // 根据存储的配置信息对象,形成 AppState 状态数据 factory AppConfig.fromPo(AppConfigPo po) { @@ -115,7 +115,7 @@ class AppConfig extends Equatable { themeColor: ThemeColor.values[po.themeColorIndex], showBackGround: po.showBackGround, language: Language.values[po.languageIndex], - codeStyleIndex: po.codeStyleIndex, + codeStyleIndex: po.codeStyleIndex, itemStyleIndex: po.itemStyleIndex, showPerformanceOverlay: po.showPerformanceOverlay, showOverlayTool: po.showOverlayTool, @@ -123,11 +123,11 @@ class AppConfig extends Equatable { ); } - HighlighterStyle get codeStyle => Cons.codeThemeSupport.keys.toList()[codeStyleIndex]; - + HighlighterStyle get codeStyle => + Cons.codeThemeSupport.keys.toList()[codeStyleIndex]; @override String toString() { return 'AppState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}'; } -} \ No newline at end of file +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart index 5009ef3c..c9c97f3f 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_detail/widget_detail_page.dart @@ -137,8 +137,8 @@ class SliverNodeList extends StatelessWidget { } Widget _nodeMapper(NodeModel node) { - NodeType type = node.type(model.name); - Widget display = mapNodeDisplay(model.id,node.priority); + NodeType type = node.type(model.name, node.priority); + Widget display = mapNodeDisplay(model.id, node.priority); return switch (type) { NodeType.display => display, NodeType.newPage => newPageDisplay(display), @@ -161,6 +161,7 @@ Widget newPageDisplay(Widget page) { Icon( Icons.open_in_new, size: 16, + color: Colors.white, ), Text('新界面打开'), ], diff --git a/modules/widget_system/widget_repository/lib/src/model/node_model.dart b/modules/widget_system/widget_repository/lib/src/model/node_model.dart index 78111d02..b74a45f3 100644 --- a/modules/widget_system/widget_repository/lib/src/model/node_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/node_model.dart @@ -28,10 +28,13 @@ class NodeModel extends Equatable { @override List get props => [name, subtitle, code, priority]; - NodeType type(String widget) { + NodeType type(String widget, int priority) { if (widget == 'PinnedHeaderSliver') { return NodeType.newPage; } + if (widget == 'NavigationRail') { + return NodeType.newPage; + } return NodeType.display; } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart index dcea36e5..b5c73260 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node1_base.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com - class CustomNavigationRail extends StatefulWidget { const CustomNavigationRail({Key? key}) : super(key: key); @@ -16,24 +15,27 @@ class _CustomNavigationRailState extends State { @override Widget build(BuildContext context) { - return Row( - children: [ - _NavigationRailDemo( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) - ], + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + _NavigationRailDemo( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), + ], + )) + ], + ), ); } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart index db76710a..0f3d350f 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node2_extend.dart @@ -1,15 +1,14 @@ - import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com - class ExtendableNavigationRail extends StatefulWidget { const ExtendableNavigationRail({Key? key}) : super(key: key); @override - State createState() => _ExtendableNavigationRailState(); + State createState() => + _ExtendableNavigationRailState(); } class _ExtendableNavigationRailState extends State { @@ -17,25 +16,28 @@ class _ExtendableNavigationRailState extends State { @override Widget build(BuildContext context) { - return Row( - children: [ - ExtendableNavigation( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + ExtendableNavigation( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), ], - ); + )) + ], + ), + ); } void _onDestinationSelected(int value) { @@ -58,9 +60,9 @@ class _TestContent extends StatelessWidget { Widget build(BuildContext context) { return Center( child: Text( - content, - style: const TextStyle(fontSize: 26), - )); + content, + style: const TextStyle(fontSize: 26), + )); } } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart index 0b4cee95..fe234ed5 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/node3_dark.dart @@ -1,8 +1,5 @@ - import 'package:flutter/material.dart'; - - // minWidth: 72, // minExtendedWidth: 200 , // unselectedIconTheme: const IconThemeData(color: textColor) , @@ -13,8 +10,6 @@ import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2022/7/23 /// contact me by email 1981462002@qq.com - - class DarkNavigationRail extends StatefulWidget { const DarkNavigationRail({Key? key}) : super(key: key); @@ -27,24 +22,27 @@ class _DarkNavigationRailState extends State { @override Widget build(BuildContext context) { - return Row( - children: [ - DarkExtendableNavigation( - onDestinationSelected: _onDestinationSelected, - ), - Expanded( - child: PageView( - controller: _controller, - children: const [ - _TestContent(content: '消息'), - _TestContent(content: '视频会议'), - _TestContent(content: '通讯录'), - _TestContent(content: '云文档'), - _TestContent(content: '工作台'), - _TestContent(content: '日历'), - ], - )) + return Scaffold( + appBar: AppBar(), + body: Row( + children: [ + DarkExtendableNavigation( + onDestinationSelected: _onDestinationSelected, + ), + Expanded( + child: PageView( + controller: _controller, + children: const [ + _TestContent(content: '消息'), + _TestContent(content: '视频会议'), + _TestContent(content: '通讯录'), + _TestContent(content: '云文档'), + _TestContent(content: '工作台'), + _TestContent(content: '日历'), ], + )) + ], + ), ); } @@ -68,9 +66,9 @@ class _TestContent extends StatelessWidget { Widget build(BuildContext context) { return Center( child: Text( - content, - style: const TextStyle(fontSize: 26), - )); + content, + style: const TextStyle(fontSize: 26), + )); } } @@ -81,7 +79,8 @@ class DarkExtendableNavigation extends StatefulWidget { : super(key: key); @override - State createState() => _DarkExtendableNavigationState(); + State createState() => + _DarkExtendableNavigationState(); } class _DarkExtendableNavigationState extends State { @@ -114,9 +113,9 @@ class _DarkExtendableNavigationState extends State { @override Widget build(BuildContext context) { - const Color textColor = Color(0xffcfd1d7); - const Color activeColor = Colors.white; - const TextStyle labelStyle = TextStyle(color: textColor,fontSize: 11); + const Color textColor = Color(0xffcfd1d7); + const Color activeColor = Colors.white; + const TextStyle labelStyle = TextStyle(color: textColor, fontSize: 11); return NavigationRail( leading: buildLeading(), @@ -127,9 +126,9 @@ class _DarkExtendableNavigationState extends State { elevation: 1, backgroundColor: const Color(0xff324465), minWidth: 72, - minExtendedWidth: 200 , - unselectedIconTheme: const IconThemeData(color: textColor) , - selectedIconTheme: const IconThemeData(color: activeColor) , + minExtendedWidth: 200, + unselectedIconTheme: const IconThemeData(color: textColor), + selectedIconTheme: const IconThemeData(color: activeColor), unselectedLabelTextStyle: labelStyle, selectedLabelTextStyle: labelStyle, trailing: const Expanded( diff --git a/pubspec.lock b/pubspec.lock index 768b46b2..baa1f63c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -425,10 +425,10 @@ packages: dependency: "direct main" description: name: fx_dio - sha256: "480b529e516c1eb24bef3671761fad84c79e31384d393a7d1d4280d3dcfab2cb" + sha256: "1d4818360a9251d6d0664d017f6d51f363db259ea5debdd0294a9af46f1cea9d" url: "https://pub.dev/" source: hosted - version: "0.0.4" + version: "0.0.4+2" fx_go_router_ext: dependency: "direct main" description: @@ -449,10 +449,10 @@ packages: dependency: "direct main" description: name: fx_trace - sha256: bba16febf583d4464cd5cae11bd19d441c82d9ca6a7d9bb71c05cae7379a619a + sha256: a1fb64b1a6bfc53609fe55e6d56a9c00e76250818eb5a8cfac280a051e33911c url: "https://pub.dev/" source: hosted - version: "0.0.3" + version: "0.0.5+5" go_router: dependency: "direct main" description: @@ -1121,6 +1121,14 @@ packages: url: "https://pub.dev/" source: hosted version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev/" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c0d0a4d4..e09b1db6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,7 +47,7 @@ dependencies: fx_dao: 0.0.1+2 # 数据库 fx_dio: 0.0.4+2 fx_boot_starter: 0.1.1 # app 启动器 - fx_trace: 0.0.3 # 异常追踪/监听 + fx_trace: 0.0.5+5 # 异常追踪/监听 # 数据与持久化 dio: ^5.4.3+1 # 网络请求 From f633ebac47f2bd25ffa8f2e4fcb2d07ff543f161 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 08:48:11 +0800 Subject: [PATCH 137/149] add widget logo --- .../images/widgets/FloatingActionButton.svg | 4 ++ lib/src/flutter_unit.dart | 43 +++++++++++-------- lib/src/l10n/locale_provider.dart | 7 +++ .../lib/views/components/widget_logo_map.dart | 38 ++++++++-------- 4 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 assets/images/widgets/FloatingActionButton.svg create mode 100644 lib/src/l10n/locale_provider.dart diff --git a/assets/images/widgets/FloatingActionButton.svg b/assets/images/widgets/FloatingActionButton.svg new file mode 100644 index 00000000..dfe23295 --- /dev/null +++ b/assets/images/widgets/FloatingActionButton.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 20e5b21a..49200d7e 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -11,6 +11,7 @@ import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:note/note.dart'; import 'l10n/gen/app_l10n.dart'; +import 'l10n/locale_provider.dart'; import 'navigation/router/app_route.dart'; /// create by 张风捷特烈 on 2020/4/28 @@ -24,7 +25,7 @@ class FlutterUnit3 extends StatefulWidget { State createState() => _FlutterUnit3State(); } -class _FlutterUnit3State extends State { +class _FlutterUnit3State extends State with LocalProvider { final GoRouter _router = GoRouter( initialLocation: AppRoute.splash.url, routes: [appRoute], @@ -39,42 +40,31 @@ class _FlutterUnit3State extends State { _initWeb(); } - void _onLocaleChange(BuildContext context, AppConfig state){ - BlocProvider.of(context).changeLocale(state.language.locale); - } - @override Widget build(BuildContext context) { AppConfig state = context.watch().state; ThemeData dark = darkTheme(state); ThemeData light = lightTheme(state); - return BlocListener( - listenWhen: (p,n)=>p.language!=n.language, + return BlocListener( + listenWhen: (p, n) => p.language != n.language, listener: _onLocaleChange, child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), child: TolyMessage( themeMode: state.themeMode, darkTheme: dark, - theme:light, + theme: light, child: MaterialApp.router( routerConfig: _router, showPerformanceOverlay: state.showPerformanceOverlay, title: StrUnit.appName, debugShowCheckedModeBanner: false, - localizationsDelegates: const [ - AppL10n.delegate, - AppLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - FlutterQuillLocalizations.delegate, - ], - supportedLocales: l10nLocales, + localizationsDelegates: localizationsDelegates, + supportedLocales: supportedLocales, locale: state.language.locale, themeMode: state.themeMode, darkTheme: dark, - theme:light, + theme: light, ), ), ), @@ -86,4 +76,21 @@ class _FlutterUnit3State extends State { GoRouter.optionURLReflectsImperativeAPIs = true; context.initWidgetData(); } + + void _onLocaleChange(BuildContext context, AppConfig state) { + context.read().changeLocale(state.language.locale); + } + + @override + Iterable? get localizationsDelegates => const [ + AppL10n.delegate, + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, + ]; + + @override + List get supportedLocales => l10nLocales; } diff --git a/lib/src/l10n/locale_provider.dart b/lib/src/l10n/locale_provider.dart new file mode 100644 index 00000000..7c631ee7 --- /dev/null +++ b/lib/src/l10n/locale_provider.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +mixin LocalProvider { + Iterable>? get localizationsDelegates; + + List get supportedLocales; +} diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart index 9c49bf5f..9400f5df 100644 --- a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -15,24 +15,25 @@ class WidgetLogo extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - width: 110, - height: 110, - alignment: Alignment.center, - decoration: BoxDecoration( - color: background, - gradient: LinearGradient( - transform: const GradientRotation(270 * 180 / pi), - colors: [ - background.withValues(alpha: 0.9), - background.withValues(alpha: 0.5) - ]), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), - ), - child: - SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}',width: 90,), - + return Container( + width: 110, + height: 110, + alignment: Alignment.center, + decoration: BoxDecoration( + color: background, + gradient: LinearGradient( + transform: const GradientRotation(270 * 180 / pi), + colors: [ + background.withValues(alpha: 0.9), + background.withValues(alpha: 0.5) + ]), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), + ), + child: SvgPicture.asset( + 'assets/images/widgets/${widgetLogo(widgetName)}', + width: 90, + ), ); } } @@ -54,6 +55,7 @@ String widgetLogo(String widgetName) { 'MaterialButton' => 'MaterialButton.svg', 'FlutterLogo' => 'FlutterLogo.svg', 'RichText' => 'RichText.svg', + 'FloatingActionButton' => 'FloatingActionButton.svg', 'Banner' => 'Banner.svg', 'Icon' => 'Icon.svg', _ => 'Widget.svg', From bccd62a2c41cd79cfe4ad46988e0d1317eb2b8ce Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 09:35:26 +0800 Subject: [PATCH 138/149] up to flutter 3.29.x --- .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-a012ed7e292a952c6e51.json | 1367 +++++++++++++++++ .../cmakeFiles-v1-dabd9aed57aedc8ee77b.json | 799 ++++++++++ .../codemodel-v2-108dda1a979928b8171a.json | 43 + ...irectory-.-Debug-d0094a50bb2071803777.json | 14 + .../reply/index-2025-04-20T01-10-38-0489.json | 92 ++ .../Debug/1n4a7033/arm64-v8a/CMakeCache.txt | 401 +++++ .../CMakeCCompiler.cmake | 72 + .../CMakeCXXCompiler.cmake | 83 + .../CMakeDetermineCompilerABI_C.bin | Bin 0 -> 7936 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8096 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 + .../CompilerIdC/CMakeCCompilerId.c | 803 ++++++++++ .../CompilerIdC/CMakeCCompilerId.o | Bin 0 -> 6000 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ++++++++++ .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 0 -> 6016 bytes .../CMakeFiles/TargetDirectories.txt | 2 + .../arm64-v8a/CMakeFiles/cmake.check_cache | 1 + .../1n4a7033/arm64-v8a/CMakeFiles/rules.ninja | 45 + .../arm64-v8a/additional_project_files.txt | 0 .../arm64-v8a/android_gradle_build.json | 28 + .../arm64-v8a/android_gradle_build_mini.json | 20 + .../.cxx/Debug/1n4a7033/arm64-v8a/build.ninja | 111 ++ .../1n4a7033/arm64-v8a/build_file_index.txt | 1 + .../1n4a7033/arm64-v8a/cmake_install.cmake | 54 + .../arm64-v8a/configure_fingerprint.bin | 28 + .../arm64-v8a/metadata_generation_command.txt | 20 + .../1n4a7033/arm64-v8a/prefab_config.json | 4 + .../arm64-v8a/symbol_folder_index.txt | 1 + .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-2cf3899b2994a50f6472.json | 1367 +++++++++++++++++ .../cmakeFiles-v1-5b36d7a0891fdde7d468.json | 799 ++++++++++ .../codemodel-v2-6500251f75d592877858.json | 43 + ...irectory-.-Debug-d0094a50bb2071803777.json | 14 + .../reply/index-2025-04-20T01-10-53-0270.json | 92 ++ .../Debug/1n4a7033/armeabi-v7a/CMakeCache.txt | 401 +++++ .../CMakeCCompiler.cmake | 72 + .../CMakeCXXCompiler.cmake | 83 + .../CMakeDetermineCompilerABI_C.bin | Bin 0 -> 5772 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 5928 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 + .../CompilerIdC/CMakeCCompilerId.c | 803 ++++++++++ .../CompilerIdC/CMakeCCompilerId.o | Bin 0 -> 4096 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ++++++++++ .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 0 -> 4136 bytes .../CMakeFiles/TargetDirectories.txt | 2 + .../armeabi-v7a/CMakeFiles/cmake.check_cache | 1 + .../armeabi-v7a/CMakeFiles/rules.ninja | 45 + .../armeabi-v7a/additional_project_files.txt | 0 .../armeabi-v7a/android_gradle_build.json | 28 + .../android_gradle_build_mini.json | 20 + .../Debug/1n4a7033/armeabi-v7a/build.ninja | 111 ++ .../1n4a7033/armeabi-v7a/build_file_index.txt | 1 + .../1n4a7033/armeabi-v7a/cmake_install.cmake | 54 + .../armeabi-v7a/configure_fingerprint.bin | 28 + .../metadata_generation_command.txt | 20 + .../1n4a7033/armeabi-v7a/prefab_config.json | 4 + .../armeabi-v7a/symbol_folder_index.txt | 1 + android/app/.cxx/Debug/1n4a7033/hash_key.txt | 27 + .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-30ddb47aac1d117c5807.json | 1367 +++++++++++++++++ .../cmakeFiles-v1-49b5f472adf4076661e4.json | 799 ++++++++++ .../codemodel-v2-c3cbb398a65538641212.json | 43 + ...irectory-.-Debug-d0094a50bb2071803777.json | 14 + .../reply/index-2025-04-20T01-10-57-0300.json | 92 ++ .../.cxx/Debug/1n4a7033/x86/CMakeCache.txt | 401 +++++ .../CMakeCCompiler.cmake | 72 + .../CMakeCXXCompiler.cmake | 83 + .../CMakeDetermineCompilerABI_C.bin | Bin 0 -> 5724 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 5864 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 + .../CompilerIdC/CMakeCCompilerId.c | 803 ++++++++++ .../CompilerIdC/CMakeCCompilerId.o | Bin 0 -> 3880 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ++++++++++ .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 0 -> 3916 bytes .../x86/CMakeFiles/TargetDirectories.txt | 2 + .../1n4a7033/x86/CMakeFiles/cmake.check_cache | 1 + .../Debug/1n4a7033/x86/CMakeFiles/rules.ninja | 45 + .../1n4a7033/x86/additional_project_files.txt | 0 .../1n4a7033/x86/android_gradle_build.json | 28 + .../x86/android_gradle_build_mini.json | 20 + .../app/.cxx/Debug/1n4a7033/x86/build.ninja | 111 ++ .../Debug/1n4a7033/x86/build_file_index.txt | 1 + .../Debug/1n4a7033/x86/cmake_install.cmake | 54 + .../1n4a7033/x86/configure_fingerprint.bin | 28 + .../x86/metadata_generation_command.txt | 20 + .../Debug/1n4a7033/x86/prefab_config.json | 4 + .../1n4a7033/x86/symbol_folder_index.txt | 1 + .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-03a6b8ac64bbf73cab21.json | 1367 +++++++++++++++++ .../cmakeFiles-v1-ee9fafa3848df046dfd5.json | 799 ++++++++++ .../codemodel-v2-9d7f262ebd04583f9e90.json | 43 + ...irectory-.-Debug-d0094a50bb2071803777.json | 14 + .../reply/index-2025-04-20T01-10-58-0611.json | 92 ++ .../.cxx/Debug/1n4a7033/x86_64/CMakeCache.txt | 401 +++++ .../CMakeCCompiler.cmake | 72 + .../CMakeCXXCompiler.cmake | 83 + .../CMakeDetermineCompilerABI_C.bin | Bin 0 -> 6944 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 7104 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 + .../CompilerIdC/CMakeCCompilerId.c | 803 ++++++++++ .../CompilerIdC/CMakeCCompilerId.o | Bin 0 -> 5376 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ++++++++++ .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 0 -> 5424 bytes .../x86_64/CMakeFiles/TargetDirectories.txt | 2 + .../x86_64/CMakeFiles/cmake.check_cache | 1 + .../1n4a7033/x86_64/CMakeFiles/rules.ninja | 45 + .../x86_64/additional_project_files.txt | 0 .../1n4a7033/x86_64/android_gradle_build.json | 28 + .../x86_64/android_gradle_build_mini.json | 20 + .../.cxx/Debug/1n4a7033/x86_64/build.ninja | 111 ++ .../1n4a7033/x86_64/build_file_index.txt | 1 + .../Debug/1n4a7033/x86_64/cmake_install.cmake | 54 + .../1n4a7033/x86_64/configure_fingerprint.bin | 28 + .../x86_64/metadata_generation_command.txt | 20 + .../Debug/1n4a7033/x86_64/prefab_config.json | 4 + .../1n4a7033/x86_64/symbol_folder_index.txt | 1 + android/app/src/main/AndroidManifest.xml | 3 + lib/src/flutter_unit.dart | 22 +- lib/src/l10n/gen/app_l10n_de.dart | 2 + lib/src/l10n/gen/app_l10n_en.dart | 2 + lib/src/l10n/gen/app_l10n_es.dart | 2 + lib/src/l10n/gen/app_l10n_fr.dart | 2 + lib/src/l10n/gen/app_l10n_it.dart | 2 + lib/src/l10n/gen/app_l10n_ja.dart | 2 + lib/src/l10n/gen/app_l10n_ko.dart | 2 + lib/src/l10n/gen/app_l10n_pt.dart | 2 + lib/src/l10n/gen/app_l10n_ru.dart | 2 + lib/src/l10n/gen/app_l10n_zh.dart | 2 + lib/src/navigation/model/app_tab.dart | 5 +- .../view/desktop/toly_unit_menu_cell.dart | 7 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 + .../r_upgrade-0.4.2/android/.gitignore | 8 + .../r_upgrade-0.4.2/android/build.gradle | 3 +- .../com/example/r_upgrade/RUpgradePlugin.java | 26 +- .../src/navigation/view/algo_menu_cell.dart | 30 +- .../WidgetInspector/node1_base.dart | 6 +- pubspec.lock | 154 +- pubspec.yaml | 19 +- 147 files changed, 19389 insertions(+), 123 deletions(-) create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json create mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json create mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/hash_key.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/TargetDirectories.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/cmake.check_cache create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/rules.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/additional_project_files.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/android_gradle_build.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/android_gradle_build_mini.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/build.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/build_file_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/cmake_install.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/configure_fingerprint.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/metadata_generation_command.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/prefab_config.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86/symbol_folder_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/cache-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/cache-v2-03a6b8ac64bbf73cab21.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-ee9fafa3848df046dfd5.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/codemodel-v2-9d7f262ebd04583f9e90.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/index-2025-04-20T01-10-58-0611.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeCache.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json create mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt create mode 100644 modules/ability/r_upgrade-0.4.2/android/.gitignore diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json new file mode 100644 index 00000000..9a425870 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json @@ -0,0 +1,1367 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-21" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "22" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_ERROR_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue deprecation errors for macros and functions." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "C:/Program Files (x86)/Project" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\arm64-v8a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "Project" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\arm64-v8a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "21" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_WARN_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue warnings for deprecated functionality." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "Project_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a" + }, + { + "name" : "Project_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "Project_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json new file mode 100644 index 00000000..f5036e18 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json @@ -0,0 +1,799 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json new file mode 100644 index 00000000..46f55bc9 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json @@ -0,0 +1,43 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : "." + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "Project" + } + ], + "targets" : [] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 2, + "minor" : 3 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json new file mode 100644 index 00000000..3a67af9c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json new file mode 100644 index 00000000..b2135427 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", + "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", + "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", + "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + "version" : + { + "isDirty" : true, + "major" : 3, + "minor" : 22, + "patch" : 1, + "string" : "3.22.1-g37088a8-dirty", + "suffix" : "g37088a8" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-108dda1a979928b8171a.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + { + "jsonFile" : "cache-v2-a012ed7e292a952c6e51.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-dabd9aed57aedc8ee77b.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-a012ed7e292a952c6e51.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-dabd9aed57aedc8ee77b.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-108dda1a979928b8171a.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + } + } + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt new file mode 100644 index 00000000..50fb732c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt @@ -0,0 +1,401 @@ +# This is the CMakeCache file. +# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a +# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-21 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//Archiver +CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a + +//Path to a program. +CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Ranlib +CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Path to a program. +CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a + +//Value Computed by CMake +Project_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Whether to issue deprecation errors for macros and functions. +CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//Suppress errors that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE +//Suppress Warnings that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Whether to issue warnings for deprecated functionality. +CMAKE_WARN_DEPRECATED:INTERNAL=FALSE + diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake new file mode 100644 index 00000000..f831fa9b --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake @@ -0,0 +1,72 @@ +set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "17.0.2") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/aarch64;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake new file mode 100644 index 00000000..285b0a65 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake @@ -0,0 +1,83 @@ +set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "17.0.2") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/aarch64;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin new file mode 100644 index 0000000000000000000000000000000000000000..5fd2037eab16fe4f1c8ca35ca8bbc858dabe79a6 GIT binary patch literal 7936 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 literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake new file mode 100644 index 00000000..1b987ed4 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Windows-10.0.26100") +set(CMAKE_HOST_SYSTEM_NAME "Windows") +set(CMAKE_HOST_SYSTEM_VERSION "10.0.26100") +set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") + +include("D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "aarch64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 00000000..41b99d77 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,803 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..b4f6e7a2443451d6d2d734dd415bd2413e2d9491 GIT binary patch literal 6000 zcmd5=U2Ggz6+W};-K@Rtrj7|s>oncc01c{V_AlPGL9HX_r%pp0r41-p>1w0-h0k>zkANPzjK_&4jnrjGYsHjz%L=t7zJ3lIgqD?I1Rgzx%oK!X7di% zcz+Bw{*;DKHn+n@3gD@fG5yJ($IfpIHX4=d+ov~D#$fvTf6+&_e7kVre`WK1j0@wx za5Y|iXZHBvxv5&GwbE!h?)*&CZZDky0j@M{Z?WUH=8rYntLqZ9-P-cJl)IkYuG?r}PFkRW$ZnvhoLo7eqDe`w?-dj93z&d0k>UM#f`?^%h)>{yD%(z(}L`;ZDJsG1^ZI8 zd~l#$cRP)G_U?SXSeh&pD)(d;?52y1*Zp|_A(pg@o)2uDqjkeWnuC>Nj+|JjXnwPClE>aKbJ2!`)j$$(&YZd;zBX!)SP0yP@E|2gPAYeXPucDd4Ff?W(^KbStoouUF&dj z)$<(JI@0i#R~J}4)oyqklVz{0SY~Z~-8$$jtS(vkcF8X1ibczITN9=6wTf*CABXXM z=vqayP%!i3OT}`oQn4%J^@i&`Vg>GJ0B7SuwR+&>$pfdW56*t=Q1zkHCk|Ds&}c7q zs{GLSnp`el;pfKJ=$-K;TG&;4$*Jnkjn*B0bD)I_i!2Xpcd16z8o186)rRZ*zi%r5 ze|C&VPlEBSJ;vDZ9YE(;oMmk3oWsFPHg+{b5FmS5EpYLc z_TgQDr}{8bmIXc-!fOJ@Plr|>7WhpX3UFHB+e0`3aTp2V4+(x4pA-0w5Z|}+sSy5* z;D_)HUl;f-A>6l*A3d$K1V4S$8ioYxHV4WF{q5TmE z)|v622|jB81=OjW!rur4>(7jR0uR=oabB5G^z&&lAPe8SJsO^q{lr&SsU&gYtN1a6 z&o&7wQ4*iAZXeqsDssq>x^jyYPd@R~56 z&J&eAek0=Py_Sga{&Jj>2D4INI~Mw(!t-FfB=N8M-N5+$60b{~>~qWneM94aMe=#y ziLaiMA1iifzj$9RYj*ti3*cpiub$gqD>&KVef*Cxp>qgko$|J-y|CaqYhZeq2La`lEe8`H({-A* zS+_mg6!}*#nTp7kw&aEqFX^)DxgiI=1W#HMv5{+Jc7ixK^Yd90vni4_J%(OVXtq0^ zV;(tvY8<1foelXF`J(Ex*=ReG^{<>c5mIBq^d$ynW_n@ z_ES}&Dqo~pRQUplqRQt*UvH9VHE;S@4)(5_Ik|iPd2=70hp24lnxFo`i}L)i2Tc`k zBVqiGGH;p%t))AqmS3Ur@5WzK$tdgNUzgal#@jXI1ANcvZqhvYd(3ag570UJ=kK~d zivAAvCH_t_E@3f-uqW_Gn7)R7eiQg3E*19gYXFa-Ky#XAK(-Z`ig271Kdmv3XZ$6^ z$iI50QHAp|P<>t;KXIu14u4VczbuLDPmr7Ipu3ZQ=jz8}v_kMAZ6UjPOr+jP9S@NLMHY z<@XZ&Q2+@^=RSj|juEjd59BYjPECc2$c>8sij4odv_t2gaxXo84>7W-zl8h9D3*6L zhpci-c}vvzP5CF?bHYkc@i=ZjkmCb}FFmV2h?2nLnEx3B2-ENHB{^Q77tf!^-;RT$ z*6*Txzxkfg`cdA+;~5{3{@EV4Z%h9_Wk9wRt6GM)@P8%3Kjn|Qf6A-$xs&~M@qdK? Nmt-gTrM=R}{|inga~l8v literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 00000000..25c62a8c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,791 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..e9198e068ace14e81d10a93d4e0d04362ba24779 GIT binary patch literal 6016 zcmd5=Yiu0V6+W}$b?mIOiDLpOj=~}WN-8}2w0G@PsiQo=Avjh@q<|AGWzHwIp6)x<38tZ?mKk!aKtcxive#ypfL)tvL%qmg*Xm7kh%6V`19ITu=?R3 ztbP=OFV{B1Y7fA}J;wN#e;-^~?X6S_pKcys?J;^|pMFap@qJr3_g(D1Dc*+|8*@DO zmRWpfV)F2@u~L1ZQK>ra^nt2fn>zynY*cM;w(c%WAFb3DmnCSsrTJ+oH$A&nw%u~E z?9AGWRc|_-mp#t1=hT{&dac>&J2rVHn5=J++Hxu`IWD=HPKlDvTfUG=v5+|fM!#`w zd?0GZw_Gt8?>Dw~14ME#F)$X}8;xuSFb!j30HEt?#PTtK=yfOnbngN)zAqL-WCMw@ z*gh0{awtv={P+iK-Md+^H~P4b*5Uv$3*&C>9^Y=p2_zGMz9>Xm0KlePn+mVvM(Psd z?-5(->d?8kfN11LSQ+;ly(Ux48&T>yfz>vM-i!?n6Vo*|h-L#WIlx)`YcuL4Bj48_ zBZ04gtfG;Z$ox+VFNoO(fsM+Dd_p!KhuU1J*r<%ib{xF%d8o|}#YSap#4vDz?4D5U z2n=$}0Ir{3XbO!w$;MjbJeu`I&f!i_RdIZ=_eJd86gk%?dJU7v{?tahdS6AQm*yJw z*UE0aQcmnnr?a`yOr~&sV#aPd9vK-Yq@7*M?JXgVX}GO~aZjvNnccdkU$ z61dLU#ft0vzb`j!NZ`+parbdB?%8P!_FV~EN20MK(RlZ76m78kw}@cJ zMQqIY#pqBQG1<~KBGK%Q9f|Z{CLAH8eGIWK_-rkt3rzf{mkYvKC;m1Pjn=FIWE4Xa zqKf8=j|e}V_|F9{F5fnrdju|S$u|6~z{UO5hF1kHuAMe~PT>BUwRNCkD*1EYjNtQb zVAO9-=x+y5J0tj=_$h&J?cft&!et%!bAsQA|5D)FI`}^k_!S*E0Vd$LQ!7h?---Vf zd0Ulr7yBHsU*KQAe{%~@yb}KvIBWRD6ukf^1s=>l<9h@i%s=BhF`s@2){$|ZfdTC2 zvqvFVCOei1Pf>-1`0D6#J`BWH@hOQDKgbq8h7#YV;qwarN-0xQl`{EP@%trC{s*N@ z%>z;uSlHytNUj~ z!D;?^3=c}2{hyY8ey#A;eRW>J$q%o~?=(MmNI!p2_&cOb&HD;Yes~=}lQ`$&Nk3mH ze4cZHw#a^-PhR(HCC+|+CH0KLSNG>$jZbelDmN;8^&CxU{NGF6R`}|=*ERlMq<*i4 zzc2NNH2fo}KcV4&llt=-{;t${&ZDTS`Rw(FC(fOUgH@(yT+yDHah)ZwJbWPmJvSE| zeDheYQ?;$K?b()i6t$jNA@8VlxgAe38M5iQ9RXUey>;HIGKff-GC~J+kzVJ+&8O0M zEb)fZ^J_gNtyLHJ3Dd`uS_*?wNi5=%b73Ey7mI9I2zBM!S=2NYIl{b zQK|}5<*6E>YM81VRp~6%qDp5-6jeGc`dY(6uW8H2Qm|{;;?IIy&F|mPKJR?}0K6?P z&6nkV;s}}wo3Vp1zHgZ~&VttZzh?vR0~Ei>{z5<%l5YPVqJ)i$-k?g!Pw#&uL}#AH z$=_kVBOk@!6kmPck;y-)!ouG{U-P*nlMNO69+Irjq5nP#;t`h$$M-dW`%nnWKOujd za-Nhw%`w|E{%^#>;@>V4WIobF(e-~I8Wz705}$0@p5u!j=ZNd$pTETT^o|INKNS+6 zmQ;^_46(5BH!d;$5ws7BKOYjGz5{yvYu1Use2MYty$}|EB_uu_Nj?5sGJe}#j@XKf zukULKBf~GG>lpRCBEc7YTC3K%uVRmm5&5)C=%UuCsqi9l!^Z!Z96xU?+W+)M)5q^2 zMn3fm@p5vCEk|6zxOjPu|~rPHFz=*A&|`J|yF_KW^WZ@thbA4rH`FL REsOuC1b9<+QrxiozXq3UcfJ4s literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 00000000..4bdaf849 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,2 @@ +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/edit_cache.dir +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000..3dccd731 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja new file mode 100644 index 00000000..89d02a41 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja @@ -0,0 +1,45 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets + description = All primary targets available: + diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json new file mode 100644 index 00000000..e0b2c452 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json @@ -0,0 +1,28 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {}, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", + "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json new file mode 100644 index 00000000..1b93826a --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json @@ -0,0 +1,20 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {} +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja new file mode 100644 index 00000000..2694fce2 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja @@ -0,0 +1,111 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/ + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a + +build all: phony + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt new file mode 100644 index 00000000..7fba5c85 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt @@ -0,0 +1 @@ +D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake new file mode 100644 index 00000000..74f867b8 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin new file mode 100644 index 00000000..ffae4add --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logq +o +mD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  �����2n +l +jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\android_gradle_build.json  ��Ć�2� �����2s +q +oD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\android_gradle_build_mini.json  ��Ć�2� é���2` +^ +\D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build.ninja  ��Ć�2�� ����2d +b +`D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build.ninja.txt  ��Ć�2i +g +eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build_file_index.txt  ��Ć�2 b ȩ���2j +h +fD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\compile_commands.json  ��Ć�2n +l +jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\compile_commands.json.bin  ��Ć�2 t +r +pD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\metadata_generation_command.txt  ��Ć�2 +� Ʃ���2g +e +cD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\prefab_config.json  ��Ć�2  ( ǩ���2l +j +hD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\symbol_folder_index.txt  ��Ć�2  _ ǩ���2f +d +bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt new file mode 100644 index 00000000..af2597ed --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt @@ -0,0 +1,20 @@ + -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=21 +-DANDROID_PLATFORM=android-21 +-DANDROID_ABI=arm64-v8a +-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a +-DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a +-DCMAKE_BUILD_TYPE=Debug +-BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a +-GNinja +-Wno-dev +--no-warn-unused-cli + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json new file mode 100644 index 00000000..e799de86 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt new file mode 100644 index 00000000..acb205f8 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt @@ -0,0 +1 @@ +D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json new file mode 100644 index 00000000..74d3ea5c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json @@ -0,0 +1,1367 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-21" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "22" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_ERROR_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue deprecation errors for macros and functions." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "C:/Program Files (x86)/Project" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\armeabi-v7a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "Project" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\armeabi-v7a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "21" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_WARN_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue warnings for deprecated functionality." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "Project_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a" + }, + { + "name" : "Project_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "Project_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json new file mode 100644 index 00000000..c605976e --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json @@ -0,0 +1,799 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json new file mode 100644 index 00000000..6cadbacb --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json @@ -0,0 +1,43 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : "." + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "Project" + } + ], + "targets" : [] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 2, + "minor" : 3 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json new file mode 100644 index 00000000..3a67af9c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json new file mode 100644 index 00000000..c9e04316 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", + "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", + "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", + "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + "version" : + { + "isDirty" : true, + "major" : 3, + "minor" : 22, + "patch" : 1, + "string" : "3.22.1-g37088a8-dirty", + "suffix" : "g37088a8" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-6500251f75d592877858.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + { + "jsonFile" : "cache-v2-2cf3899b2994a50f6472.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-5b36d7a0891fdde7d468.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-2cf3899b2994a50f6472.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-5b36d7a0891fdde7d468.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-6500251f75d592877858.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + } + } + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt new file mode 100644 index 00000000..dcfb59a5 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt @@ -0,0 +1,401 @@ +# This is the CMakeCache file. +# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a +# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-21 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//Archiver +CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a + +//Path to a program. +CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Ranlib +CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Path to a program. +CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a + +//Value Computed by CMake +Project_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Whether to issue deprecation errors for macros and functions. +CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//Suppress errors that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE +//Suppress Warnings that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Whether to issue warnings for deprecated functionality. +CMAKE_WARN_DEPRECATED:INTERNAL=FALSE + diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake new file mode 100644 index 00000000..4cc8597b --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake @@ -0,0 +1,72 @@ +set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "17.0.2") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/arm;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake new file mode 100644 index 00000000..cde60825 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake @@ -0,0 +1,83 @@ +set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "17.0.2") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/arm;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin new file mode 100644 index 0000000000000000000000000000000000000000..b2a64d599b9cdb1c57025b3d4d9d6a8eba81265c GIT binary patch literal 5772 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..26ae39ed31ad491e92b4cc42eeff117add418400 GIT binary patch literal 4096 zcmd5r8|>bH@mCUUANu3(i_#{Wn0ooX0jWbP14C^ zO`%nhB8m$20$LP(P!aK^3i={NQ4moOAARrw`rwm@iXte~@1LBLosF&d=vmJBZ{PX< z|J?q`KDc}DtfD9+n?fVBA`y+me2bp-$p~Eo>zVWFEG4wF>eI?obavxytzERJo|`^G z&qsIB*(W2==VvNbb>S%a%6i4}N;P+Bes8(jYzd|178mCQ-|(!eZMk;dc1l*W;?1XW z!s4_%r`jmjs*R5A!2Y9t%vJI7%Z|&i`J~@cIit-alafjEtaa!&qK}~;L{|os>*7PY z7VlrbIX<8ahKbZH%?(Y)Zqn5aM4F<^4H1Q|g)WD4(6^En-x-U64Ko{y?F1Xif}I<> zWuu%H?E{`@%{HI(7zi^Mp4ybn?}uOacqYEu~enY|QgNGw~SC-plF%CC_409LS@C~{h2 zf05WYG|F#~_@Gv>!xVW@V%Z8K_3*&kq1<(WXGOI-NK8E){dkoa`m8P957MiirY~5G z`C!sNgrJ9_r$C}p>~OkjyS1{N7)hlv*@<*|e0!o`H5@xpt0vs+crKUCIX5JVe9;r) z`X%_{8R^8xqUY5clctG#%|48UT5X}?G-^$^=ook;rdO*~ii=jcYE~-COQUtScAr!9 z681!Ce4>=KQ)6Re8GA=Em3DR%lM~sA9i>bmlXQws#!hF((l^k|KI^zMGb7&HoNW|o z*Q9x{?WbYRR+^sYxaOX+x7aL5@o=^5$(&59UN?S$sw1lk%$|K8NDDtpO zu5+SUc5$`;-v>K=6YieHCqPOH>`dB7PEfcfG96Xcs6AS*5~n_;Ul~vbLsuy4XuY;U z*{Ez%wng-|+_Q}N!lkXa`izmZ$x{qzcG$ghO>^86WJOCY%S#P8u!H_M-| zt4y@V!ipa0c~6g<`f#|U#|=GZ=<)DEm$ac{+Zc1%3Y>_|NTYT=ln zeS5Nm>Kphb`tdOw;3P#0(a#qp&s4+TBLO>WT*zJrwT zzBnzYwcd8s)^NxVu^cBl!?cg+QKsVHZ}g81#aD+C?cXTAf23l7Yf`a2gM#u-sB6gI z0oGs5GW;f)!tb=e@oxjR9}x5iQ{;PG$eg!|JfCKYdAwhYf0ZeMzAf}03H=vLvA%DF z{wJa5eO0l}9_%Ok*~}DvMwnvVqfC)sPUvR^JuIj#=m|mbsV6l`G|ZIe2}*{|wJ~oM z3a+zEhKEW+T)&qblorEvDu!)&mf;t;PPMv3Il3J5ABD}BKD5uUJkKo`nx4~;2{b&n zJ6xxpwtf3~avs3dR+5r+)(5d~r&YFF{z44DM*0R`S3q2u-l@z+wdOg-p8bbMk#g~P zcQSs>4kS`3R~>=z6Dzsal5?rbVqj&SRUo5ra*63y+emd*09y*;R?pyz_8(gTXBvFz zFXG-l4xMb0#r5&uF5h`>?cdjJo=1Lj+Tt|8n$L9h5+dte*)rv#O8 zvQWxcjFkM7;Dd4PKwOS5+i zjRbJ=PV59OxZX1m`hny1@)upMH{IpWgTL1U{$yOE%ipu`hb{E|@%KaeyAL?|HrUND PzEAxk2LHptIL_m5@|;Lt literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 00000000..25c62a8c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,791 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..a1587aa328e81e519bed7a714803628051b95f9c GIT binary patch literal 4136 zcmd5^_LBAP zc6QcsR1gu0asm;m0EtA)1uj(&Q3YIzRHXLUR;tuqdf?DX2q6x@6`}C^-oCe<-PBc& zeb#%w_x*Xl_q~7LtY1B~x~yp$siM&&?Mg&zDPb`S0w(DvuwK2bFH_pMuK!Ydi>@Df zYG;Wy^;-)s(9OgWT^}Ei^;;G+$~rP&9UhSBX6$zBH2q->^DUuHquQuPQMuf{ZCqJ7 zyZrQArMcCr)%{?7vFTXzV23zZ^wMJ)0D&3&6xi0(d&~12b;FUbT>UQek zdbTJn{!ZvO+O=k*-LpM?_M({c5ZXskITntqZ~oG@AMmjCj40Wn-R)#Ds*}4&+L-o` zb-*;N(R=T=#RpD-*|@(`jClk}c~XkVdEq}OoxF{}}- zxCRf>uZ2YPvBVu9f+y0hYNo+TV;)Ux70n?sPXXdZj7?}mk1-4-)&M@#y#d4Xkh&ay z(M^N*H}Rr!Vht3e-$bMR6%y~gF^@*fF+z#D@?|UZr2h$x_Af|$M!UX;DY315*(!X$ zVc+i{@mcQr9-+kB%9pL|oBRZtW2oADQu9X$#ym_SmK@V4nPRa}^dCuA_~xhO{Y&%BvvcXm%`j}W=NtzYojL4{W^<$Nx0{`y;@fyNPS|YL zE1Pbu;neHfTT`u|`I27=)81@#X0}@JveVPkdGACfoAXapGP8x*6V-ezy$41Lt%t-0YN<_*|nFs<<4t)pG30 z&W^L>mpdCywo!14nS9=HgDu}J*QU0Mt|Mkz#xrj_c{`W0vr`-SVrFK>otg4#L3r8O z4FT~GRuxdGv~cd+!uirOD;G|co;|;Is#Ky{quMN~jM0@;s_06bBf34_(~i60mj+YC zfcfrx(RGl=L8S|;*_@bHX|}NC@CnHcHY(g~Q{ex+Qw#7m{=W}=;Uw;)%cnwG7Tv|1 zotdS0a%dr;4eLo`M6+nWHmZ&3qoVR`F@Y0-a&~WvuH0{Bm1Nd zAPPU9C#_Ms1&oPok1x{q);>HC@nr&sw%4T-1g6el+%YwCDEWKSa?B&~s%hC~$~LX| zMnt+lz6lKsFvkt6YEJbzIz1@~MB0Gaj1n{< zNi9$xc3@DF^BSYrKr;y8k zLw3;<$f}IPBzB6CSF9re^GaEMfDybIMhse(`ZE%rmFO}ePL7BDE=&D2M#OzX>iK+` z_jinAM4w6h-=zL?My%^=ssBOhlh_v>>)g+X@kbbOoM|a%84>46DgRXBd5N16I}#_D zHwhj_9w(7(k5gyKEtdm-o9qxdi8#e?`N%SM;MZ->4P9GgpRY~ z?S^4cD|bS_tpaF=!QgbgWV^@5qC2GspTooOrik_Kv?)A!UVo?N?TAI%B9#gQuQ?*_ zuD6%p?M5^7?bBzUo5FG`mj(kBnLiRuz1HxhkBF`sxLZ(QiJ@BtUfyCn=Goa^%&=u4 z9t&;0dH-9vgtHYtF{JyaxFcsi%SWi3 zA5`JkxxOV)&69>w&BeZ|{|5Ted0&pq%k!&sjLUfyAODzB98o?C`Y7Mk2p^tak8f^( zZ*mX5=>fjiBYd34RD7J9;M&{Q<9qO}z$Y5tjR+r7R*&!K0AFSgK0co)-+K{0PSGm9 zKTAHO9Z?G4Q)kEuj-3mm>a$#h@Eh*PqHLc*R(&>&g7{iQp}L>K7LD%%#K!|U?t`c* zKE9tkM!mduaM0f<5@}UBl&kA39ao#+84tFsky9dU#TyYyo6U)r$H(rUan! z<9};ZpUoclCL@08E?$6B-+CeNIq-V<`=-`=c7X47@ck;nr{>~sN|f&-2)u>N$KMgf U*M^@uTc$ZKzf;Vk?kUIdBlB=k^8f$< literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 00000000..f4e48dcc --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,2 @@ +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/edit_cache.dir +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000..3dccd731 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja new file mode 100644 index 00000000..00521143 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja @@ -0,0 +1,45 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets + description = All primary targets available: + diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json new file mode 100644 index 00000000..bd526cfe --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,28 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {}, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", + "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 00000000..bb5195c0 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,20 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {} +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja new file mode 100644 index 00000000..f3886c26 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja @@ -0,0 +1,111 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/ + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a + +build all: phony + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt new file mode 100644 index 00000000..7fba5c85 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt @@ -0,0 +1 @@ +D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake new file mode 100644 index 00000000..85890007 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin new file mode 100644 index 00000000..316badc3 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logs +q +oD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  ����2p +n +lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\android_gradle_build.json  ��Ć�2� ����2u +s +qD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\android_gradle_build_mini.json  ��Ć�2� ����2b +` +^D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build.ninja  ��Ć�2˫ �����2f +d +bD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build.ninja.txt  ��Ć�2k +i +gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build_file_index.txt  ��Ć�2 b ����2l +j +hD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\compile_commands.json  ��Ć�2p +n +lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\compile_commands.json.bin  ��Ć�2 v +t +rD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\metadata_generation_command.txt  ��Ć�2 +� ����2i +g +eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\prefab_config.json  ��Ć�2  ( ����2n +l +jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\symbol_folder_index.txt  ��Ć�2  a ����2f +d +bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt new file mode 100644 index 00000000..6e617a72 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt @@ -0,0 +1,20 @@ + -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=21 +-DANDROID_PLATFORM=android-21 +-DANDROID_ABI=armeabi-v7a +-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a +-DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a +-DCMAKE_BUILD_TYPE=Debug +-BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a +-GNinja +-Wno-dev +--no-warn-unused-cli + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json new file mode 100644 index 00000000..e799de86 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt new file mode 100644 index 00000000..54caa98f --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt @@ -0,0 +1 @@ +D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/hash_key.txt b/android/app/.cxx/Debug/1n4a7033/hash_key.txt new file mode 100644 index 00000000..ebc45952 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/hash_key.txt @@ -0,0 +1,27 @@ +# Values used to calculate the hash in this folder name. +# Should not depend on the absolute path of the project itself. +# - AGP: 8.1.0. +# - $NDK is the path to NDK 26.3.11579264. +# - $PROJECT is the path to the parent folder of the root Gradle build file. +# - $ABI is the ABI to be built with. The specific value doesn't contribute to the value of the hash. +# - $HASH is the hash value computed from this text. +# - $CMAKE is the path to CMake 3.22.1. +# - $NINJA is the path to Ninja. +-HD:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=21 +-DANDROID_PLATFORM=android-21 +-DANDROID_ABI=$ABI +-DCMAKE_ANDROID_ARCH_ABI=$ABI +-DANDROID_NDK=$NDK +-DCMAKE_ANDROID_NDK=$NDK +-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=$NINJA +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:/Projects/Flutter/Github/FlutterUnit/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:/Projects/Flutter/Github/FlutterUnit/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_BUILD_TYPE=Debug +-B$PROJECT/app/.cxx/Debug/$HASH/$ABI +-GNinja +-Wno-dev +--no-warn-unused-cli \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json new file mode 100644 index 00000000..54276e72 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json @@ -0,0 +1,1367 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-21" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "22" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_ERROR_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue deprecation errors for macros and functions." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "C:/Program Files (x86)/Project" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\x86" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "Project" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\x86" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "21" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "CMAKE_WARN_DEPRECATED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Whether to issue warnings for deprecated functionality." + } + ], + "type" : "INTERNAL", + "value" : "FALSE" + }, + { + "name" : "Project_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86" + }, + { + "name" : "Project_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "Project_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json new file mode 100644 index 00000000..a59ffc79 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json @@ -0,0 +1,799 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json new file mode 100644 index 00000000..14d66245 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json @@ -0,0 +1,43 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : "." + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "Project" + } + ], + "targets" : [] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86", + "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" + }, + "version" : + { + "major" : 2, + "minor" : 3 + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json new file mode 100644 index 00000000..3a67af9c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json new file mode 100644 index 00000000..04a6eae3 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", + "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", + "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", + "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" + }, + "version" : + { + "isDirty" : true, + "major" : 3, + "minor" : 22, + "patch" : 1, + "string" : "3.22.1-g37088a8-dirty", + "suffix" : "g37088a8" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-c3cbb398a65538641212.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + { + "jsonFile" : "cache-v2-30ddb47aac1d117c5807.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-49b5f472adf4076661e4.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-30ddb47aac1d117c5807.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-49b5f472adf4076661e4.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-c3cbb398a65538641212.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + } + } + } +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt new file mode 100644 index 00000000..516b03ae --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt @@ -0,0 +1,401 @@ +# This is the CMakeCache file. +# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 +# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-21 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 + +//Archiver +CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86 + +//Path to a program. +CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Ranlib +CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe + +//Path to a program. +CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 + +//Value Computed by CMake +Project_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Whether to issue deprecation errors for macros and functions. +CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//Suppress errors that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE +//Suppress Warnings that are meant for the author of the CMakeLists.txt +// files. +CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Whether to issue warnings for deprecated functionality. +CMAKE_WARN_DEPRECATED:INTERNAL=FALSE + diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake new file mode 100644 index 00000000..54c7a90b --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake @@ -0,0 +1,72 @@ +set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "17.0.2") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/i386;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake new file mode 100644 index 00000000..d7865bd0 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake @@ -0,0 +1,83 @@ +set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "17.0.2") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") +set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") +set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/i386;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin new file mode 100644 index 0000000000000000000000000000000000000000..23eb5f04cf5e438a8d15ab4a799986df9d7c0cea GIT binary patch literal 5724 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 literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin new file mode 100644 index 0000000000000000000000000000000000000000..c0afa7680391de10cbddfd88a74fea55f37dc37a GIT binary patch literal 5864 zcmd5=ZERcB89u(Y6Sq#Cv!c zrfWL(0cjCY3Sw)2><5~r!PxkR1k$DnP^4BuLe;4l3Ft zK8y-PRI$+udJ(e3X2?X^p|%lZ6`Bx`=%=R1vD>=aAp+Y`iO6=PeQ&)Gd+&9SYQ~m! z1$-NXHq<3vhfJiMev=Fyd_|NTY&uL2gZ+zOUoBi(;J>1`u&SO(l(&ScW>2Tp zw56YhKy|cYh*WZLh(eJ9s8%4;y4Cp(+g%!VX~d;*(0X*Hj}#3j$43thRPtwZV@B1= zmO0%Ke@KY&Ix$!MlA)HdQ0s7LJK`Udb=ZgJf$ZxXkaf-}gPZ)yBj_m=LUew#`0m2{ z*B4eAChT=}WMQS%W~Lvzq+;S8JqSX%nT;To2fK6kjLr>MX1C8WcX zC&a|HesOd>3<2eGYvWIhsGbN*O@odWvNtkZ$e0#_vg)d+shED}Pa~8qfuplL$OE+OY|_ zpTj`rfBO9ge(Vvph)BWC{mCA1zqUciHOjior5cPuP};fkKY_dvv=8{{S5@Ox$c*(C zXc&}d#ST!ma|f^$@-|myU&D~O#%RY1F)pIsSD?>=V!Z7CDliu7v(Ce4oacyy&mh;K zgKi!Uw{>=Q$NRgw`r558s}jZ)Z*_x1M1d-a{+Y$08m z4WH7@N*?;o-e^a(E8Lc|ta4=_7E3!>K00d{vjx3k%$Zp|nl*|s%P|}F`AS@PL&@fW;GUq;S_)wWc|1w1GT#o7 zZ0^Of@!tamA1VUBeZe3!^<;y=eP9DogxpfMzttOJgkLRnQ{sm0fb!A3it z*otMsRfp2^EXp0uy#?HRuyCy~cPRr9_JHyD{N5j8b^igf_W%^WBPebY{uBsTxv2Bh zKMiA`UYUnv06m-hUK4d5V4a^pVb^IC{$GHv`x~_NiZThF?R&QPz0bh;ISiI z{J!9A5P}?yz^XLG@IdUy@B=Y-bHuX6^hrI|9qsChcE&1j&>ht-s$ye?HiyL>8ybVx z(6M7fMzNeP=w@Ot8O@fRCVfnqkr2zuvxfc2qSnIhi=F9!WkpqD~#37*SP`HfOVp-RZ<$ z*J7U?kP`~OQ(~@E$bTf7!Z{_APQap-Vl}ui- zbh#XhW>24v4eOb?*;r>Op6>1F?v9=A>v6vMD89D)`KOBf-j;Y1E6FF$pv1%Ei_j(# zt~a3PRu-2K&g!aJS~&*0*_vZpK1KKy?vFeC^&6G%HT&L2FpiEc13s8O;lo=`P%6|uC0z#6u?eBrEK(^yU`#EHu{Wd7Ki$%1* zdfqB6;$s;29_2k?3+5*TJI`m<-;7@vGS6y9-XdaY%=;AOj(O`VSzHEo*dd3O5- zKLbJP5kFnbXVD1*HBmUVGnI8>}6JyCCx!C^)%B?_Tx~TpCMpl(u1%H=_de^V^e-7y<)6I8k{FtMN5$OcVJxb^R z;$CLA%X>eOI<~_$>Bs%gyFc&hFbm$_iM&P0IMfqIfV|t2=lz}-245QwqF`?P%=P1Y zg2?=#V1q*nDpg!|VL$s{xVPY`;(7Lu8*N$oVTk!M?z3zmxb@3WJyJk@B6w zyCnSvfqX9!IS;fW#o3g8KLav0<1sfAGvFmqPj~_-{g&ZFY_}~=A=~FYPx>)e6EA;* z-)~$$ego!cVjC;Ez`hcm2U1PHcQKJfeqRaF??oucqd7ar^M5*yPXfZ*@Mn}fPw2bB{{MNRW}e9sKXoaH4KE=0c`1O( zDqb*>r@0FQ-BzQJY@_QZ+a1FLd{izbHy(ZObp05MaG^nnzdEd4%6RvHsi`hB{Q371 mbi9jjemGvvXB0ZliG&t>#Qib|l#=aR=QoAQzmmopzyAVZni4?( literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake new file mode 100644 index 00000000..f1f13c66 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Windows-10.0.26100") +set(CMAKE_HOST_SYSTEM_NAME "Windows") +set(CMAKE_HOST_SYSTEM_VERSION "10.0.26100") +set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") + +include("D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "i686") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 00000000..41b99d77 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,803 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..b09356ac9106536d344e76aed36e7001eec019b3 GIT binary patch literal 3880 zcmd53S{-Po(74=5EP?#6H7{Y|j3qkN!1x3LN!G91G^m$LdFFnaN*`+Uh-}C-` z@B96}CwX#kWJpmIlBAHE)+C~<%~ea%hECd6XC<0k{{HNDf1mx){{uTbc=}^EU}ZG8 zGU~r_pu@w;E1nL9m1pdJ(!c&vu*DthSPpjFq-qpH&ii@vjfXvD2WL-@-|gvG_H?YE z|8e^A@S&lx-I>z-LcU;_Qv(IPI6FNhqVkxc4M5B_4^T3U0_o8*9 zjiV_o%3Yy0)g9WfsXf%9w0enLNg8h39k@?*ZN^S0%5WQz=MLyn0V1`7+@ZaJ09Y@x zfxup{z9iV;wtZXVF#me^6E)p!L$ii7t=_)P?hrfNvxQxW0xG$Lik*YWI+32h{jd*~ zJoZhwjo!e7nLeljtpYJytl|Ylmzi^SCDvP-F@inkwNkum%eO;o?PFe zQ+|WQ2e9V5m3$TH`>XT~L8JTui4SVccN_U$l)h|*k?hyA3Pzc{z@z-`1wg>{oc~gt z7`$8+9|Z(m7F}gAU^|m~5rXRRp91*%IBI_}YnJlaaAz!*NcP6#Jv+lQdfCW^OU1C6 z>`A4PDPu=C!*@L_u3wlho)!;x&RNz%d3Pj&tIaXA*-~k?V3bQ0Gh=9YClRYuDrDyL zd@)ieEY5c=n5APz#tLV9b3MJeWH#2_-JQtpipJu`u1vHy*}E&3m`Oy9jFHI36W#G0 zG%%_kHwFg8lN-)z89J~#GG2{SjtmtlmSvccgL!MNG9$&wV&0N-is%aq5iPT{6ggnb zRAwWwVp2~<6N$)DPj|$QK7_|yjwG~rT#I$hCQ{L!9=)e4n>VeKk+sAFgmsvdPWK-^ z-2YJe$ne91>4}HN2h(ZF7jvbwtO`|0Y*bZ{wV^6;QK)jfr4@bFNH^Ao2J^KAg66TM z@UloZXEWR_l4+c%ICl zuGir~^cGYeyQ<*}^H*pc0Wgfvl?QLqPqHgo%)X*L^@PHcf z&NfJ!Yqoap9PDsA18|3OYFEv~!y+}Q8IEr6o`B|ZVM?5?p0+!59{S}Ur`3(`qm$gE zIz?Dp8f3Y9RkfS8&?mxU71)XqLymkKpnF=_xyZJVm%gZzo9M4PIY93VId1#==}4V@ z9d*{p>+Kmf<9oUj`lcqLeT=A7hZ*tJIK~(xT4Y>Dw9FVn2U5iH{|oW0A_bF22vV>; ztpaalgmJ5oZ)e1DM;Q^fU+C`_I41BYBj$Nr$V-d}{yZbby)5)^Gh!Vd3jJlF|C|x) z`da9J68gUxvA$;PKgVfj#C$s$vED95%r7PMd`@hi6qprwLSPv2aHS~4arqi+S*~Ac zeP+fq7D=;E6^Lu>yn!;HnMOg&>XxqA#i&+Uu2VX0#DKrd2wF& zmDVO9YoP7K)79*%)sVkd9JOM}GPHw-Cc7|`%<;yYcG+~~E98qt)yJ4i=S+RxxLy^| zFndd%A+3CJo-uuJWNd%`NP28&=*ZwidZK^-$Y8oQZ8*oY820)msT*g7qps0WzE{vm zlI(gYnCH99RQ>&1<+DLE&6-^SqXQqp2NJV{UOuzexdVuX{JRgq7KXH#D z7{`mFF@1wpu(@i-Hg2Z{%C+z>B{?Vdl>Fo1oq2a63FqOwyf&Hl9q=5NuPxIA1UUzm z*~au48uKzQe+OhPwoCp~@XowRM_$&;ynldq#yfw5c)v8n+vA9br(KIT+7R#A8^jxK zh>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..698b7fde57bf92a362c9331cfd5f18f73ab09832 GIT binary patch literal 3916 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 pq=5-m9^>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..a115ed9bd0b664aebaa2b08274cb48785ff929be GIT binary patch literal 5376 zcmd5=No*Ts6#i!%J8qr2Ndt68E^Ax0Rw0mzdI1io7myGVh(#Re2?@jn1cw}0gaA=d-uvf0`_FiaN>9Av`QQ8A z`Y-eT2`6&9Ms!UROq$pxS`wo$MqB)lWQW8Wusk?A_x;DYi-^oU{Kx2A(WYwM--&LwKW(hRy!t^-tb;qm}O}m&cT9am@?2IR~q_Jilt5PpjEA^&s@18?A zRY?nS=8sx7nvN$VC9{UhBofS|TAm!if7E)ko1?wKK(u@L>S&L)EF^@U5o5iBk=ug$ z3LyfTHr6Xd$2!2W5g~#%i9mE)Bm!&**+^s?u$>uT$9lJ~WVi5Auoq&{Epk|FK$>Nt zp%sBB8r-@PO@)XAg-#F}cV!lc;vG0I9kS}MJUMH9XYdlB`c`;oFKCMbY!Vm+u46Ae zt`%~#LmJFXh;U~o4rTZ)un!*rWDz<^{WGXPrz`PLFXN>s+t-S=6;nm^FEPqDie0O! zE;o;?L$%ODFjehWU!PTq&o7FFK8QZQDM%~N8pTJoSPZ2}!sXNMLRJe0UWY&t{rTC2 zVvWRepzYG1$C`x}k;d-Y20OxUfi8^8Cw5edcC}QDtxqP?nSoTQe^YG2tXsucwGy*4 z{n>0LYi)=X@TG~-F^=H@Hd3+m(~eWC560v0j$jO9s#={YTlH$gE?5SpBv+>)l ziN;hsS;?5$L^>Ux?eEL?W#Tfy2sDOzJZ+>>Mso91I-BV4H~TjiOSW??-pV~JU@ErA z=XdPizvJHgon!aq@(1qSm&@lxsWMs3bBA#yS}RxJKI2N*U|bGYwP8+Kd2gTbsN0*3 zn1NLVD@U02Q~@7Hg>4;alx*w&zNdKV#5M8>2lM!Tq0M${tGhbG&%vQw133PW@T`j+ z(e5Yo;Uyvc6j%uHC_o)zBRn-t`zyKx2XMo?O7lA{pn^uB%K;vNxsVp@TpV5(j5dOi z(09RTXv#BAlN^XnF3>CvO$P&^$W~p4oE)!h+ytr)@$;oN1ty1oeiU$D%QjU&^t53J z1e&Y2P#qA^q&@Tr$jg+xa!mny3VuC8_E_lwODpLsc=m`zBterPPKSB*2)H_k7=Ih& zo~D%$DbgR5_!5#@aW+VNX&cUajyr|1FJ5vfNtTFXRg8})I5tPd^9qjDGA^4U$QY+f z!5;@63305J?GZ!5o%Y)`#;=uDtq0?HLRDhCPX&Qzd>`SwBRD7bGIbSLGZNzRf|L^O ztxJr*Lh^MA&M^^MrQjF`_YdiMcaZhqS}mxvytR)Y2-K+ ziZid+qmJosV$clZ@V@twAIF&`IYuK6yw?~arQjHc*LNr39Oo3t2Ne6(+b6^!1y}d? zuqV!Wl8<}v4@jQ#;2)8E+Jk>a@*5ufJ(6QMIUuY>ttTr{_q|YYVHENH&YKexwslk( z4qS->zcFSkxC0H_Dw{^pbWB5D#m#%w=iOjVsl5tqhw$M;YHvjKhw%G1 zf4=uPR5vp;z7HeD93q*AN2n=1N5EXKZt`qCWHD-Ut-vkU(EqLcZ-beYp^YX6W1@iaSfAR|J z{{sB|>R<0uKSJL6FJ2};ep4c`y(_iLzk|Xr|Bz39ymvSruOI&DimANw=f24HU?RyY z-vOv!{(F4#V_#=~&VM6de)-Q_;r#Lb_sd`N$&c@xi-y44ZpVPP>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000000000000000000000000000000000000..36b03196e4c837282f8268e6b2ba7665647e6f99 GIT binary patch literal 5424 zcmd5B~47Umrz@2jb)wePIlLBcDJ*$ zB?@X$QDP}rAH)aI*XoN3Dk3O?4;4Z2#Ro+cZ!cQ#0*atm&-v#+vwtQN6`%ZJ=bZEX z=l0*u|L;SS`=@kG18y4ZfsVu|Kr+_h#|1kMn^E)V^zyeCC;uR1`GMc2m)k#HoV-NR z^x23Y#RI>sf4i&Kn7p(+c_|!3mFaUr`=2z!e4d@WbmHBagHwlg78{GrYRz`$CTdo_ zd;$d6tXb|t!&#i$U#+*7BxpIs%ADj|u2nBtPN`6`7p!*8olE6pkGb?~AlsWoc4qjNYuLJPz0h9g;T~GY zwT+q>cSHC1Mk7WbnE>=hK=%QFf$RzqUdN5nC8nZRY?-a0)ABf?`fmJak7|7es~FSB zbsfRal@K|A1c!+qt%pc&PcM;E_*-GrM@F8n5A=?&j-LW&Hx0_3P)C zR*Fq2zJ$F4`uUm=HG`DBsf~2?y^2B~%{A<;mz+km6yKIgWwK-GbpGb}yw$Qx@kTxF zWb?UPHfL{-7wH(q<(`exZZ*^KZ57vTwss~GcxuRpS#C7SHM`YlJ4M^XBbaa-jaso{ zRqKgb?eyYE(`npm7u|SiY#~3kkS(P~M@KWI9m!PM-cd}BWyf|bWacwTyJ%-h>C9+) zJ4_s~PTCX4j!nq(JX11@%_i*InV9u_wGvacw(HtX;?}BLY0tBGv|e>NuY}cXCd}f} zQevMy-!3Oo^{kakW-^JT{Agh`n-D>!uw1kf88e+WQzPX}E}73;`H@o9aqmlXqGKw6 z19G5H*n9Z!-s6QkX6~9S963HaStvlYzR)Oej)>qJW#HQVU7__B9ZBu_w?~}Ms zHzP(rYP9`fZ*1@}ePW(JX=`mD?8XD23xXfxazu;t ztn1wxiM1oq?r$Qo?y{s6NsZXTik@}dm59+D-L2~wkNt$wXAtdzpDu@W8sL{fzxzGp zG#K>dw9jFpATCD*@mNFAS331Y-c!`at^@`0)InZMG+RF zjw1Jqz*)i)E_wlu3cO!R9elgMJC6$1--6RR1fo6)8^(Dr(CSg|AD6wB5?XjGAfTzEi~5N&`591fWJROZ_U<|fNW%D)D`DD)LjR^U@X=cIgL5XudX)?q{ z>rRdFoW$?;U?0C-;#G;0NH*NgNQQ8V%k#V}arS>)`gvN>_wP@{E+{zpxk<`zNy>i8 z($D*ferJ~ge5T;!hu86^fS*&+&!37uuN^^yvY!a~;dQ@3;+zlFLTWs(B+~xmwkx3j zij=1%C8Ac3*?|7rQnnO*b=?~Q{g0&lU;zI_%I5<3=Td$)fPXFJ7XtXlQjW_3QZ8yf zyChC(Dh_6euK9vBKkwM5!F2Hw1$vGw+ITIRj$O0NlI2>axHtWqIOM8bQ+L&^Ekm|k zXH@|IL9oVKMg|cnQ%2~ZA<|oYw|lBI9#dTN!TkK!hFNd8wt4Hpqa&DU@#LzU#6v_4 zT&vb?sbyCR3y!sjB96wj=8@jFD5%T};gre6R<6N+A+#@7-+ln^$-}|tkA2JSz#^YdwS9rY-`Vp$$2OfC*+V`>LO#bm(f?kM#Z^4Z5#5A88YkCW{NpCt zF$_-e)%%?~E{a}&nxsrfmm1SYB_Eu_yj0+L!U#V>*?Tvw&OhGgS#X||Kg}`QGyVf& z6e<{h{9nfZ4sFBcFCP-0Vh7`kKU*R3x!$ops)!bphcVBv__HDLsRpw>kN*&2VdLkz z%KBdPjy=n_ArltA5)z+|1pDLo*C7@bpY|0s*7u~qfjeq zFUt4G_`!W0JU^r+RgvqorzH4d2NGOR_fV}Q~899F5*tGxY zO%)u!ix~M#;!kbA$^-FzARvoO>HQLB|E0X7pI4nqU4q!&K!$l$^-QoJ%Fdwf9?!lR zTtBwYt4@*U@iRPz_M!79>o@Ncn!l?Rd&Wn+`0UQ7Z^--~@ez*+=D%%?_%DaVr++n^ ZKgXwY8XP-C8mC7vwu%f$gtkP`{x7Z~b36b5 literal 0 HcmV?d00001 diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt new file mode 100644 index 00000000..027a8e8c --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,2 @@ +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/edit_cache.dir +D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000..3dccd731 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja new file mode 100644 index 00000000..99c123a9 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja @@ -0,0 +1,45 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets + description = All primary targets available: + diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt new file mode 100644 index 00000000..e69de29b diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json new file mode 100644 index 00000000..524ffe0f --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json @@ -0,0 +1,28 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {}, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", + "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json new file mode 100644 index 00000000..2f2abeed --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json @@ -0,0 +1,20 @@ +{ + "buildFiles": [ + "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", + "-C", + "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": {} +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja b/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja new file mode 100644 index 00000000..86db01f8 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja @@ -0,0 +1,111 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: Project +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/ + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64 + +build all: phony + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt new file mode 100644 index 00000000..7fba5c85 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt @@ -0,0 +1 @@ +D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake new file mode 100644 index 00000000..bddd3dcc --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin new file mode 100644 index 00000000..5e88d18b --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logn +l +jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  �����2k +i +gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\android_gradle_build.json  ��Ć�2� �����2p +n +lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\android_gradle_build_mini.json  ��Ć�2� �����2] +[ +YD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build.ninja  ��Ć�2�� �����2a +_ +]D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build.ninja.txt  ��Ć�2f +d +bD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build_file_index.txt  ��Ć�2 b �����2g +e +cD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\compile_commands.json  ��Ć�2k +i +gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\compile_commands.json.bin  ��Ć�2 q +o +mD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\metadata_generation_command.txt  ��Ć�2 +� �����2d +b +`D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\prefab_config.json  ��Ć�2  ( �����2i +g +eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\symbol_folder_index.txt  ��Ć�2  \ �����2f +d +bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt new file mode 100644 index 00000000..d2458f6d --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt @@ -0,0 +1,20 @@ + -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=21 +-DANDROID_PLATFORM=android-21 +-DANDROID_ABI=x86_64 +-DCMAKE_ANDROID_ARCH_ABI=x86_64 +-DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 +-DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 +-DCMAKE_BUILD_TYPE=Debug +-BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 +-GNinja +-Wno-dev +--no-warn-unused-cli + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json new file mode 100644 index 00000000..e799de86 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt new file mode 100644 index 00000000..f8086cb6 --- /dev/null +++ b/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt @@ -0,0 +1 @@ +D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a413fb36..67873441 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -59,5 +59,8 @@ + diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 49200d7e..e00c099b 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:go_router/go_router.dart'; import 'package:l10n/gen_l10n/app_localizations.dart'; import 'package:l10n/l10n.dart'; +import 'package:tolyui/app/toly_ui.dart'; import 'package:widget_module/widget_module.dart'; import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -50,22 +51,17 @@ class _FlutterUnit3State extends State with LocalProvider { listener: _onLocaleChange, child: DefaultTextStyle( style: TextStyle(fontFamily: state.fontFamily), - child: TolyMessage( + child: TolyUiApp.router( + routerConfig: _router, + showPerformanceOverlay: state.showPerformanceOverlay, + title: StrUnit.appName, + debugShowCheckedModeBanner: false, + localizationsDelegates: localizationsDelegates, + supportedLocales: supportedLocales, + locale: state.language.locale, themeMode: state.themeMode, darkTheme: dark, theme: light, - child: MaterialApp.router( - routerConfig: _router, - showPerformanceOverlay: state.showPerformanceOverlay, - title: StrUnit.appName, - debugShowCheckedModeBanner: false, - localizationsDelegates: localizationsDelegates, - supportedLocales: supportedLocales, - locale: state.language.locale, - themeMode: state.themeMode, - darkTheme: dark, - theme: light, - ), ), ), ); diff --git a/lib/src/l10n/gen/app_l10n_de.dart b/lib/src/l10n/gen/app_l10n_de.dart index 3580b245..79ee31fc 100644 --- a/lib/src/l10n/gen/app_l10n_de.dart +++ b/lib/src/l10n/gen/app_l10n_de.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_en.dart b/lib/src/l10n/gen/app_l10n_en.dart index 52ca28e5..d69f393b 100644 --- a/lib/src/l10n/gen/app_l10n_en.dart +++ b/lib/src/l10n/gen/app_l10n_en.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_es.dart b/lib/src/l10n/gen/app_l10n_es.dart index 489193a5..e8441e47 100644 --- a/lib/src/l10n/gen/app_l10n_es.dart +++ b/lib/src/l10n/gen/app_l10n_es.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_fr.dart b/lib/src/l10n/gen/app_l10n_fr.dart index cedbaf35..7295ae9e 100644 --- a/lib/src/l10n/gen/app_l10n_fr.dart +++ b/lib/src/l10n/gen/app_l10n_fr.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_it.dart b/lib/src/l10n/gen/app_l10n_it.dart index 6270dac2..ed6e8d34 100644 --- a/lib/src/l10n/gen/app_l10n_it.dart +++ b/lib/src/l10n/gen/app_l10n_it.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_ja.dart b/lib/src/l10n/gen/app_l10n_ja.dart index 127830a9..c27b3cb4 100644 --- a/lib/src/l10n/gen/app_l10n_ja.dart +++ b/lib/src/l10n/gen/app_l10n_ja.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_ko.dart b/lib/src/l10n/gen/app_l10n_ko.dart index e0685775..a1d01827 100644 --- a/lib/src/l10n/gen/app_l10n_ko.dart +++ b/lib/src/l10n/gen/app_l10n_ko.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_pt.dart b/lib/src/l10n/gen/app_l10n_pt.dart index 4b868fea..abfd2ace 100644 --- a/lib/src/l10n/gen/app_l10n_pt.dart +++ b/lib/src/l10n/gen/app_l10n_pt.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_ru.dart b/lib/src/l10n/gen/app_l10n_ru.dart index f14739e6..7925d188 100644 --- a/lib/src/l10n/gen/app_l10n_ru.dart +++ b/lib/src/l10n/gen/app_l10n_ru.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/l10n/gen/app_l10n_zh.dart b/lib/src/l10n/gen/app_l10n_zh.dart index 09e8b109..6b3b59f3 100644 --- a/lib/src/l10n/gen/app_l10n_zh.dart +++ b/lib/src/l10n/gen/app_l10n_zh.dart @@ -1,3 +1,5 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; import 'app_l10n.dart'; // ignore_for_file: type=lint diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart index 1f6b17ff..9417b7c3 100644 --- a/lib/src/navigation/model/app_tab.dart +++ b/lib/src/navigation/model/app_tab.dart @@ -46,9 +46,8 @@ enum AppTab { }; } - MenuMeta menu(AppL10n l10n) => MenuMeta( + IconMenu menu(AppL10n l10n) => IconMenu(icon, label: label(l10n), - icon: icon, - router: path, + route: path, ); } diff --git a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart index 4a9a7a5e..8c17403e 100644 --- a/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart +++ b/lib/src/navigation/view/desktop/toly_unit_menu_cell.dart @@ -37,7 +37,10 @@ class FlutterUnitMenuCell extends StatelessWidget { double iconSize = _sizeTween.transform(anim); double fontSize = _fontSizeTween.transform(anim); - + IconData? icon; + if (menu is IconMenu) { + icon = (menu as IconMenu).icon; + } TextStyle style = TextStyle(color: foregroundColor, fontSize: fontSize); Radius radius = Radius.circular(height / 2); BorderRadius br = BorderRadius.only(topRight: radius, bottomRight: radius); @@ -51,7 +54,7 @@ class FlutterUnitMenuCell extends StatelessWidget { spacing: 6, // crossAxisAlignment: WrapCrossAlignment.center, children: [ - Icon(menu.icon, color: foregroundColor, size: iconSize), + Icon(icon, color: foregroundColor, size: iconSize), Expanded( child: Text( menu.label, diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 6ee58931..f6bc1966 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import connectivity_plus +import file_picker import open_file_mac import package_info_plus import path_provider_foundation @@ -20,6 +21,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/modules/ability/r_upgrade-0.4.2/android/.gitignore b/modules/ability/r_upgrade-0.4.2/android/.gitignore new file mode 100644 index 00000000..c6cbe562 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/modules/ability/r_upgrade-0.4.2/android/build.gradle b/modules/ability/r_upgrade-0.4.2/android/build.gradle index 7842e40a..048c5d94 100644 --- a/modules/ability/r_upgrade-0.4.2/android/build.gradle +++ b/modules/ability/r_upgrade-0.4.2/android/build.gradle @@ -25,8 +25,9 @@ rootProject.allprojects { apply plugin: 'com.android.library' android { - compileSdkVersion 33 namespace "com.example.r_upgrade" + compileSdkVersion 33 + defaultConfig { minSdkVersion 16 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java index 007a8dac..93e056c2 100644 --- a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java @@ -16,7 +16,7 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry; -import io.flutter.plugin.common.PluginRegistry.Registrar; +//import io.flutter.plugin.common.PluginRegistry.Registrar; /** * RUpgradePlugin @@ -42,18 +42,18 @@ private void initPlugin(Activity activity, BinaryMessenger messenger, DownloadPe _channel.setMethodCallHandler(new RUpgradeMethodCallHandler(upgradeManager)); } - /** - * Plugin registration. - */ - public static void registerWith(final Registrar registrar) { - - new RUpgradePlugin(registrar.activity(), registrar.messenger(), new DownloadPermissions.PermissionsRegistry() { - @Override - public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { - registrar.addRequestPermissionsResultListener(handler); - } - }); - } +// /** +// * Plugin registration. +// */ +// public static void registerWith(final Registrar registrar) { +// +// new RUpgradePlugin(registrar.activity(), registrar.messenger(), new DownloadPermissions.PermissionsRegistry() { +// @Override +// public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { +// registrar.addRequestPermissionsResultListener(handler); +// } +// }); +// } @Override diff --git a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart index 2f3601dc..c3b297b7 100644 --- a/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart +++ b/modules/knowledge_system/algorithm/lib/src/navigation/view/algo_menu_cell.dart @@ -12,7 +12,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:tolyui/tolyui.dart'; -class AlgoMenuMetaExt extends MenuMateExt { +class AlgoMenuMetaExt extends Extra { final String? subtitle; final String? tag; final bool? isFlutter; @@ -45,7 +45,8 @@ class AlgoMenuCell extends StatelessWidget { }); MenuTreeCellStyle get effectStyle => - style ?? (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + style ?? + (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); Color? effectForegroundColor(MenuTreeCellStyle style) { if (display.selected) { @@ -76,13 +77,17 @@ class AlgoMenuCell extends StatelessWidget { @override Widget build(BuildContext context) { - MenuTreeCellStyle effectStyle = - style ?? (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); + MenuTreeCellStyle effectStyle = style ?? + (display.isDark ? MenuTreeCellStyle.dark() : MenuTreeCellStyle.light()); Color? bgColor = backgroundColor(effectStyle); Color? fgColor = effectForegroundColor(effectStyle); EdgeInsets padding = const EdgeInsets.symmetric(horizontal: 8, vertical: 2); + IconData? icon; + if (menuNode.data is IconMenu) { + icon = (menuNode.data as IconMenu).icon; + } Widget cell = DecoratedBox( decoration: BoxDecoration( borderRadius: BorderRadius.circular(6), @@ -101,10 +106,10 @@ class AlgoMenuCell extends StatelessWidget { child: Wrap( crossAxisAlignment: WrapCrossAlignment.center, children: [ - if (menuNode.data.icon != null) + if (icon != null) Padding( padding: const EdgeInsets.only(right: 8.0), - child: Icon(menuNode.data.icon, size: 20, color: fgColor), + child: Icon(icon, size: 20, color: fgColor), ), _buildTitle(fgColor) ], @@ -112,7 +117,8 @@ class AlgoMenuCell extends StatelessWidget { ), ), if (ext?.tag != null) _buildTag(ext), - if (menuNode.children.isNotEmpty) _buildExpandIndicator(display.expanded, fgColor) + if (menuNode.children.isNotEmpty) + _buildExpandIndicator(display.expanded, fgColor) ], ), ); @@ -156,15 +162,17 @@ class AlgoMenuCell extends StatelessWidget { } Widget _buildTag(AlgoMenuMetaExt? ext) { - TextStyle tagStyle = const TextStyle(color: Colors.white, height: 1, fontSize: 10); - Widget child = - Text('${ext?.tag}', overflow: TextOverflow.ellipsis, maxLines: 1, style: tagStyle); + TextStyle tagStyle = + const TextStyle(color: Colors.white, height: 1, fontSize: 10); + Widget child = Text('${ext?.tag}', + overflow: TextOverflow.ellipsis, maxLines: 1, style: tagStyle); return Padding( padding: const EdgeInsets.only(right: 8.0), child: Container( padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), decoration: BoxDecoration( - color: Colors.blue.withOpacity(0.8), borderRadius: BorderRadius.circular(4)), + color: Colors.blue.withOpacity(0.8), + borderRadius: BorderRadius.circular(4)), child: child), ); } diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart index fd118ca7..7b8979b8 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart @@ -12,12 +12,14 @@ class WidgetInspectorDemo extends StatelessWidget { height: 200, child: WidgetInspector( child: const HomePage(), - selectButtonBuilder: _selectButtonBuilder, + exitWidgetSelectionButtonBuilder: null, + moveExitWidgetSelectionButtonBuilder: _selectButtonBuilder, ), ); } - Widget _selectButtonBuilder(BuildContext context, onPressed) { + Widget _selectButtonBuilder(BuildContext context, + {required VoidCallback onPressed, bool? isLeftAligned}) { onPressed(); return Container(); } diff --git a/pubspec.lock b/pubspec.lock index baa1f63c..0fffcd6f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,22 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - ac_string_ext: - dependency: transitive - description: - name: ac_string_ext - sha256: "267c8efd424a72840d41e9373cdaec2a07dc68fcffeb9da075006f77acbe7ae6" - url: "https://pub.dev/" - source: hosted - version: "0.0.2" archive: dependency: "direct main" description: name: archive - sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" + sha256: a7f37ff061d7abc2fcf213554b9dcaca713c5853afa5c065c44888bc9ccaf813 url: "https://pub.dev/" source: hosted - version: "4.0.2" + version: "4.0.6" args: dependency: transitive description: @@ -29,10 +21,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev/" source: hosted - version: "2.11.0" + version: "2.12.0" bloc: dependency: transitive description: @@ -45,18 +37,18 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev/" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev/" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -69,26 +61,26 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev/" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev/" source: hosted - version: "1.19.0" + version: "1.19.1" connectivity_plus: dependency: "direct main" description: name: connectivity_plus - sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" + sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27" url: "https://pub.dev/" source: hosted - version: "6.1.2" + version: "6.1.3" connectivity_plus_platform_interface: dependency: transitive description: @@ -205,10 +197,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev/" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: @@ -229,10 +221,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 + sha256: "8986dec4581b4bcd4b6df5d75a2ea0bede3db802f500635d05fa8be298f9467f" url: "https://pub.dev/" source: hosted - version: "8.1.7" + version: "10.1.2" file_selector_linux: dependency: transitive description: @@ -429,22 +421,38 @@ packages: url: "https://pub.dev/" source: hosted version: "0.0.4+2" + fx_env: + dependency: transitive + description: + name: fx_env + sha256: c95836ab108c498d53f43c464e08a5ce64975efdf586fb46f1a4c37bb2c400bf + url: "https://pub.dev/" + source: hosted + version: "0.0.1" fx_go_router_ext: dependency: "direct main" description: name: fx_go_router_ext - sha256: "4eee6121b0c10ed9cf77ceafd8cca024cfaaf1777deb61fe8936ac7a7173961b" + sha256: dc65ac677f2058b8192ca50bdcd508a12ef4b6c150f64ca8d595b536ac6e5d1b url: "https://pub.dev/" source: hosted - version: "0.0.5" + version: "0.0.6+1" fx_platform_adapter: dependency: "direct main" description: name: fx_platform_adapter - sha256: "229d966a6b90f6ddb96913426c5d9f14552a17dbdd8747d23ce08065db94498b" + sha256: e6d5ca554a1fd019a695a63bbb3e4eee6efe492b5d926542f22d6b64cea99415 url: "https://pub.dev/" source: hosted - version: "0.0.2+2" + version: "0.0.3" + fx_string: + dependency: transitive + description: + name: fx_string + sha256: "3350be2fa11cdb0d4107e4657431d05088a88795ef3145ad37902f6066a5b124" + url: "https://pub.dev/" + source: hosted + version: "0.0.1" fx_trace: dependency: "direct main" description: @@ -457,10 +465,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" + sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" url: "https://pub.dev/" source: hosted - version: "14.6.3" + version: "14.8.0" html: dependency: transitive description: @@ -521,18 +529,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev/" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev/" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -569,10 +577,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev/" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -585,10 +593,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev/" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -697,10 +705,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev/" source: hosted - version: "1.9.0" + version: "1.9.1" path_parsing: dependency: transitive description: @@ -968,10 +976,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a" + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.dev/" source: hosted - version: "2.5.1" + version: "2.5.3" shared_preferences_android: dependency: transitive description: @@ -1029,10 +1037,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev/" source: hosted - version: "1.10.0" + version: "1.10.1" sprintf: dependency: transitive description: @@ -1109,18 +1117,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev/" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev/" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1133,10 +1141,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev/" source: hosted - version: "1.3.0" + version: "1.4.1" synchronized: dependency: transitive description: @@ -1149,18 +1157,18 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev/" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev/" source: hosted - version: "0.7.3" + version: "0.7.4" toggle_rotate: dependency: "direct main" description: @@ -1173,42 +1181,50 @@ packages: dependency: "direct main" description: name: tolyui - sha256: "7b32c4d16deb7b3c190c0ed9ce32cbb51eceb48ba857a601612385949dce280d" + sha256: "2c49442fd9cb1f5c89fcc5c30cded148e3abe749bea0064e9218d2bb9a47640c" url: "https://pub.dev/" source: hosted - version: "0.0.4+3" + version: "0.0.4+9" tolyui_color: dependency: transitive description: name: tolyui_color - sha256: "410c378344d47a5f170e70a78cc1ac6a4f2665ea40f02c9aaa67da4072fde0e1" + sha256: e79eed0a525a584dc51df9ee5445bee190d9a9b5f14690038800c4983b2c744a url: "https://pub.dev/" source: hosted - version: "0.0.1" + version: "0.0.2" tolyui_feedback: dependency: transitive description: name: tolyui_feedback - sha256: "1a35f0c874d8ffd5a700a661ff60c4f818dec7c1c7b7e7f281a495905c838117" + sha256: "4549ea17aa453b931b0859c6f840228222a0637186b3e9bfcb63218b879c7132" url: "https://pub.dev/" source: hosted - version: "0.3.5" + version: "0.3.6+3" tolyui_message: dependency: transitive description: name: tolyui_message - sha256: "4e9046d65d1a5f98f0ebd423815be683c7fbf637caa9e0bf88d83148b42764cb" + sha256: "3811b9666d90d0088c35cacfe77ef990ed6019f801000d0e39ed8f500817b3bf" + url: "https://pub.dev/" + source: hosted + version: "0.2.6+1" + tolyui_meta: + dependency: transitive + description: + name: tolyui_meta + sha256: "449bca06271d6c5d2a6b49192fd9176fa14b86fcd57c7317c4466a9d0b334674" url: "https://pub.dev/" source: hosted - version: "0.2.2" + version: "0.0.2+1" tolyui_navigation: dependency: transitive description: name: tolyui_navigation - sha256: b7f10c7efc41228be3c3c2aed8fd64e80eeee0e7426e0d5af8b54d04a4243058 + sha256: "8c4ddc82cb80982e5f1a4cdc39ebf3ceec6b50899dfef407abba3841d3b54610" url: "https://pub.dev/" source: hosted - version: "0.1.0" + version: "0.2.0" tolyui_rx_layout: dependency: transitive description: @@ -1341,10 +1357,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev/" source: hosted - version: "14.3.0" + version: "14.3.1" web: dependency: transitive description: @@ -1441,5 +1457,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.6.1 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index e09b1db6..cb0b4137 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,8 +42,8 @@ dependencies: flutter_bloc: ^8.1.6 # 状态管理 ## fx 架构 - fx_platform_adapter: ^0.0.2+1 # 平台适配器 - fx_go_router_ext: 0.0.5 # 路由 + fx_platform_adapter: 0.0.3 # 平台适配器 + fx_go_router_ext: 0.0.6+1 # 路由 fx_dao: 0.0.1+2 # 数据库 fx_dio: 0.0.4+2 fx_boot_starter: 0.1.1 # app 启动器 @@ -51,19 +51,19 @@ dependencies: # 数据与持久化 dio: ^5.4.3+1 # 网络请求 - shared_preferences: ^2.5.1 # xml 固化 + shared_preferences: ^2.5.3 # xml 固化 jwt_decoder: ^2.0.1 # jwt 解析 - path_provider: ^2.1.3 # 路径 + path_provider: ^2.1.5 # 路径 # 平台功能 - connectivity_plus: ^6.0.3 # 网络状态 + connectivity_plus: ^6.1.3 # 网络状态 url_launcher: ^6.3.1 # url - archive: ^4.0.2 # 解压 - file_picker: ^8.0.5 # 文件选择器 - share_plus: ^10.0.1 # 文字分享 + archive: ^4.0.6 # 解压 + file_picker: ^10.1.2 # 文件选择器 + share_plus: ^10.1.4 # 文字分享 # 视图展示 - tolyui: 0.0.4+3 # tolyui + tolyui: 0.0.4+9 # tolyui refresh: ^1.0.1 # 下拉刷新 dash_painter: ^1.0.2 # 虚线 flutter_star: ^1.0.2 # 星星组件 @@ -73,6 +73,7 @@ dependencies: webview_flutter: ^4.2.4 # webview flutter_markdown: ^0.7.2+1 # markdown flutter_svg: ^2.0.17 # svg 展示 + # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 From aa90e218fe6e43ba60e7766b72872368599eecfc Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 09:37:33 +0800 Subject: [PATCH 139/149] up to flutter 3.29.x --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 732e6a8c..fe733f8b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ .pub-cache/ .pub/ /build/ +/android/app/.cxx/ /lib/tools/ /lib/res/constant/github_client_config.dart # Exceptions to above rules. @@ -37,4 +38,4 @@ /build_tools /libs /pubspec_overrides.yaml -modules/game_system \ No newline at end of file +modules/game_system From 4fa88cbae3a958e2c6be23931c9845c2496280db Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 09:39:16 +0800 Subject: [PATCH 140/149] up to flutter 3.29.x --- .gitignore | 1 - .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-a012ed7e292a952c6e51.json | 1367 ----------------- .../cmakeFiles-v1-dabd9aed57aedc8ee77b.json | 799 ---------- .../codemodel-v2-108dda1a979928b8171a.json | 43 - ...irectory-.-Debug-d0094a50bb2071803777.json | 14 - .../reply/index-2025-04-20T01-10-38-0489.json | 92 -- .../Debug/1n4a7033/arm64-v8a/CMakeCache.txt | 401 ----- .../CMakeCCompiler.cmake | 72 - .../CMakeCXXCompiler.cmake | 83 - .../CMakeDetermineCompilerABI_C.bin | Bin 7936 -> 0 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 8096 -> 0 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 - .../CompilerIdC/CMakeCCompilerId.c | 803 ---------- .../CompilerIdC/CMakeCCompilerId.o | Bin 6000 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ---------- .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 6016 -> 0 bytes .../CMakeFiles/TargetDirectories.txt | 2 - .../arm64-v8a/CMakeFiles/cmake.check_cache | 1 - .../1n4a7033/arm64-v8a/CMakeFiles/rules.ninja | 45 - .../arm64-v8a/additional_project_files.txt | 0 .../arm64-v8a/android_gradle_build.json | 28 - .../arm64-v8a/android_gradle_build_mini.json | 20 - .../.cxx/Debug/1n4a7033/arm64-v8a/build.ninja | 111 -- .../1n4a7033/arm64-v8a/build_file_index.txt | 1 - .../1n4a7033/arm64-v8a/cmake_install.cmake | 54 - .../arm64-v8a/configure_fingerprint.bin | 28 - .../arm64-v8a/metadata_generation_command.txt | 20 - .../1n4a7033/arm64-v8a/prefab_config.json | 4 - .../arm64-v8a/symbol_folder_index.txt | 1 - .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-2cf3899b2994a50f6472.json | 1367 ----------------- .../cmakeFiles-v1-5b36d7a0891fdde7d468.json | 799 ---------- .../codemodel-v2-6500251f75d592877858.json | 43 - ...irectory-.-Debug-d0094a50bb2071803777.json | 14 - .../reply/index-2025-04-20T01-10-53-0270.json | 92 -- .../Debug/1n4a7033/armeabi-v7a/CMakeCache.txt | 401 ----- .../CMakeCCompiler.cmake | 72 - .../CMakeCXXCompiler.cmake | 83 - .../CMakeDetermineCompilerABI_C.bin | Bin 5772 -> 0 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 5928 -> 0 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 - .../CompilerIdC/CMakeCCompilerId.c | 803 ---------- .../CompilerIdC/CMakeCCompilerId.o | Bin 4096 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ---------- .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 4136 -> 0 bytes .../CMakeFiles/TargetDirectories.txt | 2 - .../armeabi-v7a/CMakeFiles/cmake.check_cache | 1 - .../armeabi-v7a/CMakeFiles/rules.ninja | 45 - .../armeabi-v7a/additional_project_files.txt | 0 .../armeabi-v7a/android_gradle_build.json | 28 - .../android_gradle_build_mini.json | 20 - .../Debug/1n4a7033/armeabi-v7a/build.ninja | 111 -- .../1n4a7033/armeabi-v7a/build_file_index.txt | 1 - .../1n4a7033/armeabi-v7a/cmake_install.cmake | 54 - .../armeabi-v7a/configure_fingerprint.bin | 28 - .../metadata_generation_command.txt | 20 - .../1n4a7033/armeabi-v7a/prefab_config.json | 4 - .../armeabi-v7a/symbol_folder_index.txt | 1 - android/app/.cxx/Debug/1n4a7033/hash_key.txt | 27 - .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-30ddb47aac1d117c5807.json | 1367 ----------------- .../cmakeFiles-v1-49b5f472adf4076661e4.json | 799 ---------- .../codemodel-v2-c3cbb398a65538641212.json | 43 - ...irectory-.-Debug-d0094a50bb2071803777.json | 14 - .../reply/index-2025-04-20T01-10-57-0300.json | 92 -- .../.cxx/Debug/1n4a7033/x86/CMakeCache.txt | 401 ----- .../CMakeCCompiler.cmake | 72 - .../CMakeCXXCompiler.cmake | 83 - .../CMakeDetermineCompilerABI_C.bin | Bin 5724 -> 0 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 5864 -> 0 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 - .../CompilerIdC/CMakeCCompilerId.c | 803 ---------- .../CompilerIdC/CMakeCCompilerId.o | Bin 3880 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ---------- .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 3916 -> 0 bytes .../x86/CMakeFiles/TargetDirectories.txt | 2 - .../1n4a7033/x86/CMakeFiles/cmake.check_cache | 1 - .../Debug/1n4a7033/x86/CMakeFiles/rules.ninja | 45 - .../1n4a7033/x86/additional_project_files.txt | 0 .../1n4a7033/x86/android_gradle_build.json | 28 - .../x86/android_gradle_build_mini.json | 20 - .../app/.cxx/Debug/1n4a7033/x86/build.ninja | 111 -- .../Debug/1n4a7033/x86/build_file_index.txt | 1 - .../Debug/1n4a7033/x86/cmake_install.cmake | 54 - .../1n4a7033/x86/configure_fingerprint.bin | 28 - .../x86/metadata_generation_command.txt | 20 - .../Debug/1n4a7033/x86/prefab_config.json | 4 - .../1n4a7033/x86/symbol_folder_index.txt | 1 - .../.cmake/api/v1/query/client-agp/cache-v2 | 0 .../api/v1/query/client-agp/cmakeFiles-v1 | 0 .../api/v1/query/client-agp/codemodel-v2 | 0 .../reply/cache-v2-03a6b8ac64bbf73cab21.json | 1367 ----------------- .../cmakeFiles-v1-ee9fafa3848df046dfd5.json | 799 ---------- .../codemodel-v2-9d7f262ebd04583f9e90.json | 43 - ...irectory-.-Debug-d0094a50bb2071803777.json | 14 - .../reply/index-2025-04-20T01-10-58-0611.json | 92 -- .../.cxx/Debug/1n4a7033/x86_64/CMakeCache.txt | 401 ----- .../CMakeCCompiler.cmake | 72 - .../CMakeCXXCompiler.cmake | 83 - .../CMakeDetermineCompilerABI_C.bin | Bin 6944 -> 0 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 7104 -> 0 bytes .../3.22.1-g37088a8-dirty/CMakeSystem.cmake | 15 - .../CompilerIdC/CMakeCCompilerId.c | 803 ---------- .../CompilerIdC/CMakeCCompilerId.o | Bin 5376 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 791 ---------- .../CompilerIdCXX/CMakeCXXCompilerId.o | Bin 5424 -> 0 bytes .../x86_64/CMakeFiles/TargetDirectories.txt | 2 - .../x86_64/CMakeFiles/cmake.check_cache | 1 - .../1n4a7033/x86_64/CMakeFiles/rules.ninja | 45 - .../x86_64/additional_project_files.txt | 0 .../1n4a7033/x86_64/android_gradle_build.json | 28 - .../x86_64/android_gradle_build_mini.json | 20 - .../.cxx/Debug/1n4a7033/x86_64/build.ninja | 111 -- .../1n4a7033/x86_64/build_file_index.txt | 1 - .../Debug/1n4a7033/x86_64/cmake_install.cmake | 54 - .../1n4a7033/x86_64/configure_fingerprint.bin | 28 - .../x86_64/metadata_generation_command.txt | 20 - .../Debug/1n4a7033/x86_64/prefab_config.json | 4 - .../1n4a7033/x86_64/symbol_folder_index.txt | 1 - lib/src/flutter_unit.dart | 1 - 127 files changed, 19209 deletions(-) delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/hash_key.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/TargetDirectories.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/cmake.check_cache delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/rules.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/additional_project_files.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/android_gradle_build.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/android_gradle_build_mini.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/build.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/build_file_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/cmake_install.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/configure_fingerprint.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/metadata_generation_command.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/prefab_config.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86/symbol_folder_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/cache-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/cache-v2-03a6b8ac64bbf73cab21.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-ee9fafa3848df046dfd5.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/codemodel-v2-9d7f262ebd04583f9e90.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/.cmake/api/v1/reply/index-2025-04-20T01-10-58-0611.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeCache.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json delete mode 100644 android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt diff --git a/.gitignore b/.gitignore index fe733f8b..001fdc37 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ .pub-cache/ .pub/ /build/ -/android/app/.cxx/ /lib/tools/ /lib/res/constant/github_client_config.dart # Exceptions to above rules. diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json deleted file mode 100644 index 9a425870..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cache-v2-a012ed7e292a952c6e51.json +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "entries" : - [ - { - "name" : "ANDROID_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "arm64-v8a" - }, - { - "name" : "ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "ANDROID_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "android-21" - }, - { - "name" : "CMAKE_ADDR2LINE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" - }, - { - "name" : "CMAKE_ANDROID_ARCH_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "arm64-v8a" - }, - { - "name" : "CMAKE_ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "CMAKE_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_ASM_FLAGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_BUILD_TYPE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." - } - ], - "type" : "STRING", - "value" : "Debug" - }, - { - "name" : "CMAKE_CACHEFILE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "This is the directory where this CMakeCache.txt was created" - } - ], - "type" : "INTERNAL", - "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a" - }, - { - "name" : "CMAKE_CACHE_MAJOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Major version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "3" - }, - { - "name" : "CMAKE_CACHE_MINOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Minor version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "22" - }, - { - "name" : "CMAKE_CACHE_PATCH_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Patch version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" - }, - { - "name" : "CMAKE_CPACK_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to cpack program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" - }, - { - "name" : "CMAKE_CTEST_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to ctest program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_CXX_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_CXX_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C++ applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_C_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_C_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_C_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_C_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_C_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_C_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_DLLTOOL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_DLLTOOL-NOTFOUND" - }, - { - "name" : "CMAKE_ERROR_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue deprecation errors for macros and functions." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_EXECUTABLE_FORMAT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Executable file format" - } - ], - "type" : "INTERNAL", - "value" : "ELF" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "ON" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of external makefile project generator." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator." - } - ], - "type" : "INTERNAL", - "value" : "Ninja" - }, - { - "name" : "CMAKE_GENERATOR_INSTANCE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Generator instance identifier." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator platform." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_TOOLSET", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator toolset." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_HOME_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Source directory with the top level CMakeLists.txt file for this project" - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - { - "name" : "CMAKE_INSTALL_PREFIX", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install path prefix, prepended onto install directories." - } - ], - "type" : "PATH", - "value" : "C:/Program Files (x86)/Project" - }, - { - "name" : "CMAKE_INSTALL_SO_NO_EXE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install .so files without execute permission." - } - ], - "type" : "INTERNAL", - "value" : "0" - }, - { - "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\arm64-v8a" - }, - { - "name" : "CMAKE_LINKER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" - }, - { - "name" : "CMAKE_MAKE_PROGRAM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_NM", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" - }, - { - "name" : "CMAKE_NUMBER_OF_MAKEFILES", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "number of local generators" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_OBJCOPY", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" - }, - { - "name" : "CMAKE_OBJDUMP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" - }, - { - "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Platform information initialized" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_PROJECT_DESCRIPTION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_HOMEPAGE_URL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "Project" - }, - { - "name" : "CMAKE_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Ranlib" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_READELF", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" - }, - { - "name" : "CMAKE_ROOT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake installation." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - { - "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\arm64-v8a" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of dll's." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SKIP_INSTALL_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_SKIP_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when using shared libraries." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STRIP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Strip" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SYSTEM_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "Android" - }, - { - "name" : "CMAKE_SYSTEM_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "21" - }, - { - "name" : "CMAKE_TOOLCHAIN_FILE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "The CMake toolchain file" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "name" : "CMAKE_VERBOSE_MAKEFILE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." - } - ], - "type" : "BOOL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_WARN_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue warnings for deprecated functionality." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "Project_BINARY_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a" - }, - { - "name" : "Project_IS_TOP_LEVEL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "ON" - }, - { - "name" : "Project_SOURCE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - } - ], - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json deleted file mode 100644 index f5036e18..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-dabd9aed57aedc8ee77b.json +++ /dev/null @@ -1,799 +0,0 @@ -{ - "inputs" : - [ - { - "path" : "CMakeLists.txt" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - } - ], - "kind" : "cmakeFiles", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 1, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json deleted file mode 100644 index 46f55bc9..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-108dda1a979928b8171a.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "configurations" : - [ - { - "directories" : - [ - { - "build" : ".", - "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", - "minimumCMakeVersion" : - { - "string" : "3.6.0" - }, - "projectIndex" : 0, - "source" : "." - } - ], - "name" : "Debug", - "projects" : - [ - { - "directoryIndexes" : - [ - 0 - ], - "name" : "Project" - } - ], - "targets" : [] - } - ], - "kind" : "codemodel", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 2, - "minor" : 3 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json deleted file mode 100644 index 3a67af9c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : ".", - "source" : "." - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json deleted file mode 100644 index b2135427..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/.cmake/api/v1/reply/index-2025-04-20T01-10-38-0489.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cmake" : - { - "generator" : - { - "multiConfig" : false, - "name" : "Ninja" - }, - "paths" : - { - "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", - "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", - "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", - "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - "version" : - { - "isDirty" : true, - "major" : 3, - "minor" : 22, - "patch" : 1, - "string" : "3.22.1-g37088a8-dirty", - "suffix" : "g37088a8" - } - }, - "objects" : - [ - { - "jsonFile" : "codemodel-v2-108dda1a979928b8171a.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - }, - { - "jsonFile" : "cache-v2-a012ed7e292a952c6e51.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - { - "jsonFile" : "cmakeFiles-v1-dabd9aed57aedc8ee77b.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - } - ], - "reply" : - { - "client-agp" : - { - "cache-v2" : - { - "jsonFile" : "cache-v2-a012ed7e292a952c6e51.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - "cmakeFiles-v1" : - { - "jsonFile" : "cmakeFiles-v1-dabd9aed57aedc8ee77b.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - }, - "codemodel-v2" : - { - "jsonFile" : "codemodel-v2-108dda1a979928b8171a.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - } - } - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt deleted file mode 100644 index 50fb732c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeCache.txt +++ /dev/null @@ -1,401 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a -# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//No help, variable specified on the command line. -ANDROID_ABI:UNINITIALIZED=arm64-v8a - -//No help, variable specified on the command line. -ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//No help, variable specified on the command line. -ANDROID_PLATFORM:UNINITIALIZED=android-21 - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe - -//No help, variable specified on the command line. -CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a - -//No help, variable specified on the command line. -CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//Archiver -CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Flags used by the compiler during all build types. -CMAKE_ASM_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_ASM_FLAGS_DEBUG:STRING= - -//Flags used by the compiler during release builds. -CMAKE_ASM_FLAGS_RELEASE:STRING= - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=Debug - -//LLVM archiver -CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING= - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_CXX_FLAGS_RELEASE:STRING= - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C++ applications. -CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm - -//LLVM archiver -CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING= - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_C_FLAGS_RELEASE:STRING= - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C applications. -CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//No help, variable specified on the command line. -CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project - -//No help, variable specified on the command line. -CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a - -//Path to a program. -CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe - -//No help, variable specified on the command line. -CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Ranlib -CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Path to a program. -CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe - -//No help, variable specified on the command line. -CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Strip -CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe - -//No help, variable specified on the command line. -CMAKE_SYSTEM_NAME:UNINITIALIZED=Android - -//No help, variable specified on the command line. -CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 - -//The CMake toolchain file -CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a - -//Value Computed by CMake -Project_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Whether to issue deprecation errors for macros and functions. -CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Ninja -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//Suppress errors that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE -//Suppress Warnings that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Whether to issue warnings for deprecated functionality. -CMAKE_WARN_DEPRECATED:INTERNAL=FALSE - diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake deleted file mode 100644 index f831fa9b..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +++ /dev/null @@ -1,72 +0,0 @@ -set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "Clang") -set(CMAKE_C_COMPILER_VERSION "17.0.2") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -set(CMAKE_C17_COMPILE_FEATURES "c_std_17") -set(CMAKE_C23_COMPILE_FEATURES "c_std_23") - -set(CMAKE_C_PLATFORM_ID "Linux") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_C_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/aarch64;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake deleted file mode 100644 index 285b0a65..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,83 +0,0 @@ -set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "Clang") -set(CMAKE_CXX_COMPILER_VERSION "17.0.2") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") -set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") - -set(CMAKE_CXX_PLATFORM_ID "Linux") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCXX ) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) - -foreach (lang C OBJC OBJCXX) - if (CMAKE_${lang}_COMPILER_ID_RUN) - foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) - list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) - endforeach() - endif() -endforeach() - -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/aarch64;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin deleted file mode 100644 index 5fd2037eab16fe4f1c8ca35ca8bbc858dabe79a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7936 zcmd5>eQab^6+iDyr`zsy`?cWiT6R0Ii*#joKHAxS5uxo)yB+A3vMee#_;zOAYiD4- zeDhjcAYmhr>>rv?g9a18^$#^*Vm8D?7BN7K22C_Vgv4mHXiOHPW?c}|Ak=g2JE!yd zwq0=JADrgibI6!*Y0r(-1^m5QehNNPL6aa>xAGTs1hCNV^ za2=*0uJ-eo?p6qIV7&lxva4{tpI^y(!o@@4>>6vVXW=cbEF4;0ne50{!NWWr;p6Ow zaKBxy(QPNUe?50402!CqQFGMa6#Fy9{R#gy4@kJ!ANz}A(!6|-pUZ3@^D@PDSMlWd z`2luRIQ2nv8`_bd|0|I_rBgg_e*Qc+C|vrBRu`*|Rg7lxrD!2vy2rA66QoMRc?c7Y zXSihA<-7^>+uPl}CbG+>c>GY`K)2h+ygPj;I`yl=a;U3_^k_-mbcHo z{m%6K%hUH=s$CjS`vwZzHo*aO{G)l$;N!@7`9gLZ{jfS*gEROoj|@5xr01`{L9GYchc@X2HO35w2r1uxQg^JEnrGwg5<$ub8Nh6 zck7e-6WA!(^kaG)6Rj~K;uDw%BYPog$Ha6R(<7K5*&NnSHB(8^H}?fz+YKjQ-Gga4 z088lB6*uh-yteuic;&tO^rzl?5SDO{oxx-5%vMY|muLRG7na@#bUxj%lw8^WwdBgp z-$<^U`z}27*A`eAc|5r?0Pv`R?VbSm!TA6@4SMJ6F9wX)33~(O&T!y0SY2%;uJ6)X zsAzx{cag#`e*VCGz$BeJ?zP^L(c5>Euf5$hAvh90U0xN!5KH>oRVglAl5O zORl`i#M6w!b!jsh=Uvft%te+xx`%N-zTw@~RkguTPeF3uu^RC80bR5Rk;LwVk^uNx zQtOPM6>g8!fwvu;VnFs#jP2!|7~*{<>rncYyJ4IaLu^Oukx1_1x49nImLh5YU+=r) zdzS0Puivm7W_>wNu4Wm32Sw}_$hp$ttCx9|^F{WI*q`V5c!c|VpXJ9`#$QwBpIiR_ zuw|Y&;e4lsyW;Vl#6Wj<|AFxJmDw`pnR3BFR&Y=_SS%2hNmng1TrP#}M1NmjqR-kN z&KA<8+3>t&SM!L+`y#POcepF(IF;&PG@5pA%*brHJX^4;*<6|~ z+roVDV8t%qZDpOXIWW^dFq1Ijy}i9X=Al@;+d7nu4I~B*&Gck?Vpi7bF}r(uyZ6go z?DhL2+i%)67`h>(uOHeOXeQ{oUDPnZ z)*$E%QB$GBIlP1*v0rOy8({5xQ#NW>HO4EBQ?LxHWaiT)w-ztzi_|jtS<$hr zFU;j_>m$B^lY`OQlea|qbckk)>3ghbPo%p$5|37KA}kj=NKo`>*_^}O9X)&$wGJOH z7c2RKWe<;}B3XAPJn<05b;HMw4c}?pp8DLVas1AyQNw_=J(~sWa>_jhs?o8+oa0z_ z^hn;x&1FQq1LHzDQljZfB^t>tEJTx5W^OhbFD24_v7Vl2+Aj7c4$k+dU3bRN7540S zu|hq~!(6GFpDp1@R?U@d2a0$Mp`Q-?9Dn6Hn8#exw0E1g5u>$$NxPg00dQx;Ga)%@ zY@>Oie(H2+)Mf1kTD9Pot#1W8ZwWTn-y94*7u;X}BPkxJ6?fD>FX-0#9|r^Vp_}yv z^c>r}6si8;pR0bICIz&teP>I38y0kEf#36fOLE0-#oIvcNzuPX724PCN5S3rV>`&b zC^(%E06RdwV+F_94QVIjeFN%Mcr%Q%KT5>x222`yD&KvNamA$KHJo9%o$<#d0O1OX zvuVVS`tVuC!+cLG5wi;8r+xbOGrsJ@AI90ANyZb5OWg2n#5KJ(KN4?! z1>3LN;CK9%>bGU>=vE?T-@&9o6UZqnaoS z*G8>Q#(AO1^`FPI1M%_U+kma2XO z0yI0q#LB0g~p<+WNhx9eZ2 z+!rb%htr8ckMTtt0~4GOez-CWvs&iL^-o%A^y>nn$Hwco^%6q<_Ev$Fc4mkG;Gz z2$vg1?8JZ7C}y9>M4^rJFYgk3)H`?Gr6aQ(szEze9|sSnTEh1YtG^W1W}8Ua(~>cdu$x#5ue-h`H@Tf3{9vZzJQ@l8{fme_(cnLe0F@nF|G+xAS&y-+qLh=y}Gwf zZ9p_Cm55ZRVhL6JLEBJ?qNG$xC8RbK+K5X0(W)w-!XJG|PAMw1Rh3fO%0l4Id^_V? zFEO-~KbX_E^UZH&zSn+_+3&tQHaV{Od?4h99|B1)1RP|T6{mM_2H7wSz!rRlU>DS) zT%#~YKkP8nIuzA5@_NSo$jPtFdN03%?SxAUiF4D~Vk3*zIkIqQc4YFSwhA8Q{s=$9 z?GWzuJK5lrb8^o{?nnUAFY%+|sJ>Zl&n(v`e1$tCT>NKVvke-T4{GNN>>%SZ&3>Ic zI9|S&8!DXYAo@J|Q9J)vB7aIJdEC7G87@$`)EB8NRcx~mN#}}@e6D!RwEE&?O5OP? zChE^f(XdK61L)mbJ$(kU4^6SyzW%`;r;ZO(2(^1VCYrAYrf!4Q>+gKvsaOA+TpoSx z)K@P4{%e2v-L`AquUzU+>tzhKZGr=6_@i;~!6%XP^o7heda)WvWmGP;i8$H0iEv6p zPFYTV{i*BuTsouYia8r}J+qk7Q?|K?0>R-*2_}>KM@cAe3$gN>U-z7x5PJdXT9a*Dp)>3{iZ zIPuahOe=m^#%685>01BGYd?b*-?>LS^UnRSjBD*2ZfEDVV8XFH_v*EYm3Fs|U{{R$qSt&iuIvR`)-dSiJ$@VI9kz1$gR`AI^f-@yZ3i{t96iQSJ!&Uxu}{ zX5!CX>1*!AI@j)p7uP!A{7O5VzZitowI(?KM*E5LWRrb!t+^qW8+g5G__$&GpbCDw+S=R6_#(8^(x7XIx!b3j=$$7|Tz{d+j zX>uZo->i}V_}EhOkDyg9kIjLXBb;JD)>f4LWgnU4^(XUF>Xox&f(?W0NAr|O&g!>V zk8@5D&3B@IzU%bwN3552{hH;FvcmI_8@iiid@qW)Ss?pOyGJkMD*KMCCGo$+<8g}X zdza-$SjP7&2)2ieUkM)P6;hs=e*0#%)p-3dLdy35SiA!BfEU~n#O#QOUBdX0V2SdY0c6CI2X?wjjP z_eRZ(*=zLl_Vw(Mv)bM6k5TI;RfI7Vnw(7VnBZ>S;=8V~E#Pl#-qGIJ;%mhhp~b=9 zm~0yg-VoGw7I8E6`+UhZ+~jvdvaKJdbl`f-U_jT2b~grth}2Ow7`zd)^`HvZ3&@!F!{DM_+Meao5}A11eISC1nA_d zjpN#{)3h1PKS>U)4gR;-;n)U;X3)xL@FE%QZSZgBHU8{|)-*!ByZye>C>F2P?M9;p zZF%Q+kgrS45vA)wY>T$M^qMfyRne&guq z`pC@8$nE;A$vejM!?#b5={lsW`3#jEbISJAIG_ro0mYX%?d&&|$asFiwoNN?AZKS6 z(jwl50jlg>kyN=H31=1;BMCFTFdvB(`WDP+&;);ui{ekp9t5sgWMkp zZX(`_>s0RRWM1VFZ^56$%`$)PQ+Rcq3jUD7tLs$oN4b32p(qw1dQ9O?-u?W|COCv~ z!!@lkgo`EH3`;TEQFmW z`PhhCWa@w!Df`u6CaLux>5m(tqZDW1|3#o60-*l9bJ zMxI5LlXEy^EIVz^=ZfJBbS{QtpjYgaW$WrR>omeWfRA2!#Obk*9)0xa2O4snhg^4t z9Py}wt6@aZHzir@VSKdU2tUHmyxhG;COO^Rxf|jyCR?tcDNRgBW%1 zefo{s0Wuk+M=YwIE*D)NpBXu%E`Bgq)j>51E?Mh+z@)c+_5mm}^obW%CA**!a} zm96B7)BOQ`>x;klo>$IWvL%vz%#i>nUU2)%IV!wU44HfVqln`-)_VPN&#=zfkJ?H7 zlzmI?ALyQezTu_)@|`c7kKOfli=FT>^rt%kk>y@McnI}GQopzT^v&`wm%rR|2$vH^ z{G|P=P<-5pi9#N!U+zVOhfqf({$6gNjzSmle~aT7;WR#OqA_$+9tA2>{NE>)6n;VsnM?ZxK8+cwU*?&d)57Wg*iGL0zl%z@zuXrIA9g!qzS$#xk1+{fB_5Ff zm%R4g_CJmO6zhq<+_MeSqDJ~4|L4)B36uECcfj<2>HiY?(%6Z=#6Pp_zry1u_ngvx zY1ePjmrTT8{=XPzhY;%AB>sY}V8-n)_n@=v-zA33z5Z_?PMFj$-#hYuqSxLl{|$Yq z{wO9liT_>Pf6<93{NJdMyx0(blP_W)bc2}p+6EBtV&rlkZOTYaT9uWPe{cJL z;Cy((q-Vj3zwoQrzgmNndxt+je&tb!pTKmdd^awAw4$OZVlZ?OYUs3dz fcSrU@Sq`-Kdn)vZK-YGc^FPZUVwXG)9ufWnC7m}? diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake deleted file mode 100644 index 1b987ed4..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Windows-10.0.26100") -set(CMAKE_HOST_SYSTEM_NAME "Windows") -set(CMAKE_HOST_SYSTEM_VERSION "10.0.26100") -set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") - -include("D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake") - -set(CMAKE_SYSTEM "Android-1") -set(CMAKE_SYSTEM_NAME "Android") -set(CMAKE_SYSTEM_VERSION "1") -set(CMAKE_SYSTEM_PROCESSOR "aarch64") - -set(CMAKE_CROSSCOMPILING "TRUE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 41b99d77..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,803 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif __STDC_VERSION__ > 201710L -# define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L -# define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L -# define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o deleted file mode 100644 index b4f6e7a2443451d6d2d734dd415bd2413e2d9491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6000 zcmd5=U2Ggz6+W};-K@Rtrj7|s>oncc01c{V_AlPGL9HX_r%pp0r41-p>1w0-h0k>zkANPzjK_&4jnrjGYsHjz%L=t7zJ3lIgqD?I1Rgzx%oK!X7di% zcz+Bw{*;DKHn+n@3gD@fG5yJ($IfpIHX4=d+ov~D#$fvTf6+&_e7kVre`WK1j0@wx za5Y|iXZHBvxv5&GwbE!h?)*&CZZDky0j@M{Z?WUH=8rYntLqZ9-P-cJl)IkYuG?r}PFkRW$ZnvhoLo7eqDe`w?-dj93z&d0k>UM#f`?^%h)>{yD%(z(}L`;ZDJsG1^ZI8 zd~l#$cRP)G_U?SXSeh&pD)(d;?52y1*Zp|_A(pg@o)2uDqjkeWnuC>Nj+|JjXnwPClE>aKbJ2!`)j$$(&YZd;zBX!)SP0yP@E|2gPAYeXPucDd4Ff?W(^KbStoouUF&dj z)$<(JI@0i#R~J}4)oyqklVz{0SY~Z~-8$$jtS(vkcF8X1ibczITN9=6wTf*CABXXM z=vqayP%!i3OT}`oQn4%J^@i&`Vg>GJ0B7SuwR+&>$pfdW56*t=Q1zkHCk|Ds&}c7q zs{GLSnp`el;pfKJ=$-K;TG&;4$*Jnkjn*B0bD)I_i!2Xpcd16z8o186)rRZ*zi%r5 ze|C&VPlEBSJ;vDZ9YE(;oMmk3oWsFPHg+{b5FmS5EpYLc z_TgQDr}{8bmIXc-!fOJ@Plr|>7WhpX3UFHB+e0`3aTp2V4+(x4pA-0w5Z|}+sSy5* z;D_)HUl;f-A>6l*A3d$K1V4S$8ioYxHV4WF{q5TmE z)|v622|jB81=OjW!rur4>(7jR0uR=oabB5G^z&&lAPe8SJsO^q{lr&SsU&gYtN1a6 z&o&7wQ4*iAZXeqsDssq>x^jyYPd@R~56 z&J&eAek0=Py_Sga{&Jj>2D4INI~Mw(!t-FfB=N8M-N5+$60b{~>~qWneM94aMe=#y ziLaiMA1iifzj$9RYj*ti3*cpiub$gqD>&KVef*Cxp>qgko$|J-y|CaqYhZeq2La`lEe8`H({-A* zS+_mg6!}*#nTp7kw&aEqFX^)DxgiI=1W#HMv5{+Jc7ixK^Yd90vni4_J%(OVXtq0^ zV;(tvY8<1foelXF`J(Ex*=ReG^{<>c5mIBq^d$ynW_n@ z_ES}&Dqo~pRQUplqRQt*UvH9VHE;S@4)(5_Ik|iPd2=70hp24lnxFo`i}L)i2Tc`k zBVqiGGH;p%t))AqmS3Ur@5WzK$tdgNUzgal#@jXI1ANcvZqhvYd(3ag570UJ=kK~d zivAAvCH_t_E@3f-uqW_Gn7)R7eiQg3E*19gYXFa-Ky#XAK(-Z`ig271Kdmv3XZ$6^ z$iI50QHAp|P<>t;KXIu14u4VczbuLDPmr7Ipu3ZQ=jz8}v_kMAZ6UjPOr+jP9S@NLMHY z<@XZ&Q2+@^=RSj|juEjd59BYjPECc2$c>8sij4odv_t2gaxXo84>7W-zl8h9D3*6L zhpci-c}vvzP5CF?bHYkc@i=ZjkmCb}FFmV2h?2nLnEx3B2-ENHB{^Q77tf!^-;RT$ z*6*Txzxkfg`cdA+;~5{3{@EV4Z%h9_Wk9wRt6GM)@P8%3Kjn|Qf6A-$xs&~M@qdK? Nmt-gTrM=R}{|inga~l8v diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index 25c62a8c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,791 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__COMO__) -# define COMPILER_ID "Comeau" - /* __COMO_VERSION__ = VRR */ -# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) -# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) - -#elif defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > 202002L - "23" -#elif CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o deleted file mode 100644 index e9198e068ace14e81d10a93d4e0d04362ba24779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6016 zcmd5=Yiu0V6+W}$b?mIOiDLpOj=~}WN-8}2w0G@PsiQo=Avjh@q<|AGWzHwIp6)x<38tZ?mKk!aKtcxive#ypfL)tvL%qmg*Xm7kh%6V`19ITu=?R3 ztbP=OFV{B1Y7fA}J;wN#e;-^~?X6S_pKcys?J;^|pMFap@qJr3_g(D1Dc*+|8*@DO zmRWpfV)F2@u~L1ZQK>ra^nt2fn>zynY*cM;w(c%WAFb3DmnCSsrTJ+oH$A&nw%u~E z?9AGWRc|_-mp#t1=hT{&dac>&J2rVHn5=J++Hxu`IWD=HPKlDvTfUG=v5+|fM!#`w zd?0GZw_Gt8?>Dw~14ME#F)$X}8;xuSFb!j30HEt?#PTtK=yfOnbngN)zAqL-WCMw@ z*gh0{awtv={P+iK-Md+^H~P4b*5Uv$3*&C>9^Y=p2_zGMz9>Xm0KlePn+mVvM(Psd z?-5(->d?8kfN11LSQ+;ly(Ux48&T>yfz>vM-i!?n6Vo*|h-L#WIlx)`YcuL4Bj48_ zBZ04gtfG;Z$ox+VFNoO(fsM+Dd_p!KhuU1J*r<%ib{xF%d8o|}#YSap#4vDz?4D5U z2n=$}0Ir{3XbO!w$;MjbJeu`I&f!i_RdIZ=_eJd86gk%?dJU7v{?tahdS6AQm*yJw z*UE0aQcmnnr?a`yOr~&sV#aPd9vK-Yq@7*M?JXgVX}GO~aZjvNnccdkU$ z61dLU#ft0vzb`j!NZ`+parbdB?%8P!_FV~EN20MK(RlZ76m78kw}@cJ zMQqIY#pqBQG1<~KBGK%Q9f|Z{CLAH8eGIWK_-rkt3rzf{mkYvKC;m1Pjn=FIWE4Xa zqKf8=j|e}V_|F9{F5fnrdju|S$u|6~z{UO5hF1kHuAMe~PT>BUwRNCkD*1EYjNtQb zVAO9-=x+y5J0tj=_$h&J?cft&!et%!bAsQA|5D)FI`}^k_!S*E0Vd$LQ!7h?---Vf zd0Ulr7yBHsU*KQAe{%~@yb}KvIBWRD6ukf^1s=>l<9h@i%s=BhF`s@2){$|ZfdTC2 zvqvFVCOei1Pf>-1`0D6#J`BWH@hOQDKgbq8h7#YV;qwarN-0xQl`{EP@%trC{s*N@ z%>z;uSlHytNUj~ z!D;?^3=c}2{hyY8ey#A;eRW>J$q%o~?=(MmNI!p2_&cOb&HD;Yes~=}lQ`$&Nk3mH ze4cZHw#a^-PhR(HCC+|+CH0KLSNG>$jZbelDmN;8^&CxU{NGF6R`}|=*ERlMq<*i4 zzc2NNH2fo}KcV4&llt=-{;t${&ZDTS`Rw(FC(fOUgH@(yT+yDHah)ZwJbWPmJvSE| zeDheYQ?;$K?b()i6t$jNA@8VlxgAe38M5iQ9RXUey>;HIGKff-GC~J+kzVJ+&8O0M zEb)fZ^J_gNtyLHJ3Dd`uS_*?wNi5=%b73Ey7mI9I2zBM!S=2NYIl{b zQK|}5<*6E>YM81VRp~6%qDp5-6jeGc`dY(6uW8H2Qm|{;;?IIy&F|mPKJR?}0K6?P z&6nkV;s}}wo3Vp1zHgZ~&VttZzh?vR0~Ei>{z5<%l5YPVqJ)i$-k?g!Pw#&uL}#AH z$=_kVBOk@!6kmPck;y-)!ouG{U-P*nlMNO69+Irjq5nP#;t`h$$M-dW`%nnWKOujd za-Nhw%`w|E{%^#>;@>V4WIobF(e-~I8Wz705}$0@p5u!j=ZNd$pTETT^o|INKNS+6 zmQ;^_46(5BH!d;$5ws7BKOYjGz5{yvYu1Use2MYty$}|EB_uu_Nj?5sGJe}#j@XKf zukULKBf~GG>lpRCBEc7YTC3K%uVRmm5&5)C=%UuCsqi9l!^Z!Z96xU?+W+)M)5q^2 zMn3fm@p5vCEk|6zxOjPu|~rPHFz=*A&|`J|yF_KW^WZ@thbA4rH`FL REsOuC1b9<+QrxiozXq3UcfJ4s diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 4bdaf849..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,2 +0,0 @@ -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/edit_cache.dir -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd731..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja deleted file mode 100644 index 89d02a41..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/CMakeFiles/rules.ninja +++ /dev/null @@ -1,45 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the rules used to get the outputs files -# built from the input files. -# It is included in the main 'build.ninja'. - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= -# ============================================================================= - -############################################# -# Rule for running custom commands. - -rule CUSTOM_COMMAND - command = $COMMAND - description = $DESC - - -############################################# -# Rule for re-running cmake. - -rule RERUN_CMAKE - command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a - description = Re-running CMake... - generator = 1 - - -############################################# -# Rule for cleaning all built files. - -rule CLEAN - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS - description = Cleaning all built files... - - -############################################# -# Rule for printing all primary targets available. - -rule HELP - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets - description = All primary targets available: - diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/additional_project_files.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json deleted file mode 100644 index e0b2c452..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {}, - "toolchains": { - "toolchain": { - "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", - "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" - } - }, - "cFileExtensions": [], - "cppFileExtensions": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json deleted file mode 100644 index 1b93826a..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/android_gradle_build_mini.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\arm64-v8a", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {} -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja deleted file mode 100644 index 2694fce2..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build.ninja +++ /dev/null @@ -1,111 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the build statements describing the -# compilation DAG. - -# ============================================================================= -# Write statements declared in CMakeLists.txt: -# -# Which is the root file. -# ============================================================================= - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= - -############################################# -# Minimal version of Ninja required by this file - -ninja_required_version = 1.5 - - -############################################# -# Set configuration variable for custom commands. - -CONFIGURATION = Debug -# ============================================================================= -# Include auxiliary files. - - -############################################# -# Include rules file. - -include CMakeFiles/rules.ninja - -# ============================================================================= - -############################################# -# Logical path to working directory; prefix for absolute paths. - -cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/ - -############################################# -# Utility command for edit_cache - -build CMakeFiles/edit_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" - DESC = No interactive CMake dialog available... - restat = 1 - -build edit_cache: phony CMakeFiles/edit_cache.util - - -############################################# -# Utility command for rebuild_cache - -build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a" - DESC = Running CMake to regenerate build system... - pool = console - restat = 1 - -build rebuild_cache: phony CMakeFiles/rebuild_cache.util - -# ============================================================================= -# Target aliases. - -# ============================================================================= -# Folder targets. - -# ============================================================================= - -############################################# -# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a - -build all: phony - -# ============================================================================= -# Built-in targets - - -############################################# -# Re-run CMake if any of its inputs changed. - -build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt - pool = console - - -############################################# -# A missing CMake input file is not an error. - -build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony - - -############################################# -# Clean all the built files. - -build clean: CLEAN - - -############################################# -# Print all primary targets available. - -build help: HELP - - -############################################# -# Make the all target the default. - -default all diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt deleted file mode 100644 index 7fba5c85..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/build_file_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake deleted file mode 100644 index 74f867b8..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/cmake_install.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "0") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "TRUE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin deleted file mode 100644 index ffae4add..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/configure_fingerprint.bin +++ /dev/null @@ -1,28 +0,0 @@ -C/C++ Structured Logq -o -mD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\additional_project_files.txtC -A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  �����2n -l -jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\android_gradle_build.json  ��Ć�2� �����2s -q -oD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\android_gradle_build_mini.json  ��Ć�2� é���2` -^ -\D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build.ninja  ��Ć�2�� ����2d -b -`D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build.ninja.txt  ��Ć�2i -g -eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\build_file_index.txt  ��Ć�2 b ȩ���2j -h -fD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\compile_commands.json  ��Ć�2n -l -jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\compile_commands.json.bin  ��Ć�2 t -r -pD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\metadata_generation_command.txt  ��Ć�2 -� Ʃ���2g -e -cD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\prefab_config.json  ��Ć�2  ( ǩ���2l -j -hD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a\symbol_folder_index.txt  ��Ć�2  _ ǩ���2f -d -bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt deleted file mode 100644 index af2597ed..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/metadata_generation_command.txt +++ /dev/null @@ -1,20 +0,0 @@ - -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy --DCMAKE_SYSTEM_NAME=Android --DCMAKE_EXPORT_COMPILE_COMMANDS=ON --DCMAKE_SYSTEM_VERSION=21 --DANDROID_PLATFORM=android-21 --DANDROID_ABI=arm64-v8a --DCMAKE_ANDROID_ARCH_ABI=arm64-v8a --DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake --DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe --DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a --DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a --DCMAKE_BUILD_TYPE=Debug --BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\arm64-v8a --GNinja --Wno-dev ---no-warn-unused-cli - Build command args: [] - Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json deleted file mode 100644 index e799de86..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/prefab_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "enabled": false, - "packages": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt deleted file mode 100644 index acb205f8..00000000 --- a/android/app/.cxx/Debug/1n4a7033/arm64-v8a/symbol_folder_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\arm64-v8a \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json deleted file mode 100644 index 74d3ea5c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cache-v2-2cf3899b2994a50f6472.json +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "entries" : - [ - { - "name" : "ANDROID_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "armeabi-v7a" - }, - { - "name" : "ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "ANDROID_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "android-21" - }, - { - "name" : "CMAKE_ADDR2LINE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" - }, - { - "name" : "CMAKE_ANDROID_ARCH_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "armeabi-v7a" - }, - { - "name" : "CMAKE_ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "CMAKE_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_ASM_FLAGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_BUILD_TYPE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." - } - ], - "type" : "STRING", - "value" : "Debug" - }, - { - "name" : "CMAKE_CACHEFILE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "This is the directory where this CMakeCache.txt was created" - } - ], - "type" : "INTERNAL", - "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a" - }, - { - "name" : "CMAKE_CACHE_MAJOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Major version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "3" - }, - { - "name" : "CMAKE_CACHE_MINOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Minor version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "22" - }, - { - "name" : "CMAKE_CACHE_PATCH_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Patch version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" - }, - { - "name" : "CMAKE_CPACK_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to cpack program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" - }, - { - "name" : "CMAKE_CTEST_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to ctest program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_CXX_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_CXX_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C++ applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_C_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_C_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_C_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_C_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_C_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_C_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_DLLTOOL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_DLLTOOL-NOTFOUND" - }, - { - "name" : "CMAKE_ERROR_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue deprecation errors for macros and functions." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_EXECUTABLE_FORMAT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Executable file format" - } - ], - "type" : "INTERNAL", - "value" : "ELF" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "ON" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of external makefile project generator." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator." - } - ], - "type" : "INTERNAL", - "value" : "Ninja" - }, - { - "name" : "CMAKE_GENERATOR_INSTANCE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Generator instance identifier." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator platform." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_TOOLSET", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator toolset." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_HOME_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Source directory with the top level CMakeLists.txt file for this project" - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - { - "name" : "CMAKE_INSTALL_PREFIX", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install path prefix, prepended onto install directories." - } - ], - "type" : "PATH", - "value" : "C:/Program Files (x86)/Project" - }, - { - "name" : "CMAKE_INSTALL_SO_NO_EXE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install .so files without execute permission." - } - ], - "type" : "INTERNAL", - "value" : "0" - }, - { - "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\armeabi-v7a" - }, - { - "name" : "CMAKE_LINKER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" - }, - { - "name" : "CMAKE_MAKE_PROGRAM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_NM", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" - }, - { - "name" : "CMAKE_NUMBER_OF_MAKEFILES", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "number of local generators" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_OBJCOPY", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" - }, - { - "name" : "CMAKE_OBJDUMP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" - }, - { - "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Platform information initialized" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_PROJECT_DESCRIPTION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_HOMEPAGE_URL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "Project" - }, - { - "name" : "CMAKE_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Ranlib" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_READELF", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" - }, - { - "name" : "CMAKE_ROOT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake installation." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - { - "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\armeabi-v7a" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of dll's." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SKIP_INSTALL_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_SKIP_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when using shared libraries." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STRIP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Strip" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SYSTEM_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "Android" - }, - { - "name" : "CMAKE_SYSTEM_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "21" - }, - { - "name" : "CMAKE_TOOLCHAIN_FILE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "The CMake toolchain file" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "name" : "CMAKE_VERBOSE_MAKEFILE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." - } - ], - "type" : "BOOL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_WARN_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue warnings for deprecated functionality." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "Project_BINARY_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a" - }, - { - "name" : "Project_IS_TOP_LEVEL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "ON" - }, - { - "name" : "Project_SOURCE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - } - ], - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json deleted file mode 100644 index c605976e..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-5b36d7a0891fdde7d468.json +++ /dev/null @@ -1,799 +0,0 @@ -{ - "inputs" : - [ - { - "path" : "CMakeLists.txt" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - } - ], - "kind" : "cmakeFiles", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 1, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json deleted file mode 100644 index 6cadbacb..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-6500251f75d592877858.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "configurations" : - [ - { - "directories" : - [ - { - "build" : ".", - "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", - "minimumCMakeVersion" : - { - "string" : "3.6.0" - }, - "projectIndex" : 0, - "source" : "." - } - ], - "name" : "Debug", - "projects" : - [ - { - "directoryIndexes" : - [ - 0 - ], - "name" : "Project" - } - ], - "targets" : [] - } - ], - "kind" : "codemodel", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 2, - "minor" : 3 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json deleted file mode 100644 index 3a67af9c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : ".", - "source" : "." - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json deleted file mode 100644 index c9e04316..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-20T01-10-53-0270.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cmake" : - { - "generator" : - { - "multiConfig" : false, - "name" : "Ninja" - }, - "paths" : - { - "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", - "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", - "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", - "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - "version" : - { - "isDirty" : true, - "major" : 3, - "minor" : 22, - "patch" : 1, - "string" : "3.22.1-g37088a8-dirty", - "suffix" : "g37088a8" - } - }, - "objects" : - [ - { - "jsonFile" : "codemodel-v2-6500251f75d592877858.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - }, - { - "jsonFile" : "cache-v2-2cf3899b2994a50f6472.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - { - "jsonFile" : "cmakeFiles-v1-5b36d7a0891fdde7d468.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - } - ], - "reply" : - { - "client-agp" : - { - "cache-v2" : - { - "jsonFile" : "cache-v2-2cf3899b2994a50f6472.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - "cmakeFiles-v1" : - { - "jsonFile" : "cmakeFiles-v1-5b36d7a0891fdde7d468.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - }, - "codemodel-v2" : - { - "jsonFile" : "codemodel-v2-6500251f75d592877858.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - } - } - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt deleted file mode 100644 index dcfb59a5..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeCache.txt +++ /dev/null @@ -1,401 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a -# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//No help, variable specified on the command line. -ANDROID_ABI:UNINITIALIZED=armeabi-v7a - -//No help, variable specified on the command line. -ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//No help, variable specified on the command line. -ANDROID_PLATFORM:UNINITIALIZED=android-21 - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe - -//No help, variable specified on the command line. -CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a - -//No help, variable specified on the command line. -CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//Archiver -CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Flags used by the compiler during all build types. -CMAKE_ASM_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_ASM_FLAGS_DEBUG:STRING= - -//Flags used by the compiler during release builds. -CMAKE_ASM_FLAGS_RELEASE:STRING= - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=Debug - -//LLVM archiver -CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING= - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_CXX_FLAGS_RELEASE:STRING= - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C++ applications. -CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm - -//LLVM archiver -CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING= - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_C_FLAGS_RELEASE:STRING= - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C applications. -CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//No help, variable specified on the command line. -CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project - -//No help, variable specified on the command line. -CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a - -//Path to a program. -CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe - -//No help, variable specified on the command line. -CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Ranlib -CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Path to a program. -CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe - -//No help, variable specified on the command line. -CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Strip -CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe - -//No help, variable specified on the command line. -CMAKE_SYSTEM_NAME:UNINITIALIZED=Android - -//No help, variable specified on the command line. -CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 - -//The CMake toolchain file -CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a - -//Value Computed by CMake -Project_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Whether to issue deprecation errors for macros and functions. -CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Ninja -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//Suppress errors that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE -//Suppress Warnings that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Whether to issue warnings for deprecated functionality. -CMAKE_WARN_DEPRECATED:INTERNAL=FALSE - diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake deleted file mode 100644 index 4cc8597b..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +++ /dev/null @@ -1,72 +0,0 @@ -set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "Clang") -set(CMAKE_C_COMPILER_VERSION "17.0.2") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -set(CMAKE_C17_COMPILE_FEATURES "c_std_17") -set(CMAKE_C23_COMPILE_FEATURES "c_std_23") - -set(CMAKE_C_PLATFORM_ID "Linux") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_C_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "4") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/arm;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake deleted file mode 100644 index cde60825..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,83 +0,0 @@ -set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "Clang") -set(CMAKE_CXX_COMPILER_VERSION "17.0.2") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") -set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") - -set(CMAKE_CXX_PLATFORM_ID "Linux") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCXX ) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) - -foreach (lang C OBJC OBJCXX) - if (CMAKE_${lang}_COMPILER_ID_RUN) - foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) - list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) - endforeach() - endif() -endforeach() - -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "4") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/arm;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin deleted file mode 100644 index b2a64d599b9cdb1c57025b3d4d9d6a8eba81265c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5772 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 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif __STDC_VERSION__ > 201710L -# define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L -# define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L -# define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o deleted file mode 100644 index 26ae39ed31ad491e92b4cc42eeff117add418400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmd5r8|>bH@mCUUANu3(i_#{Wn0ooX0jWbP14C^ zO`%nhB8m$20$LP(P!aK^3i={NQ4moOAARrw`rwm@iXte~@1LBLosF&d=vmJBZ{PX< z|J?q`KDc}DtfD9+n?fVBA`y+me2bp-$p~Eo>zVWFEG4wF>eI?obavxytzERJo|`^G z&qsIB*(W2==VvNbb>S%a%6i4}N;P+Bes8(jYzd|178mCQ-|(!eZMk;dc1l*W;?1XW z!s4_%r`jmjs*R5A!2Y9t%vJI7%Z|&i`J~@cIit-alafjEtaa!&qK}~;L{|os>*7PY z7VlrbIX<8ahKbZH%?(Y)Zqn5aM4F<^4H1Q|g)WD4(6^En-x-U64Ko{y?F1Xif}I<> zWuu%H?E{`@%{HI(7zi^Mp4ybn?}uOacqYEu~enY|QgNGw~SC-plF%CC_409LS@C~{h2 zf05WYG|F#~_@Gv>!xVW@V%Z8K_3*&kq1<(WXGOI-NK8E){dkoa`m8P957MiirY~5G z`C!sNgrJ9_r$C}p>~OkjyS1{N7)hlv*@<*|e0!o`H5@xpt0vs+crKUCIX5JVe9;r) z`X%_{8R^8xqUY5clctG#%|48UT5X}?G-^$^=ook;rdO*~ii=jcYE~-COQUtScAr!9 z681!Ce4>=KQ)6Re8GA=Em3DR%lM~sA9i>bmlXQws#!hF((l^k|KI^zMGb7&HoNW|o z*Q9x{?WbYRR+^sYxaOX+x7aL5@o=^5$(&59UN?S$sw1lk%$|K8NDDtpO zu5+SUc5$`;-v>K=6YieHCqPOH>`dB7PEfcfG96Xcs6AS*5~n_;Ul~vbLsuy4XuY;U z*{Ez%wng-|+_Q}N!lkXa`izmZ$x{qzcG$ghO>^86WJOCY%S#P8u!H_M-| zt4y@V!ipa0c~6g<`f#|U#|=GZ=<)DEm$ac{+Zc1%3Y>_|NTYT=ln zeS5Nm>Kphb`tdOw;3P#0(a#qp&s4+TBLO>WT*zJrwT zzBnzYwcd8s)^NxVu^cBl!?cg+QKsVHZ}g81#aD+C?cXTAf23l7Yf`a2gM#u-sB6gI z0oGs5GW;f)!tb=e@oxjR9}x5iQ{;PG$eg!|JfCKYdAwhYf0ZeMzAf}03H=vLvA%DF z{wJa5eO0l}9_%Ok*~}DvMwnvVqfC)sPUvR^JuIj#=m|mbsV6l`G|ZIe2}*{|wJ~oM z3a+zEhKEW+T)&qblorEvDu!)&mf;t;PPMv3Il3J5ABD}BKD5uUJkKo`nx4~;2{b&n zJ6xxpwtf3~avs3dR+5r+)(5d~r&YFF{z44DM*0R`S3q2u-l@z+wdOg-p8bbMk#g~P zcQSs>4kS`3R~>=z6Dzsal5?rbVqj&SRUo5ra*63y+emd*09y*;R?pyz_8(gTXBvFz zFXG-l4xMb0#r5&uF5h`>?cdjJo=1Lj+Tt|8n$L9h5+dte*)rv#O8 zvQWxcjFkM7;Dd4PKwOS5+i zjRbJ=PV59OxZX1m`hny1@)upMH{IpWgTL1U{$yOE%ipu`hb{E|@%KaeyAL?|HrUND PzEAxk2LHptIL_m5@|;Lt diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index 25c62a8c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,791 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__COMO__) -# define COMPILER_ID "Comeau" - /* __COMO_VERSION__ = VRR */ -# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) -# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) - -#elif defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > 202002L - "23" -#elif CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o deleted file mode 100644 index a1587aa328e81e519bed7a714803628051b95f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4136 zcmd5^_LBAP zc6QcsR1gu0asm;m0EtA)1uj(&Q3YIzRHXLUR;tuqdf?DX2q6x@6`}C^-oCe<-PBc& zeb#%w_x*Xl_q~7LtY1B~x~yp$siM&&?Mg&zDPb`S0w(DvuwK2bFH_pMuK!Ydi>@Df zYG;Wy^;-)s(9OgWT^}Ei^;;G+$~rP&9UhSBX6$zBH2q->^DUuHquQuPQMuf{ZCqJ7 zyZrQArMcCr)%{?7vFTXzV23zZ^wMJ)0D&3&6xi0(d&~12b;FUbT>UQek zdbTJn{!ZvO+O=k*-LpM?_M({c5ZXskITntqZ~oG@AMmjCj40Wn-R)#Ds*}4&+L-o` zb-*;N(R=T=#RpD-*|@(`jClk}c~XkVdEq}OoxF{}}- zxCRf>uZ2YPvBVu9f+y0hYNo+TV;)Ux70n?sPXXdZj7?}mk1-4-)&M@#y#d4Xkh&ay z(M^N*H}Rr!Vht3e-$bMR6%y~gF^@*fF+z#D@?|UZr2h$x_Af|$M!UX;DY315*(!X$ zVc+i{@mcQr9-+kB%9pL|oBRZtW2oADQu9X$#ym_SmK@V4nPRa}^dCuA_~xhO{Y&%BvvcXm%`j}W=NtzYojL4{W^<$Nx0{`y;@fyNPS|YL zE1Pbu;neHfTT`u|`I27=)81@#X0}@JveVPkdGACfoAXapGP8x*6V-ezy$41Lt%t-0YN<_*|nFs<<4t)pG30 z&W^L>mpdCywo!14nS9=HgDu}J*QU0Mt|Mkz#xrj_c{`W0vr`-SVrFK>otg4#L3r8O z4FT~GRuxdGv~cd+!uirOD;G|co;|;Is#Ky{quMN~jM0@;s_06bBf34_(~i60mj+YC zfcfrx(RGl=L8S|;*_@bHX|}NC@CnHcHY(g~Q{ex+Qw#7m{=W}=;Uw;)%cnwG7Tv|1 zotdS0a%dr;4eLo`M6+nWHmZ&3qoVR`F@Y0-a&~WvuH0{Bm1Nd zAPPU9C#_Ms1&oPok1x{q);>HC@nr&sw%4T-1g6el+%YwCDEWKSa?B&~s%hC~$~LX| zMnt+lz6lKsFvkt6YEJbzIz1@~MB0Gaj1n{< zNi9$xc3@DF^BSYrKr;y8k zLw3;<$f}IPBzB6CSF9re^GaEMfDybIMhse(`ZE%rmFO}ePL7BDE=&D2M#OzX>iK+` z_jinAM4w6h-=zL?My%^=ssBOhlh_v>>)g+X@kbbOoM|a%84>46DgRXBd5N16I}#_D zHwhj_9w(7(k5gyKEtdm-o9qxdi8#e?`N%SM;MZ->4P9GgpRY~ z?S^4cD|bS_tpaF=!QgbgWV^@5qC2GspTooOrik_Kv?)A!UVo?N?TAI%B9#gQuQ?*_ zuD6%p?M5^7?bBzUo5FG`mj(kBnLiRuz1HxhkBF`sxLZ(QiJ@BtUfyCn=Goa^%&=u4 z9t&;0dH-9vgtHYtF{JyaxFcsi%SWi3 zA5`JkxxOV)&69>w&BeZ|{|5Ted0&pq%k!&sjLUfyAODzB98o?C`Y7Mk2p^tak8f^( zZ*mX5=>fjiBYd34RD7J9;M&{Q<9qO}z$Y5tjR+r7R*&!K0AFSgK0co)-+K{0PSGm9 zKTAHO9Z?G4Q)kEuj-3mm>a$#h@Eh*PqHLc*R(&>&g7{iQp}L>K7LD%%#K!|U?t`c* zKE9tkM!mduaM0f<5@}UBl&kA39ao#+84tFsky9dU#TyYyo6U)r$H(rUan! z<9};ZpUoclCL@08E?$6B-+CeNIq-V<`=-`=c7X47@ck;nr{>~sN|f&-2)u>N$KMgf U*M^@uTc$ZKzf;Vk?kUIdBlB=k^8f$< diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index f4e48dcc..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,2 +0,0 @@ -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/edit_cache.dir -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd731..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja deleted file mode 100644 index 00521143..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/CMakeFiles/rules.ninja +++ /dev/null @@ -1,45 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the rules used to get the outputs files -# built from the input files. -# It is included in the main 'build.ninja'. - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= -# ============================================================================= - -############################################# -# Rule for running custom commands. - -rule CUSTOM_COMMAND - command = $COMMAND - description = $DESC - - -############################################# -# Rule for re-running cmake. - -rule RERUN_CMAKE - command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a - description = Re-running CMake... - generator = 1 - - -############################################# -# Rule for cleaning all built files. - -rule CLEAN - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS - description = Cleaning all built files... - - -############################################# -# Rule for printing all primary targets available. - -rule HELP - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets - description = All primary targets available: - diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/additional_project_files.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json deleted file mode 100644 index bd526cfe..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {}, - "toolchains": { - "toolchain": { - "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", - "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" - } - }, - "cFileExtensions": [], - "cppFileExtensions": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json deleted file mode 100644 index bb5195c0..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/android_gradle_build_mini.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\armeabi-v7a", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {} -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja deleted file mode 100644 index f3886c26..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build.ninja +++ /dev/null @@ -1,111 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the build statements describing the -# compilation DAG. - -# ============================================================================= -# Write statements declared in CMakeLists.txt: -# -# Which is the root file. -# ============================================================================= - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= - -############################################# -# Minimal version of Ninja required by this file - -ninja_required_version = 1.5 - - -############################################# -# Set configuration variable for custom commands. - -CONFIGURATION = Debug -# ============================================================================= -# Include auxiliary files. - - -############################################# -# Include rules file. - -include CMakeFiles/rules.ninja - -# ============================================================================= - -############################################# -# Logical path to working directory; prefix for absolute paths. - -cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/ - -############################################# -# Utility command for edit_cache - -build CMakeFiles/edit_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" - DESC = No interactive CMake dialog available... - restat = 1 - -build edit_cache: phony CMakeFiles/edit_cache.util - - -############################################# -# Utility command for rebuild_cache - -build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a" - DESC = Running CMake to regenerate build system... - pool = console - restat = 1 - -build rebuild_cache: phony CMakeFiles/rebuild_cache.util - -# ============================================================================= -# Target aliases. - -# ============================================================================= -# Folder targets. - -# ============================================================================= - -############################################# -# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a - -build all: phony - -# ============================================================================= -# Built-in targets - - -############################################# -# Re-run CMake if any of its inputs changed. - -build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt - pool = console - - -############################################# -# A missing CMake input file is not an error. - -build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony - - -############################################# -# Clean all the built files. - -build clean: CLEAN - - -############################################# -# Print all primary targets available. - -build help: HELP - - -############################################# -# Make the all target the default. - -default all diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt deleted file mode 100644 index 7fba5c85..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/build_file_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake deleted file mode 100644 index 85890007..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/cmake_install.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "0") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "TRUE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin deleted file mode 100644 index 316badc3..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/configure_fingerprint.bin +++ /dev/null @@ -1,28 +0,0 @@ -C/C++ Structured Logs -q -oD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\additional_project_files.txtC -A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  ����2p -n -lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\android_gradle_build.json  ��Ć�2� ����2u -s -qD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\android_gradle_build_mini.json  ��Ć�2� ����2b -` -^D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build.ninja  ��Ć�2˫ �����2f -d -bD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build.ninja.txt  ��Ć�2k -i -gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\build_file_index.txt  ��Ć�2 b ����2l -j -hD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\compile_commands.json  ��Ć�2p -n -lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\compile_commands.json.bin  ��Ć�2 v -t -rD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\metadata_generation_command.txt  ��Ć�2 -� ����2i -g -eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\prefab_config.json  ��Ć�2  ( ����2n -l -jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a\symbol_folder_index.txt  ��Ć�2  a ����2f -d -bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt deleted file mode 100644 index 6e617a72..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/metadata_generation_command.txt +++ /dev/null @@ -1,20 +0,0 @@ - -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy --DCMAKE_SYSTEM_NAME=Android --DCMAKE_EXPORT_COMPILE_COMMANDS=ON --DCMAKE_SYSTEM_VERSION=21 --DANDROID_PLATFORM=android-21 --DANDROID_ABI=armeabi-v7a --DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a --DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake --DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe --DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a --DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a --DCMAKE_BUILD_TYPE=Debug --BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\armeabi-v7a --GNinja --Wno-dev ---no-warn-unused-cli - Build command args: [] - Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json deleted file mode 100644 index e799de86..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/prefab_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "enabled": false, - "packages": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt deleted file mode 100644 index 54caa98f..00000000 --- a/android/app/.cxx/Debug/1n4a7033/armeabi-v7a/symbol_folder_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\armeabi-v7a \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/hash_key.txt b/android/app/.cxx/Debug/1n4a7033/hash_key.txt deleted file mode 100644 index ebc45952..00000000 --- a/android/app/.cxx/Debug/1n4a7033/hash_key.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Values used to calculate the hash in this folder name. -# Should not depend on the absolute path of the project itself. -# - AGP: 8.1.0. -# - $NDK is the path to NDK 26.3.11579264. -# - $PROJECT is the path to the parent folder of the root Gradle build file. -# - $ABI is the ABI to be built with. The specific value doesn't contribute to the value of the hash. -# - $HASH is the hash value computed from this text. -# - $CMAKE is the path to CMake 3.22.1. -# - $NINJA is the path to Ninja. --HD:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy --DCMAKE_SYSTEM_NAME=Android --DCMAKE_EXPORT_COMPILE_COMMANDS=ON --DCMAKE_SYSTEM_VERSION=21 --DANDROID_PLATFORM=android-21 --DANDROID_ABI=$ABI --DCMAKE_ANDROID_ARCH_ABI=$ABI --DANDROID_NDK=$NDK --DCMAKE_ANDROID_NDK=$NDK --DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake --DCMAKE_MAKE_PROGRAM=$NINJA --DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:/Projects/Flutter/Github/FlutterUnit/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI --DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:/Projects/Flutter/Github/FlutterUnit/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI --DCMAKE_BUILD_TYPE=Debug --B$PROJECT/app/.cxx/Debug/$HASH/$ABI --GNinja --Wno-dev ---no-warn-unused-cli \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cache-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/query/client-agp/codemodel-v2 deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json deleted file mode 100644 index 54276e72..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cache-v2-30ddb47aac1d117c5807.json +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "entries" : - [ - { - "name" : "ANDROID_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "x86" - }, - { - "name" : "ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "ANDROID_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "android-21" - }, - { - "name" : "CMAKE_ADDR2LINE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe" - }, - { - "name" : "CMAKE_ANDROID_ARCH_ABI", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "x86" - }, - { - "name" : "CMAKE_ANDROID_NDK", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\ndk\\26.3.11579264" - }, - { - "name" : "CMAKE_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_ASM_FLAGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_ASM_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_BUILD_TYPE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." - } - ], - "type" : "STRING", - "value" : "Debug" - }, - { - "name" : "CMAKE_CACHEFILE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "This is the directory where this CMakeCache.txt was created" - } - ], - "type" : "INTERNAL", - "value" : "d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86" - }, - { - "name" : "CMAKE_CACHE_MAJOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Major version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "3" - }, - { - "name" : "CMAKE_CACHE_MINOR_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Minor version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "22" - }, - { - "name" : "CMAKE_CACHE_PATCH_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Patch version of cmake used to create the current loaded cache" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe" - }, - { - "name" : "CMAKE_CPACK_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to cpack program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe" - }, - { - "name" : "CMAKE_CTEST_COMMAND", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to ctest program executable." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_CXX_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_CXX_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_CXX_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_CXX_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C++ applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_C_COMPILER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "(This variable does not exist and should not be used)" - } - ], - "type" : "UNINITIALIZED", - "value" : "" - }, - { - "name" : "CMAKE_C_COMPILER_AR", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "LLVM archiver" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe" - }, - { - "name" : "CMAKE_C_COMPILER_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Generate index for LLVM archive" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_C_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during debug builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "-Os -DNDEBUG" - }, - { - "name" : "CMAKE_C_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the compiler during release builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "-O2 -g -DNDEBUG" - }, - { - "name" : "CMAKE_C_STANDARD_LIBRARIES", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Libraries linked by default with all C applications." - } - ], - "type" : "STRING", - "value" : "-latomic -lm" - }, - { - "name" : "CMAKE_DLLTOOL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "CMAKE_DLLTOOL-NOTFOUND" - }, - { - "name" : "CMAKE_ERROR_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue deprecation errors for macros and functions." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_EXECUTABLE_FORMAT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Executable file format" - } - ], - "type" : "INTERNAL", - "value" : "ELF" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "ON" - }, - { - "name" : "CMAKE_EXTRA_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of external makefile project generator." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator." - } - ], - "type" : "INTERNAL", - "value" : "Ninja" - }, - { - "name" : "CMAKE_GENERATOR_INSTANCE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Generator instance identifier." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_PLATFORM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator platform." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_GENERATOR_TOOLSET", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Name of generator toolset." - } - ], - "type" : "INTERNAL", - "value" : "" - }, - { - "name" : "CMAKE_HOME_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Source directory with the top level CMakeLists.txt file for this project" - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - { - "name" : "CMAKE_INSTALL_PREFIX", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install path prefix, prepended onto install directories." - } - ], - "type" : "PATH", - "value" : "C:/Program Files (x86)/Project" - }, - { - "name" : "CMAKE_INSTALL_SO_NO_EXE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Install .so files without execute permission." - } - ], - "type" : "INTERNAL", - "value" : "0" - }, - { - "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\x86" - }, - { - "name" : "CMAKE_LINKER", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe" - }, - { - "name" : "CMAKE_MAKE_PROGRAM", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_NM", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe" - }, - { - "name" : "CMAKE_NUMBER_OF_MAKEFILES", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "number of local generators" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_OBJCOPY", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe" - }, - { - "name" : "CMAKE_OBJDUMP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe" - }, - { - "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Platform information initialized" - } - ], - "type" : "INTERNAL", - "value" : "1" - }, - { - "name" : "CMAKE_PROJECT_DESCRIPTION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_HOMEPAGE_URL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "" - }, - { - "name" : "CMAKE_PROJECT_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "Project" - }, - { - "name" : "CMAKE_RANLIB", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Ranlib" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe" - }, - { - "name" : "CMAKE_READELF", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Path to a program." - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe" - }, - { - "name" : "CMAKE_ROOT", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Path to CMake installation." - } - ], - "type" : "INTERNAL", - "value" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - { - "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "D:\\Projects\\Flutter\\Github\\FlutterUnit\\build\\app\\intermediates\\cxx\\Debug\\1n4a7033\\obj\\x86" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of dll's." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_SKIP_INSTALL_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_SKIP_RPATH", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If set, runtime paths are not added when using shared libraries." - } - ], - "type" : "BOOL", - "value" : "NO" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during all build types." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." - } - ], - "type" : "STRING", - "value" : "" - }, - { - "name" : "CMAKE_STRIP", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "Strip" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_ERRORS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress errors that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SUPPRESS_DEVELOPER_WARNINGS", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Suppress Warnings that are meant for the author of the CMakeLists.txt files." - } - ], - "type" : "INTERNAL", - "value" : "TRUE" - }, - { - "name" : "CMAKE_SYSTEM_NAME", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "Android" - }, - { - "name" : "CMAKE_SYSTEM_VERSION", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "No help, variable specified on the command line." - } - ], - "type" : "UNINITIALIZED", - "value" : "21" - }, - { - "name" : "CMAKE_TOOLCHAIN_FILE", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "The CMake toolchain file" - } - ], - "type" : "FILEPATH", - "value" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "name" : "CMAKE_VERBOSE_MAKEFILE", - "properties" : - [ - { - "name" : "ADVANCED", - "value" : "1" - }, - { - "name" : "HELPSTRING", - "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." - } - ], - "type" : "BOOL", - "value" : "FALSE" - }, - { - "name" : "CMAKE_WARN_DEPRECATED", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Whether to issue warnings for deprecated functionality." - } - ], - "type" : "INTERNAL", - "value" : "FALSE" - }, - { - "name" : "Project_BINARY_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86" - }, - { - "name" : "Project_IS_TOP_LEVEL", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "ON" - }, - { - "name" : "Project_SOURCE_DIR", - "properties" : - [ - { - "name" : "HELPSTRING", - "value" : "Value Computed by CMake" - } - ], - "type" : "STATIC", - "value" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - } - ], - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json deleted file mode 100644 index a59ffc79..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/cmakeFiles-v1-49b5f472adf4076661e4.json +++ /dev/null @@ -1,799 +0,0 @@ -{ - "inputs" : - [ - { - "path" : "CMakeLists.txt" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake" - }, - { - "isExternal" : true, - "path" : "D:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake" - }, - { - "isCMake" : true, - "isExternal" : true, - "path" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in" - }, - { - "isGenerated" : true, - "path" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake" - } - ], - "kind" : "cmakeFiles", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 1, - "minor" : 0 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json deleted file mode 100644 index 14d66245..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/codemodel-v2-c3cbb398a65538641212.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "configurations" : - [ - { - "directories" : - [ - { - "build" : ".", - "jsonFile" : "directory-.-Debug-d0094a50bb2071803777.json", - "minimumCMakeVersion" : - { - "string" : "3.6.0" - }, - "projectIndex" : 0, - "source" : "." - } - ], - "name" : "Debug", - "projects" : - [ - { - "directoryIndexes" : - [ - 0 - ], - "name" : "Project" - } - ], - "targets" : [] - } - ], - "kind" : "codemodel", - "paths" : - { - "build" : "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86", - "source" : "D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy" - }, - "version" : - { - "major" : 2, - "minor" : 3 - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json deleted file mode 100644 index 3a67af9c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "backtraceGraph" : - { - "commands" : [], - "files" : [], - "nodes" : [] - }, - "installers" : [], - "paths" : - { - "build" : ".", - "source" : "." - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json b/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json deleted file mode 100644 index 04a6eae3..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/.cmake/api/v1/reply/index-2025-04-20T01-10-57-0300.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cmake" : - { - "generator" : - { - "multiConfig" : false, - "name" : "Ninja" - }, - "paths" : - { - "cmake" : "D:/SDK/Android/cmake/3.22.1/bin/cmake.exe", - "cpack" : "D:/SDK/Android/cmake/3.22.1/bin/cpack.exe", - "ctest" : "D:/SDK/Android/cmake/3.22.1/bin/ctest.exe", - "root" : "D:/SDK/Android/cmake/3.22.1/share/cmake-3.22" - }, - "version" : - { - "isDirty" : true, - "major" : 3, - "minor" : 22, - "patch" : 1, - "string" : "3.22.1-g37088a8-dirty", - "suffix" : "g37088a8" - } - }, - "objects" : - [ - { - "jsonFile" : "codemodel-v2-c3cbb398a65538641212.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - }, - { - "jsonFile" : "cache-v2-30ddb47aac1d117c5807.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - { - "jsonFile" : "cmakeFiles-v1-49b5f472adf4076661e4.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - } - ], - "reply" : - { - "client-agp" : - { - "cache-v2" : - { - "jsonFile" : "cache-v2-30ddb47aac1d117c5807.json", - "kind" : "cache", - "version" : - { - "major" : 2, - "minor" : 0 - } - }, - "cmakeFiles-v1" : - { - "jsonFile" : "cmakeFiles-v1-49b5f472adf4076661e4.json", - "kind" : "cmakeFiles", - "version" : - { - "major" : 1, - "minor" : 0 - } - }, - "codemodel-v2" : - { - "jsonFile" : "codemodel-v2-c3cbb398a65538641212.json", - "kind" : "codemodel", - "version" : - { - "major" : 2, - "minor" : 3 - } - } - } - } -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt b/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt deleted file mode 100644 index 516b03ae..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/CMakeCache.txt +++ /dev/null @@ -1,401 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 -# It was generated by CMake: D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//No help, variable specified on the command line. -ANDROID_ABI:UNINITIALIZED=x86 - -//No help, variable specified on the command line. -ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//No help, variable specified on the command line. -ANDROID_PLATFORM:UNINITIALIZED=android-21 - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-addr2line.exe - -//No help, variable specified on the command line. -CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 - -//No help, variable specified on the command line. -CMAKE_ANDROID_NDK:UNINITIALIZED=D:\SDK\Android\ndk\26.3.11579264 - -//Archiver -CMAKE_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Flags used by the compiler during all build types. -CMAKE_ASM_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_ASM_FLAGS_DEBUG:STRING= - -//Flags used by the compiler during release builds. -CMAKE_ASM_FLAGS_RELEASE:STRING= - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING=Debug - -//LLVM archiver -CMAKE_CXX_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING= - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_CXX_FLAGS_RELEASE:STRING= - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C++ applications. -CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm - -//LLVM archiver -CMAKE_C_COMPILER_AR:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe - -//Generate index for LLVM archive -CMAKE_C_COMPILER_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING= - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_C_FLAGS_RELEASE:STRING= - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Libraries linked by default with all C applications. -CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//No help, variable specified on the command line. -CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/Project - -//No help, variable specified on the command line. -CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86 - -//Path to a program. -CMAKE_LINKER:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe - -//No help, variable specified on the command line. -CMAKE_MAKE_PROGRAM:UNINITIALIZED=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-nm.exe - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Ranlib -CMAKE_RANLIB:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe - -//Path to a program. -CMAKE_READELF:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-readelf.exe - -//No help, variable specified on the command line. -CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86 - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Strip -CMAKE_STRIP:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe - -//No help, variable specified on the command line. -CMAKE_SYSTEM_NAME:UNINITIALIZED=Android - -//No help, variable specified on the command line. -CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 - -//The CMake toolchain file -CMAKE_TOOLCHAIN_FILE:FILEPATH=D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 - -//Value Computed by CMake -Project_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=d:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86 -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cmake.exe -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/cpack.exe -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=D:/SDK/Android/cmake/3.22.1/bin/ctest.exe -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Whether to issue deprecation errors for macros and functions. -CMAKE_ERROR_DEPRECATED:INTERNAL=FALSE -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Ninja -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=D:/SDK/Android/cmake/3.22.1/share/cmake-3.22 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//Suppress errors that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_ERRORS:INTERNAL=TRUE -//Suppress Warnings that are meant for the author of the CMakeLists.txt -// files. -CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=TRUE -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Whether to issue warnings for deprecated functionality. -CMAKE_WARN_DEPRECATED:INTERNAL=FALSE - diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake deleted file mode 100644 index 54c7a90b..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +++ /dev/null @@ -1,72 +0,0 @@ -set(CMAKE_C_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "Clang") -set(CMAKE_C_COMPILER_VERSION "17.0.2") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -set(CMAKE_C17_COMPILE_FEATURES "c_std_17") -set(CMAKE_C23_COMPILE_FEATURES "c_std_23") - -set(CMAKE_C_PLATFORM_ID "Linux") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_C_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_C_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_C_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "4") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/i386;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake deleted file mode 100644 index d7865bd0..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,83 +0,0 @@ -set(CMAKE_CXX_COMPILER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "Clang") -set(CMAKE_CXX_COMPILER_VERSION "17.0.2") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") -set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") -set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") - -set(CMAKE_CXX_PLATFORM_ID "Linux") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - - -set(CMAKE_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_CXX_COMPILER_AR "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe") -set(CMAKE_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_CXX_COMPILER_RANLIB "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe") -set(CMAKE_LINKER "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld.exe") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCXX ) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) - -foreach (lang C OBJC OBJCXX) - if (CMAKE_${lang}_COMPILER_ID_RUN) - foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) - list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) - endforeach() - endif() -endforeach() - -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "4") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/include;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/i386;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android/21;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/i686-linux-android;D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin deleted file mode 100644 index 23eb5f04cf5e438a8d15ab4a799986df9d7c0cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5724 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 diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin deleted file mode 100644 index c0afa7680391de10cbddfd88a74fea55f37dc37a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5864 zcmd5=ZERcB89u(Y6Sq#Cv!c zrfWL(0cjCY3Sw)2><5~r!PxkR1k$DnP^4BuLe;4l3Ft zK8y-PRI$+udJ(e3X2?X^p|%lZ6`Bx`=%=R1vD>=aAp+Y`iO6=PeQ&)Gd+&9SYQ~m! z1$-NXHq<3vhfJiMev=Fyd_|NTY&uL2gZ+zOUoBi(;J>1`u&SO(l(&ScW>2Tp zw56YhKy|cYh*WZLh(eJ9s8%4;y4Cp(+g%!VX~d;*(0X*Hj}#3j$43thRPtwZV@B1= zmO0%Ke@KY&Ix$!MlA)HdQ0s7LJK`Udb=ZgJf$ZxXkaf-}gPZ)yBj_m=LUew#`0m2{ z*B4eAChT=}WMQS%W~Lvzq+;S8JqSX%nT;To2fK6kjLr>MX1C8WcX zC&a|HesOd>3<2eGYvWIhsGbN*O@odWvNtkZ$e0#_vg)d+shED}Pa~8qfuplL$OE+OY|_ zpTj`rfBO9ge(Vvph)BWC{mCA1zqUciHOjior5cPuP};fkKY_dvv=8{{S5@Ox$c*(C zXc&}d#ST!ma|f^$@-|myU&D~O#%RY1F)pIsSD?>=V!Z7CDliu7v(Ce4oacyy&mh;K zgKi!Uw{>=Q$NRgw`r558s}jZ)Z*_x1M1d-a{+Y$08m z4WH7@N*?;o-e^a(E8Lc|ta4=_7E3!>K00d{vjx3k%$Zp|nl*|s%P|}F`AS@PL&@fW;GUq;S_)wWc|1w1GT#o7 zZ0^Of@!tamA1VUBeZe3!^<;y=eP9DogxpfMzttOJgkLRnQ{sm0fb!A3it z*otMsRfp2^EXp0uy#?HRuyCy~cPRr9_JHyD{N5j8b^igf_W%^WBPebY{uBsTxv2Bh zKMiA`UYUnv06m-hUK4d5V4a^pVb^IC{$GHv`x~_NiZThF?R&QPz0bh;ISiI z{J!9A5P}?yz^XLG@IdUy@B=Y-bHuX6^hrI|9qsChcE&1j&>ht-s$ye?HiyL>8ybVx z(6M7fMzNeP=w@Ot8O@fRCVfnqkr2zuvxfc2qSnIhi=F9!WkpqD~#37*SP`HfOVp-RZ<$ z*J7U?kP`~OQ(~@E$bTf7!Z{_APQap-Vl}ui- zbh#XhW>24v4eOb?*;r>Op6>1F?v9=A>v6vMD89D)`KOBf-j;Y1E6FF$pv1%Ei_j(# zt~a3PRu-2K&g!aJS~&*0*_vZpK1KKy?vFeC^&6G%HT&L2FpiEc13s8O;lo=`P%6|uC0z#6u?eBrEK(^yU`#EHu{Wd7Ki$%1* zdfqB6;$s;29_2k?3+5*TJI`m<-;7@vGS6y9-XdaY%=;AOj(O`VSzHEo*dd3O5- zKLbJP5kFnbXVD1*HBmUVGnI8>}6JyCCx!C^)%B?_Tx~TpCMpl(u1%H=_de^V^e-7y<)6I8k{FtMN5$OcVJxb^R z;$CLA%X>eOI<~_$>Bs%gyFc&hFbm$_iM&P0IMfqIfV|t2=lz}-245QwqF`?P%=P1Y zg2?=#V1q*nDpg!|VL$s{xVPY`;(7Lu8*N$oVTk!M?z3zmxb@3WJyJk@B6w zyCnSvfqX9!IS;fW#o3g8KLav0<1sfAGvFmqPj~_-{g&ZFY_}~=A=~FYPx>)e6EA;* z-)~$$ego!cVjC;Ez`hcm2U1PHcQKJfeqRaF??oucqd7ar^M5*yPXfZ*@Mn}fPw2bB{{MNRW}e9sKXoaH4KE=0c`1O( zDqb*>r@0FQ-BzQJY@_QZ+a1FLd{izbHy(ZObp05MaG^nnzdEd4%6RvHsi`hB{Q371 mbi9jjemGvvXB0ZliG&t>#Qib|l#=aR=QoAQzmmopzyAVZni4?( diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake deleted file mode 100644 index f1f13c66..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Windows-10.0.26100") -set(CMAKE_HOST_SYSTEM_NAME "Windows") -set(CMAKE_HOST_SYSTEM_VERSION "10.0.26100") -set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") - -include("D:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake") - -set(CMAKE_SYSTEM "Android-1") -set(CMAKE_SYSTEM_NAME "Android") -set(CMAKE_SYSTEM_VERSION "1") -set(CMAKE_SYSTEM_PROCESSOR "i686") - -set(CMAKE_CROSSCOMPILING "TRUE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 41b99d77..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,803 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif __STDC_VERSION__ > 201710L -# define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L -# define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L -# define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o deleted file mode 100644 index b09356ac9106536d344e76aed36e7001eec019b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3880 zcmd53S{-Po(74=5EP?#6H7{Y|j3qkN!1x3LN!G91G^m$LdFFnaN*`+Uh-}C-` z@B96}CwX#kWJpmIlBAHE)+C~<%~ea%hECd6XC<0k{{HNDf1mx){{uTbc=}^EU}ZG8 zGU~r_pu@w;E1nL9m1pdJ(!c&vu*DthSPpjFq-qpH&ii@vjfXvD2WL-@-|gvG_H?YE z|8e^A@S&lx-I>z-LcU;_Qv(IPI6FNhqVkxc4M5B_4^T3U0_o8*9 zjiV_o%3Yy0)g9WfsXf%9w0enLNg8h39k@?*ZN^S0%5WQz=MLyn0V1`7+@ZaJ09Y@x zfxup{z9iV;wtZXVF#me^6E)p!L$ii7t=_)P?hrfNvxQxW0xG$Lik*YWI+32h{jd*~ zJoZhwjo!e7nLeljtpYJytl|Ylmzi^SCDvP-F@inkwNkum%eO;o?PFe zQ+|WQ2e9V5m3$TH`>XT~L8JTui4SVccN_U$l)h|*k?hyA3Pzc{z@z-`1wg>{oc~gt z7`$8+9|Z(m7F}gAU^|m~5rXRRp91*%IBI_}YnJlaaAz!*NcP6#Jv+lQdfCW^OU1C6 z>`A4PDPu=C!*@L_u3wlho)!;x&RNz%d3Pj&tIaXA*-~k?V3bQ0Gh=9YClRYuDrDyL zd@)ieEY5c=n5APz#tLV9b3MJeWH#2_-JQtpipJu`u1vHy*}E&3m`Oy9jFHI36W#G0 zG%%_kHwFg8lN-)z89J~#GG2{SjtmtlmSvccgL!MNG9$&wV&0N-is%aq5iPT{6ggnb zRAwWwVp2~<6N$)DPj|$QK7_|yjwG~rT#I$hCQ{L!9=)e4n>VeKk+sAFgmsvdPWK-^ z-2YJe$ne91>4}HN2h(ZF7jvbwtO`|0Y*bZ{wV^6;QK)jfr4@bFNH^Ao2J^KAg66TM z@UloZXEWR_l4+c%ICl zuGir~^cGYeyQ<*}^H*pc0Wgfvl?QLqPqHgo%)X*L^@PHcf z&NfJ!Yqoap9PDsA18|3OYFEv~!y+}Q8IEr6o`B|ZVM?5?p0+!59{S}Ur`3(`qm$gE zIz?Dp8f3Y9RkfS8&?mxU71)XqLymkKpnF=_xyZJVm%gZzo9M4PIY93VId1#==}4V@ z9d*{p>+Kmf<9oUj`lcqLeT=A7hZ*tJIK~(xT4Y>Dw9FVn2U5iH{|oW0A_bF22vV>; ztpaalgmJ5oZ)e1DM;Q^fU+C`_I41BYBj$Nr$V-d}{yZbby)5)^Gh!Vd3jJlF|C|x) z`da9J68gUxvA$;PKgVfj#C$s$vED95%r7PMd`@hi6qprwLSPv2aHS~4arqi+S*~Ac zeP+fq7D=;E6^Lu>yn!;HnMOg&>XxqA#i&+Uu2VX0#DKrd2wF& zmDVO9YoP7K)79*%)sVkd9JOM}GPHw-Cc7|`%<;yYcG+~~E98qt)yJ4i=S+RxxLy^| zFndd%A+3CJo-uuJWNd%`NP28&=*ZwidZK^-$Y8oQZ8*oY820)msT*g7qps0WzE{vm zlI(gYnCH99RQ>&1<+DLE&6-^SqXQqp2NJV{UOuzexdVuX{JRgq7KXH#D z7{`mFF@1wpu(@i-Hg2Z{%C+z>B{?Vdl>Fo1oq2a63FqOwyf&Hl9q=5NuPxIA1UUzm z*~au48uKzQe+OhPwoCp~@XowRM_$&;ynldq#yfw5c)v8n+vA9br(KIT+7R#A8^jxK zh>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > 202002L - "23" -#elif CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o deleted file mode 100644 index 698b7fde57bf92a362c9331cfd5f18f73ab09832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3916 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 pq=5-m9^>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif __STDC_VERSION__ > 201710L -# define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L -# define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L -# define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o deleted file mode 100644 index a115ed9bd0b664aebaa2b08274cb48785ff929be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5376 zcmd5=No*Ts6#i!%J8qr2Ndt68E^Ax0Rw0mzdI1io7myGVh(#Re2?@jn1cw}0gaA=d-uvf0`_FiaN>9Av`QQ8A z`Y-eT2`6&9Ms!UROq$pxS`wo$MqB)lWQW8Wusk?A_x;DYi-^oU{Kx2A(WYwM--&LwKW(hRy!t^-tb;qm}O}m&cT9am@?2IR~q_Jilt5PpjEA^&s@18?A zRY?nS=8sx7nvN$VC9{UhBofS|TAm!if7E)ko1?wKK(u@L>S&L)EF^@U5o5iBk=ug$ z3LyfTHr6Xd$2!2W5g~#%i9mE)Bm!&**+^s?u$>uT$9lJ~WVi5Auoq&{Epk|FK$>Nt zp%sBB8r-@PO@)XAg-#F}cV!lc;vG0I9kS}MJUMH9XYdlB`c`;oFKCMbY!Vm+u46Ae zt`%~#LmJFXh;U~o4rTZ)un!*rWDz<^{WGXPrz`PLFXN>s+t-S=6;nm^FEPqDie0O! zE;o;?L$%ODFjehWU!PTq&o7FFK8QZQDM%~N8pTJoSPZ2}!sXNMLRJe0UWY&t{rTC2 zVvWRepzYG1$C`x}k;d-Y20OxUfi8^8Cw5edcC}QDtxqP?nSoTQe^YG2tXsucwGy*4 z{n>0LYi)=X@TG~-F^=H@Hd3+m(~eWC560v0j$jO9s#={YTlH$gE?5SpBv+>)l ziN;hsS;?5$L^>Ux?eEL?W#Tfy2sDOzJZ+>>Mso91I-BV4H~TjiOSW??-pV~JU@ErA z=XdPizvJHgon!aq@(1qSm&@lxsWMs3bBA#yS}RxJKI2N*U|bGYwP8+Kd2gTbsN0*3 zn1NLVD@U02Q~@7Hg>4;alx*w&zNdKV#5M8>2lM!Tq0M${tGhbG&%vQw133PW@T`j+ z(e5Yo;Uyvc6j%uHC_o)zBRn-t`zyKx2XMo?O7lA{pn^uB%K;vNxsVp@TpV5(j5dOi z(09RTXv#BAlN^XnF3>CvO$P&^$W~p4oE)!h+ytr)@$;oN1ty1oeiU$D%QjU&^t53J z1e&Y2P#qA^q&@Tr$jg+xa!mny3VuC8_E_lwODpLsc=m`zBterPPKSB*2)H_k7=Ih& zo~D%$DbgR5_!5#@aW+VNX&cUajyr|1FJ5vfNtTFXRg8})I5tPd^9qjDGA^4U$QY+f z!5;@63305J?GZ!5o%Y)`#;=uDtq0?HLRDhCPX&Qzd>`SwBRD7bGIbSLGZNzRf|L^O ztxJr*Lh^MA&M^^MrQjF`_YdiMcaZhqS}mxvytR)Y2-K+ ziZid+qmJosV$clZ@V@twAIF&`IYuK6yw?~arQjHc*LNr39Oo3t2Ne6(+b6^!1y}d? zuqV!Wl8<}v4@jQ#;2)8E+Jk>a@*5ufJ(6QMIUuY>ttTr{_q|YYVHENH&YKexwslk( z4qS->zcFSkxC0H_Dw{^pbWB5D#m#%w=iOjVsl5tqhw$M;YHvjKhw%G1 zf4=uPR5vp;z7HeD93q*AN2n=1N5EXKZt`qCWHD-Ut-vkU(EqLcZ-beYp^YX6W1@iaSfAR|J z{{sB|>R<0uKSJL6FJ2};ep4c`y(_iLzk|Xr|Bz39ymvSruOI&DimANw=f24HU?RyY z-vOv!{(F4#V_#=~&VM6de)-Q_;r#Lb_sd`N$&c@xi-y44ZpVPP>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > 202002L - "23" -#elif CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ -#if (defined(__clang__) || defined(__GNUC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) && !defined(_MSC_VER) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o deleted file mode 100644 index 36b03196e4c837282f8268e6b2ba7665647e6f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5424 zcmd5B~47Umrz@2jb)wePIlLBcDJ*$ zB?@X$QDP}rAH)aI*XoN3Dk3O?4;4Z2#Ro+cZ!cQ#0*atm&-v#+vwtQN6`%ZJ=bZEX z=l0*u|L;SS`=@kG18y4ZfsVu|Kr+_h#|1kMn^E)V^zyeCC;uR1`GMc2m)k#HoV-NR z^x23Y#RI>sf4i&Kn7p(+c_|!3mFaUr`=2z!e4d@WbmHBagHwlg78{GrYRz`$CTdo_ zd;$d6tXb|t!&#i$U#+*7BxpIs%ADj|u2nBtPN`6`7p!*8olE6pkGb?~AlsWoc4qjNYuLJPz0h9g;T~GY zwT+q>cSHC1Mk7WbnE>=hK=%QFf$RzqUdN5nC8nZRY?-a0)ABf?`fmJak7|7es~FSB zbsfRal@K|A1c!+qt%pc&PcM;E_*-GrM@F8n5A=?&j-LW&Hx0_3P)C zR*Fq2zJ$F4`uUm=HG`DBsf~2?y^2B~%{A<;mz+km6yKIgWwK-GbpGb}yw$Qx@kTxF zWb?UPHfL{-7wH(q<(`exZZ*^KZ57vTwss~GcxuRpS#C7SHM`YlJ4M^XBbaa-jaso{ zRqKgb?eyYE(`npm7u|SiY#~3kkS(P~M@KWI9m!PM-cd}BWyf|bWacwTyJ%-h>C9+) zJ4_s~PTCX4j!nq(JX11@%_i*InV9u_wGvacw(HtX;?}BLY0tBGv|e>NuY}cXCd}f} zQevMy-!3Oo^{kakW-^JT{Agh`n-D>!uw1kf88e+WQzPX}E}73;`H@o9aqmlXqGKw6 z19G5H*n9Z!-s6QkX6~9S963HaStvlYzR)Oej)>qJW#HQVU7__B9ZBu_w?~}Ms zHzP(rYP9`fZ*1@}ePW(JX=`mD?8XD23xXfxazu;t ztn1wxiM1oq?r$Qo?y{s6NsZXTik@}dm59+D-L2~wkNt$wXAtdzpDu@W8sL{fzxzGp zG#K>dw9jFpATCD*@mNFAS331Y-c!`at^@`0)InZMG+RF zjw1Jqz*)i)E_wlu3cO!R9elgMJC6$1--6RR1fo6)8^(Dr(CSg|AD6wB5?XjGAfTzEi~5N&`591fWJROZ_U<|fNW%D)D`DD)LjR^U@X=cIgL5XudX)?q{ z>rRdFoW$?;U?0C-;#G;0NH*NgNQQ8V%k#V}arS>)`gvN>_wP@{E+{zpxk<`zNy>i8 z($D*ferJ~ge5T;!hu86^fS*&+&!37uuN^^yvY!a~;dQ@3;+zlFLTWs(B+~xmwkx3j zij=1%C8Ac3*?|7rQnnO*b=?~Q{g0&lU;zI_%I5<3=Td$)fPXFJ7XtXlQjW_3QZ8yf zyChC(Dh_6euK9vBKkwM5!F2Hw1$vGw+ITIRj$O0NlI2>axHtWqIOM8bQ+L&^Ekm|k zXH@|IL9oVKMg|cnQ%2~ZA<|oYw|lBI9#dTN!TkK!hFNd8wt4Hpqa&DU@#LzU#6v_4 zT&vb?sbyCR3y!sjB96wj=8@jFD5%T};gre6R<6N+A+#@7-+ln^$-}|tkA2JSz#^YdwS9rY-`Vp$$2OfC*+V`>LO#bm(f?kM#Z^4Z5#5A88YkCW{NpCt zF$_-e)%%?~E{a}&nxsrfmm1SYB_Eu_yj0+L!U#V>*?Tvw&OhGgS#X||Kg}`QGyVf& z6e<{h{9nfZ4sFBcFCP-0Vh7`kKU*R3x!$ops)!bphcVBv__HDLsRpw>kN*&2VdLkz z%KBdPjy=n_ArltA5)z+|1pDLo*C7@bpY|0s*7u~qfjeq zFUt4G_`!W0JU^r+RgvqorzH4d2NGOR_fV}Q~899F5*tGxY zO%)u!ix~M#;!kbA$^-FzARvoO>HQLB|E0X7pI4nqU4q!&K!$l$^-QoJ%Fdwf9?!lR zTtBwYt4@*U@iRPz_M!79>o@Ncn!l?Rd&Wn+`0UQ7Z^--~@ez*+=D%%?_%DaVr++n^ ZKgXwY8XP-C8mC7vwu%f$gtkP`{x7Z~b36b5 diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 027a8e8c..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,2 +0,0 @@ -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/edit_cache.dir -D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd731..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja b/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja deleted file mode 100644 index 99c123a9..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/CMakeFiles/rules.ninja +++ /dev/null @@ -1,45 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the rules used to get the outputs files -# built from the input files. -# It is included in the main 'build.ninja'. - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= -# ============================================================================= - -############################################# -# Rule for running custom commands. - -rule CUSTOM_COMMAND - command = $COMMAND - description = $DESC - - -############################################# -# Rule for re-running cmake. - -rule RERUN_CMAKE - command = D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 - description = Re-running CMake... - generator = 1 - - -############################################# -# Rule for cleaning all built files. - -rule CLEAN - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe $FILE_ARG -t clean $TARGETS - description = Cleaning all built files... - - -############################################# -# Rule for printing all primary targets available. - -rule HELP - command = D:\SDK\Android\cmake\3.22.1\bin\ninja.exe -t targets - description = All primary targets available: - diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/additional_project_files.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json deleted file mode 100644 index 524ffe0f..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {}, - "toolchains": { - "toolchain": { - "cCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang.exe", - "cppCompilerExecutable": "D:\\SDK\\Android\\ndk\\26.3.11579264\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\clang++.exe" - } - }, - "cFileExtensions": [], - "cppFileExtensions": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json b/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json deleted file mode 100644 index 2f2abeed..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/android_gradle_build_mini.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "buildFiles": [ - "D:\\SDK\\Flutter\\flutter_stable\\flutter\\packages\\flutter_tools\\gradle\\src\\main\\groovy\\CMakeLists.txt" - ], - "cleanCommandsComponents": [ - [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", - "clean" - ] - ], - "buildTargetsCommandComponents": [ - "D:\\SDK\\Android\\cmake\\3.22.1\\bin\\ninja.exe", - "-C", - "D:\\Projects\\Flutter\\Github\\FlutterUnit\\android\\app\\.cxx\\Debug\\1n4a7033\\x86_64", - "{LIST_OF_TARGETS_TO_BUILD}" - ], - "libraries": {} -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja b/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja deleted file mode 100644 index 86db01f8..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/build.ninja +++ /dev/null @@ -1,111 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Ninja" Generator, CMake Version 3.22 - -# This file contains all the build statements describing the -# compilation DAG. - -# ============================================================================= -# Write statements declared in CMakeLists.txt: -# -# Which is the root file. -# ============================================================================= - -# ============================================================================= -# Project: Project -# Configurations: Debug -# ============================================================================= - -############################################# -# Minimal version of Ninja required by this file - -ninja_required_version = 1.5 - - -############################################# -# Set configuration variable for custom commands. - -CONFIGURATION = Debug -# ============================================================================= -# Include auxiliary files. - - -############################################# -# Include rules file. - -include CMakeFiles/rules.ninja - -# ============================================================================= - -############################################# -# Logical path to working directory; prefix for absolute paths. - -cmake_ninja_workdir = D$:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/ - -############################################# -# Utility command for edit_cache - -build CMakeFiles/edit_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe -E echo "No interactive CMake dialog available."" - DESC = No interactive CMake dialog available... - restat = 1 - -build edit_cache: phony CMakeFiles/edit_cache.util - - -############################################# -# Utility command for rebuild_cache - -build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND - COMMAND = cmd.exe /C "cd /D D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 && D:\SDK\Android\cmake\3.22.1\bin\cmake.exe --regenerate-during-build -SD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy -BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64" - DESC = Running CMake to regenerate build system... - pool = console - restat = 1 - -build rebuild_cache: phony CMakeFiles/rebuild_cache.util - -# ============================================================================= -# Target aliases. - -# ============================================================================= -# Folder targets. - -# ============================================================================= - -############################################# -# Folder: D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64 - -build all: phony - -# ============================================================================= -# Built-in targets - - -############################################# -# Re-run CMake if any of its inputs changed. - -build build.ninja: RERUN_CMAKE | CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt - pool = console - - -############################################# -# A missing CMake input file is not an error. - -build CMakeCache.txt CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompiler.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXCompilerABI.cpp D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCXXInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCompilerIdDetection.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompileFeatures.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerABI.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeFindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitIncludeInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseImplicitLinkInfo.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeParseLibraryArchitecture.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystem.cmake.in D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/CMakeTestCompilerCommon.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ADSP-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMCC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/ARMClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/AppleClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Borland-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Bruce-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-DetermineCompilerInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-FindBinUtils.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Cray-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Embarcadero-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Fujitsu-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GHS-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/HP-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IAR-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Intel-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/MSVC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVHPC-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/NVIDIA-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PGI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/PathScale-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SCO-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SDCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TI-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Watcom-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XL-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-C-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Internal/FeatureTesting.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-C.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine-CXX.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Determine.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android/Determine-Compiler.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake D$:/SDK/Android/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android-legacy.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/flags.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Clang.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Determine.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android-Initialize.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Android.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/hooks/pre/Determine-Compiler.cmake D$:/SDK/Android/ndk/26.3.11579264/build/cmake/platforms.cmake D$:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt: phony - - -############################################# -# Clean all the built files. - -build clean: CLEAN - - -############################################# -# Print all primary targets available. - -build help: HELP - - -############################################# -# Make the all target the default. - -default all diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt deleted file mode 100644 index 7fba5c85..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/build_file_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake b/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake deleted file mode 100644 index bddd3dcc..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/cmake_install.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# Install script for directory: D:/SDK/Flutter/flutter_stable/flutter/packages/flutter_tools/gradle/src/main/groovy - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/Project") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "0") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "TRUE") -endif() - -# Set default install directory permissions. -if(NOT DEFINED CMAKE_OBJDUMP) - set(CMAKE_OBJDUMP "D:/SDK/Android/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objdump.exe") -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "D:/Projects/Flutter/Github/FlutterUnit/android/app/.cxx/Debug/1n4a7033/x86_64/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin deleted file mode 100644 index 5e88d18b..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/configure_fingerprint.bin +++ /dev/null @@ -1,28 +0,0 @@ -C/C++ Structured Logn -l -jD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\additional_project_files.txtC -A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ��Ć�2  �����2k -i -gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\android_gradle_build.json  ��Ć�2� �����2p -n -lD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\android_gradle_build_mini.json  ��Ć�2� �����2] -[ -YD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build.ninja  ��Ć�2�� �����2a -_ -]D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build.ninja.txt  ��Ć�2f -d -bD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\build_file_index.txt  ��Ć�2 b �����2g -e -cD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\compile_commands.json  ��Ć�2k -i -gD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\compile_commands.json.bin  ��Ć�2 q -o -mD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\metadata_generation_command.txt  ��Ć�2 -� �����2d -b -`D:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\prefab_config.json  ��Ć�2  ( �����2i -g -eD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64\symbol_folder_index.txt  ��Ć�2  \ �����2f -d -bD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txt  ��Ć�2 � ��LJ�2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt deleted file mode 100644 index d2458f6d..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/metadata_generation_command.txt +++ /dev/null @@ -1,20 +0,0 @@ - -HD:\SDK\Flutter\flutter_stable\flutter\packages\flutter_tools\gradle\src\main\groovy --DCMAKE_SYSTEM_NAME=Android --DCMAKE_EXPORT_COMPILE_COMMANDS=ON --DCMAKE_SYSTEM_VERSION=21 --DANDROID_PLATFORM=android-21 --DANDROID_ABI=x86_64 --DCMAKE_ANDROID_ARCH_ABI=x86_64 --DANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_ANDROID_NDK=D:\SDK\Android\ndk\26.3.11579264 --DCMAKE_TOOLCHAIN_FILE=D:\SDK\Android\ndk\26.3.11579264\build\cmake\android.toolchain.cmake --DCMAKE_MAKE_PROGRAM=D:\SDK\Android\cmake\3.22.1\bin\ninja.exe --DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 --DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 --DCMAKE_BUILD_TYPE=Debug --BD:\Projects\Flutter\Github\FlutterUnit\android\app\.cxx\Debug\1n4a7033\x86_64 --GNinja --Wno-dev ---no-warn-unused-cli - Build command args: [] - Version: 2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json b/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json deleted file mode 100644 index e799de86..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/prefab_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "enabled": false, - "packages": [] -} \ No newline at end of file diff --git a/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt b/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt deleted file mode 100644 index f8086cb6..00000000 --- a/android/app/.cxx/Debug/1n4a7033/x86_64/symbol_folder_index.txt +++ /dev/null @@ -1 +0,0 @@ -D:\Projects\Flutter\Github\FlutterUnit\build\app\intermediates\cxx\Debug\1n4a7033\obj\x86_64 \ No newline at end of file diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index e00c099b..0f3b0ee7 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -8,7 +8,6 @@ import 'package:l10n/gen_l10n/app_localizations.dart'; import 'package:l10n/l10n.dart'; import 'package:tolyui/app/toly_ui.dart'; import 'package:widget_module/widget_module.dart'; -import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:note/note.dart'; import 'l10n/gen/app_l10n.dart'; From afc0f244c4823ce84e394b0c8d4d8179c778a503 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 09:39:30 +0800 Subject: [PATCH 141/149] up to flutter 3.29.x --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 001fdc37..fe733f8b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ .pub-cache/ .pub/ /build/ +/android/app/.cxx/ /lib/tools/ /lib/res/constant/github_client_config.dart # Exceptions to above rules. From d3698c7c33d5193ff6a32e0c766e46dba888fb3b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Apr 2025 09:44:59 +0800 Subject: [PATCH 142/149] upgrade flutter sdk -> 3.29.2 --- README-EN.md | 8 ++++---- README.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README-EN.md b/README-EN.md index 228cc638..36c5cd59 100644 --- a/README-EN.md +++ b/README-EN.md @@ -34,10 +34,10 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the #### Flutter Version ``` -Flutter 3.27.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision c519ee916e (31 hours ago) • 2025-01-21 10:32:23 -0800 -Engine • revision e672b006cb -Tools • Dart 3.6.1 • DevTools 2.40.2 +Flutter 3.29.2 • channel stable • https://github.com/flutter/flutter.git +Framework • revision c236373904 (5 weeks ago) • 2025-03-13 16:17:06 -0400 +Engine • revision 18b71d647a +Tools • Dart 3.7.2 • DevTools 2.42.3 ``` #### Build Application diff --git a/README.md b/README.md index 863974bb..1ad7e294 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,10 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut ``` ·]>> flutter --version -Flutter 3.27.3 • channel stable • https://github.com/flutter/flutter.git -Framework • revision c519ee916e (31 hours ago) • 2025-01-21 10:32:23 -0800 -Engine • revision e672b006cb -Tools • Dart 3.6.1 • DevTools 2.40.2 +Flutter 3.29.2 • channel stable • https://github.com/flutter/flutter.git +Framework • revision c236373904 (5 weeks ago) • 2025-03-13 16:17:06 -0400 +Engine • revision 18b71d647a +Tools • Dart 3.7.2 • DevTools 2.42.3 ``` #### 构建应用 From 8acf5f9669bc61daeee71ebf9bc9191f977fbd9b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Mon, 21 Apr 2025 07:10:52 +0800 Subject: [PATCH 143/149] update mobile widget ui --- .../app/lib/app/theme/app_theme.dart | 3 +- .../lib/blocs/action/widget_action.dart | 13 +- .../widget_detail/widget_node_panel.dart | 44 +++-- .../desk_ui/widget_panel/widget_id_view.dart | 23 +++ .../desk_ui/widget_panel/widget_panel.dart | 10 +- ...dget_model_item.dart => widget_tiled.dart} | 156 ++++++++--------- .../search_page/standard_search_page.dart | 18 +- .../widget_page/mobile_widget_tiled.dart | 29 ++++ .../widget_page/phone_widget_content.dart | 6 +- .../widget_page/standard_home_page.dart | 3 +- .../widget_page/standard_home_search.dart | 10 +- .../mobile/widget_page/widget_model_item.dart | 162 ------------------ .../views/mobile/widget_page/widget_page.dart | 17 +- .../lib/src/model/widget_model.dart | 30 ++-- 14 files changed, 207 insertions(+), 317 deletions(-) create mode 100644 modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart rename modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/{desk_widget_model_item.dart => widget_tiled.dart} (52%) create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart delete mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index a61794e9..f96526da 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -79,8 +79,7 @@ ThemeData lightTheme(AppConfig state) { chipTheme: const ChipThemeData(padding: EdgeInsets.symmetric(horizontal: 10)), listTileTheme: const ListTileThemeData( - tileColor: Colors.white, - ), + tileColor: Colors.white, textColor: Color(0xff333333)), ///设置选中的文本颜色 textSelectionTheme: TextSelectionThemeData( diff --git a/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart index 7feaea34..42295119 100644 --- a/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart +++ b/modules/widget_system/widget_module/lib/blocs/action/widget_action.dart @@ -5,16 +5,17 @@ import 'package:widget_module/blocs/blocs.dart'; import '../../widget_module.dart'; - -extension WidgetContext on BuildContext{ - - void initWidgetData(){ +extension WidgetContext on BuildContext { + void initWidgetData() { switchWidgetFamily(WidgetFamily.stateless); } - void switchWidgetFamily(WidgetFamily family){ + void switchWidgetFamily(WidgetFamily family) { String locale = read().state.language.code; - read().add(EventTabTap(family,locale: locale)); + read().add(EventTabTap(family, locale: locale)); } + void toggleLike(int widgetId) { + read().add(ToggleLikeWidgetEvent(id: widgetId)); + } } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart index 6d5a967d..cdf6533a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_node_panel.dart @@ -3,11 +3,9 @@ import 'package:toly_ui/toly_ui.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - import 'package:toggle_rotate/toggle_rotate.dart'; import 'package:utils/utils.dart'; - /// create by 张风捷特烈 on 2020-04-13 /// contact me by email 1981462002@qq.com /// 说明: 一个Widget的知识点对应的界面 @@ -22,13 +20,15 @@ class DeskWidgetNodePanel extends StatefulWidget { final bool death; const DeskWidgetNodePanel( - {Key? key, this.text='', - this.subText='', - this.code='', - this.death=false, + {Key? key, + this.text = '', + this.subText = '', + this.code = '', + this.death = false, this.show, - required this.codeStyle, - this.codeFamily}) : super(key: key); + required this.codeStyle, + this.codeFamily}) + : super(key: key); @override _DeskWidgetNodePanelState createState() => _DeskWidgetNodePanelState(); @@ -49,7 +49,6 @@ class _DeskWidgetNodePanelState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ buildNodeTitle(), - const SizedBox( height: 20, ), @@ -65,13 +64,12 @@ class _DeskWidgetNodePanelState extends State { ), ), ), - if(!widget.death) - Expanded(child: _buildNodeInfo()), + if (!widget.death) Expanded(child: _buildNodeInfo()), ], ), - - const SizedBox(height: 16,), - + const SizedBox( + height: 16, + ), const Divider(), ], ), @@ -101,11 +99,11 @@ class _DeskWidgetNodePanelState extends State { Widget _buildNodeInfo() => SizedBox( width: double.infinity, child: Panel( - color: Color(0x33E5EAE1), + color: Color(0x33E5EAE1), child: Text( - widget.subText, - style: const TextStyle(fontSize: 12), - )), + widget.subText, + style: const TextStyle(fontSize: 12), + )), ); Widget _buildCodeButton() => Padding( @@ -142,7 +140,7 @@ class _DeskWidgetNodePanelState extends State { width: MediaQuery.of(context).size.width, child: CodeWidget( fontFamily: widget.codeFamily, - code: isFirst?'':widget.code, + code: isFirst ? '' : widget.code, style: widget.codeStyle ?? HighlighterStyle.fromColors(HighlighterStyle.lightColor), ), @@ -152,14 +150,14 @@ class _DeskWidgetNodePanelState extends State { ); //执行分享 - _doShare() async{ + void _doShare() async { // Share.share(widget.code); - await Clipboard.setData(ClipboardData(text: widget.code)); - Toast.success(context, '代码复制成功!'); + await Clipboard.setData(ClipboardData(text: widget.code)); + Toast.success(context, '代码复制成功!'); } // 折叠代码面板 - _toggleCodePanel() { + void _toggleCodePanel() { setState(() { _crossFadeState = !isFirst ? CrossFadeState.showFirst : CrossFadeState.showSecond; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart new file mode 100644 index 00000000..073713ff --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_id_view.dart @@ -0,0 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../../../widget_module.dart'; + +class WidgetIdView extends StatelessWidget { + final WidgetModel model; + + const WidgetIdView({super.key, required this.model}); + + @override + Widget build(BuildContext context) { + return Text( + "#${model.id}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, + color: Colors.white70, + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index 3e95d40e..63b99619 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -10,8 +10,8 @@ import 'package:widget_module/widget_module.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:fx_trace/fx_trace.dart'; -import 'desk_widget_model_item.dart'; import 'desk_widget_top_bar.dart'; +import 'widget_tiled.dart'; class DeskWidgetPanel extends StatefulWidget { const DeskWidgetPanel({super.key}); @@ -34,7 +34,8 @@ class _DeskWidgetPanelState extends State { child: switch (state) { WidgetsLoading() => const CupertinoActivityIndicator(), WidgetsLoaded() => WidgetList(state: state), - WidgetsLoadFailed() => Center(child: Text("${state.runtimeType}")), + WidgetsLoadFailed() => + Center(child: Text("${state.runtimeType}")), }, ), ], @@ -55,7 +56,8 @@ class WidgetList extends StatelessWidget { @override Widget build(BuildContext context) { - SliverGridDelegate gridDelegate = const SliverGridDelegateWithMaxCrossAxisExtent( + SliverGridDelegate gridDelegate = + const SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 400, mainAxisSpacing: 10, mainAxisExtent: 110, @@ -72,7 +74,7 @@ class WidgetList extends StatelessWidget { Widget _buildItem(BuildContext context, int index) { WidgetModel model = state.widgets[index]; - return DeskWidgetItem( + return WidgetTiled( model: model, onTap: () { context.push('${AppRoute.widgetDetail.url}${model.name}', extra: model); diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart similarity index 52% rename from modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart rename to modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart index 69c2c370..2ee9a309 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/desk_widget_model_item.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart @@ -3,21 +3,23 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; +import 'package:widget_module/blocs/action/widget_action.dart'; import 'package:widget_module/blocs/blocs.dart'; -import 'package:widget_module/views/components/collected_tag.dart'; import 'package:widget_repository/widget_repository.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:wrapper/wrapper.dart'; import 'package:tolyui/tolyui.dart'; import '../../components/widget_logo_map.dart'; import '../like_tag.dart'; import 'package:l10n/l10n.dart'; -class DeskWidgetItem extends StatelessWidget { + +import 'widget_id_view.dart'; + +class WidgetTiled extends StatelessWidget { final WidgetModel model; final VoidCallback onTap; final String? searchArg; - const DeskWidgetItem({ + const WidgetTiled({ super.key, required this.model, required this.onTap, @@ -26,44 +28,49 @@ class DeskWidgetItem extends StatelessWidget { @override Widget build(BuildContext context) { - Color? tileColor = Theme.of(context).listTileTheme.tileColor; - Color? textColor = Theme.of(context).listTileTheme.textColor; - bool isDark = Theme.of(context).brightness == Brightness.dark; - textColor = isDark ? textColor : Color(0xff2F3032); - Color color = Theme.of(context).primaryColor; + ThemeData theme = Theme.of(context); + ListTileThemeData data = theme.listTileTheme; + Color? tileColor = data.tileColor; + Color? textColor = data.textColor; + bool isDark = theme.brightness == Brightness.dark; + textColor = isDark ? textColor : const Color(0xff2F3032); + Color color = theme.primaryColor; + EdgeInsetsGeometry padding = + const EdgeInsets.symmetric(horizontal: 12, vertical: 8); + return Stack( children: [ InkWell( borderRadius: BorderRadius.circular(6), onTap: onTap, child: Ink( - decoration: - BoxDecoration(color: tileColor, borderRadius: BorderRadius.circular(6), boxShadow: [ - BoxShadow( - color: Theme.of(context).primaryColor.withValues(alpha:0.1), - blurRadius: 2, - ) - ]), - // padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - // margin: + decoration: BoxDecoration( + color: tileColor, + borderRadius: BorderRadius.circular(6), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.1), + blurRadius: 2, + ) + ], + ), child: Row( children: [ GestureDetector( - onLongPress: (){ - context.read().add(ToggleLikeWidgetEvent(id: model.id)); - }, + onLongPress: () => context.toggleLike(model.id), child: Hero( - tag: "hero_widget_image_${model.id}", - child: WidgetLogo(background: color, widgetName: model.name,)), + tag: model.heroId, + child: WidgetLogo( + background: color, widgetName: model.name)), ), Expanded( child: Padding( - padding:const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: padding, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _buildTitle(Theme.of(context).primaryColor, textColor, isDark), + _buildTitle(color, textColor, isDark), _buildContent(textColor), _buildFoot(isDark) ], @@ -75,60 +82,50 @@ class DeskWidgetItem extends StatelessWidget { ), ), LikeTag(widget: model), - Positioned( - bottom: 2, - left: 6, - child: Text( - "#${model.id}", - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12, - color: Colors.white70, - ), - )) + Positioned(bottom: 2, left: 6, child: WidgetIdView(model: model)) ], ); } + Widget linkText(BuildContext context) => Row( - children: [ - const Padding( - padding: EdgeInsets.only(left: 15, right: 5), - child: Icon(Icons.link, color: Colors.blue), + children: [ + const Padding( + padding: EdgeInsets.only(left: 15, right: 5), + child: Icon(Icons.link, color: Colors.blue), + ), + Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), + ], + ); + + Widget listTitle(Color? textColor) { + return GestureDetector( + child: Text( + model.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14, + color: textColor, + fontWeight: FontWeight.bold, + ), ), - Text(context.l10n.relatedComponents, style: UnitTextStyle.labelBold), - ], - ); + onLongPress: () async { + await Clipboard.setData(ClipboardData(text: model.name)); + $message.success(message: '名称复制成功!'); + }, + ); + } + Widget _buildTitle(Color color, Color? textColor, bool isDark) { + Widget title; + if (searchArg == null) { + title = listTitle(textColor); + } else { + title = Text.rich(formSpan(model.name, searchArg!)); + } return Row( children: [ - if (searchArg == null) - Expanded( - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 8, - children: [ - GestureDetector( - child: Text( - model.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 14, - color: textColor, - fontWeight: FontWeight.bold, - ), - ), - onLongPress: () async{ - await Clipboard.setData(ClipboardData(text: model.name)); - $message.success(message: '名称复制成功!'); - }, - ), - - ], - ), - ), - if (searchArg != null) Text.rich(formSpan(model.name, searchArg!)), + Expanded(child: title), StarScore( star: Star(emptyColor: Colors.white, size: 12, fillColor: color), score: model.lever, @@ -156,31 +153,34 @@ class DeskWidgetItem extends StatelessWidget { width: 4, height: 4, margin: const EdgeInsets.only(right: 6), - decoration: const BoxDecoration(color: Color(0xff86909c), shape: BoxShape.circle), + decoration: const BoxDecoration( + color: Color(0xff86909c), shape: BoxShape.circle), ), Expanded( child: Text( model.nameCN, maxLines: 1, overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 12, height: 1, color: Color(0xff86909c)), + style: const TextStyle( + fontSize: 12, height: 1, color: Color(0xff86909c)), ), ), Wrapper.just( radius: 4, - color: isDark ? Color(0xff292A2D) : const Color(0xffF3F3F5), + color: isDark ? const Color(0xff292A2D) : const Color(0xffF3F3F5), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Text( Cons.kWidgetFamilyLabelMap[model.family]!, style: TextStyle( - color: isDark ? Color(0xffCCCCCC) : Color(0xff878D96), + color: + isDark ? const Color(0xffCCCCCC) : const Color(0xff878D96), height: 1, fontSize: 10, shadows: [ Shadow( color: isDark ? Colors.black : Colors.white, blurRadius: 2, - offset: Offset(1, 1)) + offset: const Offset(1, 1)) ]), ), ), @@ -201,7 +201,9 @@ class DeskWidgetItem extends StatelessWidget { span.add(TextSpan(text: match.group(0), style: lightTextStyle)); return ''; }, onNonMatch: (str) { - span.add(TextSpan(text: str, style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); + span.add(TextSpan( + text: str, + style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); return ''; }); return TextSpan(children: span); diff --git a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart index 1ff58e30..0dd26148 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/search_page/standard_search_page.dart @@ -8,7 +8,7 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:l10n/l10n.dart'; import 'package:widget_repository/widget_repository.dart'; -import '../widget_page/widget_model_item.dart'; +import '../widget_page/mobile_widget_tiled.dart'; import 'standard_search_bar.dart'; // SearchPage 可以复用 WidgetsBloc,进行局部的 Bloc @@ -41,7 +41,11 @@ class StandardSearchPage extends StatelessWidget { SizedBox( height: MediaQuery.of(context).padding.top, width: MediaQuery.of(context).size.width, - child: ColoredBox(color: isDark?Theme.of(context).appBarTheme.backgroundColor??Colors.black:Colors.white), + child: ColoredBox( + color: isDark + ? Theme.of(context).appBarTheme.backgroundColor ?? + Colors.black + : Colors.white), ), const StandardSearchBarInner(), Expanded( @@ -53,20 +57,22 @@ class StandardSearchPage extends StatelessWidget { } Widget _buildBodyByState(BuildContext context, WidgetsState state) { - Widget noSearchArg = NotSearchPage(tips: context.l10n.searchSomething,); + Widget noSearchArg = NotSearchPage( + tips: context.l10n.searchSomething, + ); if (state.filter.name.isEmpty) { return noSearchArg; } if (state is WidgetsLoaded) { if (state.widgets.isEmpty) { - return EmptyShower( + return EmptyShower( message: context.l10n.emptySearch, ); } return ListView.builder( padding: EdgeInsets.zero, - itemBuilder: (_, index) => StandardWidgetItem( + itemBuilder: (_, index) => MobileWidgetTiled( searchArg: state.filter.name, model: state.widgets[index], onTap: () => _toDetail(context, state.widgets[index])), @@ -87,6 +93,6 @@ class StandardSearchPage extends StatelessWidget { void _toDetail(BuildContext context, WidgetModel model) { // BlocProvider.of(context).add(FetchWidgetDetail(model)); - context.push('/widget/detail/${model.name}',extra: model); + context.push('/widget/detail/${model.name}', extra: model); } } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart new file mode 100644 index 00000000..ac1c637f --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/mobile_widget_tiled.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +import 'package:widget_repository/widget_repository.dart'; +import '../../desk_ui/widget_panel/widget_tiled.dart'; + +class MobileWidgetTiled extends StatelessWidget { + final WidgetModel model; + final VoidCallback onTap; + final String? searchArg; + + const MobileWidgetTiled({ + Key? key, + required this.model, + required this.onTap, + this.searchArg, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8, top: 8), + child: WidgetTiled( + model: model, + onTap: onTap, + searchArg: searchArg, + ), + ); + } +} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart index 728d6410..13160801 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/phone_widget_content.dart @@ -4,7 +4,9 @@ import 'package:go_router/go_router.dart'; import 'package:widget_repository/widget_repository.dart'; -import 'widget_model_item.dart'; +import 'mobile_widget_tiled.dart'; + + class PhoneWidgetContent extends StatelessWidget { final List items; @@ -15,7 +17,7 @@ class PhoneWidgetContent extends StatelessWidget { Widget build(BuildContext context) { return SliverList( delegate: SliverChildBuilderDelegate( - (_, int index) => StandardWidgetItem( + (_, int index) => MobileWidgetTiled( model: items[index], onTap: () => _toDetail(context, items[index]), ), diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index b90b2cd6..53b021db 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -76,8 +76,9 @@ class _StandardHomePageState extends State Expanded( child: NestedScrollView( floatHeaderSlivers: true, + physics: const BouncingScrollPhysics(), headerSliverBuilder: _buildHeader, - body: WidgetPage()), + body: const WidgetPage()), ), SizedBox( height: bottom, diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index e8cff546..8b7e321c 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -53,13 +53,10 @@ class StandardHomeSearch extends StatelessWidget color: Colors.grey, size: 20, ), - - prefixIconConstraints: const BoxConstraints( - maxHeight: 24, - minWidth: 36 - ), + prefixIconConstraints: + const BoxConstraints(maxHeight: 24, minWidth: 36), isCollapsed: true, - contentPadding: const EdgeInsets.only(top: 4,bottom: 4,right: 8), + contentPadding: const EdgeInsets.only(top: 4, bottom: 4, right: 8), border: const UnderlineInputBorder( borderSide: BorderSide.none, borderRadius: BorderRadius.all(Radius.circular(6)), @@ -83,7 +80,6 @@ class StandardHomeSearch extends StatelessWidget Widget _buildCollectIcon(BuildContext context) { return IconButton( - // splashRadius: 20, onPressed: () => context.push(AppRoute.collection.url), icon: const Icon(TolyIcon.icon_collect), ); diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart deleted file mode 100644 index d6b370e2..00000000 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_model_item.dart +++ /dev/null @@ -1,162 +0,0 @@ -import 'package:app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_star/flutter_star.dart'; -import 'package:widget_module/blocs/blocs.dart'; - -import 'package:wrapper/wrapper.dart'; - -import 'package:widget_repository/widget_repository.dart'; -import '../../components/collected_tag.dart'; - -class StandardWidgetItem extends StatelessWidget { - final WidgetModel model; - final VoidCallback onTap; - final String? searchArg; - - const StandardWidgetItem( - {Key? key, required this.model, required this.onTap, this.searchArg}) - : super(key: key); - - @override - Widget build(BuildContext context) { - Color? tileColor = Theme.of(context).listTileTheme.tileColor; - Color? textColor = Theme.of(context).listTileTheme.textColor; - bool isDark = Theme.of(context).brightness == Brightness.dark; - textColor = isDark?textColor: Color(0xff2F3032); - - return Padding( - padding: const EdgeInsets.only(top: 10), - child: InkWell( - onTap: onTap, - child: Ink( - color: tileColor, - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), - // margin: - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildTitle(Theme.of(context).primaryColor,textColor,isDark), - _buildContent(textColor), - _buildFoot(isDark) - ], - ), - ), - ), - ); - } - - Widget _buildTitle(Color color,Color? textColor,bool isDark) { - Widget text ; - if(searchArg==null){ - text = Text( - model.name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 16, - color: textColor, - fontWeight: FontWeight.bold, - ), - ); - }else{ - text = Text.rich(formSpan(model.name, searchArg!)); - } - - return Row( - children: [ - Expanded(child: Wrap( - children: [ - text, - const SizedBox( - width: 8, - ), - BlocBuilder(builder: (_, s) { - bool show = s.widgets.contains(model); - return Opacity( - opacity: show ? 1.0 : 0.0, - child: const CollectedTag(), - ); - }), - ], - )), - - StarScore( - star: Star(emptyColor: Colors.white, size: 12, fillColor: color), - score: model.lever, - ), - ], - ); - } - - Widget _buildContent(Color? textColor) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 6), - child: Text( - model.info, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 14, color: textColor), - ), - ); - } - - Widget _buildFoot(bool isDark) { - - return Row( - children: [ - Container( - width: 4, - height: 4, - margin: const EdgeInsets.only(right: 6), - decoration: const BoxDecoration( - color: Color(0xff86909c), shape: BoxShape.circle), - ), - Text( - model.nameCN, - style: const TextStyle( - fontSize: 12, height: 1, color: Color(0xff86909c)), - ), - const Spacer(), - Wrapper.just( - radius: 2, - color: isDark? Color(0xff292A2D):const Color(0xffF3F3F5), - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - Cons.kWidgetFamilyLabelMap[model.family]!, - style: TextStyle( - color: isDark?Color(0xffCCCCCC):Color(0xff878D96), - height: 1, - fontSize: 12, - shadows: [ - Shadow( - color: isDark? Colors.black:Colors.white, blurRadius: 2, offset: Offset(1, 1)) - ]), - ), - ), - ], - ); - } - - final TextStyle lightTextStyle = const TextStyle( - color: Colors.red, - fontSize: 16, - fontWeight: FontWeight.bold, - ); - - InlineSpan formSpan(String src, String pattern) { - List span = []; - RegExp regExp = RegExp(pattern, caseSensitive: false); - src.splitMapJoin(regExp, onMatch: (Match match) { - span.add(TextSpan(text: match.group(0), style: lightTextStyle)); - return ''; - }, onNonMatch: (str) { - span.add(TextSpan( - text: str, - style: lightTextStyle.copyWith(color: const Color(0xff2F3032)))); - return ''; - }); - return TextSpan(children: span); - } -} diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart index 02bbd5e8..1af2ca97 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart @@ -14,10 +14,8 @@ class WidgetPage extends StatefulWidget { } class _WidgetPageState extends State { - final RefreshController _refreshController = - RefreshController(initialRefresh: false); - + RefreshController(initialRefresh: false); @override void dispose() { @@ -27,23 +25,20 @@ class _WidgetPageState extends State { @override Widget build(BuildContext context) { - const Color themeColor = Color(0xff007ACB); - - return BlocListener( + return BlocListener( listener: _listenStateChange, child: RefreshConfigWrapper( child: SmartRefresher( + physics: BouncingScrollPhysics(), controller: _refreshController, onRefresh: _onRefresh, enablePullUp: true, onLoading: _onLoadMore, child: CustomScrollView( - + physics: BouncingScrollPhysics(), // key: PageStorageKey(name), slivers: [ - const WidgetListPanel(), - ], ), ), @@ -51,7 +46,7 @@ class _WidgetPageState extends State { ); } - void _onRefresh() async{ + void _onRefresh() async { context.read().add(EventRefresh()); } @@ -59,7 +54,7 @@ class _WidgetPageState extends State { context.read().add(EventLoadMore()); } - void _listenStateChange(BuildContext context, WidgetsState state) async{ + void _listenStateChange(BuildContext context, WidgetsState state) async { if (state is WidgetsLoaded) { if (state.operate == LoadOperate.refresh) { _refreshController.refreshCompleted(); diff --git a/modules/widget_system/widget_repository/lib/src/model/widget_model.dart b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart index c1510e9c..ae2bd01e 100644 --- a/modules/widget_system/widget_repository/lib/src/model/widget_model.dart +++ b/modules/widget_system/widget_repository/lib/src/model/widget_model.dart @@ -4,7 +4,6 @@ import 'package:flutter/cupertino.dart'; import '../../widget_repository.dart'; import '../database/po/widget_po.dart'; - /// create by 张风捷特烈 on 2020-03-04 /// contact me by email 1981462002@qq.com /// 说明: 组件信息-展示-数据模型 @@ -32,20 +31,20 @@ class WidgetModel extends Equatable { final ImageProvider? image; final String info; + String get heroId => 'hero_widget_image_$id'; const WidgetModel( - { - required this.id, - required this.name, - required this.nameCN, - required this.family, - this.deprecated =false, - this.death =false, - required this.links, - // required this.type, - required this.lever, + {required this.id, + required this.name, + required this.nameCN, + required this.family, + this.deprecated = false, + this.death = false, + required this.links, + // required this.type, + required this.lever, this.image, - required this.info}); + required this.info}); @override List get props => [id]; @@ -72,20 +71,19 @@ class WidgetModel extends Equatable { return null; } - @override String toString() { return 'WidgetModel{id: $id, name: $name, nameCN: $nameCN, family: $family, deprecated: $deprecated, links: $links, lever: $lever, image: $image, info: $info}'; } static List formatLinkTo(String links) { - if(links.isEmpty){ + if (links.isEmpty) { return []; } - if(!links.contains(',')){ + if (!links.contains(',')) { return [int.parse(links)]; } - return links.split(',').map((e)=>int.parse(e)).toList(); + return links.split(',').map((e) => int.parse(e)).toList(); } static WidgetFamily toFamily(int id) { From d339fba0c3d356dddd9687b8f140b61ac69e4b9b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 22 May 2025 09:55:24 +0800 Subject: [PATCH 144/149] upgrade flutter sdk -> 3.32.0 flutterunit -> 3.2.0 --- analysis_options.yaml | 2 +- .../app/{build.gradle => build.gradle.kts} | 32 +-- android/build.gradle | 18 -- android/build.gradle.kts | 21 ++ .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 25 -- android/settings.gradle.kts | 25 ++ lib/src/l10n/gen/app_l10n.dart | 60 +++-- .../router/widgets/widgets_route.dart | 7 +- .../navigation/view/app_bloc_provider.dart | 12 +- .../view/desktop/menu_bar_leading.dart | 4 +- lib/src/navigation/view/mobile/carousel.dart | 236 ++++++++++++++++++ lib/src/navigation/view/mobile/news.dart | 137 ++++++++++ .../view/mobile/unit_navigation.dart | 34 +-- lib/src/starter/bridge/unit_bridge.dart | 7 +- lib/src/starter/fx_application.dart | 5 +- lib/src/starter/start_repository.dart | 14 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- modules/basic_system/app/lib/app.dart | 5 +- .../app/lib/app/cons/global_value.dart | 38 ++- .../app/lib/app/theme/app_theme.dart | 4 +- .../app/lib/app_config/bloc/bloc.dart | 25 +- .../app/lib/app_config/bloc/state.dart | 15 +- modules/basic_system/app/lib/event/api.dart | 12 + .../http/flutter_unit/api/upgrade_api.dart | 4 +- .../basic_system/app/lib/http/register.dart | 18 +- .../app/lib/http/science/science_host.dart | 26 +- .../basic_system/app/lib/news/cacheable.dart | 83 ++++++ .../basic_system/app/lib/news/news_bloc.dart | 48 ++++ .../view/about/version/version_shower.dart | 14 +- .../view/data_manage/data_manage_page.dart | 57 +++-- .../app_update/lib/bloc/bloc.dart | 14 +- modules/basic_system/app_update/pubspec.yaml | 2 +- .../authentication/lib/blocs/user/bloc.dart | 7 +- .../src/articles/data/dao/article_dao.dart | 45 ++-- .../src/articles/data/dao/columnize_dao.dart | 16 +- .../lib/src/articles/data/model/article.dart | 3 +- .../view/article/columnize_page_view.dart | 64 ++--- .../src/articles/view/desk_artifact_page.dart | 61 +++-- modules/knowledge_system/note/lib/note.dart | 4 +- .../note/lib/src/bloc/bloc.dart | 23 +- .../note/lib/src/bloc/news_bloc.dart | 55 ++++ .../src/repository/article_repository.dart | 45 +++- .../lib/src/repository/model/article.dart | 44 +++- .../note/lib/src/repository/model/query.dart | 2 +- .../note/lib/src/repository/repository.dart | 2 + .../note/lib/src/view/article_admin.dart | 21 +- .../note/lib/src/view/article_list.dart | 43 +--- .../src/view/components/button/button.dart | 8 +- .../lib/src/view/desktop/article_display.dart | 86 +++++++ .../src/view/mobile/mobile_article_page.dart | 17 +- modules/knowledge_system/note/pubspec.yaml | 3 +- .../lib/views/components/widget_logo_map.dart | 5 +- .../desk_ui/widget_panel/widget_panel.dart | 35 ++- .../desk_ui/widget_panel/widget_tiled.dart | 2 - .../category_page/sync/upload_button.dart | 11 +- .../lib/views/mobile/widget_page/slider.dart | 212 ++++++++++++++++ .../widget_page/standard_home_page.dart | 18 +- .../widget_page/standard_home_search.dart | 5 +- .../views/mobile/widget_page/widget_page.dart | 3 +- .../lib/src/database/dao/category_dao.dart | 2 +- .../lib/src/database/dao/like_dao.dart | 2 +- .../lib/src/database/dao/node_dao.dart | 2 +- .../lib/src/database/dao/widget_dao.dart | 36 +-- .../widget_repository/pubspec.yaml | 2 +- .../WidgetInspector/node1_base.dart | 19 +- .../lib/StatelessWidget/Theme/node2_use.dart | 4 +- pubspec.lock | 230 ++++++++--------- pubspec.yaml | 15 +- .../flutter/generated_plugin_registrant.cc | 3 - windows/flutter/generated_plugins.cmake | 1 - 71 files changed, 1570 insertions(+), 596 deletions(-) rename android/app/{build.gradle => build.gradle.kts} (56%) delete mode 100644 android/build.gradle create mode 100644 android/build.gradle.kts delete mode 100644 android/settings.gradle create mode 100644 android/settings.gradle.kts create mode 100644 lib/src/navigation/view/mobile/carousel.dart create mode 100644 lib/src/navigation/view/mobile/news.dart create mode 100644 modules/basic_system/app/lib/event/api.dart create mode 100644 modules/basic_system/app/lib/news/cacheable.dart create mode 100644 modules/basic_system/app/lib/news/news_bloc.dart create mode 100644 modules/knowledge_system/note/lib/src/bloc/news_bloc.dart create mode 100644 modules/knowledge_system/note/lib/src/view/desktop/article_display.dart create mode 100644 modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 632bf60b..d54e87f3 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -15,7 +15,7 @@ linter: file_names: false analyzer: - exclude: +# exclude: # - modules/widget_system/widgets/** diff --git a/android/app/build.gradle b/android/app/build.gradle.kts similarity index 56% rename from android/app/build.gradle rename to android/app/build.gradle.kts index 6dba3de2..d73f8c2d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle.kts @@ -1,8 +1,8 @@ plugins { - id "com.android.application" - id "kotlin-android" + id("com.android.application") + id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" + id("dev.flutter.flutter-gradle-plugin") } android { @@ -11,12 +11,12 @@ android { ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 + jvmTarget = JavaVersion.VERSION_11.toString() } defaultConfig { @@ -26,19 +26,23 @@ android { // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion - versionCode = 1 - versionName = '1' + versionCode = flutter.versionCode + versionName = flutter.versionName } + buildTypes { - release { + getByName("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 - shrinkResources true // 移除未使用的资源 - minifyEnabled true // 启用 R8 代码压缩 - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig = signingConfigs.getByName("debug") + isShrinkResources = true // 移除未使用的资源 + isMinifyEnabled = true // 启用 R8 代码压缩 + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) ndk { - debugSymbolLevel "none" + debugSymbolLevel = "none" } } } diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index d2ffbffa..00000000 --- a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 00000000..89176ef4 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 6430a9e1..80765cdf 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,6 +3,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index b9e43bd3..00000000 --- a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 00000000..ab39a10a --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/lib/src/l10n/gen/app_l10n.dart b/lib/src/l10n/gen/app_l10n.dart index b0e40388..ff69fde4 100644 --- a/lib/src/l10n/gen/app_l10n.dart +++ b/lib/src/l10n/gen/app_l10n.dart @@ -70,7 +70,8 @@ import 'app_l10n_zh.dart'; /// be consistent with the languages listed in the AppL10n.supportedLocales /// property. abstract class AppL10n { - AppL10n(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppL10n(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -90,7 +91,8 @@ abstract class AppL10n { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ + static const List> localizationsDelegates = + >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -187,33 +189,51 @@ class _AppL10nDelegate extends LocalizationsDelegate { } @override - bool isSupported(Locale locale) => ['de', 'en', 'es', 'fr', 'it', 'ja', 'ko', 'pt', 'ru', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => [ + 'de', + 'en', + 'es', + 'fr', + 'it', + 'ja', + 'ko', + 'pt', + 'ru', + 'zh' + ].contains(locale.languageCode); @override bool shouldReload(_AppL10nDelegate old) => false; } AppL10n lookupAppL10n(Locale locale) { - - // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'de': return AppL10nDe(); - case 'en': return AppL10nEn(); - case 'es': return AppL10nEs(); - case 'fr': return AppL10nFr(); - case 'it': return AppL10nIt(); - case 'ja': return AppL10nJa(); - case 'ko': return AppL10nKo(); - case 'pt': return AppL10nPt(); - case 'ru': return AppL10nRu(); - case 'zh': return AppL10nZh(); + case 'de': + return AppL10nDe(); + case 'en': + return AppL10nEn(); + case 'es': + return AppL10nEs(); + case 'fr': + return AppL10nFr(); + case 'it': + return AppL10nIt(); + case 'ja': + return AppL10nJa(); + case 'ko': + return AppL10nKo(); + case 'pt': + return AppL10nPt(); + case 'ru': + return AppL10nRu(); + case 'zh': + return AppL10nZh(); } throw FlutterError( - 'AppL10n.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' - ); + 'AppL10n.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); } diff --git a/lib/src/navigation/router/widgets/widgets_route.dart b/lib/src/navigation/router/widgets/widgets_route.dart index c63ae1f5..c9c60a0a 100644 --- a/lib/src/navigation/router/widgets/widgets_route.dart +++ b/lib/src/navigation/router/widgets/widgets_route.dart @@ -2,13 +2,16 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:widget_module/widget_module.dart'; +import '../../view/mobile/news.dart'; import '../../view/mobile/unit_navigation.dart'; GoRoute get widgetsRoute => GoRoute( path: AppRoute.widget.path, builder: (_, __) { - if (kAppEnv.isDesktopUI){ - return const DeskWidgetPanel(); + if (kAppEnv.isDesktopUI) { + return const DeskWidgetPanel( + header: CarouselNode2(), + ); } return const UnitPhoneNavigation(); }, diff --git a/lib/src/navigation/view/app_bloc_provider.dart b/lib/src/navigation/view/app_bloc_provider.dart index 22ef4be6..9c339a59 100644 --- a/lib/src/navigation/view/app_bloc_provider.dart +++ b/lib/src/navigation/view/app_bloc_provider.dart @@ -1,4 +1,5 @@ import 'package:app/app.dart'; +import 'package:note/note.dart'; import 'package:app_update/app_update.dart'; import 'package:authentication/authentication.dart'; import 'package:draw_system/draw_system.dart'; @@ -7,7 +8,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/widget_module.dart'; - /// create by 张风捷特烈 on 2020/4/28 /// contact me by email 1981462002@qq.com /// 说明: Bloc提供器包裹层 @@ -27,12 +27,16 @@ class _AppBlocProviderState extends State { return MultiBlocProvider( providers: [ // 全局 bloc : 维护应用存储状态、更新、认证 - BlocProvider(create: (_) => AuthBloc(repository: HttpAuthRepository())), + BlocProvider( + create: (_) => AuthBloc(repository: HttpAuthRepository())), BlocProvider(create: (_) => AppConfigBloc()), - BlocProvider(create: (_) => UpgradeBloc(api: UnitUpgradeApi())), + BlocProvider( + create: (_) => UpgradeBloc(api: UnitUpgradeApi())), BlocProvider(create: (_) => UserBloc()), + BlocProvider(create: (_) => NewsBloc()..initByCache()), - BlocProvider(create: (_) => GalleryUnitBloc()..loadGalleryInfo()), + BlocProvider( + create: (_) => GalleryUnitBloc()..loadGalleryInfo()), ], child: WidgetsBlocProvider(child: widget.child), ); diff --git a/lib/src/navigation/view/desktop/menu_bar_leading.dart b/lib/src/navigation/view/desktop/menu_bar_leading.dart index 439cac9b..c3d097b0 100644 --- a/lib/src/navigation/view/desktop/menu_bar_leading.dart +++ b/lib/src/navigation/view/desktop/menu_bar_leading.dart @@ -27,7 +27,9 @@ class MenuBarLeading extends StatelessWidget { crossAxisAlignment: WrapCrossAlignment.center, children: [ GestureDetector( - onDoubleTap: () {}, + onDoubleTap: () { + sendEvent(1); + }, child: const CircleImage( image: AssetImage('assets/images/icon_head.webp'), size: 60, diff --git a/lib/src/navigation/view/mobile/carousel.dart b/lib/src/navigation/view/mobile/carousel.dart new file mode 100644 index 00000000..6802defa --- /dev/null +++ b/lib/src/navigation/view/mobile/carousel.dart @@ -0,0 +1,236 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:app/app.dart'; +import 'news.dart'; + +typedef TypeWidgetBuilder = Widget Function(BuildContext context, T data); + +class Carousel extends StatefulWidget { + final List data; + final TypeWidgetBuilder itemBuilder; + + const Carousel({ + super.key, + required this.data, + required this.itemBuilder, + }); + + @override + State createState() => _CarouselState(); +} + +class _CarouselState extends State> { + final ValueNotifier factor = ValueNotifier(0); + + late PageController _ctrl; + + final int _firstOffset = 1000; //初始偏移 + int _position = 0; //页面位置 + + @override + void initState() { + super.initState(); + _position = _position + _firstOffset; + + double value = ((_position - _firstOffset + 1) % 5) / 5; + factor.value = value == 0 ? 1 : value; + _ctrl = PageController( + viewportFraction: kAppEnv.isDesktopUI ? 0.38 : 0.8, + initialPage: _position, + )..addListener(() { + if (_ctrl.page != null) { + double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; + factor.value = value == 0 ? 1 : value; + } + }); + } + + @override + void dispose() { + _ctrl.dispose(); + factor.dispose(); + super.dispose(); + } + + Color get color => Colors.blue; + + Color get nextColor => Colors.orangeAccent; + + bool get isDark => Theme.of(context).brightness == Brightness.dark; + + @override + Widget build(BuildContext context) { + List data = widget.data; + if (data.isEmpty) return const SizedBox(); + Widget child = PageView.builder( + controller: _ctrl, // itemCount: 7, + itemBuilder: (_, index) { + int realIndex = _fixPosition(index, _firstOffset, data.length); + return GestureDetector( + child: AnimatedBuilder( + animation: _ctrl, + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), + child: widget.itemBuilder(context, data[realIndex]), + ), + ); + }, + onPageChanged: (index) { + _position = index; + setState(() {}); + }, + ); + + int realIndex = _fixPosition(_position, _firstOffset, data.length); + + child = Stack( + alignment: Alignment.bottomCenter, + children: [ + child, + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Wrap( + spacing: 6, + children: widget.data.asMap().keys.map((int index) { + return GestureDetector( + onTap: () { + int deta = index - realIndex; + _position += deta; + print('$_position,$realIndex'); + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + child: Container( + width: 8, + height: 8, + decoration: BoxDecoration( + color: realIndex == index + ? Colors.white + : Colors.black.withValues(alpha: 0.4), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.white.withValues(alpha: 0.3), + spreadRadius: 1, + blurRadius: 10, + blurStyle: BlurStyle.outer) + ]), + ), + ); + }).toList(), + ), + ) + ], + ); + + if (!kIsDesk) { + return child; + } + + return Stack( + alignment: Alignment.center, + children: [ + child, + Positioned( + right: 0, + child: HoverIndicator( + onTap: () { + _position += 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icons.navigate_next_outlined, + )), + Positioned( + left: 0, + child: HoverIndicator( + onTap: () { + _position -= 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icons.navigate_before)), + ], + ); + } + + Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { + double value; + if (_ctrl.position.haveDimensions && _ctrl.page != null) { + value = _ctrl.page! - index; + } else { + value = (_position - index).toDouble(); + } + value = (1 - ((value.abs()) * 0.2)).clamp(0, 1).toDouble(); + value = Curves.easeOut.transform(value); + + return Transform( + transform: Matrix4.diagonal3Values(value, value, 1.0), + alignment: Alignment.center, + child: child, + ); + } + + int _fixPosition(int realPos, int initPos, int length) { + if (length == 0) return 0; + final int offset = realPos - initPos; + int result = offset % length; + return result < 0 ? length + result : result; + } +} + +class HoverIndicator extends StatefulWidget { + final IconData icon; + final VoidCallback onTap; + + const HoverIndicator({super.key, required this.icon, required this.onTap}); + + @override + State createState() => _HoverIndicatorState(); +} + +class _HoverIndicatorState extends State { + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: _onEnter, + onExit: _onExit, + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: widget.onTap, + child: Container( + width: 36, + height: 260, + child: !_hover + ? null + : Icon( + widget.icon, + color: Colors.white, + ), + color: _hover + ? Colors.blue.withValues(alpha: 0.2) + : Colors.transparent, + ), + )); + } + + bool _hover = false; + + void _onEnter(PointerEnterEvent event) { + setState(() { + _hover = true; + }); + } + + void _onExit(PointerExitEvent event) { + setState(() { + _hover = false; + }); + } +} diff --git a/lib/src/navigation/view/mobile/news.dart b/lib/src/navigation/view/mobile/news.dart new file mode 100644 index 00000000..aa586210 --- /dev/null +++ b/lib/src/navigation/view/mobile/news.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; +import 'package:tolyui/basic/basic.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'carousel.dart'; +import 'package:app/app.dart'; + +class CarouselNode2 extends StatefulWidget { + const CarouselNode2({super.key}); + + @override + State createState() => _CarouselNode2State(); +} + +class _CarouselNode2State extends State { + @override + Widget build(BuildContext context) { + List data = + context.select((NewsBloc bloc) => bloc.state.headerNews); + return ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 64), + child: Column( + spacing: 2, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 4), + child: Row( + children: [ + Text( + "最新资讯", + style: TextStyle(fontWeight: FontWeight.w600), + ), + if (kAppEnv.isDesktopUI) + TolyAction( + style: ActionStyle(padding: EdgeInsets.all(2)), + child: Icon( + Icons.refresh, + size: 16, + ), + onTap: () { + context.read().refreshFromNet(); + }), + Spacer(), + Text( + '查看更多', + style: TextStyle(fontSize: 12, color: Color(0xff999999)), + ) + ], + ), + ), + Expanded( + child: Carousel( + data: data, + itemBuilder: (BuildContext context, ArticlePo data) { + return NewsArticleDisplay(article: data); + }, + ), + ), + ], + ), + ); + } +} + +void launch(String url) => _launchUrl(url); + +void _launchUrl(String url) async { + if (!await launchUrl(Uri.parse(url))) {} +} + +class NewsArticleDisplay extends StatelessWidget { + const NewsArticleDisplay({ + super.key, + required this.article, + }); + + final ArticlePo article; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + _launchUrl(article.url); + }, + child: Container( + // margin: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: NetworkImage(article.cover ?? ''), fit: BoxFit.cover)), + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Container( + width: 16, + height: 16, + margin: EdgeInsets.only(right: 6), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(4)), + child: Text( + '新', + style: + TextStyle(fontSize: 8, color: Colors.white, height: 1), + ), + ), + Flexible( + child: Text( + article.title, + style: TextStyle( + color: Colors.white, + shadows: [ + Shadow( + color: Colors.black, + offset: Offset(.5, .5), + blurRadius: 4) + ], + fontSize: 14, + fontWeight: FontWeight.bold), + softWrap: false, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 9c7519c1..425e6667 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -13,6 +13,7 @@ import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; import 'package:note/note.dart'; +import 'news.dart'; import 'pure_bottom_bar.dart'; /// create by 张风捷特烈 on 2020-04-11 @@ -50,26 +51,25 @@ class _UnitPhoneNavigationState extends State { super.dispose(); } - /// extendBody = true 凹嵌透明,需要处理底部 边距 @override Widget build(BuildContext context) { - return Scaffold( - extendBody: true, - endDrawer: const HomeRightDrawer(), - body: PageView( - physics: _neverScroll, - controller: _controller, - children: [ - StandardHomePage(), - GalleryUnit(), - AlgoScope(child: ArtifactPage()), - ArtSysScope(child: MobileArticlePage()), - // MobileToolPage(), - UserPage(), - ], - ), - bottomNavigationBar: _buildBottomNav(context), + return Scaffold( + extendBody: true, + endDrawer: const HomeRightDrawer(), + body: PageView( + physics: _neverScroll, + controller: _controller, + children: [ + StandardHomePage(heard: CarouselNode2()), + GalleryUnit(), + AlgoScope(child: ArtifactPage()), + ArtSysScope(child: MobileArticlePage()), + // MobileToolPage(), + UserPage(), + ], + ), + bottomNavigationBar: _buildBottomNav(context), ); } diff --git a/lib/src/starter/bridge/unit_bridge.dart b/lib/src/starter/bridge/unit_bridge.dart index 33a5d1f2..11c7f4bc 100644 --- a/lib/src/starter/bridge/unit_bridge.dart +++ b/lib/src/starter/bridge/unit_bridge.dart @@ -3,8 +3,7 @@ import 'package:fx_dio/src/client/host.dart'; import 'package:note/note.dart'; import 'package:app/app.dart'; -class UnitNoteBridge with NoteModuleBridge{ - +class UnitNoteBridge with NoteModuleBridge { @override - Host get host => FxDio()(); -} \ No newline at end of file + Host get host => FxDio()(); +} diff --git a/lib/src/starter/fx_application.dart b/lib/src/starter/fx_application.dart index ff4cdce5..f66b52b3 100644 --- a/lib/src/starter/fx_application.dart +++ b/lib/src/starter/fx_application.dart @@ -5,11 +5,12 @@ import 'package:fx_boot_starter/fx_boot_starter.dart'; import 'package:go_router/go_router.dart'; import 'package:widget_module/widget_module.dart'; import 'package:widget_module/blocs/blocs.dart'; - import '../flutter_unit.dart'; import '../navigation/view/app_bloc_provider.dart'; import 'start_repository.dart'; import 'package:app_update/app_update.dart'; +import 'package:note/note.dart'; + export 'view/splash/Flutter_unit_splash.dart'; export 'view/error/app_start_error.dart'; @@ -30,6 +31,7 @@ class FxApplication with FxStarter { if (!kAppEnv.isWeb) { context.read().add(const EventLoadLikeData()); context.read().add(const EventLoadCategory()); + context.read().load(); } } @@ -38,6 +40,7 @@ class FxApplication with FxStarter { CheckUpdate event = CheckUpdate(appId: 1, locale: state.localeValue); context.read().add(event); context.go(AppRoute.widget.url); + sendEvent(1); } @override diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index fb2914d1..983db97c 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -6,7 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; +// import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; import 'package:fx_dio/fx_dio.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -29,19 +29,19 @@ class FlutterUnitStartRepo implements AppStartRepository { WindowSizeAdapter.setSize(); // throw 'Test Debug Start Error'; await SpStorage.instance.initSp(); + await initAppMeta(); registerHttpClient(); NoteEnv().attachBridge(UnitNoteBridge()); - if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); AppConfigPo po = await SpStorage.instance.appConfig.read(); - List netConnect = - await (Connectivity().checkConnectivity()); + // List netConnect = + // await (Connectivity().checkConnectivity()); AppConfig state = AppConfig.fromPo(po); - if (netConnect.isNotEmpty) { - state = state.copyWith(netConnect: netConnect.first); - } + // if (netConnect.isNotEmpty) { + // state = state.copyWith(netConnect: netConnect.first); + // } return state; } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f6bc1966..25112d2f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,7 +5,6 @@ import FlutterMacOS import Foundation -import connectivity_plus import file_picker import open_file_mac import package_info_plus @@ -20,7 +19,6 @@ import webview_flutter_wkwebview import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) @@ -31,6 +29,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) - FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin")) + WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/modules/basic_system/app/lib/app.dart b/modules/basic_system/app/lib/app.dart index 3d7e36b6..3849a58e 100644 --- a/modules/basic_system/app/lib/app.dart +++ b/modules/basic_system/app/lib/app.dart @@ -25,4 +25,7 @@ export 'app_config/app_config.dart'; export 'app/action/action.dart'; export 'app/router/app_route.dart'; export 'view/view.dart'; -export 'http/http.dart'; \ No newline at end of file +export 'http/http.dart'; +export 'event/api.dart'; +export 'news/news_bloc.dart'; +export 'news/cacheable.dart'; diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart index 296a21dc..7844a3c8 100644 --- a/modules/basic_system/app/lib/app/cons/global_value.dart +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -1,8 +1,42 @@ import 'dart:io'; import 'dart:ui'; - +import 'package:storage/storage.dart'; import 'package:flutter/foundation.dart'; +import 'package:uuid/uuid.dart'; double px1 = 1 / window.devicePixelRatio; -bool kIsDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; +String get kAppVersion => "3.1.0"; + +bool kIsDesk = + kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; + +late AppMeta kAppMeta; + +class AppMeta { + final String appVersion; + final String appId; + final String uuid; + + String get platform => Platform.operatingSystem; + + AppMeta(this.appVersion, this.appId, this.uuid); + + Map toHeaderJson() => { + 'X-App-Version': appVersion, + 'X-App-Id': appId, + 'X-Platform': platform, + 'X-Uuid': uuid, + }; +} + +Future initAppMeta() async { + String? uuid = SpStorage.instance.spf.getString('uuid'); + if (uuid == null) { + uuid = const Uuid().v4(); + SpStorage.instance.spf.setString('uuid', uuid); + } + String version = kAppVersion; + String appId = '1'; + kAppMeta = AppMeta(version, appId, uuid); +} diff --git a/modules/basic_system/app/lib/app/theme/app_theme.dart b/modules/basic_system/app/lib/app/theme/app_theme.dart index f96526da..7940d16a 100644 --- a/modules/basic_system/app/lib/app/theme/app_theme.dart +++ b/modules/basic_system/app/lib/app/theme/app_theme.dart @@ -20,7 +20,7 @@ ThemeData darkTheme(AppConfig state) { TargetPlatform.windows: FadePageTransitionsBuilder(), TargetPlatform.linux: FadePageTransitionsBuilder(), }), - tabBarTheme: const TabBarTheme( + tabBarTheme: const TabBarThemeData( dividerColor: Colors.transparent, ), fontFamily: state.fontFamily, @@ -97,7 +97,7 @@ ThemeData lightTheme(AppConfig state) { TargetPlatform.windows: FadePageTransitionsBuilder(), TargetPlatform.linux: FadePageTransitionsBuilder(), }), - tabBarTheme: TabBarTheme( + tabBarTheme: TabBarThemeData( dividerColor: Colors.transparent, // labelStyle: TextStyle(fontFamily: fontFamily), // unselectedLabelStyle: TextStyle(fontFamily: fontFamily), diff --git a/modules/basic_system/app/lib/app_config/bloc/bloc.dart b/modules/basic_system/app/lib/app_config/bloc/bloc.dart index 8ad80747..53dbc538 100644 --- a/modules/basic_system/app/lib/app_config/bloc/bloc.dart +++ b/modules/basic_system/app/lib/app_config/bloc/bloc.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:app/app.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; +// import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:l10n/l10n.dart'; @@ -12,25 +12,26 @@ import 'package:storage/storage.dart'; /// 说明: 全局信息的bloc class AppConfigBloc extends Cubit { - final Connectivity _connectivity = Connectivity(); + // final Connectivity _connectivity = Connectivity(); - late StreamSubscription> _subscription; + // late StreamSubscription> _subscription; AppConfigBloc() : super(const AppConfig()) { - _subscription = _connectivity.onConnectivityChanged.listen(_onNetConnectChange); + // _subscription = + // _connectivity.onConnectivityChanged.listen(_onNetConnectChange); } - void _onNetConnectChange(List event) { - if (event.isNotEmpty) { - emit(state.copyWith( - netConnect: event.first, - )); - } - } + // void _onNetConnectChange(List event) { + // if (event.isNotEmpty) { + // emit(state.copyWith( + // netConnect: event.first, + // )); + // } + // } @override Future close() async { - _subscription.cancel(); + // _subscription.cancel(); super.close(); } diff --git a/modules/basic_system/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart index 15293b1e..85113249 100644 --- a/modules/basic_system/app/lib/app_config/bloc/state.dart +++ b/modules/basic_system/app/lib/app_config/bloc/state.dart @@ -1,5 +1,8 @@ +import 'dart:io'; + +import 'package:app/app.dart'; import 'package:app/app/cons/cons.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; +// import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:l10n/l10n.dart'; @@ -35,7 +38,7 @@ class AppConfig extends Equatable { /// [appStyle] app 深色样式; final ThemeMode themeMode; - final ConnectivityResult netConnect; + // final ConnectivityResult netConnect; final Language language; @@ -49,7 +52,7 @@ class AppConfig extends Equatable { this.itemStyleIndex = 0, this.showPerformanceOverlay = false, this.showOverlayTool = true, - this.netConnect = ConnectivityResult.none, + // this.netConnect = ConnectivityResult.none, }); String get localeValue => language.locale.toString(); @@ -64,7 +67,7 @@ class AppConfig extends Equatable { themeMode, showOverlayTool, showPerformanceOverlay, - netConnect, + // netConnect, language, ]; @@ -79,7 +82,7 @@ class AppConfig extends Equatable { bool? showPerformanceOverlay, bool? showOverlayTool, ThemeMode? themeMode, - ConnectivityResult? netConnect, + // ConnectivityResult? netConnect, }) => AppConfig( fontFamily: fontFamily ?? this.fontFamily, @@ -92,7 +95,7 @@ class AppConfig extends Equatable { themeMode: themeMode ?? this.themeMode, showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay, - netConnect: netConnect ?? this.netConnect, + // netConnect: netConnect ?? this.netConnect, ); // 将 AppState 状态数据转换为配置对象,以便存储 diff --git a/modules/basic_system/app/lib/event/api.dart b/modules/basic_system/app/lib/event/api.dart new file mode 100644 index 00000000..ad1e4fdc --- /dev/null +++ b/modules/basic_system/app/lib/event/api.dart @@ -0,0 +1,12 @@ +import 'package:app/app.dart'; +import 'package:fx_dio/fx_dio.dart'; + +void sendEvent(int id, {String? extra}) async { + Host host = FxDio()(); + ApiRet ret = await host.post( + '/event', + data: {"event": id}, + convertor: (data) => data, + ); + print(ret.toString()); +} diff --git a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart index 8d80b3b0..3250b8d3 100644 --- a/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart +++ b/modules/basic_system/app/lib/http/flutter_unit/api/upgrade_api.dart @@ -5,7 +5,7 @@ import 'package:app/app.dart'; class UnitUpgradeApi implements UpgradeApi { @override - Future> fetch(int appId,String locale) async { + Future> fetch(int appId, String locale) async { Host host = FxDio()(); String path = ScienceApi.appVersion.path; return host.get( @@ -15,7 +15,7 @@ class UnitUpgradeApi implements UpgradeApi { 'os': kAppEnv.os.name, 'locale': locale, }, - convertor: AppInfo.fromMap, + convertor: (data) => AppInfo.fromMap(data), ); } } diff --git a/modules/basic_system/app/lib/http/register.dart b/modules/basic_system/app/lib/http/register.dart index 607c53dd..9b53dcdd 100644 --- a/modules/basic_system/app/lib/http/register.dart +++ b/modules/basic_system/app/lib/http/register.dart @@ -1,8 +1,18 @@ +import 'dart:async'; + +import 'package:app/app.dart'; import 'package:fx_dio/fx_dio.dart'; import 'http.dart'; -void registerHttpClient(){ - FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); - FxDio().register(const LightServerHost()); +void registerHttpClient() { + FxDio() + .register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); FxDio().register(const UnitHost()); -} \ No newline at end of file + + FxDio().auth(ScienceAuth()); +} + +class ScienceAuth extends ApiAuth { + @override + FutureOr> get buildHeaders => kAppMeta.toHeaderJson(); +} diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart index 8d2a2e23..4f129ae2 100644 --- a/modules/basic_system/app/lib/http/science/science_host.dart +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:fx_dio/fx_dio.dart'; class ScienceHost extends Host { @@ -6,29 +7,8 @@ class ScienceHost extends Host { @override Map get value => { HostEnv.release: 'toly1994.com', - HostEnv.dev: '127.0.0.1', - }; - - @override - HostConfig get config => const HostConfig( - scheme: 'http', - port: 3000, - apiNest: '/api/v1', - ); - - @override - HostEnv get env => HostEnv.dev; -} - -// 轻量服务器 -// 笔记 -class LightServerHost extends Host { - const LightServerHost(); - - @override - Map get value => { - HostEnv.release: '82.157.176.209', - HostEnv.dev: '127.0.0.1', + HostEnv.dev: '172.20.10.4', + // HostEnv.dev: '192.168.1.107', }; @override diff --git a/modules/basic_system/app/lib/news/cacheable.dart b/modules/basic_system/app/lib/news/cacheable.dart new file mode 100644 index 00000000..ec3d18e0 --- /dev/null +++ b/modules/basic_system/app/lib/news/cacheable.dart @@ -0,0 +1,83 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:storage/storage.dart'; +import 'package:fx_dao/fx_dao.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +mixin Cacheable { + FutureOr save(V po); + + FutureOr find({bool shouldRemove = true}); + + FutureOr remove(); +} + +mixin TimeoutCache on Cacheable { + String get cacheKey; + + int get maxCacheMs => 1000 * 60 * 30; + + SharedPreferences get spf => SpStorage.instance.spf; + + ConvertorList get convertor; + + @override + FutureOr find({bool shouldRemove = true}) async { + String? data = spf.getString(cacheKey); + if (data == null || data.isEmpty) return null; + try { + dynamic map = jsonDecode(data); + dynamic jsonValue = map['value']; + if (jsonValue == null) return null; + + int time = map['time'] ?? 0; + int nowMs = DateTime.now().millisecondsSinceEpoch; + int deadMs = time + maxCacheMs; + if (nowMs > deadMs && shouldRemove) { + await remove(); + return null; + } + return convertor(jsonDecode(jsonValue)); + } catch (e) { + print(e); + } + + return null; + } + + @override + FutureOr save(V po) async { + String data = json.encode(TimeoutPo.value(json.encode(po))); + return spf.setString(cacheKey, data); + } + + @override + FutureOr remove() { + return spf.remove(cacheKey); + } +} + +class TimeoutPo extends Po { + final int time; + final String data; + + TimeoutPo.value(this.data) : time = DateTime.now().millisecondsSinceEpoch; + + TimeoutPo({ + required this.time, + required this.data, + }); + + @override + Map toJson() => { + 'time': time, + 'value': data, + }; + + factory TimeoutPo.fromJson(dynamic map) { + return TimeoutPo( + time: map['time'], + data: map['value'], + ); + } +} diff --git a/modules/basic_system/app/lib/news/news_bloc.dart b/modules/basic_system/app/lib/news/news_bloc.dart new file mode 100644 index 00000000..7fe8ccdd --- /dev/null +++ b/modules/basic_system/app/lib/news/news_bloc.dart @@ -0,0 +1,48 @@ +// import 'package:flutter_bloc/flutter_bloc.dart'; +// import 'package:fx_dao/src/model/po.dart'; +// import 'package:fx_dao/src/table/dao.dart'; +// import 'package:note/note.dart'; +// import 'package:fx_dio/fx_dio.dart'; +// import 'cacheable.dart'; +// +// class NewsBloc extends Cubit +// with Cacheable>, TimeoutCache> { +// NewsBloc() : super(NewsState(headerNews: [])); +// +// ArticleRepository _repository = HttpArticleRepository(); +// +// @override +// String get cacheKey => 'flutter.unit.news'; +// +// void load() async { +// List? retCache = await find(); +// if (retCache != null) { +// print("=====load in cache========="); +// emit(NewsState(headerNews: retCache)); +// return; +// } +// refreshFromNet(); +// } +// +// Future refreshFromNet() async { +// ApiRet> ret = await _repository.getArticlesByTag(1); +// print("=====load in net========="); +// if (ret.success) { +// save(ret.data); +// emit(NewsState(headerNews: ret.data)); +// } +// } +// +// @override +// ConvertorList> get convertor => (e) { +// return e.map(ArticlePo.fromCache).toList(); +// }; +// } +// +// class NewsState { +// final List headerNews; +// +// NewsState({ +// required this.headerNews, +// }); +// } diff --git a/modules/basic_system/app/lib/view/about/version/version_shower.dart b/modules/basic_system/app/lib/view/about/version/version_shower.dart index 3c20a2cd..905c247b 100644 --- a/modules/basic_system/app/lib/view/about/version/version_shower.dart +++ b/modules/basic_system/app/lib/view/about/version/version_shower.dart @@ -1,5 +1,5 @@ +import 'package:app/app.dart'; import 'package:flutter/material.dart'; -import 'package:package_info_plus/package_info_plus.dart'; class VersionShower extends StatefulWidget { const VersionShower({Key? key}) : super(key: key); @@ -14,20 +14,10 @@ class _VersionShowerState extends State { @override void initState() { super.initState(); - _fetchVersion(); } @override Widget build(BuildContext context) { - return Text('Version $version'); - } - - void _fetchVersion() async{ - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - if(mounted) { - setState(() { - version= packageInfo.version; - }); - } + return Text('Version $kAppVersion'); } } diff --git a/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart index 85887305..a2a714dc 100644 --- a/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart +++ b/modules/basic_system/app/lib/view/data_manage/data_manage_page.dart @@ -7,8 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - - import 'package:authentication/views/authentic_widget.dart'; import 'package:utils/utils.dart'; import 'package:widget_module/blocs/blocs.dart'; @@ -18,7 +16,6 @@ import 'package:sqflite/sqflite.dart'; import 'package:widget_module/views/mobile/category_page/sync/category_api.dart'; import 'package:widget_module/widget_module.dart'; - /// create by 张风捷特烈 on 2021/2/26 /// contact me by email 1981462002@qq.com /// 说明: @@ -31,12 +28,14 @@ class DataManagePage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(context.l10n.dataManagement), + title: Text(context.l10n.dataManagement), ), body: Builder( builder: (ctx) => ListView( children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), AuthenticWidget.just( ListTile( trailing: Icon( @@ -87,22 +86,22 @@ class DataManagePage extends StatelessWidget { } void _doUploadCategoryData(BuildContext context) async { - CategoryRepository rep = BlocProvider.of(context).repository; - List loadCategories = await rep.loadCategoryData(); - - List likeData = await AppStorage().flutter().likeWidgetIds(); - - String json = jsonEncode(loadCategories); - String likeJson = jsonEncode(likeData); - - TaskResult result = - await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); - - if (result.success) { - Toast.toast(context, '数据集备份成功!'); - } else { - Toast.toast(context, '数据集备份失败!'); - } + // CategoryRepository rep = BlocProvider.of(context).repository; + // List loadCategories = await rep.loadCategoryData(); + // + // List likeData = await AppStorage().flutter().likeWidgetIds(); + // + // String json = jsonEncode(loadCategories); + // String likeJson = jsonEncode(likeData); + // + // TaskResult result = + // await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); + // + // if (result.success) { + // Toast.toast(context, '数据集备份成功!'); + // } else { + // Toast.toast(context, '数据集备份失败!'); + // } } void _doSync(BuildContext context) async { @@ -121,14 +120,14 @@ class DataManagePage extends StatelessWidget { } else { // 说明还没有后台数据, // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。 - CategoryRepository rep = - BlocProvider.of(context).repository; - List loadCategories = await rep.loadCategoryData(); - List likeData = await AppStorage().flutter().likeWidgetIds(); - - String json = jsonEncode(loadCategories); - String likeJson = jsonEncode(likeData); - await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); + // CategoryRepository rep = + // BlocProvider.of(context).repository; + // List loadCategories = await rep.loadCategoryData(); + // List likeData = await AppStorage().flutter().likeWidgetIds(); + // + // String json = jsonEncode(loadCategories); + // String likeJson = jsonEncode(likeData); + // await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); } Toast.toast(context, '数据同步份成功!'); } else { diff --git a/modules/basic_system/app_update/lib/bloc/bloc.dart b/modules/basic_system/app_update/lib/bloc/bloc.dart index a83fc373..e19fe683 100644 --- a/modules/basic_system/app_update/lib/bloc/bloc.dart +++ b/modules/basic_system/app_update/lib/bloc/bloc.dart @@ -6,7 +6,6 @@ import 'package:app_update/repository/api/upgrade_api.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:open_file/open_file.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:r_upgrade/r_upgrade.dart'; import 'package:fx_dio/fx_dio.dart'; @@ -28,15 +27,14 @@ class UpgradeBloc extends Bloc { void _onCheckUpdate(CheckUpdate event, Emitter emit) async { emit(const CheckLoadingState()); - ApiRet ret = await api.fetch(event.appId,event.locale); + ApiRet ret = await api.fetch(event.appId, event.locale); if (ret.failed) { emit(UpdateErrorState(error: ret.msg)); return; } AppInfo result = ret.data; - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - if (result.shouldUpgrade(packageInfo.version)) { - emit(ShouldUpdateState(oldVersion: packageInfo.version, info: result)); + if (result.shouldUpgrade(kAppVersion)) { + emit(ShouldUpdateState(oldVersion: kAppVersion, info: result)); } else { int time = DateTime.now().millisecondsSinceEpoch; emit(NoUpdateState(isChecked: true, checkTime: time)); @@ -48,7 +46,7 @@ class UpgradeBloc extends Bloc { if (curState is! ShouldUpdateState) return; String url = event.appInfo.url; - if(kAppEnv.isMacOS){ + if (kAppEnv.isMacOS) { launchUrl(Uri.parse(url)); return; } @@ -80,7 +78,6 @@ class UpgradeBloc extends Bloc { } } - late int? id; StreamSubscription? subscription; @@ -96,7 +93,8 @@ class UpgradeBloc extends Bloc { }); } - FutureOr _onProgressChangeEvent(ProgressChangeEvent event, Emitter emit) async{ + FutureOr _onProgressChangeEvent( + ProgressChangeEvent event, Emitter emit) async { UpdateState curState = state; if (curState is! ShouldUpdateState) return; emit(curState.copyWith(progress: event.progress)); diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 26573fc3..21876a66 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: url_launcher: ^6.3.0 # url package_info_plus: ^8.1.4 path_provider: ^2.1.5 - fx_dio: 0.0.4+2 + fx_dio: 0.0.4+3 utils: path: ../utils diff --git a/modules/basic_system/authentication/lib/blocs/user/bloc.dart b/modules/basic_system/authentication/lib/blocs/user/bloc.dart index eb82c52c..35f81586 100644 --- a/modules/basic_system/authentication/lib/blocs/user/bloc.dart +++ b/modules/basic_system/authentication/lib/blocs/user/bloc.dart @@ -3,8 +3,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'state.dart'; class UserBloc extends Cubit { - UserBloc():super(UserPerformance.fromJson({})); - - - -} \ No newline at end of file + UserBloc() : super(UserPerformance.fromJson({})); +} diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart index 580ad87b..51faed9f 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/dao/article_dao.dart @@ -3,19 +3,18 @@ import 'package:sqflite/sqflite.dart'; import '../model/article.dart'; -class ArticleDao with HasDatabase, DbTable{ +class ArticleDao extends Dao { @override String get createSql => ''; @override String get name => 'article'; - Future insert(Article po) => database.insert( - name, - po.toJson(), - conflictAlgorithm: ConflictAlgorithm.replace, - ); + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); Future insertOrUpdate(Article po) async { bool canUpdate = await shouldUpdate(po.id, po.update); @@ -23,7 +22,7 @@ class ArticleDao with HasDatabase, DbTable{ name, po.toJson(), conflictAlgorithm: - canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, ); } @@ -42,20 +41,20 @@ class ArticleDao with HasDatabase, DbTable{ Future> query(ArticleFilter filter) async { String queryArgs = ''; List args = []; - if(filter.filter !=null){ - queryArgs+="AND filter = ? "; + if (filter.filter != null) { + queryArgs += "AND filter = ? "; args.add(filter.filter); } - if(filter.groupId !=null){ - if(queryArgs.isEmpty){ - queryArgs +='WHERE groupId = ? '; - }else{ - queryArgs+="AND groupId = ? "; + if (filter.groupId != null) { + if (queryArgs.isEmpty) { + queryArgs += 'WHERE groupId = ? '; + } else { + queryArgs += "AND groupId = ? "; } args.add(filter.groupId); } queryArgs += 'LIMIT ? OFFSET ?'; - args.addAll([filter.pageSize,filter.offset]); + args.addAll([filter.pageSize, filter.offset]); List> data = await database.rawQuery( "SELECT * FROM $name $queryArgs", @@ -66,17 +65,25 @@ class ArticleDao with HasDatabase, DbTable{ return result; } - Future total(ArticleFilter filter) async{ + Future total(ArticleFilter filter) async { bool hasGroupId = filter.groupId != null; String familySql = hasGroupId ? 'WHERE groupId = ?' : ''; List familyArg = hasGroupId ? [filter.groupId!] : []; String sql = "SELECT count(id) as `count` FROM article $familySql"; - List> result = await database.rawQuery(sql,familyArg); - if(result.isNotEmpty){ - return result.first['count'] as int ??0; + List> result = await database.rawQuery(sql, familyArg); + if (result.isNotEmpty) { + return result.first['count'] as int ?? 0; } return 0; } + + @override + Convertor
    get convertor => Article.fromDb; + + @override + Future update(String id, Article frame) async { + return 0; + } } diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart b/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart index 90a16b61..131f4a3b 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/dao/columnize_dao.dart @@ -2,7 +2,7 @@ import 'package:fx_dao/fx_dao.dart'; import '../model/columnize.dart'; -class ColumnizeDao with HasDatabase, DbTable{ +class ColumnizeDao extends Dao { @override String get createSql => ''; @@ -10,10 +10,10 @@ class ColumnizeDao with HasDatabase, DbTable{ String get name => 'columnize'; Future insert(Columnize po) => database.insert( - name, - po.toJson(), - conflictAlgorithm: ConflictAlgorithm.replace, - ); + name, + po.toJson(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); Future insertOrUpdate(Columnize po) async { bool canUpdate = await shouldUpdate(po.id, po.update); @@ -21,7 +21,7 @@ class ColumnizeDao with HasDatabase, DbTable{ name, po.toJson(), conflictAlgorithm: - canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, + canUpdate ? ConflictAlgorithm.replace : ConflictAlgorithm.ignore, ); } @@ -44,8 +44,8 @@ class ColumnizeDao with HasDatabase, DbTable{ }) async { String queryArgs = ''; List args = []; - if(filter!=null){ - queryArgs+="AND filter = ? "; + if (filter != null) { + queryArgs += "AND filter = ? "; args.add(filter); } queryArgs += 'LIMIT ? OFFSET ?'; diff --git a/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart b/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart index 99b0b2be..b1ef595b 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/data/model/article.dart @@ -1,5 +1,6 @@ +import 'package:fx_dao/fx_dao.dart'; -class Article { +class Article implements Po{ final String? username; final String title; final String? subtitle; diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart index c53ba0ed..d3f1f4ff 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/article/columnize_page_view.dart @@ -1,4 +1,3 @@ - import 'dart:math'; import 'package:app/app.dart'; @@ -48,7 +47,7 @@ class _ColumnizePageViewState extends State { double value = ((_position - _firstOffset + 1) % 5) / 5; factor.value = value == 0 ? 1 : value; _ctrl = PageController( - viewportFraction: 0.9, + viewportFraction: kAppEnv.isDesktopUI ? 0.5 : 0.9, initialPage: _position, )..addListener(() { if (_ctrl.page != null) { @@ -79,24 +78,24 @@ class _ColumnizePageViewState extends State { @override Widget build(BuildContext context) { List data = context.watch().state.data; - Widget child = PageView.builder( - controller: _ctrl, // itemCount: 7, - itemBuilder: (_, index) { - return AnimatedBuilder( - child: _buildByIndex(context, index, data), - animation: _ctrl, - builder: (context, child) => _buildAnimItemByIndex( - context, - child, - index, - ), - ); - }, - onPageChanged: (index) { - _position = index; - }, + Widget child = PageView.builder( + controller: _ctrl, // itemCount: 7, + itemBuilder: (_, index) { + return AnimatedBuilder( + child: _buildByIndex(context, index, data), + animation: _ctrl, + builder: (context, child) => _buildAnimItemByIndex( + context, + child, + index, + ), + ); + }, + onPageChanged: (index) { + _position = index; + }, ); - if(!kIsDesk){ + if (!kIsDesk) { return child; } @@ -111,16 +110,24 @@ class _ColumnizePageViewState extends State { child: child), Positioned( right: 0, - child: IconButton(onPressed: (){ - _position+=1; - _ctrl.animateToPage(_position, duration: Duration(milliseconds: 500),curve: Curves.easeIn); - }, icon: Icon(Icons.navigate_next_outlined))), + child: IconButton( + onPressed: () { + _position += 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icon(Icons.navigate_next_outlined))), Positioned( left: 0, - child: IconButton(onPressed: (){ - _position-=1; - _ctrl.animateToPage(_position, duration: Duration(milliseconds: 500),curve: Curves.easeIn); - }, icon: Icon(Icons.navigate_before))), + child: IconButton( + onPressed: () { + _position -= 1; + _ctrl.animateToPage(_position, + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + icon: Icon(Icons.navigate_before))), ], ), ); @@ -189,7 +196,8 @@ class ColumnizeItem extends StatelessWidget { child: MultiBlocProvider(providers: [ BlocProvider( create: (_) => - ArticleBloc(repository, groupId: columnize.id,pageSize: 100)..init(), + ArticleBloc(repository, groupId: columnize.id, pageSize: 100) + ..init(), ), ], child: ColumnDetailPage(columnize: columnize)))); }, diff --git a/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart index 03370a32..288c21e3 100644 --- a/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart +++ b/modules/knowledge_system/artifact/lib/src/articles/view/desk_artifact_page.dart @@ -12,6 +12,7 @@ import 'article/sliver_article.dart'; import 'article/sliver_columnize.dart'; import 'building/building_panel.dart'; import 'package:l10n/l10n.dart'; + class DeskKnowledgePage extends StatefulWidget { const DeskKnowledgePage({super.key}); @@ -19,8 +20,8 @@ class DeskKnowledgePage extends StatefulWidget { State createState() => _DeskKnowledgePageState(); } -class _DeskKnowledgePageState extends State with SingleTickerProviderStateMixin,AutomaticKeepAliveClientMixin{ - +class _DeskKnowledgePageState extends State + with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { late TabController controller; List data = []; int _curIndex = 0; @@ -28,41 +29,48 @@ class _DeskKnowledgePageState extends State with SingleTicke @override void initState() { super.initState(); - controller = TabController(length: 4, vsync: this); + controller = TabController(length: 3, vsync: this); controller.addListener(_listen); data = List.generate(5, (index) => 'Init $index'); } + ArticleRepository aRepository = const ArticleRepository(); ColumnizeRepository cRepository = const ColumnizeRepository(); @override Widget build(BuildContext context) { super.build(context); + AppLocalizations l10n = context.l10n; return MultiBlocProvider( providers: [ - BlocProvider(create: (_) => ColumnizeBloc(cRepository)..init()), - BlocProvider(create: (_) => ArticleBloc(aRepository,pageSize: 1000)..init()), + BlocProvider( + create: (_) => ColumnizeBloc(cRepository)..init()), + BlocProvider( + create: (_) => ArticleBloc(aRepository, pageSize: 1000)..init()), ], child: Scaffold( endDrawer: SortSettings(), body: Column( children: [ - DeskKnowledgeTabTopBar(onTabPressed: (int value) { - controller.index = value; - }, tabs: [ - context.l10n.knowledgeTabLayout, - context.l10n.knowledgeTabAlgo, - context.l10n.knowledgeTabToly, - context.l10n.knowledgeTabPoint, - ],), - Expanded(child: TabBarView( + DeskKnowledgeTabTopBar( + onTabPressed: (int value) { + controller.index = value; + }, + tabs: [ + l10n.knowledgeTabLayout, + l10n.knowledgeTabAlgo, + l10n.knowledgeTabToly, + ], + ), + Expanded( + child: TabBarView( controller: controller, children: [ LayoutRouterPage(), AlgoRouterPage(), TolyArticlesPage(), - DeskPointPage(), + // DeskPointPage(), ], )) ], @@ -71,7 +79,6 @@ class _DeskKnowledgePageState extends State with SingleTicke ); } - void _listen() { print('${controller.index}'); if (_curIndex != controller.index) { @@ -91,17 +98,16 @@ class TolyArticlesPage extends StatelessWidget { @override Widget build(BuildContext context) { return CustomScrollView( - slivers: [ SliverPadding( - padding: EdgeInsets.only(top: 10,bottom: 10,right: 36,left: 36), + padding: EdgeInsets.only(top: 10, bottom: 10, right: 36, left: 36), sliver: const SliverToBoxAdapter( child: ColumnizeViewPage(), ), ), SliverPadding( - padding: EdgeInsets.only(right: 36,left:36), - sliver: SliverArticlePanel(), + padding: EdgeInsets.only(right: 36, left: 36), + sliver: SliverArticlePanel(), ), ], ); @@ -121,10 +127,10 @@ class SoreAlgoPage extends StatelessWidget { padding: const EdgeInsets.all(8.0), child: Row( children: [ - GestureDetector( onTap: () { - _launchURL('https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); + _launchURL( + 'https://github.com/toly1994328/FlutterUnit/blob/master/packages/algorithm/lib/src/algorithm/sort/functions/$%7Bname%7D.dart'); }, child: Text( '查看排序源码', @@ -135,9 +141,13 @@ class SoreAlgoPage extends StatelessWidget { )), Spacer(), SortButton(), - const SizedBox(width: 12,), + const SizedBox( + width: 12, + ), SortSelector(), - const SizedBox(width: 12,), + const SizedBox( + width: 12, + ), GestureDetector( onTap: () { Scaffold.of(context).openEndDrawer(); @@ -154,10 +164,9 @@ class SoreAlgoPage extends StatelessWidget { void _launchURL(String url) async { Uri uri = Uri.parse(url); if (await canLaunchUrl(Uri.parse(url))) { - await launchUrl(uri,mode: LaunchMode.externalApplication); + await launchUrl(uri, mode: LaunchMode.externalApplication); } else { debugPrint('Could not launch $url'); } } - } diff --git a/modules/knowledge_system/note/lib/note.dart b/modules/knowledge_system/note/lib/note.dart index 53d57f65..4e8b4746 100644 --- a/modules/knowledge_system/note/lib/note.dart +++ b/modules/knowledge_system/note/lib/note.dart @@ -1,5 +1,7 @@ export 'src/view/view.dart'; export 'src/bloc/bloc.dart'; +export 'src/bloc/news_bloc.dart'; export 'src/repository/repository.dart'; export 'src/env/env.dart'; -export 'package:flutter_quill/flutter_quill.dart' show FlutterQuillLocalizations; \ No newline at end of file +export 'package:flutter_quill/flutter_quill.dart' + show FlutterQuillLocalizations; diff --git a/modules/knowledge_system/note/lib/src/bloc/bloc.dart b/modules/knowledge_system/note/lib/src/bloc/bloc.dart index 8cf52330..cb588085 100644 --- a/modules/knowledge_system/note/lib/src/bloc/bloc.dart +++ b/modules/knowledge_system/note/lib/src/bloc/bloc.dart @@ -9,20 +9,20 @@ import '../repository/model/model.dart'; class ArtSysBloc extends Cubit { ArtSysBloc() : super(ArtSysState(articles: [])); - ArticleRepository _repository = HttpArticleRepository(); + final ArticleRepository _repository = HttpArticleRepository(); TextEditingController titleCtrl = TextEditingController(); TextEditingController ctrl = TextEditingController(); Future loadFirstFrame() async { - if(state.articles.isEmpty){ + if (state.articles.isEmpty) { emit(state.copyWith(status: const LoadingStatus())); } - ApiRet> ret = await _repository.list(SizeFilter()); + ApiRet> ret = await _repository.list(SizeFilter()); if (ret.success) { ArtSysState newState = state.copyWith( - articles: ret.data.list, - status: SuccessStatus(ret.data.total), + articles: ret.data, + status: SuccessStatus(ret.paginate?.total ?? 0), ); emit(newState); _openCurrent(); @@ -99,14 +99,12 @@ class ArtSysBloc extends Cubit { } } - Future delete() async{ + Future delete() async { int? id = state.active?.id; if (id != null) { ApiRet ret = await _repository.delete(id); await loadFirstFrame(); - } - } } @@ -136,10 +134,11 @@ class ArtSysState { final ArticlePo? active; final ListStatus status; - ArtSysState( - {required this.articles, - this.active, - this.status = const LoadingStatus()}); + ArtSysState({ + required this.articles, + this.active, + this.status = const LoadingStatus(), + }); ArtSysState copyWith({ List? articles, diff --git a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart new file mode 100644 index 00000000..fc943867 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart @@ -0,0 +1,55 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dao/src/table/dao.dart'; +import 'package:note/note.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:app/app.dart'; + +class NewsBloc extends Cubit + with Cacheable>, TimeoutCache> { + NewsBloc() : super(NewsState(headerNews: [])); + + final ArticleRepository _repository = HttpArticleRepository(); + + void initByCache() async { + List? retCache = await find(shouldRemove: false); + if (retCache != null) { + emit(NewsState(headerNews: retCache)); + return; + } + } + + @override + String get cacheKey => 'flutter.unit.news'; + + void load() async { + List? retCache = await find(); + if (retCache != null) { + print("=====load in cache========="); + emit(NewsState(headerNews: retCache)); + return; + } + refreshFromNet(); + } + + Future refreshFromNet() async { + ApiRet> ret = await _repository.getArticlesByTag(1); + print("=====load in net========="); + if (ret.success) { + save(ret.data); + emit(NewsState(headerNews: ret.data)); + } + } + + @override + ConvertorList> get convertor => (e) { + return e.map(ArticlePo.fromCache).toList(); + }; +} + +class NewsState { + final List headerNews; + + NewsState({ + required this.headerNews, + }); +} diff --git a/modules/knowledge_system/note/lib/src/repository/article_repository.dart b/modules/knowledge_system/note/lib/src/repository/article_repository.dart index a3ce4f4c..df436f7f 100644 --- a/modules/knowledge_system/note/lib/src/repository/article_repository.dart +++ b/modules/knowledge_system/note/lib/src/repository/article_repository.dart @@ -14,11 +14,19 @@ abstract class ArticleRepository { Future> write(int id, String content); - Future>> list(SizeFilter filter); + Future>> list(SizeFilter filter); + + /// 根据标签查询文章列表 + /// [tagId] 标签 id + /// [filter] 分页信息 + Future>> getArticlesByTag( + int tagId, { + SizeFilter? filter, + }); Future> delete(int id); - Future> update(int id,ArticleUpdatePayload payload); + Future> update(int id, ArticleUpdatePayload payload); Future> loadArticleTree(); } @@ -44,28 +52,24 @@ class HttpArticleRepository implements ArticleRepository { } @override - Future>> list(SizeFilter filter) { - return host.get>( + Future>> list(SizeFilter filter) { + return host.get>( '/article', queryParameters: { 'page': filter.page, 'page_size': filter.pageSize, }, - convertor: (rep) { - return ( - list: rep['data'].map(ArticlePo.fromApi).toList(), - total: rep['total'] ?? 0, - ); + convertor: (data) { + return data.map(ArticlePo.fromApi).toList(); }, ); } - @override Future> open(int id) { return host.get( '/article/open/$id', - convertor: (rep) => rep['data'], + convertor: (rep) => rep, ); } @@ -78,7 +82,7 @@ class HttpArticleRepository implements ArticleRepository { 'content': content, }, convertor: (rep) { - return rep['status'] == true; + return rep; }, ); } @@ -89,7 +93,7 @@ class HttpArticleRepository implements ArticleRepository { '/article/$id', data: payload.apiData, convertor: (rep) { - return ArticlePo.fromApi(rep['data']); + return ArticlePo.fromApi(rep); }, ); } @@ -103,4 +107,19 @@ class HttpArticleRepository implements ArticleRepository { }, ); } + + @override + Future>> getArticlesByTag(int tagId, + {SizeFilter? filter}) { + SizeFilter size = filter ?? const SizeFilter(); + return host.get>( + '/article/tag', + queryParameters: { + 'tag_id': tagId, + 'page': size.page, + 'page_size': size.pageSize, + }, + convertor: (data) => data.map(ArticlePo.fromApi).toList(), + ); + } } diff --git a/modules/knowledge_system/note/lib/src/repository/model/article.dart b/modules/knowledge_system/note/lib/src/repository/model/article.dart index 9da1c082..5b278bbb 100644 --- a/modules/knowledge_system/note/lib/src/repository/model/article.dart +++ b/modules/knowledge_system/note/lib/src/repository/model/article.dart @@ -1,11 +1,16 @@ +import 'package:fx_dao/fx_dao.dart'; import 'package:intl/intl.dart'; - DateFormat _noteTimeShort = DateFormat('yyyy/M/d'); DateFormat _noteTimeLong = DateFormat('yyyy/M/d HH:mm:ss'); Duration offset = DateTime.now().timeZoneOffset; -class ArticlePo { +enum ArticleType { + net, + custom, +} + +class ArticlePo implements Po { final String title; final String? subtitle; final String url; @@ -29,13 +34,12 @@ class ArticlePo { }); String get updateDate { - return _noteTimeLong.format(DateTime.fromMillisecondsSinceEpoch(update).add(offset)); + return _noteTimeLong + .format(DateTime.fromMillisecondsSinceEpoch(update).add(offset)); } - - String get createDate => - _noteTimeShort.format(DateTime.fromMillisecondsSinceEpoch(create).add(offset)); - + String get createDate => _noteTimeShort + .format(DateTime.fromMillisecondsSinceEpoch(create).add(offset)); factory ArticlePo.fromApi(dynamic map) => ArticlePo( id: map['article_id'] ?? 0, @@ -48,6 +52,32 @@ class ArticlePo { url: map['url'] ?? '', cover: map['cover'] ?? '', ); + + factory ArticlePo.fromCache(dynamic map) => ArticlePo( + id: map['article_id'] ?? 0, + title: map['title'] ?? '', + type: map['type'] ?? '', + status: map['status'] ?? '', + create: map['create_at'], + update: map['update'], + subtitle: map['subtitle'] ?? '', + url: map['url'] ?? '', + cover: map['cover'] ?? '', + ); + + @override + Map toJson() { + return { + 'article_id': id, + 'title': title, + 'type': type, + 'status': status, + 'create_at': create, + 'update': update, + 'url': url, + 'cover': cover, + }; + } } class ArticleCreatePayload { diff --git a/modules/knowledge_system/note/lib/src/repository/model/query.dart b/modules/knowledge_system/note/lib/src/repository/model/query.dart index 3bae3eb8..b2d7c236 100644 --- a/modules/knowledge_system/note/lib/src/repository/model/query.dart +++ b/modules/knowledge_system/note/lib/src/repository/model/query.dart @@ -2,7 +2,7 @@ class SizeFilter { final int pageSize; final int page; - SizeFilter({ + const SizeFilter({ this.pageSize = 20, this.page = 1, }); diff --git a/modules/knowledge_system/note/lib/src/repository/repository.dart b/modules/knowledge_system/note/lib/src/repository/repository.dart index e69de29b..7c731af3 100644 --- a/modules/knowledge_system/note/lib/src/repository/repository.dart +++ b/modules/knowledge_system/note/lib/src/repository/repository.dart @@ -0,0 +1,2 @@ +export 'article_repository.dart'; +export 'model/model.dart'; diff --git a/modules/knowledge_system/note/lib/src/view/article_admin.dart b/modules/knowledge_system/note/lib/src/view/article_admin.dart index cd689878..8038828f 100644 --- a/modules/knowledge_system/note/lib/src/view/article_admin.dart +++ b/modules/knowledge_system/note/lib/src/view/article_admin.dart @@ -7,6 +7,7 @@ import 'package:tolyui/tolyui.dart'; import 'package:app/app.dart'; import 'article_editor.dart'; import 'article_list.dart'; +import 'desktop/article_display.dart'; class ArticleAdmin extends StatefulWidget { const ArticleAdmin({super.key}); @@ -16,7 +17,6 @@ class ArticleAdmin extends StatefulWidget { } class _ArticleAdminState extends State { - @override Widget build(BuildContext context) { ArtSysBloc bloc = context.watch(); @@ -71,7 +71,7 @@ class _ArticleAdminState extends State { size: 20, color: Color(0xff242a39), ), - onTap: () async{ + onTap: () async { bloc.loadFirstFrame(); }, ), @@ -152,20 +152,7 @@ class _ArticleAdminState extends State { ), Divider(), // Expanded(child: RichEditor()), - Expanded( - child: TextField( - style: TextStyle(fontSize: 14), - onChanged: bloc.write, - maxLines: null, - minLines: null, - controller: bloc.ctrl, - expands: true, - decoration: InputDecoration( - border: InputBorder.none, - contentPadding: - EdgeInsets.symmetric(horizontal: 8, vertical: 8)), - ), - ), + Expanded(child: ArticleDisplay()), ], )) // Expanded( @@ -240,7 +227,6 @@ class _ArticleAdminState extends State { }, ); } - } class RichEditor extends StatefulWidget { @@ -252,6 +238,7 @@ class RichEditor extends StatefulWidget { class _RichEditorState extends State { QuillController _controller = QuillController.basic(); + @override Widget build(BuildContext context) { return Column( diff --git a/modules/knowledge_system/note/lib/src/view/article_list.dart b/modules/knowledge_system/note/lib/src/view/article_list.dart index 6229e4c2..55dffa5f 100644 --- a/modules/knowledge_system/note/lib/src/view/article_list.dart +++ b/modules/knowledge_system/note/lib/src/view/article_list.dart @@ -13,7 +13,8 @@ class ArticleList extends StatelessWidget { {super.key, required this.articles, required this.activeId, - required this.onTap, required this.onUpdateTitle}); + required this.onTap, + required this.onUpdateTitle}); @override Widget build(BuildContext context) { @@ -22,7 +23,8 @@ class ArticleList extends StatelessWidget { itemBuilder: (_, index) => ArticleItem( onTap: onTap, active: articles[index].id == activeId, - article: articles[index], onUpdateTitle: onUpdateTitle, + article: articles[index], + onUpdateTitle: onUpdateTitle, ), ); } @@ -113,12 +115,12 @@ class _ArticleItemState extends State { if (_hovered) TolyAction( child: Icon( - _editMode?Icons.check: Icons.edit, + _editMode ? Icons.check : Icons.edit, size: 16, color: Color(0xff4e5a70), ), onTap: () { - if(_editMode){ + if (_editMode) { _updateTitle(); setState(() { _editMode = false; @@ -147,10 +149,10 @@ class _ArticleItemState extends State { ); } - void _updateTitle(){ - String value = _ctrl?.text??''; - if(value.isEmpty) return; - widget.onUpdateTitle(widget.article,_ctrl?.text??''); + void _updateTitle() { + String value = _ctrl?.text ?? ''; + if (value.isEmpty) return; + widget.onUpdateTitle(widget.article, _ctrl?.text ?? ''); } bool _hovered = false; @@ -169,28 +171,3 @@ class _ArticleItemState extends State { }); } } - -// Container( -// alignment: Alignment.centerLeft, -// padding: EdgeInsets.symmetric(horizontal: 8), -// margin: EdgeInsets.symmetric(horizontal: 6), -// height: 32, -// width: 200, -// decoration: BoxDecoration( -// color: Color(0xffd7e2ff), -// borderRadius: BorderRadius.circular(4) -// ), -// child: Text('第一篇',style: TextStyle(fontWeight: FontWeight.bold,color: Color(0xff5b89fe)),), -// ), -// Container( -// alignment: Alignment.centerLeft, -// padding: EdgeInsets.symmetric(horizontal: 8), -// margin: EdgeInsets.symmetric(horizontal: 6), -// height: 32, -// width: 200, -// decoration: BoxDecoration( -// // color: Color(0xffd7e2ff), -// borderRadius: BorderRadius.circular(4) -// ), -// child: Text('第二篇',style: TextStyle(color: Colors.black),), -// ), diff --git a/modules/knowledge_system/note/lib/src/view/components/button/button.dart b/modules/knowledge_system/note/lib/src/view/components/button/button.dart index a861394b..e9f6103e 100644 --- a/modules/knowledge_system/note/lib/src/view/components/button/button.dart +++ b/modules/knowledge_system/note/lib/src/view/components/button/button.dart @@ -1,18 +1,16 @@ - - - import 'package:flutter/material.dart'; import 'package:tolyui/tolyui.dart'; class Button extends StatelessWidget { final VoidCallback onPressed; + const Button({super.key, required this.onPressed}); @override Widget build(BuildContext context) { return ElevatedButton( onPressed: onPressed, - child: Wrap( + child: const Wrap( spacing: 6, crossAxisAlignment: WrapCrossAlignment.center, children: [ @@ -28,7 +26,7 @@ class Button extends StatelessWidget { ], ), style: FillButtonPalette( - foregroundPalette: Palette.all(Colors.white), + foregroundPalette: const Palette.all(Colors.white), borderRadius: BorderRadius.circular(6), backgroundPalette: const Palette( normal: Color(0xff1890ff), diff --git a/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart b/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart new file mode 100644 index 00000000..1d653e41 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/desktop/article_display.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; +import 'package:tolyui/tolyui.dart'; +import '../../repository/model/article.dart'; + +class ArticleDisplay extends StatelessWidget { + const ArticleDisplay({super.key}); + + @override + Widget build(BuildContext context) { + ArticlePo? selected = + context.select((ArtSysBloc bloc) => bloc.state.active); + if (selected == null) { + return SizedBox(); + } + if (selected.type == ArticleType.net.index) { + return NetworkArticleDisplay( + article: selected, + ); + } + return TextField( + style: TextStyle(fontSize: 14), + onChanged: (text) => context.read().write(text), + maxLines: null, + minLines: null, + controller: context.read().ctrl, + expands: true, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 8, + )), + ); + return const Placeholder(); + } +} + +class NetworkArticleDisplay extends StatelessWidget { + final ArticlePo article; + + const NetworkArticleDisplay({super.key, required this.article}); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + width: 300, + decoration: BoxDecoration( + border: Border.all(), borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 12, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + article.title, + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + if (article.subtitle != null) + Text( + article.subtitle!, + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + Image.network(article.cover ?? ''), + ElevatedButton( + onPressed: () {}, + child: Text('前往查看'), + style: FillButtonPalette( + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 24), + foregroundPalette: Palette.all(Colors.white), + borderRadius: BorderRadius.circular(6), + backgroundPalette: const Palette( + normal: Color(0xff1890ff), + hover: Color(0xff40a9ff), + pressed: Color(0xff096dd9), + ), + ).style, + ), + ], + ), + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart index 77219020..817d43ed 100644 --- a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart @@ -9,8 +9,6 @@ import 'mobile_article_list.dart'; import 'mobile_editor.dart'; import 'note.dart'; - - class MobileArticlePage extends StatefulWidget { const MobileArticlePage({super.key}); @@ -40,10 +38,10 @@ class _MobileArticlePageState extends State { setState(() { status = const TaskLoading(); }); - ApiRet> ret = await _repository.list(SizeFilter()); + ApiRet> ret = await _repository.list(SizeFilter()); if (ret.success) { - articles = ret.data.list; - total = ret.data.total; + articles = ret.data; + total = ret.paginate?.total ?? 0; setState(() { status = TaskSuccess(); }); @@ -55,7 +53,7 @@ class _MobileArticlePageState extends State { @override Widget build(BuildContext context) { -return PinnedHeaderSliverNode2(); + return PinnedHeaderSliverNode2(); Widget body = switch (status) { TaskNone() => SizedBox(), TaskLoading() => const CupertinoActivityIndicator(), @@ -64,8 +62,10 @@ return PinnedHeaderSliverNode2(); activeId: active?.id ?? -1, onTap: (ArticlePo article) { if (article.type == 1) { - Navigator.of(context).push(MaterialPageRoute(builder: (ctx){ - return MobileEditor(article: article,); + Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return MobileEditor( + article: article, + ); })); // _loadArticleContent(article.id); } else {} @@ -88,7 +88,6 @@ return PinnedHeaderSliverNode2(); shape: StadiumBorder(), mini: true, elevation: 4, - backgroundColor: Theme.of(context).primaryColor, foregroundColor: Colors.white, onPressed: () {}, diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml index e8eb0234..f007537b 100644 --- a/modules/knowledge_system/note/pubspec.yaml +++ b/modules/knowledge_system/note/pubspec.yaml @@ -12,7 +12,8 @@ resolution: workspace dependencies: flutter: sdk: flutter - fx_dio: 0.0.4+2 + fx_dio: 0.0.4+3 + fx_dao: 0.0.3+3 flutter_bloc: ^8.1.6 # 状态管理 two_dimensional_scrollables: ^0.3.3 flutter_quill: ^11.0.0-dev.21 diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart index 9400f5df..f142b23d 100644 --- a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -1,12 +1,13 @@ import 'dart:math'; import 'package:flutter/material.dart'; - +import 'package:fx_env/fx_env.dart'; import 'package:flutter_svg/flutter_svg.dart'; class WidgetLogo extends StatelessWidget { final Color background; final String widgetName; + const WidgetLogo({ super.key, required this.background, @@ -32,7 +33,7 @@ class WidgetLogo extends StatelessWidget { ), child: SvgPicture.asset( 'assets/images/widgets/${widgetLogo(widgetName)}', - width: 90, + width: kApp.isDesktopUI ? 90 : 80, ), ); } diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index 63b99619..db9dc2ac 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -14,7 +14,8 @@ import 'desk_widget_top_bar.dart'; import 'widget_tiled.dart'; class DeskWidgetPanel extends StatefulWidget { - const DeskWidgetPanel({super.key}); + final Widget? header; + const DeskWidgetPanel({super.key, this.header}); @override State createState() => _DeskWidgetPanelState(); @@ -33,7 +34,10 @@ class _DeskWidgetPanelState extends State { Expanded( child: switch (state) { WidgetsLoading() => const CupertinoActivityIndicator(), - WidgetsLoaded() => WidgetList(state: state), + WidgetsLoaded() => WidgetList( + state: state, + header: widget.header, + ), WidgetsLoadFailed() => Center(child: Text("${state.runtimeType}")), }, @@ -50,9 +54,11 @@ class _DeskWidgetPanelState extends State { } class WidgetList extends StatelessWidget { + final Widget? header; + final WidgetsLoaded state; - const WidgetList({super.key, required this.state}); + const WidgetList({super.key, required this.state, this.header}); @override Widget build(BuildContext context) { @@ -64,6 +70,29 @@ class WidgetList extends StatelessWidget { crossAxisSpacing: 10, ); + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(8)), + height: 180, + child: header, + ), + ), + SliverPadding( + padding: const EdgeInsets.only(left: 14, right: 14, bottom: 8), + sliver: SliverGrid.builder( + gridDelegate: gridDelegate, + itemBuilder: _buildItem, + itemCount: state.widgets.length, + ), + ) + ], + ); + return GridView.builder( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), gridDelegate: gridDelegate, diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart index 2ee9a309..631d5a12 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_tiled.dart @@ -1,10 +1,8 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:widget_module/blocs/action/widget_action.dart'; -import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:wrapper/wrapper.dart'; import 'package:tolyui/tolyui.dart'; diff --git a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart index caab512d..06242ece 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/category_page/sync/upload_button.dart @@ -12,9 +12,6 @@ import 'package:widget_module/blocs/blocs.dart'; import 'package:toly_ui/toly_ui.dart'; import 'package:widget_repository/widget_repository.dart'; - - - /// create by 张风捷特烈 on 2021/2/24 /// contact me by email 1981462002@qq.com /// 说明: @@ -72,18 +69,18 @@ class _UploadCategoryButtonState extends State { onPressed: _doUploadCategoryData); } - void _doUploadCategoryData() async{ + void _doUploadCategoryData() async { setState(() => state = AsyncType.loading); CategoryRepository rep = BlocProvider.of(context).repository; List loadCategories = await rep.loadCategoryData(); - List likeData = await AppStorage().flutter()!.likeWidgetIds(); - + List likeData = await AppStorage().flutter().likeWidgetIds(); String json = jsonEncode(loadCategories); String likeJson = jsonEncode(likeData); - TaskResult result = await CategoryApi.uploadCategoryData(data: json,likeData: likeJson); + TaskResult result = + await CategoryApi.uploadCategoryData(data: json, likeData: likeJson); if (result.success) { setState(() => state = AsyncType.success); diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart new file mode 100644 index 00000000..e791a024 --- /dev/null +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/slider.dart @@ -0,0 +1,212 @@ +// import 'package:flutter/gestures.dart'; +// import 'package:flutter/material.dart'; +// import 'package:app/app.dart'; +// +// import 'widget_page.dart'; +// +// class Carousel extends StatefulWidget { +// final List data; +// +// const Carousel({Key? key, required this.data}) : super(key: key); +// +// @override +// _CarouselState createState() => _CarouselState(); +// } +// +// class _CarouselState extends State { +// final ValueNotifier factor = ValueNotifier(0); +// +// late PageController _ctrl; +// +// final int _firstOffset = 1000; //初始偏移 +// int _position = 0; //页面位置 +// +// @override +// void initState() { +// super.initState(); +// _position = _position + _firstOffset; +// +// double value = ((_position - _firstOffset + 1) % 5) / 5; +// factor.value = value == 0 ? 1 : value; +// _ctrl = PageController( +// viewportFraction: 0.9, +// initialPage: _position, +// )..addListener(() { +// if (_ctrl.page != null) { +// double value = (_ctrl.page! - _firstOffset + 1) % 5 / 5; +// factor.value = value == 0 ? 1 : value; +// } +// }); +// } +// +// @override +// void dispose() { +// _ctrl.dispose(); +// factor.dispose(); +// super.dispose(); +// } +// +// Color get color => Colors.blue; +// +// Color get nextColor => Colors.orangeAccent; +// +// bool get isDark => Theme.of(context).brightness == Brightness.dark; +// +// BoxDecoration get boxDecoration => BoxDecoration( +// color: isDark ? Colors.white.withAlpha(33) : Colors.white, +// borderRadius: const BorderRadius.only( +// topLeft: Radius.circular(40), topRight: Radius.circular(40)), +// ); +// +// @override +// Widget build(BuildContext context) { +// List data = widget.data; +// Widget child = PageView.builder( +// controller: _ctrl, // itemCount: 7, +// itemBuilder: (_, index) { +// return AnimatedBuilder( +// child: _buildByIndex(context, index, data), +// animation: _ctrl, +// builder: (context, child) => _buildAnimItemByIndex( +// context, +// child, +// index, +// ), +// ); +// }, +// onPageChanged: (index) { +// _position = index; +// setState(() {}); +// }, +// ); +// +// int realIndex = _fixPosition(_position, _firstOffset, data.length); +// +// child = Stack( +// alignment: Alignment.bottomCenter, +// children: [ +// child, +// Padding( +// padding: const EdgeInsets.only(bottom: 16.0), +// child: Wrap( +// spacing: 6, +// children: widget.data.asMap().keys.map((int index) { +// return GestureDetector( +// onTap: () { +// int deta = index - realIndex; +// _position += deta; +// print('$_position,$realIndex'); +// // _position = index; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// child: Container( +// width: 8, +// height: 8, +// decoration: BoxDecoration( +// color: realIndex == index +// ? Colors.white +// : Colors.black.withValues(alpha: 0.4), +// shape: BoxShape.circle, +// boxShadow: [ +// BoxShadow( +// color: Colors.white.withValues(alpha: 0.3), +// spreadRadius: 1, +// blurRadius: 10, +// blurStyle: BlurStyle.outer) +// ]), +// ), +// ); +// }).toList(), +// ), +// ) +// ], +// ); +// +// if (!kIsDesk) { +// return child; +// } +// +// return MouseRegion( +// onEnter: _onEnter, +// onExit: _onExit, +// child: Stack( +// alignment: Alignment.center, +// children: [ +// Padding( +// padding: const EdgeInsets.symmetric(horizontal: 48.0), +// child: child), +// Positioned( +// right: 0, +// child: IconButton( +// onPressed: () { +// _position += 1; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// icon: Icon(Icons.navigate_next_outlined))), +// Positioned( +// left: 0, +// child: IconButton( +// onPressed: () { +// _position -= 1; +// _ctrl.animateToPage(_position, +// duration: Duration(milliseconds: 500), +// curve: Curves.easeIn); +// }, +// icon: Icon(Icons.navigate_before))), +// ], +// ), +// ); +// } +// +// Widget? _buildByIndex( +// BuildContext context, int index, List data) { +// int realIndex = _fixPosition(index, _firstOffset, data.length); +// return WidgetDisplay( +// widget: data[realIndex], +// ); +// } +// +// Widget _buildAnimItemByIndex(BuildContext context, Widget? child, int index) { +// double value; +// if (_ctrl.position.haveDimensions && _ctrl.page != null) { +// value = _ctrl.page! - index; +// } else { +// value = (_position - index).toDouble(); +// } +// value = (1 - ((value.abs()) * .3)).clamp(0, 1).toDouble(); +// value = Curves.easeOut.transform(value); +// +// return Transform( +// transform: Matrix4.diagonal3Values(1.0, value, 1.0), +// alignment: Alignment.center, +// child: Padding( +// padding: const EdgeInsets.all(4.0), +// child: child, +// ), +// ); +// } +// +// int _fixPosition(int realPos, int initPos, int length) { +// final int offset = realPos - initPos; +// int result = offset % length; +// return result < 0 ? length + result : result; +// } +// +// bool _hover = false; +// +// void _onEnter(PointerEnterEvent event) { +// setState(() { +// _hover = true; +// }); +// } +// +// void _onExit(PointerExitEvent event) { +// setState(() { +// _hover = false; +// }); +// } +// } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart index 53b021db..06e3c647 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_page.dart @@ -12,7 +12,8 @@ import 'standard_home_search.dart'; import 'widget_page.dart'; class StandardHomePage extends StatefulWidget { - const StandardHomePage({Key? key}) : super(key: key); + final Widget? heard; + const StandardHomePage({super.key, this.heard}); @override State createState() => _StandardHomePageState(); @@ -62,7 +63,6 @@ class _StandardHomePageState extends State double bottom = MediaQuery.of(context).padding.bottom; return Scaffold( extendBody: true, - // backgroundColor: const Color(0xffF3F4F6), drawer: const HomeDrawer(), body: Column( children: [ @@ -80,9 +80,7 @@ class _StandardHomePageState extends State headerSliverBuilder: _buildHeader, body: const WidgetPage()), ), - SizedBox( - height: bottom, - ) + SizedBox(height: bottom) ], ), ); @@ -98,8 +96,14 @@ class _StandardHomePageState extends State snapMode: FloatingHeaderSnapMode.scroll, child: StandardHomeSearch(), ), - // SliverOverlapAbsorber( - // sliver: + if (widget.heard != null) + SliverToBoxAdapter( + child: Container( + height: 168, + color: Colors.white, + child: widget.heard, + ), + ), SliverPinnedHeader( color: isDark ? Colors.black : Colors.white, child: TabBar( diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart index 8b7e321c..cec88581 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/standard_home_search.dart @@ -81,7 +81,10 @@ class StandardHomeSearch extends StatelessWidget Widget _buildCollectIcon(BuildContext context) { return IconButton( onPressed: () => context.push(AppRoute.collection.url), - icon: const Icon(TolyIcon.icon_collect), + icon: const Icon( + TolyIcon.icon_collect, + size: 22, + ), ); } diff --git a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart index 1af2ca97..51326cf8 100644 --- a/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart +++ b/modules/widget_system/widget_module/lib/views/mobile/widget_page/widget_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:widget_module/blocs/blocs.dart'; - +import 'package:note/note.dart'; import 'widget_list_panel.dart'; class WidgetPage extends StatefulWidget { @@ -48,6 +48,7 @@ class _WidgetPageState extends State { void _onRefresh() async { context.read().add(EventRefresh()); + await context.read().refreshFromNet(); } void _onLoadMore() { diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart index 5347b35b..43990a56 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/category_dao.dart @@ -15,7 +15,7 @@ import '../../../widget_repository.dart'; // ); //"""; -class CategoryDao with HasDatabase, DbTable { +class CategoryDao extends Dao { @override String get createSql => ''; diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart index 02b48903..f533415d 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/like_dao.dart @@ -1,6 +1,6 @@ import 'package:fx_dao/fx_dao.dart'; -class LikeDao with HasDatabase, DbTable { +class LikeDao extends Dao { @override String get createSql => ''; diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart index b4bf1334..2e6c04b8 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/node_dao.dart @@ -2,7 +2,7 @@ import 'package:fx_dao/fx_dao.dart'; import '../po/node_po.dart'; -class NodeDao with HasDatabase, DbTable { +class NodeDao extends Dao { @override String get createSql => ''; diff --git a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart index f25c2648..debeeefe 100644 --- a/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart +++ b/modules/widget_system/widget_repository/lib/src/database/dao/widget_dao.dart @@ -1,16 +1,15 @@ import 'package:fx_dao/fx_dao.dart'; import '../../model/widget_filter.dart'; -import '../po/widget_po.dart'; -class WidgetDao with HasDatabase, DbTable { +class WidgetDao extends Dao { @override String get createSql => ''; @override String get name => 'widget'; - - Future>> queryByIds(List ids, String? locale) async { + Future>> queryByIds( + List ids, String? locale) async { if (ids.isEmpty) { return []; } @@ -33,7 +32,7 @@ ORDER BY lever DESC, widget.id ASC; """; - return database.rawQuery(searchSql, [(locale?? 'zh-cn'), ...ids]); + return database.rawQuery(searchSql, [(locale ?? 'zh-cn'), ...ids]); } Future>> search(WidgetFilter arguments) async { @@ -74,17 +73,16 @@ LIMIT ? OFFSET ? ; """; - return database.rawQuery(searchSql, - [ - arguments.locale?? 'zh-cn', - "%$name%", - "%$name%", - "%$name%", - ...familyArg, - ...starArg, - arguments.pageSize, - arguments.offset - ]); + return database.rawQuery(searchSql, [ + arguments.locale ?? 'zh-cn', + "%$name%", + "%$name%", + "%$name%", + ...familyArg, + ...starArg, + arguments.pageSize, + arguments.offset + ]); } Future total(WidgetFilter args) async { @@ -101,7 +99,8 @@ LIMIT ? OFFSET ? return 0; } - Future?> queryWidgetByName(String name, {String? locale}) async { + Future?> queryWidgetByName(String name, + {String? locale}) async { String querySql = """ SELECT widget.id, @@ -119,7 +118,8 @@ widget.name = ? AND widget_desc.locale = ? ; """; - List> result = await database.rawQuery(querySql, [name,locale??'zh-cn']); + List> result = + await database.rawQuery(querySql, [name, locale ?? 'zh-cn']); if (result.isNotEmpty) { return result.first; } diff --git a/modules/widget_system/widget_repository/pubspec.yaml b/modules/widget_system/widget_repository/pubspec.yaml index a4c89b3a..2f417ff7 100644 --- a/modules/widget_system/widget_repository/pubspec.yaml +++ b/modules/widget_system/widget_repository/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter equatable: ^2.0.5 # 相等辅助 intl: ^0.19.0 # 相等辅助 - fx_dao: 0.0.1+2 # 数据库 + fx_dao: 0.0.3+3 # 数据库 storage: path: ../../basic_system/storage utils: diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart index 7b8979b8..ed7ae3c9 100644 --- a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/node1_base.dart @@ -12,15 +12,30 @@ class WidgetInspectorDemo extends StatelessWidget { height: 200, child: WidgetInspector( child: const HomePage(), + tapBehaviorButtonBuilder: _tapBehaviorButtonBuilder, exitWidgetSelectionButtonBuilder: null, moveExitWidgetSelectionButtonBuilder: _selectButtonBuilder, ), ); } + // Widget _selectButtonBuilder(BuildContext context, + // {required VoidCallback onPressed, bool? isLeftAligned}) { + // onPressed(); + // return Container(); + // } + + Widget _tapBehaviorButtonBuilder(BuildContext context, + {required VoidCallback onPressed, + required bool selectionOnTapEnabled, + required String semanticLabel}) { + return Container(); + } + Widget _selectButtonBuilder(BuildContext context, - {required VoidCallback onPressed, bool? isLeftAligned}) { - onPressed(); + {bool? isLeftAligned, + required VoidCallback onPressed, + required String semanticLabel}) { return Container(); } } diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart index 33f86421..d2599ca4 100644 --- a/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/node2_use.dart @@ -10,7 +10,7 @@ class CustomTheme extends StatelessWidget { Widget build(BuildContext context) { return Theme( data: ThemeData( - cardTheme: const CardTheme( + cardTheme: const CardThemeData( color: Colors.red, elevation: 4, ), @@ -40,4 +40,4 @@ class CustomTheme extends StatelessWidget { const SizedBox(width: 150, child: Divider()) ])); } -} \ No newline at end of file +} diff --git a/pubspec.lock b/pubspec.lock index 0fffcd6f..3dd6391f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: "direct main" description: name: archive - sha256: a7f37ff061d7abc2fcf213554b9dcaca713c5853afa5c065c44888bc9ccaf813 + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.dev/" source: hosted - version: "4.0.6" + version: "4.0.7" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev/" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev/" source: hosted - version: "2.12.0" + version: "2.13.0" bloc: dependency: transitive description: @@ -73,22 +73,6 @@ packages: url: "https://pub.dev/" source: hosted version: "1.19.1" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27" - url: "https://pub.dev/" - source: hosted - version: "6.1.3" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.dev/" - source: hosted - version: "2.0.1" convert: dependency: transitive description: @@ -145,22 +129,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.0.2" - dbus: - dependency: transitive - description: - name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev/" - source: hosted - version: "0.7.11" dev_build: dependency: transitive description: name: dev_build - sha256: "933f14357d4e58da298ce2395e8271728dd90e8760e1c7677ca1d5fa065f2b4a" + sha256: "6cb4c65446aedd671ffdaacbede599b6fb9c462b17d006f11f7b82fe90706bff" url: "https://pub.dev/" source: hosted - version: "1.1.1+7" + version: "1.1.1+8" diff_match_patch: dependency: transitive description: @@ -173,18 +149,18 @@ packages: dependency: "direct main" description: name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" url: "https://pub.dev/" source: hosted - version: "5.7.0" + version: "5.8.0+1" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" url: "https://pub.dev/" source: hosted - version: "2.0.0" + version: "2.1.1" equatable: dependency: "direct main" description: @@ -197,10 +173,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev/" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -221,10 +197,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "8986dec4581b4bcd4b6df5d75a2ea0bede3db802f500635d05fa8be298f9467f" + sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" url: "https://pub.dev/" source: hosted - version: "10.1.2" + version: "10.1.9" file_selector_linux: dependency: transitive description: @@ -245,10 +221,10 @@ packages: dependency: transitive description: name: file_selector_windows - sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" url: "https://pub.dev/" source: hosted - version: "0.9.3+3" + version: "0.9.3+4" fixnum: dependency: transitive description: @@ -306,10 +282,10 @@ packages: dependency: transitive description: name: flutter_keyboard_visibility_temp_fork - sha256: cecc44a350a8a369efbc960bb2126386af53cb0597ca6789607cbfb88081b9f4 + sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 url: "https://pub.dev/" source: hosted - version: "0.1.4" + version: "0.1.5" flutter_keyboard_visibility_windows: dependency: transitive description: @@ -335,34 +311,34 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 + sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" url: "https://pub.dev/" source: hosted - version: "0.7.5" + version: "0.7.7+1" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e url: "https://pub.dev/" source: hosted - version: "2.0.24" + version: "2.0.28" flutter_quill: dependency: transitive description: name: flutter_quill - sha256: "0acca7cf646eb2feba5333338d046514c17159741ab5744c7c4290778656fa4a" + sha256: "7e60963632bbc8615627f0bae8e178515f69ecb378ad49fa68c43c2aabf33e21" url: "https://pub.dev/" source: hosted - version: "11.0.0-dev.21" + version: "11.4.1" flutter_quill_delta_from_html: dependency: transitive description: name: flutter_quill_delta_from_html - sha256: "79405765612016de9de2361be86383360b0b43a6bf88b818c079a953583f1849" + sha256: "4597bd0853a704696837aa6b05cffd851f587b176204c234edddfed1c1862a09" url: "https://pub.dev/" source: hosted - version: "1.5.0" + version: "1.5.2" flutter_spinkit: dependency: "direct main" description: @@ -383,10 +359,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 url: "https://pub.dev/" source: hosted - version: "2.0.17" + version: "2.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -409,18 +385,18 @@ packages: dependency: "direct main" description: name: fx_dao - sha256: e43f70181f65ef56cacdbe6effc085aa31f9afafd7083c68b75a67e5a9df188b + sha256: "2564d9d954f6be1534c67e7036d0c8ce3833c0943e92b19c499edf1b9033623c" url: "https://pub.dev/" source: hosted - version: "0.0.1+2" + version: "0.0.3+3" fx_dio: dependency: "direct main" description: name: fx_dio - sha256: "1d4818360a9251d6d0664d017f6d51f363db259ea5debdd0294a9af46f1cea9d" + sha256: "395549518d055596d58ffcff59b4da0c147d855f6258f2769213c7230c090525" url: "https://pub.dev/" source: hosted - version: "0.0.4+2" + version: "0.0.4+3" fx_env: dependency: transitive description: @@ -473,42 +449,42 @@ packages: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev/" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev/" source: hosted - version: "1.3.0" + version: "1.4.0" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev/" source: hosted - version: "4.0.2" + version: "4.1.2" image: dependency: "direct main" description: name: image - sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev/" source: hosted - version: "4.5.2" + version: "4.5.4" intl: - dependency: transitive + dependency: "direct overridden" description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev/" source: hosted - version: "0.19.0" + version: "0.20.2" json_annotation: dependency: transitive description: @@ -529,10 +505,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev/" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -613,14 +589,6 @@ packages: url: "https://pub.dev/" source: hosted version: "1.0.0" - nm: - dependency: transitive - description: - name: nm - sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev/" - source: hosted - version: "0.5.0" open_file: dependency: transitive description: @@ -686,7 +654,7 @@ packages: source: hosted version: "0.0.3" package_info_plus: - dependency: transitive + dependency: "direct main" description: name: package_info_plus sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 @@ -697,10 +665,10 @@ packages: dependency: transitive description: name: package_info_plus_platform_interface - sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" url: "https://pub.dev/" source: hosted - version: "3.0.2" + version: "3.2.0" path: dependency: transitive description: @@ -729,10 +697,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev/" source: hosted - version: "2.2.15" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -801,10 +769,10 @@ packages: dependency: transitive description: name: posix - sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 url: "https://pub.dev/" source: hosted - version: "6.0.1" + version: "6.0.2" process_run: dependency: transitive description: @@ -817,26 +785,26 @@ packages: dependency: transitive description: name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" url: "https://pub.dev/" source: hosted - version: "6.1.2" + version: "6.1.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev/" source: hosted - version: "2.1.5" + version: "2.2.0" quill_native_bridge: dependency: transitive description: name: quill_native_bridge - sha256: bda0f0ad9bc160dcdd4bd2b378a7ae8bdb55c3d4b7301bf739d5e3b065ee5e82 + sha256: "00752aca7d67cbd3254709a47558be78427750cb81aa42cfbed354d4a079bcfa" url: "https://pub.dev/" source: hosted - version: "11.0.0" + version: "11.0.1" quill_native_bridge_android: dependency: transitive description: @@ -873,18 +841,18 @@ packages: dependency: transitive description: name: quill_native_bridge_platform_interface - sha256: ea48bd12bf426741747ec8a575b122350971f338a75049099b349c63447582a2 + sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" url: "https://pub.dev/" source: hosted - version: "0.0.1+1" + version: "0.0.2+1" quill_native_bridge_web: dependency: transitive description: name: quill_native_bridge_web - sha256: e7e55047d68f1a88574c26dbe3f12988f49d07740590d8fc6280028bbde5b908 + sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" url: "https://pub.dev/" source: hosted - version: "0.0.1" + version: "0.0.2" quill_native_bridge_windows: dependency: transitive description: @@ -984,10 +952,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "138b7bbbc7f59c56236e426c37afb8f78cbc57b094ac64c440e0bb90e380a4f5" + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" url: "https://pub.dev/" source: hosted - version: "2.4.2" + version: "2.4.10" shared_preferences_foundation: dependency: transitive description: @@ -1016,10 +984,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 url: "https://pub.dev/" source: hosted - version: "2.4.2" + version: "2.4.3" shared_preferences_windows: dependency: transitive description: @@ -1109,10 +1077,10 @@ packages: dependency: transitive description: name: sqlite3 - sha256: "35d3726fe18ab1463403a5cc8d97dbc81f2a0b08082e8173851363fcc97b6627" + sha256: "310af39c40dd0bb2058538333c9d9840a2725ae0b9f77e4fd09ad6696aa8f66e" url: "https://pub.dev/" source: hosted - version: "2.7.2" + version: "2.7.5" stack_trace: dependency: transitive description: @@ -1197,10 +1165,10 @@ packages: dependency: transitive description: name: tolyui_feedback - sha256: "4549ea17aa453b931b0859c6f840228222a0637186b3e9bfcb63218b879c7132" + sha256: "3f78955e9160287a2c841c67a7c878e9ca5f990a4d26d26e02c51fbfc2ec42a1" url: "https://pub.dev/" source: hosted - version: "0.3.6+3" + version: "0.3.6+4" tolyui_message: dependency: transitive description: @@ -1237,10 +1205,10 @@ packages: dependency: transitive description: name: two_dimensional_scrollables - sha256: b6028c80e782e58a5d18f9491737aae4f70d72dc08050ac92006905c7c0b5e21 + sha256: "1b0b29095d86df509d115ac668f85c3fcb0bd1554ccf89c289ca4769bead49db" url: "https://pub.dev/" source: hosted - version: "0.3.3" + version: "0.3.4" typed_data: dependency: transitive description: @@ -1261,18 +1229,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" url: "https://pub.dev/" source: hosted - version: "6.3.14" + version: "6.3.16" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.dev/" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_linux: dependency: transitive description: @@ -1301,10 +1269,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.dev/" source: hosted - version: "2.3.3" + version: "2.4.1" url_launcher_windows: dependency: transitive description: @@ -1314,7 +1282,7 @@ packages: source: hosted version: "3.1.4" uuid: - dependency: transitive + dependency: "direct main" description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff @@ -1325,10 +1293,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" url: "https://pub.dev/" source: hosted - version: "1.1.15" + version: "1.1.18" vector_graphics_codec: dependency: transitive description: @@ -1357,50 +1325,50 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev/" source: hosted - version: "14.3.1" + version: "15.0.0" web: - dependency: transitive + dependency: "direct overridden" description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev/" source: hosted - version: "1.1.0" + version: "1.1.1" webview_flutter: dependency: "direct main" description: name: webview_flutter - sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + sha256: "62d763c27ce7f6cef04b3bec01c85a28d60149bffd155884aa4b8fd4941ea2e4" url: "https://pub.dev/" source: hosted - version: "4.10.0" + version: "4.12.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59" + sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 url: "https://pub.dev/" source: hosted - version: "4.3.1" + version: "4.7.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" url: "https://pub.dev/" source: hosted - version: "2.10.0" + version: "2.13.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" + sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 url: "https://pub.dev/" source: hosted - version: "3.17.0" + version: "3.22.0" widget_repository: dependency: transitive description: @@ -1412,10 +1380,10 @@ packages: dependency: transitive description: name: win32 - sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e url: "https://pub.dev/" source: hosted - version: "5.10.0" + version: "5.10.1" window_manager: dependency: transitive description: @@ -1458,4 +1426,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.24.0" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index cb0b4137..d07fdc90 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.1.0 +version: 3.2.0 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts @@ -44,8 +44,8 @@ dependencies: ## fx 架构 fx_platform_adapter: 0.0.3 # 平台适配器 fx_go_router_ext: 0.0.6+1 # 路由 - fx_dao: 0.0.1+2 # 数据库 - fx_dio: 0.0.4+2 + fx_dao: 0.0.3+3 + fx_dio: 0.0.4+3 fx_boot_starter: 0.1.1 # app 启动器 fx_trace: 0.0.5+5 # 异常追踪/监听 @@ -56,11 +56,12 @@ dependencies: path_provider: ^2.1.5 # 路径 # 平台功能 - connectivity_plus: ^6.1.3 # 网络状态 +# connectivity_plus: ^6.1.4 # 网络状态 url_launcher: ^6.3.1 # url archive: ^4.0.6 # 解压 - file_picker: ^10.1.2 # 文件选择器 + file_picker: ^10.1.9 # 文件选择器 share_plus: ^10.1.4 # 文字分享 + package_info_plus: 8.1.4 # 视图展示 tolyui: 0.0.4+9 # tolyui @@ -77,7 +78,7 @@ dependencies: # 逻辑处理 image: ^4.0.17 # 图像处理 equatable: ^2.0.5 # 相等辅助 - + uuid: ^4.5.1 dev_dependencies: flutter_test: sdk: flutter @@ -85,8 +86,10 @@ dev_dependencies: dependency_overrides: web: ^1.0.0 + intl: 0.20.2 flutter: + generate: true uses-material-design: true assets: - assets/images/ diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 7bc0d57c..a6068005 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,7 +6,6 @@ #include "generated_plugin_registrant.h" -#include #include #include #include @@ -14,8 +13,6 @@ #include void RegisterPlugins(flutter::PluginRegistry* registry) { - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 18cfe7e6..7bf92b33 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus file_selector_windows screen_retriever_windows share_plus From ccd1112a0855b46e2c3d75b5a18499c41b9956e3 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Thu, 22 May 2025 09:56:27 +0800 Subject: [PATCH 145/149] readme --- README-EN.md | 9 +++++---- README.md | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README-EN.md b/README-EN.md index 36c5cd59..11044f8f 100644 --- a/README-EN.md +++ b/README-EN.md @@ -34,10 +34,11 @@ FlutterUnit is a cross-platform experience app, Here, you can fully explore the #### Flutter Version ``` -Flutter 3.29.2 • channel stable • https://github.com/flutter/flutter.git -Framework • revision c236373904 (5 weeks ago) • 2025-03-13 16:17:06 -0400 -Engine • revision 18b71d647a -Tools • Dart 3.7.2 • DevTools 2.42.3 +·]>> flutter --version +Flutter 3.32.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision be698c48a6 (2 days ago) • 2025-05-19 12:59:14 -0700 +Engine • revision 1881800949 (2 days ago) • 2025-05-19 10:54:07 -0700 +Tools • Dart 3.8.0 • DevTools 2.45.1 ``` #### Build Application diff --git a/README.md b/README.md index 1ad7e294..1adceedf 100644 --- a/README.md +++ b/README.md @@ -34,10 +34,10 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut ``` ·]>> flutter --version -Flutter 3.29.2 • channel stable • https://github.com/flutter/flutter.git -Framework • revision c236373904 (5 weeks ago) • 2025-03-13 16:17:06 -0400 -Engine • revision 18b71d647a -Tools • Dart 3.7.2 • DevTools 2.42.3 +Flutter 3.32.0 • channel stable • https://github.com/flutter/flutter.git +Framework • revision be698c48a6 (2 days ago) • 2025-05-19 12:59:14 -0700 +Engine • revision 1881800949 (2 days ago) • 2025-05-19 10:54:07 -0700 +Tools • Dart 3.8.0 • DevTools 2.45.1 ``` #### 构建应用 From 3773b490cba2e078283a82a45c98bde388877adb Mon Sep 17 00:00:00 2001 From: acsweet <1395723441@qq.com> Date: Thu, 22 May 2025 23:47:14 +0800 Subject: [PATCH 146/149] fix:update version --- assets/version.json | 2 +- macos/Podfile.lock | 85 ++-- macos/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 3 +- macos/Runner/AppDelegate.swift | 6 +- .../app/lib/app/cons/global_value.dart | 2 +- .../basic_system/app/lib/news/cacheable.dart | 3 +- .../note/lib/src/bloc/news_bloc.dart | 2 +- pubspec.lock | 400 +++++++++--------- 9 files changed, 265 insertions(+), 240 deletions(-) diff --git a/assets/version.json b/assets/version.json index f5f7e311..231c882a 100644 --- a/assets/version.json +++ b/assets/version.json @@ -1,3 +1,3 @@ { - "dbVersion": 3 + "dbVersion": 4 } \ No newline at end of file diff --git a/macos/Podfile.lock b/macos/Podfile.lock index a584e8ac..6fea947e 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,73 +1,92 @@ PODS: + - file_picker (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) + - open_file_mac (0.0.1): + - FlutterMacOS - package_info_plus (0.0.1): - FlutterMacOS - - path_provider_macos (0.0.1): + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - quill_native_bridge_macos (0.0.1): - FlutterMacOS - - screen_retriever (0.0.1): + - screen_retriever_macos (0.0.1): - FlutterMacOS - share_plus (0.0.1): - FlutterMacOS - - shared_preferences_macos (0.0.1): + - shared_preferences_foundation (0.0.1): + - Flutter - FlutterMacOS - - sqflite (0.0.2): + - sqflite_darwin (0.0.4): + - Flutter - FlutterMacOS - - FMDB (>= 2.7.5) - url_launcher_macos (0.0.1): - FlutterMacOS + - webview_flutter_wkwebview (0.0.1): + - Flutter + - FlutterMacOS - window_manager (0.2.0): - FlutterMacOS DEPENDENCIES: + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - open_file_mac (from `Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) - - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - webview_flutter_wkwebview (from `Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) -SPEC REPOS: - trunk: - - FMDB - EXTERNAL SOURCES: + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos FlutterMacOS: :path: Flutter/ephemeral + open_file_mac: + :path: Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_macos: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos - screen_retriever: - :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + quill_native_bridge_macos: + :path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos share_plus: :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos - shared_preferences_macos: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + webview_flutter_wkwebview: + :path: Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin window_manager: :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19 - screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 - shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 + open_file_mac: 0e554648e2a87ce59e9438e3e5ca3e552e90d89a + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + quill_native_bridge_macos: 3a5f378bc757eb92825193853020b759b56cbb2c + screen_retriever_macos: 776e0fa5d42c6163d2bf772d22478df4b302b161 + share_plus: 1fa619de8392a4398bfaf176d441853922614e89 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + webview_flutter_wkwebview: a4af96a051138e28e29f60101d094683b9f82188 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 -COCOAPODS: 1.12.0 +COCOAPODS: 1.14.3 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index a618c6bd..a19f9ac5 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -204,7 +204,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7c999745..46ae587f 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef643..b3c17614 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart index 7844a3c8..2954628b 100644 --- a/modules/basic_system/app/lib/app/cons/global_value.dart +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -6,7 +6,7 @@ import 'package:uuid/uuid.dart'; double px1 = 1 / window.devicePixelRatio; -String get kAppVersion => "3.1.0"; +String get kAppVersion => "3.2.0"; bool kIsDesk = kIsWeb || Platform.isMacOS || Platform.isWindows || Platform.isLinux; diff --git a/modules/basic_system/app/lib/news/cacheable.dart b/modules/basic_system/app/lib/news/cacheable.dart index ec3d18e0..779a84fa 100644 --- a/modules/basic_system/app/lib/news/cacheable.dart +++ b/modules/basic_system/app/lib/news/cacheable.dart @@ -37,7 +37,8 @@ mixin TimeoutCache on Cacheable { await remove(); return null; } - return convertor(jsonDecode(jsonValue)); + List v = jsonDecode(jsonValue); + return convertor(v); } catch (e) { print(e); } diff --git a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart index fc943867..048f6877 100644 --- a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart +++ b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart @@ -42,7 +42,7 @@ class NewsBloc extends Cubit @override ConvertorList> get convertor => (e) { - return e.map(ArticlePo.fromCache).toList(); + return e.map(ArticlePo.fromCache).toList(); }; } diff --git a/pubspec.lock b/pubspec.lock index 3dd6391f..a8c7aee7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.7" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.7.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.13.0" bloc: @@ -30,7 +30,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.4" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" charcode: @@ -54,7 +54,7 @@ packages: description: name: charcode sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" clock: @@ -62,7 +62,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.2" collection: @@ -70,7 +70,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.19.1" convert: @@ -78,7 +78,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.2" cross_file: @@ -86,7 +86,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.4+2" crypto: @@ -94,7 +94,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.6" csslib: @@ -102,7 +102,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" cupertino_icons: @@ -110,7 +110,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.8" dart_quill_delta: @@ -118,7 +118,7 @@ packages: description: name: dart_quill_delta sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.8.3" dash_painter: @@ -126,23 +126,23 @@ packages: description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" dev_build: dependency: transitive description: name: dev_build - sha256: "6cb4c65446aedd671ffdaacbede599b6fb9c462b17d006f11f7b82fe90706bff" - url: "https://pub.dev/" + sha256: de3c7b99d47f90c053dc331b8a950041426ecbe58dea21f961bb1f751ea98bb8 + url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.1+8" + version: "1.1.2+9" diff_match_patch: dependency: transitive description: name: diff_match_patch sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.1" dio: @@ -150,7 +150,7 @@ packages: description: name: dio sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.8.0+1" dio_web_adapter: @@ -158,7 +158,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.1" equatable: @@ -166,7 +166,7 @@ packages: description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.7" fake_async: @@ -174,23 +174,23 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.3" ffi: dependency: transitive description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev/" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.1.3" + version: "2.1.4" file: dependency: transitive description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.1" file_picker: @@ -198,7 +198,7 @@ packages: description: name: file_picker sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.1.9" file_selector_linux: @@ -206,7 +206,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.9.3+2" file_selector_platform_interface: @@ -214,7 +214,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.6.2" file_selector_windows: @@ -222,7 +222,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.9.3+4" fixnum: @@ -230,7 +230,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" flutter: @@ -243,7 +243,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.6" flutter_colorpicker: @@ -251,7 +251,7 @@ packages: description: name: flutter_colorpicker sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" flutter_keyboard_visibility_linux: @@ -259,7 +259,7 @@ packages: description: name: flutter_keyboard_visibility_linux sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_keyboard_visibility_macos: @@ -267,7 +267,7 @@ packages: description: name: flutter_keyboard_visibility_macos sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_keyboard_visibility_platform_interface: @@ -275,7 +275,7 @@ packages: description: name: flutter_keyboard_visibility_platform_interface sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" flutter_keyboard_visibility_temp_fork: @@ -283,7 +283,7 @@ packages: description: name: flutter_keyboard_visibility_temp_fork sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.5" flutter_keyboard_visibility_windows: @@ -291,7 +291,7 @@ packages: description: name: flutter_keyboard_visibility_windows sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_lints: @@ -299,7 +299,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" flutter_localizations: @@ -312,7 +312,7 @@ packages: description: name: flutter_markdown sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.7+1" flutter_plugin_android_lifecycle: @@ -320,7 +320,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.28" flutter_quill: @@ -328,7 +328,7 @@ packages: description: name: flutter_quill sha256: "7e60963632bbc8615627f0bae8e178515f69ecb378ad49fa68c43c2aabf33e21" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "11.4.1" flutter_quill_delta_from_html: @@ -336,7 +336,7 @@ packages: description: name: flutter_quill_delta_from_html sha256: "4597bd0853a704696837aa6b05cffd851f587b176204c234edddfed1c1862a09" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.5.2" flutter_spinkit: @@ -344,7 +344,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.2.1" flutter_star: @@ -352,7 +352,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.0" flutter_svg: @@ -360,7 +360,7 @@ packages: description: name: flutter_svg sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.0" flutter_test: @@ -378,7 +378,7 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.1" fx_dao: @@ -386,7 +386,7 @@ packages: description: name: fx_dao sha256: "2564d9d954f6be1534c67e7036d0c8ce3833c0943e92b19c499edf1b9033623c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3+3" fx_dio: @@ -394,7 +394,7 @@ packages: description: name: fx_dio sha256: "395549518d055596d58ffcff59b4da0c147d855f6258f2769213c7230c090525" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4+3" fx_env: @@ -402,7 +402,7 @@ packages: description: name: fx_env sha256: c95836ab108c498d53f43c464e08a5ce64975efdf586fb46f1a4c37bb2c400bf - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" fx_go_router_ext: @@ -410,7 +410,7 @@ packages: description: name: fx_go_router_ext sha256: dc65ac677f2058b8192ca50bdcd508a12ef4b6c150f64ca8d595b536ac6e5d1b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.6+1" fx_platform_adapter: @@ -418,7 +418,7 @@ packages: description: name: fx_platform_adapter sha256: e6d5ca554a1fd019a695a63bbb3e4eee6efe492b5d926542f22d6b64cea99415 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" fx_string: @@ -426,7 +426,7 @@ packages: description: name: fx_string sha256: "3350be2fa11cdb0d4107e4657431d05088a88795ef3145ad37902f6066a5b124" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" fx_trace: @@ -434,7 +434,7 @@ packages: description: name: fx_trace sha256: a1fb64b1a6bfc53609fe55e6d56a9c00e76250818eb5a8cfac280a051e33911c - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5+5" go_router: @@ -442,7 +442,7 @@ packages: description: name: go_router sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "14.8.0" html: @@ -450,7 +450,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.15.6" http: @@ -458,7 +458,7 @@ packages: description: name: http sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" http_parser: @@ -466,7 +466,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.1.2" image: @@ -474,7 +474,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.4" intl: @@ -482,7 +482,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.20.2" json_annotation: @@ -490,7 +490,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.9.0" jwt_decoder: @@ -498,7 +498,7 @@ packages: description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" leak_tracker: @@ -506,7 +506,7 @@ packages: description: name: leak_tracker sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.0.9" leak_tracker_flutter_testing: @@ -514,7 +514,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.9" leak_tracker_testing: @@ -522,7 +522,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.1" lints: @@ -530,7 +530,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" logging: @@ -538,7 +538,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" markdown: @@ -546,7 +546,7 @@ packages: description: name: markdown sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.3.0" matcher: @@ -554,7 +554,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.12.17" material_color_utilities: @@ -562,7 +562,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.11.1" meta: @@ -570,7 +570,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.16.0" mime: @@ -578,7 +578,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" nested: @@ -586,7 +586,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" open_file: @@ -594,7 +594,7 @@ packages: description: name: open_file sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.5.10" open_file_android: @@ -602,7 +602,7 @@ packages: description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.6" open_file_ios: @@ -610,7 +610,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_linux: @@ -618,7 +618,7 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5" open_file_mac: @@ -626,7 +626,7 @@ packages: description: name: open_file_mac sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_platform_interface: @@ -634,7 +634,7 @@ packages: description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_web: @@ -642,7 +642,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4" open_file_windows: @@ -650,7 +650,7 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" package_info_plus: @@ -658,7 +658,7 @@ packages: description: name: package_info_plus sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.4" package_info_plus_platform_interface: @@ -666,7 +666,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.0" path: @@ -674,7 +674,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.9.1" path_parsing: @@ -682,7 +682,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" path_provider: @@ -690,7 +690,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.5" path_provider_android: @@ -698,7 +698,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.17" path_provider_foundation: @@ -706,7 +706,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" path_provider_linux: @@ -714,7 +714,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -722,7 +722,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" path_provider_windows: @@ -730,23 +730,23 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev/" + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.flutter-io.cn/" source: hosted - version: "6.0.2" + version: "6.1.0" platform: dependency: transitive description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -754,7 +754,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.8" pool: @@ -762,7 +762,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.5.1" posix: @@ -770,23 +770,23 @@ packages: description: name: posix sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.0.2" process_run: dependency: transitive description: name: process_run - sha256: a68fa9727392edad97a2a96a77ce8b0c17d28336ba1b284b1dfac9595a4299ea - url: "https://pub.dev/" + sha256: "6ec839cdd3e6de4685318e7686cd4abb523c3d3a55af0e8d32a12ae19bc66622" + url: "https://pub.flutter-io.cn/" source: hosted - version: "1.2.2+1" + version: "1.2.4" provider: dependency: transitive description: name: provider sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.1.5" pub_semver: @@ -794,7 +794,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.0" quill_native_bridge: @@ -802,7 +802,7 @@ packages: description: name: quill_native_bridge sha256: "00752aca7d67cbd3254709a47558be78427750cb81aa42cfbed354d4a079bcfa" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "11.0.1" quill_native_bridge_android: @@ -810,7 +810,7 @@ packages: description: name: quill_native_bridge_android sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1+2" quill_native_bridge_ios: @@ -818,7 +818,7 @@ packages: description: name: quill_native_bridge_ios sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_linux: @@ -826,7 +826,7 @@ packages: description: name: quill_native_bridge_linux sha256: "5fcc60cab2ab9079e0746941f05c5ca5fec85cc050b738c8c8b9da7c09da17eb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_macos: @@ -834,7 +834,7 @@ packages: description: name: quill_native_bridge_macos sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_platform_interface: @@ -842,7 +842,7 @@ packages: description: name: quill_native_bridge_platform_interface sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+1" quill_native_bridge_web: @@ -850,7 +850,7 @@ packages: description: name: quill_native_bridge_web sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2" quill_native_bridge_windows: @@ -858,7 +858,7 @@ packages: description: name: quill_native_bridge_windows sha256: "60e50d74238f22ceb43113d9a42b6627451dab9fc27f527b979a32051cf1da45" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quiver: @@ -866,7 +866,7 @@ packages: description: name: quiver sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.2" r_upgrade: @@ -881,7 +881,7 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" screen_retriever: @@ -889,7 +889,7 @@ packages: description: name: screen_retriever sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_linux: @@ -897,7 +897,7 @@ packages: description: name: screen_retriever_linux sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_macos: @@ -905,7 +905,7 @@ packages: description: name: screen_retriever_macos sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_platform_interface: @@ -913,7 +913,7 @@ packages: description: name: screen_retriever_platform_interface sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_windows: @@ -921,7 +921,7 @@ packages: description: name: screen_retriever_windows sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" share_plus: @@ -929,7 +929,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -937,7 +937,7 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.0.2" shared_preferences: @@ -945,7 +945,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.3" shared_preferences_android: @@ -953,7 +953,7 @@ packages: description: name: shared_preferences_android sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.10" shared_preferences_foundation: @@ -961,7 +961,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -969,7 +969,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -977,7 +977,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_web: @@ -985,7 +985,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.3" shared_preferences_windows: @@ -993,7 +993,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" sky_engine: @@ -1006,7 +1006,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.10.1" sprintf: @@ -1014,63 +1014,63 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.0" sqflite: dependency: transitive description: name: sqflite - sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" - url: "https://pub.dev/" + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.1" + version: "2.4.2" sqflite_android: dependency: transitive description: name: sqflite_android - sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" - url: "https://pub.dev/" + sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.0" + version: "2.4.1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" - url: "https://pub.dev/" + sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.5.4+6" + version: "2.5.5" sqflite_common_ffi: dependency: transitive description: name: sqflite_common_ffi - sha256: "883dd810b2b49e6e8c3b980df1829ef550a94e3f87deab5d864917d27ca6bf36" - url: "https://pub.dev/" + sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.3.4+4" + version: "2.3.5" sqflite_common_ffi_web: dependency: transitive description: name: sqflite_common_ffi_web sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.5+4" sqflite_darwin: dependency: transitive description: name: sqflite_darwin - sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" - url: "https://pub.dev/" + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.flutter-io.cn/" source: hosted - version: "2.4.1+1" + version: "2.4.2" sqflite_platform_interface: dependency: transitive description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.0" sqlite3: @@ -1078,7 +1078,7 @@ packages: description: name: sqlite3 sha256: "310af39c40dd0bb2058538333c9d9840a2725ae0b9f77e4fd09ad6696aa8f66e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.7.5" stack_trace: @@ -1086,7 +1086,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.12.1" stream_channel: @@ -1094,7 +1094,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" stream_transform: @@ -1102,7 +1102,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.1" string_scanner: @@ -1110,23 +1110,23 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.1" synchronized: dependency: transitive description: name: synchronized - sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" - url: "https://pub.dev/" + sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" + url: "https://pub.flutter-io.cn/" source: hosted - version: "3.3.0+3" + version: "3.3.1" term_glyph: dependency: transitive description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.2" test_api: @@ -1134,7 +1134,7 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.4" toggle_rotate: @@ -1142,7 +1142,7 @@ packages: description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" tolyui: @@ -1150,7 +1150,7 @@ packages: description: name: tolyui sha256: "2c49442fd9cb1f5c89fcc5c30cded148e3abe749bea0064e9218d2bb9a47640c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4+9" tolyui_color: @@ -1158,23 +1158,23 @@ packages: description: name: tolyui_color sha256: e79eed0a525a584dc51df9ee5445bee190d9a9b5f14690038800c4983b2c744a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2" tolyui_feedback: dependency: transitive description: name: tolyui_feedback - sha256: "3f78955e9160287a2c841c67a7c878e9ca5f990a4d26d26e02c51fbfc2ec42a1" - url: "https://pub.dev/" + sha256: f0d28429eec4c49e7949cf5ae8e5b0767db9865e7d88e768483b49158d7961a7 + url: "https://pub.flutter-io.cn/" source: hosted - version: "0.3.6+4" + version: "0.3.6+5" tolyui_message: dependency: transitive description: name: tolyui_message sha256: "3811b9666d90d0088c35cacfe77ef990ed6019f801000d0e39ed8f500817b3bf" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.6+1" tolyui_meta: @@ -1182,7 +1182,7 @@ packages: description: name: tolyui_meta sha256: "449bca06271d6c5d2a6b49192fd9176fa14b86fcd57c7317c4466a9d0b334674" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+1" tolyui_navigation: @@ -1190,7 +1190,7 @@ packages: description: name: tolyui_navigation sha256: "8c4ddc82cb80982e5f1a4cdc39ebf3ceec6b50899dfef407abba3841d3b54610" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" tolyui_rx_layout: @@ -1198,7 +1198,7 @@ packages: description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" two_dimensional_scrollables: @@ -1206,7 +1206,7 @@ packages: description: name: two_dimensional_scrollables sha256: "1b0b29095d86df509d115ac668f85c3fcb0bd1554ccf89c289ca4769bead49db" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.4" typed_data: @@ -1214,7 +1214,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" url_launcher: @@ -1222,7 +1222,7 @@ packages: description: name: url_launcher sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.1" url_launcher_android: @@ -1230,7 +1230,7 @@ packages: description: name: url_launcher_android sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.16" url_launcher_ios: @@ -1238,7 +1238,7 @@ packages: description: name: url_launcher_ios sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.3" url_launcher_linux: @@ -1246,7 +1246,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.1" url_launcher_macos: @@ -1254,7 +1254,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -1262,7 +1262,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.2" url_launcher_web: @@ -1270,7 +1270,7 @@ packages: description: name: url_launcher_web sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" url_launcher_windows: @@ -1278,7 +1278,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.4" uuid: @@ -1286,7 +1286,7 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.1" vector_graphics: @@ -1294,7 +1294,7 @@ packages: description: name: vector_graphics sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.18" vector_graphics_codec: @@ -1302,7 +1302,7 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -1310,7 +1310,7 @@ packages: description: name: vector_graphics_compiler sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.16" vector_math: @@ -1318,7 +1318,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" vm_service: @@ -1326,7 +1326,7 @@ packages: description: name: vm_service sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "15.0.0" web: @@ -1334,23 +1334,23 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" webview_flutter: dependency: "direct main" description: name: webview_flutter - sha256: "62d763c27ce7f6cef04b3bec01c85a28d60149bffd155884aa4b8fd4941ea2e4" - url: "https://pub.dev/" + sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba + url: "https://pub.flutter-io.cn/" source: hosted - version: "4.12.0" + version: "4.13.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.7.0" webview_flutter_platform_interface: @@ -1358,7 +1358,7 @@ packages: description: name: webview_flutter_platform_interface sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.13.0" webview_flutter_wkwebview: @@ -1366,7 +1366,7 @@ packages: description: name: webview_flutter_wkwebview sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.22.0" widget_repository: @@ -1380,16 +1380,16 @@ packages: dependency: transitive description: name: win32 - sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e - url: "https://pub.dev/" + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.flutter-io.cn/" source: hosted - version: "5.10.1" + version: "5.13.0" window_manager: dependency: transitive description: name: window_manager sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.3" wrapper: @@ -1397,7 +1397,7 @@ packages: description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" xdg_directories: @@ -1405,7 +1405,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" xml: @@ -1413,7 +1413,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.5.0" yaml: @@ -1421,9 +1421,9 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0-0 <4.0.0" + dart: ">=3.7.0 <4.0.0" flutter: ">=3.27.0" From 9664eb003d43456334231d8eacc285246ee639ec Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 24 May 2025 09:11:54 +0800 Subject: [PATCH 147/149] fix:l10n --- README.md | 6 +- lib/src/l10n/arb/app_de.arb | 27 +- lib/src/l10n/arb/app_en.arb | 5 +- lib/src/l10n/arb/app_es.arb | 27 +- lib/src/l10n/arb/app_fr.arb | 27 +- lib/src/l10n/arb/app_it.arb | 27 +- lib/src/l10n/arb/app_ja.arb | 27 +- lib/src/l10n/arb/app_ko.arb | 27 +- lib/src/l10n/arb/app_pt.arb | 27 +- lib/src/l10n/arb/app_ru.arb | 27 +- lib/src/l10n/arb/app_zh.arb | 6 +- lib/src/l10n/gen/app_l10n.dart | 18 + lib/src/l10n/gen/app_l10n_de.dart | 9 + lib/src/l10n/gen/app_l10n_en.dart | 9 + lib/src/l10n/gen/app_l10n_es.dart | 9 + lib/src/l10n/gen/app_l10n_fr.dart | 9 + lib/src/l10n/gen/app_l10n_it.dart | 9 + lib/src/l10n/gen/app_l10n_ja.dart | 9 + lib/src/l10n/gen/app_l10n_ko.dart | 9 + lib/src/l10n/gen/app_l10n_pt.dart | 9 + lib/src/l10n/gen/app_l10n_ru.dart | 9 + lib/src/l10n/gen/app_l10n_zh.dart | 9 + lib/src/navigation/router/app_route.dart | 8 + .../router/widgets/widgets_route.dart | 2 +- lib/src/navigation/view/mobile/news.dart | 27 +- .../view/mobile/unit_navigation.dart | 2 +- .../app/lib/app/router/app_route.dart | 1 + .../app/lib/app_config/bloc/state.dart | 2 +- .../src/sp_storage/models/app_config_po.dart | 2 +- .../note/lib/src/bloc/news_bloc.dart | 7 +- .../note/lib/src/view/news/news_page.dart | 84 ++++ .../note/lib/src/view/view.dart | 3 +- .../desk_ui/widget_panel/widget_panel.dart | 6 +- pubspec.lock | 366 +++++++++--------- pubspec.yaml | 4 +- 35 files changed, 551 insertions(+), 304 deletions(-) create mode 100644 modules/knowledge_system/note/lib/src/view/news/news_page.dart diff --git a/README.md b/README.md index 1adceedf..9e430602 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flut

    下载 App: - [Android] • + [Android] [iOS] • - [MacOS] • - [Windows] • + [MacOS] • + [Windows][Web]

    diff --git a/lib/src/l10n/arb/app_de.arb b/lib/src/l10n/arb/app_de.arb index 1fcfc219..915213a3 100644 --- a/lib/src/l10n/arb/app_de.arb +++ b/lib/src/l10n/arb/app_de.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Widget-Sammlung", - "deskTabPainter": "Zeichnungssammlung", - "deskTabKnowledge": "Wissensdatenbank", - "deskTabTools": "Werkzeugkasten", - "deskTabMine": "App-Info", - "messageBoard": "Pinnwand", - "mobileTabWidgets": "Widgets", - "mobileTabPainter": "Malen", - "mobileTabKnowledge": "Wissen", - "mobileTabTools": "Werkzeuge", - "mobileTabMine": "Mein" - } \ No newline at end of file + "deskTabWidgets": "Widget-Sammlung", + "deskTabPainter": "Zeichnungssammlung", + "deskTabKnowledge": "Wissensdatenbank", + "deskTabTools": "Werkzeugkasten", + "deskTabMine": "App-Info", + "messageBoard": "Pinnwand", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Malen", + "mobileTabKnowledge": "Wissen", + "mobileTabTools": "Werkzeuge", + "mobileTabMine": "Mein", + "newBoard": "Neu", + "news": "Neuigkeiten", + "moreNews": "Mehr News" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_en.arb b/lib/src/l10n/arb/app_en.arb index e9137e99..9a3d0f4f 100644 --- a/lib/src/l10n/arb/app_en.arb +++ b/lib/src/l10n/arb/app_en.arb @@ -9,5 +9,8 @@ "mobileTabPainter": "Painter", "mobileTabKnowledge": "Knowledge", "mobileTabTools": "Treasure", - "mobileTabMine": "Mine" + "mobileTabMine": "Mine", + "newBoard": "New", + "news": "News", + "moreNews": "More News" } \ No newline at end of file diff --git a/lib/src/l10n/arb/app_es.arb b/lib/src/l10n/arb/app_es.arb index 94785206..ede49fdb 100644 --- a/lib/src/l10n/arb/app_es.arb +++ b/lib/src/l10n/arb/app_es.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Colección de widgets", - "deskTabPainter": "Colección de dibujos", - "deskTabKnowledge": "Centro de conocimiento", - "deskTabTools": "Caja de herramientas", - "deskTabMine": "Info App", - "messageBoard": "Tablero de Mensajes", - "mobileTabWidgets": "Widgets", - "mobileTabPainter": "Dibujo", - "mobileTabKnowledge": "Conocimiento", - "mobileTabTools": "Herramientas", - "mobileTabMine": "Mi" - } \ No newline at end of file + "deskTabWidgets": "Colección de widgets", + "deskTabPainter": "Colección de dibujos", + "deskTabKnowledge": "Centro de conocimiento", + "deskTabTools": "Caja de herramientas", + "deskTabMine": "Info App", + "messageBoard": "Tablero de Mensajes", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dibujo", + "mobileTabKnowledge": "Conocimiento", + "mobileTabTools": "Herramientas", + "mobileTabMine": "Mi", + "newBoard": "Nuevo", + "news": "Noticias", + "moreNews": "Más noticias" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_fr.arb b/lib/src/l10n/arb/app_fr.arb index d63ea4df..2e271c2d 100644 --- a/lib/src/l10n/arb/app_fr.arb +++ b/lib/src/l10n/arb/app_fr.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Collection de widgets", - "deskTabPainter": "Collection de dessins", - "deskTabKnowledge": "Base de connaissances", - "deskTabTools": "Boîte à outils", - "deskTabMine": "Infos App", - "messageBoard": "Tableau de messages", - "mobileTabWidgets": "Widgets", - "mobileTabPainter": "Dessin", - "mobileTabKnowledge": "Connaissances", - "mobileTabTools": "Outils", - "mobileTabMine": "Moi" - } \ No newline at end of file + "deskTabWidgets": "Collection de widgets", + "deskTabPainter": "Collection de dessins", + "deskTabKnowledge": "Base de connaissances", + "deskTabTools": "Boîte à outils", + "deskTabMine": "Infos App", + "messageBoard": "Tableau de messages", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Dessin", + "mobileTabKnowledge": "Connaissances", + "mobileTabTools": "Outils", + "mobileTabMine": "Moi", + "newBoard": "Nouveau", + "news": "Actualités", + "moreNews": "Plus d'actualités" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_it.arb b/lib/src/l10n/arb/app_it.arb index c2b555db..7cf9050c 100644 --- a/lib/src/l10n/arb/app_it.arb +++ b/lib/src/l10n/arb/app_it.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Raccolta widget", - "deskTabPainter": "Raccolta disegni", - "deskTabKnowledge": "Hub conoscitivo", - "deskTabTools": "Cassetta degli attrezzi", - "deskTabMine": "Info App", - "messageBoard": "Bacheca", - "mobileTabWidgets": "Widget", - "mobileTabPainter": "Disegno", - "mobileTabKnowledge": "Conoscenza", - "mobileTabTools": "Strumenti", - "mobileTabMine": "Io" - } \ No newline at end of file + "deskTabWidgets": "Raccolta widget", + "deskTabPainter": "Raccolta disegni", + "deskTabKnowledge": "Hub conoscitivo", + "deskTabTools": "Cassetta degli attrezzi", + "deskTabMine": "Info App", + "messageBoard": "Bacheca", + "mobileTabWidgets": "Widget", + "mobileTabPainter": "Disegno", + "mobileTabKnowledge": "Conoscenza", + "mobileTabTools": "Strumenti", + "mobileTabMine": "Io", + "newBoard": "Nuovo", + "news": "Notizie", + "moreNews": "Altre notizie" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ja.arb b/lib/src/l10n/arb/app_ja.arb index 0fd96aab..dcf1cb0c 100644 --- a/lib/src/l10n/arb/app_ja.arb +++ b/lib/src/l10n/arb/app_ja.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "ウィジェット集", - "deskTabPainter": "描画集", - "deskTabKnowledge": "ナレッジハブ", - "deskTabTools": "ツールボックス", - "deskTabMine": "アプリ情報", - "messageBoard": "掲示板", - "mobileTabWidgets": "ウィジェット", - "mobileTabPainter": "描画", - "mobileTabKnowledge": "知識", - "mobileTabTools": "ツール", - "mobileTabMine": "マイ" - } \ No newline at end of file + "deskTabWidgets": "ウィジェット集", + "deskTabPainter": "描画集", + "deskTabKnowledge": "ナレッジハブ", + "deskTabTools": "ツールボックス", + "deskTabMine": "アプリ情報", + "messageBoard": "掲示板", + "mobileTabWidgets": "ウィジェット", + "mobileTabPainter": "描画", + "mobileTabKnowledge": "知識", + "mobileTabTools": "ツール", + "mobileTabMine": "マイ", + "newBoard": "新規作成", + "news": "最新情報", + "moreNews": "もっと見る" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ko.arb b/lib/src/l10n/arb/app_ko.arb index 23a8c292..a3952eb9 100644 --- a/lib/src/l10n/arb/app_ko.arb +++ b/lib/src/l10n/arb/app_ko.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "위젯 모음집", - "deskTabPainter": "그림 모음집", - "deskTabKnowledge": "지식 허브", - "deskTabTools": "도구 상자", - "deskTabMine": "앱 정보", - "messageBoard": "게시판", - "mobileTabWidgets": "위젯", - "mobileTabPainter": "그리기", - "mobileTabKnowledge": "지식", - "mobileTabTools": "도구", - "mobileTabMine": "내 정보" - } \ No newline at end of file + "deskTabWidgets": "위젯 모음집", + "deskTabPainter": "그림 모음집", + "deskTabKnowledge": "지식 허브", + "deskTabTools": "도구 상자", + "deskTabMine": "앱 정보", + "messageBoard": "게시판", + "mobileTabWidgets": "위젯", + "mobileTabPainter": "그리기", + "mobileTabKnowledge": "지식", + "mobileTabTools": "도구", + "mobileTabMine": "내 정보", + "newBoard": "새 글", + "news": "최신 소식", + "moreNews": "더 보기" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_pt.arb b/lib/src/l10n/arb/app_pt.arb index 300c0150..4b877bfa 100644 --- a/lib/src/l10n/arb/app_pt.arb +++ b/lib/src/l10n/arb/app_pt.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Coleção de widgets", - "deskTabPainter": "Coleção de desenhos", - "deskTabKnowledge": "Hub de conhecimento", - "deskTabTools": "Caixa de ferramentas", - "deskTabMine": "Info App", - "messageBoard": "Quadro de Mensagens", - "mobileTabWidgets": "Widgets", - "mobileTabPainter": "Desenho", - "mobileTabKnowledge": "Conhecimento", - "mobileTabTools": "Ferramentas", - "mobileTabMine": "Meu" - } \ No newline at end of file + "deskTabWidgets": "Coleção de widgets", + "deskTabPainter": "Coleção de desenhos", + "deskTabKnowledge": "Hub de conhecimento", + "deskTabTools": "Caixa de ferramentas", + "deskTabMine": "Info App", + "messageBoard": "Quadro de Mensagens", + "mobileTabWidgets": "Widgets", + "mobileTabPainter": "Desenho", + "mobileTabKnowledge": "Conhecimento", + "mobileTabTools": "Ferramentas", + "mobileTabMine": "Meu", + "newBoard": "Novo", + "news": "Novidades", + "moreNews": "Mais novidades" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_ru.arb b/lib/src/l10n/arb/app_ru.arb index 930cfafa..64b61c2e 100644 --- a/lib/src/l10n/arb/app_ru.arb +++ b/lib/src/l10n/arb/app_ru.arb @@ -1,13 +1,16 @@ { - "deskTabWidgets": "Коллекция виджетов", - "deskTabPainter": "Коллекция рисунков", - "deskTabKnowledge": "База знаний", - "deskTabTools": "Инструменты", - "deskTabMine": "Информация", - "messageBoard": "Доска сообщений", - "mobileTabWidgets": "Виджеты", - "mobileTabPainter": "Рисование", - "mobileTabKnowledge": "Знания", - "mobileTabTools": "Инструменты", - "mobileTabMine": "Мои" - } \ No newline at end of file + "deskTabWidgets": "Коллекция виджетов", + "deskTabPainter": "Коллекция рисунков", + "deskTabKnowledge": "База знаний", + "deskTabTools": "Инструменты", + "deskTabMine": "Информация", + "messageBoard": "Доска сообщений", + "mobileTabWidgets": "Виджеты", + "mobileTabPainter": "Рисование", + "mobileTabKnowledge": "Знания", + "mobileTabTools": "Инструменты", + "mobileTabMine": "Мои", + "newBoard": "Создать", + "news": "Новости", + "moreNews": "Больше новостей" +} \ No newline at end of file diff --git a/lib/src/l10n/arb/app_zh.arb b/lib/src/l10n/arb/app_zh.arb index 72c253cc..5b4d2f39 100644 --- a/lib/src/l10n/arb/app_zh.arb +++ b/lib/src/l10n/arb/app_zh.arb @@ -5,10 +5,12 @@ "deskTabTools": "工具宝箱", "deskTabMine": "应用信息", "messageBoard": "留言板", - "mobileTabWidgets": "组件", "mobileTabPainter": "绘制", "mobileTabKnowledge": "知识", "mobileTabTools": "工具", - "mobileTabMine": "我的" + "mobileTabMine": "我的", + "newBoard": "新建 ", + "news": "最新资讯", + "moreNews": "查看更多" } \ No newline at end of file diff --git a/lib/src/l10n/gen/app_l10n.dart b/lib/src/l10n/gen/app_l10n.dart index ff69fde4..39cd6ac3 100644 --- a/lib/src/l10n/gen/app_l10n.dart +++ b/lib/src/l10n/gen/app_l10n.dart @@ -178,6 +178,24 @@ abstract class AppL10n { /// In zh, this message translates to: /// **'我的'** String get mobileTabMine; + + /// No description provided for @newBoard. + /// + /// In zh, this message translates to: + /// **'新建 '** + String get newBoard; + + /// No description provided for @news. + /// + /// In zh, this message translates to: + /// **'最新资讯'** + String get news; + + /// No description provided for @moreNews. + /// + /// In zh, this message translates to: + /// **'查看更多'** + String get moreNews; } class _AppL10nDelegate extends LocalizationsDelegate { diff --git a/lib/src/l10n/gen/app_l10n_de.dart b/lib/src/l10n/gen/app_l10n_de.dart index 79ee31fc..f8e2660c 100644 --- a/lib/src/l10n/gen/app_l10n_de.dart +++ b/lib/src/l10n/gen/app_l10n_de.dart @@ -40,4 +40,13 @@ class AppL10nDe extends AppL10n { @override String get mobileTabMine => 'Mein'; + + @override + String get newBoard => 'Neu'; + + @override + String get news => 'Neuigkeiten'; + + @override + String get moreNews => 'Mehr News'; } diff --git a/lib/src/l10n/gen/app_l10n_en.dart b/lib/src/l10n/gen/app_l10n_en.dart index d69f393b..65194446 100644 --- a/lib/src/l10n/gen/app_l10n_en.dart +++ b/lib/src/l10n/gen/app_l10n_en.dart @@ -40,4 +40,13 @@ class AppL10nEn extends AppL10n { @override String get mobileTabMine => 'Mine'; + + @override + String get newBoard => 'New'; + + @override + String get news => 'News'; + + @override + String get moreNews => 'More News'; } diff --git a/lib/src/l10n/gen/app_l10n_es.dart b/lib/src/l10n/gen/app_l10n_es.dart index e8441e47..121c6f7d 100644 --- a/lib/src/l10n/gen/app_l10n_es.dart +++ b/lib/src/l10n/gen/app_l10n_es.dart @@ -40,4 +40,13 @@ class AppL10nEs extends AppL10n { @override String get mobileTabMine => 'Mi'; + + @override + String get newBoard => 'Nuevo'; + + @override + String get news => 'Noticias'; + + @override + String get moreNews => 'Más noticias'; } diff --git a/lib/src/l10n/gen/app_l10n_fr.dart b/lib/src/l10n/gen/app_l10n_fr.dart index 7295ae9e..14d753ca 100644 --- a/lib/src/l10n/gen/app_l10n_fr.dart +++ b/lib/src/l10n/gen/app_l10n_fr.dart @@ -40,4 +40,13 @@ class AppL10nFr extends AppL10n { @override String get mobileTabMine => 'Moi'; + + @override + String get newBoard => 'Nouveau'; + + @override + String get news => 'Actualités'; + + @override + String get moreNews => 'Plus d\'actualités'; } diff --git a/lib/src/l10n/gen/app_l10n_it.dart b/lib/src/l10n/gen/app_l10n_it.dart index ed6e8d34..20d3e47c 100644 --- a/lib/src/l10n/gen/app_l10n_it.dart +++ b/lib/src/l10n/gen/app_l10n_it.dart @@ -40,4 +40,13 @@ class AppL10nIt extends AppL10n { @override String get mobileTabMine => 'Io'; + + @override + String get newBoard => 'Nuovo'; + + @override + String get news => 'Notizie'; + + @override + String get moreNews => 'Altre notizie'; } diff --git a/lib/src/l10n/gen/app_l10n_ja.dart b/lib/src/l10n/gen/app_l10n_ja.dart index c27b3cb4..d55fc327 100644 --- a/lib/src/l10n/gen/app_l10n_ja.dart +++ b/lib/src/l10n/gen/app_l10n_ja.dart @@ -40,4 +40,13 @@ class AppL10nJa extends AppL10n { @override String get mobileTabMine => 'マイ'; + + @override + String get newBoard => '新規作成'; + + @override + String get news => '最新情報'; + + @override + String get moreNews => 'もっと見る'; } diff --git a/lib/src/l10n/gen/app_l10n_ko.dart b/lib/src/l10n/gen/app_l10n_ko.dart index a1d01827..920b7a29 100644 --- a/lib/src/l10n/gen/app_l10n_ko.dart +++ b/lib/src/l10n/gen/app_l10n_ko.dart @@ -40,4 +40,13 @@ class AppL10nKo extends AppL10n { @override String get mobileTabMine => '내 정보'; + + @override + String get newBoard => '새 글'; + + @override + String get news => '최신 소식'; + + @override + String get moreNews => '더 보기'; } diff --git a/lib/src/l10n/gen/app_l10n_pt.dart b/lib/src/l10n/gen/app_l10n_pt.dart index abfd2ace..ba255d47 100644 --- a/lib/src/l10n/gen/app_l10n_pt.dart +++ b/lib/src/l10n/gen/app_l10n_pt.dart @@ -40,4 +40,13 @@ class AppL10nPt extends AppL10n { @override String get mobileTabMine => 'Meu'; + + @override + String get newBoard => 'Novo'; + + @override + String get news => 'Novidades'; + + @override + String get moreNews => 'Mais novidades'; } diff --git a/lib/src/l10n/gen/app_l10n_ru.dart b/lib/src/l10n/gen/app_l10n_ru.dart index 7925d188..7f00e6c9 100644 --- a/lib/src/l10n/gen/app_l10n_ru.dart +++ b/lib/src/l10n/gen/app_l10n_ru.dart @@ -40,4 +40,13 @@ class AppL10nRu extends AppL10n { @override String get mobileTabMine => 'Мои'; + + @override + String get newBoard => 'Создать'; + + @override + String get news => 'Новости'; + + @override + String get moreNews => 'Больше новостей'; } diff --git a/lib/src/l10n/gen/app_l10n_zh.dart b/lib/src/l10n/gen/app_l10n_zh.dart index 6b3b59f3..2e2086d1 100644 --- a/lib/src/l10n/gen/app_l10n_zh.dart +++ b/lib/src/l10n/gen/app_l10n_zh.dart @@ -40,4 +40,13 @@ class AppL10nZh extends AppL10n { @override String get mobileTabMine => '我的'; + + @override + String get newBoard => '新建 '; + + @override + String get news => '最新资讯'; + + @override + String get moreNews => '查看更多'; } diff --git a/lib/src/navigation/router/app_route.dart b/lib/src/navigation/router/app_route.dart index 5ca9aabf..8c42ff21 100644 --- a/lib/src/navigation/router/app_route.dart +++ b/lib/src/navigation/router/app_route.dart @@ -1,5 +1,6 @@ import 'package:app/app.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_unit/src/l10n/gen/app_l10n.dart'; import '../view/desktop/flutter_unit_desk_navigation.dart'; import 'system/app.dart'; @@ -7,6 +8,7 @@ import 'system/global.dart'; import 'system/settings.dart'; import 'widgets/collection_route.dart'; import 'widgets/widgets_route.dart'; +import 'package:note/note.dart'; RouteBase get appRoute { List body = [ @@ -14,6 +16,12 @@ RouteBase get appRoute { noteRoute, collectRoute, settingsRoute, + GoRoute( + path: AppRoute.moreNews.path, + builder: (ctx, __) => NewsPage( + title: AppL10n.of(ctx).news, + ), + ), ...systemRoutes, ]; return GoRoute( diff --git a/lib/src/navigation/router/widgets/widgets_route.dart b/lib/src/navigation/router/widgets/widgets_route.dart index c9c60a0a..125fec83 100644 --- a/lib/src/navigation/router/widgets/widgets_route.dart +++ b/lib/src/navigation/router/widgets/widgets_route.dart @@ -10,7 +10,7 @@ GoRoute get widgetsRoute => GoRoute( builder: (_, __) { if (kAppEnv.isDesktopUI) { return const DeskWidgetPanel( - header: CarouselNode2(), + header: NewsHeader(), ); } return const UnitPhoneNavigation(); diff --git a/lib/src/navigation/view/mobile/news.dart b/lib/src/navigation/view/mobile/news.dart index aa586210..c7086cc4 100644 --- a/lib/src/navigation/view/mobile/news.dart +++ b/lib/src/navigation/view/mobile/news.dart @@ -3,19 +3,22 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:note/note.dart'; import 'package:tolyui/basic/basic.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../../../l10n/gen/app_l10n.dart'; import 'carousel.dart'; import 'package:app/app.dart'; -class CarouselNode2 extends StatefulWidget { - const CarouselNode2({super.key}); +class NewsHeader extends StatefulWidget { + const NewsHeader({super.key}); @override - State createState() => _CarouselNode2State(); + State createState() => _NewsHeaderState(); } -class _CarouselNode2State extends State { +class _NewsHeaderState extends State { @override Widget build(BuildContext context) { + AppL10n l10n = AppL10n.of(context); + List data = context.select((NewsBloc bloc) => bloc.state.headerNews); return ConstrainedBox( @@ -29,7 +32,7 @@ class _CarouselNode2State extends State { child: Row( children: [ Text( - "最新资讯", + l10n.news, style: TextStyle(fontWeight: FontWeight.w600), ), if (kAppEnv.isDesktopUI) @@ -43,9 +46,17 @@ class _CarouselNode2State extends State { context.read().refreshFromNet(); }), Spacer(), - Text( - '查看更多', - style: TextStyle(fontSize: 12, color: Color(0xff999999)), + MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + context.push('/more_news'); + }, + child: Text( + l10n.moreNews, + style: TextStyle(fontSize: 12, color: Color(0xff999999)), + ), + ), ) ], ), diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index 425e6667..702bca96 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -61,7 +61,7 @@ class _UnitPhoneNavigationState extends State { physics: _neverScroll, controller: _controller, children: [ - StandardHomePage(heard: CarouselNode2()), + StandardHomePage(heard: NewsHeader()), GalleryUnit(), AlgoScope(child: ArtifactPage()), ArtSysScope(child: MobileArticlePage()), diff --git a/modules/basic_system/app/lib/app/router/app_route.dart b/modules/basic_system/app/lib/app/router/app_route.dart index bf313620..626c0133 100644 --- a/modules/basic_system/app/lib/app/router/app_route.dart +++ b/modules/basic_system/app/lib/app/router/app_route.dart @@ -11,6 +11,7 @@ enum AppRoute { collectionDetail('widgets/:id', url: '/collection/widgets/'), note('note', url: '/note'), + moreNews('more_news', url: '/more_news'), painter('painter', url: '/painter'), knowledge('knowledge', url: '/knowledge'), tools('tools', url: '/tools'), diff --git a/modules/basic_system/app/lib/app_config/bloc/state.dart b/modules/basic_system/app/lib/app_config/bloc/state.dart index 85113249..7da9703c 100644 --- a/modules/basic_system/app/lib/app_config/bloc/state.dart +++ b/modules/basic_system/app/lib/app_config/bloc/state.dart @@ -45,7 +45,7 @@ class AppConfig extends Equatable { const AppConfig({ this.fontFamily = '宋体', this.language = Language.zh_CN, - this.themeColor = ThemeColor.blue, + this.themeColor = ThemeColor.indigo, this.themeMode = ThemeMode.system, this.showBackGround = true, this.codeStyleIndex = 0, diff --git a/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart b/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart index 3c9d4451..3f5399fd 100644 --- a/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart +++ b/modules/basic_system/storage/lib/src/sp_storage/models/app_config_po.dart @@ -29,7 +29,7 @@ class AppConfigPo { showOverlayTool: map['showOverlayTool'] ?? false, showPerformanceOverlay: map['showPerformanceOverlay'] ?? false, fontFamilyIndex: map['fontFamilyIndex'] ?? 1, - themeColorIndex: map['themeColorIndex'] ?? 4, + themeColorIndex: map['themeColorIndex'] ?? 5, codeStyleIndex: map['codeStyleIndex'] ?? 0, themeModeIndex: map['themeModeIndex'] ?? 0, itemStyleIndex: map['itemStyleIndex'] ?? 0, diff --git a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart index 048f6877..74623de1 100644 --- a/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart +++ b/modules/knowledge_system/note/lib/src/bloc/news_bloc.dart @@ -32,7 +32,12 @@ class NewsBloc extends Cubit } Future refreshFromNet() async { - ApiRet> ret = await _repository.getArticlesByTag(1); + SizeFilter filter = const SizeFilter( + page: 1, + pageSize: 8, + ); + ApiRet> ret = + await _repository.getArticlesByTag(1, filter: filter); print("=====load in net========="); if (ret.success) { save(ret.data); diff --git a/modules/knowledge_system/note/lib/src/view/news/news_page.dart b/modules/knowledge_system/note/lib/src/view/news/news_page.dart new file mode 100644 index 00000000..5e6d84ca --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/news/news_page.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/note.dart'; + +class NewsPage extends StatefulWidget { + final String title; + const NewsPage({super.key, required this.title}); + + @override + State createState() => _NewsPageState(); +} + +class _NewsPageState extends State { + List data = []; + final ArticleRepository _repository = HttpArticleRepository(); + + @override + void initState() { + super.initState(); + _loadData(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 4), + itemExtent: 76, + itemCount: data.length, + itemBuilder: (_, index) => MouseRegion( + cursor: SystemMouseCursors.click, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 4), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: Image.network( + data[index].cover ?? '', + width: 68, + height: 68, + fit: BoxFit.cover, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + data[index].title, + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + data[index].subtitle ?? '', + maxLines: 2, + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ], + ), + ), + ], + ), + ), + ), + )); + } + + void _loadData() async { + ApiRet> ret = await _repository.getArticlesByTag(1, + filter: const SizeFilter( + page: 1, + pageSize: 40, + )); + if (ret.success) { + data = ret.data; + setState(() {}); + } + } +} diff --git a/modules/knowledge_system/note/lib/src/view/view.dart b/modules/knowledge_system/note/lib/src/view/view.dart index 1fd229f3..d5a50f18 100644 --- a/modules/knowledge_system/note/lib/src/view/view.dart +++ b/modules/knowledge_system/note/lib/src/view/view.dart @@ -1,3 +1,4 @@ export 'article_admin.dart'; export 'art_sys_scope.dart'; -export 'mobile/mobile_article_page.dart'; \ No newline at end of file +export 'mobile/mobile_article_page.dart'; +export 'news/news_page.dart'; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart index db9dc2ac..e79767fe 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_panel/widget_panel.dart @@ -9,7 +9,7 @@ import 'package:widget_module/event/widget_event.dart'; import 'package:widget_module/widget_module.dart'; import 'package:widget_repository/widget_repository.dart'; import 'package:fx_trace/fx_trace.dart'; - +import 'package:toly_ui/toly_ui.dart'; import 'desk_widget_top_bar.dart'; import 'widget_tiled.dart'; @@ -69,7 +69,6 @@ class WidgetList extends StatelessWidget { mainAxisExtent: 110, crossAxisSpacing: 10, ); - return CustomScrollView( slivers: [ SliverToBoxAdapter( @@ -77,7 +76,8 @@ class WidgetList extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), decoration: BoxDecoration( - color: Colors.white, borderRadius: BorderRadius.circular(8)), + color: Theme.of(context).listTileTheme.tileColor, + borderRadius: BorderRadius.circular(8)), height: 180, child: header, ), diff --git a/pubspec.lock b/pubspec.lock index a8c7aee7..bd0c069e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.7" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.7.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.13.0" bloc: @@ -30,7 +30,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.4" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.2" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.0" charcode: @@ -54,7 +54,7 @@ packages: description: name: charcode sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.0" clock: @@ -62,7 +62,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.2" collection: @@ -70,7 +70,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.19.1" convert: @@ -78,7 +78,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.2" cross_file: @@ -86,7 +86,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.3.4+2" crypto: @@ -94,7 +94,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.6" csslib: @@ -102,7 +102,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" cupertino_icons: @@ -110,7 +110,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.8" dart_quill_delta: @@ -118,7 +118,7 @@ packages: description: name: dart_quill_delta sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.8.3" dash_painter: @@ -126,23 +126,23 @@ packages: description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" dev_build: dependency: transitive description: name: dev_build - sha256: de3c7b99d47f90c053dc331b8a950041426ecbe58dea21f961bb1f751ea98bb8 - url: "https://pub.flutter-io.cn/" + sha256: fda8a54458b2a873a84e0cd1513f4323a1fb0599ed5455245359bc0398bad9ee + url: "https://pub.dev/" source: hosted - version: "1.1.2+9" + version: "1.1.2+11" diff_match_patch: dependency: transitive description: name: diff_match_patch sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.1" dio: @@ -150,7 +150,7 @@ packages: description: name: dio sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.8.0+1" dio_web_adapter: @@ -158,7 +158,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.1" equatable: @@ -166,7 +166,7 @@ packages: description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.7" fake_async: @@ -174,7 +174,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.3" ffi: @@ -182,7 +182,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.4" file: @@ -190,7 +190,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.0.1" file_picker: @@ -198,7 +198,7 @@ packages: description: name: file_picker sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.1.9" file_selector_linux: @@ -206,7 +206,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.9.3+2" file_selector_platform_interface: @@ -214,7 +214,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.6.2" file_selector_windows: @@ -222,7 +222,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.9.3+4" fixnum: @@ -230,7 +230,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1" flutter: @@ -243,7 +243,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.6" flutter_colorpicker: @@ -251,7 +251,7 @@ packages: description: name: flutter_colorpicker sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" flutter_keyboard_visibility_linux: @@ -259,7 +259,7 @@ packages: description: name: flutter_keyboard_visibility_linux sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" flutter_keyboard_visibility_macos: @@ -267,7 +267,7 @@ packages: description: name: flutter_keyboard_visibility_macos sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" flutter_keyboard_visibility_platform_interface: @@ -275,7 +275,7 @@ packages: description: name: flutter_keyboard_visibility_platform_interface sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.0" flutter_keyboard_visibility_temp_fork: @@ -283,7 +283,7 @@ packages: description: name: flutter_keyboard_visibility_temp_fork sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.1.5" flutter_keyboard_visibility_windows: @@ -291,7 +291,7 @@ packages: description: name: flutter_keyboard_visibility_windows sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" flutter_lints: @@ -299,7 +299,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" flutter_localizations: @@ -312,7 +312,7 @@ packages: description: name: flutter_markdown sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.7.7+1" flutter_plugin_android_lifecycle: @@ -320,7 +320,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.28" flutter_quill: @@ -328,7 +328,7 @@ packages: description: name: flutter_quill sha256: "7e60963632bbc8615627f0bae8e178515f69ecb378ad49fa68c43c2aabf33e21" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "11.4.1" flutter_quill_delta_from_html: @@ -336,7 +336,7 @@ packages: description: name: flutter_quill_delta_from_html sha256: "4597bd0853a704696837aa6b05cffd851f587b176204c234edddfed1c1862a09" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.5.2" flutter_spinkit: @@ -344,7 +344,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.2.1" flutter_star: @@ -352,7 +352,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.0" flutter_svg: @@ -360,7 +360,7 @@ packages: description: name: flutter_svg sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.0" flutter_test: @@ -378,7 +378,7 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.1.1" fx_dao: @@ -386,7 +386,7 @@ packages: description: name: fx_dao sha256: "2564d9d954f6be1534c67e7036d0c8ce3833c0943e92b19c499edf1b9033623c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3+3" fx_dio: @@ -394,7 +394,7 @@ packages: description: name: fx_dio sha256: "395549518d055596d58ffcff59b4da0c147d855f6258f2769213c7230c090525" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.4+3" fx_env: @@ -402,7 +402,7 @@ packages: description: name: fx_env sha256: c95836ab108c498d53f43c464e08a5ce64975efdf586fb46f1a4c37bb2c400bf - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" fx_go_router_ext: @@ -410,7 +410,7 @@ packages: description: name: fx_go_router_ext sha256: dc65ac677f2058b8192ca50bdcd508a12ef4b6c150f64ca8d595b536ac6e5d1b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.6+1" fx_platform_adapter: @@ -418,7 +418,7 @@ packages: description: name: fx_platform_adapter sha256: e6d5ca554a1fd019a695a63bbb3e4eee6efe492b5d926542f22d6b64cea99415 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" fx_string: @@ -426,7 +426,7 @@ packages: description: name: fx_string sha256: "3350be2fa11cdb0d4107e4657431d05088a88795ef3145ad37902f6066a5b124" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" fx_trace: @@ -434,7 +434,7 @@ packages: description: name: fx_trace sha256: a1fb64b1a6bfc53609fe55e6d56a9c00e76250818eb5a8cfac280a051e33911c - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.5+5" go_router: @@ -442,7 +442,7 @@ packages: description: name: go_router sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "14.8.0" html: @@ -450,7 +450,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.15.6" http: @@ -458,7 +458,7 @@ packages: description: name: http sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.0" http_parser: @@ -466,7 +466,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.1.2" image: @@ -474,7 +474,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.5.4" intl: @@ -482,7 +482,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.20.2" json_annotation: @@ -490,7 +490,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.9.0" jwt_decoder: @@ -498,7 +498,7 @@ packages: description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.1" leak_tracker: @@ -506,7 +506,7 @@ packages: description: name: leak_tracker sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.0.9" leak_tracker_flutter_testing: @@ -514,7 +514,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.9" leak_tracker_testing: @@ -522,7 +522,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.0.1" lints: @@ -530,7 +530,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.0.0" logging: @@ -538,7 +538,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.3.0" markdown: @@ -546,7 +546,7 @@ packages: description: name: markdown sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.3.0" matcher: @@ -554,7 +554,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.12.17" material_color_utilities: @@ -562,7 +562,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.11.1" meta: @@ -570,7 +570,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.16.0" mime: @@ -578,7 +578,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.0.0" nested: @@ -586,7 +586,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" open_file: @@ -594,7 +594,7 @@ packages: description: name: open_file sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.5.10" open_file_android: @@ -602,7 +602,7 @@ packages: description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.6" open_file_ios: @@ -610,7 +610,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_linux: @@ -618,7 +618,7 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.5" open_file_mac: @@ -626,7 +626,7 @@ packages: description: name: open_file_mac sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_platform_interface: @@ -634,7 +634,7 @@ packages: description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.3" open_file_web: @@ -642,7 +642,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.4" open_file_windows: @@ -650,7 +650,7 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.3" package_info_plus: @@ -658,7 +658,7 @@ packages: description: name: package_info_plus sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "8.1.4" package_info_plus_platform_interface: @@ -666,7 +666,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.0" path: @@ -674,7 +674,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.9.1" path_parsing: @@ -682,7 +682,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" path_provider: @@ -690,7 +690,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.5" path_provider_android: @@ -698,7 +698,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.17" path_provider_foundation: @@ -706,7 +706,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" path_provider_linux: @@ -714,7 +714,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -722,7 +722,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.2" path_provider_windows: @@ -730,7 +730,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.0" petitparser: @@ -738,7 +738,7 @@ packages: description: name: petitparser sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.1.0" platform: @@ -746,7 +746,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -754,7 +754,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.8" pool: @@ -762,7 +762,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.5.1" posix: @@ -770,7 +770,7 @@ packages: description: name: posix sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.0.2" process_run: @@ -778,7 +778,7 @@ packages: description: name: process_run sha256: "6ec839cdd3e6de4685318e7686cd4abb523c3d3a55af0e8d32a12ae19bc66622" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.4" provider: @@ -786,7 +786,7 @@ packages: description: name: provider sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.1.5" pub_semver: @@ -794,7 +794,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.2.0" quill_native_bridge: @@ -802,7 +802,7 @@ packages: description: name: quill_native_bridge sha256: "00752aca7d67cbd3254709a47558be78427750cb81aa42cfbed354d4a079bcfa" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "11.0.1" quill_native_bridge_android: @@ -810,7 +810,7 @@ packages: description: name: quill_native_bridge_android sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1+2" quill_native_bridge_ios: @@ -818,7 +818,7 @@ packages: description: name: quill_native_bridge_ios sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" quill_native_bridge_linux: @@ -826,7 +826,7 @@ packages: description: name: quill_native_bridge_linux sha256: "5fcc60cab2ab9079e0746941f05c5ca5fec85cc050b738c8c8b9da7c09da17eb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" quill_native_bridge_macos: @@ -834,7 +834,7 @@ packages: description: name: quill_native_bridge_macos sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" quill_native_bridge_platform_interface: @@ -842,7 +842,7 @@ packages: description: name: quill_native_bridge_platform_interface sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.2+1" quill_native_bridge_web: @@ -850,7 +850,7 @@ packages: description: name: quill_native_bridge_web sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.2" quill_native_bridge_windows: @@ -858,7 +858,7 @@ packages: description: name: quill_native_bridge_windows sha256: "60e50d74238f22ceb43113d9a42b6627451dab9fc27f527b979a32051cf1da45" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.1" quiver: @@ -866,7 +866,7 @@ packages: description: name: quiver sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.2" r_upgrade: @@ -881,7 +881,7 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" screen_retriever: @@ -889,7 +889,7 @@ packages: description: name: screen_retriever sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_linux: @@ -897,7 +897,7 @@ packages: description: name: screen_retriever_linux sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_macos: @@ -905,7 +905,7 @@ packages: description: name: screen_retriever_macos sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_platform_interface: @@ -913,7 +913,7 @@ packages: description: name: screen_retriever_platform_interface sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" screen_retriever_windows: @@ -921,7 +921,7 @@ packages: description: name: screen_retriever_windows sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.0" share_plus: @@ -929,7 +929,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -937,7 +937,7 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.0.2" shared_preferences: @@ -945,7 +945,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.5.3" shared_preferences_android: @@ -953,7 +953,7 @@ packages: description: name: shared_preferences_android sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.10" shared_preferences_foundation: @@ -961,7 +961,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -969,7 +969,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -977,7 +977,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" shared_preferences_web: @@ -985,7 +985,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.3" shared_preferences_windows: @@ -993,7 +993,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" sky_engine: @@ -1006,7 +1006,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.10.1" sprintf: @@ -1014,7 +1014,7 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "7.0.0" sqflite: @@ -1022,7 +1022,7 @@ packages: description: name: sqflite sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.2" sqflite_android: @@ -1030,7 +1030,7 @@ packages: description: name: sqflite_android sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" sqflite_common: @@ -1038,7 +1038,7 @@ packages: description: name: sqflite_common sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.5.5" sqflite_common_ffi: @@ -1046,7 +1046,7 @@ packages: description: name: sqflite_common_ffi sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.5" sqflite_common_ffi_web: @@ -1054,7 +1054,7 @@ packages: description: name: sqflite_common_ffi_web sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.5+4" sqflite_darwin: @@ -1062,7 +1062,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -1070,23 +1070,23 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.0" sqlite3: dependency: transitive description: name: sqlite3 - sha256: "310af39c40dd0bb2058538333c9d9840a2725ae0b9f77e4fd09ad6696aa8f66e" - url: "https://pub.flutter-io.cn/" + sha256: c0503c69b44d5714e6abbf4c1f51a3c3cc42b75ce785f44404765e4635481d38 + url: "https://pub.dev/" source: hosted - version: "2.7.5" + version: "2.7.6" stack_trace: dependency: transitive description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.12.1" stream_channel: @@ -1094,7 +1094,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.4" stream_transform: @@ -1102,7 +1102,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.1" string_scanner: @@ -1110,7 +1110,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.1" synchronized: @@ -1118,7 +1118,7 @@ packages: description: name: synchronized sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.3.1" term_glyph: @@ -1126,7 +1126,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.2.2" test_api: @@ -1134,7 +1134,7 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.7.4" toggle_rotate: @@ -1142,39 +1142,39 @@ packages: description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.1" tolyui: dependency: "direct main" description: name: tolyui - sha256: "2c49442fd9cb1f5c89fcc5c30cded148e3abe749bea0064e9218d2bb9a47640c" - url: "https://pub.flutter-io.cn/" + sha256: "800e95b470fd013adb1d8f84944b5498cbca59307cd50ff2b3affc98c57af51e" + url: "https://pub.dev/" source: hosted - version: "0.0.4+9" + version: "0.0.4+10" tolyui_color: dependency: transitive description: name: tolyui_color sha256: e79eed0a525a584dc51df9ee5445bee190d9a9b5f14690038800c4983b2c744a - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.2" tolyui_feedback: dependency: transitive description: name: tolyui_feedback - sha256: f0d28429eec4c49e7949cf5ae8e5b0767db9865e7d88e768483b49158d7961a7 - url: "https://pub.flutter-io.cn/" + sha256: b6d67fd448a8d39762fd14266c706fc8da7671eaaaeb81f42a12e467ff4dfbf7 + url: "https://pub.dev/" source: hosted - version: "0.3.6+5" + version: "0.3.6+6" tolyui_message: dependency: transitive description: name: tolyui_message sha256: "3811b9666d90d0088c35cacfe77ef990ed6019f801000d0e39ed8f500817b3bf" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.2.6+1" tolyui_meta: @@ -1182,23 +1182,23 @@ packages: description: name: tolyui_meta sha256: "449bca06271d6c5d2a6b49192fd9176fa14b86fcd57c7317c4466a9d0b334674" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.0.2+1" tolyui_navigation: dependency: transitive description: name: tolyui_navigation - sha256: "8c4ddc82cb80982e5f1a4cdc39ebf3ceec6b50899dfef407abba3841d3b54610" - url: "https://pub.flutter-io.cn/" + sha256: "9fe5eddb1b8f9c178f81a507937815e9e7e7b4872ac70dd567428cd41c84e2e1" + url: "https://pub.dev/" source: hosted - version: "0.2.0" + version: "0.2.0+3" tolyui_rx_layout: dependency: transitive description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.0" two_dimensional_scrollables: @@ -1206,7 +1206,7 @@ packages: description: name: two_dimensional_scrollables sha256: "1b0b29095d86df509d115ac668f85c3fcb0bd1554ccf89c289ca4769bead49db" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.3.4" typed_data: @@ -1214,7 +1214,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.4.0" url_launcher: @@ -1222,7 +1222,7 @@ packages: description: name: url_launcher sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.1" url_launcher_android: @@ -1230,7 +1230,7 @@ packages: description: name: url_launcher_android sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.16" url_launcher_ios: @@ -1238,7 +1238,7 @@ packages: description: name: url_launcher_ios sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.3.3" url_launcher_linux: @@ -1246,7 +1246,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.1" url_launcher_macos: @@ -1254,7 +1254,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -1262,7 +1262,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.3.2" url_launcher_web: @@ -1270,7 +1270,7 @@ packages: description: name: url_launcher_web sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.4.1" url_launcher_windows: @@ -1278,7 +1278,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.4" uuid: @@ -1286,7 +1286,7 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.5.1" vector_graphics: @@ -1294,7 +1294,7 @@ packages: description: name: vector_graphics sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.18" vector_graphics_codec: @@ -1302,7 +1302,7 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -1310,7 +1310,7 @@ packages: description: name: vector_graphics_compiler sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.16" vector_math: @@ -1318,7 +1318,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.1.4" vm_service: @@ -1326,7 +1326,7 @@ packages: description: name: vm_service sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "15.0.0" web: @@ -1334,7 +1334,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.1" webview_flutter: @@ -1342,7 +1342,7 @@ packages: description: name: webview_flutter sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.13.0" webview_flutter_android: @@ -1350,7 +1350,7 @@ packages: description: name: webview_flutter_android sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "4.7.0" webview_flutter_platform_interface: @@ -1358,7 +1358,7 @@ packages: description: name: webview_flutter_platform_interface sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "2.13.0" webview_flutter_wkwebview: @@ -1366,7 +1366,7 @@ packages: description: name: webview_flutter_wkwebview sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.22.0" widget_repository: @@ -1381,7 +1381,7 @@ packages: description: name: win32 sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "5.13.0" window_manager: @@ -1389,7 +1389,7 @@ packages: description: name: window_manager sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "0.4.3" wrapper: @@ -1397,7 +1397,7 @@ packages: description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.0.2" xdg_directories: @@ -1405,7 +1405,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "1.1.0" xml: @@ -1413,7 +1413,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "6.5.0" yaml: @@ -1421,7 +1421,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn/" + url: "https://pub.dev/" source: hosted version: "3.1.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index d07fdc90..db178e45 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.2.0 +version: 3.2.0+2002 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts @@ -64,7 +64,7 @@ dependencies: package_info_plus: 8.1.4 # 视图展示 - tolyui: 0.0.4+9 # tolyui + tolyui: 0.0.4+10 # tolyui refresh: ^1.0.1 # 下拉刷新 dash_painter: ^1.0.2 # 虚线 flutter_star: ^1.0.2 # 星星组件 From bcc8542da211564aed678b0e61ee0214cd461208 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 24 May 2025 17:28:12 +0800 Subject: [PATCH 148/149] fix:l10n --- doc/version/3.1.0.md | 10 ++++++++++ doc/version/3.2.0.md | 9 +++++++++ modules/knowledge_system/note/pubspec.yaml | 2 +- modules/widget_system/widget_repository/pubspec.yaml | 2 +- pubspec.yaml | 4 ++-- 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 doc/version/3.1.0.md create mode 100644 doc/version/3.2.0.md diff --git a/doc/version/3.1.0.md b/doc/version/3.1.0.md new file mode 100644 index 00000000..d551bad2 --- /dev/null +++ b/doc/version/3.1.0.md @@ -0,0 +1,10 @@ +桌面版: +windows/macos 支持应用内更新,优化更新过程交互 +增加: 知识集锦/布局宝库 +增加 Ctrl+F 全局搜索功能 + +全端: +增加收录组件,目前共 354 个 +支持寻路算法演绎 +优化组件详情展示 +支持复制局部代码 diff --git a/doc/version/3.2.0.md b/doc/version/3.2.0.md new file mode 100644 index 00000000..9afbc216 --- /dev/null +++ b/doc/version/3.2.0.md @@ -0,0 +1,9 @@ +全端: +增加最新咨询功能 +优化组件列表展示,增加logo设计图 +增加世界留言板 +优化项目结构 +组件数据支持 10 国语言国际化 + +下载失败,可到下面网站下载最新版 +https://gitee.com/toly1994328/FlutterUnit/releases \ No newline at end of file diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml index f007537b..04cb81d8 100644 --- a/modules/knowledge_system/note/pubspec.yaml +++ b/modules/knowledge_system/note/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: flutter: sdk: flutter fx_dio: 0.0.4+3 - fx_dao: 0.0.3+3 + fx_dao: 0.0.3+4 flutter_bloc: ^8.1.6 # 状态管理 two_dimensional_scrollables: ^0.3.3 flutter_quill: ^11.0.0-dev.21 diff --git a/modules/widget_system/widget_repository/pubspec.yaml b/modules/widget_system/widget_repository/pubspec.yaml index 2f417ff7..895e78c9 100644 --- a/modules/widget_system/widget_repository/pubspec.yaml +++ b/modules/widget_system/widget_repository/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter equatable: ^2.0.5 # 相等辅助 intl: ^0.19.0 # 相等辅助 - fx_dao: 0.0.3+3 # 数据库 + fx_dao: 0.0.3+4 # 数据库 storage: path: ../../basic_system/storage utils: diff --git a/pubspec.yaml b/pubspec.yaml index db178e45..80339e0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: All Platform Flutter Experience App. publish_to: none -version: 3.2.0+2002 +version: 3.1.0+2002 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts @@ -44,7 +44,7 @@ dependencies: ## fx 架构 fx_platform_adapter: 0.0.3 # 平台适配器 fx_go_router_ext: 0.0.6+1 # 路由 - fx_dao: 0.0.3+3 + fx_dao: 0.0.3+4 fx_dio: 0.0.4+3 fx_boot_starter: 0.1.1 # app 启动器 fx_trace: 0.0.5+5 # 异常追踪/监听 From 6983ae0581102d2a118d2b081f441c9c4125256b Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 31 May 2025 05:39:49 +0800 Subject: [PATCH 149/149] fix: desktop tap link widget --- lib/src/starter/start_repository.dart | 17 +- .../app/lib/app/cons/global_value.dart | 4 +- .../app/lib/app/cons/path_unit.dart | 11 +- .../app/lib/app/cons/str_unit.dart | 2 +- .../app/lib/app_config/bloc/bloc.dart | 19 +- modules/basic_system/app/lib/event/api.dart | 3 +- .../basic_system/app/lib/news/cacheable.dart | 2 +- .../lib/src/sp_storage/sp_storage.dart | 7 +- .../widget_detail/widget_detail_panel.dart | 11 +- pubspec.lock | 354 +++++++++--------- 10 files changed, 202 insertions(+), 228 deletions(-) diff --git a/lib/src/starter/start_repository.dart b/lib/src/starter/start_repository.dart index 983db97c..86aea38b 100644 --- a/lib/src/starter/start_repository.dart +++ b/lib/src/starter/start_repository.dart @@ -6,9 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:fx_boot_starter/fx_boot_starter.dart'; -// import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/services.dart'; -import 'package:fx_dio/fx_dio.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:storage/storage.dart'; import 'package:path/path.dart' as path; @@ -20,36 +18,29 @@ class FlutterUnitStartRepo implements AppStartRepository { const FlutterUnitStartRepo(); /// 初始化 app 的异步任务 - /// 返回本地持久化的 AppConfigState 对象 + /// 返回本地持久化的 AppConfig 对象 @override Future initApp() async { WidgetsFlutterBinding.ensureInitialized(); // 滚动性能优化 1.22.0 GestureBinding.instance.resamplingEnabled = true; WindowSizeAdapter.setSize(); - // throw 'Test Debug Start Error'; - await SpStorage.instance.initSp(); + await SpStorage().initSp(); await initAppMeta(); registerHttpClient(); NoteEnv().attachBridge(UnitNoteBridge()); if (!kAppEnv.isWeb) await initDb(); HttpUtil.instance.rebase(PathUnit.baseUrl); - AppConfigPo po = await SpStorage.instance.appConfig.read(); - // List netConnect = - // await (Connectivity().checkConnectivity()); + AppConfigPo po = await SpStorage().appConfig.read(); AppConfig state = AppConfig.fromPo(po); - // if (netConnect.isNotEmpty) { - // state = state.copyWith(netConnect: netConnect.first); - // } return state; } Future initDb() async { //数据库不存在,执行拷贝 String dbPath = await AppStorage().flutter.dbpath; - await SpStorage.instance.initSp(); - bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage.instance.spf); + bool shouldCopy = await _checkShouldCopy(dbPath, SpStorage().spf); if (shouldCopy) { await _doCopyAssetsDb(dbPath); } else { diff --git a/modules/basic_system/app/lib/app/cons/global_value.dart b/modules/basic_system/app/lib/app/cons/global_value.dart index 2954628b..3e1babfa 100644 --- a/modules/basic_system/app/lib/app/cons/global_value.dart +++ b/modules/basic_system/app/lib/app/cons/global_value.dart @@ -31,10 +31,10 @@ class AppMeta { } Future initAppMeta() async { - String? uuid = SpStorage.instance.spf.getString('uuid'); + String? uuid = SpStorage().spf.getString('uuid'); if (uuid == null) { uuid = const Uuid().v4(); - SpStorage.instance.spf.setString('uuid', uuid); + SpStorage().spf.setString('uuid', uuid); } String version = kAppVersion; String appId = '1'; diff --git a/modules/basic_system/app/lib/app/cons/path_unit.dart b/modules/basic_system/app/lib/app/cons/path_unit.dart index e8d45cb3..274128ac 100644 --- a/modules/basic_system/app/lib/app/cons/path_unit.dart +++ b/modules/basic_system/app/lib/app/cons/path_unit.dart @@ -1,11 +1,9 @@ /// create by 张风捷特烈 on 2021/1/17 /// contact me by email 1981462002@qq.com -/// 说明: +/// 说明: -class PathUnit{ - - static const baseUrl='http://82.157.176.209:8080/api/v1'; - // static const baseUrl='http://192.168.0.100:8080/api/v1'; +class PathUnit { + static const baseUrl = 'http://82.157.176.209:8080/api/v1'; static const sendEmail = '/sendEmail/'; static const register = '/register'; @@ -15,5 +13,4 @@ class PathUnit{ static const appInfo = '/appInfo/name'; static const login = '/login'; - -} \ No newline at end of file +} diff --git a/modules/basic_system/app/lib/app/cons/str_unit.dart b/modules/basic_system/app/lib/app/cons/str_unit.dart index ef3a7167..4345dadd 100644 --- a/modules/basic_system/app/lib/app/cons/str_unit.dart +++ b/modules/basic_system/app/lib/app/cons/str_unit.dart @@ -7,7 +7,7 @@ import 'package:l10n/l10n.dart'; class StrUnit { // 小文字大小 - static const String version = 'V3.0.0'; + static const String version = 'V3.2.0'; static const String appName = 'Flutter Unit'; static String galleryDesc(BuildContext context) => """ diff --git a/modules/basic_system/app/lib/app_config/bloc/bloc.dart b/modules/basic_system/app/lib/app_config/bloc/bloc.dart index 53dbc538..0380a6c2 100644 --- a/modules/basic_system/app/lib/app_config/bloc/bloc.dart +++ b/modules/basic_system/app/lib/app_config/bloc/bloc.dart @@ -12,22 +12,7 @@ import 'package:storage/storage.dart'; /// 说明: 全局信息的bloc class AppConfigBloc extends Cubit { - // final Connectivity _connectivity = Connectivity(); - - // late StreamSubscription> _subscription; - - AppConfigBloc() : super(const AppConfig()) { - // _subscription = - // _connectivity.onConnectivityChanged.listen(_onNetConnectChange); - } - - // void _onNetConnectChange(List event) { - // if (event.isNotEmpty) { - // emit(state.copyWith( - // netConnect: event.first, - // )); - // } - // } + AppConfigBloc() : super(const AppConfig()); @override Future close() async { @@ -39,7 +24,7 @@ class AppConfigBloc extends Cubit { emit(state); } - AppConfigCao get cao => SpStorage.instance.appConfig; + AppConfigCao get cao => SpStorage().appConfig; // 切换字体事件处理 : 固化索引 + 产出新状态 void switchFontFamily(String family) async { diff --git a/modules/basic_system/app/lib/event/api.dart b/modules/basic_system/app/lib/event/api.dart index ad1e4fdc..04dce8d9 100644 --- a/modules/basic_system/app/lib/event/api.dart +++ b/modules/basic_system/app/lib/event/api.dart @@ -1,12 +1,13 @@ import 'package:app/app.dart'; +import 'package:flutter/foundation.dart'; import 'package:fx_dio/fx_dio.dart'; void sendEvent(int id, {String? extra}) async { + if (kDebugMode) return; Host host = FxDio()(); ApiRet ret = await host.post( '/event', data: {"event": id}, convertor: (data) => data, ); - print(ret.toString()); } diff --git a/modules/basic_system/app/lib/news/cacheable.dart b/modules/basic_system/app/lib/news/cacheable.dart index 779a84fa..5b033ed9 100644 --- a/modules/basic_system/app/lib/news/cacheable.dart +++ b/modules/basic_system/app/lib/news/cacheable.dart @@ -17,7 +17,7 @@ mixin TimeoutCache on Cacheable { int get maxCacheMs => 1000 * 60 * 30; - SharedPreferences get spf => SpStorage.instance.spf; + SharedPreferences get spf => SpStorage().spf; ConvertorList get convertor; diff --git a/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart b/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart index a02d4337..98b06559 100644 --- a/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart +++ b/modules/basic_system/storage/lib/src/sp_storage/sp_storage.dart @@ -5,12 +5,9 @@ import 'cao/app_config_cao.dart'; class SpStorage { SpStorage._(); - static SpStorage? _storage; + static final SpStorage _instance = SpStorage._(); - static SpStorage get instance { - _storage = _storage ?? SpStorage._(); - return _storage!; - } + factory SpStorage() => _instance; SharedPreferences? _sp; diff --git a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart index 4ded52a2..ea3b269a 100644 --- a/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart +++ b/modules/widget_system/widget_module/lib/views/desk_ui/widget_detail/widget_detail_panel.dart @@ -10,6 +10,7 @@ import '../../components/widget_logo_map.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:l10n/l10n.dart'; import 'link_widget_buttons.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; class DeskWidgetDetailPanel extends StatelessWidget { final WidgetModel model; @@ -54,14 +55,15 @@ class DeskWidgetDetailPanel extends StatelessWidget { Panel( color: Color(0x33E5EAE1), child: Text(model.info), - ), const SizedBox(height: 16), linkText(context), if (state is DetailWithData) LinkWidgetButtons( links: (state as DetailWithData).links, - onSelect: (v) {}) + onSelect: (v) { + context.read().push(v); + }) ], ), ); @@ -82,7 +84,7 @@ class DeskWidgetDetailPanel extends StatelessWidget { ), StarScore( score: model.lever, - star: Star(size: 15, fillColor:color), + star: Star(size: 15, fillColor: color), ) ], ); @@ -96,7 +98,8 @@ class WidgetLogo extends StatelessWidget { const WidgetLogo({ super.key, required this.background, - required this.widgetName, required this.widgetId, + required this.widgetName, + required this.widgetId, }); @override diff --git a/pubspec.lock b/pubspec.lock index bd0c069e..35cb81af 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.7" args: @@ -14,7 +14,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.7.0" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.13.0" bloc: @@ -30,7 +30,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.4" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" charcode: @@ -54,7 +54,7 @@ packages: description: name: charcode sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" clock: @@ -62,7 +62,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.2" collection: @@ -70,7 +70,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.19.1" convert: @@ -78,7 +78,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.2" cross_file: @@ -86,7 +86,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.4+2" crypto: @@ -94,7 +94,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.6" csslib: @@ -102,7 +102,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" cupertino_icons: @@ -110,7 +110,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.8" dart_quill_delta: @@ -118,7 +118,7 @@ packages: description: name: dart_quill_delta sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.8.3" dash_painter: @@ -126,7 +126,7 @@ packages: description: name: dash_painter sha256: e0b24070aed0549f9139ef1276ca70c155fe78960ec624d6dec3cdb0502f9a2a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" dev_build: @@ -134,7 +134,7 @@ packages: description: name: dev_build sha256: fda8a54458b2a873a84e0cd1513f4323a1fb0599ed5455245359bc0398bad9ee - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.2+11" diff_match_patch: @@ -142,7 +142,7 @@ packages: description: name: diff_match_patch sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.1" dio: @@ -150,7 +150,7 @@ packages: description: name: dio sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.8.0+1" dio_web_adapter: @@ -158,7 +158,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.1" equatable: @@ -166,7 +166,7 @@ packages: description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.7" fake_async: @@ -174,7 +174,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.3" ffi: @@ -182,7 +182,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" file: @@ -190,7 +190,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.1" file_picker: @@ -198,7 +198,7 @@ packages: description: name: file_picker sha256: "77f8e81d22d2a07d0dee2c62e1dda71dc1da73bf43bb2d45af09727406167964" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.1.9" file_selector_linux: @@ -206,7 +206,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.9.3+2" file_selector_platform_interface: @@ -214,7 +214,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.6.2" file_selector_windows: @@ -222,7 +222,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.9.3+4" fixnum: @@ -230,7 +230,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" flutter: @@ -243,7 +243,7 @@ packages: description: name: flutter_bloc sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.6" flutter_colorpicker: @@ -251,7 +251,7 @@ packages: description: name: flutter_colorpicker sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" flutter_keyboard_visibility_linux: @@ -259,7 +259,7 @@ packages: description: name: flutter_keyboard_visibility_linux sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_keyboard_visibility_macos: @@ -267,7 +267,7 @@ packages: description: name: flutter_keyboard_visibility_macos sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_keyboard_visibility_platform_interface: @@ -275,7 +275,7 @@ packages: description: name: flutter_keyboard_visibility_platform_interface sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" flutter_keyboard_visibility_temp_fork: @@ -283,7 +283,7 @@ packages: description: name: flutter_keyboard_visibility_temp_fork sha256: e3d02900640fbc1129245540db16944a0898b8be81694f4bf04b6c985bed9048 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.5" flutter_keyboard_visibility_windows: @@ -291,7 +291,7 @@ packages: description: name: flutter_keyboard_visibility_windows sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" flutter_lints: @@ -299,7 +299,7 @@ packages: description: name: flutter_lints sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" flutter_localizations: @@ -312,7 +312,7 @@ packages: description: name: flutter_markdown sha256: "08fb8315236099ff8e90cb87bb2b935e0a724a3af1623000a9cec930468e0f27" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.7+1" flutter_plugin_android_lifecycle: @@ -320,7 +320,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.28" flutter_quill: @@ -328,7 +328,7 @@ packages: description: name: flutter_quill sha256: "7e60963632bbc8615627f0bae8e178515f69ecb378ad49fa68c43c2aabf33e21" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "11.4.1" flutter_quill_delta_from_html: @@ -336,7 +336,7 @@ packages: description: name: flutter_quill_delta_from_html sha256: "4597bd0853a704696837aa6b05cffd851f587b176204c234edddfed1c1862a09" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.5.2" flutter_spinkit: @@ -344,7 +344,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.2.1" flutter_star: @@ -352,7 +352,7 @@ packages: description: name: flutter_star sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.0" flutter_svg: @@ -360,7 +360,7 @@ packages: description: name: flutter_svg sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.0" flutter_test: @@ -378,23 +378,23 @@ packages: description: name: fx_boot_starter sha256: cdc3d6e31a2609214468cb858f071b7f8f8de5731093b1a11305a457557bdf96 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.1.1" fx_dao: dependency: "direct main" description: name: fx_dao - sha256: "2564d9d954f6be1534c67e7036d0c8ce3833c0943e92b19c499edf1b9033623c" - url: "https://pub.dev/" + sha256: "253381288b921b9ad5e193d5e48531b71ad0c4511be66146603c65d36d2e995b" + url: "https://pub.flutter-io.cn/" source: hosted - version: "0.0.3+3" + version: "0.0.3+4" fx_dio: dependency: "direct main" description: name: fx_dio sha256: "395549518d055596d58ffcff59b4da0c147d855f6258f2769213c7230c090525" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4+3" fx_env: @@ -402,7 +402,7 @@ packages: description: name: fx_env sha256: c95836ab108c498d53f43c464e08a5ce64975efdf586fb46f1a4c37bb2c400bf - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" fx_go_router_ext: @@ -410,7 +410,7 @@ packages: description: name: fx_go_router_ext sha256: dc65ac677f2058b8192ca50bdcd508a12ef4b6c150f64ca8d595b536ac6e5d1b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.6+1" fx_platform_adapter: @@ -418,7 +418,7 @@ packages: description: name: fx_platform_adapter sha256: e6d5ca554a1fd019a695a63bbb3e4eee6efe492b5d926542f22d6b64cea99415 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" fx_string: @@ -426,7 +426,7 @@ packages: description: name: fx_string sha256: "3350be2fa11cdb0d4107e4657431d05088a88795ef3145ad37902f6066a5b124" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" fx_trace: @@ -434,7 +434,7 @@ packages: description: name: fx_trace sha256: a1fb64b1a6bfc53609fe55e6d56a9c00e76250818eb5a8cfac280a051e33911c - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5+5" go_router: @@ -442,7 +442,7 @@ packages: description: name: go_router sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "14.8.0" html: @@ -450,7 +450,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.15.6" http: @@ -458,7 +458,7 @@ packages: description: name: http sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" http_parser: @@ -466,7 +466,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.1.2" image: @@ -474,7 +474,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.4" intl: @@ -482,7 +482,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.20.2" json_annotation: @@ -490,7 +490,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.9.0" jwt_decoder: @@ -498,7 +498,7 @@ packages: description: name: jwt_decoder sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.1" leak_tracker: @@ -506,7 +506,7 @@ packages: description: name: leak_tracker sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.0.9" leak_tracker_flutter_testing: @@ -514,7 +514,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.9" leak_tracker_testing: @@ -522,7 +522,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.0.1" lints: @@ -530,7 +530,7 @@ packages: description: name: lints sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.0.0" logging: @@ -538,7 +538,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.3.0" markdown: @@ -546,7 +546,7 @@ packages: description: name: markdown sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.3.0" matcher: @@ -554,7 +554,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.12.17" material_color_utilities: @@ -562,7 +562,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.11.1" meta: @@ -570,7 +570,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.16.0" mime: @@ -578,7 +578,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.0.0" nested: @@ -586,7 +586,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" open_file: @@ -594,7 +594,7 @@ packages: description: name: open_file sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.5.10" open_file_android: @@ -602,7 +602,7 @@ packages: description: name: open_file_android sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.6" open_file_ios: @@ -610,7 +610,7 @@ packages: description: name: open_file_ios sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_linux: @@ -618,7 +618,7 @@ packages: description: name: open_file_linux sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.5" open_file_mac: @@ -626,7 +626,7 @@ packages: description: name: open_file_mac sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_platform_interface: @@ -634,7 +634,7 @@ packages: description: name: open_file_platform_interface sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.3" open_file_web: @@ -642,7 +642,7 @@ packages: description: name: open_file_web sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4" open_file_windows: @@ -650,7 +650,7 @@ packages: description: name: open_file_windows sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.3" package_info_plus: @@ -658,7 +658,7 @@ packages: description: name: package_info_plus sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "8.1.4" package_info_plus_platform_interface: @@ -666,7 +666,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.0" path: @@ -674,7 +674,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.9.1" path_parsing: @@ -682,7 +682,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" path_provider: @@ -690,7 +690,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.5" path_provider_android: @@ -698,7 +698,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.17" path_provider_foundation: @@ -706,7 +706,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" path_provider_linux: @@ -714,7 +714,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -722,7 +722,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.2" path_provider_windows: @@ -730,7 +730,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.0" petitparser: @@ -738,7 +738,7 @@ packages: description: name: petitparser sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.1.0" platform: @@ -746,7 +746,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -754,7 +754,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.8" pool: @@ -762,7 +762,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.5.1" posix: @@ -770,7 +770,7 @@ packages: description: name: posix sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.0.2" process_run: @@ -778,7 +778,7 @@ packages: description: name: process_run sha256: "6ec839cdd3e6de4685318e7686cd4abb523c3d3a55af0e8d32a12ae19bc66622" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.4" provider: @@ -786,7 +786,7 @@ packages: description: name: provider sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.1.5" pub_semver: @@ -794,7 +794,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.2.0" quill_native_bridge: @@ -802,7 +802,7 @@ packages: description: name: quill_native_bridge sha256: "00752aca7d67cbd3254709a47558be78427750cb81aa42cfbed354d4a079bcfa" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "11.0.1" quill_native_bridge_android: @@ -810,7 +810,7 @@ packages: description: name: quill_native_bridge_android sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1+2" quill_native_bridge_ios: @@ -818,7 +818,7 @@ packages: description: name: quill_native_bridge_ios sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_linux: @@ -826,7 +826,7 @@ packages: description: name: quill_native_bridge_linux sha256: "5fcc60cab2ab9079e0746941f05c5ca5fec85cc050b738c8c8b9da7c09da17eb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_macos: @@ -834,7 +834,7 @@ packages: description: name: quill_native_bridge_macos sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quill_native_bridge_platform_interface: @@ -842,7 +842,7 @@ packages: description: name: quill_native_bridge_platform_interface sha256: "8264a2bdb8a294c31377a27b46c0f8717fa9f968cf113f7dc52d332ed9c84526" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+1" quill_native_bridge_web: @@ -850,7 +850,7 @@ packages: description: name: quill_native_bridge_web sha256: "7c723f6824b0250d7f33e8b6c23f2f8eb0103fe48ee7ebf47ab6786b64d5c05d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2" quill_native_bridge_windows: @@ -858,7 +858,7 @@ packages: description: name: quill_native_bridge_windows sha256: "60e50d74238f22ceb43113d9a42b6627451dab9fc27f527b979a32051cf1da45" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.1" quiver: @@ -866,7 +866,7 @@ packages: description: name: quiver sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.2" r_upgrade: @@ -881,7 +881,7 @@ packages: description: name: refresh sha256: cbf2254cd1a54135855c9a544af1e1c25472781a9f2c973e56b2068907d669dc - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" screen_retriever: @@ -889,7 +889,7 @@ packages: description: name: screen_retriever sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_linux: @@ -897,7 +897,7 @@ packages: description: name: screen_retriever_linux sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_macos: @@ -905,7 +905,7 @@ packages: description: name: screen_retriever_macos sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_platform_interface: @@ -913,7 +913,7 @@ packages: description: name: screen_retriever_platform_interface sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" screen_retriever_windows: @@ -921,7 +921,7 @@ packages: description: name: screen_retriever_windows sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0" share_plus: @@ -929,7 +929,7 @@ packages: description: name: share_plus sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "10.1.4" share_plus_platform_interface: @@ -937,7 +937,7 @@ packages: description: name: share_plus_platform_interface sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.0.2" shared_preferences: @@ -945,7 +945,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.3" shared_preferences_android: @@ -953,7 +953,7 @@ packages: description: name: shared_preferences_android sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.10" shared_preferences_foundation: @@ -961,7 +961,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -969,7 +969,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -977,7 +977,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" shared_preferences_web: @@ -985,7 +985,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.3" shared_preferences_windows: @@ -993,7 +993,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" sky_engine: @@ -1006,7 +1006,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.10.1" sprintf: @@ -1014,7 +1014,7 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "7.0.0" sqflite: @@ -1022,7 +1022,7 @@ packages: description: name: sqflite sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.2" sqflite_android: @@ -1030,7 +1030,7 @@ packages: description: name: sqflite_android sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" sqflite_common: @@ -1038,7 +1038,7 @@ packages: description: name: sqflite_common sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.5.5" sqflite_common_ffi: @@ -1046,7 +1046,7 @@ packages: description: name: sqflite_common_ffi sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.5" sqflite_common_ffi_web: @@ -1054,7 +1054,7 @@ packages: description: name: sqflite_common_ffi_web sha256: "61ea702e7aba727f28be7ead00b84c19c745cd4a4934d0c41473303df11ac9ea" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.5+4" sqflite_darwin: @@ -1062,7 +1062,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -1070,7 +1070,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.0" sqlite3: @@ -1078,7 +1078,7 @@ packages: description: name: sqlite3 sha256: c0503c69b44d5714e6abbf4c1f51a3c3cc42b75ce785f44404765e4635481d38 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.7.6" stack_trace: @@ -1086,7 +1086,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.12.1" stream_channel: @@ -1094,7 +1094,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" stream_transform: @@ -1102,7 +1102,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.1" string_scanner: @@ -1110,7 +1110,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.1" synchronized: @@ -1118,7 +1118,7 @@ packages: description: name: synchronized sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.3.1" term_glyph: @@ -1126,7 +1126,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.2.2" test_api: @@ -1134,7 +1134,7 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.7.4" toggle_rotate: @@ -1142,7 +1142,7 @@ packages: description: name: toggle_rotate sha256: "601eba9b41ea8cb2d8765f5b8cb59ef9a8b2f36c592389e846b3aba20d2fc3f2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.1" tolyui: @@ -1150,7 +1150,7 @@ packages: description: name: tolyui sha256: "800e95b470fd013adb1d8f84944b5498cbca59307cd50ff2b3affc98c57af51e" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.4+10" tolyui_color: @@ -1158,7 +1158,7 @@ packages: description: name: tolyui_color sha256: e79eed0a525a584dc51df9ee5445bee190d9a9b5f14690038800c4983b2c744a - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2" tolyui_feedback: @@ -1166,7 +1166,7 @@ packages: description: name: tolyui_feedback sha256: b6d67fd448a8d39762fd14266c706fc8da7671eaaaeb81f42a12e467ff4dfbf7 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.6+6" tolyui_message: @@ -1174,7 +1174,7 @@ packages: description: name: tolyui_message sha256: "3811b9666d90d0088c35cacfe77ef990ed6019f801000d0e39ed8f500817b3bf" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.6+1" tolyui_meta: @@ -1182,7 +1182,7 @@ packages: description: name: tolyui_meta sha256: "449bca06271d6c5d2a6b49192fd9176fa14b86fcd57c7317c4466a9d0b334674" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.0.2+1" tolyui_navigation: @@ -1190,7 +1190,7 @@ packages: description: name: tolyui_navigation sha256: "9fe5eddb1b8f9c178f81a507937815e9e7e7b4872ac70dd567428cd41c84e2e1" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.2.0+3" tolyui_rx_layout: @@ -1198,7 +1198,7 @@ packages: description: name: tolyui_rx_layout sha256: "559198f0bc1d2b3d2beb75be54ae17b8d9fc4276d7ff099967e8007450ce0719" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.0" two_dimensional_scrollables: @@ -1206,7 +1206,7 @@ packages: description: name: two_dimensional_scrollables sha256: "1b0b29095d86df509d115ac668f85c3fcb0bd1554ccf89c289ca4769bead49db" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.3.4" typed_data: @@ -1214,7 +1214,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.4.0" url_launcher: @@ -1222,7 +1222,7 @@ packages: description: name: url_launcher sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.1" url_launcher_android: @@ -1230,7 +1230,7 @@ packages: description: name: url_launcher_android sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.16" url_launcher_ios: @@ -1238,7 +1238,7 @@ packages: description: name: url_launcher_ios sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.3.3" url_launcher_linux: @@ -1246,7 +1246,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.1" url_launcher_macos: @@ -1254,7 +1254,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -1262,7 +1262,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.3.2" url_launcher_web: @@ -1270,7 +1270,7 @@ packages: description: name: url_launcher_web sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.4.1" url_launcher_windows: @@ -1278,7 +1278,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.4" uuid: @@ -1286,7 +1286,7 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.5.1" vector_graphics: @@ -1294,7 +1294,7 @@ packages: description: name: vector_graphics sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.18" vector_graphics_codec: @@ -1302,23 +1302,23 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.13" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.dev/" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" + url: "https://pub.flutter-io.cn/" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.1.4" vm_service: @@ -1326,7 +1326,7 @@ packages: description: name: vm_service sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "15.0.0" web: @@ -1334,7 +1334,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.1" webview_flutter: @@ -1342,7 +1342,7 @@ packages: description: name: webview_flutter sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.13.0" webview_flutter_android: @@ -1350,7 +1350,7 @@ packages: description: name: webview_flutter_android sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "4.7.0" webview_flutter_platform_interface: @@ -1358,7 +1358,7 @@ packages: description: name: webview_flutter_platform_interface sha256: "7cb32b21825bd65569665c32bb00a34ded5779786d6201f5350979d2d529940d" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "2.13.0" webview_flutter_wkwebview: @@ -1366,7 +1366,7 @@ packages: description: name: webview_flutter_wkwebview sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.22.0" widget_repository: @@ -1381,7 +1381,7 @@ packages: description: name: win32 sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "5.13.0" window_manager: @@ -1389,7 +1389,7 @@ packages: description: name: window_manager sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "0.4.3" wrapper: @@ -1397,7 +1397,7 @@ packages: description: name: wrapper sha256: "35b6d3c1ce4d739756b24571c394f2267fc89f35381098986800f094d468fbf5" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.0.2" xdg_directories: @@ -1405,7 +1405,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "1.1.0" xml: @@ -1413,7 +1413,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "6.5.0" yaml: @@ -1421,7 +1421,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev/" + url: "https://pub.flutter-io.cn/" source: hosted version: "3.1.3" sdks:

    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�e9S7p^>=F!R{|U9x(g@vqiD2HGXttvQ6JvM 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�CRf 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 wk8b>D + + + + + + + + + + + + + + + + + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java new file mode 100644 index 00000000..50ecd2b1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradeFileProvider.java @@ -0,0 +1,6 @@ +package com.example.r_upgrade; + +import androidx.core.content.FileProvider; + +public class RUpgradeFileProvider extends FileProvider { +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java new file mode 100644 index 00000000..007a8dac --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/RUpgradePlugin.java @@ -0,0 +1,105 @@ +package com.example.r_upgrade; + +import android.app.Activity; +import android.content.Intent; + +import androidx.annotation.NonNull; + +import com.example.r_upgrade.common.DownloadPermissions; +import com.example.r_upgrade.common.manager.UpgradeManager; +import com.example.r_upgrade.common.UpgradeService; +import com.example.r_upgrade.method.RUpgradeMethodCallHandler; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.PluginRegistry; +import io.flutter.plugin.common.PluginRegistry.Registrar; + +/** + * RUpgradePlugin + */ +public class RUpgradePlugin implements FlutterPlugin, ActivityAware { + private static final String PLUGIN_METHOD_NAME = "com.rhyme/r_upgrade_method"; + + private MethodChannel _channel; + private UpgradeManager upgradeManager; + private FlutterPluginBinding flutterPluginBinding; + + public RUpgradePlugin() { + + } + + private RUpgradePlugin(Activity activity, BinaryMessenger messenger, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + initPlugin(activity, messenger, permissionsRegistry); + } + + private void initPlugin(Activity activity, BinaryMessenger messenger, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + _channel = new MethodChannel(messenger, PLUGIN_METHOD_NAME); + upgradeManager = new UpgradeManager(activity, _channel, new DownloadPermissions(), permissionsRegistry); + _channel.setMethodCallHandler(new RUpgradeMethodCallHandler(upgradeManager)); + } + + /** + * Plugin registration. + */ + public static void registerWith(final Registrar registrar) { + + new RUpgradePlugin(registrar.activity(), registrar.messenger(), new DownloadPermissions.PermissionsRegistry() { + @Override + public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { + registrar.addRequestPermissionsResultListener(handler); + } + }); + } + + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + this.flutterPluginBinding = binding; + + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + onDetachedFromActivity(); + flutterPluginBinding = null; + } + + + @Override + public void onAttachedToActivity(@NonNull final ActivityPluginBinding binding) { + initPlugin(binding.getActivity(), flutterPluginBinding.getBinaryMessenger(), new DownloadPermissions.PermissionsRegistry() { + @Override + public void addListener(PluginRegistry.RequestPermissionsResultListener handler) { + binding.addRequestPermissionsResultListener(handler); + } + }); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); + } + + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } + + @Override + public void onDetachedFromActivity() { + Intent intent = new Intent(flutterPluginBinding.getApplicationContext(), UpgradeService.class); + flutterPluginBinding.getApplicationContext().stopService(intent); + if (upgradeManager != null) { + upgradeManager.dispose(); + upgradeManager = null; + } + if (_channel != null) { + _channel.setMethodCallHandler(null); + _channel = null; + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java new file mode 100644 index 00000000..dfaaae42 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadPermissions.java @@ -0,0 +1,139 @@ +package com.example.r_upgrade.common; + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; + +import androidx.annotation.RequiresApi; +import androidx.annotation.VisibleForTesting; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import io.flutter.plugin.common.PluginRegistry; + +public class DownloadPermissions { + public interface PermissionsRegistry { + void addListener(PluginRegistry.RequestPermissionsResultListener handler); + } + + public interface ResultCallback { + void onResult(String errorCode, String errorDescription); + } + + private static final int STORAGE_REQUEST_ID = 9790; + private boolean ongoing = false; + + public void requestPermissions( + Activity activity, + PermissionsRegistry permissionsRegistry, + Integer notificationVisibility, + final ResultCallback callback) { + + if (Build.VERSION.SDK_INT >= 33) { + if (ongoing) { + callback.onResult("downloadPermission", "Notification permission request ongoing"); + } + if (notificationVisibility != 2&&!hasNotificationPermission(activity)) { + permissionsRegistry.addListener( + new StorageRequestPermissionsListener(new ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + ongoing = false; + callback.onResult(errorCode, errorDescription); + } + })); + ongoing = true; + ActivityCompat.requestPermissions( + activity, + new String[]{Manifest.permission.POST_NOTIFICATIONS}, + STORAGE_REQUEST_ID); + } else { + // Permissions already exist. Call the callback with success. + callback.onResult(null, null); + } + } else if (Build.VERSION.SDK_INT < 30 && (!hasReadStoragePermission(activity) || !hasWritePermission(activity))) { + if (ongoing) { + callback.onResult("downloadPermission", "Read/Write External Storage permission request ongoing"); + } + permissionsRegistry.addListener( + new StorageRequestPermissionsListener(new ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + ongoing = false; + callback.onResult(errorCode, errorDescription); + } + })); + ongoing = true; + ActivityCompat.requestPermissions( + activity, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, + STORAGE_REQUEST_ID); + } else { + // Permissions already exist. Call the callback with success. + callback.onResult(null, null); + } + } + + @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) + private boolean hasNotificationPermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasReadStoragePermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; + } + + private boolean hasWritePermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; + } + + @VisibleForTesting + public static final class StorageRequestPermissionsListener + implements PluginRegistry.RequestPermissionsResultListener { + + // There's no way to unregister permission listeners in the v1 embedding, so we'll be called + // duplicate times in cases where the user denies and then grants a permission. Keep track of if + // we've responded before and bail out of handling the callback manually if this is a repeat + // call. + boolean alreadyCalled = false; + + final ResultCallback callback; + + @VisibleForTesting + StorageRequestPermissionsListener(ResultCallback callback) { + this.callback = callback; + } + + @Override + public boolean onRequestPermissionsResult(int id, String[] permissions, int[] grantResults) { + if (alreadyCalled || id != STORAGE_REQUEST_ID) { + return false; + } + if (Build.VERSION.SDK_INT >= 33) { + if (grantResults.length != 1) return false; + alreadyCalled = true; + + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("downloadPermission", "Notification permission not granted"); + } else { + callback.onResult(null, null); + } + return true; + } else { + if (grantResults.length != 2) return false; + alreadyCalled = true; + + if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { + callback.onResult("downloadPermission", "Read/Write External Storage permission not granted"); + } else { + callback.onResult(null, null); + } + return true; + } + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java new file mode 100644 index 00000000..d374f7e9 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/DownloadStatus.java @@ -0,0 +1,24 @@ +package com.example.r_upgrade.common; + +public enum DownloadStatus { + STATUS_PAUSED(0), + STATUS_PENDING(1), + STATUS_RUNNING(2), + STATUS_SUCCESSFUL(3), + STATUS_FAILED(4), + STATUS_CANCEL(5); + + private int value; + + DownloadStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java new file mode 100644 index 00000000..b986b873 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/RUpgradeLogger.java @@ -0,0 +1,27 @@ +package com.example.r_upgrade.common; + +import android.util.Log; + +public class RUpgradeLogger { + private static RUpgradeLogger _logger; + + public static RUpgradeLogger get() { + if (_logger == null) { + _logger = new RUpgradeLogger(); + } + return _logger; + } + + private boolean isDebug = true; + + + public void setDebug(boolean isDebug) { + this.isDebug = isDebug; + } + + public void d(String tag, String content) { + if (isDebug) { + Log.d(tag, content); + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java new file mode 100644 index 00000000..2a9d979a --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/ResultMap.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common; + + +import java.util.HashMap; +import java.util.Map; + +public class ResultMap { + private static ResultMap instance; + + private final Map map; + + private ResultMap() { + this.map = new HashMap(); + } + + public static ResultMap getInstance() { + if (instance == null) { + synchronized (ResultMap.class) { + if (instance == null) { + instance = new ResultMap(); + } + } + } + return instance; + } + + public ResultMap pubClear(String key, Object value) { + map.clear(); + map.put(key, value); + return instance; + } + + + public ResultMap put(String key, Object value) { + map.put(key, value); + return instance; + } + + public Map getMap(){ + return map; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java new file mode 100644 index 00000000..0ee09ba3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotification.java @@ -0,0 +1,143 @@ +package com.example.r_upgrade.common; + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +import com.example.r_upgrade.R; +import com.example.r_upgrade.common.manager.UpgradeManager; + +public class UpgradeNotification { + public static final String TAG = "r_upgrade.Notification"; + + private static String CHANNEL_NAME; + + public static void createNotification(Context context, int id, String title,boolean indeterminate, Double percent, String contentText, int status) { + if (CHANNEL_NAME == null) { + try { + CHANNEL_NAME = context.getPackageName() + "_notification"; + } catch (Exception e) { + e.printStackTrace(); + CHANNEL_NAME = "r_upgrade_notification"; + } + } + if (status == DownloadStatus.STATUS_CANCEL.getValue()) { + removeNotification(context, id); + return; + } + Notification notification; + if (status == DownloadStatus.STATUS_RUNNING.getValue()) { + Intent pauseIntent = new Intent(); + pauseIntent.setAction(UpgradeService.RECEIVER_PAUSE); + pauseIntent.putExtra(UpgradeManager.PARAMS_ID, id); + pauseIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + + PendingIntent pausePendingIntent = + PendingIntent.getBroadcast(context, 0, pauseIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, pauseIntent, PendingIntent.FLAG_IMMUTABLE); + int current_length = percent.intValue(); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentText(indeterminate ? "" : contentText) + .setContentIntent(pausePendingIntent) + .setProgress(indeterminate ? 0 : 100, indeterminate ? 0 : current_length, indeterminate) + .build(); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + Intent installIntent = new Intent(); + installIntent.setAction(UpgradeManager.DOWNLOAD_INSTALL); + installIntent.putExtra(UpgradeService.DOWNLOAD_ID, id); + installIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent installPendingIntent = + PendingIntent.getBroadcast(context, 0, installIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, installIntent, PendingIntent.FLAG_IMMUTABLE); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(installPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_finish)) + .build(); + } else if (status == DownloadStatus.STATUS_PAUSED.getValue()) { + Intent reStartIntent = new Intent(); + reStartIntent.setAction(UpgradeService.RECEIVER_RESTART); + reStartIntent.putExtra(UpgradeManager.PARAMS_ID, id); + reStartIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent reStartPendingIntent = + PendingIntent.getBroadcast(context, 0, reStartIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, reStartIntent, PendingIntent.FLAG_IMMUTABLE); + + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(reStartPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_paused)) + .build(); + } else if (status == DownloadStatus.STATUS_FAILED.getValue()) { + Intent failedIntent = new Intent(); + failedIntent.setAction(UpgradeService.RECEIVER_RESTART); + failedIntent.putExtra(UpgradeManager.PARAMS_ID, id); + failedIntent.putExtra(UpgradeManager.PARAMS_PACKAGE, context.getPackageName()); + + PendingIntent reStartPendingIntent = + PendingIntent.getBroadcast(context, 0, failedIntent, getPendingIntentFlag()); +// PendingIntent.getBroadcast(context, 0, failedIntent, PendingIntent.FLAG_IMMUTABLE); + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setContentIntent(reStartPendingIntent) + .setContentText(context.getResources().getString(R.string.r_upgrade_download_failed)) + .build(); + } else { + notification = new NotificationCompat.Builder(context, CHANNEL_NAME) + .setSmallIcon(context.getApplicationInfo().icon) + .setContentTitle(title) + .setProgress(0, 0, true) + .build(); + } + NotificationManagerCompat compat = NotificationManagerCompat.from(context); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(createNotificationChannel()); + } + compat.notify(id, notification); + } + + private static int getPendingIntentFlag() { + int pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= 31) { + pendingFlag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; + } + return pendingFlag; + } + + public static void removeNotification(Context context, long id) { + NotificationManagerCompat compat = NotificationManagerCompat.from(context); + compat.cancel((int) id); + } + + @TargetApi(Build.VERSION_CODES.O) + private static NotificationChannel createNotificationChannel() { + String description = "Upgrade Application"; + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(CHANNEL_NAME, CHANNEL_NAME, importance); + channel.setDescription(description); + channel.enableVibration(false); + channel.setImportance(NotificationManager.IMPORTANCE_LOW); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + return channel; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java new file mode 100644 index 00000000..e0ce99fb --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeNotificationStyle.java @@ -0,0 +1,31 @@ +package com.example.r_upgrade.common; + +import android.content.Context; + +import com.example.r_upgrade.R; + +public enum UpgradeNotificationStyle { + speechAndPlanTime, + planTimeAndSpeech, + speech, + planTime, + none; + + + public String getNotificationStyleString(Context context, double speech, double planTime) { + String speechString = context.getResources().getString(R.string.r_upgrade_download_speech, speech); + String planTimeString = context.getResources().getString(R.string.r_upgrade_download_planTime, planTime); + switch (this) { + case speech: + return speechString; + case planTime: + return planTimeString; + case planTimeAndSpeech: + return planTimeString + " " + speechString; + case speechAndPlanTime: + return speechString + " " + planTimeString; + } + return ""; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java new file mode 100644 index 00000000..8dd980e1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeSQLite.java @@ -0,0 +1,220 @@ +package com.example.r_upgrade.common; + +import android.content.ContentValues; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import androidx.annotation.Nullable; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + + +public class UpgradeSQLite extends SQLiteOpenHelper { + private static final String TAG = "r_upgrade.SQLite"; + private static final String DATABASE_NAME = "r_upgrade.db"; + private static final int DATABASE_VERSION = 2; + + private static UpgradeSQLite instance; + + public synchronized static UpgradeSQLite getInstance(Context context) { + if (instance == null) { + instance = new UpgradeSQLite(context); + } + return instance; + } + + public static final String VERSION_MANAGER = "version_manager"; + + public static final String ID = "id"; + public static final String URL = "url"; + public static final String APK_NAME = "apk_name"; + public static final String PATH = "path"; + + public static final String HEADER = "header"; + public static final String CURRENT_LENGTH = "current_length"; + public static final String MAX_LENGTH = "max_length"; + public static final String STATUS = "status"; + + public static final String VERSION_NAME = "version_name"; + public static final String VERSION_CODE = "version_code"; + public static final String UPGRADE_FLAVOR = "upgrade_flavor"; + public static final int UPGRADE_FLAVOR_Normal = 0; + public static final int UPGRADE_FLAVOR_HOT_UPDATE = 1; + public static final int UPGRADE_FLAVOR_INCREMENT = 2; + + private static final String DATABASE_CREATE = "create table if not exists " + VERSION_MANAGER + "(" + + ID + " integer primary key autoincrement," + + URL + " text," + + PATH + " text," + + APK_NAME + " text," + + HEADER + " text," + + CURRENT_LENGTH + " integer," + + MAX_LENGTH + " integer," + + STATUS + " integer," + + VERSION_NAME + " text," + + VERSION_CODE + " integer,"+ + UPGRADE_FLAVOR + " integer)"; + + public UpgradeSQLite(@Nullable Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(DATABASE_CREATE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + RUpgradeLogger.get().d(TAG, String.format(Locale.ENGLISH,"onUpgrade: oldVersion:%d , newVersion:%d", oldVersion, newVersion)); + if(oldVersion == 1){ + db.execSQL("delete from "+VERSION_MANAGER); + db.execSQL("alter table "+VERSION_MANAGER+" add column "+UPGRADE_FLAVOR+" integer"); + } + } + + public Integer queryIdByVersionNameAndVersionCode(String versionName, int versionCode) { + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + VERSION_NAME + "=?" + " and " + VERSION_CODE + "=? order by " + ID + " DESC LIMIT 1", new String[]{versionName, String + .valueOf(versionCode)}); + boolean canMoveNext = cursor.moveToNext(); + if (canMoveNext) { + int id = cursor.getInt(cursor.getColumnIndex(ID)); + RUpgradeLogger.get().d(TAG, "queryByVersionNameAndVersionCode: " + id); + cursor.close(); + return id; + } else { + cursor.close(); + return null; + } + } + + public Map queryById(long id) { + Map result = new HashMap<>(); + + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + ID + "=?", new String[]{String.valueOf(id)}); + boolean hasNext = cursor.moveToNext(); + if (hasNext) { + String path = cursor.getString(cursor.getColumnIndex(PATH)); + String url = cursor.getString(cursor.getColumnIndex(URL)); + String apkName = cursor.getString(cursor.getColumnIndex(APK_NAME)); + int status = cursor.getInt(cursor.getColumnIndex(STATUS)); + String header = cursor.getString(cursor.getColumnIndex(HEADER)); + int rUpgradeFlavor = cursor.getInt(cursor.getColumnIndex(UPGRADE_FLAVOR)); + result.put(PATH, path); + result.put(APK_NAME, apkName); + result.put(URL, url); + result.put(STATUS, status); + result.put(HEADER, header); + result.put(UPGRADE_FLAVOR, rUpgradeFlavor); + return result; + } else { + cursor.close(); + return null; + } + } + + + public Integer queryStatusById(int id) { + SQLiteDatabase readableDatabase = getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + VERSION_MANAGER + " where " + ID + "=?", new String[]{String.valueOf(id)}); + boolean canMoveNext = cursor.moveToNext(); + if (canMoveNext) { + int status = cursor.getInt(cursor.getColumnIndex(STATUS)); + cursor.close(); + return status; + } else { + cursor.close(); + return null; + } + } + + + //创建记录 + public long createRecord(Context context, String url, String apk_name, String header, int status, int upgradeFlavor) { + String versionName = ""; + int versionCode = 0; + try { + PackageManager manager = context.getPackageManager(); + PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); + versionName = info.versionName; + versionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(URL, url); + values.put(PATH, ""); + values.put(APK_NAME, apk_name); + values.put(HEADER, header); + values.put(CURRENT_LENGTH, 0); + values.put(MAX_LENGTH, 0); + values.put(STATUS, status); + values.put(VERSION_NAME, versionName); + values.put(VERSION_CODE, versionCode); + values.put(UPGRADE_FLAVOR, upgradeFlavor); + return writableDatabase.insert(VERSION_MANAGER, null, values); + } + + void update(long id, String url, String path, String apkName, String header, Long current_length, Long max_length, int status) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + if (current_length != null) { + values.put(CURRENT_LENGTH, current_length); + } + if (max_length != null) { + values.put(MAX_LENGTH, max_length); + } + if (url != null) { + values.put(URL, url); + } + + if (path != null) { + values.put(PATH, path); + } + + if (apkName != null) { + values.put(APK_NAME, apkName); + } + if (header != null) { + values.put(HEADER, header); + } + values.put(STATUS, status); + writableDatabase.update(VERSION_MANAGER, values, ID + "=?", new String[]{String.valueOf(id)}); + } + + void update(long id, Long current_length, Long max_length, int status) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + if (current_length != null) { + values.put(CURRENT_LENGTH, current_length); + } + if (max_length != null) { + values.put(MAX_LENGTH, max_length); + } + values.put(STATUS, status); + writableDatabase.update(VERSION_MANAGER, values, ID + "=?", new String[]{String.valueOf(id)}); + } + + void delete(long id) { + SQLiteDatabase writableDatabase = getWritableDatabase(); + writableDatabase.delete(VERSION_MANAGER, ID + "=?", new String[]{String.valueOf(id)}); + } + + public void pauseDownloading() { + SQLiteDatabase writableDatabase = getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + writableDatabase.update(VERSION_MANAGER, values, STATUS + "=? or " + STATUS + "=?", new String[]{String.valueOf(DownloadStatus.STATUS_PENDING.getValue()), String.valueOf(DownloadStatus.STATUS_RUNNING.getValue()),}); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java new file mode 100644 index 00000000..54593028 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/UpgradeService.java @@ -0,0 +1,693 @@ +package com.example.r_upgrade.common; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.IBinder; + +import androidx.core.net.ConnectivityManagerCompat; + +import org.json.JSONObject; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.math.BigDecimal; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; + +import static com.example.r_upgrade.common.manager.UpgradeManager.DOWNLOAD_STATUS; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_APK_NAME; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_CURRENT_LENGTH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_ID; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_MAX_LENGTH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PACKAGE; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PATH; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PERCENT; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_PLAN_TIME; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_SPEED; +import static com.example.r_upgrade.common.manager.UpgradeManager.PARAMS_STATUS; + +public class UpgradeService extends Service { + public static final String DOWNLOAD_ID = "download_id"; + public static final String DOWNLOAD_URL = "download_url"; + public static final String DOWNLOAD_Header = "download_header"; + public static final String DOWNLOAD_APK_NAME = "download_apkName"; + public static final String DOWNLOAD_RESTART = "download_restart"; + + + private static final String TAG = "r_upgrade.Service"; + private final Executor mExecutor = Executors.newSingleThreadExecutor(); + private UpgradeSQLite sqLite; + private UpgradeRunnable runnable; + private UpgradeService service; + private boolean isFirst = true; + + private final BroadcastReceiver actionReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String packageName = intent.getStringExtra(PARAMS_PACKAGE); + if (packageName == null || !packageName.equals(getPackageName())) { + return; + } + if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_CANCEL)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable.cancel(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_PAUSE)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable.pause(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(RECEIVER_RESTART)) { + int id = intent.getIntExtra(PARAMS_ID, 0); + runnable = new UpgradeRunnable(true, (long) id, null, null, null, service, sqLite); + mExecutor.execute(runnable); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = ConnectivityManagerCompat.getNetworkInfoFromBroadcast(conMgr, intent); + handleNetworkChange(info != null && info.isConnected()); + } + } + }; + private ConnectivityManager.NetworkCallback networkCallback; + + public static final String RECEIVER_CANCEL = "com.example.r_upgrade.RECEIVER_CANCEL"; + public static final String RECEIVER_PAUSE = "com.example.r_upgrade.RECEIVER_PAUSE"; + public static final String RECEIVER_RESTART = "com.example.r_upgrade.RECEIVER_RESTART"; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + service = this; + sqLite = UpgradeSQLite.getInstance(this); + IntentFilter filter = new IntentFilter(); + filter.addAction(RECEIVER_CANCEL); + filter.addAction(RECEIVER_RESTART); + filter.addAction(RECEIVER_PAUSE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + networkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + super.onAvailable(network); + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = conMgr.getNetworkInfo(network); + handleNetworkChange(info != null && info.isConnected()); + } + + @Override + public void onLost(Network network) { + super.onLost(network); + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo info = conMgr.getNetworkInfo(network); + handleNetworkChange(info != null && info.isConnected()); + } + }; + conMgr.registerDefaultNetworkCallback(networkCallback); + } else { + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + } + registerReceiver(actionReceiver, filter); + + } + + private void handleNetworkChange(boolean isConnected) { + if (runnable == null || runnable.isFinish) { + return; + } + if (isConnected) { + RUpgradeLogger.get().d(TAG, "onReceive: 当前网络正在连接"); + if (isFirst) { + isFirst = false; + return; + } + long id = runnable.id; + runnable = new UpgradeRunnable(true, (long) id, runnable.url, runnable.header, runnable.apkName, service, sqLite); + mExecutor.execute(runnable); + } else { + if (isFirst) { + isFirst = false; + return; + } + runnable.handlerDownloadFinish(); + runnable.pause(-1); + isFirst = false; + RUpgradeLogger.get().d(TAG, "onReceive: 当前网络已断开"); + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent == null) return super.onStartCommand(null, flags, startId); + Bundle bundle = intent.getExtras(); + assert (bundle != null); + String url = bundle.getString(DOWNLOAD_URL); + int id = bundle.getInt(DOWNLOAD_ID); + + Map header; + if (bundle.get(DOWNLOAD_Header) != null && bundle.get(DOWNLOAD_Header) instanceof String) { + header = getMapForJson(bundle.getString(DOWNLOAD_Header)); + } else { + header = (Map) bundle.getSerializable(DOWNLOAD_Header); + } + String apkName = bundle.getString(DOWNLOAD_APK_NAME); + boolean isReStart = bundle.getBoolean(DOWNLOAD_RESTART); + + runnable = new UpgradeRunnable( + isReStart, + (long) id, + url, + header, + apkName, service, sqLite); + + mExecutor.execute(runnable); + + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + unregisterReceiver(actionReceiver); + if (runnable != null) { + runnable.handlerDownloadPause(); + } + super.onDestroy(); + } + + private static class UpgradeRunnable implements Runnable { + private String url; + private Long id; + private Map header; + private String apkName; + private UpgradeService upgradeService; + + private long maxLength = 0; + private long currentLength = 0; + private long lastCurrentLength = 0; + private long lastTime = System.currentTimeMillis(); + private File downloadFile = null; + private UpgradeSQLite sqLite; + private HttpURLConnection httpURLConnection; + private HttpsURLConnection httpsURLConnection; + + private Timer timer; + private boolean isRunning = true; + private boolean isReStart; + + private boolean isNewDownload; + + private boolean isFinish; + + UpgradeRunnable(boolean isReStart, Long id, String url, Map header, String apkName, UpgradeService upgradeService, UpgradeSQLite sqLite) { + this.id = id; + this.url = url; + this.header = header; + this.apkName = apkName == null ? "release.apk" : apkName; + this.upgradeService = upgradeService; + this.sqLite = sqLite; + this.isReStart = isReStart; + this.isFinish = false; + } + + /** + * cancel timer + */ + private void cancelTimer() { + if (timer != null) { + timer.cancel(); + } + } + + private void cancel(int id) { + if (isFinish) return; + if (this.id == id) { + cancelTimer(); + if (httpsURLConnection != null) { + httpsURLConnection.disconnect(); + } + if (httpURLConnection != null) { + httpURLConnection.disconnect(); + } + isRunning = false; + handlerDownloadCancel(); + boolean isSuccess = downloadFile.delete(); + RUpgradeLogger.get().d(TAG, "cancel: delete download file " + isSuccess); + + } + } + + private void pause(int id) { + if (isFinish) return; + + if (id == -1 || this.id == id) { + if (httpsURLConnection != null) { + httpsURLConnection.disconnect(); + } + if (httpURLConnection != null) { + httpURLConnection.disconnect(); + } + isRunning = false; + handlerDownloadPause(); + } + } + + private File getDownloadDirectory() { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + return upgradeService.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); + } + return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + } + + private boolean handlerDownloadPending() { + if (isReStart) { + SQLiteDatabase readableDatabase = sqLite.getReadableDatabase(); + Cursor cursor = readableDatabase.rawQuery("select * from " + UpgradeSQLite.VERSION_MANAGER + " where " + UpgradeSQLite.ID + "=?", new String[]{String.valueOf(id)}); + boolean canMove = cursor.moveToNext(); + if (!canMove) { + // 重新下载 + File parentFile = getDownloadDirectory(); + if (!parentFile.exists()) { + parentFile.mkdir(); + } + downloadFile = new File(parentFile.getPath(), apkName); + JSONObject object = null; + if (header != null) { + object = new JSONObject(header); + } + //更新一条SQL + sqLite.update(id, url, downloadFile.getPath(), apkName, object == null ? "" : object.toString(), currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + cursor.close(); + return true; + } else { + boolean isNewDownload = false; + + //续传 + String path = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.PATH)); + downloadFile = new File(path); + //下载的文件已被删除 + if (!downloadFile.exists()) { + try { + boolean isSuccess = downloadFile.createNewFile(); + RUpgradeLogger.get().d(TAG, "handlerDownloadPending: download file create " + isSuccess); + } catch (IOException e) { + e.printStackTrace(); + } + currentLength = 0; + lastCurrentLength = currentLength; + isNewDownload = true; + } else { + currentLength = cursor.getLong(cursor.getColumnIndex(UpgradeSQLite.CURRENT_LENGTH)); + lastCurrentLength = currentLength; + maxLength = cursor.getLong(cursor.getColumnIndex(UpgradeSQLite.MAX_LENGTH)); + } + apkName = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.APK_NAME)); + url = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.URL)); + String header = cursor.getString(cursor.getColumnIndex(UpgradeSQLite.HEADER)); + this.header = getMapForJson(header); + cursor.close(); + //更新一条SQL + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + + return isNewDownload; + } + } else { + // 重新下载 + File parentFile = getDownloadDirectory(); + downloadFile = new File(parentFile.getPath(), apkName); + JSONObject object = null; + if (header != null) { + object = new JSONObject(header); + } + //更新一条SQL + sqLite.update(id, url, downloadFile.getPath(), apkName, object == null ? "" : object.toString(), currentLength, maxLength, DownloadStatus.STATUS_PENDING.getValue()); + return true; + } + } + + private void handlerDownloadRunning() { + try { + if (currentLength - lastCurrentLength > 0) { + double percent = new BigDecimal((currentLength * 1.0f / maxLength) * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + double speed = ((currentLength - lastCurrentLength) * 1000f / (System.currentTimeMillis() - lastTime)) / 1024; + //计划完成时间 + double planTime = (maxLength - currentLength) / (speed * 1024f); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_CURRENT_LENGTH, currentLength); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_RUNNING.getValue()); + intent.putExtra(PARAMS_PERCENT, percent); + intent.putExtra(PARAMS_MAX_LENGTH, maxLength); + intent.putExtra(PARAMS_SPEED, speed); + intent.putExtra(PARAMS_PLAN_TIME, planTime); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_RUNNING.getValue()); + RUpgradeLogger.get().d(TAG, "handlerDownloadRunning: running queryTask: 下载中\n" + + "url: " + + url + + "\n============>" + + "total:" + + maxLength + + "," + + "progress:" + + currentLength + + "," + + String.format("%.2f", percent) + + "% , " + + String.format("%.2f", speed) + + "kb/s , " + + "预计:" + + String.format("%.0f", planTime) + + "s"); + lastCurrentLength = currentLength; + lastTime = System.currentTimeMillis(); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + private void handlerDownloadCancel() { + RUpgradeLogger.get().d(TAG, "handlerDownloadCancel: "); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_CANCEL.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.delete(id); + } + + private void handlerDownloadPause() { + RUpgradeLogger.get().d(TAG, "handlerDownloadPause: downloadFile:" + downloadFile); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + if (downloadFile != null) { + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + } + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + if (upgradeService != null) { + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + } + if (sqLite != null) { + sqLite.update(id, currentLength, maxLength, DownloadStatus.STATUS_PAUSED.getValue()); + } + } + + private void handlerDownloadFinish() { + RUpgradeLogger.get().d(TAG, "handlerDownloadFinish: finish"); + cancelTimer(); + Intent intent = new Intent(); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + sqLite.update(id, null, null, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + lastCurrentLength = 0; + isFinish = true; + } + + private void handlerDownloadFailure() { + RUpgradeLogger.get().d(TAG, "handlerDownloadFailure: failure"); + Intent intent = new Intent(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_APK_NAME, apkName); + intent.putExtra(PARAMS_PATH, downloadFile.getPath()); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_FAILED.getValue()); + sqLite.update(id, null, null, DownloadStatus.STATUS_FAILED.getValue()); + intent.putExtra(PARAMS_PACKAGE, upgradeService.getPackageName()); + upgradeService.sendBroadcast(intent); + } + + private long getMaxLength(HttpURLConnection connection) { + long maxLength = connection.getContentLength(); + if (maxLength < 0) { + List values = connection.getHeaderFields().get("content-Length"); + if (values != null && !values.isEmpty()) { + String sLength = values.get(0); + if (sLength != null) { + maxLength = Long.parseLong(sLength, 10); + } + } + } + return maxLength; + } + + private InputStream getInputStreamFromUrl(String inputUrl) throws IOException { + InputStream is = null; + URL url = new URL(inputUrl); + int code; + if (inputUrl.startsWith("https")) { + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setReadTimeout(6 * 60 * 1000); + connection.setConnectTimeout(6 * 60 * 1000); + if (header != null && !header.isEmpty()) { + for (Map.Entry entry : header.entrySet()) { + connection.setRequestProperty(entry.getKey(), (String) entry.getValue()); + } + } + if (!isNewDownload) { + connection.setRequestProperty("range", "bytes=" + currentLength + "-"); + } + connection.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault()); + connection.setDoInput(true); + code = connection.getResponseCode(); + RUpgradeLogger.get().d(TAG, "run: code=" + code); + if (code == 200 || code == 206) { + connection.connect(); + is = connection.getInputStream(); + if (isNewDownload) { + maxLength = getMaxLength(connection); + } + } else if (code == 301 || code == 302) { + URL redirectUrl = connection.getURL(); + RUpgradeLogger.get().d(TAG, "redirect to: " + redirectUrl.toString()); + is = getInputStreamFromUrl(redirectUrl.toString()); + } + } else { + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(6 * 60 * 1000); + connection.setReadTimeout(6 * 60 * 1000); + connection.setRequestProperty("Accept-Encoding", "identity"); + if (header != null && !header.isEmpty()) { + for (Map.Entry entry : header.entrySet()) { + connection.setRequestProperty(entry.getKey(), (String) entry.getValue()); + } + } + if (!isNewDownload) { + connection.setRequestProperty("range", "bytes=" + currentLength + "-"); + } + connection.setDoInput(true); + code = connection.getResponseCode(); + RUpgradeLogger.get().d(TAG, "run: code=" + code); + if (code == 200 || code == 206) { + connection.connect(); + is = connection.getInputStream(); + if (isNewDownload) { + maxLength = getMaxLength(connection); + } + } else if (code == 301 || code == 302) { + URL redirectUrl = connection.getURL(); + RUpgradeLogger.get().d(TAG, "redirect to: " + redirectUrl.toString()); + is = getInputStreamFromUrl(redirectUrl.toString()); + } + } + return is; + } + + @Override + public void run() { + isNewDownload = handlerDownloadPending(); + //下载文件不存在,但是需要续下载? + if (!downloadFile.exists() && !isNewDownload) { + isNewDownload = true; + currentLength = 0; + + } + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + handlerDownloadRunning(); + } + }, 500, 500); + + InputStream is = null; + FileOutputStream fos = null; + RandomAccessFile raf = null; + + try { + if (isNewDownload) { + if (downloadFile.exists()) { + downloadFile.delete(); + } + downloadFile.createNewFile(); + fos = new FileOutputStream(downloadFile); + } else { + raf = new RandomAccessFile(downloadFile, "rwd"); + raf.seek(currentLength); + } + is = getInputStreamFromUrl(this.url); + if (is == null) { + handlerDownloadFailure(); + return; + } + assert (is != null); + RUpgradeLogger.get().d(TAG, "run: maxLength:" + maxLength); + + byte[] buff = new byte[1024]; + + int len = 0; + while ((len = is.read(buff)) != -1) { + if (!isRunning) { + break; + } + if (isNewDownload) { + assert (fos != null); + fos.write(buff, 0, len); + } else { + assert (raf != null); + raf.write(buff, 0, len); + } + currentLength += len; + } + if (isNewDownload) { + assert (fos != null); + fos.flush(); + fos.close(); + } else { + assert (raf != null); + raf.close(); + } + is.close(); + if (isRunning) { + handlerDownloadFinish(); + } + } catch (Exception e) { + timer.cancel(); + e.printStackTrace(); + if (is != null) { + try { + is.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + if (raf != null) { + try { + raf.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + //防止断网的情况,出现下载失败,而不是下载暂停的问题 + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + if (isRunning) { + handlerDownloadFailure(); + } + } + } + + private Map getMapForJson(String jsonStr) { + if (jsonStr == null || jsonStr.isEmpty()) return null; + + JSONObject jsonObject; + try { + jsonObject = new JSONObject(jsonStr); + + Iterator keyIter = jsonObject.keys(); + String key; + Object value; + Map valueMap = new HashMap(); + while (keyIter.hasNext()) { + key = keyIter.next(); + value = jsonObject.get(key); + valueMap.put(key, value); + } + return valueMap; + } catch (Exception e) { + e.printStackTrace(); + } + return new HashMap(); + } + + } + + private Map getMapForJson(String jsonStr) { + if (jsonStr == null || jsonStr.isEmpty()) return null; + + JSONObject jsonObject; + try { + jsonObject = new JSONObject(jsonStr); + + Iterator keyIter = jsonObject.keys(); + String key; + Object value; + Map valueMap = new HashMap(); + while (keyIter.hasNext()) { + key = keyIter.next(); + value = jsonObject.get(key); + valueMap.put(key, value); + } + return valueMap; + } catch (Exception e) { + e.printStackTrace(); + } + return new HashMap(); + } + + +} + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java new file mode 100644 index 00000000..e5c23947 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/BaseInstallFactory.java @@ -0,0 +1,14 @@ +package com.example.r_upgrade.common.install; + +import android.content.Context; +import android.content.ContextWrapper; +import android.net.Uri; + +public abstract class BaseInstallFactory extends ContextWrapper { + + public BaseInstallFactory(Context base) { + super(base); + } + + public abstract boolean install(Uri uri); +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java new file mode 100644 index 00000000..4c0fade8 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/NormalInstallFactory.java @@ -0,0 +1,32 @@ +package com.example.r_upgrade.common.install; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; + +import com.example.r_upgrade.common.RUpgradeLogger; + +public class NormalInstallFactory extends BaseInstallFactory { + + private static final String TAG = "NormalInstall"; + + public NormalInstallFactory(Context base) { + super(base); + } + + @Override + public boolean install(Uri uri) { + Intent install = new Intent(Intent.ACTION_VIEW); + RUpgradeLogger.get().d(TAG, uri.toString()); + install.setDataAndType(uri, "application/vnd.android.package-archive"); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + install.addCategory(Intent.CATEGORY_DEFAULT); + } + startActivity(install); + return true; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java new file mode 100644 index 00000000..04d02f1f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/install/SilentInstallFactory.java @@ -0,0 +1,150 @@ +package com.example.r_upgrade.common.install; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageInstaller; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import com.example.r_upgrade.common.RUpgradeLogger; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class SilentInstallFactory extends BaseInstallFactory { + private static final String TAG = "SilentInstall"; + + public SilentInstallFactory(Context base) { + super(base); + } + + @Override + public boolean install(Uri uri) { + if (uri == null) return false; + File apkFile = new File(uri.getPath()); + if (!apkFile.exists()) { + return false; + } + RUpgradeLogger.get().d(TAG, "startSilentInstall:file path" + apkFile.getPath()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + PackageInstaller installer = getPackageManager().getPackageInstaller(); + PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(apkFile.getPath(), PackageManager.GET_ACTIVITIES | + PackageManager.GET_SERVICES); + PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( + PackageInstaller.SessionParams.MODE_FULL_INSTALL + ); + if (packageInfo != null) { + String packageName = packageInfo.packageName; + params.setAppPackageName(packageName); + } + params.setSize(apkFile.length()); + int sessionId = createSession(installer, params); + + PackageInstaller.Session session = copyInstallFile(installer, sessionId, apkFile.getPath()); + if (session != null) { + PendingIntent broadCastTest = PendingIntent.getBroadcast( + this, + sessionId, + new Intent(Intent.ACTION_PACKAGE_ADDED), + getPendingIntentFlag()); + session.commit(broadCastTest.getIntentSender()); + session.close(); + } + } + return true; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private void closeQuietly(Object obj) { + if (obj != null) { + if (obj instanceof PackageInstaller.Session) { + ((PackageInstaller.Session) obj).close(); + } else if (obj instanceof FileOutputStream) { + try { + ((FileOutputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof FileInputStream) { + try { + ((FileInputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof OutputStream) { + try { + ((OutputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else if (obj instanceof InputStream) { + try { + ((InputStream) obj).close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private int createSession(PackageInstaller packageInstaller, + PackageInstaller.SessionParams sessionParams) { + int sessionId = -1; + try { + sessionId = packageInstaller.createSession(sessionParams); + } catch (IOException e) { + e.printStackTrace(); + } + return sessionId; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private PackageInstaller.Session copyInstallFile(PackageInstaller packageInstaller, + int sessionId, String apkFilePath) { + InputStream in = null; + OutputStream out = null; + PackageInstaller.Session session = null; + try { + File apkFile = new File(apkFilePath); + session = packageInstaller.openSession(sessionId); + out = session.openWrite("app_store_session", 0, apkFile.length()); + in = new FileInputStream(apkFile); + int total = 0; + byte[] buffer = new byte[65536]; + int len; + while ((len = in.read(buffer)) != -1) { + total += len; + out.write(buffer, 0, len); + RUpgradeLogger.get().d(TAG, "Write install session:" + len); + } + RUpgradeLogger.get().d(TAG, "Finish session total size:" + total); + session.fsync(out); + return session; + } catch (IOException e) { + e.printStackTrace(); + } finally { + closeQuietly(in); + closeQuietly(session); + closeQuietly(out); + } + return null; + } + + private static int getPendingIntentFlag() { + int pendingFlag = PendingIntent.FLAG_UPDATE_CURRENT; + if (Build.VERSION.SDK_INT >= 31) { + pendingFlag = PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT; + } + return pendingFlag; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java new file mode 100644 index 00000000..52629c6f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/HotUpgradeManager.java @@ -0,0 +1,140 @@ +package com.example.r_upgrade.common.manager; + +import android.content.Context; +import android.content.ContextWrapper; +import android.net.Uri; +import android.os.ParcelFileDescriptor; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import io.flutter.util.PathUtils; + + +public class HotUpgradeManager extends ContextWrapper { + private static final String TAG = "HotUpgradeManager"; + private static final String FLUTTER_ASSETS = "flutter_assets"; + + public HotUpgradeManager(Context context) { + super(context); + } + + private File getFlutterAssets() { + return new File(PathUtils.getDataDirectory(this)); + } + + private File getHotAssets() { + File file; + file = new File(getFlutterAssets(), System.currentTimeMillis() + ".zip"); + if (!file.exists()) { + try { + boolean isSuccess = file.createNewFile(); + return isSuccess ? file : null; + } catch (IOException e) { + e.printStackTrace(); + } + } + return file; + } + + private void deleteFlutterAssets() { + File file = new File(getFlutterAssets(), FLUTTER_ASSETS); + if (file.exists()) { + if (file.isDirectory()) { + for (File item : file.listFiles()) { + if (item.exists()) { + item.delete(); + } + } + } + file.delete(); + } + } + + public Boolean hotUpgrade(Uri uri) { + //获取文件流 + try { + //复制下载的文件到资源文件中 + ParcelFileDescriptor descriptor = getContentResolver().openFileDescriptor(uri, "r"); + FileDescriptor fileDescriptor = descriptor.getFileDescriptor(); + if (fileDescriptor == null) return false; + FileInputStream stream = new FileInputStream(fileDescriptor); + File zipFile = getHotAssets(); + FileOutputStream outputStream = new FileOutputStream(zipFile); + byte[] buffer = new byte[1024]; + int byteRead; + while (-1 != (byteRead = stream.read(buffer))) { + outputStream.write(buffer, 0, byteRead); + } + stream.close(); + outputStream.flush(); + outputStream.close(); + + deleteFlutterAssets(); + unZipFile(zipFile.getPath(), getFlutterAssets().getPath() + File.separator + FLUTTER_ASSETS, true); + return true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + /** + * @param archive 解压文件得路径 + * @param decompressDir 解压文件目标路径 + * @param isDeleteZip 解压完毕是否删除解压文件 + * @throws IOException + */ + public static void unZipFile(String archive, String decompressDir, boolean isDeleteZip) throws IOException { + BufferedInputStream bi; + ZipFile zf = new ZipFile(archive); + Enumeration e = zf.entries(); + while (e.hasMoreElements()) { + ZipEntry ze2 = (ZipEntry) e.nextElement(); + String entryName = ze2.getName(); + String path = decompressDir + "/" + entryName; + if (ze2.isDirectory()) { + File decompressDirFile = new File(path); + if (!decompressDirFile.exists()) { + decompressDirFile.mkdirs(); + } + } else { + if (decompressDir.endsWith(".zip")) { + decompressDir = decompressDir.substring(0, decompressDir.lastIndexOf(".zip")); + } + File fileDirFile = new File(decompressDir); + if (!fileDirFile.exists()) { + fileDirFile.mkdirs(); + } + String substring = entryName.substring(entryName.lastIndexOf("/") + 1, entryName.length()); + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(decompressDir + "/" + substring)); + bi = new BufferedInputStream(zf.getInputStream(ze2)); + byte[] readContent = new byte[1024]; + int readCount = bi.read(readContent); + while (readCount != -1) { + bos.write(readContent, 0, readCount); + readCount = bi.read(readContent); + } + bos.close(); + } + } + zf.close(); + if (isDeleteZip) { + File zipFile = new File(archive); + if (zipFile.exists() && zipFile.getName().endsWith(".zip")) { + zipFile.delete(); + } + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java new file mode 100644 index 00000000..dfd71826 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/IncrementUpgradeManager.java @@ -0,0 +1,50 @@ +package com.example.r_upgrade.common.manager; + +import android.content.Context; +import android.content.ContextWrapper; +import android.os.Environment; +import android.util.Log; + + +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade_lib.RUpgradeLib; + +import java.io.File; + +public class IncrementUpgradeManager extends ContextWrapper { + private static final String TAG = "r_upgrade.Increment"; + private String oldApkPath; + private RUpgradeLib rUpgradeLib; + + public IncrementUpgradeManager(Context base) { + super(base); + oldApkPath = base.getPackageResourcePath(); + rUpgradeLib = new RUpgradeLib(); + } + + public String mixinAndGetNewApk(String patchPath) { + File parentFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + File newApkFile = new File(parentFile, oldApkPath.substring(oldApkPath.lastIndexOf("/") + 1)); + try { + File patchFile = new File(patchPath); + if (!patchFile.exists()) { + return null; + } + if (patchFile.length() == 0) { + return null; + } + if (newApkFile.exists()) { + newApkFile.delete(); + } + newApkFile.createNewFile(); + rUpgradeLib.mixinPatch(oldApkPath, patchPath, newApkFile.getPath()); + RUpgradeLogger.get().d(TAG, "mixinAndGetNewApk" + newApkFile.getPath()); + return newApkFile.getPath(); + } catch (Exception e) { + RUpgradeLogger.get().d(TAG, "合成失败:"); + e.printStackTrace(); + } + return null; + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java new file mode 100644 index 00000000..1f8efb9b --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/manager/UpgradeManager.java @@ -0,0 +1,591 @@ +package com.example.r_upgrade.common.manager; + +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.example.r_upgrade.common.DownloadStatus; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.ResultMap; +import com.example.r_upgrade.common.DownloadPermissions; +import com.example.r_upgrade.common.UpgradeNotification; +import com.example.r_upgrade.common.UpgradeNotificationStyle; +import com.example.r_upgrade.common.UpgradeSQLite; +import com.example.r_upgrade.common.UpgradeService; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.NormalInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.tasks.CheckGooglePlayVersionTask; +import com.example.r_upgrade.common.tasks.CheckTencentStoreVersionTask; +import com.example.r_upgrade.common.tasks.CheckXiaoMiStoreVersionTask; +import com.example.r_upgrade.common.tasks.GenerateAndInstallAsyncTask; +import com.example.r_upgrade.common.tasks.GenerateAndInstallByPathAsyncTask; +import com.example.r_upgrade.common.tasks.VersionCallBack; + +import org.json.JSONObject; + +import java.io.File; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import io.flutter.plugin.common.MethodChannel; + + +public class UpgradeManager extends ContextWrapper { + private static final String TAG = "r_upgrade.Manager"; + //广播的action + public static final String DOWNLOAD_STATUS = "com.example.r_upgrade.DOWNLOAD_STATUS"; + public static final String DOWNLOAD_INSTALL = "com.example.r_upgrade.DOWNLOAD_INSTALL"; + + public static final String PARAMS_ID = "id"; + public static final String PARAMS_STATUS = "status"; + public static final String PARAMS_CURRENT_LENGTH = "current_length"; + public static final String PARAMS_MAX_LENGTH = "max_length"; + public static final String PARAMS_PLAN_TIME = "plan_time"; + public static final String PARAMS_SPEED = "speed"; + public static final String PARAMS_PERCENT = "percent"; + public static final String PARAMS_PATH = "path"; + public static final String PARAMS_APK_NAME = "apk_name"; + public static final String PARAMS_PACKAGE = "packages"; + //速度 + private double lastProgress = 0; + //最后更新的时间 + private long lastTime = 0; + + private Timer timer; + + private BaseInstallFactory installFactory; + + private boolean isUseDownloadManager = false; + + private Integer notificationVisibility = 0; + private UpgradeNotificationStyle notificationStyle = UpgradeNotificationStyle.none; + + + private BroadcastReceiver downloadReceiver; + + private MethodChannel channel; + + private DownloadPermissions.PermissionsRegistry permissionsRegistry; + private DownloadPermissions downloadPermissions; + private Activity activity; + + + public void dispose() { + unregisterReceiver(downloadReceiver); + } + + public UpgradeManager(Activity base, MethodChannel channel, DownloadPermissions storagePermissions, DownloadPermissions.PermissionsRegistry permissionsRegistry) { + super(base); + this.activity = base; + this.downloadPermissions = storagePermissions; + this.permissionsRegistry = permissionsRegistry; + this.channel = channel; + UpgradeSQLite.getInstance(this).pauseDownloading(); + IntentFilter filter = new IntentFilter(); + filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE); + filter.addAction(UpgradeManager.DOWNLOAD_STATUS); + filter.addAction(UpgradeManager.DOWNLOAD_INSTALL); + downloadReceiver = createBroadcastReceiver(); + registerReceiver(downloadReceiver, filter); + } + + + public void upgrade(final String url, final Map header, final String apkName, final Integer notificationVisibility, Integer notificationStyle, Integer installType, Boolean useDownloadManager, final Integer upgradeFlavor, final MethodChannel.Result result) { + installFactory = installTypeToFactory(installType); + this.isUseDownloadManager = Boolean.TRUE == useDownloadManager; + if (notificationStyle != null) { + this.notificationStyle = UpgradeNotificationStyle.values()[notificationStyle]; + } else { + this.notificationStyle = UpgradeNotificationStyle.none; + } + this.notificationVisibility = notificationVisibility; + + downloadPermissions.requestPermissions(activity, permissionsRegistry, notificationVisibility,new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + long id = 0; + + if (isUseDownloadManager) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); + if (header != null) { + for (Map.Entry entry : header.entrySet()) { + request.addRequestHeader(entry.getKey(), entry.getValue()); + } + } + if (notificationVisibility != null) { + request.setNotificationVisibility(notificationVisibility); + } else { + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + } + request.setMimeType("application/vnd.android.package-archive"); + + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, apkName == null ? "release.apk" : apkName); + + request.setTitle(apkName == null ? "upgradePackage.apk" : apkName); + id = manager.enqueue(request); + if (timer != null) { + timer.cancel(); + } + timer = new Timer(); + final long finalId = id; + timer.schedule(new TimerTask() { + @Override + public void run() { + queryTask(finalId); + } + }, 0, 500); + RUpgradeLogger.get().d(TAG, "upgrade: " + id); + } else { + id = UpgradeSQLite.getInstance(activity).createRecord(activity, url, apkName, header == null ? "" : new JSONObject(header).toString(), DownloadStatus.STATUS_PENDING.getValue(), upgradeFlavor); + + Intent intent = new Intent(activity, UpgradeService.class); + Bundle bundle = new Bundle(); + bundle.putBoolean(UpgradeService.DOWNLOAD_RESTART, false); + bundle.putInt(UpgradeService.DOWNLOAD_ID, (int) id); + bundle.putString(UpgradeService.DOWNLOAD_URL, url); + bundle.putString(UpgradeService.DOWNLOAD_APK_NAME, apkName); + bundle.putSerializable(UpgradeService.DOWNLOAD_Header, (Serializable) header); + intent.putExtras(bundle); + startService(intent); + } + result.success(id); + } else { + result.error(errorCode, errorDescription, null); + } + } + }); + } + + //取消下载 + public boolean cancel(Integer id) { + if (id == null) return false; + if (isUseDownloadManager) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + return manager.remove(id) == 1; + } else { + Intent intent = new Intent(UpgradeService.RECEIVER_CANCEL); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + intent.putExtra(PARAMS_ID, id); + sendBroadcast(intent); + return true; + } + } + + //暂停下载 + public boolean pause(Integer id) { + if (id == null) return false; + Intent intent = new Intent(UpgradeService.RECEIVER_PAUSE); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + intent.putExtra(PARAMS_ID, id); + sendBroadcast(intent); + return true; + } + + + //查询进度 + public void queryTask(long id) { + DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Query query = new DownloadManager.Query(); + Cursor cursor = manager.query(query.setFilterById(id)); + if (cursor != null && cursor.moveToFirst()) { + int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); + Intent intent = new Intent(); + switch (status) { + case DownloadManager.STATUS_PAUSED: + RUpgradeLogger.get().d(TAG, "queryTask: 下载被暂停"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PAUSED.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + break; + case DownloadManager.STATUS_PENDING: + RUpgradeLogger.get().d(TAG, "queryTask: 下载延迟==========>总大小:"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_PENDING.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + break; + case DownloadManager.STATUS_RUNNING: + //已经下载的字节数 + int progress = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); + if (lastProgress == 0) { + lastProgress = progress; + lastTime = System.currentTimeMillis(); + } + //下载的文件到本地的目录 + String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); + //总需下载的字节数 + int total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); + //下载速度 + double speed = ((progress - lastProgress) * 1000f / (System.currentTimeMillis() - lastTime)) / 1024; + //下载文件的URL链接 + String url = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)); + + //计划完成时间 + double planTime = (total - progress) / (speed * 1024f); + //当前进度 + double percent = new BigDecimal((progress * 1.0f / total) * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + if (progress - lastProgress > 0) { + RUpgradeLogger.get().d(TAG, "queryTask: 下载中\n" + + "url: " + + url + + "\n============>" + + "total:" + + total + + "," + + "progress:" + + progress + + "," + + String.format(Locale.getDefault(), "%.2f", percent) + + "% , " + + String.format(Locale.getDefault(), "%.2f", speed) + + "kb/s , " + + "预计:" + + String.format(Locale.getDefault(), "%.0f", planTime) + + "s"); + intent.setAction(DOWNLOAD_STATUS); + + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_CURRENT_LENGTH, progress); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_RUNNING.getValue()); + intent.putExtra(PARAMS_PERCENT, percent); + intent.putExtra(PARAMS_MAX_LENGTH, total); + intent.putExtra(PARAMS_SPEED, speed); + intent.putExtra(PARAMS_PLAN_TIME, planTime); + intent.putExtra(PARAMS_PATH, address); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = progress; + lastTime = System.currentTimeMillis(); + } + break; + case DownloadManager.STATUS_SUCCESSFUL: + RUpgradeLogger.get().d(TAG, "queryTask: 下载成功"); + if (timer != null) { + timer.cancel(); + timer = null; + } + installApkById((int) id); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_SUCCESSFUL.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = 0; + break; + case DownloadManager.STATUS_FAILED: + RUpgradeLogger.get().d(TAG, "queryTask: 下载失败"); + intent.setAction(DOWNLOAD_STATUS); + intent.putExtra(PARAMS_STATUS, DownloadStatus.STATUS_FAILED.getValue()); + intent.putExtra(PARAMS_ID, id); + intent.putExtra(PARAMS_PACKAGE, getPackageName()); + sendBroadcast(intent); + lastProgress = 0; + break; + } + } + if (cursor != null) { + cursor.close(); + } + } + + + public void installApkById(int id) { + installApkById(id, -1, null); + } + + public void installApkById(final int id, int installType, final MethodChannel.Result result) { + if (installType != -1) { + installFactory = installTypeToFactory(installType); + } + if (installFactory == null) return; + downloadPermissions.requestPermissions(activity, permissionsRegistry,notificationVisibility, new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + new GenerateAndInstallAsyncTask(activity, isUseDownloadManager, result, installFactory).execute(id); + } else { + if (result != null) { + result.error(errorCode, errorDescription, null); + } + } + } + }); + } + + private BaseInstallFactory installTypeToFactory(int installType) { + BaseInstallFactory installFactory; + if (installType == 0) { + installFactory = new NormalInstallFactory(this); + } else if (installType == 1) { + installFactory = new SilentInstallFactory(this); + } else { + installFactory = null; + } + return installFactory; + } + + + public void installApkByPath(final String path, final int upgradeFlavor, int installType, final MethodChannel.Result result) { + installFactory = installTypeToFactory(installType); + + downloadPermissions.requestPermissions(activity, permissionsRegistry,notificationVisibility, new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + File installPath = new File(path); + if (installPath.exists()) { + new GenerateAndInstallByPathAsyncTask(activity, path, upgradeFlavor, result, installFactory).execute(); + + } else { + result.error("file not exists", "file path:" + path + " is not exists", null); + } + } else { + if (result != null) { + result.error(errorCode, errorDescription, null); + } + } + } + }); + } + + + public BroadcastReceiver createBroadcastReceiver() { + return new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String packageName = intent.getStringExtra(PARAMS_PACKAGE); + if (packageName == null || !packageName.equals(getPackageName())) { + return; + } + if (intent != null && intent.getAction() != null && intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { + if (timer != null) { + timer.cancel(); + timer = null; + } + long id = intent.getLongExtra("extra_download_id", 0); + queryTask(id); + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(UpgradeManager.DOWNLOAD_STATUS)) { + + final long current_length = intent.getLongExtra(PARAMS_CURRENT_LENGTH, 0); + final long max_length = intent.getLongExtra(PARAMS_MAX_LENGTH, 0); + + double percent = intent.getDoubleExtra(PARAMS_PERCENT, 0); + + double speed = intent.getDoubleExtra(PARAMS_SPEED, 0); + + double planTime = intent.getDoubleExtra(PARAMS_PLAN_TIME, 0); + + int status = intent.getIntExtra(PARAMS_STATUS, 1); + + String apkName = intent.getStringExtra(PARAMS_APK_NAME); + + String path = intent.getStringExtra(PARAMS_PATH); + + long id = intent.getLongExtra(PARAMS_ID, 0L); + + if (!isUseDownloadManager) { + String contentText = notificationStyle == null ? "" : notificationStyle.getNotificationStyleString(context, speed, planTime); + if ((status == DownloadStatus.STATUS_RUNNING.getValue() || status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) && notificationVisibility == 1) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } else if (notificationVisibility == 0) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue() && notificationVisibility == 3) { + UpgradeNotification.createNotification(context, (int) id, apkName, max_length == -1, percent, contentText, status); + } + if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + installApkById((int) id); + } + } + if (channel != null) + channel.invokeMethod("update", ResultMap.getInstance() + .pubClear(PARAMS_CURRENT_LENGTH, current_length) + .put(PARAMS_ID, id) + .put(PARAMS_PERCENT, percent) + .put(PARAMS_PLAN_TIME, planTime) + .put(PARAMS_STATUS, status) + .put(PARAMS_SPEED, speed) + .put(PARAMS_MAX_LENGTH, max_length) + .put(PARAMS_PATH, path) + .getMap()); + + } else if (intent != null && intent.getAction() != null && intent.getAction().equals(UpgradeManager.DOWNLOAD_INSTALL)) { + int id = intent.getIntExtra(UpgradeService.DOWNLOAD_ID, 0); + installApkById(id); + UpgradeNotification.removeNotification(context, id); + } + } + }; + } + + public Integer getLastUpgradedId() { + String versionName = ""; + int versionCode = 0; + try { + PackageManager manager = this.getPackageManager(); + PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); + versionName = info.versionName; + versionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return UpgradeSQLite.getInstance(this).queryIdByVersionNameAndVersionCode(versionName, versionCode); + } + + public void upgradeWithId(final Integer id, Integer notificationVisibility, int installType, final MethodChannel.Result methodResult) { + this.notificationVisibility = notificationVisibility; + installFactory = installTypeToFactory(installType); + + final Map result = UpgradeSQLite.getInstance(this).queryById(id); + if (result == null) { + methodResult.success(false); + return; + } + String path = (String) result.get(UpgradeSQLite.PATH); + File downloadFile = new File(path); + + int status = (int) result.get(UpgradeSQLite.STATUS); + if (status == DownloadStatus.STATUS_PAUSED.getValue() || status == DownloadStatus.STATUS_FAILED.getValue() + || status == DownloadStatus.STATUS_CANCEL.getValue() || !downloadFile.exists()) { + downloadPermissions.requestPermissions(activity, permissionsRegistry, notificationVisibility,new DownloadPermissions.ResultCallback() { + @Override + public void onResult(String errorCode, String errorDescription) { + if (errorCode == null) { + Intent intent = new Intent(activity, UpgradeService.class); + Bundle bundle = new Bundle(); + bundle.putBoolean(UpgradeService.DOWNLOAD_RESTART, true); + bundle.putInt(UpgradeService.DOWNLOAD_ID, (int) id); + bundle.putString(UpgradeService.DOWNLOAD_URL, (String) result.get(UpgradeSQLite.URL)); + bundle.putString(UpgradeService.DOWNLOAD_APK_NAME, (String) result.get(UpgradeSQLite.APK_NAME)); + bundle.putSerializable(UpgradeService.DOWNLOAD_Header, (Serializable) result.get(UpgradeSQLite.HEADER)); + intent.putExtras(bundle); + startService(intent); + methodResult.success(true); + } else { + methodResult.error(errorCode, errorDescription, null); + } + } + }); + } else if (status == DownloadStatus.STATUS_SUCCESSFUL.getValue()) { + installApkById(id, -1, methodResult); + } else { + // not known + methodResult.success(false); + } + } + + public Integer getDownloadStatus(Integer id) { + return UpgradeSQLite.getInstance(this).queryStatusById(id); + + } + + public boolean upgradeFromUrl(String url) { + Uri uri = Uri.parse(url); + try { + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } catch (Exception e) { + return false; + } + } + + public boolean upgradeFromAndroidStore(String store) { + Uri uri = Uri.parse("market://details?id=" + this.getApplicationInfo().packageName); + try { + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + if (store != null) { + intent.setPackage(store); + } + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } catch (Exception e) { + return false; + } + } + + public List getAndroidStores() { + List pkgs = new ArrayList<>(); + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.parse("market://details?id=")); + PackageManager pm = this.getPackageManager(); + // 通过queryIntentActivities获取ResolveInfo对象 + List infoList = pm.queryIntentActivities(intent, + 0); + if (infoList == null || infoList.size() == 0) + return pkgs; + int size = infoList.size(); + for (int i = 0; i < size; i++) { + String pkgName = ""; + try { + ActivityInfo activityInfo = infoList.get(i).activityInfo; + pkgName = activityInfo.packageName; + } catch (Exception e) { + e.printStackTrace(); + } + if (!TextUtils.isEmpty(pkgName)) + pkgs.add(pkgName); + } + return pkgs; + } + + public void getVersionFromAndroidStore(@Nullable String store, final MethodChannel.Result result) { + if (store == null) { + result.error("-1", "Please enter the package name.", null); + return; + } + VersionCallBack callBack = new VersionCallBack() { + @Override + public void versionName(String version) { + result.success(version); + } + }; + switch (store) { + case "com.android.vending": + new CheckGooglePlayVersionTask(getPackageName(), callBack).execute(); + break; + case "com.xiaomi.market": + new CheckXiaoMiStoreVersionTask(getPackageName(), callBack).execute(); + break; + case "com.tencent.android.qqdownloader": + new CheckTencentStoreVersionTask(getPackageName(), callBack).execute(); + break; + default: + result.error("-2", "Not Found AndroidStore.", null); + break; + } + } +} + + + diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java new file mode 100644 index 00000000..67519e07 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckGooglePlayVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckGooglePlayVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckGooglePlayVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Element element = Jsoup.connect("https://play.google.com/store/apps/details?id=" + packageName) + .timeout(30000) + .referrer("http://www.google.com/") + .get() + .select("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)") + .first(); + if (element != null) { + latestVersion = element.ownText(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java new file mode 100644 index 00000000..f178f9ef --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckTencentStoreVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckTencentStoreVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckTencentStoreVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Document document = Jsoup.connect("https://a.app.qq.com/o/simple.jsp?pkgname="+packageName) + .timeout(30000) + .get(); + Element element = document.select("div.pp-comp > p.pp-comp-extra-p:eq(1)") + .first(); + if (element != null) { + latestVersion = element.ownText().split(":")[1]; + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java new file mode 100644 index 00000000..a60f94f6 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/CheckXiaoMiStoreVersionTask.java @@ -0,0 +1,43 @@ +package com.example.r_upgrade.common.tasks; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.io.IOException; + +public class CheckXiaoMiStoreVersionTask extends AsyncTask { + private final String packageName; + private final VersionCallBack callBack; + + public CheckXiaoMiStoreVersionTask(String packageName, VersionCallBack callBack) { + this.packageName = packageName; + this.callBack = callBack; + } + + @Override + protected String doInBackground(String... strings) { + String latestVersion = ""; + try { + Element element = Jsoup.connect("https://app.mi.com/details?id="+packageName) + .timeout(30000) + .referrer("https://app.mi.com/") + .get() + .select("div.container:nth-child(1) > div:nth-child(6) > div:nth-child(1) > div:nth-child(2)") + .first(); + if (element != null) { + latestVersion = element.ownText(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return latestVersion; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + callBack.versionName(s); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java new file mode 100644 index 00000000..4ff0e7d8 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallAsyncTask.java @@ -0,0 +1,133 @@ +package com.example.r_upgrade.common.tasks; + +import android.app.DownloadManager; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; + +import com.example.r_upgrade.RUpgradeFileProvider; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.manager.HotUpgradeManager; +import com.example.r_upgrade.common.manager.IncrementUpgradeManager; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.UpgradeSQLite; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.Map; + +import io.flutter.plugin.common.MethodChannel; + +import static android.content.Context.DOWNLOAD_SERVICE; + +public class GenerateAndInstallAsyncTask extends AsyncTask { + private static final String TAG = "r_upgrade.AsyncTask"; + final WeakReference contextWrapper; + boolean isUserDownloadManager; + MethodChannel.Result result; + private BaseInstallFactory installFactory; + + public GenerateAndInstallAsyncTask(Context context, boolean isUserDownloadManager, MethodChannel.Result result, + BaseInstallFactory installFactory) { + this.contextWrapper = new WeakReference(context); + this.isUserDownloadManager = isUserDownloadManager; + this.result = result; + this.installFactory = installFactory; + } + + @Override + protected Uri doInBackground(Integer... integers) { + Uri uri = null; + try { + int id = integers[0]; + if (this.isUserDownloadManager) { + DownloadManager manager = (DownloadManager) contextWrapper.get().getSystemService(DOWNLOAD_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = manager.getUriForDownloadedFile(id); + } else { + DownloadManager.Query query = new DownloadManager.Query(); + Cursor cursor = manager.query(query.setFilterById(id)); + cursor.moveToNext(); + String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); + uri = Uri.parse(address); + cursor.close(); + } + } else { + Map map = UpgradeSQLite.getInstance(contextWrapper.get()).queryById(id); + if (map == null) return null; + int upgradeFlavor = (int) map.get(UpgradeSQLite.UPGRADE_FLAVOR); + String path = (String) map.get(UpgradeSQLite.PATH); + File file = new File(path); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if (installFactory != null && installFactory instanceof SilentInstallFactory) { + uri = Uri.parse(file.getPath()); + } + if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_INCREMENT) { + String newPath = new IncrementUpgradeManager(contextWrapper.get()).mixinAndGetNewApk(path); + RUpgradeLogger.get().d(TAG, "合成成功,新的安装包路径:" + newPath); + if (newPath == null) return null; + file = new File(newPath); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if (installFactory != null && installFactory instanceof SilentInstallFactory) { + uri = Uri.parse(file.getPath()); + } + } else if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_HOT_UPDATE) { + boolean isSuccess = new HotUpgradeManager(contextWrapper.get()).hotUpgrade(uri); + if (isSuccess) { + return Uri.parse(""); + } else { + return null; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return uri; + } + + @Override + protected void onPostExecute(Uri uri) { + super.onPostExecute(uri); + try { + if (uri != null) { + if (uri.toString().isEmpty()) { + //热更新实现 + postResult(true); + } else { + postResult(installApk(uri)); + } + } else { + postResult(false); + } + } catch (Exception e) { + e.printStackTrace(); + postResult(false); + + } + } + + private void postResult(boolean isSuccess) { + if (result != null) { + result.success(isSuccess); + } + } + + //安装apk + private boolean installApk(Uri uri) { + if (installFactory == null) return true; + return installFactory.install(uri); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java new file mode 100644 index 00000000..9edfcf89 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/GenerateAndInstallByPathAsyncTask.java @@ -0,0 +1,110 @@ +package com.example.r_upgrade.common.tasks; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; + +import com.example.r_upgrade.RUpgradeFileProvider; +import com.example.r_upgrade.common.install.BaseInstallFactory; +import com.example.r_upgrade.common.install.SilentInstallFactory; +import com.example.r_upgrade.common.manager.HotUpgradeManager; +import com.example.r_upgrade.common.manager.IncrementUpgradeManager; +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.UpgradeSQLite; + +import java.io.File; +import java.lang.ref.WeakReference; + +import io.flutter.plugin.common.MethodChannel; + +public class GenerateAndInstallByPathAsyncTask extends AsyncTask { + private static final String TAG = "r_upgrade.AsyncTask"; + final WeakReference contextWrapper; + MethodChannel.Result result; + final String path; + final int upgradeFlavor; + private BaseInstallFactory installFactory; + + public GenerateAndInstallByPathAsyncTask(Context context, String path, int upgradeFlavor, MethodChannel.Result result, BaseInstallFactory installFactory) { + this.contextWrapper = new WeakReference(context); + this.path = path; + this.upgradeFlavor = upgradeFlavor; + this.result = result; + this.installFactory = installFactory; + } + + @Override + protected Uri doInBackground(String... integers) { + Uri uri = null; + try { + File file = new File(path); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if(installFactory != null && installFactory instanceof SilentInstallFactory){ + uri= Uri.parse(file.getPath()); + } + if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_INCREMENT) { + String newPath = new IncrementUpgradeManager(contextWrapper.get()).mixinAndGetNewApk(path); + RUpgradeLogger.get().d(TAG, "合成成功,新的安装包路径:" + newPath); + if (newPath == null) return null; + file = new File(newPath); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + uri = RUpgradeFileProvider.getUriForFile(contextWrapper.get(), contextWrapper.get().getApplicationInfo().packageName + ".fileProvider", file); + } else { + uri = Uri.fromFile(file); + } + if(installFactory != null && installFactory instanceof SilentInstallFactory){ + uri= Uri.parse(file.getPath()); + } + } else if (upgradeFlavor == UpgradeSQLite.UPGRADE_FLAVOR_HOT_UPDATE) { + boolean isSuccess = new HotUpgradeManager(contextWrapper.get()).hotUpgrade(uri); + if (isSuccess) { + return Uri.parse(""); + } else { + return null; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return uri; + } + + @Override + protected void onPostExecute(Uri uri) { + super.onPostExecute(uri); + try { + if (uri != null) { + if (uri.toString().isEmpty()) { + //热更新实现 + postResult(true); + } else { + postResult(installApk(uri)); + } + } else { + postResult(false); + } + } catch (Exception e) { + e.printStackTrace(); + postResult(false); + + } + } + + private void postResult(boolean isSuccess) { + if (result != null) { + result.success(isSuccess); + } + } + + //安装apk + private boolean installApk(Uri uri) { + if (installFactory == null) return true; + return installFactory.install(uri); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java new file mode 100644 index 00000000..3b959e26 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/common/tasks/VersionCallBack.java @@ -0,0 +1,5 @@ +package com.example.r_upgrade.common.tasks; + +public interface VersionCallBack { + void versionName(String version); +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java new file mode 100644 index 00000000..07075d23 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/IRUpgradeMethodHandler.java @@ -0,0 +1,13 @@ +package com.example.r_upgrade.method; + + +import com.example.r_upgrade.common.manager.UpgradeManager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +public interface IRUpgradeMethodHandler { + + void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result); + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java new file mode 100644 index 00000000..3d4ccd2e --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodCallHandler.java @@ -0,0 +1,22 @@ +package com.example.r_upgrade.method; + +import androidx.annotation.NonNull; + +import com.example.r_upgrade.common.manager.UpgradeManager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +public class RUpgradeMethodCallHandler implements MethodChannel.MethodCallHandler { + private final UpgradeManager upgradeManager; + + public RUpgradeMethodCallHandler(UpgradeManager upgradeManager) { + this.upgradeManager = upgradeManager; + } + + @Override + public void onMethodCall(MethodCall call, @NonNull MethodChannel.Result result) { + RUpgradeMethodEnum methodEnum = RUpgradeMethodEnum.valueOf(call.method); + methodEnum.handler(upgradeManager,call, result); + } +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java new file mode 100644 index 00000000..15a0a5ed --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/java/com/example/r_upgrade/method/RUpgradeMethodEnum.java @@ -0,0 +1,103 @@ +package com.example.r_upgrade.method; + + +import com.example.r_upgrade.common.RUpgradeLogger; +import com.example.r_upgrade.common.manager.UpgradeManager; + +import java.util.Map; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + + +public enum RUpgradeMethodEnum implements IRUpgradeMethodHandler { + setDebug { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + RUpgradeLogger.get().setDebug((Boolean) call.argument("isDebug") == Boolean.TRUE); + result.success(null); + } + }, + upgrade { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.upgrade((String) call.argument("url"), + (Map) call.argument("header"), + (String) call.argument("fileName"), + (Integer) call.argument("notificationVisibility"), + (Integer) call.argument("notificationStyle"), + (Integer) call.argument("installType"), + (Boolean) call.argument("useDownloadManager"), (Integer) call.argument("upgradeFlavor"), result); + } + }, + upgradeFromUrl { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.upgradeFromUrl((String) call.argument("url"))); + } + }, + + cancel { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.cancel((Integer) call.argument("id"))); + + } + }, + install { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.installApkById((Integer) call.argument("id"),(Integer) call.argument("installType"), result); + } + }, + installByPath { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.installApkByPath((String) call.argument("path"), (Integer) call.argument("flavor"), (Integer) call.argument("installType"), result); + } + }, + pause { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.pause((Integer) call.argument("id"))); + } + }, + upgradeWithId { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.upgradeWithId((Integer) call.argument("id"), (Integer) call.argument("notificationVisibility"), + (Integer) call.argument("installType"), result); + } + }, + getDownloadStatus { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getDownloadStatus((Integer) call.argument("id"))); + } + }, + getLastUpgradedId { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getLastUpgradedId()); + } + }, + upgradeFromAndroidStore { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.upgradeFromAndroidStore((String) call.argument("store"))); + } + }, + androidStores { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + result.success(upgradeManager.getAndroidStores()); + } + }, + getVersionFromAndroidStore { + @Override + public void handler(UpgradeManager upgradeManager, MethodCall call, MethodChannel.Result result) { + upgradeManager.getVersionFromAndroidStore((String) call.argument("store"), result); + } + } + +} diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml b/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml new file mode 100644 index 00000000..2561b25f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/res/values/r_upgrade_value.xml @@ -0,0 +1,8 @@ + + + %.2f kb/s + %.0fs left + Download finished + Download paused + Download failed + \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml b/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..01ddeb6f --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/android/src/main/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h new file mode 100644 index 00000000..9fb53282 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.h @@ -0,0 +1,4 @@ +#import + +@interface RUpgradePlugin : NSObject +@end diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m new file mode 100644 index 00000000..72a970d2 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/RUpgradePlugin.m @@ -0,0 +1,8 @@ +#import "RUpgradePlugin.h" +#import + +@implementation RUpgradePlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftRUpgradePlugin registerWithRegistrar:registrar]; +} +@end diff --git a/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift b/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift new file mode 100644 index 00000000..1bfc3df1 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/Classes/SwiftRUpgradePlugin.swift @@ -0,0 +1,132 @@ +import Flutter +import UIKit + +public class SwiftRUpgradePlugin: NSObject, FlutterPlugin { + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "com.rhyme/r_upgrade_method", binaryMessenger: registrar.messenger()) + let instance = SwiftRUpgradePlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "setDebug": + result(nil) + break + case "upgradeFromUrl": + print(call.arguments ?? "null") + guard let url = (call.arguments as? Dictionary)?["url"] as? String else { + result(FlutterError(code: "参数url不能为空", message: nil, details: nil)) + return + } + result(openUrl(url: url)) + break + case "upgradeFromAppStore": + print(call.arguments ?? "null") + guard let appId = (call.arguments as? Dictionary)?["appId"] as? String else { + result(FlutterError(code: "参数appId不能为空", message: nil, details: nil)) + return + } + guard let isChina = (call.arguments as? Dictionary)?["isChina"] as? Bool else { + result(FlutterError(code: "参数isChina不能为空", message: nil, details: nil)) + return + } + upgradeFromAppStore(appId: appId,isChina: isChina,result: result) + break; + case "getVersionFromAppStore": + print(call.arguments ?? "null") + guard let appId = (call.arguments as? Dictionary)?["appId"] as? String else{ + result(FlutterError(code: "参数appId不能为空", message: nil, details: nil)) + return + } + guard let isChina = (call.arguments as? Dictionary)?["isChina"] as? Bool else { + result(FlutterError(code: "参数isChina不能为空", message: nil, details: nil)) + return + } + getVersionFromAppStore(appId: appId,isChina:isChina,result: result) + break; + default: + result(FlutterMethodNotImplemented) + } + } + func openUrl(url:String) ->Bool{ + if let url = URL(string: url) { + //根据iOS系统版本,分别处理 + if #available(iOS 10, *) { + UIApplication.shared.open(url, options: [:],completionHandler: {(success) in }) + } else { + UIApplication.shared.openURL(url) + } + return true; + } + return false; + } + + //跳转到应用的AppStore页页面 + func upgradeFromAppStore(appId: String, isChina: Bool,result: @escaping FlutterResult) { + getInfoFromAppStore(appId: appId,isChina: isChina) { dict in + if dict == nil{ + result(false) + }else{ + let res = dict!["results"] as! NSArray + let xx = res[0] as! NSDictionary + let urlString = xx["trackViewUrl"] as! String + result(self.openUrl(url: urlString)) + } + + } error: { error in + result(false) + } + } + + //获取应用信息 + func getInfoFromAppStore(appId:String,isChina:Bool,complete:@escaping(_ result:NSDictionary?)->Void,error:@escaping(_ error:Error?)->Void) { + let checkLink = isChina == true ? "https://itunes.apple.com/cn/lookup?id=" : "https://itunes.apple.com/lookup?id=" + let appUrl = checkLink + appId + let url = NSURL(string: appUrl)! as URL + let request = NSMutableURLRequest(url: url, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 30) + request.httpMethod = "GET" + + let session = URLSession.shared + + let task = session.dataTask(with: request as URLRequest){(data,response,err) in + if err == nil{ + if data == nil{ + NSLog("获取appId:%@ 对应的appStore信息失败",appId) + complete(nil) + } + let httpRequest = response as! HTTPURLResponse + if httpRequest.statusCode == 200 { + let json = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary + if json["resultCount"] as! Int > 0{ + complete(json) + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败,未上架或ID不存在", appId) + complete(nil) + } + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败,未上架或ID不存在", appId) + complete(nil) + } + }else{ + NSLog("获取appId:%@ 对应的appStore信息失败",appId) + error(err) + } + } + task.resume() + } + + func getVersionFromAppStore(appId:String,isChina:Bool,result: @escaping FlutterResult){ + getInfoFromAppStore(appId: appId,isChina: isChina) {dict in + if dict != nil { + let res = dict!["results"] as! NSArray + let xx = res[0] as! NSDictionary + result(xx["version"]! as! String) + }else{ + result(nil) + } + } error: { err in + result(nil) + } + } +} diff --git a/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec b/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec new file mode 100644 index 00000000..d0df6ee3 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/ios/r_upgrade.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'r_upgrade' + s.version = '0.0.1' + s.summary = 'A new Flutter project.' + s.description = <<-DESC +A new Flutter project. + DESC + s.homepage = 'http://example.com/' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' + s.swift_version='5.0' +end + diff --git a/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart b/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart new file mode 100644 index 00000000..8b109288 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/lib/r_upgrade.dart @@ -0,0 +1,484 @@ +// Copyright 2019 The rhyme_lph Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/services.dart'; + +class RUpgrade { + static MethodChannel? __methodChannel; + + /// single + static MethodChannel? get _methodChannel { + if (__methodChannel == null) { + __methodChannel = MethodChannel('com.rhyme/r_upgrade_method'); + __methodChannel!.setMethodCallHandler(_methodCallHandler); + } + return __methodChannel; + } + + /// handle download info call back. + static Future _methodCallHandler(MethodCall call) async { + if (call.method == 'update') { + _downloadInfo.add(DownloadInfo.formMap(call.arguments)); + } + return null; + } + + /// [isDebug] is true will print log. + static Future setDebug(bool isDebug) async { + return _methodChannel!.invokeMethod('setDebug', { + 'isDebug': isDebug, + }); + } + + /// Android and IOS + /// + /// if you want to upgrade in your website + /// + /// [url] your website url + /// + static Future upgradeFromUrl(String url) async { + return await _methodChannel!.invokeMethod("upgradeFromUrl", { + 'url': url, + }); + } + + /// Android + /// + /// if you want to upgrade form your store. + /// + /// [stores] if null,show all store list + /// + static Future upgradeFromAndroidStore(AndroidStore store) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("upgradeFromAndroidStore", { + 'store': store._packageName, + }); + } + + /// Android + /// + /// get android store list. + static Future?> get androidStores async { + assert(Platform.isAndroid, 'This method only support android application'); + return (await _methodChannel!.invokeListMethod('androidStores')) + ?.map((e) => AndroidStore.internal(e)) + .toList(); + } + + /// Android + /// + /// get version from android store. + static Future getVersionFromAndroidStore(AndroidStore store) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod('getVersionFromAndroidStore', { + 'store': store._packageName, + }); + } + + /// Android + /// + /// download broadcast + /// + static StreamController _downloadInfo = + StreamController.broadcast(); + + /// Android + /// + /// Download info stream . this will listen your upgrade progress and more info. + /// + static Stream get stream { + assert(Platform.isAndroid, 'This method only support android application'); + return _downloadInfo.stream; + } + + /// Android + /// + /// You can use this method upgrade your android application.If your application is ios. Oh,so sorry... + /// + /// * [url] download url. + /// * [header] download request header. + /// * [fileName] download filename and notification title name. + /// * [notificationVisibility] download running notification visibility mode. + /// * [notificationStyle] download notification show style about content text, only support [useDownloadManager]==false. + /// * [installType] download completed will install apk, use [RUpgradeInstallType.none] can not install. + /// * [useDownloadManager] if true will use DownloadManager,false will use my service , + /// * if true will no use [pause] , [upgradeWithId] , [getDownloadStatus] , [getLastUpgradedId] methods. + /// * [upgradeFlavor] you can use [RUpgradeFlavor.normal] , [RUpgradeFlavor.hotUpgrade] , [RUpgradeFlavor.incrementUpgrade] flavor + static Future upgrade( + String url, { + Map? header, + String? fileName, + NotificationVisibility notificationVisibility = + NotificationVisibility.VISIBILITY_VISIBLE, + NotificationStyle notificationStyle = NotificationStyle.planTime, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + bool useDownloadManager = false, + RUpgradeFlavor upgradeFlavor = RUpgradeFlavor.normal, + }) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('upgrade', { + 'url': url, + "header": header, + "fileName": fileName, + "notificationVisibility": notificationVisibility.value, + "notificationStyle": notificationStyle.index, + "installType": installType.index, + "useDownloadManager": useDownloadManager, + "upgradeFlavor": upgradeFlavor.index, + }); + } + + /// Android + /// + /// Cancel by the [id] download task . + /// + static Future cancel(int id) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('cancel', { + 'id': id, + }); + } + + /// Android + /// + /// Install your apk by [id]. + /// + static Future install( + int id, { + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("install", { + 'id': id, + 'installType': installType.index, + }); + } + + /// Android + /// + /// Install your apk by [path]. + /// + static Future installByPath( + String path, { + RUpgradeFlavor flavor = RUpgradeFlavor.normal, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("installByPath", { + 'path': path, + 'flavor': flavor.index, + 'installType': installType.index, + }); + } + + /// Android + /// + /// Pause by the [id] download task ,only use to [upgrade] params [useDownloadManager] is false. + /// + static Future pause(int id) { + assert(Platform.isAndroid, 'This method only support android application'); + return _methodChannel!.invokeMethod('pause', { + 'id': id, + }); + } + + /// Android + /// + /// Upgrade with ID ,only use to [upgrade] params [useDownloadManager] is false. + /// + /// * if download status is [STATUS_PAUSED] or [STATUS_FAILED] or [STATUS_CANCEL], will restart running. + /// * if download status is [STATUS_RUNNING] or [STATUS_PENDING], nothing happened. + /// * if download status is [STATUS_SUCCESSFUL] , will install apk. + /// + /// * if not found the id , will return [false]. + static Future upgradeWithId( + int id, { + NotificationVisibility notificationVisibility = + NotificationVisibility.VISIBILITY_VISIBLE, + RUpgradeInstallType installType = RUpgradeInstallType.normal, + }) async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod("upgradeWithId", { + "id": id, + "notificationVisibility": notificationVisibility.value, + "installType": installType.index, + }); + } + + /// Android + /// + /// Get download status by ID , only use to [upgrade] params [useDownloadManager] is false. + /// + static Future getDownloadStatus(int id) async { + assert(Platform.isAndroid, 'This method only support android application'); + int? result = await _methodChannel!.invokeMethod("getDownloadStatus", { + "id": id, + }); + return result == null ? null : DownloadStatus._internal(result); + } + + /// Android + /// + /// Get the ID of the last upgrade by version name and version code , only use to [upgrade] params [useDownloadManager] is false. + /// + static Future getLastUpgradedId() async { + assert(Platform.isAndroid, 'This method only support android application'); + return await _methodChannel!.invokeMethod('getLastUpgradedId'); + } + + /// IOS + /// + /// [appId] your appId in appStore + /// [isChina] if true ,will check this link https://itunes.apple.com/cn/lookup. + /// + static Future upgradeFromAppStore(String appId, + [bool isChina = true]) async { + assert(Platform.isIOS, 'This method only support ios application'); + return await _methodChannel!.invokeMethod("upgradeFromAppStore", { + 'appId': appId, + 'isChina': isChina, + }); + } + + /// IOS + /// + /// [id] your appId in appStore + /// [isChina] if true ,will check this link https://itunes.apple.com/cn/lookup. + /// + static Future getVersionFromAppStore(String appId, + [bool isChina = true]) async { + assert(Platform.isIOS, 'This method only support ios application'); + return await _methodChannel!.invokeMethod("getVersionFromAppStore", { + 'appId': appId, + 'isChina': isChina, + }); + } +} + +/// +/// A model class is download info +/// +/// * [maxLength] download max bytes length +/// * [currentLength] download current bytes length +/// * [status] download status . you can watch [DownloadStatus] +/// * [planTime] download plan time /s +/// * [path] download file path +/// * [percent] download percent 0-100 +/// * [id] download id +/// * [speed] download speed kb/s +/// +class DownloadInfo { + final int? maxLength; + final int? currentLength; + final String? path; + final double? planTime; + final double? percent; + final int? id; + final double? speed; + final DownloadStatus? status; + + DownloadInfo( + {this.maxLength, + this.path, + this.planTime, + this.currentLength, + this.percent, + this.id, + this.status, + this.speed}); + + factory DownloadInfo.formMap(dynamic map) => DownloadInfo( + maxLength: map['max_length'], + currentLength: map['current_length'], + path: map['path'], + planTime: map['plan_time'], + percent: map['percent'], + id: map['id'], + status: DownloadStatus._internal(map['status']), + speed: map['speed'], + ); + + @override + String toString() { + return 'DownloadInfo{total: $maxLength, address: $path, planTime: $planTime, progress: $currentLength, percent: $percent, id: $id, speed: $speed, status: $status}'; + } + + String getSpeedString() { + double _speed = speed ?? 0; + String unit = 'kb/s'; + String result = _speed.toStringAsFixed(2); + if (_speed > 1024 * 1024) { + unit = 'gb/s'; + result = (_speed / (1024 * 1024)).toStringAsFixed(2); + } else if (_speed > 1024) { + unit = 'mb/s'; + result = (_speed / 1024).toStringAsFixed(2); + } + return '$result$unit'; + } +} + +/// +/// A model class is download status +/// +/// * [STATUS_PAUSED] download paused +/// * [STATUS_PENDING] download pending +/// * [STATUS_RUNNING] download running +/// * [STATUS_SUCCESSFUL] download successful +/// * [STATUS_FAILED] download failed +/// * [STATUS_CANCEL] download cancel +/// +class DownloadStatus { + final int? _value; + + int? get value => _value; + + const DownloadStatus._internal(this._value); + + static DownloadStatus from(int value) => DownloadStatus._internal(value); + + static const STATUS_PAUSED = const DownloadStatus._internal(0); + static const STATUS_PENDING = const DownloadStatus._internal(1); + static const STATUS_RUNNING = const DownloadStatus._internal(2); + static const STATUS_SUCCESSFUL = const DownloadStatus._internal(3); + static const STATUS_FAILED = const DownloadStatus._internal(4); + static const STATUS_CANCEL = const DownloadStatus._internal(5); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DownloadStatus && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + toString() => 'DownloadStatus($_value)'; +} + +/// +/// A model class is Notification Visibility +/// +/// * [VISIBILITY_VISIBLE] This download is visible but only shows in the notifications +/// * [VISIBILITY_VISIBLE_NOTIFY_COMPLETED] This download is visible and shows in the notifications while +/// * [VISIBILITY_HIDDEN] This download doesn't show in the UI or in the notifications. +/// * [VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION] This download shows in the notifications after completion ONLY. +/// +class NotificationVisibility { + final int _value; + + const NotificationVisibility._internal(this._value); + + int get value => _value; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is NotificationVisibility && + runtimeType == other.runtimeType && + _value == other._value; + + @override + int get hashCode => _value.hashCode; + + toString() => 'NotificationVisibility($_value)'; + + static NotificationVisibility from(int value) => + NotificationVisibility._internal(value); + + /// This download is visible but only shows in the notifications + /// while it's in progress. + static const VISIBILITY_VISIBLE = const NotificationVisibility._internal(0); + + /// This download is visible and shows in the notifications while + /// in progress and after completion. + static const VISIBILITY_VISIBLE_NOTIFY_COMPLETED = + const NotificationVisibility._internal(1); + + /// This download doesn't show in the UI or in the notifications. + static const VISIBILITY_HIDDEN = const NotificationVisibility._internal(2); + + /// + /// This download shows in the notifications after completion ONLY. + /// + static const VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION = + const NotificationVisibility._internal(3); +} + +/// Notification show style about content text +enum NotificationStyle { + speechAndPlanTime, + planTimeAndSpeech, + speech, + planTime, + none, +} + +/// Upgrade Flavor +enum RUpgradeFlavor { + normal, + hotUpgrade, + incrementUpgrade, +} + +/// Install Type +enum RUpgradeInstallType { + normal, + silent, + none, +} + +/// +/// Android application store. +/// +/// [packageName] store package name. +class AndroidStore { + final String _packageName; + + String get packageName => _packageName; + + const AndroidStore.internal(this._packageName); + + //google play + static const GOOGLE_PLAY = const AndroidStore.internal('com.android.vending'); + + //应用宝 + static const TENCENT = + const AndroidStore.internal('com.tencent.android.qqdownloader'); + + //360手机助手 + static const QIHOO = const AndroidStore.internal('com.qihoo.appstore'); + + //百度手机助手 + static const BAIDU = const AndroidStore.internal('com.baidu.appsearch'); + + //小米应用商店 + static const XIAOMI = const AndroidStore.internal('com.xiaomi.market'); + + //豌豆荚 + static const WANDOU = const AndroidStore.internal('com.wandoujia.phoenix2'); + + //华为应用市场 + static const HUAWEI = const AndroidStore.internal('com.huawei.appmarket'); + + //淘宝手机助手 + static const TAOBAO = const AndroidStore.internal('com.taobao.appcenter'); + + //安卓市场 + static const HIAPK = const AndroidStore.internal('com.hiapk.marketpho'); + + //安智市场 + static const GOAPK = const AndroidStore.internal('cn.goapk.market'); + + //酷安 + static const COOLAPK = const AndroidStore.internal('com.coolapk.market'); + + @override + String toString() { + return 'AndroidStore{_packageName: $_packageName}'; + } +} diff --git a/modules/ability/r_upgrade-0.4.2/pubspec.yaml b/modules/ability/r_upgrade-0.4.2/pubspec.yaml new file mode 100644 index 00000000..63957e8e --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/pubspec.yaml @@ -0,0 +1,64 @@ +name: r_upgrade +description: A plugin for upgrade and install application ,Support Android and IOS. +version: 0.4.2 +homepage: https://github.com/rhymelph/r_upgrade + +environment: + sdk: '>=2.12.0 <3.0.0' + flutter: ">=1.12.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# 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: + # This section identifies this Flutter project as a plugin project. + # The androidPackage and pluginClass identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.example.r_upgrade + pluginClass: RUpgradePlugin + ios: + pluginClass: RUpgradePlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your plugin package, 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 in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart b/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart new file mode 100644 index 00000000..0f2805b6 --- /dev/null +++ b/modules/ability/r_upgrade-0.4.2/test/r_upgrade_test.dart @@ -0,0 +1,20 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const MethodChannel channel = MethodChannel('r_upgrade'); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { +// expect(await RUpgrade.upgrade(''), '42'); + }); +} diff --git a/modules/basic_system/app_update/pubspec.yaml b/modules/basic_system/app_update/pubspec.yaml index 5d10b963..27068efb 100644 --- a/modules/basic_system/app_update/pubspec.yaml +++ b/modules/basic_system/app_update/pubspec.yaml @@ -16,11 +16,12 @@ dependencies: dio: ^5.7.0 convert: ^3.1.2 equatable: ^2.0.5 # 相等辅助 - shared_preferences: ^2.2.3 # xml 固化 - r_upgrade: ^0.4.2 # 应用升级 + shared_preferences: ^2.5.1 # xml 固化 + r_upgrade: + path: ../../ability/r_upgrade-0.4.2 open_file: ^3.5.9 # 打开文件 url_launcher: ^6.3.0 # url - package_info_plus: ^8.0.0 + package_info_plus: ^8.1.4 path_provider: ^2.1.5 fx_dio: ^0.0.3 diff --git a/pubspec.lock b/pubspec.lock index 8e6fa40c..0c8246a8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -345,10 +345,10 @@ packages: dependency: transitive description: name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev/" source: hosted - version: "4.1.2" + version: "4.0.2" image: dependency: "direct main" description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: package_info_plus - sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 url: "https://pub.dev/" source: hosted - version: "8.1.3" + version: "8.1.4" package_info_plus_platform_interface: dependency: transitive description: @@ -688,10 +688,9 @@ packages: r_upgrade: dependency: transitive description: - name: r_upgrade - sha256: "14337dd29cf67265ec86e1d518212cb6b6eafe9167fd366b050ccb1656461c55" - url: "https://pub.dev/" - source: hosted + path: "modules/ability/r_upgrade-0.4.2" + relative: true + source: path version: "0.4.2" refresh: dependency: "direct main" @@ -761,10 +760,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a + sha256: "688ee90fbfb6989c980254a56cb26ebe9bb30a3a2dff439a78894211f73de67a" url: "https://pub.dev/" source: hosted - version: "2.3.5" + version: "2.5.1" shared_preferences_android: dependency: transitive description: @@ -1062,10 +1061,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev/" source: hosted - version: "2.4.0" + version: "2.3.3" url_launcher_windows: dependency: transitive description: @@ -1218,5 +1217,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9ac42678..94386274 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,13 +51,13 @@ dependencies: # 数据与持久化 dio: ^5.4.3+1 # 网络请求 - shared_preferences: ^2.2.2 # xml 固化 + shared_preferences: ^2.5.1 # xml 固化 jwt_decoder: ^2.0.1 # jwt 解析 path_provider: ^2.1.3 # 路径 # 平台功能 connectivity_plus: ^6.0.3 # 网络状态 - url_launcher: ^6.1.14 # url + url_launcher: ^6.3.1 # url archive: ^4.0.2 # 解压 file_picker: ^8.0.5 # 文件选择器 share_plus: ^10.0.1 # 文字分享 From f818fbaccef119b25905b217b285f05fde2402db Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 5 Feb 2025 13:25:43 +0800 Subject: [PATCH 130/149] feature:note --- devtools_options.yaml | 3 + lib/src/navigation/model/app_tab.dart | 10 +- .../router/widgets/collection_route.dart | 2 +- .../view/mobile/pure_bottom_bar.dart | 2 +- .../view/mobile/unit_navigation.dart | 5 +- lib/src/starter/bridge/unit_bridge.dart | 2 +- .../basic_system/app/lib/http/register.dart | 2 +- .../app/lib/http/science/science_host.dart | 10 +- .../note/lib/src/bloc/bloc.dart | 156 +++++++++++- .../src/repository/article_repository.dart | 14 ++ .../lib/src/repository/model/article.dart | 16 ++ .../lib/src/repository/model/category.dart | 28 +++ .../note/lib/src/repository/model/model.dart | 1 + .../note/lib/src/view/art_sys_scope.dart | 17 ++ .../note/lib/src/view/article_admin.dart | 180 ++++---------- .../note/lib/src/view/article_list.dart | 4 +- .../src/view/mobile/mobile_article_list.dart | 142 +++++++++++ .../src/view/mobile/mobile_article_page.dart | 105 ++++++++ .../lib/src/view/mobile/mobile_editor.dart | 226 ++++++++++++++++++ .../note/lib/src/view/mobile/note.dart | 177 ++++++++++++++ .../note/lib/src/view/view.dart | 4 +- modules/knowledge_system/note/pubspec.yaml | 2 + .../knowledge_system/note/test/parser.dart | 68 ++++++ pubspec.lock | 8 + 24 files changed, 1037 insertions(+), 147 deletions(-) create mode 100644 devtools_options.yaml create mode 100644 modules/knowledge_system/note/lib/src/repository/model/category.dart create mode 100644 modules/knowledge_system/note/lib/src/view/art_sys_scope.dart create mode 100644 modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart create mode 100644 modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart create mode 100644 modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart create mode 100644 modules/knowledge_system/note/lib/src/view/mobile/note.dart create mode 100644 modules/knowledge_system/note/test/parser.dart diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 00000000..fa0b357c --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/src/navigation/model/app_tab.dart b/lib/src/navigation/model/app_tab.dart index fa9e2d00..a7273250 100644 --- a/lib/src/navigation/model/app_tab.dart +++ b/lib/src/navigation/model/app_tab.dart @@ -15,6 +15,14 @@ enum AppTab { final IconData icon; final String path; + static List get mobileTabs => [ + widgets, + painter, + knowledge, + note, + mine + ]; + const AppTab(this.path, this.icon); String label(AppL10n l10n) { @@ -34,7 +42,7 @@ enum AppTab { AppTab.knowledge => l10n.mobileTabKnowledge, AppTab.tools => l10n.mobileTabTools, AppTab.mine => l10n.mobileTabMine, - AppTab.note => '匠心巧记', + AppTab.note => '巧记', }; } diff --git a/lib/src/navigation/router/widgets/collection_route.dart b/lib/src/navigation/router/widgets/collection_route.dart index 94e6098c..9b34deec 100644 --- a/lib/src/navigation/router/widgets/collection_route.dart +++ b/lib/src/navigation/router/widgets/collection_route.dart @@ -13,7 +13,7 @@ GoRoute get collectRoute => GoRoute( GoRoute get noteRoute => GoRoute( path: AppRoute.note.path, - builder: (_, __) => const ArticleAdmin(), + builder: (_, __) => ArtSysScope(child: const ArticleAdmin()), // routes: [ // GoRoute(path: AppRoute.collectionDetail.path, builder: collectionDetailBuilder), // ], diff --git a/lib/src/navigation/view/mobile/pure_bottom_bar.dart b/lib/src/navigation/view/mobile/pure_bottom_bar.dart index 608cf6dd..685b45cf 100644 --- a/lib/src/navigation/view/mobile/pure_bottom_bar.dart +++ b/lib/src/navigation/view/mobile/pure_bottom_bar.dart @@ -31,7 +31,7 @@ class PureBottomBar extends StatelessWidget { showUnselectedLabels: true, showSelectedLabels: true, // backgroundColor: themeColor.itemColor, - items: AppTab.values + items: AppTab.mobileTabs .map((AppTab tab) => BottomNavigationBarItem( label: tab.label(l10n), icon: Icon(tab.icon), diff --git a/lib/src/navigation/view/mobile/unit_navigation.dart b/lib/src/navigation/view/mobile/unit_navigation.dart index ad4bcec9..175ef155 100644 --- a/lib/src/navigation/view/mobile/unit_navigation.dart +++ b/lib/src/navigation/view/mobile/unit_navigation.dart @@ -12,7 +12,7 @@ import 'package:flutter_unit/src/navigation/model/app_tab.dart'; import 'package:treasure_tools/treasure_tools.dart'; import 'package:widget_module/blocs/blocs.dart'; import 'package:widget_module/widget_module.dart'; - +import 'package:note/note.dart'; import 'pure_bottom_bar.dart'; /// create by 张风捷特烈 on 2020-04-11 @@ -63,7 +63,8 @@ class _UnitPhoneNavigationState extends State { StandardHomePage(), GalleryUnit(), AlgoScope(child: ArtifactPage()), - MobileToolPage(), + ArtSysScope(child: MobileArticlePage()), + // MobileToolPage(), UserPage(), ], ), diff --git a/lib/src/starter/bridge/unit_bridge.dart b/lib/src/starter/bridge/unit_bridge.dart index 27718a27..33a5d1f2 100644 --- a/lib/src/starter/bridge/unit_bridge.dart +++ b/lib/src/starter/bridge/unit_bridge.dart @@ -6,5 +6,5 @@ import 'package:app/app.dart'; class UnitNoteBridge with NoteModuleBridge{ @override - Host get host => FxDio()(); + Host get host => FxDio()(); } \ No newline at end of file diff --git a/modules/basic_system/app/lib/http/register.dart b/modules/basic_system/app/lib/http/register.dart index bca3a6ad..607c53dd 100644 --- a/modules/basic_system/app/lib/http/register.dart +++ b/modules/basic_system/app/lib/http/register.dart @@ -3,6 +3,6 @@ import 'http.dart'; void registerHttpClient(){ FxDio().register(const ScienceHost(), repInterceptor: ScienceRepInterceptor()); - FxDio().register(const ScienceHostPure()); + FxDio().register(const LightServerHost()); FxDio().register(const UnitHost()); } \ No newline at end of file diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart index d16b6a01..054d9b94 100644 --- a/modules/basic_system/app/lib/http/science/science_host.dart +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -21,13 +21,13 @@ class ScienceHost extends Host { } -class ScienceHostPure extends Host { - const ScienceHostPure(); +class LightServerHost extends Host { + const LightServerHost(); @override Map get value => { - HostEnv.release: 'toly1994.com', - HostEnv.dev: '172.26.16.1', + HostEnv.release: '82.157.176.209', + HostEnv.dev: '127.0.0.1', }; @override @@ -38,7 +38,7 @@ class ScienceHostPure extends Host { ); @override - HostEnv get env => HostEnv.dev; + HostEnv get env => HostEnv.release; } enum ScienceApi { diff --git a/modules/knowledge_system/note/lib/src/bloc/bloc.dart b/modules/knowledge_system/note/lib/src/bloc/bloc.dart index b9f78bb0..8cf52330 100644 --- a/modules/knowledge_system/note/lib/src/bloc/bloc.dart +++ b/modules/knowledge_system/note/lib/src/bloc/bloc.dart @@ -1 +1,155 @@ -// TODO Implement this library. \ No newline at end of file +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/src/repository/article_repository.dart'; +import 'package:note/src/repository/model/article.dart'; + +import '../repository/model/model.dart'; + +class ArtSysBloc extends Cubit { + ArtSysBloc() : super(ArtSysState(articles: [])); + + ArticleRepository _repository = HttpArticleRepository(); + + TextEditingController titleCtrl = TextEditingController(); + TextEditingController ctrl = TextEditingController(); + + Future loadFirstFrame() async { + if(state.articles.isEmpty){ + emit(state.copyWith(status: const LoadingStatus())); + } + ApiRet> ret = await _repository.list(SizeFilter()); + if (ret.success) { + ArtSysState newState = state.copyWith( + articles: ret.data.list, + status: SuccessStatus(ret.data.total), + ); + emit(newState); + _openCurrent(); + return; + } + print(ret.trace?.toString()); + ArtSysState newState = state.copyWith( + status: FailedStatus(ret.trace?.error, ret.trace?.stack), + ); + emit(newState); + } + + void _openCurrent() { + int? id = state.active?.id; + if (id != null) { + open(id); + } + } + + Future newArticle() async { + await _repository.create( + ArticleCreatePayload( + subtitle: '', + title: '新建文档', + url: '', + cover: '', + type: 1, + createAt: DateTime.timestamp().toIso8601String(), + ), + ); + await loadFirstFrame(); + } + + void select(ArticlePo article) { + if (article.type == 1) { + open(article.id); + } else {} + titleCtrl.text = article.title; + emit(state.copyWith(active: article)); + } + + void open(int id) async { + ApiRet ret = await _repository.open(id); + if (ret.success) { + ctrl.text = ret.data; + } + } + + void write(String content) async { + int? id = state.active?.id; + if (id != null) { + ApiRet ret = await _repository.write(id, content); + } + } + + void updateTitleV2() { + ArticlePo? article = state.active; + String title = titleCtrl.text; + if (article != null) { + updateTitle(article, title); + } + } + + void updateTitle(ArticlePo article, String title) async { + if (title == article.title) return; + ApiRet ret = await _repository.update( + article.id, ArticleUpdatePayload(title: title)); + if (ret.success) { + open(article.id); + loadFirstFrame(); + titleCtrl.text = ret.data.title; + } else { + print(ret.trace?.error); + } + } + + Future delete() async{ + int? id = state.active?.id; + if (id != null) { + ApiRet ret = await _repository.delete(id); + await loadFirstFrame(); + + } + + } +} + +sealed class ListStatus { + const ListStatus(); +} + +class LoadingStatus extends ListStatus { + const LoadingStatus(); +} + +class SuccessStatus extends ListStatus { + final int total; + + const SuccessStatus(this.total); +} + +class FailedStatus extends ListStatus { + final Object? error; + final StackTrace? trace; + + const FailedStatus(this.error, [this.trace]); +} + +class ArtSysState { + final List articles; + final ArticlePo? active; + final ListStatus status; + + ArtSysState( + {required this.articles, + this.active, + this.status = const LoadingStatus()}); + + ArtSysState copyWith({ + List? articles, + ArticlePo? active, + ListStatus? status, + }) { + return ArtSysState( + articles: articles ?? this.articles, + active: active ?? this.active, + status: status ?? this.status, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/repository/article_repository.dart b/modules/knowledge_system/note/lib/src/repository/article_repository.dart index 5c2a2c72..a3ce4f4c 100644 --- a/modules/knowledge_system/note/lib/src/repository/article_repository.dart +++ b/modules/knowledge_system/note/lib/src/repository/article_repository.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:fx_dio/fx_dio.dart'; import '../env/env.dart'; @@ -17,6 +19,8 @@ abstract class ArticleRepository { Future> delete(int id); Future> update(int id,ArticleUpdatePayload payload); + + Future> loadArticleTree(); } class HttpArticleRepository implements ArticleRepository { @@ -89,4 +93,14 @@ class HttpArticleRepository implements ArticleRepository { }, ); } + + @override + Future> loadArticleTree() { + return host.get( + '/category', + convertor: (rep) { + return Hierarchy.fromJson(rep['data']); + }, + ); + } } diff --git a/modules/knowledge_system/note/lib/src/repository/model/article.dart b/modules/knowledge_system/note/lib/src/repository/model/article.dart index ae802966..9da1c082 100644 --- a/modules/knowledge_system/note/lib/src/repository/model/article.dart +++ b/modules/knowledge_system/note/lib/src/repository/model/article.dart @@ -1,3 +1,10 @@ +import 'package:intl/intl.dart'; + + +DateFormat _noteTimeShort = DateFormat('yyyy/M/d'); +DateFormat _noteTimeLong = DateFormat('yyyy/M/d HH:mm:ss'); +Duration offset = DateTime.now().timeZoneOffset; + class ArticlePo { final String title; final String? subtitle; @@ -21,6 +28,15 @@ class ArticlePo { this.id = -1, }); + String get updateDate { + return _noteTimeLong.format(DateTime.fromMillisecondsSinceEpoch(update).add(offset)); + } + + + String get createDate => + _noteTimeShort.format(DateTime.fromMillisecondsSinceEpoch(create).add(offset)); + + factory ArticlePo.fromApi(dynamic map) => ArticlePo( id: map['article_id'] ?? 0, title: map['title'] ?? '', diff --git a/modules/knowledge_system/note/lib/src/repository/model/category.dart b/modules/knowledge_system/note/lib/src/repository/model/category.dart new file mode 100644 index 00000000..f175d011 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/repository/model/category.dart @@ -0,0 +1,28 @@ +class Hierarchy { + final int cateId; + final String name; + final int cateType; + final int priority; + final List children; + + Hierarchy({ + required this.cateId, + required this.name, + this.cateType = 0, + this.priority = 0, + this.children = const [], + }); + + factory Hierarchy.fromJson(Map json) { + return Hierarchy( + cateId: json['cate_id'] as int, + name: json['name'] as String, + cateType: json['cate_type'] as int? ?? 0, + priority: json['priority'] as int? ?? 0, + children: (json['children'] as List?) + ?.map((child) => Hierarchy.fromJson(child)) + .toList() ?? + [], + ); + } +} \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/repository/model/model.dart b/modules/knowledge_system/note/lib/src/repository/model/model.dart index cb729d99..2afcd687 100644 --- a/modules/knowledge_system/note/lib/src/repository/model/model.dart +++ b/modules/knowledge_system/note/lib/src/repository/model/model.dart @@ -1,3 +1,4 @@ export 'status.dart'; export 'article.dart'; +export 'category.dart'; export 'query.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart b/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart new file mode 100644 index 00000000..c2ae1fad --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/art_sys_scope.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; + +class ArtSysScope extends StatelessWidget { + final Widget child; + + const ArtSysScope({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => ArtSysBloc()..loadFirstFrame(), + child: child, + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/article_admin.dart b/modules/knowledge_system/note/lib/src/view/article_admin.dart index e4c829c0..3fc51a75 100644 --- a/modules/knowledge_system/note/lib/src/view/article_admin.dart +++ b/modules/knowledge_system/note/lib/src/view/article_admin.dart @@ -1,13 +1,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:fx_dio/fx_dio.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; import 'package:tolyui/tolyui.dart'; import 'package:app/app.dart'; -import '../repository/article_repository.dart'; -import '../repository/model/model.dart'; import 'article_editor.dart'; -import 'article_item.dart'; -import 'components/button/button.dart'; import 'article_list.dart'; class ArticleAdmin extends StatefulWidget { @@ -18,76 +15,22 @@ class ArticleAdmin extends StatefulWidget { } class _ArticleAdminState extends State { - ArticleRepository _repository = HttpArticleRepository(); - - @override - void initState() { - super.initState(); - _queryScienceArticle(); - } - - List articles = []; - int total = 0; - int currentIndex = 1; - ArticlePo? active; - TaskStatus status = const TaskNone(); - - TextEditingController ctrl = TextEditingController(); - TextEditingController titleCtrl = TextEditingController(); - - Future _queryScienceArticle() async { - setState(() { - status = const TaskLoading(); - }); - ApiRet> ret = await _repository.list(SizeFilter()); - if (ret.success) { - articles = ret.data.list; - total = ret.data.total; - setState(() { - status = TaskSuccess(); - }); - } else { - status = TaskFailed(ret.trace); - setState(() {}); - } - } - - void updateTitle(int id, String title) async { - ApiRet ret = - await _repository.update(id, ArticleUpdatePayload(title: title)); - if (ret.success) { - _loadArticleContent(id); - _queryScienceArticle(); - titleCtrl.text = ret.data.title; - setState(() { - active = ret.data; - }); - } else { - print(ret.trace?.error); - } - } @override Widget build(BuildContext context) { - Widget table = switch (status) { - TaskNone() => Scaffold(), - TaskLoading() => const CupertinoActivityIndicator(), - TaskSuccess() => ArticleList( - articles: articles, - activeId: active?.id ?? -1, - onTap: (ArticlePo article) { - if (article.type == 1) { - _loadArticleContent(article.id); - } else {} - titleCtrl.text = article.title; + ArtSysBloc bloc = context.watch(); + ListStatus status = bloc.state.status; + bool hasActive = bloc.state.active != null; - setState(() { - active = article; - }); - }, - onUpdateTitle: updateTitle, + Widget table = switch (status) { + LoadingStatus() => const CupertinoActivityIndicator(), + SuccessStatus() => ArticleList( + articles: bloc.state.articles, + activeId: bloc.state.active?.id ?? -1, + onTap: bloc.select, + onUpdateTitle: bloc.updateTitle, ), - TaskFailed() => Scaffold(), + FailedStatus() => Text("Error:${status.error}"), }; return Scaffold( backgroundColor: Colors.white, @@ -127,7 +70,9 @@ class _ArticleAdminState extends State { size: 20, color: Color(0xff242a39), ), - onTap: () {}, + onTap: () async{ + bloc.loadFirstFrame(); + }, ), ], ), @@ -139,19 +84,7 @@ class _ArticleAdminState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 12), child: ElevatedButton( - onPressed: () async { - await _repository.create( - ArticleCreatePayload( - subtitle: '', - title: '新建文档', - url: '', - cover: '', - type: 1, - createAt: DateTime.now().toIso8601String(), - ), - ); - _queryScienceArticle(); - }, + onPressed: bloc.newArticle, child: Wrap( spacing: 6, crossAxisAlignment: WrapCrossAlignment.center, @@ -194,18 +127,14 @@ class _ArticleAdminState extends State { height: 46, child: Row( children: [ - if (active != null) + if (hasActive) Expanded( child: Padding( padding: const EdgeInsets.only(left: 12.0), child: TextField( - onTapOutside: (_){ - updateTitle(active?.id ?? 0, titleCtrl.text); - }, - onSubmitted: (String value) { - updateTitle(active?.id ?? 0, value); - }, - controller: titleCtrl, + onTapOutside: (_) => bloc.updateTitleV2(), + onSubmitted: (_) => bloc.updateTitleV2(), + controller: bloc.titleCtrl, decoration: InputDecoration(border: InputBorder.none), style: TextStyle( @@ -215,7 +144,7 @@ class _ArticleAdminState extends State { ), ), ), - if (active == null) Spacer(), + if (!hasActive) Spacer(), WindowButtons() ], ), @@ -224,15 +153,10 @@ class _ArticleAdminState extends State { Expanded( child: TextField( style: TextStyle(fontSize: 14), - onChanged: (String value) async { - if (active?.id != null) { - ApiRet ret = - await _repository.write(active!.id, value); - } - }, + onChanged: bloc.write, maxLines: null, minLines: null, - controller: ctrl, + controller: bloc.ctrl, expands: true, decoration: InputDecoration( border: InputBorder.none, @@ -275,27 +199,27 @@ class _ArticleAdminState extends State { ); } - void _onPageChanged(int value) { - queryArticle(value); - } + // void _onPageChanged(int value) { + // queryArticle(value); + // } - Future queryArticle(int page) async { - setState(() { - status = const TaskLoading(); - }); - ApiRet> ret = - await _repository.list(SizeFilter(page: page)); - if (ret.success) { - articles = ret.data.list; - total = ret.data.total; - setState(() { - status = const TaskSuccess(); - }); - } else { - status = TaskFailed(ret.trace); - setState(() {}); - } - } + // Future queryArticle(int page) async { + // setState(() { + // status = const TaskLoading(); + // }); + // ApiRet> ret = + // await _repository.list(SizeFilter(page: page)); + // if (ret.success) { + // articles = ret.data.list; + // total = ret.data.total; + // setState(() { + // status = const TaskSuccess(); + // }); + // } else { + // status = TaskFailed(ret.trace); + // setState(() {}); + // } + // } void showAddDialog(BuildContext context) { showDialog( @@ -304,21 +228,15 @@ class _ArticleAdminState extends State { return EditArticleDialog( onCreate: (payload) async { // 在这里处理更新后的文章 - ApiRet ret = await _repository.create(payload); - if (ret.success) { - currentIndex = 1; - queryArticle(currentIndex); - } + // ApiRet ret = await _repository.create(payload); + // if (ret.success) { + // currentIndex = 1; + // queryArticle(currentIndex); + // } }, ); }, ); } - void _loadArticleContent(int id) async { - ApiRet ret = await _repository.open(id); - if (ret.success) { - ctrl.text = ret.data; - } - } } diff --git a/modules/knowledge_system/note/lib/src/view/article_list.dart b/modules/knowledge_system/note/lib/src/view/article_list.dart index f4d09e5c..6229e4c2 100644 --- a/modules/knowledge_system/note/lib/src/view/article_list.dart +++ b/modules/knowledge_system/note/lib/src/view/article_list.dart @@ -28,7 +28,7 @@ class ArticleList extends StatelessWidget { } } -typedef OnUpdateTitle = Function(int id, String title); +typedef OnUpdateTitle = Function(ArticlePo article, String title); class ArticleItem extends StatefulWidget { final bool active; @@ -150,7 +150,7 @@ class _ArticleItemState extends State { void _updateTitle(){ String value = _ctrl?.text??''; if(value.isEmpty) return; - widget.onUpdateTitle(widget.article.id,_ctrl?.text??''); + widget.onUpdateTitle(widget.article,_ctrl?.text??''); } bool _hovered = false; diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart new file mode 100644 index 00000000..60becfac --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_list.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/gestures/events.dart'; +import 'package:note/src/repository/model/model.dart'; +import 'package:tolyui/tolyui.dart'; +class MobileArticleList extends StatelessWidget { + final List articles; + final ValueChanged onTap; + final int activeId; + final OnUpdateTitle onUpdateTitle; + + const MobileArticleList( + {super.key, + required this.articles, + required this.activeId, + required this.onTap, + required this.onUpdateTitle}); + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: EdgeInsets.symmetric(vertical: 8), + separatorBuilder: (_, __) => SizedBox( + height: 6, + ), + itemCount: articles.length, + itemBuilder: (_, index) => MobileArticleItem( + onTap: onTap, + active: articles[index].id == activeId, + article: articles[index], + onUpdateTitle: onUpdateTitle, + ), + ); + } +} + +typedef OnUpdateTitle = Function(int id, String title); + +class MobileArticleItem extends StatefulWidget { + final bool active; + final ArticlePo article; + final ValueChanged onTap; + final OnUpdateTitle onUpdateTitle; + + const MobileArticleItem({ + super.key, + required this.active, + required this.article, + required this.onTap, + required this.onUpdateTitle, + }); + + @override + State createState() => _MobileArticleItemState(); +} + +class _MobileArticleItemState extends State { + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => widget.onTap(widget.article), + child: Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(4)), + child: Column( + spacing: 4, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + spacing: 6, + children: [ + Icon( + widget.article.type == 1 ? Icons.event_note : Icons.wordpress, + size: 20, + color: Color(0xffa6aebd), + ), + Expanded( + child: Text( + widget.article.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.bold,), + ), + ), + ], + ), + Row( + children: [ + Text( + style: TextStyle(fontSize: 12), + widget.article.createDate, + ), + Text(" → "), + Text( + style: TextStyle(fontSize: 12), + widget.article.updateDate, + ) + ], + ) + ], + ), + ), + ); + } + + void _updateTitle() { + String value = _ctrl?.text ?? ''; + if (value.isEmpty) return; + widget.onUpdateTitle(widget.article.id, _ctrl?.text ?? ''); + } + + TextEditingController? _ctrl; + FocusNode? _focusNode; +} + +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第一篇',style: TextStyle(fontWeight: FontWeight.bold,color: Color(0xff5b89fe)),), +// ), +// Container( +// alignment: Alignment.centerLeft, +// padding: EdgeInsets.symmetric(horizontal: 8), +// margin: EdgeInsets.symmetric(horizontal: 6), +// height: 32, +// width: 200, +// decoration: BoxDecoration( +// // color: Color(0xffd7e2ff), +// borderRadius: BorderRadius.circular(4) +// ), +// child: Text('第二篇',style: TextStyle(color: Colors.black),), +// ), diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart new file mode 100644 index 00000000..77219020 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_article_page.dart @@ -0,0 +1,105 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fx_dio/fx_dio.dart'; + +import '../../repository/article_repository.dart'; +import '../../repository/model/model.dart'; +import '../article_list.dart'; +import 'mobile_article_list.dart'; +import 'mobile_editor.dart'; +import 'note.dart'; + + + +class MobileArticlePage extends StatefulWidget { + const MobileArticlePage({super.key}); + + @override + State createState() => _MobileArticlePageState(); +} + +class _MobileArticlePageState extends State { + ArticleRepository _repository = HttpArticleRepository(); + + @override + void initState() { + super.initState(); + _queryScienceArticle(); + } + + List articles = []; + int total = 0; + int currentIndex = 1; + ArticlePo? active; + TaskStatus status = const TaskNone(); + + TextEditingController ctrl = TextEditingController(); + TextEditingController titleCtrl = TextEditingController(); + + Future _queryScienceArticle() async { + setState(() { + status = const TaskLoading(); + }); + ApiRet> ret = await _repository.list(SizeFilter()); + if (ret.success) { + articles = ret.data.list; + total = ret.data.total; + setState(() { + status = TaskSuccess(); + }); + } else { + status = TaskFailed(ret.trace); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { +return PinnedHeaderSliverNode2(); + Widget body = switch (status) { + TaskNone() => SizedBox(), + TaskLoading() => const CupertinoActivityIndicator(), + TaskSuccess() => MobileArticleList( + articles: articles, + activeId: active?.id ?? -1, + onTap: (ArticlePo article) { + if (article.type == 1) { + Navigator.of(context).push(MaterialPageRoute(builder: (ctx){ + return MobileEditor(article: article,); + })); + // _loadArticleContent(article.id); + } else {} + titleCtrl.text = article.title; + + setState(() { + active = article; + }); + }, + onUpdateTitle: updateTitle, + ), + TaskFailed() => Scaffold(), + }; + return Scaffold( + backgroundColor: Color(0xfff5f5f5), + bottomNavigationBar: Container( + height: 56, + ), + floatingActionButton: FloatingActionButton( + shape: StadiumBorder(), + mini: true, + elevation: 4, + + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + onPressed: () {}, + child: Icon(Icons.add), + ), + appBar: AppBar( + title: Text('匠心巧记'), + ), + body: body, + ); + } + + updateTitle(int id, String title) {} +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart b/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart new file mode 100644 index 00000000..0326c9f1 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/mobile_editor.dart @@ -0,0 +1,226 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fx_dio/fx_dio.dart'; +import 'package:note/note.dart'; + +import '../../repository/article_repository.dart'; +import '../../repository/model/model.dart'; + +class MobileEditor extends StatefulWidget { + final ArticlePo article; + + const MobileEditor({super.key, required this.article}); + + @override + State createState() => _MobileEditorState(); +} + +class _MobileEditorState extends State { + TextEditingController ctrl = TextEditingController(); + ArticleRepository _repository = HttpArticleRepository(); + FocusNode titleFocusNode = FocusNode(); + + @override + void initState() { + super.initState(); + // _loadArticleContent(widget.article.id); + titleFocusNode.addListener(_titleFocusNode); + } + + // void _loadArticleContent(int id) async { + // ApiRet ret = await _repository.open(id); + // if (ret.success) { + // ctrl.text = ret.data; + // } + // } + + @override + Widget build(BuildContext context) { + ArtSysBloc bloc = context.watch(); + + return Scaffold( + backgroundColor: Color(0xfffafafa), + appBar: AppBar( + surfaceTintColor: Colors.transparent, + backgroundColor: Color(0xfffafafa), + // title: Text(widget.article.title), + actions: [IconButton(onPressed: () { + showBottomTip(context); + }, icon: Icon(Icons.more_vert))], + bottom: PreferredSize( + preferredSize: Size.fromHeight(32), + child: Padding( + padding: const EdgeInsets.only(bottom: 4.0, left: 18), + child: Row( + spacing: 8, + children: [ + Text( + '${bloc.state.active?.updateDate}', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + SizedBox(height: 14, child: VerticalDivider()), + Text( + '${bloc.ctrl.text.length} 字', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + SizedBox(height: 14, child: VerticalDivider()), + Text( + '全部文件', + style: TextStyle( + fontSize: 12, + color: Color( + 0xffadadad, + )), + ), + ], + ), + )), + ), + body: Column( + children: [ + Divider(), + TextField( + controller: bloc.titleCtrl, + focusNode: titleFocusNode, + maxLines: 4, + minLines: 1, + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + decoration: InputDecoration( + border: InputBorder.none, + isCollapsed: true, + contentPadding: EdgeInsets.only(left: 16, right: 16, top: 8)), + ), + Expanded( + child: TextField( + style: TextStyle(fontSize: 14), + onChanged: (String value) async { + if (widget.article.id != null) { + ApiRet ret = + await _repository.write(widget.article.id, value); + } + }, + maxLines: null, + minLines: null, + controller: bloc.ctrl, + expands: true, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: + EdgeInsets.symmetric(horizontal: 16, vertical: 8)), + ), + ), + ], + ), + ); + } + + void _titleFocusNode() { + print("=====_titleFocusNode============"); + if(!titleFocusNode.hasFocus){ + ArtSysBloc bloc = context.read(); + bloc.updateTitleV2(); + } + } + + void showBottomTip(BuildContext context) { + showCupertinoModalPopup( + context: context, + builder: (_) => PopBottomTip( + onDelete: () async{ + await context.read().delete(); + Navigator.of(context).pop(); + }, + message: '当前文当更多操作', + deleteText: '删除文档', + ), + ); + } +} + + +class PopBottomTip extends StatelessWidget { + final VoidCallback onDelete; + final String message; + final String deleteText; + + const PopBottomTip({ + super.key, + required this.onDelete, + required this.message, + required this.deleteText, + }); + + @override + Widget build(BuildContext context) { + return SafeArea( + bottom: true, + child: Material( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), + topRight: Radius.circular(6), + )), + color: Colors.white, + child: SizedBox( + width: MediaQuery.sizeOf(context).width, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 52, + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 0.5, + color: Colors.grey.withOpacity(0.2)))), + child: Text( + message, + style: TextStyle(color: Color(0xff8f8f8f)), + )), + + InkWell( + splashColor: Colors.white, + onTap: () { + Navigator.of(context).pop(); + onDelete(); + }, + child: Container( + height: 56, + alignment: Alignment.center, + child: Text( + deleteText, + style: TextStyle(color: Color(0xfff14835), fontSize: 16), + )), + ), + Container( + color: Color(0xfff2f3f5), + height: 8, + ), + InkWell( + splashColor: Colors.white, + onTap: () => Navigator.of(context).pop(), + child: Container( + height: 56, + alignment: Alignment.center, + child: Text( + '取消', + style: TextStyle(fontSize: 16), + )), + ), + ], + ), + ), + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/mobile/note.dart b/modules/knowledge_system/note/lib/src/view/mobile/note.dart new file mode 100644 index 00000000..a8dc13a6 --- /dev/null +++ b/modules/knowledge_system/note/lib/src/view/mobile/note.dart @@ -0,0 +1,177 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:note/note.dart'; + +import '../../repository/model/model.dart'; +import 'mobile_article_list.dart'; +import 'mobile_editor.dart'; + +class PinnedHeaderSliverNode2 extends StatefulWidget { + const PinnedHeaderSliverNode2({super.key}); + + @override + State createState() => + _PinnedHeaderSliverNode2State(); +} + +class _PinnedHeaderSliverNode2State extends State { + int count = 0; + late final ScrollController scrollController; + + @override + void initState() { + super.initState(); + scrollController = ScrollController(); + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + final ColorScheme colorScheme = theme.colorScheme; + ArtSysBloc bloc = context.watch(); + ListStatus status = bloc.state.status; + List articles = bloc.state.articles; + bool hasActive = bloc.state.active != null; + return Scaffold( + bottomNavigationBar: Container( + height: 52, + ), + floatingActionButton: FloatingActionButton( + shape: StadiumBorder(), + mini: true, + elevation: 4, + + backgroundColor: Theme.of(context).primaryColor, + foregroundColor: Colors.white, + onPressed: () async{ + ArtSysBloc bloc = context.read(); + await bloc.newArticle(); + ArticlePo article = bloc.state.articles.first; + bloc.select(article); + await Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return BlocProvider.value( + value: bloc, + child: MobileEditor( + article: article, + ), + ); + })); + }, + child: Icon(Icons.add), + ), + backgroundColor: Color(0xfff5f5f5), + body: CustomScrollView( + controller: scrollController, + slivers: [ + _buildSliverBar(), + _buildTitleText(), + const PinnedHeaderSliver(child: Divider()), + ...ListView.separated( + padding: EdgeInsets.symmetric(vertical: 8), + separatorBuilder: (_, __) => SizedBox( + height: 6, + ), + itemCount: articles.length, + itemBuilder: (_, index) => MobileArticleItem( + onTap: _onTap, + active: false, + article: articles[index], + onUpdateTitle: onUpdateTitle, + ), + ).buildSlivers(context), + ], + ), + ); + } + + Widget _buildSliverBar() { + const Icon icon = Icon(Icons.more_vert); + const TextStyle style = + TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + const Text text = Text('匠心巧记', style: style); + Widget action = IconButton(onPressed: () {}, icon: icon); + return SliverLayoutBuilder(builder: (_, scs) { + double factor = (scs.scrollOffset / kToolbarHeight).clamp(0, 1); + factor = factor < 0.2 ? 0 : factor; + AppBar header = AppBar( + backgroundColor: Color(0xfff5f5f5), + surfaceTintColor: Colors.transparent, + actions: [action], + centerTitle: true, + title: Opacity(opacity: factor, child: text), + ); + return PinnedHeaderSliver(child: header); + }); + } + + Widget _buildTitleText() { + const TextStyle style = + TextStyle(fontSize: 20, fontWeight: FontWeight.bold); + const Text text = Text('匠心巧记', style: style); + return const SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.only(left: 12.0, bottom: 8), + child: text, + ), + ); + } + + void _onTap(ArticlePo article) async { + if (article.type == 1) { + ArtSysBloc bloc = context.read(); + bloc.select(article); + await Navigator.of(context).push(MaterialPageRoute(builder: (ctx) { + return BlocProvider.value( + value: context.read(), + child: MobileEditor( + article: article, + ), + ); + })); + // _loadArticleContent(article.id); + } else {} + } + + onUpdateTitle(int id, String title) {} +} + +class _ItemList extends StatelessWidget { + const _ItemList({ + super.key, + this.itemCount = 50, + }); + + final int itemCount; + + @override + Widget build(BuildContext context) { + final ColorScheme colorScheme = Theme.of(context).colorScheme; + return SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return ListTile( + dense: true, + textColor: colorScheme.secondary, + title: Text('#$index title'), + subtitle: Text('Subtitle in line $index'), + ); + }, + childCount: itemCount, + ), + ); + } +} diff --git a/modules/knowledge_system/note/lib/src/view/view.dart b/modules/knowledge_system/note/lib/src/view/view.dart index 9ccda86b..1fd229f3 100644 --- a/modules/knowledge_system/note/lib/src/view/view.dart +++ b/modules/knowledge_system/note/lib/src/view/view.dart @@ -1 +1,3 @@ -export 'article_admin.dart'; \ No newline at end of file +export 'article_admin.dart'; +export 'art_sys_scope.dart'; +export 'mobile/mobile_article_page.dart'; \ No newline at end of file diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml index 7b2a145a..0cd7efb8 100644 --- a/modules/knowledge_system/note/pubspec.yaml +++ b/modules/knowledge_system/note/pubspec.yaml @@ -13,6 +13,8 @@ dependencies: flutter: sdk: flutter fx_dio: 0.0.4 + flutter_bloc: ^8.1.6 # 状态管理 + two_dimensional_scrollables: ^0.3.3 dev_dependencies: flutter_test: diff --git a/modules/knowledge_system/note/test/parser.dart b/modules/knowledge_system/note/test/parser.dart new file mode 100644 index 00000000..863dce2f --- /dev/null +++ b/modules/knowledge_system/note/test/parser.dart @@ -0,0 +1,68 @@ +import 'dart:convert'; + +main(){ + // 示例 JSON 字符串 + final jsonString = ''' + { + "status": true, + "msg": "请求成功!", + "data": { + "cate_id": 1, + "name": "匠心空间", + "cate_type": 0, + "priority": 0, + "children": [ + { + "cate_id": 2, + "name": "全部笔记", + "children": [ + {"cate_id":4, "name":"我的随笔"}, + {"cate_id":5, "name":"编程技术"} + ] + }, + { + "cate_id": 3, + "name": "网络博文", + "children": [ + {"cate_id":6, "name":"掘金文章"}, + {"cate_id":7, "name":"微信公众号"} + ] + } + ] + } + } + '''; + // 解析过程 + final Map parsedJson = jsonDecode(jsonString); + final Category category = Category.fromJson(parsedJson['data']); + print(category); +} + +class Category { + final int cateId; + final String name; + final int cateType; + final int priority; + final List children; + + Category({ + required this.cateId, + required this.name, + this.cateType = 0, + this.priority = 0, + this.children = const [], + }); + + factory Category.fromJson(Map json) { + return Category( + cateId: json['cate_id'] as int, + name: json['name'] as String, + cateType: json['cate_type'] as int? ?? 0, + priority: json['priority'] as int? ?? 0, + children: (json['children'] as List?) + ?.map((child) => Category.fromJson(child)) + .toList() ?? + [], + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 3c14baf7..00840c14 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1009,6 +1009,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.0.0" + two_dimensional_scrollables: + dependency: transitive + description: + name: two_dimensional_scrollables + sha256: b6028c80e782e58a5d18f9491737aae4f70d72dc08050ac92006905c7c0b5e21 + url: "https://pub.dev/" + source: hosted + version: "0.3.3" typed_data: dependency: transitive description: From 40d5651801a756ff44a75fa76bfd35a7f79408a2 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 11 Feb 2025 09:51:08 +0800 Subject: [PATCH 131/149] feature:translation --- assets/images/widgets/GridView.svg | 52 ++ assets/images/widgets/ListView.svg | 27 +- assets/images/widgets/PageView.svg | 24 + .../images/widgets/SingleChildScrollView.svg | 43 ++ lib/src/flutter_unit.dart | 3 +- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + .../app/lib/http/science/science_host.dart | 17 +- modules/basic_system/l10n/lib/arb/app_ja.arb | 188 ++++++ modules/basic_system/l10n/lib/arb/app_ko.arb | 186 ++++++ modules/basic_system/l10n/lib/arb/app_ru.arb | 194 ++++++ modules/basic_system/l10n/lib/arb/app_zh.arb | 5 - .../l10n/lib/gen_l10n/app_localizations.dart | 11 +- .../lib/gen_l10n/app_localizations_ja.dart | 560 ++++++++++++++++++ .../lib/gen_l10n/app_localizations_ko.dart | 560 ++++++++++++++++++ .../lib/gen_l10n/app_localizations_ru.dart | 560 ++++++++++++++++++ modules/knowledge_system/note/lib/note.dart | 3 +- .../note/lib/src/view/article_admin.dart | 30 + modules/knowledge_system/note/pubspec.yaml | 1 + .../lib/views/components/widget_logo_map.dart | 7 +- .../Column/desc_de_DE.json | 26 + .../Column/desc_en_US.json | 26 + .../Column/desc_es_ES.json | 26 + .../Column/desc_fr_FR.json | 26 + .../Column/desc_it_IT.json | 26 + .../Column/desc_ja_JP.json | 26 + .../Column/desc_ko_KR.json | 26 + .../Column/desc_pt_PT.json | 26 + .../Column/desc_ru_RU.json | 26 + .../CustomMultiChildLayout/desc_de_DE.json | 22 + .../CustomMultiChildLayout/desc_en_US.json | 22 + .../CustomMultiChildLayout/desc_es_ES.json | 22 + .../CustomMultiChildLayout/desc_fr_FR.json | 22 + .../CustomMultiChildLayout/desc_it_IT.json | 22 + .../CustomMultiChildLayout/desc_ja_JP.json | 22 + .../CustomMultiChildLayout/desc_ko_KR.json | 22 + .../CustomMultiChildLayout/desc_pt_PT.json | 22 + .../CustomMultiChildLayout/desc_ru_RU.json | 22 + .../Flex/desc_de_DE.json | 53 ++ .../Flex/desc_en_US.json | 53 ++ .../Flex/desc_es_ES.json | 53 ++ .../Flex/desc_fr_FR.json | 53 ++ .../Flex/desc_it_IT.json | 53 ++ .../Flex/desc_ja_JP.json | 53 ++ .../Flex/desc_ko_KR.json | 53 ++ .../Flex/desc_pt_PT.json | 53 ++ .../Flex/desc_ru_RU.json | 53 ++ .../Flow/desc_de_DE.json | 29 + .../Flow/desc_en_US.json | 29 + .../Flow/desc_es_ES.json | 29 + .../Flow/desc_fr_FR.json | 29 + .../Flow/desc_it_IT.json | 29 + .../Flow/desc_ja_JP.json | 29 + .../Flow/desc_ko_KR.json | 29 + .../Flow/desc_pt_PT.json | 29 + .../Flow/desc_ru_RU.json | 29 + .../IndexedStack/desc_de_DE.json | 20 + .../IndexedStack/desc_en_US.json | 20 + .../IndexedStack/desc_es_ES.json | 20 + .../IndexedStack/desc_fr_FR.json | 20 + .../IndexedStack/desc_it_IT.json | 20 + .../IndexedStack/desc_ja_JP.json | 20 + .../IndexedStack/desc_ko_KR.json | 20 + .../IndexedStack/desc_pt_PT.json | 20 + .../IndexedStack/desc_ru_RU.json | 20 + .../ListBody/desc_de_DE.json | 20 + .../ListBody/desc_en_US.json | 20 + .../ListBody/desc_es_ES.json | 20 + .../ListBody/desc_fr_FR.json | 20 + .../ListBody/desc_it_IT.json | 20 + .../ListBody/desc_ja_JP.json | 20 + .../ListBody/desc_ko_KR.json | 20 + .../ListBody/desc_pt_PT.json | 20 + .../ListBody/desc_ru_RU.json | 20 + .../NestedScrollViewViewport/desc_de_DE.json | 24 + .../NestedScrollViewViewport/desc_en_US.json | 24 + .../NestedScrollViewViewport/desc_es_ES.json | 24 + .../NestedScrollViewViewport/desc_fr_FR.json | 24 + .../NestedScrollViewViewport/desc_it_IT.json | 24 + .../NestedScrollViewViewport/desc_ja_JP.json | 24 + .../NestedScrollViewViewport/desc_ko_KR.json | 24 + .../NestedScrollViewViewport/desc_pt_PT.json | 24 + .../NestedScrollViewViewport/desc_ru_RU.json | 24 + .../RichText/desc_de_DE.json | 26 + .../RichText/desc_en_US.json | 26 + .../RichText/desc_es_ES.json | 26 + .../RichText/desc_fr_FR.json | 26 + .../RichText/desc_it_IT.json | 26 + .../RichText/desc_ja_JP.json | 26 + .../RichText/desc_ko_KR.json | 26 + .../RichText/desc_pt_PT.json | 26 + .../RichText/desc_ru_RU.json | 26 + .../Row/desc_de_DE.json | 26 + .../Row/desc_en_US.json | 26 + .../Row/desc_es_ES.json | 26 + .../Row/desc_fr_FR.json | 26 + .../Row/desc_it_IT.json | 26 + .../Row/desc_ja_JP.json | 26 + .../Row/desc_ko_KR.json | 26 + .../Row/desc_pt_PT.json | 26 + .../Row/desc_ru_RU.json | 26 + .../ShrinkWrappingViewport/desc_de_DE.json | 26 + .../ShrinkWrappingViewport/desc_en_US.json | 26 + .../ShrinkWrappingViewport/desc_es_ES.json | 26 + .../ShrinkWrappingViewport/desc_fr_FR.json | 26 + .../ShrinkWrappingViewport/desc_it_IT.json | 26 + .../ShrinkWrappingViewport/desc_ja_JP.json | 26 + .../ShrinkWrappingViewport/desc_ko_KR.json | 26 + .../ShrinkWrappingViewport/desc_pt_PT.json | 26 + .../ShrinkWrappingViewport/desc_ru_RU.json | 26 + .../Stack/desc_de_DE.json | 33 ++ .../Stack/desc_en_US.json | 33 ++ .../Stack/desc_es_ES.json | 33 ++ .../Stack/desc_fr_FR.json | 33 ++ .../Stack/desc_it_IT.json | 33 ++ .../Stack/desc_ja_JP.json | 33 ++ .../Stack/desc_ko_KR.json | 33 ++ .../Stack/desc_pt_PT.json | 33 ++ .../Stack/desc_ru_RU.json | 33 ++ .../Viewport/desc_de_DE.json | 27 + .../Viewport/desc_en_US.json | 27 + .../Viewport/desc_es_ES.json | 27 + .../Viewport/desc_fr_FR.json | 27 + .../Viewport/desc_it_IT.json | 27 + .../Viewport/desc_ja_JP.json | 27 + .../Viewport/desc_ko_KR.json | 27 + .../Viewport/desc_pt_PT.json | 27 + .../Viewport/desc_ru_RU.json | 27 + .../Wrap/desc_de_DE.json | 52 ++ .../Wrap/desc_en_US.json | 52 ++ .../Wrap/desc_es_ES.json | 52 ++ .../Wrap/desc_fr_FR.json | 52 ++ .../Wrap/desc_it_IT.json | 52 ++ .../Wrap/desc_ja_JP.json | 52 ++ .../Wrap/desc_ko_KR.json | 52 ++ .../Wrap/desc_pt_PT.json | 52 ++ .../Wrap/desc_ru_RU.json | 52 ++ .../lib/Other/ErrorWidget/desc_de_DE.json | 18 + .../lib/Other/ErrorWidget/desc_en_US.json | 18 + .../lib/Other/ErrorWidget/desc_es_ES.json | 18 + .../lib/Other/ErrorWidget/desc_fr_FR.json | 18 + .../lib/Other/ErrorWidget/desc_it_IT.json | 18 + .../lib/Other/ErrorWidget/desc_ja_JP.json | 18 + .../lib/Other/ErrorWidget/desc_ko_KR.json | 18 + .../lib/Other/ErrorWidget/desc_pt_PT.json | 18 + .../lib/Other/ErrorWidget/desc_ru_RU.json | 18 + .../Other/ListWheelViewport/desc_de_DE.json | 52 ++ .../Other/ListWheelViewport/desc_en_US.json | 52 ++ .../Other/ListWheelViewport/desc_es_ES.json | 52 ++ .../Other/ListWheelViewport/desc_fr_FR.json | 52 ++ .../Other/ListWheelViewport/desc_it_IT.json | 52 ++ .../Other/ListWheelViewport/desc_ja_JP.json | 52 ++ .../Other/ListWheelViewport/desc_ko_KR.json | 52 ++ .../Other/ListWheelViewport/desc_pt_PT.json | 52 ++ .../Other/ListWheelViewport/desc_ru_RU.json | 52 ++ .../Other/PerformanceOverlay/desc_de_DE.json | 18 + .../Other/PerformanceOverlay/desc_en_US.json | 18 + .../Other/PerformanceOverlay/desc_es_ES.json | 18 + .../Other/PerformanceOverlay/desc_fr_FR.json | 18 + .../Other/PerformanceOverlay/desc_it_IT.json | 18 + .../Other/PerformanceOverlay/desc_ja_JP.json | 18 + .../Other/PerformanceOverlay/desc_ko_KR.json | 18 + .../Other/PerformanceOverlay/desc_pt_PT.json | 18 + .../Other/PerformanceOverlay/desc_ru_RU.json | 18 + .../lib/Other/RawImage/desc_de_DE.json | 23 + .../lib/Other/RawImage/desc_en_US.json | 23 + .../lib/Other/RawImage/desc_es_ES.json | 23 + .../lib/Other/RawImage/desc_fr_FR.json | 23 + .../lib/Other/RawImage/desc_it_IT.json | 23 + .../lib/Other/RawImage/desc_ja_JP.json | 23 + .../lib/Other/RawImage/desc_ko_KR.json | 23 + .../lib/Other/RawImage/desc_pt_PT.json | 23 + .../lib/Other/RawImage/desc_ru_RU.json | 23 + .../desc_de_DE.json | 20 + .../desc_en_US.json | 20 + .../desc_es_ES.json | 20 + .../desc_fr_FR.json | 20 + .../desc_it_IT.json | 20 + .../desc_ja_JP.json | 20 + .../desc_ko_KR.json | 20 + .../desc_pt_PT.json | 20 + .../desc_ru_RU.json | 20 + .../widgets/lib/Other/Table/desc_de_DE.json | 23 + .../widgets/lib/Other/Table/desc_en_US.json | 23 + .../widgets/lib/Other/Table/desc_es_ES.json | 23 + .../widgets/lib/Other/Table/desc_fr_FR.json | 23 + .../widgets/lib/Other/Table/desc_it_IT.json | 23 + .../widgets/lib/Other/Table/desc_ja_JP.json | 23 + .../widgets/lib/Other/Table/desc_ko_KR.json | 23 + .../widgets/lib/Other/Table/desc_pt_PT.json | 23 + .../widgets/lib/Other/Table/desc_ru_RU.json | 23 + .../ButtonBarTheme/desc_de_DE.json | 18 + .../ButtonBarTheme/desc_en_US.json | 18 + .../ButtonBarTheme/desc_es_ES.json | 18 + .../ButtonBarTheme/desc_fr_FR.json | 18 + .../ButtonBarTheme/desc_it_IT.json | 18 + .../ButtonBarTheme/desc_ja_JP.json | 18 + .../ButtonBarTheme/desc_ko_KR.json | 18 + .../ButtonBarTheme/desc_pt_PT.json | 18 + .../ButtonBarTheme/desc_ru_RU.json | 18 + .../ProxyWidget/ButtonTheme/desc_de_DE.json | 24 + .../ProxyWidget/ButtonTheme/desc_en_US.json | 24 + .../ProxyWidget/ButtonTheme/desc_es_ES.json | 24 + .../ProxyWidget/ButtonTheme/desc_fr_FR.json | 24 + .../ProxyWidget/ButtonTheme/desc_it_IT.json | 24 + .../ProxyWidget/ButtonTheme/desc_ja_JP.json | 24 + .../ProxyWidget/ButtonTheme/desc_ko_KR.json | 24 + .../ProxyWidget/ButtonTheme/desc_pt_PT.json | 24 + .../ProxyWidget/ButtonTheme/desc_ru_RU.json | 24 + .../lib/ProxyWidget/ChipTheme/desc_de_DE.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_en_US.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_es_ES.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_fr_FR.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_it_IT.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_ja_JP.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_ko_KR.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_pt_PT.json | 25 + .../lib/ProxyWidget/ChipTheme/desc_ru_RU.json | 25 + .../desc_de_DE.json | 18 + .../desc_en_US.json | 18 + .../desc_es_ES.json | 18 + .../desc_fr_FR.json | 18 + .../desc_it_IT.json | 18 + .../desc_ja_JP.json | 18 + .../desc_ko_KR.json | 18 + .../desc_pt_PT.json | 18 + .../desc_ru_RU.json | 18 + .../DefaultAssetBundle/desc_de_DE.json | 20 + .../DefaultAssetBundle/desc_en_US.json | 20 + .../DefaultAssetBundle/desc_es_ES.json | 20 + .../DefaultAssetBundle/desc_fr_FR.json | 20 + .../DefaultAssetBundle/desc_it_IT.json | 20 + .../DefaultAssetBundle/desc_ja_JP.json | 20 + .../DefaultAssetBundle/desc_ko_KR.json | 20 + .../DefaultAssetBundle/desc_pt_PT.json | 20 + .../DefaultAssetBundle/desc_ru_RU.json | 20 + .../DefaultTextStyle/desc_de_DE.json | 23 + .../DefaultTextStyle/desc_en_US.json | 23 + .../DefaultTextStyle/desc_es_ES.json | 23 + .../DefaultTextStyle/desc_fr_FR.json | 23 + .../DefaultTextStyle/desc_it_IT.json | 23 + .../DefaultTextStyle/desc_ja_JP.json | 23 + .../DefaultTextStyle/desc_ko_KR.json | 23 + .../DefaultTextStyle/desc_pt_PT.json | 23 + .../DefaultTextStyle/desc_ru_RU.json | 23 + .../Directionality/desc_de_DE.json | 22 + .../Directionality/desc_en_US.json | 22 + .../Directionality/desc_es_ES.json | 22 + .../Directionality/desc_fr_FR.json | 22 + .../Directionality/desc_it_IT.json | 22 + .../Directionality/desc_ja_JP.json | 22 + .../Directionality/desc_ko_KR.json | 22 + .../Directionality/desc_pt_PT.json | 22 + .../Directionality/desc_ru_RU.json | 22 + .../ProxyWidget/DividerTheme/desc_de_DE.json | 22 + .../ProxyWidget/DividerTheme/desc_en_US.json | 22 + .../ProxyWidget/DividerTheme/desc_es_ES.json | 22 + .../ProxyWidget/DividerTheme/desc_fr_FR.json | 22 + .../ProxyWidget/DividerTheme/desc_it_IT.json | 22 + .../ProxyWidget/DividerTheme/desc_ja_JP.json | 22 + .../ProxyWidget/DividerTheme/desc_ko_KR.json | 22 + .../ProxyWidget/DividerTheme/desc_pt_PT.json | 22 + .../ProxyWidget/DividerTheme/desc_ru_RU.json | 22 + .../desc_de_DE.json | 18 + .../desc_en_US.json | 18 + .../desc_es_ES.json | 18 + .../desc_fr_FR.json | 18 + .../desc_it_IT.json | 18 + .../desc_ja_JP.json | 18 + .../desc_ko_KR.json | 18 + .../desc_pt_PT.json | 18 + .../desc_ru_RU.json | 18 + .../lib/ProxyWidget/Expanded/desc_de_DE.json | 22 + .../lib/ProxyWidget/Expanded/desc_en_US.json | 22 + .../lib/ProxyWidget/Expanded/desc_es_ES.json | 22 + .../lib/ProxyWidget/Expanded/desc_fr_FR.json | 22 + .../lib/ProxyWidget/Expanded/desc_it_IT.json | 22 + .../lib/ProxyWidget/Expanded/desc_ja_JP.json | 22 + .../lib/ProxyWidget/Expanded/desc_ko_KR.json | 22 + .../lib/ProxyWidget/Expanded/desc_pt_PT.json | 22 + .../lib/ProxyWidget/Expanded/desc_ru_RU.json | 22 + .../lib/ProxyWidget/Flexible/desc_de_DE.json | 23 + .../lib/ProxyWidget/Flexible/desc_en_US.json | 23 + .../lib/ProxyWidget/Flexible/desc_es_ES.json | 23 + .../lib/ProxyWidget/Flexible/desc_fr_FR.json | 23 + .../lib/ProxyWidget/Flexible/desc_it_IT.json | 23 + .../lib/ProxyWidget/Flexible/desc_ja_JP.json | 23 + .../lib/ProxyWidget/Flexible/desc_ko_KR.json | 23 + .../lib/ProxyWidget/Flexible/desc_pt_PT.json | 23 + .../lib/ProxyWidget/Flexible/desc_ru_RU.json | 23 + .../lib/ProxyWidget/IconTheme/desc_de_DE.json | 18 + .../lib/ProxyWidget/IconTheme/desc_en_US.json | 18 + .../lib/ProxyWidget/IconTheme/desc_es_ES.json | 18 + .../lib/ProxyWidget/IconTheme/desc_fr_FR.json | 18 + .../lib/ProxyWidget/IconTheme/desc_it_IT.json | 18 + .../lib/ProxyWidget/IconTheme/desc_ja_JP.json | 18 + .../lib/ProxyWidget/IconTheme/desc_ko_KR.json | 18 + .../lib/ProxyWidget/IconTheme/desc_pt_PT.json | 18 + .../lib/ProxyWidget/IconTheme/desc_ru_RU.json | 18 + .../InheritedModel/desc_de_DE.json | 19 + .../InheritedModel/desc_en_US.json | 19 + .../InheritedModel/desc_es_ES.json | 19 + .../InheritedModel/desc_fr_FR.json | 19 + .../InheritedModel/desc_it_IT.json | 19 + .../InheritedModel/desc_ja_JP.json | 19 + .../InheritedModel/desc_ko_KR.json | 19 + .../InheritedModel/desc_pt_PT.json | 19 + .../InheritedModel/desc_ru_RU.json | 19 + .../InheritedTheme/desc_de_DE.json | 66 +++ .../InheritedTheme/desc_en_US.json | 66 +++ .../InheritedTheme/desc_es_ES.json | 66 +++ .../InheritedTheme/desc_fr_FR.json | 66 +++ .../InheritedTheme/desc_it_IT.json | 66 +++ .../InheritedTheme/desc_ja_JP.json | 66 +++ .../InheritedTheme/desc_ko_KR.json | 66 +++ .../InheritedTheme/desc_pt_PT.json | 66 +++ .../InheritedTheme/desc_ru_RU.json | 66 +++ .../InheritedWidget/desc_de_DE.json | 36 ++ .../InheritedWidget/desc_en_US.json | 36 ++ .../InheritedWidget/desc_es_ES.json | 36 ++ .../InheritedWidget/desc_fr_FR.json | 36 ++ .../InheritedWidget/desc_it_IT.json | 36 ++ .../InheritedWidget/desc_ja_JP.json | 36 ++ .../InheritedWidget/desc_ko_KR.json | 36 ++ .../InheritedWidget/desc_pt_PT.json | 36 ++ .../InheritedWidget/desc_ru_RU.json | 36 ++ .../lib/ProxyWidget/KeepAlive/desc_de_DE.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_en_US.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_es_ES.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_fr_FR.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_it_IT.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_ja_JP.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_ko_KR.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_pt_PT.json | 20 + .../lib/ProxyWidget/KeepAlive/desc_ru_RU.json | 20 + .../lib/ProxyWidget/LayoutId/desc_de_DE.json | 19 + .../lib/ProxyWidget/LayoutId/desc_en_US.json | 19 + .../lib/ProxyWidget/LayoutId/desc_es_ES.json | 19 + .../lib/ProxyWidget/LayoutId/desc_fr_FR.json | 19 + .../lib/ProxyWidget/LayoutId/desc_it_IT.json | 19 + .../lib/ProxyWidget/LayoutId/desc_ja_JP.json | 19 + .../lib/ProxyWidget/LayoutId/desc_ko_KR.json | 19 + .../lib/ProxyWidget/LayoutId/desc_pt_PT.json | 19 + .../lib/ProxyWidget/LayoutId/desc_ru_RU.json | 19 + .../ProxyWidget/ListTileTheme/desc_de_DE.json | 18 + .../ProxyWidget/ListTileTheme/desc_en_US.json | 18 + .../ProxyWidget/ListTileTheme/desc_es_ES.json | 18 + .../ProxyWidget/ListTileTheme/desc_fr_FR.json | 18 + .../ProxyWidget/ListTileTheme/desc_it_IT.json | 18 + .../ProxyWidget/ListTileTheme/desc_ja_JP.json | 18 + .../ProxyWidget/ListTileTheme/desc_ko_KR.json | 18 + .../ProxyWidget/ListTileTheme/desc_pt_PT.json | 18 + .../ProxyWidget/ListTileTheme/desc_ru_RU.json | 18 + .../MaterialBannerTheme/desc_de_DE.json | 18 + .../MaterialBannerTheme/desc_en_US.json | 18 + .../MaterialBannerTheme/desc_es_ES.json | 18 + .../MaterialBannerTheme/desc_fr_FR.json | 18 + .../MaterialBannerTheme/desc_it_IT.json | 18 + .../MaterialBannerTheme/desc_ja_JP.json | 18 + .../MaterialBannerTheme/desc_ko_KR.json | 18 + .../MaterialBannerTheme/desc_pt_PT.json | 18 + .../MaterialBannerTheme/desc_ru_RU.json | 18 + .../ProxyWidget/MediaQuery/desc_de_DE.json | 18 + .../ProxyWidget/MediaQuery/desc_en_US.json | 18 + .../ProxyWidget/MediaQuery/desc_es_ES.json | 18 + .../ProxyWidget/MediaQuery/desc_fr_FR.json | 18 + .../ProxyWidget/MediaQuery/desc_it_IT.json | 18 + .../ProxyWidget/MediaQuery/desc_ja_JP.json | 18 + .../ProxyWidget/MediaQuery/desc_ko_KR.json | 18 + .../ProxyWidget/MediaQuery/desc_pt_PT.json | 18 + .../ProxyWidget/MediaQuery/desc_ru_RU.json | 18 + .../ParentDataWidget/desc_de_DE.json | 23 + .../ParentDataWidget/desc_en_US.json | 23 + .../ParentDataWidget/desc_es_ES.json | 23 + .../ParentDataWidget/desc_fr_FR.json | 23 + .../ParentDataWidget/desc_it_IT.json | 23 + .../ParentDataWidget/desc_ja_JP.json | 23 + .../ParentDataWidget/desc_ko_KR.json | 23 + .../ParentDataWidget/desc_pt_PT.json | 23 + .../ParentDataWidget/desc_ru_RU.json | 23 + .../PopupMenuTheme/desc_de_DE.json | 18 + .../PopupMenuTheme/desc_en_US.json | 18 + .../PopupMenuTheme/desc_es_ES.json | 18 + .../PopupMenuTheme/desc_fr_FR.json | 18 + .../PopupMenuTheme/desc_it_IT.json | 18 + .../PopupMenuTheme/desc_ja_JP.json | 18 + .../PopupMenuTheme/desc_ko_KR.json | 18 + .../PopupMenuTheme/desc_pt_PT.json | 18 + .../PopupMenuTheme/desc_ru_RU.json | 18 + .../ProxyWidget/Positioned/desc_de_DE.json | 26 + .../ProxyWidget/Positioned/desc_en_US.json | 26 + .../ProxyWidget/Positioned/desc_es_ES.json | 26 + .../ProxyWidget/Positioned/desc_fr_FR.json | 26 + .../ProxyWidget/Positioned/desc_it_IT.json | 26 + .../ProxyWidget/Positioned/desc_ja_JP.json | 26 + .../ProxyWidget/Positioned/desc_ko_KR.json | 26 + .../ProxyWidget/Positioned/desc_pt_PT.json | 26 + .../ProxyWidget/Positioned/desc_ru_RU.json | 26 + .../PrimaryScrollController/desc_de_DE.json | 23 + .../PrimaryScrollController/desc_en_US.json | 23 + .../PrimaryScrollController/desc_es_ES.json | 23 + .../PrimaryScrollController/desc_fr_FR.json | 23 + .../PrimaryScrollController/desc_it_IT.json | 23 + .../PrimaryScrollController/desc_ja_JP.json | 23 + .../PrimaryScrollController/desc_ko_KR.json | 23 + .../PrimaryScrollController/desc_pt_PT.json | 23 + .../PrimaryScrollController/desc_ru_RU.json | 23 + .../ScrollConfiguration/desc_de_DE.json | 24 + .../ScrollConfiguration/desc_en_US.json | 24 + .../ScrollConfiguration/desc_es_ES.json | 24 + .../ScrollConfiguration/desc_fr_FR.json | 24 + .../ScrollConfiguration/desc_it_IT.json | 24 + .../ScrollConfiguration/desc_ja_JP.json | 24 + .../ScrollConfiguration/desc_ko_KR.json | 24 + .../ScrollConfiguration/desc_pt_PT.json | 24 + .../ScrollConfiguration/desc_ru_RU.json | 24 + .../ProxyWidget/SliderTheme/desc_de_DE.json | 27 + .../ProxyWidget/SliderTheme/desc_en_US.json | 27 + .../ProxyWidget/SliderTheme/desc_es_ES.json | 27 + .../ProxyWidget/SliderTheme/desc_fr_FR.json | 27 + .../ProxyWidget/SliderTheme/desc_it_IT.json | 27 + .../ProxyWidget/SliderTheme/desc_ja_JP.json | 27 + .../ProxyWidget/SliderTheme/desc_ko_KR.json | 27 + .../ProxyWidget/SliderTheme/desc_pt_PT.json | 27 + .../ProxyWidget/SliderTheme/desc_ru_RU.json | 27 + .../lib/ProxyWidget/TableCell/desc_de_DE.json | 19 + .../lib/ProxyWidget/TableCell/desc_en_US.json | 19 + .../lib/ProxyWidget/TableCell/desc_es_ES.json | 19 + .../lib/ProxyWidget/TableCell/desc_fr_FR.json | 19 + .../lib/ProxyWidget/TableCell/desc_it_IT.json | 19 + .../lib/ProxyWidget/TableCell/desc_ja_JP.json | 19 + .../lib/ProxyWidget/TableCell/desc_ko_KR.json | 19 + .../lib/ProxyWidget/TableCell/desc_pt_PT.json | 19 + .../lib/ProxyWidget/TableCell/desc_ru_RU.json | 19 + .../ToggleButtonsTheme/desc_de_DE.json | 18 + .../ToggleButtonsTheme/desc_en_US.json | 18 + .../ToggleButtonsTheme/desc_es_ES.json | 18 + .../ToggleButtonsTheme/desc_fr_FR.json | 18 + .../ToggleButtonsTheme/desc_it_IT.json | 18 + .../ToggleButtonsTheme/desc_ja_JP.json | 18 + .../ToggleButtonsTheme/desc_ko_KR.json | 18 + .../ToggleButtonsTheme/desc_pt_PT.json | 18 + .../ToggleButtonsTheme/desc_ru_RU.json | 18 + .../ProxyWidget/TooltipTheme/desc_de_DE.json | 18 + .../ProxyWidget/TooltipTheme/desc_en_US.json | 18 + .../ProxyWidget/TooltipTheme/desc_es_ES.json | 18 + .../ProxyWidget/TooltipTheme/desc_fr_FR.json | 18 + .../ProxyWidget/TooltipTheme/desc_it_IT.json | 18 + .../ProxyWidget/TooltipTheme/desc_ja_JP.json | 18 + .../ProxyWidget/TooltipTheme/desc_ko_KR.json | 18 + .../ProxyWidget/TooltipTheme/desc_pt_PT.json | 18 + .../ProxyWidget/TooltipTheme/desc_ru_RU.json | 18 + .../AbsorbPointer/desc_de_DE.json | 25 + .../AbsorbPointer/desc_en_US.json | 25 + .../AbsorbPointer/desc_es_ES.json | 25 + .../AbsorbPointer/desc_fr_FR.json | 25 + .../AbsorbPointer/desc_it_IT.json | 25 + .../AbsorbPointer/desc_ja_JP.json | 25 + .../AbsorbPointer/desc_ko_KR.json | 25 + .../AbsorbPointer/desc_pt_PT.json | 25 + .../AbsorbPointer/desc_ru_RU.json | 25 + .../Align/desc_de_DE.json | 32 + .../Align/desc_en_US.json | 32 + .../Align/desc_es_ES.json | 32 + .../Align/desc_fr_FR.json | 32 + .../Align/desc_it_IT.json | 32 + .../Align/desc_ja_JP.json | 32 + .../Align/desc_ko_KR.json | 32 + .../Align/desc_pt_PT.json | 32 + .../Align/desc_ru_RU.json | 32 + .../AnimatedSize/desc_de_DE.json | 22 + .../AnimatedSize/desc_en_US.json | 22 + .../AnimatedSize/desc_es_ES.json | 22 + .../AnimatedSize/desc_fr_FR.json | 22 + .../AnimatedSize/desc_it_IT.json | 22 + .../AnimatedSize/desc_ja_JP.json | 22 + .../AnimatedSize/desc_ko_KR.json | 22 + .../AnimatedSize/desc_pt_PT.json | 22 + .../AnimatedSize/desc_ru_RU.json | 22 + .../AnnotatedRegion/desc_de_DE.json | 20 + .../AnnotatedRegion/desc_en_US.json | 20 + .../AnnotatedRegion/desc_es_ES.json | 20 + .../AnnotatedRegion/desc_fr_FR.json | 20 + .../AnnotatedRegion/desc_it_IT.json | 20 + .../AnnotatedRegion/desc_ja_JP.json | 20 + .../AnnotatedRegion/desc_ko_KR.json | 20 + .../AnnotatedRegion/desc_pt_PT.json | 20 + .../AnnotatedRegion/desc_ru_RU.json | 20 + .../AspectRatio/desc_de_DE.json | 19 + .../AspectRatio/desc_en_US.json | 19 + .../AspectRatio/desc_es_ES.json | 19 + .../AspectRatio/desc_fr_FR.json | 19 + .../AspectRatio/desc_it_IT.json | 19 + .../AspectRatio/desc_ja_JP.json | 19 + .../AspectRatio/desc_ko_KR.json | 19 + .../AspectRatio/desc_pt_PT.json | 19 + .../AspectRatio/desc_ru_RU.json | 19 + .../BackdropFilter/desc_de_DE.json | 24 + .../BackdropFilter/desc_en_US.json | 24 + .../BackdropFilter/desc_es_ES.json | 24 + .../BackdropFilter/desc_fr_FR.json | 24 + .../BackdropFilter/desc_it_IT.json | 24 + .../BackdropFilter/desc_ja_JP.json | 24 + .../BackdropFilter/desc_ko_KR.json | 24 + .../BackdropFilter/desc_pt_PT.json | 24 + .../BackdropFilter/desc_ru_RU.json | 24 + .../Baseline/desc_de_DE.json | 20 + .../Baseline/desc_en_US.json | 20 + .../Baseline/desc_es_ES.json | 20 + .../Baseline/desc_fr_FR.json | 20 + .../Baseline/desc_it_IT.json | 20 + .../Baseline/desc_ja_JP.json | 20 + .../Baseline/desc_ko_KR.json | 20 + .../Baseline/desc_pt_PT.json | 20 + .../Baseline/desc_ru_RU.json | 20 + .../CallbackShortcuts/desc_de_DE.json | 25 + .../CallbackShortcuts/desc_en_US.json | 25 + .../CallbackShortcuts/desc_es_ES.json | 25 + .../CallbackShortcuts/desc_fr_FR.json | 25 + .../CallbackShortcuts/desc_it_IT.json | 25 + .../CallbackShortcuts/desc_ja_JP.json | 25 + .../CallbackShortcuts/desc_ko_KR.json | 25 + .../CallbackShortcuts/desc_pt_PT.json | 25 + .../CallbackShortcuts/desc_ru_RU.json | 25 + .../Center/desc_de_DE.json | 18 + .../Center/desc_en_US.json | 18 + .../Center/desc_es_ES.json | 18 + .../Center/desc_fr_FR.json | 18 + .../Center/desc_it_IT.json | 18 + .../Center/desc_ja_JP.json | 18 + .../Center/desc_ko_KR.json | 18 + .../Center/desc_pt_PT.json | 18 + .../Center/desc_ru_RU.json | 18 + .../ClipOval/desc_de_DE.json | 24 + .../ClipOval/desc_en_US.json | 24 + .../ClipOval/desc_es_ES.json | 24 + .../ClipOval/desc_fr_FR.json | 24 + .../ClipOval/desc_it_IT.json | 24 + .../ClipOval/desc_ja_JP.json | 24 + .../ClipOval/desc_ko_KR.json | 24 + .../ClipOval/desc_pt_PT.json | 24 + .../ClipOval/desc_ru_RU.json | 24 + .../ClipPath/desc_de_DE.json | 24 + .../ClipPath/desc_en_US.json | 24 + .../ClipPath/desc_es_ES.json | 24 + .../ClipPath/desc_fr_FR.json | 24 + .../ClipPath/desc_it_IT.json | 24 + .../ClipPath/desc_ja_JP.json | 24 + .../ClipPath/desc_ko_KR.json | 24 + .../ClipPath/desc_pt_PT.json | 24 + .../ClipPath/desc_ru_RU.json | 24 + .../ClipRRect/desc_de_DE.json | 25 + .../ClipRRect/desc_en_US.json | 25 + .../ClipRRect/desc_es_ES.json | 25 + .../ClipRRect/desc_fr_FR.json | 25 + .../ClipRRect/desc_it_IT.json | 25 + .../ClipRRect/desc_ja_JP.json | 25 + .../ClipRRect/desc_ko_KR.json | 25 + .../ClipRRect/desc_pt_PT.json | 25 + .../ClipRRect/desc_ru_RU.json | 25 + .../ClipRect/desc_de_DE.json | 24 + .../ClipRect/desc_en_US.json | 24 + .../ClipRect/desc_es_ES.json | 24 + .../ClipRect/desc_fr_FR.json | 24 + .../ClipRect/desc_it_IT.json | 24 + .../ClipRect/desc_ja_JP.json | 24 + .../ClipRect/desc_ko_KR.json | 24 + .../ClipRect/desc_pt_PT.json | 24 + .../ClipRect/desc_ru_RU.json | 24 + .../ColorFiltered/desc_de_DE.json | 22 + .../ColorFiltered/desc_en_US.json | 22 + .../ColorFiltered/desc_es_ES.json | 22 + .../ColorFiltered/desc_fr_FR.json | 22 + .../ColorFiltered/desc_it_IT.json | 22 + .../ColorFiltered/desc_ja_JP.json | 22 + .../ColorFiltered/desc_ko_KR.json | 22 + .../ColorFiltered/desc_pt_PT.json | 22 + .../ColorFiltered/desc_ru_RU.json | 22 + .../ColoredBox/desc_de_DE.json | 19 + .../ColoredBox/desc_en_US.json | 19 + .../ColoredBox/desc_es_ES.json | 19 + .../ColoredBox/desc_fr_FR.json | 19 + .../ColoredBox/desc_it_IT.json | 19 + .../ColoredBox/desc_ja_JP.json | 19 + .../ColoredBox/desc_ko_KR.json | 19 + .../ColoredBox/desc_pt_PT.json | 19 + .../ColoredBox/desc_ru_RU.json | 19 + .../desc_de_DE.json | 26 + .../desc_en_US.json | 26 + .../desc_es_ES.json | 26 + .../desc_fr_FR.json | 26 + .../desc_it_IT.json | 26 + .../desc_ja_JP.json | 26 + .../desc_ko_KR.json | 26 + .../desc_pt_PT.json | 26 + .../desc_ru_RU.json | 26 + .../CompositedTransformTarget/desc_de_DE.json | 22 + .../CompositedTransformTarget/desc_en_US.json | 22 + .../CompositedTransformTarget/desc_es_ES.json | 22 + .../CompositedTransformTarget/desc_fr_FR.json | 22 + .../CompositedTransformTarget/desc_it_IT.json | 22 + .../CompositedTransformTarget/desc_ja_JP.json | 22 + .../CompositedTransformTarget/desc_ko_KR.json | 22 + .../CompositedTransformTarget/desc_pt_PT.json | 22 + .../CompositedTransformTarget/desc_ru_RU.json | 22 + .../ConstrainedBox/desc_de_DE.json | 26 + .../ConstrainedBox/desc_en_US.json | 26 + .../ConstrainedBox/desc_es_ES.json | 26 + .../ConstrainedBox/desc_fr_FR.json | 26 + .../ConstrainedBox/desc_it_IT.json | 26 + .../ConstrainedBox/desc_ja_JP.json | 26 + .../ConstrainedBox/desc_ko_KR.json | 26 + .../ConstrainedBox/desc_pt_PT.json | 26 + .../ConstrainedBox/desc_ru_RU.json | 26 + .../desc_de_DE.json | 18 + .../desc_en_US.json | 18 + .../desc_es_ES.json | 18 + .../desc_fr_FR.json | 18 + .../desc_it_IT.json | 18 + .../desc_ja_JP.json | 18 + .../desc_ko_KR.json | 18 + .../desc_pt_PT.json | 18 + .../desc_ru_RU.json | 18 + .../CustomPaint/desc_de_DE.json | 25 + .../CustomPaint/desc_en_US.json | 25 + .../CustomPaint/desc_es_ES.json | 25 + .../CustomPaint/desc_fr_FR.json | 25 + .../CustomPaint/desc_it_IT.json | 25 + .../CustomPaint/desc_ja_JP.json | 25 + .../CustomPaint/desc_ko_KR.json | 25 + .../CustomPaint/desc_pt_PT.json | 25 + .../CustomPaint/desc_ru_RU.json | 25 + .../CustomSingleChildLayout/desc_de_DE.json | 25 + .../CustomSingleChildLayout/desc_en_US.json | 25 + .../CustomSingleChildLayout/desc_es_ES.json | 25 + .../CustomSingleChildLayout/desc_fr_FR.json | 25 + .../CustomSingleChildLayout/desc_it_IT.json | 25 + .../CustomSingleChildLayout/desc_ja_JP.json | 25 + .../CustomSingleChildLayout/desc_ko_KR.json | 25 + .../CustomSingleChildLayout/desc_pt_PT.json | 25 + .../CustomSingleChildLayout/desc_ru_RU.json | 25 + .../DecoratedBox/desc_de_DE.json | 55 ++ .../DecoratedBox/desc_en_US.json | 55 ++ .../DecoratedBox/desc_es_ES.json | 55 ++ .../DecoratedBox/desc_fr_FR.json | 55 ++ .../DecoratedBox/desc_it_IT.json | 55 ++ .../DecoratedBox/desc_ja_JP.json | 55 ++ .../DecoratedBox/desc_ko_KR.json | 55 ++ .../DecoratedBox/desc_pt_PT.json | 55 ++ .../DecoratedBox/desc_ru_RU.json | 55 ++ .../FadeTransition/desc_de_DE.json | 22 + .../FadeTransition/desc_en_US.json | 22 + .../FadeTransition/desc_es_ES.json | 22 + .../FadeTransition/desc_fr_FR.json | 22 + .../FadeTransition/desc_it_IT.json | 22 + .../FadeTransition/desc_ja_JP.json | 22 + .../FadeTransition/desc_ko_KR.json | 22 + .../FadeTransition/desc_pt_PT.json | 22 + .../FadeTransition/desc_ru_RU.json | 22 + .../FittedBox/desc_de_DE.json | 20 + .../FittedBox/desc_en_US.json | 20 + .../FittedBox/desc_es_ES.json | 20 + .../FittedBox/desc_fr_FR.json | 20 + .../FittedBox/desc_it_IT.json | 20 + .../FittedBox/desc_ja_JP.json | 20 + .../FittedBox/desc_ko_KR.json | 20 + .../FittedBox/desc_pt_PT.json | 20 + .../FittedBox/desc_ru_RU.json | 20 + .../FractionalTranslation/desc_de_DE.json | 19 + .../FractionalTranslation/desc_en_US.json | 19 + .../FractionalTranslation/desc_es_ES.json | 19 + .../FractionalTranslation/desc_fr_FR.json | 19 + .../FractionalTranslation/desc_it_IT.json | 19 + .../FractionalTranslation/desc_ja_JP.json | 19 + .../FractionalTranslation/desc_ko_KR.json | 19 + .../FractionalTranslation/desc_pt_PT.json | 19 + .../FractionalTranslation/desc_ru_RU.json | 19 + .../FractionallySizedBox/desc_de_DE.json | 21 + .../FractionallySizedBox/desc_en_US.json | 21 + .../FractionallySizedBox/desc_es_ES.json | 21 + .../FractionallySizedBox/desc_fr_FR.json | 21 + .../FractionallySizedBox/desc_it_IT.json | 21 + .../FractionallySizedBox/desc_ja_JP.json | 21 + .../FractionallySizedBox/desc_ko_KR.json | 21 + .../FractionallySizedBox/desc_pt_PT.json | 21 + .../FractionallySizedBox/desc_ru_RU.json | 21 + .../IgnorePointer/desc_de_DE.json | 25 + .../IgnorePointer/desc_en_US.json | 25 + .../IgnorePointer/desc_es_ES.json | 25 + .../IgnorePointer/desc_fr_FR.json | 25 + .../IgnorePointer/desc_it_IT.json | 25 + .../IgnorePointer/desc_ja_JP.json | 25 + .../IgnorePointer/desc_ko_KR.json | 25 + .../IgnorePointer/desc_pt_PT.json | 25 + .../IgnorePointer/desc_ru_RU.json | 25 + .../ImageFiltered/desc_de_DE.json | 36 ++ .../ImageFiltered/desc_en_US.json | 36 ++ .../ImageFiltered/desc_es_ES.json | 36 ++ .../ImageFiltered/desc_fr_FR.json | 36 ++ .../ImageFiltered/desc_it_IT.json | 36 ++ .../ImageFiltered/desc_ja_JP.json | 36 ++ .../ImageFiltered/desc_ko_KR.json | 36 ++ .../ImageFiltered/desc_pt_PT.json | 36 ++ .../ImageFiltered/desc_ru_RU.json | 36 ++ .../IntrinsicHeight/desc_de_DE.json | 19 + .../IntrinsicHeight/desc_en_US.json | 19 + .../IntrinsicHeight/desc_es_ES.json | 19 + .../IntrinsicHeight/desc_fr_FR.json | 19 + .../IntrinsicHeight/desc_it_IT.json | 19 + .../IntrinsicHeight/desc_ja_JP.json | 19 + .../IntrinsicHeight/desc_ko_KR.json | 19 + .../IntrinsicHeight/desc_pt_PT.json | 19 + .../IntrinsicHeight/desc_ru_RU.json | 19 + .../IntrinsicWidth/desc_de_DE.json | 19 + .../IntrinsicWidth/desc_en_US.json | 19 + .../IntrinsicWidth/desc_es_ES.json | 19 + .../IntrinsicWidth/desc_fr_FR.json | 19 + .../IntrinsicWidth/desc_it_IT.json | 19 + .../IntrinsicWidth/desc_ja_JP.json | 19 + .../IntrinsicWidth/desc_ko_KR.json | 19 + .../IntrinsicWidth/desc_pt_PT.json | 19 + .../IntrinsicWidth/desc_ru_RU.json | 19 + .../LayoutBuilder/desc_de_DE.json | 34 ++ .../LayoutBuilder/desc_en_US.json | 34 ++ .../LayoutBuilder/desc_es_ES.json | 34 ++ .../LayoutBuilder/desc_fr_FR.json | 34 ++ .../LayoutBuilder/desc_it_IT.json | 34 ++ .../LayoutBuilder/desc_ja_JP.json | 34 ++ .../LayoutBuilder/desc_ko_KR.json | 34 ++ .../LayoutBuilder/desc_pt_PT.json | 34 ++ .../LayoutBuilder/desc_ru_RU.json | 34 ++ .../LimitedBox/desc_de_DE.json | 22 + .../LimitedBox/desc_en_US.json | 22 + .../LimitedBox/desc_es_ES.json | 22 + .../LimitedBox/desc_fr_FR.json | 22 + .../LimitedBox/desc_it_IT.json | 22 + .../LimitedBox/desc_ja_JP.json | 22 + .../LimitedBox/desc_ko_KR.json | 22 + .../LimitedBox/desc_pt_PT.json | 22 + .../LimitedBox/desc_ru_RU.json | 22 + .../OffStage/desc_de_DE.json | 21 + .../OffStage/desc_en_US.json | 21 + .../OffStage/desc_es_ES.json | 21 + .../OffStage/desc_fr_FR.json | 21 + .../OffStage/desc_it_IT.json | 21 + .../OffStage/desc_ja_JP.json | 21 + .../OffStage/desc_ko_KR.json | 21 + .../OffStage/desc_pt_PT.json | 21 + .../OffStage/desc_ru_RU.json | 21 + .../Opacity/desc_de_DE.json | 22 + .../Opacity/desc_en_US.json | 22 + .../Opacity/desc_es_ES.json | 22 + .../Opacity/desc_fr_FR.json | 22 + .../Opacity/desc_it_IT.json | 22 + .../Opacity/desc_ja_JP.json | 22 + .../Opacity/desc_ko_KR.json | 22 + .../Opacity/desc_pt_PT.json | 22 + .../Opacity/desc_ru_RU.json | 22 + .../OverflowBox/desc_de_DE.json | 23 + .../OverflowBox/desc_en_US.json | 23 + .../OverflowBox/desc_es_ES.json | 23 + .../OverflowBox/desc_fr_FR.json | 23 + .../OverflowBox/desc_it_IT.json | 23 + .../OverflowBox/desc_ja_JP.json | 23 + .../OverflowBox/desc_ko_KR.json | 23 + .../OverflowBox/desc_pt_PT.json | 23 + .../OverflowBox/desc_ru_RU.json | 23 + .../Padding/desc_de_DE.json | 37 ++ .../Padding/desc_en_US.json | 37 ++ .../Padding/desc_es_ES.json | 37 ++ .../Padding/desc_fr_FR.json | 37 ++ .../Padding/desc_it_IT.json | 37 ++ .../Padding/desc_ja_JP.json | 37 ++ .../Padding/desc_ko_KR.json | 37 ++ .../Padding/desc_pt_PT.json | 37 ++ .../Padding/desc_ru_RU.json | 37 ++ .../PhysicalModel/desc_de_DE.json | 27 + .../PhysicalModel/desc_en_US.json | 27 + .../PhysicalModel/desc_es_ES.json | 27 + .../PhysicalModel/desc_fr_FR.json | 27 + .../PhysicalModel/desc_it_IT.json | 27 + .../PhysicalModel/desc_ja_JP.json | 27 + .../PhysicalModel/desc_ko_KR.json | 27 + .../PhysicalModel/desc_pt_PT.json | 27 + .../PhysicalModel/desc_ru_RU.json | 27 + .../PhysicalShape/desc_de_DE.json | 23 + .../PhysicalShape/desc_en_US.json | 23 + .../PhysicalShape/desc_es_ES.json | 23 + .../PhysicalShape/desc_fr_FR.json | 23 + .../PhysicalShape/desc_it_IT.json | 23 + .../PhysicalShape/desc_ja_JP.json | 23 + .../PhysicalShape/desc_ko_KR.json | 23 + .../PhysicalShape/desc_pt_PT.json | 23 + .../PhysicalShape/desc_ru_RU.json | 23 + .../RepaintBoundary/desc_de_DE.json | 26 + .../RepaintBoundary/desc_en_US.json | 26 + .../RepaintBoundary/desc_es_ES.json | 26 + .../RepaintBoundary/desc_fr_FR.json | 26 + .../RepaintBoundary/desc_it_IT.json | 26 + .../RepaintBoundary/desc_ja_JP.json | 26 + .../RepaintBoundary/desc_ko_KR.json | 26 + .../RepaintBoundary/desc_pt_PT.json | 26 + .../RepaintBoundary/desc_ru_RU.json | 26 + .../RotatedBox/desc_de_DE.json | 19 + .../RotatedBox/desc_en_US.json | 19 + .../RotatedBox/desc_es_ES.json | 19 + .../RotatedBox/desc_fr_FR.json | 19 + .../RotatedBox/desc_it_IT.json | 19 + .../RotatedBox/desc_ja_JP.json | 19 + .../RotatedBox/desc_ko_KR.json | 19 + .../RotatedBox/desc_pt_PT.json | 19 + .../RotatedBox/desc_ru_RU.json | 19 + .../ShaderMask/desc_de_DE.json | 32 + .../ShaderMask/desc_en_US.json | 32 + .../ShaderMask/desc_es_ES.json | 32 + .../ShaderMask/desc_fr_FR.json | 32 + .../ShaderMask/desc_it_IT.json | 32 + .../ShaderMask/desc_ja_JP.json | 32 + .../ShaderMask/desc_ko_KR.json | 32 + .../ShaderMask/desc_pt_PT.json | 32 + .../ShaderMask/desc_ru_RU.json | 32 + .../SizeChangedLayoutNotifier/desc_de_DE.json | 18 + .../SizeChangedLayoutNotifier/desc_en_US.json | 18 + .../SizeChangedLayoutNotifier/desc_es_ES.json | 18 + .../SizeChangedLayoutNotifier/desc_fr_FR.json | 18 + .../SizeChangedLayoutNotifier/desc_it_IT.json | 18 + .../SizeChangedLayoutNotifier/desc_ja_JP.json | 18 + .../SizeChangedLayoutNotifier/desc_ko_KR.json | 18 + .../SizeChangedLayoutNotifier/desc_pt_PT.json | 18 + .../SizeChangedLayoutNotifier/desc_ru_RU.json | 18 + .../SizedBox/desc_de_DE.json | 20 + .../SizedBox/desc_en_US.json | 20 + .../SizedBox/desc_es_ES.json | 20 + .../SizedBox/desc_fr_FR.json | 20 + .../SizedBox/desc_it_IT.json | 20 + .../SizedBox/desc_ja_JP.json | 20 + .../SizedBox/desc_ko_KR.json | 20 + .../SizedBox/desc_pt_PT.json | 20 + .../SizedBox/desc_ru_RU.json | 20 + .../SizedOverflowBox/desc_de_DE.json | 20 + .../SizedOverflowBox/desc_en_US.json | 20 + .../SizedOverflowBox/desc_es_ES.json | 20 + .../SizedOverflowBox/desc_fr_FR.json | 20 + .../SizedOverflowBox/desc_it_IT.json | 20 + .../SizedOverflowBox/desc_ja_JP.json | 20 + .../SizedOverflowBox/desc_ko_KR.json | 20 + .../SizedOverflowBox/desc_pt_PT.json | 20 + .../SizedOverflowBox/desc_ru_RU.json | 20 + .../TapRegion/desc_de_DE.json | 24 + .../TapRegion/desc_en_US.json | 24 + .../TapRegion/desc_es_ES.json | 24 + .../TapRegion/desc_fr_FR.json | 24 + .../TapRegion/desc_it_IT.json | 24 + .../TapRegion/desc_ja_JP.json | 24 + .../TapRegion/desc_ko_KR.json | 24 + .../TapRegion/desc_pt_PT.json | 24 + .../TapRegion/desc_ru_RU.json | 24 + .../TextFieldTapRegion/desc_de_DE.json | 26 + .../TextFieldTapRegion/desc_en_US.json | 26 + .../TextFieldTapRegion/desc_es_ES.json | 26 + .../TextFieldTapRegion/desc_fr_FR.json | 26 + .../TextFieldTapRegion/desc_it_IT.json | 26 + .../TextFieldTapRegion/desc_ja_JP.json | 26 + .../TextFieldTapRegion/desc_ko_KR.json | 26 + .../TextFieldTapRegion/desc_pt_PT.json | 26 + .../TextFieldTapRegion/desc_ru_RU.json | 26 + .../Transform/desc_de_DE.json | 53 ++ .../Transform/desc_en_US.json | 53 ++ .../Transform/desc_es_ES.json | 53 ++ .../Transform/desc_fr_FR.json | 53 ++ .../Transform/desc_it_IT.json | 53 ++ .../Transform/desc_ja_JP.json | 53 ++ .../Transform/desc_ko_KR.json | 53 ++ .../Transform/desc_pt_PT.json | 53 ++ .../Transform/desc_ru_RU.json | 53 ++ .../UnConstrainedBox/desc_de_DE.json | 22 + .../UnConstrainedBox/desc_en_US.json | 22 + .../UnConstrainedBox/desc_es_ES.json | 22 + .../UnConstrainedBox/desc_fr_FR.json | 22 + .../UnConstrainedBox/desc_it_IT.json | 22 + .../UnConstrainedBox/desc_ja_JP.json | 22 + .../UnConstrainedBox/desc_ko_KR.json | 22 + .../UnConstrainedBox/desc_pt_PT.json | 22 + .../UnConstrainedBox/desc_ru_RU.json | 22 + .../desc_de_DE.json | 27 + .../desc_en_US.json | 27 + .../desc_es_ES.json | 27 + .../desc_fr_FR.json | 27 + .../desc_it_IT.json | 27 + .../desc_ja_JP.json | 27 + .../desc_ko_KR.json | 27 + .../desc_pt_PT.json | 27 + .../desc_ru_RU.json | 27 + .../desc_de_DE.json | 24 + .../desc_en_US.json | 24 + .../desc_es_ES.json | 24 + .../desc_fr_FR.json | 24 + .../desc_it_IT.json | 24 + .../desc_ja_JP.json | 24 + .../desc_ko_KR.json | 24 + .../desc_pt_PT.json | 24 + .../desc_ru_RU.json | 24 + .../Sliver/CustomScrollView/desc_de_DE.json | 25 + .../Sliver/CustomScrollView/desc_en_US.json | 25 + .../Sliver/CustomScrollView/desc_es_ES.json | 25 + .../Sliver/CustomScrollView/desc_fr_FR.json | 25 + .../Sliver/CustomScrollView/desc_it_IT.json | 25 + .../Sliver/CustomScrollView/desc_ja_JP.json | 25 + .../Sliver/CustomScrollView/desc_ko_KR.json | 25 + .../Sliver/CustomScrollView/desc_pt_PT.json | 25 + .../Sliver/CustomScrollView/desc_ru_RU.json | 25 + .../Sliver/DecoratedSliver/desc_de_DE.json | 20 + .../Sliver/DecoratedSliver/desc_en_US.json | 20 + .../Sliver/DecoratedSliver/desc_es_ES.json | 20 + .../Sliver/DecoratedSliver/desc_fr_FR.json | 20 + .../Sliver/DecoratedSliver/desc_it_IT.json | 20 + .../Sliver/DecoratedSliver/desc_ja_JP.json | 20 + .../Sliver/DecoratedSliver/desc_ko_KR.json | 20 + .../Sliver/DecoratedSliver/desc_pt_PT.json | 20 + .../Sliver/DecoratedSliver/desc_ru_RU.json | 20 + .../Sliver/FlexibleSpaceBar/desc_de_DE.json | 23 + .../Sliver/FlexibleSpaceBar/desc_en_US.json | 23 + .../Sliver/FlexibleSpaceBar/desc_es_ES.json | 23 + .../Sliver/FlexibleSpaceBar/desc_fr_FR.json | 23 + .../Sliver/FlexibleSpaceBar/desc_it_IT.json | 23 + .../Sliver/FlexibleSpaceBar/desc_ja_JP.json | 23 + .../Sliver/FlexibleSpaceBar/desc_ko_KR.json | 23 + .../Sliver/FlexibleSpaceBar/desc_pt_PT.json | 23 + .../Sliver/FlexibleSpaceBar/desc_ru_RU.json | 23 + .../Sliver/PinnedHeaderSliver/desc_de_DE.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_en_US.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_es_ES.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_fr_FR.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_it_IT.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_ja_JP.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_ko_KR.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_pt_PT.json | 38 ++ .../Sliver/PinnedHeaderSliver/desc_ru_RU.json | 38 ++ .../Sliver/SliverAnimatedList/desc_de_DE.json | 22 + .../Sliver/SliverAnimatedList/desc_en_US.json | 22 + .../Sliver/SliverAnimatedList/desc_es_ES.json | 22 + .../Sliver/SliverAnimatedList/desc_fr_FR.json | 22 + .../Sliver/SliverAnimatedList/desc_it_IT.json | 22 + .../Sliver/SliverAnimatedList/desc_ja_JP.json | 22 + .../Sliver/SliverAnimatedList/desc_ko_KR.json | 22 + .../Sliver/SliverAnimatedList/desc_pt_PT.json | 22 + .../Sliver/SliverAnimatedList/desc_ru_RU.json | 22 + .../lib/Sliver/SliverAppBar/desc_de_DE.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_en_US.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_es_ES.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_fr_FR.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_it_IT.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_ja_JP.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_ko_KR.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_pt_PT.json | 33 ++ .../lib/Sliver/SliverAppBar/desc_ru_RU.json | 33 ++ .../desc_de_DE.json | 22 + .../desc_en_US.json | 22 + .../desc_es_ES.json | 22 + .../desc_fr_FR.json | 22 + .../desc_it_IT.json | 22 + .../desc_ja_JP.json | 22 + .../desc_ko_KR.json | 22 + .../desc_pt_PT.json | 22 + .../desc_ru_RU.json | 22 + .../SliverCrossAxisExpanded/desc_de_DE.json | 22 + .../SliverCrossAxisExpanded/desc_en_US.json | 22 + .../SliverCrossAxisExpanded/desc_es_ES.json | 22 + .../SliverCrossAxisExpanded/desc_fr_FR.json | 22 + .../SliverCrossAxisExpanded/desc_it_IT.json | 22 + .../SliverCrossAxisExpanded/desc_ja_JP.json | 22 + .../SliverCrossAxisExpanded/desc_ko_KR.json | 22 + .../SliverCrossAxisExpanded/desc_pt_PT.json | 22 + .../SliverCrossAxisExpanded/desc_ru_RU.json | 22 + .../SliverCrossAxisGroup/desc_de_DE.json | 22 + .../SliverCrossAxisGroup/desc_en_US.json | 22 + .../SliverCrossAxisGroup/desc_es_ES.json | 22 + .../SliverCrossAxisGroup/desc_fr_FR.json | 22 + .../SliverCrossAxisGroup/desc_it_IT.json | 22 + .../SliverCrossAxisGroup/desc_ja_JP.json | 22 + .../SliverCrossAxisGroup/desc_ko_KR.json | 22 + .../SliverCrossAxisGroup/desc_pt_PT.json | 22 + .../SliverCrossAxisGroup/desc_ru_RU.json | 22 + .../SliverFillRemaining/desc_de_DE.json | 23 + .../SliverFillRemaining/desc_en_US.json | 23 + .../SliverFillRemaining/desc_es_ES.json | 23 + .../SliverFillRemaining/desc_fr_FR.json | 23 + .../SliverFillRemaining/desc_it_IT.json | 23 + .../SliverFillRemaining/desc_ja_JP.json | 23 + .../SliverFillRemaining/desc_ko_KR.json | 23 + .../SliverFillRemaining/desc_pt_PT.json | 23 + .../SliverFillRemaining/desc_ru_RU.json | 23 + .../Sliver/SliverFillViewport/desc_de_DE.json | 23 + .../Sliver/SliverFillViewport/desc_en_US.json | 23 + .../Sliver/SliverFillViewport/desc_es_ES.json | 23 + .../Sliver/SliverFillViewport/desc_fr_FR.json | 23 + .../Sliver/SliverFillViewport/desc_it_IT.json | 23 + .../Sliver/SliverFillViewport/desc_ja_JP.json | 23 + .../Sliver/SliverFillViewport/desc_ko_KR.json | 23 + .../Sliver/SliverFillViewport/desc_pt_PT.json | 23 + .../Sliver/SliverFillViewport/desc_ru_RU.json | 23 + .../SliverFixedExtentList/desc_de_DE.json | 23 + .../SliverFixedExtentList/desc_en_US.json | 23 + .../SliverFixedExtentList/desc_es_ES.json | 23 + .../SliverFixedExtentList/desc_fr_FR.json | 23 + .../SliverFixedExtentList/desc_it_IT.json | 23 + .../SliverFixedExtentList/desc_ja_JP.json | 23 + .../SliverFixedExtentList/desc_ko_KR.json | 23 + .../SliverFixedExtentList/desc_pt_PT.json | 23 + .../SliverFixedExtentList/desc_ru_RU.json | 23 + .../lib/Sliver/SliverGrid/desc_de_DE.json | 20 + .../lib/Sliver/SliverGrid/desc_en_US.json | 20 + .../lib/Sliver/SliverGrid/desc_es_ES.json | 20 + .../lib/Sliver/SliverGrid/desc_fr_FR.json | 20 + .../lib/Sliver/SliverGrid/desc_it_IT.json | 20 + .../lib/Sliver/SliverGrid/desc_ja_JP.json | 20 + .../lib/Sliver/SliverGrid/desc_ko_KR.json | 20 + .../lib/Sliver/SliverGrid/desc_pt_PT.json | 20 + .../lib/Sliver/SliverGrid/desc_ru_RU.json | 20 + .../SliverIgnorePointer/desc_de_DE.json | 22 + .../SliverIgnorePointer/desc_en_US.json | 22 + .../SliverIgnorePointer/desc_es_ES.json | 22 + .../SliverIgnorePointer/desc_fr_FR.json | 22 + .../SliverIgnorePointer/desc_it_IT.json | 22 + .../SliverIgnorePointer/desc_ja_JP.json | 22 + .../SliverIgnorePointer/desc_ko_KR.json | 22 + .../SliverIgnorePointer/desc_pt_PT.json | 22 + .../SliverIgnorePointer/desc_ru_RU.json | 22 + .../SliverLayoutBuilder/desc_de_DE.json | 21 + .../SliverLayoutBuilder/desc_en_US.json | 21 + .../SliverLayoutBuilder/desc_es_ES.json | 21 + .../SliverLayoutBuilder/desc_fr_FR.json | 21 + .../SliverLayoutBuilder/desc_it_IT.json | 21 + .../SliverLayoutBuilder/desc_ja_JP.json | 21 + .../SliverLayoutBuilder/desc_ko_KR.json | 21 + .../SliverLayoutBuilder/desc_pt_PT.json | 21 + .../SliverLayoutBuilder/desc_ru_RU.json | 21 + .../lib/Sliver/SliverList/desc_de_DE.json | 22 + .../lib/Sliver/SliverList/desc_en_US.json | 22 + .../lib/Sliver/SliverList/desc_es_ES.json | 22 + .../lib/Sliver/SliverList/desc_fr_FR.json | 22 + .../lib/Sliver/SliverList/desc_it_IT.json | 22 + .../lib/Sliver/SliverList/desc_ja_JP.json | 22 + .../lib/Sliver/SliverList/desc_ko_KR.json | 22 + .../lib/Sliver/SliverList/desc_pt_PT.json | 22 + .../lib/Sliver/SliverList/desc_ru_RU.json | 22 + .../SliverMainAxisGroup/desc_de_DE.json | 19 + .../SliverMainAxisGroup/desc_en_US.json | 19 + .../SliverMainAxisGroup/desc_es_ES.json | 19 + .../SliverMainAxisGroup/desc_fr_FR.json | 19 + .../SliverMainAxisGroup/desc_it_IT.json | 19 + .../SliverMainAxisGroup/desc_ja_JP.json | 19 + .../SliverMainAxisGroup/desc_ko_KR.json | 19 + .../SliverMainAxisGroup/desc_pt_PT.json | 19 + .../SliverMainAxisGroup/desc_ru_RU.json | 19 + .../lib/Sliver/SliverOpacity/desc_de_DE.json | 19 + .../lib/Sliver/SliverOpacity/desc_en_US.json | 19 + .../lib/Sliver/SliverOpacity/desc_es_ES.json | 19 + .../lib/Sliver/SliverOpacity/desc_fr_FR.json | 19 + .../lib/Sliver/SliverOpacity/desc_it_IT.json | 19 + .../lib/Sliver/SliverOpacity/desc_ja_JP.json | 19 + .../lib/Sliver/SliverOpacity/desc_ko_KR.json | 19 + .../lib/Sliver/SliverOpacity/desc_pt_PT.json | 19 + .../lib/Sliver/SliverOpacity/desc_ru_RU.json | 19 + .../SliverOverlapAbsorber/desc_de_DE.json | 23 + .../SliverOverlapAbsorber/desc_en_US.json | 23 + .../SliverOverlapAbsorber/desc_es_ES.json | 23 + .../SliverOverlapAbsorber/desc_fr_FR.json | 23 + .../SliverOverlapAbsorber/desc_it_IT.json | 23 + .../SliverOverlapAbsorber/desc_ja_JP.json | 23 + .../SliverOverlapAbsorber/desc_ko_KR.json | 23 + .../SliverOverlapAbsorber/desc_pt_PT.json | 23 + .../SliverOverlapAbsorber/desc_ru_RU.json | 23 + .../SliverOverlapInjector/desc_de_DE.json | 23 + .../SliverOverlapInjector/desc_en_US.json | 23 + .../SliverOverlapInjector/desc_es_ES.json | 23 + .../SliverOverlapInjector/desc_fr_FR.json | 23 + .../SliverOverlapInjector/desc_it_IT.json | 23 + .../SliverOverlapInjector/desc_ja_JP.json | 23 + .../SliverOverlapInjector/desc_ko_KR.json | 23 + .../SliverOverlapInjector/desc_pt_PT.json | 23 + .../SliverOverlapInjector/desc_ru_RU.json | 23 + .../lib/Sliver/SliverPadding/desc_de_DE.json | 19 + .../lib/Sliver/SliverPadding/desc_en_US.json | 19 + .../lib/Sliver/SliverPadding/desc_es_ES.json | 19 + .../lib/Sliver/SliverPadding/desc_fr_FR.json | 19 + .../lib/Sliver/SliverPadding/desc_it_IT.json | 19 + .../lib/Sliver/SliverPadding/desc_ja_JP.json | 19 + .../lib/Sliver/SliverPadding/desc_ko_KR.json | 19 + .../lib/Sliver/SliverPadding/desc_pt_PT.json | 19 + .../lib/Sliver/SliverPadding/desc_ru_RU.json | 19 + .../SliverPersistentHeader/desc_de_DE.json | 20 + .../SliverPersistentHeader/desc_en_US.json | 20 + .../SliverPersistentHeader/desc_es_ES.json | 20 + .../SliverPersistentHeader/desc_fr_FR.json | 20 + .../SliverPersistentHeader/desc_it_IT.json | 20 + .../SliverPersistentHeader/desc_ja_JP.json | 20 + .../SliverPersistentHeader/desc_ko_KR.json | 20 + .../SliverPersistentHeader/desc_pt_PT.json | 20 + .../SliverPersistentHeader/desc_ru_RU.json | 20 + .../SliverPrototypeExtentList/desc_de_DE.json | 22 + .../SliverPrototypeExtentList/desc_en_US.json | 22 + .../SliverPrototypeExtentList/desc_es_ES.json | 22 + .../SliverPrototypeExtentList/desc_fr_FR.json | 22 + .../SliverPrototypeExtentList/desc_it_IT.json | 22 + .../SliverPrototypeExtentList/desc_ja_JP.json | 22 + .../SliverPrototypeExtentList/desc_ko_KR.json | 22 + .../SliverPrototypeExtentList/desc_pt_PT.json | 22 + .../SliverPrototypeExtentList/desc_ru_RU.json | 22 + .../Sliver/SliverToBoxAdapter/desc_de_DE.json | 18 + .../Sliver/SliverToBoxAdapter/desc_en_US.json | 18 + .../Sliver/SliverToBoxAdapter/desc_es_ES.json | 18 + .../Sliver/SliverToBoxAdapter/desc_fr_FR.json | 18 + .../Sliver/SliverToBoxAdapter/desc_it_IT.json | 18 + .../Sliver/SliverToBoxAdapter/desc_ja_JP.json | 18 + .../Sliver/SliverToBoxAdapter/desc_ko_KR.json | 18 + .../Sliver/SliverToBoxAdapter/desc_pt_PT.json | 18 + .../Sliver/SliverToBoxAdapter/desc_ru_RU.json | 18 + .../SliverWithKeepAliveWidget/desc_de_DE.json | 25 + .../SliverWithKeepAliveWidget/desc_en_US.json | 25 + .../SliverWithKeepAliveWidget/desc_es_ES.json | 25 + .../SliverWithKeepAliveWidget/desc_fr_FR.json | 25 + .../SliverWithKeepAliveWidget/desc_it_IT.json | 25 + .../SliverWithKeepAliveWidget/desc_ja_JP.json | 25 + .../SliverWithKeepAliveWidget/desc_ko_KR.json | 25 + .../SliverWithKeepAliveWidget/desc_pt_PT.json | 25 + .../SliverWithKeepAliveWidget/desc_ru_RU.json | 25 + .../AlignTransition/desc_de_DE.json | 22 + .../AlignTransition/desc_en_US.json | 22 + .../AlignTransition/desc_es_ES.json | 22 + .../AlignTransition/desc_fr_FR.json | 22 + .../AlignTransition/desc_it_IT.json | 22 + .../AlignTransition/desc_ja_JP.json | 22 + .../AlignTransition/desc_ko_KR.json | 22 + .../AlignTransition/desc_pt_PT.json | 22 + .../AlignTransition/desc_ru_RU.json | 22 + .../AnimatedAlign/desc_de_DE.json | 26 + .../AnimatedAlign/desc_en_US.json | 26 + .../AnimatedAlign/desc_es_ES.json | 26 + .../AnimatedAlign/desc_fr_FR.json | 26 + .../AnimatedAlign/desc_it_IT.json | 26 + .../AnimatedAlign/desc_ja_JP.json | 26 + .../AnimatedAlign/desc_ko_KR.json | 26 + .../AnimatedAlign/desc_pt_PT.json | 26 + .../AnimatedAlign/desc_ru_RU.json | 26 + .../AnimatedBuilder/desc_de_DE.json | 20 + .../AnimatedBuilder/desc_en_US.json | 20 + .../AnimatedBuilder/desc_es_ES.json | 20 + .../AnimatedBuilder/desc_fr_FR.json | 20 + .../AnimatedBuilder/desc_it_IT.json | 20 + .../AnimatedBuilder/desc_ja_JP.json | 20 + .../AnimatedBuilder/desc_ko_KR.json | 20 + .../AnimatedBuilder/desc_pt_PT.json | 20 + .../AnimatedBuilder/desc_ru_RU.json | 20 + .../AnimatedContainer/desc_de_DE.json | 30 + .../AnimatedContainer/desc_en_US.json | 30 + .../AnimatedContainer/desc_es_ES.json | 30 + .../AnimatedContainer/desc_fr_FR.json | 30 + .../AnimatedContainer/desc_it_IT.json | 30 + .../AnimatedContainer/desc_ja_JP.json | 30 + .../AnimatedContainer/desc_ko_KR.json | 30 + .../AnimatedContainer/desc_pt_PT.json | 30 + .../AnimatedContainer/desc_ru_RU.json | 30 + .../AnimatedCrossFade/desc_de_DE.json | 30 + .../AnimatedCrossFade/desc_en_US.json | 30 + .../AnimatedCrossFade/desc_es_ES.json | 30 + .../AnimatedCrossFade/desc_fr_FR.json | 30 + .../AnimatedCrossFade/desc_it_IT.json | 30 + .../AnimatedCrossFade/desc_ja_JP.json | 30 + .../AnimatedCrossFade/desc_ko_KR.json | 30 + .../AnimatedCrossFade/desc_pt_PT.json | 30 + .../AnimatedCrossFade/desc_ru_RU.json | 30 + .../AnimatedDefaultTextStyle/desc_de_DE.json | 29 + .../AnimatedDefaultTextStyle/desc_en_US.json | 29 + .../AnimatedDefaultTextStyle/desc_es_ES.json | 29 + .../AnimatedDefaultTextStyle/desc_fr_FR.json | 29 + .../AnimatedDefaultTextStyle/desc_it_IT.json | 29 + .../AnimatedDefaultTextStyle/desc_ja_JP.json | 29 + .../AnimatedDefaultTextStyle/desc_ko_KR.json | 29 + .../AnimatedDefaultTextStyle/desc_pt_PT.json | 29 + .../AnimatedDefaultTextStyle/desc_ru_RU.json | 29 + .../desc_de_DE.json | 31 + .../desc_en_US.json | 31 + .../desc_es_ES.json | 31 + .../desc_fr_FR.json | 31 + .../desc_it_IT.json | 31 + .../desc_ja_JP.json | 31 + .../desc_ko_KR.json | 31 + .../desc_pt_PT.json | 31 + .../desc_ru_RU.json | 31 + .../AnimatedList/desc_de_DE.json | 23 + .../AnimatedList/desc_en_US.json | 23 + .../AnimatedList/desc_es_ES.json | 23 + .../AnimatedList/desc_fr_FR.json | 23 + .../AnimatedList/desc_it_IT.json | 23 + .../AnimatedList/desc_ja_JP.json | 23 + .../AnimatedList/desc_ko_KR.json | 23 + .../AnimatedList/desc_pt_PT.json | 23 + .../AnimatedList/desc_ru_RU.json | 23 + .../AnimatedModalBarrier/desc_de_DE.json | 19 + .../AnimatedModalBarrier/desc_en_US.json | 19 + .../AnimatedModalBarrier/desc_es_ES.json | 19 + .../AnimatedModalBarrier/desc_fr_FR.json | 19 + .../AnimatedModalBarrier/desc_it_IT.json | 19 + .../AnimatedModalBarrier/desc_ja_JP.json | 19 + .../AnimatedModalBarrier/desc_ko_KR.json | 19 + .../AnimatedModalBarrier/desc_pt_PT.json | 19 + .../AnimatedModalBarrier/desc_ru_RU.json | 19 + .../AnimatedOpacity/desc_de_DE.json | 25 + .../AnimatedOpacity/desc_en_US.json | 25 + .../AnimatedOpacity/desc_es_ES.json | 25 + .../AnimatedOpacity/desc_fr_FR.json | 25 + .../AnimatedOpacity/desc_it_IT.json | 25 + .../AnimatedOpacity/desc_ja_JP.json | 25 + .../AnimatedOpacity/desc_ko_KR.json | 25 + .../AnimatedOpacity/desc_pt_PT.json | 25 + .../AnimatedOpacity/desc_ru_RU.json | 25 + .../AnimatedPadding/desc_de_DE.json | 22 + .../AnimatedPadding/desc_en_US.json | 22 + .../AnimatedPadding/desc_es_ES.json | 22 + .../AnimatedPadding/desc_fr_FR.json | 22 + .../AnimatedPadding/desc_it_IT.json | 22 + .../AnimatedPadding/desc_ja_JP.json | 22 + .../AnimatedPadding/desc_ko_KR.json | 22 + .../AnimatedPadding/desc_pt_PT.json | 22 + .../AnimatedPadding/desc_ru_RU.json | 22 + .../AnimatedPhysicalModel/desc_de_DE.json | 26 + .../AnimatedPhysicalModel/desc_en_US.json | 26 + .../AnimatedPhysicalModel/desc_es_ES.json | 26 + .../AnimatedPhysicalModel/desc_fr_FR.json | 26 + .../AnimatedPhysicalModel/desc_it_IT.json | 26 + .../AnimatedPhysicalModel/desc_ja_JP.json | 26 + .../AnimatedPhysicalModel/desc_ko_KR.json | 26 + .../AnimatedPhysicalModel/desc_pt_PT.json | 26 + .../AnimatedPhysicalModel/desc_ru_RU.json | 26 + .../AnimatedPositioned/desc_de_DE.json | 29 + .../AnimatedPositioned/desc_en_US.json | 29 + .../AnimatedPositioned/desc_es_ES.json | 29 + .../AnimatedPositioned/desc_fr_FR.json | 29 + .../AnimatedPositioned/desc_it_IT.json | 29 + .../AnimatedPositioned/desc_ja_JP.json | 29 + .../AnimatedPositioned/desc_ko_KR.json | 29 + .../AnimatedPositioned/desc_pt_PT.json | 29 + .../AnimatedPositioned/desc_ru_RU.json | 29 + .../desc_de_DE.json | 28 + .../desc_en_US.json | 28 + .../desc_es_ES.json | 28 + .../desc_fr_FR.json | 28 + .../desc_it_IT.json | 28 + .../desc_ja_JP.json | 28 + .../desc_ko_KR.json | 28 + .../desc_pt_PT.json | 28 + .../desc_ru_RU.json | 28 + .../AnimatedRotation/desc_de_DE.json | 28 + .../AnimatedRotation/desc_en_US.json | 28 + .../AnimatedRotation/desc_es_ES.json | 28 + .../AnimatedRotation/desc_fr_FR.json | 28 + .../AnimatedRotation/desc_it_IT.json | 28 + .../AnimatedRotation/desc_ja_JP.json | 28 + .../AnimatedRotation/desc_ko_KR.json | 28 + .../AnimatedRotation/desc_pt_PT.json | 28 + .../AnimatedRotation/desc_ru_RU.json | 28 + .../AnimatedScale/desc_de_DE.json | 29 + .../AnimatedScale/desc_en_US.json | 29 + .../AnimatedScale/desc_es_ES.json | 29 + .../AnimatedScale/desc_fr_FR.json | 29 + .../AnimatedScale/desc_it_IT.json | 29 + .../AnimatedScale/desc_ja_JP.json | 29 + .../AnimatedScale/desc_ko_KR.json | 29 + .../AnimatedScale/desc_pt_PT.json | 29 + .../AnimatedScale/desc_ru_RU.json | 29 + .../AnimatedSlide/desc_de_DE.json | 26 + .../AnimatedSlide/desc_en_US.json | 26 + .../AnimatedSlide/desc_es_ES.json | 26 + .../AnimatedSlide/desc_fr_FR.json | 26 + .../AnimatedSlide/desc_it_IT.json | 26 + .../AnimatedSlide/desc_ja_JP.json | 26 + .../AnimatedSlide/desc_ko_KR.json | 26 + .../AnimatedSlide/desc_pt_PT.json | 26 + .../AnimatedSlide/desc_ru_RU.json | 26 + .../AnimatedSwitcher/desc_de_DE.json | 23 + .../AnimatedSwitcher/desc_en_US.json | 23 + .../AnimatedSwitcher/desc_es_ES.json | 23 + .../AnimatedSwitcher/desc_fr_FR.json | 23 + .../AnimatedSwitcher/desc_it_IT.json | 23 + .../AnimatedSwitcher/desc_ja_JP.json | 23 + .../AnimatedSwitcher/desc_ko_KR.json | 23 + .../AnimatedSwitcher/desc_pt_PT.json | 23 + .../AnimatedSwitcher/desc_ru_RU.json | 23 + .../AnimatedTheme/desc_de_DE.json | 22 + .../AnimatedTheme/desc_en_US.json | 22 + .../AnimatedTheme/desc_es_ES.json | 22 + .../AnimatedTheme/desc_fr_FR.json | 22 + .../AnimatedTheme/desc_it_IT.json | 22 + .../AnimatedTheme/desc_ja_JP.json | 22 + .../AnimatedTheme/desc_ko_KR.json | 22 + .../AnimatedTheme/desc_pt_PT.json | 22 + .../AnimatedTheme/desc_ru_RU.json | 22 + .../lib/StatefulWidget/AppBar/desc_de_DE.json | 31 + .../lib/StatefulWidget/AppBar/desc_en_US.json | 31 + .../lib/StatefulWidget/AppBar/desc_es_ES.json | 31 + .../lib/StatefulWidget/AppBar/desc_fr_FR.json | 31 + .../lib/StatefulWidget/AppBar/desc_it_IT.json | 31 + .../lib/StatefulWidget/AppBar/desc_ja_JP.json | 31 + .../lib/StatefulWidget/AppBar/desc_ko_KR.json | 31 + .../lib/StatefulWidget/AppBar/desc_pt_PT.json | 31 + .../lib/StatefulWidget/AppBar/desc_ru_RU.json | 31 + .../AutomaticKeepAlive/desc_de_DE.json | 26 + .../AutomaticKeepAlive/desc_en_US.json | 26 + .../AutomaticKeepAlive/desc_es_ES.json | 26 + .../AutomaticKeepAlive/desc_fr_FR.json | 26 + .../AutomaticKeepAlive/desc_it_IT.json | 26 + .../AutomaticKeepAlive/desc_ja_JP.json | 26 + .../AutomaticKeepAlive/desc_ko_KR.json | 26 + .../AutomaticKeepAlive/desc_pt_PT.json | 26 + .../AutomaticKeepAlive/desc_ru_RU.json | 26 + .../BottomAppBar/desc_de_DE.json | 22 + .../BottomAppBar/desc_en_US.json | 22 + .../BottomAppBar/desc_es_ES.json | 22 + .../BottomAppBar/desc_fr_FR.json | 22 + .../BottomAppBar/desc_it_IT.json | 22 + .../BottomAppBar/desc_ja_JP.json | 22 + .../BottomAppBar/desc_ko_KR.json | 22 + .../BottomAppBar/desc_pt_PT.json | 22 + .../BottomAppBar/desc_ru_RU.json | 22 + .../BottomNavigationBar/desc_de_DE.json | 36 ++ .../BottomNavigationBar/desc_en_US.json | 36 ++ .../BottomNavigationBar/desc_es_ES.json | 36 ++ .../BottomNavigationBar/desc_fr_FR.json | 36 ++ .../BottomNavigationBar/desc_it_IT.json | 36 ++ .../BottomNavigationBar/desc_ja_JP.json | 36 ++ .../BottomNavigationBar/desc_ko_KR.json | 36 ++ .../BottomNavigationBar/desc_pt_PT.json | 36 ++ .../BottomNavigationBar/desc_ru_RU.json | 36 ++ .../CarouselView/desc_de_DE.json | 38 ++ .../CarouselView/desc_en_US.json | 38 ++ .../CarouselView/desc_es_ES.json | 38 ++ .../CarouselView/desc_fr_FR.json | 38 ++ .../CarouselView/desc_it_IT.json | 38 ++ .../CarouselView/desc_ja_JP.json | 38 ++ .../CarouselView/desc_ko_KR.json | 38 ++ .../CarouselView/desc_pt_PT.json | 38 ++ .../CarouselView/desc_ru_RU.json | 38 ++ .../StatefulWidget/Checkbox/desc_de_DE.json | 29 + .../StatefulWidget/Checkbox/desc_en_US.json | 29 + .../StatefulWidget/Checkbox/desc_es_ES.json | 29 + .../StatefulWidget/Checkbox/desc_fr_FR.json | 29 + .../StatefulWidget/Checkbox/desc_it_IT.json | 29 + .../StatefulWidget/Checkbox/desc_ja_JP.json | 29 + .../StatefulWidget/Checkbox/desc_ko_KR.json | 29 + .../StatefulWidget/Checkbox/desc_pt_PT.json | 29 + .../StatefulWidget/Checkbox/desc_ru_RU.json | 29 + .../CircularProgressIndicator/desc_de_DE.json | 24 + .../CircularProgressIndicator/desc_en_US.json | 24 + .../CircularProgressIndicator/desc_es_ES.json | 24 + .../CircularProgressIndicator/desc_fr_FR.json | 24 + .../CircularProgressIndicator/desc_it_IT.json | 24 + .../CircularProgressIndicator/desc_ja_JP.json | 24 + .../CircularProgressIndicator/desc_ko_KR.json | 24 + .../CircularProgressIndicator/desc_pt_PT.json | 24 + .../CircularProgressIndicator/desc_ru_RU.json | 24 + .../desc_de_DE.json | 22 + .../desc_en_US.json | 22 + .../desc_es_ES.json | 22 + .../desc_fr_FR.json | 22 + .../desc_it_IT.json | 22 + .../desc_ja_JP.json | 22 + .../desc_ko_KR.json | 22 + .../desc_pt_PT.json | 22 + .../desc_ru_RU.json | 22 + .../CupertinoApp/desc_de_DE.json | 24 + .../CupertinoApp/desc_en_US.json | 24 + .../CupertinoApp/desc_es_ES.json | 24 + .../CupertinoApp/desc_fr_FR.json | 24 + .../CupertinoApp/desc_it_IT.json | 24 + .../CupertinoApp/desc_ja_JP.json | 24 + .../CupertinoApp/desc_ko_KR.json | 24 + .../CupertinoApp/desc_pt_PT.json | 24 + .../CupertinoApp/desc_ru_RU.json | 24 + .../CupertinoButton/desc_de_DE.json | 23 + .../CupertinoButton/desc_en_US.json | 23 + .../CupertinoButton/desc_es_ES.json | 23 + .../CupertinoButton/desc_fr_FR.json | 23 + .../CupertinoButton/desc_it_IT.json | 23 + .../CupertinoButton/desc_ja_JP.json | 23 + .../CupertinoButton/desc_ko_KR.json | 23 + .../CupertinoButton/desc_pt_PT.json | 23 + .../CupertinoButton/desc_ru_RU.json | 23 + .../CupertinoCheckbox/desc_de_DE.json | 43 ++ .../CupertinoCheckbox/desc_en_US.json | 43 ++ .../CupertinoCheckbox/desc_es_ES.json | 43 ++ .../CupertinoCheckbox/desc_fr_FR.json | 43 ++ .../CupertinoCheckbox/desc_it_IT.json | 43 ++ .../CupertinoCheckbox/desc_ja_JP.json | 43 ++ .../CupertinoCheckbox/desc_ko_KR.json | 43 ++ .../CupertinoCheckbox/desc_pt_PT.json | 43 ++ .../CupertinoCheckbox/desc_ru_RU.json | 43 ++ .../CupertinoContextMenu/desc_de_DE.json | 20 + .../CupertinoContextMenu/desc_en_US.json | 20 + .../CupertinoContextMenu/desc_es_ES.json | 20 + .../CupertinoContextMenu/desc_fr_FR.json | 20 + .../CupertinoContextMenu/desc_it_IT.json | 20 + .../CupertinoContextMenu/desc_ja_JP.json | 20 + .../CupertinoContextMenu/desc_ko_KR.json | 20 + .../CupertinoContextMenu/desc_pt_PT.json | 20 + .../CupertinoContextMenu/desc_ru_RU.json | 20 + .../desc_de_DE.json | 21 + .../desc_en_US.json | 21 + .../desc_es_ES.json | 21 + .../desc_fr_FR.json | 21 + .../desc_it_IT.json | 21 + .../desc_ja_JP.json | 21 + .../desc_ko_KR.json | 21 + .../desc_pt_PT.json | 21 + .../desc_ru_RU.json | 21 + .../CupertinoDatePicker/desc_de_DE.json | 25 + .../CupertinoDatePicker/desc_en_US.json | 25 + .../CupertinoDatePicker/desc_es_ES.json | 25 + .../CupertinoDatePicker/desc_fr_FR.json | 25 + .../CupertinoDatePicker/desc_it_IT.json | 25 + .../CupertinoDatePicker/desc_ja_JP.json | 25 + .../CupertinoDatePicker/desc_ko_KR.json | 25 + .../CupertinoDatePicker/desc_pt_PT.json | 25 + .../CupertinoDatePicker/desc_ru_RU.json | 25 + .../CupertinoNavigationBar/desc_de_DE.json | 23 + .../CupertinoNavigationBar/desc_en_US.json | 23 + .../CupertinoNavigationBar/desc_es_ES.json | 23 + .../CupertinoNavigationBar/desc_fr_FR.json | 23 + .../CupertinoNavigationBar/desc_it_IT.json | 23 + .../CupertinoNavigationBar/desc_ja_JP.json | 23 + .../CupertinoNavigationBar/desc_ko_KR.json | 23 + .../CupertinoNavigationBar/desc_pt_PT.json | 23 + .../CupertinoNavigationBar/desc_ru_RU.json | 23 + .../CupertinoPageScaffold/desc_de_DE.json | 20 + .../CupertinoPageScaffold/desc_en_US.json | 20 + .../CupertinoPageScaffold/desc_es_ES.json | 20 + .../CupertinoPageScaffold/desc_fr_FR.json | 20 + .../CupertinoPageScaffold/desc_it_IT.json | 20 + .../CupertinoPageScaffold/desc_ja_JP.json | 20 + .../CupertinoPageScaffold/desc_ko_KR.json | 20 + .../CupertinoPageScaffold/desc_pt_PT.json | 20 + .../CupertinoPageScaffold/desc_ru_RU.json | 20 + .../CupertinoPicker/desc_de_DE.json | 24 + .../CupertinoPicker/desc_en_US.json | 24 + .../CupertinoPicker/desc_es_ES.json | 24 + .../CupertinoPicker/desc_fr_FR.json | 24 + .../CupertinoPicker/desc_it_IT.json | 24 + .../CupertinoPicker/desc_ja_JP.json | 24 + .../CupertinoPicker/desc_ko_KR.json | 24 + .../CupertinoPicker/desc_pt_PT.json | 24 + .../CupertinoPicker/desc_ru_RU.json | 24 + .../CupertinoRadio/desc_de_DE.json | 42 ++ .../CupertinoRadio/desc_en_US.json | 42 ++ .../CupertinoRadio/desc_es_ES.json | 42 ++ .../CupertinoRadio/desc_fr_FR.json | 42 ++ .../CupertinoRadio/desc_it_IT.json | 42 ++ .../CupertinoRadio/desc_ja_JP.json | 42 ++ .../CupertinoRadio/desc_ko_KR.json | 42 ++ .../CupertinoRadio/desc_pt_PT.json | 42 ++ .../CupertinoRadio/desc_ru_RU.json | 42 ++ .../CupertinoScrollbar/desc_de_DE.json | 23 + .../CupertinoScrollbar/desc_en_US.json | 23 + .../CupertinoScrollbar/desc_es_ES.json | 23 + .../CupertinoScrollbar/desc_fr_FR.json | 23 + .../CupertinoScrollbar/desc_it_IT.json | 23 + .../CupertinoScrollbar/desc_ja_JP.json | 23 + .../CupertinoScrollbar/desc_ko_KR.json | 23 + .../CupertinoScrollbar/desc_pt_PT.json | 23 + .../CupertinoScrollbar/desc_ru_RU.json | 23 + .../CupertinoSegmentedControl/desc_de_DE.json | 34 ++ .../CupertinoSegmentedControl/desc_en_US.json | 34 ++ .../CupertinoSegmentedControl/desc_es_ES.json | 34 ++ .../CupertinoSegmentedControl/desc_fr_FR.json | 34 ++ .../CupertinoSegmentedControl/desc_it_IT.json | 34 ++ .../CupertinoSegmentedControl/desc_ja_JP.json | 34 ++ .../CupertinoSegmentedControl/desc_ko_KR.json | 34 ++ .../CupertinoSegmentedControl/desc_pt_PT.json | 34 ++ .../CupertinoSegmentedControl/desc_ru_RU.json | 34 ++ .../CupertinoSlider/desc_de_DE.json | 26 + .../CupertinoSlider/desc_en_US.json | 26 + .../CupertinoSlider/desc_es_ES.json | 26 + .../CupertinoSlider/desc_fr_FR.json | 26 + .../CupertinoSlider/desc_it_IT.json | 26 + .../CupertinoSlider/desc_ja_JP.json | 26 + .../CupertinoSlider/desc_ko_KR.json | 26 + .../CupertinoSlider/desc_pt_PT.json | 26 + .../CupertinoSlider/desc_ru_RU.json | 26 + .../desc_de_DE.json | 26 + .../desc_en_US.json | 26 + .../desc_es_ES.json | 26 + .../desc_fr_FR.json | 26 + .../desc_it_IT.json | 26 + .../desc_ja_JP.json | 26 + .../desc_ko_KR.json | 26 + .../desc_pt_PT.json | 26 + .../desc_ru_RU.json | 26 + .../CupertinoSwitch/desc_de_DE.json | 20 + .../CupertinoSwitch/desc_en_US.json | 20 + .../CupertinoSwitch/desc_es_ES.json | 20 + .../CupertinoSwitch/desc_fr_FR.json | 20 + .../CupertinoSwitch/desc_it_IT.json | 20 + .../CupertinoSwitch/desc_ja_JP.json | 20 + .../CupertinoSwitch/desc_ko_KR.json | 20 + .../CupertinoSwitch/desc_pt_PT.json | 20 + .../CupertinoSwitch/desc_ru_RU.json | 20 + .../CupertinoTabBar/desc_de_DE.json | 25 + .../CupertinoTabBar/desc_en_US.json | 25 + .../CupertinoTabBar/desc_es_ES.json | 25 + .../CupertinoTabBar/desc_fr_FR.json | 25 + .../CupertinoTabBar/desc_it_IT.json | 25 + .../CupertinoTabBar/desc_ja_JP.json | 25 + .../CupertinoTabBar/desc_ko_KR.json | 25 + .../CupertinoTabBar/desc_pt_PT.json | 25 + .../CupertinoTabBar/desc_ru_RU.json | 25 + .../CupertinoTabScaffold/desc_de_DE.json | 21 + .../CupertinoTabScaffold/desc_en_US.json | 21 + .../CupertinoTabScaffold/desc_es_ES.json | 21 + .../CupertinoTabScaffold/desc_fr_FR.json | 21 + .../CupertinoTabScaffold/desc_it_IT.json | 21 + .../CupertinoTabScaffold/desc_ja_JP.json | 21 + .../CupertinoTabScaffold/desc_ko_KR.json | 21 + .../CupertinoTabScaffold/desc_pt_PT.json | 21 + .../CupertinoTabScaffold/desc_ru_RU.json | 21 + .../CupertinoTabView/desc_de_DE.json | 24 + .../CupertinoTabView/desc_en_US.json | 24 + .../CupertinoTabView/desc_es_ES.json | 24 + .../CupertinoTabView/desc_fr_FR.json | 24 + .../CupertinoTabView/desc_it_IT.json | 24 + .../CupertinoTabView/desc_ja_JP.json | 24 + .../CupertinoTabView/desc_ko_KR.json | 24 + .../CupertinoTabView/desc_pt_PT.json | 24 + .../CupertinoTabView/desc_ru_RU.json | 24 + .../CupertinoTextField/desc_de_DE.json | 40 ++ .../CupertinoTextField/desc_en_US.json | 40 ++ .../CupertinoTextField/desc_es_ES.json | 40 ++ .../CupertinoTextField/desc_fr_FR.json | 40 ++ .../CupertinoTextField/desc_it_IT.json | 40 ++ .../CupertinoTextField/desc_ja_JP.json | 40 ++ .../CupertinoTextField/desc_ko_KR.json | 40 ++ .../CupertinoTextField/desc_pt_PT.json | 40 ++ .../CupertinoTextField/desc_ru_RU.json | 40 ++ .../CupertinoTimerPicker/desc_de_DE.json | 23 + .../CupertinoTimerPicker/desc_en_US.json | 23 + .../CupertinoTimerPicker/desc_es_ES.json | 23 + .../CupertinoTimerPicker/desc_fr_FR.json | 23 + .../CupertinoTimerPicker/desc_it_IT.json | 23 + .../CupertinoTimerPicker/desc_ja_JP.json | 23 + .../CupertinoTimerPicker/desc_ko_KR.json | 23 + .../CupertinoTimerPicker/desc_pt_PT.json | 23 + .../CupertinoTimerPicker/desc_ru_RU.json | 23 + .../DateRangePickerDialog/desc_de_DE.json | 32 + .../DateRangePickerDialog/desc_en_US.json | 32 + .../DateRangePickerDialog/desc_es_ES.json | 32 + .../DateRangePickerDialog/desc_fr_FR.json | 32 + .../DateRangePickerDialog/desc_it_IT.json | 32 + .../DateRangePickerDialog/desc_ja_JP.json | 32 + .../DateRangePickerDialog/desc_ko_KR.json | 32 + .../DateRangePickerDialog/desc_pt_PT.json | 32 + .../DateRangePickerDialog/desc_ru_RU.json | 32 + .../DecoratedBoxTransition/desc_de_DE.json | 20 + .../DecoratedBoxTransition/desc_en_US.json | 20 + .../DecoratedBoxTransition/desc_es_ES.json | 20 + .../DecoratedBoxTransition/desc_fr_FR.json | 20 + .../DecoratedBoxTransition/desc_it_IT.json | 20 + .../DecoratedBoxTransition/desc_ja_JP.json | 20 + .../DecoratedBoxTransition/desc_ko_KR.json | 20 + .../DecoratedBoxTransition/desc_pt_PT.json | 20 + .../DecoratedBoxTransition/desc_ru_RU.json | 20 + .../DefaultTabController/desc_de_DE.json | 23 + .../DefaultTabController/desc_en_US.json | 23 + .../DefaultTabController/desc_es_ES.json | 23 + .../DefaultTabController/desc_fr_FR.json | 23 + .../DefaultTabController/desc_it_IT.json | 23 + .../DefaultTabController/desc_ja_JP.json | 23 + .../DefaultTabController/desc_ko_KR.json | 23 + .../DefaultTabController/desc_pt_PT.json | 23 + .../DefaultTabController/desc_ru_RU.json | 23 + .../desc_de_DE.json | 26 + .../desc_en_US.json | 26 + .../desc_es_ES.json | 26 + .../desc_fr_FR.json | 26 + .../desc_it_IT.json | 26 + .../desc_ja_JP.json | 26 + .../desc_ko_KR.json | 26 + .../desc_pt_PT.json | 26 + .../desc_ru_RU.json | 26 + .../Dismissible/desc_de_DE.json | 31 + .../Dismissible/desc_en_US.json | 31 + .../Dismissible/desc_es_ES.json | 31 + .../Dismissible/desc_fr_FR.json | 31 + .../Dismissible/desc_it_IT.json | 31 + .../Dismissible/desc_ja_JP.json | 31 + .../Dismissible/desc_ko_KR.json | 31 + .../Dismissible/desc_pt_PT.json | 31 + .../Dismissible/desc_ru_RU.json | 31 + .../StatefulWidget/DragTarget/desc_de_DE.json | 24 + .../StatefulWidget/DragTarget/desc_en_US.json | 24 + .../StatefulWidget/DragTarget/desc_es_ES.json | 24 + .../StatefulWidget/DragTarget/desc_fr_FR.json | 24 + .../StatefulWidget/DragTarget/desc_it_IT.json | 24 + .../StatefulWidget/DragTarget/desc_ja_JP.json | 24 + .../StatefulWidget/DragTarget/desc_ko_KR.json | 24 + .../StatefulWidget/DragTarget/desc_pt_PT.json | 24 + .../StatefulWidget/DragTarget/desc_ru_RU.json | 24 + .../StatefulWidget/Draggable/desc_de_DE.json | 42 ++ .../StatefulWidget/Draggable/desc_en_US.json | 42 ++ .../StatefulWidget/Draggable/desc_es_ES.json | 42 ++ .../StatefulWidget/Draggable/desc_fr_FR.json | 42 ++ .../StatefulWidget/Draggable/desc_it_IT.json | 42 ++ .../StatefulWidget/Draggable/desc_ja_JP.json | 42 ++ .../StatefulWidget/Draggable/desc_ko_KR.json | 42 ++ .../StatefulWidget/Draggable/desc_pt_PT.json | 42 ++ .../StatefulWidget/Draggable/desc_ru_RU.json | 42 ++ .../DraggableScrollableSheet/desc_de_DE.json | 25 + .../DraggableScrollableSheet/desc_en_US.json | 25 + .../DraggableScrollableSheet/desc_es_ES.json | 25 + .../DraggableScrollableSheet/desc_fr_FR.json | 25 + .../DraggableScrollableSheet/desc_it_IT.json | 25 + .../DraggableScrollableSheet/desc_ja_JP.json | 25 + .../DraggableScrollableSheet/desc_ko_KR.json | 25 + .../DraggableScrollableSheet/desc_pt_PT.json | 25 + .../DraggableScrollableSheet/desc_ru_RU.json | 25 + .../DrawerController/desc_de_DE.json | 25 + .../DrawerController/desc_en_US.json | 25 + .../DrawerController/desc_es_ES.json | 25 + .../DrawerController/desc_fr_FR.json | 25 + .../DrawerController/desc_it_IT.json | 25 + .../DrawerController/desc_ja_JP.json | 25 + .../DrawerController/desc_ko_KR.json | 25 + .../DrawerController/desc_pt_PT.json | 25 + .../DrawerController/desc_ru_RU.json | 25 + .../DropdownButton/desc_de_DE.json | 33 ++ .../DropdownButton/desc_en_US.json | 33 ++ .../DropdownButton/desc_es_ES.json | 33 ++ .../DropdownButton/desc_fr_FR.json | 33 ++ .../DropdownButton/desc_it_IT.json | 33 ++ .../DropdownButton/desc_ja_JP.json | 33 ++ .../DropdownButton/desc_ko_KR.json | 33 ++ .../DropdownButton/desc_pt_PT.json | 33 ++ .../DropdownButton/desc_ru_RU.json | 33 ++ .../DropdownButtonFormField/desc_de_DE.json | 24 + .../DropdownButtonFormField/desc_en_US.json | 24 + .../DropdownButtonFormField/desc_es_ES.json | 24 + .../DropdownButtonFormField/desc_fr_FR.json | 24 + .../DropdownButtonFormField/desc_it_IT.json | 24 + .../DropdownButtonFormField/desc_ja_JP.json | 24 + .../DropdownButtonFormField/desc_ko_KR.json | 24 + .../DropdownButtonFormField/desc_pt_PT.json | 24 + .../DropdownButtonFormField/desc_ru_RU.json | 24 + .../DropdownMenu/desc_de_DE.json | 46 ++ .../DropdownMenu/desc_en_US.json | 46 ++ .../DropdownMenu/desc_es_ES.json | 46 ++ .../DropdownMenu/desc_fr_FR.json | 46 ++ .../DropdownMenu/desc_it_IT.json | 46 ++ .../DropdownMenu/desc_ja_JP.json | 46 ++ .../DropdownMenu/desc_ko_KR.json | 46 ++ .../DropdownMenu/desc_pt_PT.json | 46 ++ .../DropdownMenu/desc_ru_RU.json | 46 ++ .../EditableText/desc_de_DE.json | 26 + .../EditableText/desc_en_US.json | 26 + .../EditableText/desc_es_ES.json | 26 + .../EditableText/desc_fr_FR.json | 26 + .../EditableText/desc_it_IT.json | 26 + .../EditableText/desc_ja_JP.json | 26 + .../EditableText/desc_ko_KR.json | 26 + .../EditableText/desc_pt_PT.json | 26 + .../EditableText/desc_ru_RU.json | 26 + .../ElevatedButton/desc_de_DE.json | 34 ++ .../ElevatedButton/desc_en_US.json | 34 ++ .../ElevatedButton/desc_es_ES.json | 34 ++ .../ElevatedButton/desc_fr_FR.json | 34 ++ .../ElevatedButton/desc_it_IT.json | 34 ++ .../ElevatedButton/desc_ja_JP.json | 34 ++ .../ElevatedButton/desc_ko_KR.json | 34 ++ .../ElevatedButton/desc_pt_PT.json | 34 ++ .../ElevatedButton/desc_ru_RU.json | 34 ++ .../StatefulWidget/ExpandIcon/desc_de_DE.json | 26 + .../StatefulWidget/ExpandIcon/desc_en_US.json | 26 + .../StatefulWidget/ExpandIcon/desc_es_ES.json | 26 + .../StatefulWidget/ExpandIcon/desc_fr_FR.json | 26 + .../StatefulWidget/ExpandIcon/desc_it_IT.json | 26 + .../StatefulWidget/ExpandIcon/desc_ja_JP.json | 26 + .../StatefulWidget/ExpandIcon/desc_ko_KR.json | 26 + .../StatefulWidget/ExpandIcon/desc_pt_PT.json | 26 + .../StatefulWidget/ExpandIcon/desc_ru_RU.json | 26 + .../ExpansionPanelList/desc_de_DE.json | 21 + .../ExpansionPanelList/desc_en_US.json | 21 + .../ExpansionPanelList/desc_es_ES.json | 21 + .../ExpansionPanelList/desc_fr_FR.json | 21 + .../ExpansionPanelList/desc_it_IT.json | 21 + .../ExpansionPanelList/desc_ja_JP.json | 21 + .../ExpansionPanelList/desc_ko_KR.json | 21 + .../ExpansionPanelList/desc_pt_PT.json | 21 + .../ExpansionPanelList/desc_ru_RU.json | 21 + .../ExpansionTile/desc_de_DE.json | 24 + .../ExpansionTile/desc_en_US.json | 24 + .../ExpansionTile/desc_es_ES.json | 24 + .../ExpansionTile/desc_fr_FR.json | 24 + .../ExpansionTile/desc_it_IT.json | 24 + .../ExpansionTile/desc_ja_JP.json | 24 + .../ExpansionTile/desc_ko_KR.json | 24 + .../ExpansionTile/desc_pt_PT.json | 24 + .../ExpansionTile/desc_ru_RU.json | 24 + .../FilledButton/desc_de_DE.json | 33 ++ .../FilledButton/desc_en_US.json | 33 ++ .../FilledButton/desc_es_ES.json | 33 ++ .../FilledButton/desc_fr_FR.json | 33 ++ .../FilledButton/desc_it_IT.json | 33 ++ .../FilledButton/desc_ja_JP.json | 33 ++ .../FilledButton/desc_ko_KR.json | 33 ++ .../FilledButton/desc_pt_PT.json | 33 ++ .../FilledButton/desc_ru_RU.json | 33 ++ .../lib/StatefulWidget/Focus/desc_de_DE.json | 38 ++ .../lib/StatefulWidget/Focus/desc_en_US.json | 38 ++ .../lib/StatefulWidget/Focus/desc_es_ES.json | 38 ++ .../lib/StatefulWidget/Focus/desc_fr_FR.json | 38 ++ .../lib/StatefulWidget/Focus/desc_it_IT.json | 38 ++ .../lib/StatefulWidget/Focus/desc_ja_JP.json | 38 ++ .../lib/StatefulWidget/Focus/desc_ko_KR.json | 38 ++ .../lib/StatefulWidget/Focus/desc_pt_PT.json | 38 ++ .../lib/StatefulWidget/Focus/desc_ru_RU.json | 38 ++ .../lib/StatefulWidget/Form/desc_de_DE.json | 20 + .../lib/StatefulWidget/Form/desc_en_US.json | 20 + .../lib/StatefulWidget/Form/desc_es_ES.json | 20 + .../lib/StatefulWidget/Form/desc_fr_FR.json | 20 + .../lib/StatefulWidget/Form/desc_it_IT.json | 20 + .../lib/StatefulWidget/Form/desc_ja_JP.json | 20 + .../lib/StatefulWidget/Form/desc_ko_KR.json | 20 + .../lib/StatefulWidget/Form/desc_pt_PT.json | 20 + .../lib/StatefulWidget/Form/desc_ru_RU.json | 20 + .../StatefulWidget/FormField/desc_de_DE.json | 26 + .../StatefulWidget/FormField/desc_en_US.json | 26 + .../StatefulWidget/FormField/desc_es_ES.json | 26 + .../StatefulWidget/FormField/desc_fr_FR.json | 26 + .../StatefulWidget/FormField/desc_it_IT.json | 26 + .../StatefulWidget/FormField/desc_ja_JP.json | 26 + .../StatefulWidget/FormField/desc_ko_KR.json | 26 + .../StatefulWidget/FormField/desc_pt_PT.json | 26 + .../StatefulWidget/FormField/desc_ru_RU.json | 26 + .../FutureBuilder/desc_de_DE.json | 20 + .../FutureBuilder/desc_en_US.json | 20 + .../FutureBuilder/desc_es_ES.json | 20 + .../FutureBuilder/desc_fr_FR.json | 20 + .../FutureBuilder/desc_it_IT.json | 20 + .../FutureBuilder/desc_ja_JP.json | 20 + .../FutureBuilder/desc_ko_KR.json | 20 + .../FutureBuilder/desc_pt_PT.json | 20 + .../FutureBuilder/desc_ru_RU.json | 20 + .../desc_de_DE.json | 22 + .../desc_en_US.json | 22 + .../desc_es_ES.json | 22 + .../desc_fr_FR.json | 22 + .../desc_it_IT.json | 22 + .../desc_ja_JP.json | 22 + .../desc_ko_KR.json | 22 + .../desc_pt_PT.json | 22 + .../desc_ru_RU.json | 22 + .../lib/StatefulWidget/Hero/desc_de_DE.json | 18 + .../lib/StatefulWidget/Hero/desc_en_US.json | 18 + .../lib/StatefulWidget/Hero/desc_es_ES.json | 18 + .../lib/StatefulWidget/Hero/desc_fr_FR.json | 18 + .../lib/StatefulWidget/Hero/desc_it_IT.json | 18 + .../lib/StatefulWidget/Hero/desc_ja_JP.json | 18 + .../lib/StatefulWidget/Hero/desc_ko_KR.json | 18 + .../lib/StatefulWidget/Hero/desc_pt_PT.json | 18 + .../lib/StatefulWidget/Hero/desc_ru_RU.json | 18 + .../lib/StatefulWidget/Image/desc_de_DE.json | 58 ++ .../lib/StatefulWidget/Image/desc_en_US.json | 58 ++ .../lib/StatefulWidget/Image/desc_es_ES.json | 58 ++ .../lib/StatefulWidget/Image/desc_fr_FR.json | 58 ++ .../lib/StatefulWidget/Image/desc_it_IT.json | 58 ++ .../lib/StatefulWidget/Image/desc_ja_JP.json | 58 ++ .../lib/StatefulWidget/Image/desc_ko_KR.json | 58 ++ .../lib/StatefulWidget/Image/desc_pt_PT.json | 58 ++ .../lib/StatefulWidget/Image/desc_ru_RU.json | 58 ++ .../lib/StatefulWidget/Ink/desc_de_DE.json | 33 ++ .../lib/StatefulWidget/Ink/desc_en_US.json | 33 ++ .../lib/StatefulWidget/Ink/desc_es_ES.json | 33 ++ .../lib/StatefulWidget/Ink/desc_fr_FR.json | 33 ++ .../lib/StatefulWidget/Ink/desc_it_IT.json | 33 ++ .../lib/StatefulWidget/Ink/desc_ja_JP.json | 33 ++ .../lib/StatefulWidget/Ink/desc_ko_KR.json | 33 ++ .../lib/StatefulWidget/Ink/desc_pt_PT.json | 33 ++ .../lib/StatefulWidget/Ink/desc_ru_RU.json | 33 ++ .../InkResponse/desc_de_DE.json | 36 ++ .../InkResponse/desc_en_US.json | 36 ++ .../InkResponse/desc_es_ES.json | 36 ++ .../InkResponse/desc_fr_FR.json | 36 ++ .../InkResponse/desc_it_IT.json | 36 ++ .../InkResponse/desc_ja_JP.json | 36 ++ .../InkResponse/desc_ko_KR.json | 36 ++ .../InkResponse/desc_pt_PT.json | 36 ++ .../InkResponse/desc_ru_RU.json | 36 ++ .../StatefulWidget/InkWell/desc_de_DE.json | 36 ++ .../StatefulWidget/InkWell/desc_en_US.json | 36 ++ .../StatefulWidget/InkWell/desc_es_ES.json | 36 ++ .../StatefulWidget/InkWell/desc_fr_FR.json | 36 ++ .../StatefulWidget/InkWell/desc_it_IT.json | 36 ++ .../StatefulWidget/InkWell/desc_ja_JP.json | 36 ++ .../StatefulWidget/InkWell/desc_ko_KR.json | 36 ++ .../StatefulWidget/InkWell/desc_pt_PT.json | 36 ++ .../StatefulWidget/InkWell/desc_ru_RU.json | 36 ++ .../InputDecorator/desc_de_DE.json | 20 + .../InputDecorator/desc_en_US.json | 20 + .../InputDecorator/desc_es_ES.json | 20 + .../InputDecorator/desc_fr_FR.json | 20 + .../InputDecorator/desc_it_IT.json | 20 + .../InputDecorator/desc_ja_JP.json | 20 + .../InputDecorator/desc_ko_KR.json | 20 + .../InputDecorator/desc_pt_PT.json | 20 + .../InputDecorator/desc_ru_RU.json | 20 + .../InteractiveViewer/desc_de_DE.json | 45 ++ .../InteractiveViewer/desc_en_US.json | 45 ++ .../InteractiveViewer/desc_es_ES.json | 45 ++ .../InteractiveViewer/desc_fr_FR.json | 45 ++ .../InteractiveViewer/desc_it_IT.json | 45 ++ .../InteractiveViewer/desc_ja_JP.json | 45 ++ .../InteractiveViewer/desc_ko_KR.json | 45 ++ .../InteractiveViewer/desc_pt_PT.json | 45 ++ .../InteractiveViewer/desc_ru_RU.json | 45 ++ .../KeyboardListener/desc_de_DE.json | 26 + .../KeyboardListener/desc_en_US.json | 26 + .../KeyboardListener/desc_es_ES.json | 26 + .../KeyboardListener/desc_fr_FR.json | 26 + .../KeyboardListener/desc_it_IT.json | 26 + .../KeyboardListener/desc_ja_JP.json | 26 + .../KeyboardListener/desc_ko_KR.json | 26 + .../KeyboardListener/desc_pt_PT.json | 26 + .../KeyboardListener/desc_ru_RU.json | 26 + .../LicensePage/desc_de_DE.json | 24 + .../LicensePage/desc_en_US.json | 24 + .../LicensePage/desc_es_ES.json | 24 + .../LicensePage/desc_fr_FR.json | 24 + .../LicensePage/desc_it_IT.json | 24 + .../LicensePage/desc_ja_JP.json | 24 + .../LicensePage/desc_ko_KR.json | 24 + .../LicensePage/desc_pt_PT.json | 24 + .../LicensePage/desc_ru_RU.json | 24 + .../LinearProgressIndicator/desc_de_DE.json | 24 + .../LinearProgressIndicator/desc_en_US.json | 24 + .../LinearProgressIndicator/desc_es_ES.json | 24 + .../LinearProgressIndicator/desc_fr_FR.json | 24 + .../LinearProgressIndicator/desc_it_IT.json | 24 + .../LinearProgressIndicator/desc_ja_JP.json | 24 + .../LinearProgressIndicator/desc_ko_KR.json | 24 + .../LinearProgressIndicator/desc_pt_PT.json | 24 + .../LinearProgressIndicator/desc_ru_RU.json | 24 + .../ListWheelScrollView/desc_de_DE.json | 24 + .../ListWheelScrollView/desc_en_US.json | 24 + .../ListWheelScrollView/desc_es_ES.json | 24 + .../ListWheelScrollView/desc_fr_FR.json | 24 + .../ListWheelScrollView/desc_it_IT.json | 24 + .../ListWheelScrollView/desc_ja_JP.json | 24 + .../ListWheelScrollView/desc_ko_KR.json | 24 + .../ListWheelScrollView/desc_pt_PT.json | 24 + .../ListWheelScrollView/desc_ru_RU.json | 24 + .../Localizations/desc_de_DE.json | 21 + .../Localizations/desc_en_US.json | 21 + .../Localizations/desc_es_ES.json | 21 + .../Localizations/desc_fr_FR.json | 21 + .../Localizations/desc_it_IT.json | 21 + .../Localizations/desc_ja_JP.json | 21 + .../Localizations/desc_ko_KR.json | 21 + .../Localizations/desc_pt_PT.json | 21 + .../Localizations/desc_ru_RU.json | 21 + .../LongPressDraggable/desc_de_DE.json | 28 + .../LongPressDraggable/desc_en_US.json | 28 + .../LongPressDraggable/desc_es_ES.json | 28 + .../LongPressDraggable/desc_fr_FR.json | 28 + .../LongPressDraggable/desc_it_IT.json | 28 + .../LongPressDraggable/desc_ja_JP.json | 28 + .../LongPressDraggable/desc_ko_KR.json | 28 + .../LongPressDraggable/desc_pt_PT.json | 28 + .../LongPressDraggable/desc_ru_RU.json | 28 + .../StatefulWidget/Material/desc_de_DE.json | 29 + .../StatefulWidget/Material/desc_en_US.json | 29 + .../StatefulWidget/Material/desc_es_ES.json | 29 + .../StatefulWidget/Material/desc_fr_FR.json | 29 + .../StatefulWidget/Material/desc_it_IT.json | 29 + .../StatefulWidget/Material/desc_ja_JP.json | 29 + .../StatefulWidget/Material/desc_ko_KR.json | 29 + .../StatefulWidget/Material/desc_pt_PT.json | 29 + .../StatefulWidget/Material/desc_ru_RU.json | 29 + .../MaterialApp/desc_de_DE.json | 24 + .../MaterialApp/desc_en_US.json | 24 + .../MaterialApp/desc_es_ES.json | 24 + .../MaterialApp/desc_fr_FR.json | 24 + .../MaterialApp/desc_it_IT.json | 24 + .../MaterialApp/desc_ja_JP.json | 24 + .../MaterialApp/desc_ko_KR.json | 24 + .../MaterialApp/desc_pt_PT.json | 24 + .../MaterialApp/desc_ru_RU.json | 24 + .../MergeableMaterial/desc_de_DE.json | 22 + .../MergeableMaterial/desc_en_US.json | 22 + .../MergeableMaterial/desc_es_ES.json | 22 + .../MergeableMaterial/desc_fr_FR.json | 22 + .../MergeableMaterial/desc_it_IT.json | 22 + .../MergeableMaterial/desc_ja_JP.json | 22 + .../MergeableMaterial/desc_ko_KR.json | 22 + .../MergeableMaterial/desc_pt_PT.json | 22 + .../MergeableMaterial/desc_ru_RU.json | 22 + .../MonthPicker/desc_de_DE.json | 54 ++ .../MonthPicker/desc_en_US.json | 54 ++ .../MonthPicker/desc_es_ES.json | 54 ++ .../MonthPicker/desc_fr_FR.json | 54 ++ .../MonthPicker/desc_it_IT.json | 54 ++ .../MonthPicker/desc_ja_JP.json | 54 ++ .../MonthPicker/desc_ko_KR.json | 54 ++ .../MonthPicker/desc_pt_PT.json | 54 ++ .../MonthPicker/desc_ru_RU.json | 54 ++ .../MouseRegion/desc_de_DE.json | 20 + .../MouseRegion/desc_en_US.json | 20 + .../MouseRegion/desc_es_ES.json | 20 + .../MouseRegion/desc_fr_FR.json | 20 + .../MouseRegion/desc_it_IT.json | 20 + .../MouseRegion/desc_ja_JP.json | 20 + .../MouseRegion/desc_ko_KR.json | 20 + .../MouseRegion/desc_pt_PT.json | 20 + .../MouseRegion/desc_ru_RU.json | 20 + .../NavigationRail/desc_de_DE.json | 50 ++ .../NavigationRail/desc_en_US.json | 50 ++ .../NavigationRail/desc_es_ES.json | 50 ++ .../NavigationRail/desc_fr_FR.json | 50 ++ .../NavigationRail/desc_it_IT.json | 50 ++ .../NavigationRail/desc_ja_JP.json | 50 ++ .../NavigationRail/desc_ko_KR.json | 50 ++ .../NavigationRail/desc_pt_PT.json | 50 ++ .../NavigationRail/desc_ru_RU.json | 50 ++ .../StatefulWidget/Navigator/desc_de_DE.json | 21 + .../StatefulWidget/Navigator/desc_en_US.json | 21 + .../StatefulWidget/Navigator/desc_es_ES.json | 21 + .../StatefulWidget/Navigator/desc_fr_FR.json | 21 + .../StatefulWidget/Navigator/desc_it_IT.json | 21 + .../StatefulWidget/Navigator/desc_ja_JP.json | 21 + .../StatefulWidget/Navigator/desc_ko_KR.json | 21 + .../StatefulWidget/Navigator/desc_pt_PT.json | 21 + .../StatefulWidget/Navigator/desc_ru_RU.json | 21 + .../NestedScrollView/desc_de_DE.json | 27 + .../NestedScrollView/desc_en_US.json | 27 + .../NestedScrollView/desc_es_ES.json | 27 + .../NestedScrollView/desc_fr_FR.json | 27 + .../NestedScrollView/desc_it_IT.json | 27 + .../NestedScrollView/desc_ja_JP.json | 27 + .../NestedScrollView/desc_ko_KR.json | 27 + .../NestedScrollView/desc_pt_PT.json | 27 + .../NestedScrollView/desc_ru_RU.json | 27 + .../OutlinedButton/desc_de_DE.json | 34 ++ .../OutlinedButton/desc_en_US.json | 34 ++ .../OutlinedButton/desc_es_ES.json | 34 ++ .../OutlinedButton/desc_fr_FR.json | 34 ++ .../OutlinedButton/desc_it_IT.json | 34 ++ .../OutlinedButton/desc_ja_JP.json | 34 ++ .../OutlinedButton/desc_ko_KR.json | 34 ++ .../OutlinedButton/desc_pt_PT.json | 34 ++ .../OutlinedButton/desc_ru_RU.json | 34 ++ .../StatefulWidget/Overlay/desc_de_DE.json | 21 + .../StatefulWidget/Overlay/desc_en_US.json | 21 + .../StatefulWidget/Overlay/desc_es_ES.json | 21 + .../StatefulWidget/Overlay/desc_fr_FR.json | 21 + .../StatefulWidget/Overlay/desc_it_IT.json | 21 + .../StatefulWidget/Overlay/desc_ja_JP.json | 21 + .../StatefulWidget/Overlay/desc_ko_KR.json | 21 + .../StatefulWidget/Overlay/desc_pt_PT.json | 21 + .../StatefulWidget/Overlay/desc_ru_RU.json | 21 + .../StatefulWidget/PageView/desc_de_DE.json | 34 ++ .../StatefulWidget/PageView/desc_en_US.json | 34 ++ .../StatefulWidget/PageView/desc_es_ES.json | 34 ++ .../StatefulWidget/PageView/desc_fr_FR.json | 34 ++ .../StatefulWidget/PageView/desc_it_IT.json | 34 ++ .../StatefulWidget/PageView/desc_ja_JP.json | 34 ++ .../StatefulWidget/PageView/desc_ko_KR.json | 34 ++ .../StatefulWidget/PageView/desc_pt_PT.json | 34 ++ .../StatefulWidget/PageView/desc_ru_RU.json | 34 ++ .../PaginatedDataTable/desc_de_DE.json | 30 + .../PaginatedDataTable/desc_en_US.json | 30 + .../PaginatedDataTable/desc_es_ES.json | 30 + .../PaginatedDataTable/desc_fr_FR.json | 30 + .../PaginatedDataTable/desc_it_IT.json | 30 + .../PaginatedDataTable/desc_ja_JP.json | 30 + .../PaginatedDataTable/desc_ko_KR.json | 30 + .../PaginatedDataTable/desc_pt_PT.json | 30 + .../PaginatedDataTable/desc_ru_RU.json | 30 + .../PopupMenuButton/desc_de_DE.json | 24 + .../PopupMenuButton/desc_en_US.json | 24 + .../PopupMenuButton/desc_es_ES.json | 24 + .../PopupMenuButton/desc_fr_FR.json | 24 + .../PopupMenuButton/desc_it_IT.json | 24 + .../PopupMenuButton/desc_ja_JP.json | 24 + .../PopupMenuButton/desc_ko_KR.json | 24 + .../PopupMenuButton/desc_pt_PT.json | 24 + .../PopupMenuButton/desc_ru_RU.json | 24 + .../PopupMenuDivider/desc_de_DE.json | 21 + .../PopupMenuDivider/desc_en_US.json | 21 + .../PopupMenuDivider/desc_es_ES.json | 21 + .../PopupMenuDivider/desc_fr_FR.json | 21 + .../PopupMenuDivider/desc_it_IT.json | 21 + .../PopupMenuDivider/desc_ja_JP.json | 21 + .../PopupMenuDivider/desc_ko_KR.json | 21 + .../PopupMenuDivider/desc_pt_PT.json | 21 + .../PopupMenuDivider/desc_ru_RU.json | 21 + .../PositionedTransition/desc_de_DE.json | 20 + .../PositionedTransition/desc_en_US.json | 20 + .../PositionedTransition/desc_es_ES.json | 20 + .../PositionedTransition/desc_fr_FR.json | 20 + .../PositionedTransition/desc_it_IT.json | 20 + .../PositionedTransition/desc_ja_JP.json | 20 + .../PositionedTransition/desc_ko_KR.json | 20 + .../PositionedTransition/desc_pt_PT.json | 20 + .../PositionedTransition/desc_ru_RU.json | 20 + .../lib/StatefulWidget/Radio/desc_de_DE.json | 21 + .../lib/StatefulWidget/Radio/desc_en_US.json | 21 + .../lib/StatefulWidget/Radio/desc_es_ES.json | 21 + .../lib/StatefulWidget/Radio/desc_fr_FR.json | 21 + .../lib/StatefulWidget/Radio/desc_it_IT.json | 21 + .../lib/StatefulWidget/Radio/desc_ja_JP.json | 21 + .../lib/StatefulWidget/Radio/desc_ko_KR.json | 21 + .../lib/StatefulWidget/Radio/desc_pt_PT.json | 21 + .../lib/StatefulWidget/Radio/desc_ru_RU.json | 21 + .../RangeSlider/desc_de_DE.json | 27 + .../RangeSlider/desc_en_US.json | 27 + .../RangeSlider/desc_es_ES.json | 27 + .../RangeSlider/desc_fr_FR.json | 27 + .../RangeSlider/desc_it_IT.json | 27 + .../RangeSlider/desc_ja_JP.json | 27 + .../RangeSlider/desc_ko_KR.json | 27 + .../RangeSlider/desc_pt_PT.json | 27 + .../RangeSlider/desc_ru_RU.json | 27 + .../StatefulWidget/RawChip/desc_de_DE.json | 43 ++ .../StatefulWidget/RawChip/desc_en_US.json | 43 ++ .../StatefulWidget/RawChip/desc_es_ES.json | 43 ++ .../StatefulWidget/RawChip/desc_fr_FR.json | 43 ++ .../StatefulWidget/RawChip/desc_it_IT.json | 43 ++ .../StatefulWidget/RawChip/desc_ja_JP.json | 43 ++ .../StatefulWidget/RawChip/desc_ko_KR.json | 43 ++ .../StatefulWidget/RawChip/desc_pt_PT.json | 43 ++ .../StatefulWidget/RawChip/desc_ru_RU.json | 43 ++ .../RawGestureDetector/desc_de_DE.json | 20 + .../RawGestureDetector/desc_en_US.json | 20 + .../RawGestureDetector/desc_es_ES.json | 20 + .../RawGestureDetector/desc_fr_FR.json | 20 + .../RawGestureDetector/desc_it_IT.json | 20 + .../RawGestureDetector/desc_ja_JP.json | 20 + .../RawGestureDetector/desc_ko_KR.json | 20 + .../RawGestureDetector/desc_pt_PT.json | 20 + .../RawGestureDetector/desc_ru_RU.json | 20 + .../RawKeyboardListener/desc_de_DE.json | 21 + .../RawKeyboardListener/desc_en_US.json | 21 + .../RawKeyboardListener/desc_es_ES.json | 21 + .../RawKeyboardListener/desc_fr_FR.json | 21 + .../RawKeyboardListener/desc_it_IT.json | 21 + .../RawKeyboardListener/desc_ja_JP.json | 21 + .../RawKeyboardListener/desc_ko_KR.json | 21 + .../RawKeyboardListener/desc_pt_PT.json | 21 + .../RawKeyboardListener/desc_ru_RU.json | 21 + .../RawMaterialButton/desc_de_DE.json | 37 ++ .../RawMaterialButton/desc_en_US.json | 37 ++ .../RawMaterialButton/desc_es_ES.json | 37 ++ .../RawMaterialButton/desc_fr_FR.json | 37 ++ .../RawMaterialButton/desc_it_IT.json | 37 ++ .../RawMaterialButton/desc_ja_JP.json | 37 ++ .../RawMaterialButton/desc_ko_KR.json | 37 ++ .../RawMaterialButton/desc_pt_PT.json | 37 ++ .../RawMaterialButton/desc_ru_RU.json | 37 ++ .../RefreshIndicator/desc_de_DE.json | 20 + .../RefreshIndicator/desc_en_US.json | 20 + .../RefreshIndicator/desc_es_ES.json | 20 + .../RefreshIndicator/desc_fr_FR.json | 20 + .../RefreshIndicator/desc_it_IT.json | 20 + .../RefreshIndicator/desc_ja_JP.json | 20 + .../RefreshIndicator/desc_ko_KR.json | 20 + .../RefreshIndicator/desc_pt_PT.json | 20 + .../RefreshIndicator/desc_ru_RU.json | 20 + .../desc_de_DE.json | 21 + .../desc_en_US.json | 21 + .../desc_es_ES.json | 21 + .../desc_fr_FR.json | 21 + .../desc_it_IT.json | 21 + .../desc_ja_JP.json | 21 + .../desc_ko_KR.json | 21 + .../desc_pt_PT.json | 21 + .../desc_ru_RU.json | 21 + .../ReorderableListView/desc_de_DE.json | 29 + .../ReorderableListView/desc_en_US.json | 29 + .../ReorderableListView/desc_es_ES.json | 29 + .../ReorderableListView/desc_fr_FR.json | 29 + .../ReorderableListView/desc_it_IT.json | 29 + .../ReorderableListView/desc_ja_JP.json | 29 + .../ReorderableListView/desc_ko_KR.json | 29 + .../ReorderableListView/desc_pt_PT.json | 29 + .../ReorderableListView/desc_ru_RU.json | 29 + .../RotationTransition/desc_de_DE.json | 19 + .../RotationTransition/desc_en_US.json | 19 + .../RotationTransition/desc_es_ES.json | 19 + .../RotationTransition/desc_fr_FR.json | 19 + .../RotationTransition/desc_it_IT.json | 19 + .../RotationTransition/desc_ja_JP.json | 19 + .../RotationTransition/desc_ko_KR.json | 19 + .../RotationTransition/desc_pt_PT.json | 19 + .../RotationTransition/desc_ru_RU.json | 19 + .../StatefulWidget/Scaffold/desc_de_DE.json | 29 + .../StatefulWidget/Scaffold/desc_en_US.json | 29 + .../StatefulWidget/Scaffold/desc_es_ES.json | 29 + .../StatefulWidget/Scaffold/desc_fr_FR.json | 29 + .../StatefulWidget/Scaffold/desc_it_IT.json | 29 + .../StatefulWidget/Scaffold/desc_ja_JP.json | 29 + .../StatefulWidget/Scaffold/desc_ko_KR.json | 29 + .../StatefulWidget/Scaffold/desc_pt_PT.json | 29 + .../StatefulWidget/Scaffold/desc_ru_RU.json | 29 + .../ScaleTransition/desc_de_DE.json | 19 + .../ScaleTransition/desc_en_US.json | 19 + .../ScaleTransition/desc_es_ES.json | 19 + .../ScaleTransition/desc_fr_FR.json | 19 + .../ScaleTransition/desc_it_IT.json | 19 + .../ScaleTransition/desc_ja_JP.json | 19 + .../ScaleTransition/desc_ko_KR.json | 19 + .../ScaleTransition/desc_pt_PT.json | 19 + .../ScaleTransition/desc_ru_RU.json | 19 + .../StatefulWidget/Scrollable/desc_de_DE.json | 25 + .../StatefulWidget/Scrollable/desc_en_US.json | 25 + .../StatefulWidget/Scrollable/desc_es_ES.json | 25 + .../StatefulWidget/Scrollable/desc_fr_FR.json | 25 + .../StatefulWidget/Scrollable/desc_it_IT.json | 25 + .../StatefulWidget/Scrollable/desc_ja_JP.json | 25 + .../StatefulWidget/Scrollable/desc_ko_KR.json | 25 + .../StatefulWidget/Scrollable/desc_pt_PT.json | 25 + .../StatefulWidget/Scrollable/desc_ru_RU.json | 25 + .../StatefulWidget/Scrollbar/desc_de_DE.json | 23 + .../StatefulWidget/Scrollbar/desc_en_US.json | 23 + .../StatefulWidget/Scrollbar/desc_es_ES.json | 23 + .../StatefulWidget/Scrollbar/desc_fr_FR.json | 23 + .../StatefulWidget/Scrollbar/desc_it_IT.json | 23 + .../StatefulWidget/Scrollbar/desc_ja_JP.json | 23 + .../StatefulWidget/Scrollbar/desc_ko_KR.json | 23 + .../StatefulWidget/Scrollbar/desc_pt_PT.json | 23 + .../StatefulWidget/Scrollbar/desc_ru_RU.json | 23 + .../SelectableText/desc_de_DE.json | 32 + .../SelectableText/desc_en_US.json | 32 + .../SelectableText/desc_es_ES.json | 32 + .../SelectableText/desc_fr_FR.json | 32 + .../SelectableText/desc_it_IT.json | 32 + .../SelectableText/desc_ja_JP.json | 32 + .../SelectableText/desc_ko_KR.json | 32 + .../SelectableText/desc_pt_PT.json | 32 + .../SelectableText/desc_ru_RU.json | 32 + .../SizeTransition/desc_de_DE.json | 20 + .../SizeTransition/desc_en_US.json | 20 + .../SizeTransition/desc_es_ES.json | 20 + .../SizeTransition/desc_fr_FR.json | 20 + .../SizeTransition/desc_it_IT.json | 20 + .../SizeTransition/desc_ja_JP.json | 20 + .../SizeTransition/desc_ko_KR.json | 20 + .../SizeTransition/desc_pt_PT.json | 20 + .../SizeTransition/desc_ru_RU.json | 20 + .../SlideTransition/desc_de_DE.json | 20 + .../SlideTransition/desc_en_US.json | 20 + .../SlideTransition/desc_es_ES.json | 20 + .../SlideTransition/desc_fr_FR.json | 20 + .../SlideTransition/desc_it_IT.json | 20 + .../SlideTransition/desc_ja_JP.json | 20 + .../SlideTransition/desc_ko_KR.json | 20 + .../SlideTransition/desc_pt_PT.json | 20 + .../SlideTransition/desc_ru_RU.json | 20 + .../lib/StatefulWidget/Slider/desc_de_DE.json | 37 ++ .../lib/StatefulWidget/Slider/desc_en_US.json | 37 ++ .../lib/StatefulWidget/Slider/desc_es_ES.json | 37 ++ .../lib/StatefulWidget/Slider/desc_fr_FR.json | 37 ++ .../lib/StatefulWidget/Slider/desc_it_IT.json | 37 ++ .../lib/StatefulWidget/Slider/desc_ja_JP.json | 37 ++ .../lib/StatefulWidget/Slider/desc_ko_KR.json | 37 ++ .../lib/StatefulWidget/Slider/desc_pt_PT.json | 37 ++ .../lib/StatefulWidget/Slider/desc_ru_RU.json | 37 ++ .../StatefulBuilder/desc_de_DE.json | 23 + .../StatefulBuilder/desc_en_US.json | 23 + .../StatefulBuilder/desc_es_ES.json | 23 + .../StatefulBuilder/desc_fr_FR.json | 23 + .../StatefulBuilder/desc_it_IT.json | 23 + .../StatefulBuilder/desc_ja_JP.json | 23 + .../StatefulBuilder/desc_ko_KR.json | 23 + .../StatefulBuilder/desc_pt_PT.json | 23 + .../StatefulBuilder/desc_ru_RU.json | 23 + .../StatusTransitionWidget/desc_de_DE.json | 19 + .../StatusTransitionWidget/desc_en_US.json | 19 + .../StatusTransitionWidget/desc_es_ES.json | 19 + .../StatusTransitionWidget/desc_fr_FR.json | 19 + .../StatusTransitionWidget/desc_it_IT.json | 19 + .../StatusTransitionWidget/desc_ja_JP.json | 19 + .../StatusTransitionWidget/desc_ko_KR.json | 19 + .../StatusTransitionWidget/desc_pt_PT.json | 19 + .../StatusTransitionWidget/desc_ru_RU.json | 19 + .../StatefulWidget/Stepper/desc_de_DE.json | 29 + .../StatefulWidget/Stepper/desc_en_US.json | 29 + .../StatefulWidget/Stepper/desc_es_ES.json | 29 + .../StatefulWidget/Stepper/desc_fr_FR.json | 29 + .../StatefulWidget/Stepper/desc_it_IT.json | 29 + .../StatefulWidget/Stepper/desc_ja_JP.json | 29 + .../StatefulWidget/Stepper/desc_ko_KR.json | 29 + .../StatefulWidget/Stepper/desc_pt_PT.json | 29 + .../StatefulWidget/Stepper/desc_ru_RU.json | 29 + .../StreamBuilder/desc_de_DE.json | 20 + .../StreamBuilder/desc_en_US.json | 20 + .../StreamBuilder/desc_es_ES.json | 20 + .../StreamBuilder/desc_fr_FR.json | 20 + .../StreamBuilder/desc_it_IT.json | 20 + .../StreamBuilder/desc_ja_JP.json | 20 + .../StreamBuilder/desc_ko_KR.json | 20 + .../StreamBuilder/desc_pt_PT.json | 20 + .../StreamBuilder/desc_ru_RU.json | 20 + .../lib/StatefulWidget/Switch/desc_de_DE.json | 34 ++ .../lib/StatefulWidget/Switch/desc_en_US.json | 34 ++ .../lib/StatefulWidget/Switch/desc_es_ES.json | 34 ++ .../lib/StatefulWidget/Switch/desc_fr_FR.json | 34 ++ .../lib/StatefulWidget/Switch/desc_it_IT.json | 34 ++ .../lib/StatefulWidget/Switch/desc_ja_JP.json | 34 ++ .../lib/StatefulWidget/Switch/desc_ko_KR.json | 34 ++ .../lib/StatefulWidget/Switch/desc_pt_PT.json | 34 ++ .../lib/StatefulWidget/Switch/desc_ru_RU.json | 34 ++ .../StatefulWidget/TabBarView/desc_de_DE.json | 20 + .../StatefulWidget/TabBarView/desc_en_US.json | 20 + .../StatefulWidget/TabBarView/desc_es_ES.json | 20 + .../StatefulWidget/TabBarView/desc_fr_FR.json | 20 + .../StatefulWidget/TabBarView/desc_it_IT.json | 20 + .../StatefulWidget/TabBarView/desc_ja_JP.json | 20 + .../StatefulWidget/TabBarView/desc_ko_KR.json | 20 + .../StatefulWidget/TabBarView/desc_pt_PT.json | 20 + .../StatefulWidget/TabBarView/desc_ru_RU.json | 20 + .../TableRowInkWell/desc_de_DE.json | 22 + .../TableRowInkWell/desc_en_US.json | 22 + .../TableRowInkWell/desc_es_ES.json | 22 + .../TableRowInkWell/desc_fr_FR.json | 22 + .../TableRowInkWell/desc_it_IT.json | 22 + .../TableRowInkWell/desc_ja_JP.json | 22 + .../TableRowInkWell/desc_ko_KR.json | 22 + .../TableRowInkWell/desc_pt_PT.json | 22 + .../TableRowInkWell/desc_ru_RU.json | 22 + .../StatefulWidget/TextButton/desc_de_DE.json | 33 ++ .../StatefulWidget/TextButton/desc_en_US.json | 33 ++ .../StatefulWidget/TextButton/desc_es_ES.json | 33 ++ .../StatefulWidget/TextButton/desc_fr_FR.json | 33 ++ .../StatefulWidget/TextButton/desc_it_IT.json | 33 ++ .../StatefulWidget/TextButton/desc_ja_JP.json | 33 ++ .../StatefulWidget/TextButton/desc_ko_KR.json | 33 ++ .../StatefulWidget/TextButton/desc_pt_PT.json | 33 ++ .../StatefulWidget/TextButton/desc_ru_RU.json | 33 ++ .../StatefulWidget/TextField/desc_de_DE.json | 52 ++ .../StatefulWidget/TextField/desc_en_US.json | 52 ++ .../StatefulWidget/TextField/desc_es_ES.json | 52 ++ .../StatefulWidget/TextField/desc_fr_FR.json | 52 ++ .../StatefulWidget/TextField/desc_it_IT.json | 52 ++ .../StatefulWidget/TextField/desc_ja_JP.json | 52 ++ .../StatefulWidget/TextField/desc_ko_KR.json | 52 ++ .../StatefulWidget/TextField/desc_pt_PT.json | 52 ++ .../StatefulWidget/TextField/desc_ru_RU.json | 52 ++ .../TextFormField/desc_de_DE.json | 24 + .../TextFormField/desc_en_US.json | 24 + .../TextFormField/desc_es_ES.json | 24 + .../TextFormField/desc_fr_FR.json | 24 + .../TextFormField/desc_it_IT.json | 24 + .../TextFormField/desc_ja_JP.json | 24 + .../TextFormField/desc_ko_KR.json | 24 + .../TextFormField/desc_pt_PT.json | 24 + .../TextFormField/desc_ru_RU.json | 24 + .../StatefulWidget/TickerMode/desc_de_DE.json | 20 + .../StatefulWidget/TickerMode/desc_en_US.json | 20 + .../StatefulWidget/TickerMode/desc_es_ES.json | 20 + .../StatefulWidget/TickerMode/desc_fr_FR.json | 20 + .../StatefulWidget/TickerMode/desc_it_IT.json | 20 + .../StatefulWidget/TickerMode/desc_ja_JP.json | 20 + .../StatefulWidget/TickerMode/desc_ko_KR.json | 20 + .../StatefulWidget/TickerMode/desc_pt_PT.json | 20 + .../StatefulWidget/TickerMode/desc_ru_RU.json | 20 + .../StatefulWidget/Tooltip/desc_de_DE.json | 32 + .../StatefulWidget/Tooltip/desc_en_US.json | 32 + .../StatefulWidget/Tooltip/desc_es_ES.json | 32 + .../StatefulWidget/Tooltip/desc_fr_FR.json | 32 + .../StatefulWidget/Tooltip/desc_it_IT.json | 32 + .../StatefulWidget/Tooltip/desc_ja_JP.json | 32 + .../StatefulWidget/Tooltip/desc_ko_KR.json | 32 + .../StatefulWidget/Tooltip/desc_pt_PT.json | 32 + .../StatefulWidget/Tooltip/desc_ru_RU.json | 32 + .../TweenAnimationBuilder/desc_de_DE.json | 23 + .../TweenAnimationBuilder/desc_en_US.json | 23 + .../TweenAnimationBuilder/desc_es_ES.json | 23 + .../TweenAnimationBuilder/desc_fr_FR.json | 23 + .../TweenAnimationBuilder/desc_it_IT.json | 23 + .../TweenAnimationBuilder/desc_ja_JP.json | 23 + .../TweenAnimationBuilder/desc_ko_KR.json | 23 + .../TweenAnimationBuilder/desc_pt_PT.json | 23 + .../TweenAnimationBuilder/desc_ru_RU.json | 23 + .../UndoHistory/desc_de_DE.json | 20 + .../UndoHistory/desc_en_US.json | 20 + .../UndoHistory/desc_es_ES.json | 20 + .../UndoHistory/desc_fr_FR.json | 20 + .../UndoHistory/desc_it_IT.json | 20 + .../UndoHistory/desc_ja_JP.json | 20 + .../UndoHistory/desc_ko_KR.json | 20 + .../UndoHistory/desc_pt_PT.json | 20 + .../UndoHistory/desc_ru_RU.json | 20 + .../UniqueWidget/desc_de_DE.json | 18 + .../UniqueWidget/desc_en_US.json | 18 + .../UniqueWidget/desc_es_ES.json | 18 + .../UniqueWidget/desc_fr_FR.json | 18 + .../UniqueWidget/desc_it_IT.json | 18 + .../UniqueWidget/desc_ja_JP.json | 18 + .../UniqueWidget/desc_ko_KR.json | 18 + .../UniqueWidget/desc_pt_PT.json | 18 + .../UniqueWidget/desc_ru_RU.json | 18 + .../ValueListenableBuilder/desc_de_DE.json | 20 + .../ValueListenableBuilder/desc_en_US.json | 20 + .../ValueListenableBuilder/desc_es_ES.json | 20 + .../ValueListenableBuilder/desc_fr_FR.json | 20 + .../ValueListenableBuilder/desc_it_IT.json | 20 + .../ValueListenableBuilder/desc_ja_JP.json | 20 + .../ValueListenableBuilder/desc_ko_KR.json | 20 + .../ValueListenableBuilder/desc_pt_PT.json | 20 + .../ValueListenableBuilder/desc_ru_RU.json | 20 + .../WidgetInspector/desc_de_DE.json | 19 + .../WidgetInspector/desc_en_US.json | 19 + .../WidgetInspector/desc_es_ES.json | 19 + .../WidgetInspector/desc_fr_FR.json | 19 + .../WidgetInspector/desc_it_IT.json | 19 + .../WidgetInspector/desc_ja_JP.json | 19 + .../WidgetInspector/desc_ko_KR.json | 19 + .../WidgetInspector/desc_pt_PT.json | 19 + .../WidgetInspector/desc_ru_RU.json | 19 + .../StatefulWidget/WidgetsApp/desc_de_DE.json | 24 + .../StatefulWidget/WidgetsApp/desc_en_US.json | 24 + .../StatefulWidget/WidgetsApp/desc_es_ES.json | 24 + .../StatefulWidget/WidgetsApp/desc_fr_FR.json | 24 + .../StatefulWidget/WidgetsApp/desc_it_IT.json | 24 + .../StatefulWidget/WidgetsApp/desc_ja_JP.json | 24 + .../StatefulWidget/WidgetsApp/desc_ko_KR.json | 24 + .../StatefulWidget/WidgetsApp/desc_pt_PT.json | 24 + .../StatefulWidget/WidgetsApp/desc_ru_RU.json | 24 + .../WillPopScope/desc_de_DE.json | 19 + .../WillPopScope/desc_en_US.json | 19 + .../WillPopScope/desc_es_ES.json | 19 + .../WillPopScope/desc_fr_FR.json | 19 + .../WillPopScope/desc_it_IT.json | 19 + .../WillPopScope/desc_ja_JP.json | 19 + .../WillPopScope/desc_ko_KR.json | 19 + .../WillPopScope/desc_pt_PT.json | 19 + .../WillPopScope/desc_ru_RU.json | 19 + .../StatefulWidget/YearPicker/desc_de_DE.json | 24 + .../StatefulWidget/YearPicker/desc_en_US.json | 24 + .../StatefulWidget/YearPicker/desc_es_ES.json | 24 + .../StatefulWidget/YearPicker/desc_fr_FR.json | 24 + .../StatefulWidget/YearPicker/desc_it_IT.json | 24 + .../StatefulWidget/YearPicker/desc_ja_JP.json | 24 + .../StatefulWidget/YearPicker/desc_ko_KR.json | 24 + .../StatefulWidget/YearPicker/desc_pt_PT.json | 24 + .../StatefulWidget/YearPicker/desc_ru_RU.json | 24 + .../AboutDialog/desc_de_DE.json | 22 + .../AboutDialog/desc_en_US.json | 22 + .../AboutDialog/desc_es_ES.json | 22 + .../AboutDialog/desc_fr_FR.json | 22 + .../AboutDialog/desc_it_IT.json | 22 + .../AboutDialog/desc_ja_JP.json | 22 + .../AboutDialog/desc_ko_KR.json | 22 + .../AboutDialog/desc_pt_PT.json | 22 + .../AboutDialog/desc_ru_RU.json | 22 + .../AboutListTile/desc_de_DE.json | 26 + .../AboutListTile/desc_en_US.json | 26 + .../AboutListTile/desc_es_ES.json | 26 + .../AboutListTile/desc_fr_FR.json | 26 + .../AboutListTile/desc_it_IT.json | 26 + .../AboutListTile/desc_ja_JP.json | 26 + .../AboutListTile/desc_ko_KR.json | 26 + .../AboutListTile/desc_pt_PT.json | 26 + .../AboutListTile/desc_ru_RU.json | 26 + .../ActionChip/desc_de_DE.json | 26 + .../ActionChip/desc_en_US.json | 26 + .../ActionChip/desc_es_ES.json | 26 + .../ActionChip/desc_fr_FR.json | 26 + .../ActionChip/desc_it_IT.json | 26 + .../ActionChip/desc_ja_JP.json | 26 + .../ActionChip/desc_ko_KR.json | 26 + .../ActionChip/desc_pt_PT.json | 26 + .../ActionChip/desc_ru_RU.json | 26 + .../AlertDialog/desc_de_DE.json | 27 + .../AlertDialog/desc_en_US.json | 27 + .../AlertDialog/desc_es_ES.json | 27 + .../AlertDialog/desc_fr_FR.json | 27 + .../AlertDialog/desc_it_IT.json | 27 + .../AlertDialog/desc_ja_JP.json | 27 + .../AlertDialog/desc_ko_KR.json | 27 + .../AlertDialog/desc_pt_PT.json | 27 + .../AlertDialog/desc_ru_RU.json | 27 + .../AnimatedIcon/desc_de_DE.json | 21 + .../AnimatedIcon/desc_en_US.json | 21 + .../AnimatedIcon/desc_es_ES.json | 21 + .../AnimatedIcon/desc_fr_FR.json | 21 + .../AnimatedIcon/desc_it_IT.json | 21 + .../AnimatedIcon/desc_ja_JP.json | 21 + .../AnimatedIcon/desc_ko_KR.json | 21 + .../AnimatedIcon/desc_pt_PT.json | 21 + .../AnimatedIcon/desc_ru_RU.json | 21 + .../Autocomplete/desc_de_DE.json | 31 + .../Autocomplete/desc_en_US.json | 31 + .../Autocomplete/desc_es_ES.json | 31 + .../Autocomplete/desc_fr_FR.json | 31 + .../Autocomplete/desc_it_IT.json | 31 + .../Autocomplete/desc_ja_JP.json | 31 + .../Autocomplete/desc_ko_KR.json | 31 + .../Autocomplete/desc_pt_PT.json | 31 + .../Autocomplete/desc_ru_RU.json | 31 + .../BackButton/desc_de_DE.json | 21 + .../BackButton/desc_en_US.json | 21 + .../BackButton/desc_es_ES.json | 21 + .../BackButton/desc_fr_FR.json | 21 + .../BackButton/desc_it_IT.json | 21 + .../BackButton/desc_ja_JP.json | 21 + .../BackButton/desc_ko_KR.json | 21 + .../BackButton/desc_pt_PT.json | 21 + .../BackButton/desc_ru_RU.json | 21 + .../BackButtonIcon/desc_de_DE.json | 18 + .../BackButtonIcon/desc_en_US.json | 18 + .../BackButtonIcon/desc_es_ES.json | 18 + .../BackButtonIcon/desc_fr_FR.json | 18 + .../BackButtonIcon/desc_it_IT.json | 18 + .../BackButtonIcon/desc_ja_JP.json | 18 + .../BackButtonIcon/desc_ko_KR.json | 18 + .../BackButtonIcon/desc_pt_PT.json | 18 + .../BackButtonIcon/desc_ru_RU.json | 18 + .../lib/StatelessWidget/Badge/desc_de_DE.json | 40 ++ .../lib/StatelessWidget/Badge/desc_en_US.json | 40 ++ .../lib/StatelessWidget/Badge/desc_es_ES.json | 40 ++ .../lib/StatelessWidget/Badge/desc_fr_FR.json | 40 ++ .../lib/StatelessWidget/Badge/desc_it_IT.json | 40 ++ .../lib/StatelessWidget/Badge/desc_ja_JP.json | 40 ++ .../lib/StatelessWidget/Badge/desc_ko_KR.json | 40 ++ .../lib/StatelessWidget/Badge/desc_pt_PT.json | 40 ++ .../lib/StatelessWidget/Badge/desc_ru_RU.json | 40 ++ .../StatelessWidget/Banner/desc_de_DE.json | 22 + .../StatelessWidget/Banner/desc_en_US.json | 22 + .../StatelessWidget/Banner/desc_es_ES.json | 22 + .../StatelessWidget/Banner/desc_fr_FR.json | 22 + .../StatelessWidget/Banner/desc_it_IT.json | 22 + .../StatelessWidget/Banner/desc_ja_JP.json | 22 + .../StatelessWidget/Banner/desc_ko_KR.json | 22 + .../StatelessWidget/Banner/desc_pt_PT.json | 22 + .../StatelessWidget/Banner/desc_ru_RU.json | 22 + .../BottomSheet/desc_de_DE.json | 22 + .../BottomSheet/desc_en_US.json | 22 + .../BottomSheet/desc_es_ES.json | 22 + .../BottomSheet/desc_fr_FR.json | 22 + .../BottomSheet/desc_it_IT.json | 22 + .../BottomSheet/desc_ja_JP.json | 22 + .../BottomSheet/desc_ko_KR.json | 22 + .../BottomSheet/desc_pt_PT.json | 22 + .../BottomSheet/desc_ru_RU.json | 22 + .../BoxScrollView/desc_de_DE.json | 27 + .../BoxScrollView/desc_en_US.json | 27 + .../BoxScrollView/desc_es_ES.json | 27 + .../BoxScrollView/desc_fr_FR.json | 27 + .../BoxScrollView/desc_it_IT.json | 27 + .../BoxScrollView/desc_ja_JP.json | 27 + .../BoxScrollView/desc_ko_KR.json | 27 + .../BoxScrollView/desc_pt_PT.json | 27 + .../BoxScrollView/desc_ru_RU.json | 27 + .../StatelessWidget/Builder/desc_de_DE.json | 19 + .../StatelessWidget/Builder/desc_en_US.json | 19 + .../StatelessWidget/Builder/desc_es_ES.json | 19 + .../StatelessWidget/Builder/desc_fr_FR.json | 19 + .../StatelessWidget/Builder/desc_it_IT.json | 19 + .../StatelessWidget/Builder/desc_ja_JP.json | 19 + .../StatelessWidget/Builder/desc_ko_KR.json | 19 + .../StatelessWidget/Builder/desc_pt_PT.json | 19 + .../StatelessWidget/Builder/desc_ru_RU.json | 19 + .../StatelessWidget/ButtonBar/desc_de_DE.json | 27 + .../StatelessWidget/ButtonBar/desc_en_US.json | 27 + .../StatelessWidget/ButtonBar/desc_es_ES.json | 27 + .../StatelessWidget/ButtonBar/desc_fr_FR.json | 27 + .../StatelessWidget/ButtonBar/desc_it_IT.json | 27 + .../StatelessWidget/ButtonBar/desc_ja_JP.json | 27 + .../StatelessWidget/ButtonBar/desc_ko_KR.json | 27 + .../StatelessWidget/ButtonBar/desc_pt_PT.json | 27 + .../StatelessWidget/ButtonBar/desc_ru_RU.json | 27 + .../lib/StatelessWidget/Card/desc_de_DE.json | 31 + .../lib/StatelessWidget/Card/desc_en_US.json | 31 + .../lib/StatelessWidget/Card/desc_es_ES.json | 31 + .../lib/StatelessWidget/Card/desc_fr_FR.json | 31 + .../lib/StatelessWidget/Card/desc_it_IT.json | 31 + .../lib/StatelessWidget/Card/desc_ja_JP.json | 31 + .../lib/StatelessWidget/Card/desc_ko_KR.json | 31 + .../lib/StatelessWidget/Card/desc_pt_PT.json | 31 + .../lib/StatelessWidget/Card/desc_ru_RU.json | 31 + .../CheckboxListTile/desc_de_DE.json | 37 ++ .../CheckboxListTile/desc_en_US.json | 37 ++ .../CheckboxListTile/desc_es_ES.json | 37 ++ .../CheckboxListTile/desc_fr_FR.json | 37 ++ .../CheckboxListTile/desc_it_IT.json | 37 ++ .../CheckboxListTile/desc_ja_JP.json | 37 ++ .../CheckboxListTile/desc_ko_KR.json | 37 ++ .../CheckboxListTile/desc_pt_PT.json | 37 ++ .../CheckboxListTile/desc_ru_RU.json | 37 ++ .../CheckedModeBanner/desc_de_DE.json | 18 + .../CheckedModeBanner/desc_en_US.json | 18 + .../CheckedModeBanner/desc_es_ES.json | 18 + .../CheckedModeBanner/desc_fr_FR.json | 18 + .../CheckedModeBanner/desc_it_IT.json | 18 + .../CheckedModeBanner/desc_ja_JP.json | 18 + .../CheckedModeBanner/desc_ko_KR.json | 18 + .../CheckedModeBanner/desc_pt_PT.json | 18 + .../CheckedModeBanner/desc_ru_RU.json | 18 + .../lib/StatelessWidget/Chip/desc_de_DE.json | 45 ++ .../lib/StatelessWidget/Chip/desc_en_US.json | 45 ++ .../lib/StatelessWidget/Chip/desc_es_ES.json | 45 ++ .../lib/StatelessWidget/Chip/desc_fr_FR.json | 45 ++ .../lib/StatelessWidget/Chip/desc_it_IT.json | 45 ++ .../lib/StatelessWidget/Chip/desc_ja_JP.json | 45 ++ .../lib/StatelessWidget/Chip/desc_ko_KR.json | 45 ++ .../lib/StatelessWidget/Chip/desc_pt_PT.json | 45 ++ .../lib/StatelessWidget/Chip/desc_ru_RU.json | 45 ++ .../ChoiceChip/desc_de_DE.json | 27 + .../ChoiceChip/desc_en_US.json | 27 + .../ChoiceChip/desc_es_ES.json | 27 + .../ChoiceChip/desc_fr_FR.json | 27 + .../ChoiceChip/desc_it_IT.json | 27 + .../ChoiceChip/desc_ja_JP.json | 27 + .../ChoiceChip/desc_ko_KR.json | 27 + .../ChoiceChip/desc_pt_PT.json | 27 + .../ChoiceChip/desc_ru_RU.json | 27 + .../CircleAvatar/desc_de_DE.json | 24 + .../CircleAvatar/desc_en_US.json | 24 + .../CircleAvatar/desc_es_ES.json | 24 + .../CircleAvatar/desc_fr_FR.json | 24 + .../CircleAvatar/desc_it_IT.json | 24 + .../CircleAvatar/desc_ja_JP.json | 24 + .../CircleAvatar/desc_ko_KR.json | 24 + .../CircleAvatar/desc_pt_PT.json | 24 + .../CircleAvatar/desc_ru_RU.json | 24 + .../CloseButton/desc_de_DE.json | 21 + .../CloseButton/desc_en_US.json | 21 + .../CloseButton/desc_es_ES.json | 21 + .../CloseButton/desc_fr_FR.json | 21 + .../CloseButton/desc_it_IT.json | 21 + .../CloseButton/desc_ja_JP.json | 21 + .../CloseButton/desc_ko_KR.json | 21 + .../CloseButton/desc_pt_PT.json | 21 + .../CloseButton/desc_ru_RU.json | 21 + .../CloseButtonIcon/desc_de_DE.json | 18 + .../CloseButtonIcon/desc_en_US.json | 18 + .../CloseButtonIcon/desc_es_ES.json | 18 + .../CloseButtonIcon/desc_fr_FR.json | 18 + .../CloseButtonIcon/desc_it_IT.json | 18 + .../CloseButtonIcon/desc_ja_JP.json | 18 + .../CloseButtonIcon/desc_ko_KR.json | 18 + .../CloseButtonIcon/desc_pt_PT.json | 18 + .../CloseButtonIcon/desc_ru_RU.json | 18 + .../StatelessWidget/Container/desc_de_DE.json | 67 +++ .../StatelessWidget/Container/desc_en_US.json | 67 +++ .../StatelessWidget/Container/desc_es_ES.json | 67 +++ .../StatelessWidget/Container/desc_fr_FR.json | 67 +++ .../StatelessWidget/Container/desc_it_IT.json | 67 +++ .../StatelessWidget/Container/desc_ja_JP.json | 67 +++ .../StatelessWidget/Container/desc_ko_KR.json | 67 +++ .../StatelessWidget/Container/desc_pt_PT.json | 67 +++ .../StatelessWidget/Container/desc_ru_RU.json | 67 +++ .../CupertinoActionSheet/desc_de_DE.json | 21 + .../CupertinoActionSheet/desc_en_US.json | 21 + .../CupertinoActionSheet/desc_es_ES.json | 21 + .../CupertinoActionSheet/desc_fr_FR.json | 21 + .../CupertinoActionSheet/desc_it_IT.json | 21 + .../CupertinoActionSheet/desc_ja_JP.json | 21 + .../CupertinoActionSheet/desc_ko_KR.json | 21 + .../CupertinoActionSheet/desc_pt_PT.json | 21 + .../CupertinoActionSheet/desc_ru_RU.json | 21 + .../desc_de_DE.json | 20 + .../desc_en_US.json | 20 + .../desc_es_ES.json | 20 + .../desc_fr_FR.json | 20 + .../desc_it_IT.json | 20 + .../desc_ja_JP.json | 20 + .../desc_ko_KR.json | 20 + .../desc_pt_PT.json | 20 + .../desc_ru_RU.json | 20 + .../CupertinoAlertDialog/desc_de_DE.json | 20 + .../CupertinoAlertDialog/desc_en_US.json | 20 + .../CupertinoAlertDialog/desc_es_ES.json | 20 + .../CupertinoAlertDialog/desc_fr_FR.json | 20 + .../CupertinoAlertDialog/desc_it_IT.json | 20 + .../CupertinoAlertDialog/desc_ja_JP.json | 20 + .../CupertinoAlertDialog/desc_ko_KR.json | 20 + .../CupertinoAlertDialog/desc_pt_PT.json | 20 + .../CupertinoAlertDialog/desc_ru_RU.json | 20 + .../CupertinoDialogAction/desc_de_DE.json | 22 + .../CupertinoDialogAction/desc_en_US.json | 22 + .../CupertinoDialogAction/desc_es_ES.json | 22 + .../CupertinoDialogAction/desc_fr_FR.json | 22 + .../CupertinoDialogAction/desc_it_IT.json | 22 + .../CupertinoDialogAction/desc_ja_JP.json | 22 + .../CupertinoDialogAction/desc_ko_KR.json | 22 + .../CupertinoDialogAction/desc_pt_PT.json | 22 + .../CupertinoDialogAction/desc_ru_RU.json | 22 + .../desc_de_DE.json | 21 + .../desc_en_US.json | 21 + .../desc_es_ES.json | 21 + .../desc_fr_FR.json | 21 + .../desc_it_IT.json | 21 + .../desc_ja_JP.json | 21 + .../desc_ko_KR.json | 21 + .../desc_pt_PT.json | 21 + .../desc_ru_RU.json | 21 + .../desc_de_DE.json | 19 + .../desc_en_US.json | 19 + .../desc_es_ES.json | 19 + .../desc_fr_FR.json | 19 + .../desc_it_IT.json | 19 + .../desc_ja_JP.json | 19 + .../desc_ko_KR.json | 19 + .../desc_pt_PT.json | 19 + .../desc_ru_RU.json | 19 + .../CupertinoPageTransition/desc_de_DE.json | 21 + .../CupertinoPageTransition/desc_en_US.json | 21 + .../CupertinoPageTransition/desc_es_ES.json | 21 + .../CupertinoPageTransition/desc_fr_FR.json | 21 + .../CupertinoPageTransition/desc_it_IT.json | 21 + .../CupertinoPageTransition/desc_ja_JP.json | 21 + .../CupertinoPageTransition/desc_ko_KR.json | 21 + .../CupertinoPageTransition/desc_pt_PT.json | 21 + .../CupertinoPageTransition/desc_ru_RU.json | 21 + .../CupertinoPopupSurface/desc_de_DE.json | 20 + .../CupertinoPopupSurface/desc_en_US.json | 20 + .../CupertinoPopupSurface/desc_es_ES.json | 20 + .../CupertinoPopupSurface/desc_fr_FR.json | 20 + .../CupertinoPopupSurface/desc_it_IT.json | 20 + .../CupertinoPopupSurface/desc_ja_JP.json | 20 + .../CupertinoPopupSurface/desc_ko_KR.json | 20 + .../CupertinoPopupSurface/desc_pt_PT.json | 20 + .../CupertinoPopupSurface/desc_ru_RU.json | 20 + .../CupertinoTheme/desc_de_DE.json | 28 + .../CupertinoTheme/desc_en_US.json | 28 + .../CupertinoTheme/desc_es_ES.json | 28 + .../CupertinoTheme/desc_fr_FR.json | 28 + .../CupertinoTheme/desc_it_IT.json | 28 + .../CupertinoTheme/desc_ja_JP.json | 28 + .../CupertinoTheme/desc_ko_KR.json | 28 + .../CupertinoTheme/desc_pt_PT.json | 28 + .../CupertinoTheme/desc_ru_RU.json | 28 + .../StatelessWidget/DataTable/desc_de_DE.json | 28 + .../StatelessWidget/DataTable/desc_en_US.json | 28 + .../StatelessWidget/DataTable/desc_es_ES.json | 28 + .../StatelessWidget/DataTable/desc_fr_FR.json | 28 + .../StatelessWidget/DataTable/desc_it_IT.json | 28 + .../StatelessWidget/DataTable/desc_ja_JP.json | 28 + .../StatelessWidget/DataTable/desc_ko_KR.json | 28 + .../StatelessWidget/DataTable/desc_pt_PT.json | 28 + .../StatelessWidget/DataTable/desc_ru_RU.json | 28 + .../StatelessWidget/DayPicker/desc_de_DE.json | 61 ++ .../StatelessWidget/DayPicker/desc_en_US.json | 61 ++ .../StatelessWidget/DayPicker/desc_es_ES.json | 61 ++ .../StatelessWidget/DayPicker/desc_fr_FR.json | 61 ++ .../StatelessWidget/DayPicker/desc_it_IT.json | 61 ++ .../StatelessWidget/DayPicker/desc_ja_JP.json | 61 ++ .../StatelessWidget/DayPicker/desc_ko_KR.json | 61 ++ .../StatelessWidget/DayPicker/desc_pt_PT.json | 61 ++ .../StatelessWidget/DayPicker/desc_ru_RU.json | 61 ++ .../StatelessWidget/Dialog/desc_de_DE.json | 21 + .../StatelessWidget/Dialog/desc_en_US.json | 21 + .../StatelessWidget/Dialog/desc_es_ES.json | 21 + .../StatelessWidget/Dialog/desc_fr_FR.json | 21 + .../StatelessWidget/Dialog/desc_it_IT.json | 21 + .../StatelessWidget/Dialog/desc_ja_JP.json | 21 + .../StatelessWidget/Dialog/desc_ko_KR.json | 21 + .../StatelessWidget/Dialog/desc_pt_PT.json | 21 + .../StatelessWidget/Dialog/desc_ru_RU.json | 21 + .../StatelessWidget/Divider/desc_de_DE.json | 31 + .../StatelessWidget/Divider/desc_en_US.json | 31 + .../StatelessWidget/Divider/desc_es_ES.json | 31 + .../StatelessWidget/Divider/desc_fr_FR.json | 31 + .../StatelessWidget/Divider/desc_it_IT.json | 31 + .../StatelessWidget/Divider/desc_ja_JP.json | 31 + .../StatelessWidget/Divider/desc_ko_KR.json | 31 + .../StatelessWidget/Divider/desc_pt_PT.json | 31 + .../StatelessWidget/Divider/desc_ru_RU.json | 31 + .../desc_de_DE.json | 19 + .../desc_en_US.json | 19 + .../desc_es_ES.json | 19 + .../desc_fr_FR.json | 19 + .../desc_it_IT.json | 19 + .../desc_ja_JP.json | 19 + .../desc_ko_KR.json | 19 + .../desc_pt_PT.json | 19 + .../desc_ru_RU.json | 19 + .../StatelessWidget/Drawer/desc_de_DE.json | 22 + .../StatelessWidget/Drawer/desc_en_US.json | 22 + .../StatelessWidget/Drawer/desc_es_ES.json | 22 + .../StatelessWidget/Drawer/desc_fr_FR.json | 22 + .../StatelessWidget/Drawer/desc_it_IT.json | 22 + .../StatelessWidget/Drawer/desc_ja_JP.json | 22 + .../StatelessWidget/Drawer/desc_ko_KR.json | 22 + .../StatelessWidget/Drawer/desc_pt_PT.json | 22 + .../StatelessWidget/Drawer/desc_ru_RU.json | 22 + .../DrawerButton/desc_de_DE.json | 23 + .../DrawerButton/desc_en_US.json | 23 + .../DrawerButton/desc_es_ES.json | 23 + .../DrawerButton/desc_fr_FR.json | 23 + .../DrawerButton/desc_it_IT.json | 23 + .../DrawerButton/desc_ja_JP.json | 23 + .../DrawerButton/desc_ko_KR.json | 23 + .../DrawerButton/desc_pt_PT.json | 23 + .../DrawerButton/desc_ru_RU.json | 23 + .../DrawerButtonIcon/desc_de_DE.json | 18 + .../DrawerButtonIcon/desc_en_US.json | 18 + .../DrawerButtonIcon/desc_es_ES.json | 18 + .../DrawerButtonIcon/desc_fr_FR.json | 18 + .../DrawerButtonIcon/desc_it_IT.json | 18 + .../DrawerButtonIcon/desc_ja_JP.json | 18 + .../DrawerButtonIcon/desc_ko_KR.json | 18 + .../DrawerButtonIcon/desc_pt_PT.json | 18 + .../DrawerButtonIcon/desc_ru_RU.json | 18 + .../DrawerHeader/desc_de_DE.json | 21 + .../DrawerHeader/desc_en_US.json | 21 + .../DrawerHeader/desc_es_ES.json | 21 + .../DrawerHeader/desc_fr_FR.json | 21 + .../DrawerHeader/desc_it_IT.json | 21 + .../DrawerHeader/desc_ja_JP.json | 21 + .../DrawerHeader/desc_ko_KR.json | 21 + .../DrawerHeader/desc_pt_PT.json | 21 + .../DrawerHeader/desc_ru_RU.json | 21 + .../EndDrawerButton/desc_de_DE.json | 23 + .../EndDrawerButton/desc_en_US.json | 23 + .../EndDrawerButton/desc_es_ES.json | 23 + .../EndDrawerButton/desc_fr_FR.json | 23 + .../EndDrawerButton/desc_it_IT.json | 23 + .../EndDrawerButton/desc_ja_JP.json | 23 + .../EndDrawerButton/desc_ko_KR.json | 23 + .../EndDrawerButton/desc_pt_PT.json | 23 + .../EndDrawerButton/desc_ru_RU.json | 23 + .../EndDrawerButtonIcon/desc_de_DE.json | 18 + .../EndDrawerButtonIcon/desc_en_US.json | 18 + .../EndDrawerButtonIcon/desc_es_ES.json | 18 + .../EndDrawerButtonIcon/desc_fr_FR.json | 18 + .../EndDrawerButtonIcon/desc_it_IT.json | 18 + .../EndDrawerButtonIcon/desc_ja_JP.json | 18 + .../EndDrawerButtonIcon/desc_ko_KR.json | 18 + .../EndDrawerButtonIcon/desc_pt_PT.json | 18 + .../EndDrawerButtonIcon/desc_ru_RU.json | 18 + .../FadeInImage/desc_de_DE.json | 28 + .../FadeInImage/desc_en_US.json | 28 + .../FadeInImage/desc_es_ES.json | 28 + .../FadeInImage/desc_fr_FR.json | 28 + .../FadeInImage/desc_it_IT.json | 28 + .../FadeInImage/desc_ja_JP.json | 28 + .../FadeInImage/desc_ko_KR.json | 28 + .../FadeInImage/desc_pt_PT.json | 28 + .../FadeInImage/desc_ru_RU.json | 28 + .../FilterChip/desc_de_DE.json | 27 + .../FilterChip/desc_en_US.json | 27 + .../FilterChip/desc_es_ES.json | 27 + .../FilterChip/desc_fr_FR.json | 27 + .../FilterChip/desc_it_IT.json | 27 + .../FilterChip/desc_ja_JP.json | 27 + .../FilterChip/desc_ko_KR.json | 27 + .../FilterChip/desc_pt_PT.json | 27 + .../FilterChip/desc_ru_RU.json | 27 + .../FlatButton/desc_de_DE.json | 58 ++ .../FlatButton/desc_en_US.json | 58 ++ .../FlatButton/desc_es_ES.json | 58 ++ .../FlatButton/desc_fr_FR.json | 58 ++ .../FlatButton/desc_it_IT.json | 58 ++ .../FlatButton/desc_ja_JP.json | 58 ++ .../FlatButton/desc_ko_KR.json | 58 ++ .../FlatButton/desc_pt_PT.json | 58 ++ .../FlatButton/desc_ru_RU.json | 58 ++ .../FloatingActionButton/desc_de_DE.json | 37 ++ .../FloatingActionButton/desc_en_US.json | 37 ++ .../FloatingActionButton/desc_es_ES.json | 37 ++ .../FloatingActionButton/desc_fr_FR.json | 37 ++ .../FloatingActionButton/desc_it_IT.json | 37 ++ .../FloatingActionButton/desc_ja_JP.json | 37 ++ .../FloatingActionButton/desc_ko_KR.json | 37 ++ .../FloatingActionButton/desc_pt_PT.json | 37 ++ .../FloatingActionButton/desc_ru_RU.json | 37 ++ .../FlutterLogo/desc_de_DE.json | 27 + .../FlutterLogo/desc_en_US.json | 27 + .../FlutterLogo/desc_es_ES.json | 27 + .../FlutterLogo/desc_fr_FR.json | 27 + .../FlutterLogo/desc_it_IT.json | 27 + .../FlutterLogo/desc_ja_JP.json | 27 + .../FlutterLogo/desc_ko_KR.json | 27 + .../FlutterLogo/desc_pt_PT.json | 27 + .../FlutterLogo/desc_ru_RU.json | 27 + .../GestureDetector/desc_de_DE.json | 44 ++ .../GestureDetector/desc_en_US.json | 44 ++ .../GestureDetector/desc_es_ES.json | 44 ++ .../GestureDetector/desc_fr_FR.json | 44 ++ .../GestureDetector/desc_it_IT.json | 44 ++ .../GestureDetector/desc_ja_JP.json | 44 ++ .../GestureDetector/desc_ko_KR.json | 44 ++ .../GestureDetector/desc_pt_PT.json | 44 ++ .../GestureDetector/desc_ru_RU.json | 44 ++ .../StatelessWidget/GridPaper/desc_de_DE.json | 30 + .../StatelessWidget/GridPaper/desc_en_US.json | 30 + .../StatelessWidget/GridPaper/desc_es_ES.json | 30 + .../StatelessWidget/GridPaper/desc_fr_FR.json | 30 + .../StatelessWidget/GridPaper/desc_it_IT.json | 30 + .../StatelessWidget/GridPaper/desc_ja_JP.json | 30 + .../StatelessWidget/GridPaper/desc_ko_KR.json | 30 + .../StatelessWidget/GridPaper/desc_pt_PT.json | 30 + .../StatelessWidget/GridPaper/desc_ru_RU.json | 30 + .../StatelessWidget/GridTile/desc_de_DE.json | 20 + .../StatelessWidget/GridTile/desc_en_US.json | 20 + .../StatelessWidget/GridTile/desc_es_ES.json | 20 + .../StatelessWidget/GridTile/desc_fr_FR.json | 20 + .../StatelessWidget/GridTile/desc_it_IT.json | 20 + .../StatelessWidget/GridTile/desc_ja_JP.json | 20 + .../StatelessWidget/GridTile/desc_ko_KR.json | 20 + .../StatelessWidget/GridTile/desc_pt_PT.json | 20 + .../StatelessWidget/GridTile/desc_ru_RU.json | 20 + .../GridTileBar/desc_de_DE.json | 22 + .../GridTileBar/desc_en_US.json | 22 + .../GridTileBar/desc_es_ES.json | 22 + .../GridTileBar/desc_fr_FR.json | 22 + .../GridTileBar/desc_it_IT.json | 22 + .../GridTileBar/desc_ja_JP.json | 22 + .../GridTileBar/desc_ko_KR.json | 22 + .../GridTileBar/desc_pt_PT.json | 22 + .../GridTileBar/desc_ru_RU.json | 22 + .../StatelessWidget/GridView/desc_de_DE.json | 53 ++ .../StatelessWidget/GridView/desc_en_US.json | 53 ++ .../StatelessWidget/GridView/desc_es_ES.json | 53 ++ .../StatelessWidget/GridView/desc_fr_FR.json | 53 ++ .../StatelessWidget/GridView/desc_it_IT.json | 53 ++ .../StatelessWidget/GridView/desc_ja_JP.json | 53 ++ .../StatelessWidget/GridView/desc_ko_KR.json | 53 ++ .../StatelessWidget/GridView/desc_pt_PT.json | 53 ++ .../StatelessWidget/GridView/desc_ru_RU.json | 53 ++ .../HtmlElementView/desc_de_DE.json | 19 + .../HtmlElementView/desc_en_US.json | 19 + .../HtmlElementView/desc_es_ES.json | 19 + .../HtmlElementView/desc_fr_FR.json | 19 + .../HtmlElementView/desc_it_IT.json | 19 + .../HtmlElementView/desc_ja_JP.json | 19 + .../HtmlElementView/desc_ko_KR.json | 19 + .../HtmlElementView/desc_pt_PT.json | 19 + .../HtmlElementView/desc_ru_RU.json | 19 + .../lib/StatelessWidget/Icon/desc_de_DE.json | 31 + .../lib/StatelessWidget/Icon/desc_en_US.json | 31 + .../lib/StatelessWidget/Icon/desc_es_ES.json | 31 + .../lib/StatelessWidget/Icon/desc_fr_FR.json | 31 + .../lib/StatelessWidget/Icon/desc_it_IT.json | 31 + .../lib/StatelessWidget/Icon/desc_ja_JP.json | 31 + .../lib/StatelessWidget/Icon/desc_ko_KR.json | 31 + .../lib/StatelessWidget/Icon/desc_pt_PT.json | 31 + .../lib/StatelessWidget/Icon/desc_ru_RU.json | 31 + .../IconButton/desc_de_DE.json | 22 + .../IconButton/desc_en_US.json | 22 + .../IconButton/desc_es_ES.json | 22 + .../IconButton/desc_fr_FR.json | 22 + .../IconButton/desc_it_IT.json | 22 + .../IconButton/desc_ja_JP.json | 22 + .../IconButton/desc_ko_KR.json | 22 + .../IconButton/desc_pt_PT.json | 22 + .../IconButton/desc_ru_RU.json | 22 + .../StatelessWidget/ImageIcon/desc_de_DE.json | 24 + .../StatelessWidget/ImageIcon/desc_en_US.json | 24 + .../StatelessWidget/ImageIcon/desc_es_ES.json | 24 + .../StatelessWidget/ImageIcon/desc_fr_FR.json | 24 + .../StatelessWidget/ImageIcon/desc_it_IT.json | 24 + .../StatelessWidget/ImageIcon/desc_ja_JP.json | 24 + .../StatelessWidget/ImageIcon/desc_ko_KR.json | 24 + .../StatelessWidget/ImageIcon/desc_pt_PT.json | 24 + .../StatelessWidget/ImageIcon/desc_ru_RU.json | 24 + .../StatelessWidget/InputChip/desc_de_DE.json | 33 ++ .../StatelessWidget/InputChip/desc_en_US.json | 33 ++ .../StatelessWidget/InputChip/desc_es_ES.json | 33 ++ .../StatelessWidget/InputChip/desc_fr_FR.json | 33 ++ .../StatelessWidget/InputChip/desc_it_IT.json | 33 ++ .../StatelessWidget/InputChip/desc_ja_JP.json | 33 ++ .../StatelessWidget/InputChip/desc_ko_KR.json | 33 ++ .../StatelessWidget/InputChip/desc_pt_PT.json | 33 ++ .../StatelessWidget/InputChip/desc_ru_RU.json | 33 ++ .../StatelessWidget/ListTile/desc_de_DE.json | 41 ++ .../StatelessWidget/ListTile/desc_en_US.json | 41 ++ .../StatelessWidget/ListTile/desc_es_ES.json | 41 ++ .../StatelessWidget/ListTile/desc_fr_FR.json | 41 ++ .../StatelessWidget/ListTile/desc_it_IT.json | 41 ++ .../StatelessWidget/ListTile/desc_ja_JP.json | 41 ++ .../StatelessWidget/ListTile/desc_ko_KR.json | 41 ++ .../StatelessWidget/ListTile/desc_pt_PT.json | 41 ++ .../StatelessWidget/ListTile/desc_ru_RU.json | 41 ++ .../StatelessWidget/ListView/desc_de_DE.json | 46 ++ .../StatelessWidget/ListView/desc_en_US.json | 46 ++ .../StatelessWidget/ListView/desc_es_ES.json | 46 ++ .../StatelessWidget/ListView/desc_fr_FR.json | 46 ++ .../StatelessWidget/ListView/desc_it_IT.json | 46 ++ .../StatelessWidget/ListView/desc_ja_JP.json | 46 ++ .../StatelessWidget/ListView/desc_ko_KR.json | 46 ++ .../StatelessWidget/ListView/desc_pt_PT.json | 46 ++ .../StatelessWidget/ListView/desc_ru_RU.json | 46 ++ .../StatelessWidget/Listener/desc_de_DE.json | 22 + .../StatelessWidget/Listener/desc_en_US.json | 22 + .../StatelessWidget/Listener/desc_es_ES.json | 22 + .../StatelessWidget/Listener/desc_fr_FR.json | 22 + .../StatelessWidget/Listener/desc_it_IT.json | 22 + .../StatelessWidget/Listener/desc_ja_JP.json | 22 + .../StatelessWidget/Listener/desc_ko_KR.json | 22 + .../StatelessWidget/Listener/desc_pt_PT.json | 22 + .../StatelessWidget/Listener/desc_ru_RU.json | 22 + .../MaterialBanner/desc_de_DE.json | 32 + .../MaterialBanner/desc_en_US.json | 32 + .../MaterialBanner/desc_es_ES.json | 32 + .../MaterialBanner/desc_fr_FR.json | 32 + .../MaterialBanner/desc_it_IT.json | 32 + .../MaterialBanner/desc_ja_JP.json | 32 + .../MaterialBanner/desc_ko_KR.json | 32 + .../MaterialBanner/desc_pt_PT.json | 32 + .../MaterialBanner/desc_ru_RU.json | 32 + .../MaterialButton/desc_de_DE.json | 47 ++ .../MaterialButton/desc_en_US.json | 47 ++ .../MaterialButton/desc_es_ES.json | 47 ++ .../MaterialButton/desc_fr_FR.json | 47 ++ .../MaterialButton/desc_it_IT.json | 47 ++ .../MaterialButton/desc_ja_JP.json | 47 ++ .../MaterialButton/desc_ko_KR.json | 47 ++ .../MaterialButton/desc_pt_PT.json | 47 ++ .../MaterialButton/desc_ru_RU.json | 47 ++ .../ModalBarrier/desc_de_DE.json | 19 + .../ModalBarrier/desc_en_US.json | 19 + .../ModalBarrier/desc_es_ES.json | 19 + .../ModalBarrier/desc_fr_FR.json | 19 + .../ModalBarrier/desc_it_IT.json | 19 + .../ModalBarrier/desc_ja_JP.json | 19 + .../ModalBarrier/desc_ko_KR.json | 19 + .../ModalBarrier/desc_pt_PT.json | 19 + .../ModalBarrier/desc_ru_RU.json | 19 + .../NavigationToolbar/desc_de_DE.json | 22 + .../NavigationToolbar/desc_en_US.json | 22 + .../NavigationToolbar/desc_es_ES.json | 22 + .../NavigationToolbar/desc_fr_FR.json | 22 + .../NavigationToolbar/desc_it_IT.json | 22 + .../NavigationToolbar/desc_ja_JP.json | 22 + .../NavigationToolbar/desc_ko_KR.json | 22 + .../NavigationToolbar/desc_pt_PT.json | 22 + .../NavigationToolbar/desc_ru_RU.json | 22 + .../NotificationListener/desc_de_DE.json | 25 + .../NotificationListener/desc_en_US.json | 25 + .../NotificationListener/desc_es_ES.json | 25 + .../NotificationListener/desc_fr_FR.json | 25 + .../NotificationListener/desc_it_IT.json | 25 + .../NotificationListener/desc_ja_JP.json | 25 + .../NotificationListener/desc_ko_KR.json | 25 + .../NotificationListener/desc_pt_PT.json | 25 + .../NotificationListener/desc_ru_RU.json | 25 + .../OrientationBuilder/desc_de_DE.json | 18 + .../OrientationBuilder/desc_en_US.json | 18 + .../OrientationBuilder/desc_es_ES.json | 18 + .../OrientationBuilder/desc_fr_FR.json | 18 + .../OrientationBuilder/desc_it_IT.json | 18 + .../OrientationBuilder/desc_ja_JP.json | 18 + .../OrientationBuilder/desc_ko_KR.json | 18 + .../OrientationBuilder/desc_pt_PT.json | 18 + .../OrientationBuilder/desc_ru_RU.json | 18 + .../OutlineButton/desc_de_DE.json | 60 ++ .../OutlineButton/desc_en_US.json | 60 ++ .../OutlineButton/desc_es_ES.json | 60 ++ .../OutlineButton/desc_fr_FR.json | 60 ++ .../OutlineButton/desc_it_IT.json | 60 ++ .../OutlineButton/desc_ja_JP.json | 60 ++ .../OutlineButton/desc_ko_KR.json | 60 ++ .../OutlineButton/desc_pt_PT.json | 60 ++ .../OutlineButton/desc_ru_RU.json | 60 ++ .../PageStorage/desc_de_DE.json | 23 + .../PageStorage/desc_en_US.json | 23 + .../PageStorage/desc_es_ES.json | 23 + .../PageStorage/desc_fr_FR.json | 23 + .../PageStorage/desc_it_IT.json | 23 + .../PageStorage/desc_ja_JP.json | 23 + .../PageStorage/desc_ko_KR.json | 23 + .../PageStorage/desc_pt_PT.json | 23 + .../PageStorage/desc_ru_RU.json | 23 + .../Placeholder/desc_de_DE.json | 28 + .../Placeholder/desc_en_US.json | 28 + .../Placeholder/desc_es_ES.json | 28 + .../Placeholder/desc_fr_FR.json | 28 + .../Placeholder/desc_it_IT.json | 28 + .../Placeholder/desc_ja_JP.json | 28 + .../Placeholder/desc_ko_KR.json | 28 + .../Placeholder/desc_pt_PT.json | 28 + .../Placeholder/desc_ru_RU.json | 28 + .../PositionedDirectional/desc_de_DE.json | 25 + .../PositionedDirectional/desc_en_US.json | 25 + .../PositionedDirectional/desc_es_ES.json | 25 + .../PositionedDirectional/desc_fr_FR.json | 25 + .../PositionedDirectional/desc_it_IT.json | 25 + .../PositionedDirectional/desc_ja_JP.json | 25 + .../PositionedDirectional/desc_ko_KR.json | 25 + .../PositionedDirectional/desc_pt_PT.json | 25 + .../PositionedDirectional/desc_ru_RU.json | 25 + .../PreferredSize/desc_de_DE.json | 28 + .../PreferredSize/desc_en_US.json | 28 + .../PreferredSize/desc_es_ES.json | 28 + .../PreferredSize/desc_fr_FR.json | 28 + .../PreferredSize/desc_it_IT.json | 28 + .../PreferredSize/desc_ja_JP.json | 28 + .../PreferredSize/desc_ko_KR.json | 28 + .../PreferredSize/desc_pt_PT.json | 28 + .../PreferredSize/desc_ru_RU.json | 28 + .../RadioListTile/desc_de_DE.json | 32 + .../RadioListTile/desc_en_US.json | 32 + .../RadioListTile/desc_es_ES.json | 32 + .../RadioListTile/desc_fr_FR.json | 32 + .../RadioListTile/desc_it_IT.json | 32 + .../RadioListTile/desc_ja_JP.json | 32 + .../RadioListTile/desc_ko_KR.json | 32 + .../RadioListTile/desc_pt_PT.json | 32 + .../RadioListTile/desc_ru_RU.json | 32 + .../RaisedButton/desc_de_DE.json | 60 ++ .../RaisedButton/desc_en_US.json | 60 ++ .../RaisedButton/desc_es_ES.json | 60 ++ .../RaisedButton/desc_fr_FR.json | 60 ++ .../RaisedButton/desc_it_IT.json | 60 ++ .../RaisedButton/desc_ja_JP.json | 60 ++ .../RaisedButton/desc_ko_KR.json | 60 ++ .../RaisedButton/desc_pt_PT.json | 60 ++ .../RaisedButton/desc_ru_RU.json | 60 ++ .../RawMagnifier/desc_de_DE.json | 29 + .../RawMagnifier/desc_en_US.json | 29 + .../RawMagnifier/desc_es_ES.json | 29 + .../RawMagnifier/desc_fr_FR.json | 29 + .../RawMagnifier/desc_it_IT.json | 29 + .../RawMagnifier/desc_ja_JP.json | 29 + .../RawMagnifier/desc_ko_KR.json | 29 + .../RawMagnifier/desc_pt_PT.json | 29 + .../RawMagnifier/desc_ru_RU.json | 29 + .../StatelessWidget/SafeArea/desc_de_DE.json | 22 + .../StatelessWidget/SafeArea/desc_en_US.json | 22 + .../StatelessWidget/SafeArea/desc_es_ES.json | 22 + .../StatelessWidget/SafeArea/desc_fr_FR.json | 22 + .../StatelessWidget/SafeArea/desc_it_IT.json | 22 + .../StatelessWidget/SafeArea/desc_ja_JP.json | 22 + .../StatelessWidget/SafeArea/desc_ko_KR.json | 22 + .../StatelessWidget/SafeArea/desc_pt_PT.json | 22 + .../StatelessWidget/SafeArea/desc_ru_RU.json | 22 + .../ScrollView/desc_de_DE.json | 29 + .../ScrollView/desc_en_US.json | 29 + .../ScrollView/desc_es_ES.json | 29 + .../ScrollView/desc_fr_FR.json | 29 + .../ScrollView/desc_it_IT.json | 29 + .../ScrollView/desc_ja_JP.json | 29 + .../ScrollView/desc_ko_KR.json | 29 + .../ScrollView/desc_pt_PT.json | 29 + .../ScrollView/desc_ru_RU.json | 29 + .../SimpleDialog/desc_de_DE.json | 24 + .../SimpleDialog/desc_en_US.json | 24 + .../SimpleDialog/desc_es_ES.json | 24 + .../SimpleDialog/desc_fr_FR.json | 24 + .../SimpleDialog/desc_it_IT.json | 24 + .../SimpleDialog/desc_ja_JP.json | 24 + .../SimpleDialog/desc_ko_KR.json | 24 + .../SimpleDialog/desc_pt_PT.json | 24 + .../SimpleDialog/desc_ru_RU.json | 24 + .../SimpleDialogOption/desc_de_DE.json | 19 + .../SimpleDialogOption/desc_en_US.json | 19 + .../SimpleDialogOption/desc_es_ES.json | 19 + .../SimpleDialogOption/desc_fr_FR.json | 19 + .../SimpleDialogOption/desc_it_IT.json | 19 + .../SimpleDialogOption/desc_ja_JP.json | 19 + .../SimpleDialogOption/desc_ko_KR.json | 19 + .../SimpleDialogOption/desc_pt_PT.json | 19 + .../SimpleDialogOption/desc_ru_RU.json | 19 + .../SingleChildScrollView/desc_de_DE.json | 27 + .../SingleChildScrollView/desc_en_US.json | 27 + .../SingleChildScrollView/desc_es_ES.json | 27 + .../SingleChildScrollView/desc_fr_FR.json | 27 + .../SingleChildScrollView/desc_it_IT.json | 27 + .../SingleChildScrollView/desc_ja_JP.json | 27 + .../SingleChildScrollView/desc_ko_KR.json | 27 + .../SingleChildScrollView/desc_pt_PT.json | 27 + .../SingleChildScrollView/desc_ru_RU.json | 27 + .../StatelessWidget/SnackBar/desc_de_DE.json | 27 + .../StatelessWidget/SnackBar/desc_en_US.json | 27 + .../StatelessWidget/SnackBar/desc_es_ES.json | 27 + .../StatelessWidget/SnackBar/desc_fr_FR.json | 27 + .../StatelessWidget/SnackBar/desc_it_IT.json | 27 + .../StatelessWidget/SnackBar/desc_ja_JP.json | 27 + .../StatelessWidget/SnackBar/desc_ko_KR.json | 27 + .../StatelessWidget/SnackBar/desc_pt_PT.json | 27 + .../StatelessWidget/SnackBar/desc_ru_RU.json | 27 + .../SnackBarAction/desc_de_DE.json | 21 + .../SnackBarAction/desc_en_US.json | 21 + .../SnackBarAction/desc_es_ES.json | 21 + .../SnackBarAction/desc_fr_FR.json | 21 + .../SnackBarAction/desc_it_IT.json | 21 + .../SnackBarAction/desc_ja_JP.json | 21 + .../SnackBarAction/desc_ko_KR.json | 21 + .../SnackBarAction/desc_pt_PT.json | 21 + .../SnackBarAction/desc_ru_RU.json | 21 + .../StatelessWidget/Spacer/desc_de_DE.json | 25 + .../StatelessWidget/Spacer/desc_en_US.json | 25 + .../StatelessWidget/Spacer/desc_es_ES.json | 25 + .../StatelessWidget/Spacer/desc_fr_FR.json | 25 + .../StatelessWidget/Spacer/desc_it_IT.json | 25 + .../StatelessWidget/Spacer/desc_ja_JP.json | 25 + .../StatelessWidget/Spacer/desc_ko_KR.json | 25 + .../StatelessWidget/Spacer/desc_pt_PT.json | 25 + .../StatelessWidget/Spacer/desc_ru_RU.json | 25 + .../SwitchListTile/desc_de_DE.json | 41 ++ .../SwitchListTile/desc_en_US.json | 41 ++ .../SwitchListTile/desc_es_ES.json | 41 ++ .../SwitchListTile/desc_fr_FR.json | 41 ++ .../SwitchListTile/desc_it_IT.json | 41 ++ .../SwitchListTile/desc_ja_JP.json | 41 ++ .../SwitchListTile/desc_ko_KR.json | 41 ++ .../SwitchListTile/desc_pt_PT.json | 41 ++ .../SwitchListTile/desc_ru_RU.json | 41 ++ .../lib/StatelessWidget/Tab/desc_de_DE.json | 21 + .../lib/StatelessWidget/Tab/desc_en_US.json | 21 + .../lib/StatelessWidget/Tab/desc_es_ES.json | 21 + .../lib/StatelessWidget/Tab/desc_fr_FR.json | 21 + .../lib/StatelessWidget/Tab/desc_it_IT.json | 21 + .../lib/StatelessWidget/Tab/desc_ja_JP.json | 21 + .../lib/StatelessWidget/Tab/desc_ko_KR.json | 21 + .../lib/StatelessWidget/Tab/desc_pt_PT.json | 21 + .../lib/StatelessWidget/Tab/desc_ru_RU.json | 21 + .../StatelessWidget/TabBar/desc_de_DE.json | 37 ++ .../StatelessWidget/TabBar/desc_en_US.json | 37 ++ .../StatelessWidget/TabBar/desc_es_ES.json | 37 ++ .../StatelessWidget/TabBar/desc_fr_FR.json | 37 ++ .../StatelessWidget/TabBar/desc_it_IT.json | 37 ++ .../StatelessWidget/TabBar/desc_ja_JP.json | 37 ++ .../StatelessWidget/TabBar/desc_ko_KR.json | 37 ++ .../StatelessWidget/TabBar/desc_pt_PT.json | 37 ++ .../StatelessWidget/TabBar/desc_ru_RU.json | 37 ++ .../TabPageSelector/desc_de_DE.json | 24 + .../TabPageSelector/desc_en_US.json | 24 + .../TabPageSelector/desc_es_ES.json | 24 + .../TabPageSelector/desc_fr_FR.json | 24 + .../TabPageSelector/desc_it_IT.json | 24 + .../TabPageSelector/desc_ja_JP.json | 24 + .../TabPageSelector/desc_ko_KR.json | 24 + .../TabPageSelector/desc_pt_PT.json | 24 + .../TabPageSelector/desc_ru_RU.json | 24 + .../TabPageSelectorIndicator/desc_de_DE.json | 20 + .../TabPageSelectorIndicator/desc_en_US.json | 20 + .../TabPageSelectorIndicator/desc_es_ES.json | 20 + .../TabPageSelectorIndicator/desc_fr_FR.json | 20 + .../TabPageSelectorIndicator/desc_it_IT.json | 20 + .../TabPageSelectorIndicator/desc_ja_JP.json | 20 + .../TabPageSelectorIndicator/desc_ko_KR.json | 20 + .../TabPageSelectorIndicator/desc_pt_PT.json | 20 + .../TabPageSelectorIndicator/desc_ru_RU.json | 20 + .../lib/StatelessWidget/Text/desc_de_DE.json | 72 +++ .../lib/StatelessWidget/Text/desc_en_US.json | 72 +++ .../lib/StatelessWidget/Text/desc_es_ES.json | 72 +++ .../lib/StatelessWidget/Text/desc_fr_FR.json | 72 +++ .../lib/StatelessWidget/Text/desc_it_IT.json | 72 +++ .../lib/StatelessWidget/Text/desc_ja_JP.json | 72 +++ .../lib/StatelessWidget/Text/desc_ko_KR.json | 72 +++ .../lib/StatelessWidget/Text/desc_pt_PT.json | 72 +++ .../lib/StatelessWidget/Text/desc_ru_RU.json | 72 +++ .../lib/StatelessWidget/Theme/desc_de_DE.json | 29 + .../lib/StatelessWidget/Theme/desc_en_US.json | 29 + .../lib/StatelessWidget/Theme/desc_es_ES.json | 29 + .../lib/StatelessWidget/Theme/desc_fr_FR.json | 29 + .../lib/StatelessWidget/Theme/desc_it_IT.json | 29 + .../lib/StatelessWidget/Theme/desc_ja_JP.json | 29 + .../lib/StatelessWidget/Theme/desc_ko_KR.json | 29 + .../lib/StatelessWidget/Theme/desc_pt_PT.json | 29 + .../lib/StatelessWidget/Theme/desc_ru_RU.json | 29 + .../lib/StatelessWidget/Title/desc_de_DE.json | 20 + .../lib/StatelessWidget/Title/desc_en_US.json | 20 + .../lib/StatelessWidget/Title/desc_es_ES.json | 20 + .../lib/StatelessWidget/Title/desc_fr_FR.json | 20 + .../lib/StatelessWidget/Title/desc_it_IT.json | 20 + .../lib/StatelessWidget/Title/desc_ja_JP.json | 20 + .../lib/StatelessWidget/Title/desc_ko_KR.json | 20 + .../lib/StatelessWidget/Title/desc_pt_PT.json | 20 + .../lib/StatelessWidget/Title/desc_ru_RU.json | 20 + .../ToggleButtons/desc_de_DE.json | 43 ++ .../ToggleButtons/desc_en_US.json | 43 ++ .../ToggleButtons/desc_es_ES.json | 43 ++ .../ToggleButtons/desc_fr_FR.json | 43 ++ .../ToggleButtons/desc_it_IT.json | 43 ++ .../ToggleButtons/desc_ja_JP.json | 43 ++ .../ToggleButtons/desc_ko_KR.json | 43 ++ .../ToggleButtons/desc_pt_PT.json | 43 ++ .../ToggleButtons/desc_ru_RU.json | 43 ++ .../UserAccountsDrawerHeader/desc_de_DE.json | 31 + .../UserAccountsDrawerHeader/desc_en_US.json | 31 + .../UserAccountsDrawerHeader/desc_es_ES.json | 31 + .../UserAccountsDrawerHeader/desc_fr_FR.json | 31 + .../UserAccountsDrawerHeader/desc_it_IT.json | 31 + .../UserAccountsDrawerHeader/desc_ja_JP.json | 31 + .../UserAccountsDrawerHeader/desc_ko_KR.json | 31 + .../UserAccountsDrawerHeader/desc_pt_PT.json | 31 + .../UserAccountsDrawerHeader/desc_ru_RU.json | 31 + .../VerticalDivider/desc_de_DE.json | 31 + .../VerticalDivider/desc_en_US.json | 31 + .../VerticalDivider/desc_es_ES.json | 31 + .../VerticalDivider/desc_fr_FR.json | 31 + .../VerticalDivider/desc_it_IT.json | 31 + .../VerticalDivider/desc_ja_JP.json | 31 + .../VerticalDivider/desc_ko_KR.json | 31 + .../VerticalDivider/desc_pt_PT.json | 31 + .../VerticalDivider/desc_ru_RU.json | 31 + .../Visibility/desc_de_DE.json | 27 + .../Visibility/desc_en_US.json | 27 + .../Visibility/desc_es_ES.json | 27 + .../Visibility/desc_fr_FR.json | 27 + .../Visibility/desc_it_IT.json | 27 + .../Visibility/desc_ja_JP.json | 27 + .../Visibility/desc_ko_KR.json | 27 + .../Visibility/desc_pt_PT.json | 27 + .../Visibility/desc_ru_RU.json | 27 + pubspec.lock | 200 +++++++ .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 3210 files changed, 87377 insertions(+), 22 deletions(-) create mode 100644 assets/images/widgets/GridView.svg create mode 100644 assets/images/widgets/PageView.svg create mode 100644 assets/images/widgets/SingleChildScrollView.svg create mode 100644 modules/basic_system/l10n/lib/arb/app_ja.arb create mode 100644 modules/basic_system/l10n/lib/arb/app_ko.arb create mode 100644 modules/basic_system/l10n/lib/arb/app_ru.arb create mode 100644 modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart create mode 100644 modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart create mode 100644 modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json create mode 100644 modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json diff --git a/assets/images/widgets/GridView.svg b/assets/images/widgets/GridView.svg new file mode 100644 index 00000000..a79f4422 --- /dev/null +++ b/assets/images/widgets/GridView.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/widgets/ListView.svg b/assets/images/widgets/ListView.svg index 3f2228aa..d61d991f 100644 --- a/assets/images/widgets/ListView.svg +++ b/assets/images/widgets/ListView.svg @@ -1,6 +1,23 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/widgets/PageView.svg b/assets/images/widgets/PageView.svg new file mode 100644 index 00000000..5dc3a701 --- /dev/null +++ b/assets/images/widgets/PageView.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/widgets/SingleChildScrollView.svg b/assets/images/widgets/SingleChildScrollView.svg new file mode 100644 index 00000000..baddde13 --- /dev/null +++ b/assets/images/widgets/SingleChildScrollView.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/src/flutter_unit.dart b/lib/src/flutter_unit.dart index 25429c7f..3eb82971 100644 --- a/lib/src/flutter_unit.dart +++ b/lib/src/flutter_unit.dart @@ -9,7 +9,7 @@ import 'package:l10n/l10n.dart'; import 'package:widget_module/widget_module.dart'; import 'package:tolyui/tolyui.dart'; import 'package:widget_module/blocs/blocs.dart'; - +import 'package:note/note.dart'; import 'l10n/gen/app_l10n.dart'; import 'navigation/router/app_route.dart'; @@ -61,6 +61,7 @@ class _FlutterUnit3State extends State { GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, ], supportedLocales: l10nLocales, locale: state.language.locale, diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index eda95fde..43f825cc 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,12 +6,16 @@ #include "generated_plugin_registrant.h" +#include #include #include #include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) open_file_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 712d4590..95b737f5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux open_file_linux screen_retriever_linux url_launcher_linux diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9556a44b..6ee58931 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,6 +9,7 @@ import connectivity_plus import open_file_mac import package_info_plus import path_provider_foundation +import quill_native_bridge_macos import screen_retriever_macos import share_plus import shared_preferences_foundation @@ -22,6 +23,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + QuillNativeBridgePlugin.register(with: registry.registrar(forPlugin: "QuillNativeBridgePlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/modules/basic_system/app/lib/http/science/science_host.dart b/modules/basic_system/app/lib/http/science/science_host.dart index 054d9b94..8d2a2e23 100644 --- a/modules/basic_system/app/lib/http/science/science_host.dart +++ b/modules/basic_system/app/lib/http/science/science_host.dart @@ -20,22 +20,23 @@ class ScienceHost extends Host { HostEnv get env => HostEnv.dev; } - +// 轻量服务器 +// 笔记 class LightServerHost extends Host { const LightServerHost(); @override Map get value => { - HostEnv.release: '82.157.176.209', - HostEnv.dev: '127.0.0.1', - }; + HostEnv.release: '82.157.176.209', + HostEnv.dev: '127.0.0.1', + }; @override HostConfig get config => const HostConfig( - scheme: 'http', - port: 3000, - apiNest: '/api/v1', - ); + scheme: 'http', + port: 3000, + apiNest: '/api/v1', + ); @override HostEnv get env => HostEnv.release; diff --git a/modules/basic_system/l10n/lib/arb/app_ja.arb b/modules/basic_system/l10n/lib/arb/app_ja.arb new file mode 100644 index 00000000..d35a3fab --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ja.arb @@ -0,0 +1,188 @@ +{ + "widgetCollection": "ウィジェットコレクション", + "paintCollection": "描画コレクション", + "knowledgeCollection": "知識集", + "treasureTools": "ツールボックス", + "collectCollection": "コレクション集", + "essentialCollection": "要点集", + "homeAccount": "アプリ情報", + "homeAccountTabInfo": "アプリについて", + "homeAccountTabMe": "本王に連絡", + "homeAccountSupport": "プロジェクトをサポート", + "searchWidget": "ウィジェットを検索", + "stateless": "ステートレス", + "stateful": "ステートフル", + "single": "シングルレンダリング", + "multi": "マルチレンダリング", + "sliver": "スライバー", + "proxy": "プロキシ", + "other": "その他", + "homeTabWidget": "ウィジェット", + "homeTabPaint": "描画", + "homeTabKnowledge": "知識", + "homeTabTools": "ツール", + "homeTabMine": "マイ", + "dataManagement": "データ管理", + "userCollection": "マイコレクション", + "aboutApplications": "アプリについて", + "contactThisKing": "本王に連絡", + "appSettings": "アプリ設定", + "darkMode": "ダークモード", + "themeColorSetting": "テーマカラー設定", + "fontSetting": "フォント設定", + "settingLanguageText": "多言語", + "codeHighlightStyle": "コードハイライトスタイル", + "versionInformation": "バージョン情報", + "displayPerformanceFloatingLayer": "パフォーマンスフローティングレイヤーを表示", + "showFloatingTools": "フローティングツールを表示", + "followSystem": "システムに従う", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "有効にすると、システムに従ってダークモードをオンまたはオフにします", + "manualSetting": "手動設定", + "lightMode": "ライトモード", + "settingLanguage": "言語設定", + "appDetails": "アプリ詳細", + "checkUpdate": "新しいバージョンを確認", + "downloadNewVersion": "新しいバージョンをダウンロード", + "downloadingNewVersion": "新しいバージョンをダウンロード中...", + "currentIsNew": "現在のアプリは最新バージョンです!", + "checkDatabaseNewVersion": "データベースの新しいバージョンを確認", + "viewThisProjectGithubRepository": "《このプロジェクトのGithubリポジトリを表示》", + "favorite": "お気に入り", + "enterComponentName": "コンポーネント名を入力", + "containerComponents": "コンテナコンポーネント", + "componentTavern": "コンポーネント酒場", + "cherishedComponents": "大切なコンポーネント", + "textImageCollection": "テキスト画像集", + "layoutCollection": "レイアウト集", + "eventCollection": "イベント集", + "animationCollection": "アニメーション集", + "slidingCollection": "スライド集", + "decorationCollection": "装飾集", + "assemblyCollection": "アセンブリ集", + "functionCollection": "機能集", + "popupCollection": "ポップアップ集", + "themeCollection": "テーマ集", + "derivativeCollection": "派生集", + "hardToCategorize": "分類が難しい", + "basicDrawing": "基本描画", + "basicDrawingDesc": "基本的な図形描画のケースを収録しています。これらのケースは、描画を始めたばかりのプログラマーにとって非常に役立ちます。これらのケースを通じて、点、線、矩形、円、円弧、テキスト、画像などの基本的な図形の描画方法を学び、Canvas、Paint、Pathなどの描画の核心オブジェクトの使用方法を理解できます。", + "animationGesture": "アニメーションとジェスチャー", + "animationGestureDesc": "アニメーションとジェスチャーの描画ケースを収録しています。これらのケースは、描画をより操作可能にします。これらのケースを通じて、スライド、回転、拡大縮小、移動などの効果を学び、描画が静的な表現だけでなくなることを理解できます。", + "particleDrawing": "粒子描画", + "particleDrawingDesc": "粒子関連の描画ケースを収録しています。これらのケースは、描画のトップレベルの操作です。これらのケースを通じて、粒子を使用して驚くべき視覚効果を描画する方法を学び、粒子時計、粒子爆発、粒子背景などの効果を実現し、描画に無限の可能性を与えます。", + "interestingDrawing": "面白い描画", + "interestingDrawingDesc": "いくつかの面白い描画ケースを収録しています。ここで一緒に描画の楽しさ、プログラミングの楽しさ、そして知恵の楽しさを体験しましょう。", + "artGallery": "アートギャラリー", + "artGalleryDesc": "殿堂級の描画ケースを収録しています。これらのケースは、描画の頂点作品であり、それらは実用性がなく、いかなるニーズのためでもありません。それらは存在するために存在し、人間の知恵と表現の媒体であり、芸術と呼ばれます。", + "drawingOfImages": "このサンプルでは、画像を描画する方法を紹介します。画像をロードし、指定された領域に画像リソースを描画します。上層に45度傾いたグリッド線を描画し、線の描画を練習します。", + "digitalDisplayTube": "このサンプルでは、LEDデジタル表示管を描画する方法を紹介し、パスPathの使用、変換、組み合わせ、およびコンポーネントのカプセル化の知識を練習します。非常に良い描画ケースです。", + "pathDrawing": "このサンプルでは、簡単なパスの描画とキャンバスの回転を紹介し、アニメーションと組み合わせて風車を回転させます。これは、描画とアニメーションを組み合わせた非常に簡潔なケースです。", + "gridCoordinateSystem": "このサンプルでは、線パスとテキストを使用してグリッド座標系を描画し、描画オブジェクトをカプセル化して再利用しやすくします。座標系は描画時に参考を提供し、入門に最適です。", + "polarCoordinateSystemOfFaces": "このサンプルでは、平面の極座標系を使用して描画し、関数方程式に基づいて極座標を収集して描画する方法を紹介します。", + "drawFunctionCurvesForPathPairs": "このサンプルでは、パスを使用して関数曲線を描画し、関数曲線上の少数の点をベジェ曲線でフィッティングする方法を紹介します。", + "drawRegularPolygons": "このサンプルでは、円内で点を収集し、正多角形を描画する方法を紹介します。描画とパス形成の練習に最適なケースです。\n特殊操作:+、- で辺の数を変更", + "randomNumberProcessing": "このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。", + "clockDrawing": "このサンプルでは、時計の描画を通じて、Flutterでの回転目盛りの描画テクニックを練習し、アニメーションで時計の針を回転させます。", + "drawSprings": "このサンプルでは、バネを描画し、垂直にドラッグして伸縮し、手を離すと復元アニメーションを行う方法を紹介します。非常に良い総合的な小ケースです。特殊操作:上下にドラッグしてバネを伸縮", + "theApplicationOfAnglesInDrawing": "このサンプルでは、ある点を中心に回転運動を行う方法を紹介します。これにより、2点間の角度を描画に適用する方法を学びます。\n特殊操作:クリックして実行", + "usingShadersAndFilters": "このサンプルでは、描画でシェーダーとフィルターを使用し、アニメーションで数値を変化させて回転する光の効果を実現する方法を紹介します。", + "pathDrawingFunctionCurve": "このサンプルでは、パスを使用して関数曲線を描画し、パス測定を使用してアニメーションを行う方法を紹介します。", + "thePathOfBingDwenDwen": "このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンのパスを描画し、パス測定を使用してアニメーションを行います。\n特殊操作:クリックして実行", + "drawCubicBesselCurve": "このサンプルでは、3次ベジェ曲線を描画し、タッチポイントを使用してある点がアクティブかどうかを判断し、それに応じて点の位置を制御してドラッグ制御効果を実現する方法を紹介します。\n特殊操作:クリックで点を描画、ダブルクリックでクリア", + "theEffectOfAnimationCurve": "このサンプルでは、アニメーションカーブの効果を直感的に確認し、アニメーションに対する理解を深めます。\n特殊操作:クリックして実行", + "randomParticlesAndBoundaryBouncing": "このサンプルでは、ランダムな粒子を作成し、境界でのバウンスロジックを処理する方法を紹介します。粒子運動を学ぶのに非常に良い入門ケースです。特殊操作:クリックで停止/実行", + "particleCollision": "このサンプルでは、個々の粒子の衝突検出を行い、複数の粒子に分裂させる方法を紹介します。非常に面白いケースです。\n特殊操作:クリックでリセット", + "particle": "このサンプルでは、画像を粒子として表現し、粒子にアニメーションを適用して爆発効果を実現する方法を紹介します。\n特殊操作:クリックして実行", + "rectangleAndRandomNumbers": "このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。\n特殊操作:クリックしてランダム生成", + "bingDwenDwen": "このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンの形を描画し、パス描画やグラデーションなどの知識を学びます。", + "pufengInjectionTest": "このサンプルでは、蒲豊の針投げテストのプロセスを実装し、確率を使用して円周率を推定します。描画の小技やデータの論理処理を学ぶことができます。", + "ticTacToe": "このサンプルでは、三目並べの描画と論理検証を通じて、ジェスチャー、描画、アニメーション、検証などの重要なスキルを組み合わせます。非常に良い練習ケースです。\n特殊操作:ダブルクリックでリセット", + "tiledLines": "このサンプルは、generativeartistry.comのtiled-linesに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "joyDivision": "このサンプルは、generativeartistry.comのjoy-divisionに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "cubicDisarray": "このサンプルは、generativeartistry.comのcubic-disarrayに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "triangularMesh": "このサンプルは、generativeartistry.comのtriangular-meshに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "unDeuxTrois": "このサンプルは、generativeartistry.comのun-deux-troisに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "circlePacking": "このサンプルは、generativeartistry.comのcircle-packingに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "hypnoticSquares": "このサンプルは、generativeartistry.comのhypnotic-squaresに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "pietMondrian": "このサンプルは、generativeartistry.comのpiet-mondrianに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry", + "downloadCompressedPackage": "使用方法:\n1. iconfont.cnでアイコンを選び、プロジェクトに追加し、圧縮パッケージをダウンロードします。\n2. Flutterプロジェクトのアドレスを選択し、リソースと生成物ファイルの場所を設定します。\n3. コード生成ボタンをクリックすると、関連するコードが生成されます。", + "qAIssues": "要点集録のQAデータは、rUnitのpointタグが付いたissuesに収録されています。データを提供する必要がある場合は、issuesで質問してください。", + "tips": "注:", + "visualSorting": "可視化ソート", + "visual": "可視ソート", + "insertion": "挿入ソート", + "bubble": "バブルソート", + "cocktail": "カクテルソート(双方向バブルソート)", + "comb": "コームソート", + "pigeonHole": "鳩の巣ソート", + "shell": "シェルソート", + "selection": "選択ソート", + "gnome": "ノームソート", + "cycle": "サイクルソート", + "heap": "ヒープソート", + "quick": "クイックソート", + "merge": "マージソート", + "sortingAlgorithmConfiguration": "ソートアルゴリズム設定", + "dataCount": "データ数(個数)", + "timeInterval": "時間間隔(マイクロ秒)", + "randomSeed": "ランダムシード", + "codeGeneration": "コード生成", + "generateCode": "コードを生成", + "artifactLocation": "生成物の場所", + "codeClassLocation": "コードクラスの保存場所", + "resourceDirectory": "リソースディレクトリ", + "iconfontResourceLocation": "iconfontリソースの保存場所", + "projectPath": "プロジェクトパス", + "inputProjectAddress": "プロジェクトアドレスを選択または入力してください", + "iconfontCompressedPackagePath": "Iconfont圧縮パッケージのパス", + "pleaseSelectOrInputIconfontCompressedPackagePath": "iconfontのダウンロードした圧縮パッケージのパスを選択または入力してください", + "stayTuned": "お楽しみに", + "iconFont": "IconFont", + "dataClass": "データクラス", + "stateManagement": "状態管理", + "jsonParsing": "Json解析", + "clickHereToJump": "ここをクリックしてジャンプ", + "knowledgeTabToly": "ジェット文庫", + "knowledgeTabAlgo": "アルゴリズム演繹", + "knowledgeTabLayout": "レイアウト宝庫", + "knowledgeTabPoint": "要点宝庫", + "knowledgeConstruction": "建設中", + "knowledgeToJuejin": "掘金へ", + "srcPath": "ソースアドレス", + "widgetsInn": "ウィジェット酒場", + "likedWidgets": "大切なウィジェット", + "relatedComponents": "関連コンポーネント", + "backupFavoritesCollectionData": "お気に入りコレクションデータのバックアップ", + "syncFavoritesCollectionData": "お気に入りコレクションデータの同期", + "favoritesCollectionDataReset": "お気に入りコレクションデータのリセット", + "resetSuccess": "リセット成功!", + "dataSetBackupSuccess": "データセットのバックアップ成功!", + "dataSetBackupFailure": "データセットのバックアップ失敗!", + "dataSynchronizationCopySuccess": "データ同期コピー成功!", + "dataSynchronizationCopyFailure": "データ同期コピー失敗!", + "destructionRed": "破滅の赤", + "rageOrange": "怒りのオレンジ", + "warningYellow": "警告の黄", + "camouflageGreen": "偽装の緑", + "coldBlue": "冷徹な青", + "infiniteBlue": "無限の藍", + "mysteryPurple": "神秘の紫", + "destinyBlack": "帰宿の黒", + + "showBackground": "背景を表示", + "toly": "張風捷特烈", + "dartHandbook": "Dart 手引き", + + "codeCopiedSuccessfully": "コードがコピーされました", + "favoriteFolderManagement": "お気に入りフォルダの管理", + "assembly": "コンポーネント", + "draw": "描画", + "knowledge": "知識", + "collection": "コレクション", + "my": "私の", + "picture": "枚", + "widgetInn": "コンポーネント酒場", + "emptySearch": "データがありません、俺もどうしようもない\n(≡ _ ≡)/~┴┴", + "searchSomething": "友よ、何か検索しよう…≧◔◡◔≦", + "slogan": "Flutterの連携、プログラマーの連携" + } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_ko.arb b/modules/basic_system/l10n/lib/arb/app_ko.arb new file mode 100644 index 00000000..374ad4e0 --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ko.arb @@ -0,0 +1,186 @@ +{ +"widgetCollection": "위젯 컬렉션", +"paintCollection": "그림 컬렉션", +"knowledgeCollection": "지식 모음", +"treasureTools": "도구 보물상자", +"collectCollection": "컬렉션 모음", +"essentialCollection": "핵심 모음", +"homeAccount": "앱 정보", +"homeAccountTabInfo": "앱 정보", +"homeAccountTabMe": "저에게 연락", +"homeAccountSupport": "프로젝트 지원", +"searchWidget": "위젯 검색", +"stateless": "무상태", +"stateful": "상태 있음", +"single": "단일 렌더링", +"multi": "다중 렌더링", +"sliver": "슬라이버", +"proxy": "프록시", +"other": "기타", +"homeTabWidget": "위젯", +"homeTabPaint": "그리기", +"homeTabKnowledge": "지식", +"homeTabTools": "도구", +"homeTabMine": "내 정보", +"dataManagement": "데이터 관리", +"userCollection": "내 컬렉션", +"aboutApplications": "앱 정보", +"contactThisKing": "저에게 연락", +"appSettings": "앱 설정", +"darkMode": "다크 모드", +"themeColorSetting": "테마 색상 설정", +"fontSetting": "폰트 설정", +"settingLanguageText": "다국어", +"codeHighlightStyle": "코드 하이라이트 스타일", +"versionInformation": "버전 정보", +"displayPerformanceFloatingLayer": "성능 플로팅 레이어 표시", +"showFloatingTools": "플로팅 도구 표시", +"followSystem": "시스템 따라가기", +"afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "시스템 설정에 따라 다크 모드를 켜거나 끕니다.", +"manualSetting": "수동 설정", +"lightMode": "라이트 모드", +"settingLanguage": "언어 설정", +"appDetails": "앱 상세 정보", +"checkUpdate": "새 버전 확인", +"downloadNewVersion": "새 버전 다운로드", +"downloadingNewVersion": "새 버전 다운로드 중...", +"currentIsNew": "현재 버전이 최신입니다!", +"checkDatabaseNewVersion": "데이터베이스 새 버전 확인", +"viewThisProjectGithubRepository": "《이 프로젝트의 Github 저장소 보기》", +"favorite": "즐겨찾기", +"enterComponentName": "컴포넌트 이름 입력", +"containerComponents": "컨테이너 컴포넌트", +"componentTavern": "컴포넌트 선술집", +"cherishedComponents": "소중한 컴포넌트", +"textImageCollection": "텍스트 이미지 모음", +"layoutCollection": "레이아웃 모음", +"eventCollection": "이벤트 모음", +"animationCollection": "애니메이션 모음", +"slidingCollection": "슬라이딩 모음", +"decorationCollection": "장식 모음", +"assemblyCollection": "조립 모음", +"functionCollection": "기능 모음", +"popupCollection": "팝업 모음", +"themeCollection": "테마 모음", +"derivativeCollection": "파생 모음", +"hardToCategorize": "분류하기 어려움", +"basicDrawing": "기본 그리기", +"basicDrawingDesc": "기본 도형 그리기 예제를 포함합니다. 이 예제들은 그리기를 처음 접하는 프로그래머에게 매우 친숙할 것입니다. 이 예제들을 통해 점, 선, 사각형, 원, 호, 텍스트, 이미지 등 기본 도형을 그리는 방법을 배우고, Canvas, Paint, Path 등 그리기의 핵심 객체 사용법을 익힐 수 있습니다.", +"animationGesture": "애니메이션 제스처", +"animationGestureDesc": "애니메이션과 제스처 그리기 예제를 포함합니다. 이 예제들은 그리기를 더욱 상호작용적으로 만듭니다. 이 예제들을 통해 슬라이드, 회전, 확대/축소, 이동 등의 효과를 배울 수 있으며, 그리기가 단순히 정적인 표현이 아니게 됩니다.", +"particleDrawing": "입자 그리기", +"particleDrawingDesc": "입자 관련 그리기 예제를 포함합니다. 이 예제들은 그리기의 최고 수준의 작업입니다. 이 예제들을 통해 입자를 사용하여 놀라운 시각적 효과를 그리는 방법을 배울 수 있습니다. 입자 시계, 입자 폭발, 입자 배경 등 다양한 효과를 통해 그리기의 무한한 가능성을 경험할 수 있습니다.", +"interestingDrawing": "재미있는 그리기", +"interestingDrawingDesc": "재미있는 그리기 예제를 포함합니다. 여기서 그리기, 프로그래밍, 지혜의 즐거움을 함께 경험해 보세요.", +"artGallery": "예술 갤러리", +"artGalleryDesc": "최고 수준의 그리기 예제를 포함합니다. 이 예제들은 그리기의 정점에 있는 작품들로, 실용성은 없지만 존재 자체로 의미가 있는 예술 작품입니다.", +"drawingOfImages": "이 예제는 이미지를 그리는 방법을 소개합니다: 이미지를 로드하고 지정된 영역에 그립니다. 상단에 45도 각도의 그리드 선을 그려 선 그리기를 연습합니다.", +"digitalDisplayTube": "이 예제는 LED 디지털 디스플레이 튜브를 그리는 방법을 소개하며, Path 사용, 변환, 조합 및 컴포넌트 캡슐화를 연습합니다. 매우 좋은 그리기 예제입니다.", +"pathDrawing": "이 예제는 간단한 경로 그리기 및 캔버스 회전을 소개하며, 애니메이션을 결합하여 풍차를 회전시킵니다. 매우 간결한 그리기와 애니메이션 결합 예제입니다.", +"gridCoordinateSystem": "이 예제는 선 경로와 텍스트를 사용하여 그리드 좌표계를 그리는 방법을 소개하며, 그리기 객체를 캡슐화하여 재사용하기 쉽게 만듭니다. 좌표계는 그리기 시 참조를 제공하며, 입문자에게 필수입니다.", +"polarCoordinateSystemOfFaces": "이 예제는 평면의 극좌표계를 그리는 방법을 소개하며, 함수 방정식에 따라 극좌표를 수집하여 그립니다.", +"drawFunctionCurvesForPathPairs": "이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 함수 곡선 상의 소량의 점을 베지어 곡선으로 피팅합니다.", +"drawRegularPolygons": "이 예제는 원 안에서 점을 수집하여 정다각형을 그리는 방법을 소개하며, 그리기 및 경로 형성 연습에 매우 좋은 예제입니다.\n특수 조작: +, - 로 변 수정", +"randomNumberProcessing": "이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.", +"clockDrawing": "이 예제는 시계 그리기를 통해 Flutter에서 회전 눈금 그리기 기술을 연습하고, 애니메이션을 통해 시계 바늘이 회전하도록 합니다.", +"drawSprings": "이 예제는 스프링을 그리는 방법을 소개하며, 수직 드래그로 스프링을 늘이거나 줄이고, 놓을 때 복원 애니메이션을 수행합니다. 매우 좋은 종합 예제입니다. 특수 조작: 위아래 드래그로 스프링 늘이기/줄이기", +"theApplicationOfAnglesInDrawing": "이 예제는 특정 점을 중심으로 회전 운동을 수행하는 방법을 소개합니다. 이를 통해 두 점 사이의 각도가 그리기에서 어떻게 적용되는지 배울 수 있습니다.\n특수 조작: 클릭하여 실행", +"usingShadersAndFilters": "이 예제는 그리기에서 셰이더와 필터를 사용하는 방법을 소개하며, 애니메이션을 통해 수치를 변경하여 회전하는 빛의 효과를 만듭니다.", +"pathDrawingFunctionCurve": "이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 경로 측정을 사용하여 애니메이션을 만듭니다.", +"thePathOfBingDwenDwen": "이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 경로를 그리며, 경로 측정을 사용하여 애니메이션을 만듭니다.\n특수 조작: 클릭하여 실행", +"drawCubicBesselCurve": "이 예제는 3차 베지어 곡선을 그리는 방법을 소개하며, 접점을 통해 특정 점이 활성화되었는지 판단하여 점의 위치를 제어합니다.\n특수 조작: 클릭하여 점 그리기, 더블 클릭하여 지우기", +"theEffectOfAnimationCurve": "이 예제는 애니메이션 곡선의 효과를 직관적으로 보여줍니다. 이를 통해 애니메이션에 대한 이해를 높일 수 있습니다.\n특수 조작: 클릭하여 실행", +"randomParticlesAndBoundaryBouncing": "이 예제는 무작위 입자를 생성하고 경계에서 튕기는 로직을 처리하는 방법을 소개합니다. 입자 운동을 배우기에 매우 좋은 입문 예제입니다. 특수 조작: 클릭하여 정지/실행", +"particleCollision": "이 예제는 개별 입자에 대한 충돌 감지를 수행하고, 여러 입자로 분열시키는 방법을 소개합니다. 매우 재미있는 예제입니다.\n특수 조작: 클릭하여 재설정", +"particle": "이 예제는 이미지를 입자로 표현하고, 입자에 애니메이션을 적용하여 폭발 효과를 만드는 방법을 소개합니다.\n특수 조작: 클릭하여 실행", +"rectangleAndRandomNumbers": "이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.\n특수 조작: 클릭하여 무작위 생성", +"bingDwenDwen": "이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 형태를 그리는 방법을 소개하며, 경로 그리기 및 그라데이션 색상 사용법을 배울 수 있습니다.", +"pufengInjectionTest": "이 예제는 푸펑 투시험의 테스트 과정을 구현하며, 확률을 통해 원주율을 추정합니다. 그리기 기술 및 데이터 논리 처리 방법을 배울 수 있습니다.", +"ticTacToe": "이 예제는 틱택토 그리기 및 논리 검증을 통해 제스처, 그리기, 애니메이션, 검증 등의 중요한 기술을 종합적으로 연습할 수 있는 매우 좋은 예제입니다.\n특수 조작: 더블 클릭하여 재설정", +"tiledLines": "이 예제는 generativeartistry.com의 tiled-lines에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"joyDivision": "이 예제는 generativeartistry.com의 joy-division에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"cubicDisarray": "이 예제는 generativeartistry.com의 cubic-disarray에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"triangularMesh": "이 예제는 generativeartistry.com의 triangular-mesh에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"unDeuxTrois": "이 예제는 generativeartistry.com의 un-deux-trois에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"circlePacking": "이 예제는 generativeartistry.com의 circle-packing에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"hypnoticSquares": "이 예제는 generativeartistry.com의 hypnotic-squares에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"pietMondrian": "이 예제는 generativeartistry.com의 piet-mondrian에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry", +"downloadCompressedPackage": "사용 방법:\n1. iconfont.cn에서 아이콘을 선택하고 프로젝트에 추가한 후 압축 파일을 다운로드합니다.\n2. Flutter 프로젝트 경로를 선택하고 리소스 및 산출물 파일 위치를 설정합니다.\n3. 코드 생성 버튼을 클릭하여 관련 코드를 생성합니다.", +"qAIssues": "핵심 모음의 QA 데이터는 rUnit의 point 태그가 있는 issues에 포함되어 있습니다. 데이터를 제공하려면 issues에서 질문하세요.", +"tips": "참고:", +"visualSorting": "시각적 정렬", +"visual": "시각적 정렬", +"insertion": "삽입 정렬", +"bubble": "버블 정렬", +"cocktail": "칵테일 정렬(양방향 버블 정렬)", +"comb": "빗질 정렬", +"pigeonHole": "비둘기집 정렬", +"shell": "셸 정렬", +"selection": "선택 정렬", +"gnome": "노움 정렬", +"cycle": "순환 정렬", +"heap": "힙 정렬", +"quick": "퀵 정렬", +"merge": "병합 정렬", +"sortingAlgorithmConfiguration": "정렬 알고리즘 설정", +"dataCount": "데이터 수(개수)", +"timeInterval": "시간 간격(마이크로초)", +"randomSeed": "무작위 시드", +"codeGeneration": "코드 생성", +"generateCode": "코드 생성", +"artifactLocation": "산출물 위치", +"codeClassLocation": "코드 클래스 위치", +"resourceDirectory": "리소스 디렉토리", +"iconfontResourceLocation": "iconfont 리소스 위치", +"projectPath": "프로젝트 경로", +"inputProjectAddress": "프로젝트 주소를 선택하거나 입력하세요", +"iconfontCompressedPackagePath": "Iconfont 압축 파일 경로", +"pleaseSelectOrInputIconfontCompressedPackagePath": "iconfont 다운로드 압축 파일 경로를 선택하거나 입력하세요", +"stayTuned": "기대해 주세요", +"iconFont": "IconFont", +"dataClass": "데이터 클래스", +"stateManagement": "상태 관리", +"jsonParsing": "Json 파싱", +"clickHereToJump": "여기를 클릭하여 이동", +"knowledgeTabToly": "제트 문고", +"knowledgeTabAlgo": "알고리즘 연습", +"knowledgeTabLayout": "레이아웃 보물", +"knowledgeTabPoint": "핵심 보물", +"knowledgeConstruction": "구축 중", +"knowledgeToJuejin": "Juejin으로 이동", +"srcPath": "소스 경로", +"widgetsInn": "위젯 선술집", +"likedWidgets": "소중한 위젯", +"relatedComponents": "관련 컴포넌트", +"backupFavoritesCollectionData": "즐겨찾기 컬렉션 데이터 백업", +"syncFavoritesCollectionData": "즐겨찾기 컬렉션 데이터 동기화", +"favoritesCollectionDataReset": "즐겨찾기 컬렉션 데이터 재설정", +"resetSuccess": "재설정 성공!", +"dataSetBackupSuccess": "데이터 세트 백업 성공!", +"dataSetBackupFailure": "데이터 세트 백업 실패!", +"dataSynchronizationCopySuccess": "데이터 동기화 복사 성공!", +"dataSynchronizationCopyFailure": "데이터 동기화 복사 실패!", + "destructionRed": "파괴의 빨강", + "rageOrange": "분노의 주황", + "warningYellow": "경고의 노랑", + "camouflageGreen": "위장의 초록", + "coldBlue": "냉담의 파랑", + "infiniteBlue": "무한의 남색", + "mysteryPurple": "신비의 보라", + "destinyBlack": "운명의 검정", + "showBackground": "배경 표시", + "toly": "장풍제특렬", + "dartHandbook": "Dart 핸드북", + "codeCopiedSuccessfully": "코드 복사 성공", + "favoriteFolderManagement": "즐겨찾기 폴더 관리", + "assembly": "컴포넌트", + "draw": "그리기", + "knowledge": "지식", + "collection": "컬렉션", + "my": "내 정보", + "picture": "그림", + "widgetInn": "위젯 선술집", + "emptySearch": "데이터가 없습니다, 형님도 방법이 없어요\n(≡ _ ≡)/~┴┴", + "searchSomething": "형님, 뭘 검색하시겠어요...≧◔◡◔≦", + "slogan": "Flutter의 연합, 프로그래머의 연합" + } \ No newline at end of file diff --git a/modules/basic_system/l10n/lib/arb/app_ru.arb b/modules/basic_system/l10n/lib/arb/app_ru.arb new file mode 100644 index 00000000..bf24822f --- /dev/null +++ b/modules/basic_system/l10n/lib/arb/app_ru.arb @@ -0,0 +1,194 @@ +{ + "widgetCollection": "Сборник компонентов", + "paintCollection": "Сборник рисования", + "knowledgeCollection": "Сборник знаний", + "treasureTools": "Сундучок инструментов", + "collectCollection": "Сборник избранного", + "essentialCollection": "Сборник ключевых моментов", + "homeAccount": "Информация о приложении", + "homeAccountTabInfo": "О приложении", + "homeAccountTabMe": "Связаться с этим королём", + "homeAccountSupport": "Проекты поддержки", + "searchWidget": "Поиск компонентов", + "stateless": "Без состояния", + "stateful": "С состоянием", + "single": "Один рендеринг", + "multi": "Многократный рендеринг", + "sliver": "Скользящая панель", + "proxy": "Прокси", + "other": "Другие", + "homeTabWidget": "Компоненты", + "homeTabPaint": "Рисование", + "homeTabKnowledge": "Знания", + "homeTabTools": "Инструменты", + "homeTabMine": "Мой профиль", + "dataManagement": "Управление данными", + "userCollection": "Мои избранные", + "aboutApplications": "О приложении", + "contactThisKing": "Связаться с этим королём", + "appSettings": "Настройки приложения", + "darkMode": "Тёмный режим", + "themeColorSetting": "Настройки темы", + "fontSetting": "Настройки шрифта", + "settingLanguageText": "Многоязычность", + "codeHighlightStyle": "Стиль подсветки кода", + "versionInformation": "Информация о версии", + "displayPerformanceFloatingLayer": "Показать плавающий слой производительности", + + "showFloatingTools": "Показать плавающие инструменты", + + "followSystem": "Следовать за системой", + "afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode": "После включения будет следовать за системой для включения или отключения тёмного режима", + "manualSetting": "Ручные настройки", + "lightMode": "Светлый режим", + "settingLanguage": "Настройки языка", + + "appDetails": "Детали приложения", + "checkUpdate": "Проверить обновление", + "downloadNewVersion": "Скачать новое обновление", + "downloadingNewVersion": "Скачивание нового обновления...", + "currentIsNew": "Текущая версия приложения уже самая новая!", + "checkDatabaseNewVersion": "Проверить обновление базы данных", + "viewThisProjectGithubRepository": "Посмотреть репозиторий проекта на Github", + + "favorite": "Добавлено в избранное", + "enterComponentName": "Введите название компонента", + "containerComponents": "Контейнерные компоненты", + "componentTavern": "Таверна компонентов", + "cherishedComponents": "Ценные компоненты", + "textImageCollection": "Сборник изображений и текста", + "layoutCollection": "Сборник макетов", + "eventCollection": "Сборник событий", + "animationCollection": "Сборник анимаций", + "slidingCollection": "Сборник слайдов", + "decorationCollection": "Сборник декораций", + "assemblyCollection": "Сборник сборки", + "functionCollection": "Сборник функций", + "popupCollection": "Сборник всплывающих окон", + "themeCollection": "Сборник тем", + "derivativeCollection": "Сборник производных", + "hardToCategorize": "Трудно классифицировать", + "basicDrawing": "Основы рисования", + "basicDrawingDesc": "Включает несколько примеров базового рисования, которые будут полезны для начинающих программистов. Эти примеры научат рисованию базовых фигур, таких как точки, линии, прямоугольники, круги и текст.", + "animationGesture": "Анимация жестов", + "animationGestureDesc": "Содержит примеры рисования анимаций и жестов, которые сделают рисование более интерактивным. Эти примеры научат использовать анимации и жесты, такие как скольжение, вращение, масштабирование и перемещение.", + "particleDrawing": "Частицы в рисовании", + "particleDrawingDesc": "Включает примеры рисования с использованием частиц. Эти примеры покажут, как использовать частицы для создания зрелищных эффектов, таких как взрывы или анимации с частицами.", + "interestingDrawing": "Интересные рисунки", + "interestingDrawingDesc": "Примеры интересных и забавных рисунков, где мы можем наслаждаться процессом рисования и программирования.", + "artGallery": "Галерея искусства", + "artGalleryDesc": "Содержит примеры высокого искусства, которые не предназначены для практических целей, а являются выражением человеческого интеллекта и творчества.", + "drawingOfImages": "Пример рисования изображений: загрузка изображения и его отрисовка в определенной области. На верхнем слое добавлены линии сетки для практики рисования линий.", + "digitalDisplayTube": "Пример рисования цифровых трубок с использованием пути Path и анимации.", + "pathDrawing": "Пример рисования простых путей с анимацией.", + "gridCoordinateSystem": "Пример рисования сетки координат с линиями и текстом для новичков.", + "polarCoordinateSystemOfFaces": "Пример рисования полярной координатной системы с использованием функций.", + "drawFunctionCurvesForPathPairs": "Пример рисования функциональных кривых с использованием пути и Беезье.", + "drawRegularPolygons": "Пример рисования правильных многоугольников внутри круга.", + "randomNumberProcessing": "Пример рисования прямоугольников с обработкой случайных чисел.", + "clockDrawing": "Пример рисования часов с анимацией.", + "drawSprings": "Пример рисования пружины с анимацией сжатия и растяжения.", + "theApplicationOfAnglesInDrawing": "Пример рисования с использованием углов для вращения.", + "usingShadersAndFilters": "Пример использования шейдеров и фильтров для создания анимации.", + "pathDrawingFunctionCurve": "Пример рисования кривых с помощью пути и измерения анимации.", + "thePathOfBingDwenDwen": "Пример рисования пути маскота Олимпиады Пекин-2022 с использованием анимации пути.", + "drawCubicBesselCurve": "Пример рисования кривой кубического Безье с возможностью перетаскивания точек.", + "theEffectOfAnimationCurve": "Пример демонстрации эффекта анимационной кривой для углубленного понимания анимаций.", + "randomParticlesAndBoundaryBouncing": "Пример создания случайных частиц с отскоком от границ.", + "particleCollision": "Пример столкновений частиц с анимацией их распада.", + "particle": "Пример взрыва изображений с использованием частиц.", + "rectangleAndRandomNumbers": "Пример рисования прямоугольников с использованием случайных чисел.", + "bingDwenDwen": "Пример рисования формы маскота Олимпиады Пекин-2022.", + "pufengInjectionTest": "Пример теста для вычисления числа Пи с использованием вероятности.", + "ticTacToe": "Пример игры в крестики-нолики с логикой и анимацией.", + "tiledLines": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "joyDivision": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "cubicDisarray": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "triangularMesh": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "unDeuxTrois": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "circlePacking": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "hypnoticSquares": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "pietMondrian": "Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.", + "downloadCompressedPackage": "Инструкция по использованию:\n1. Выберите и скачайте иконки на iconfont.cn.\n2. Настройте путь к проекту Flutter.\n3. Нажмите кнопку для генерации кода.", + "qAIssues": "Данные QA из сборника важных моментов rUnit будут добавлены в issues с меткой point.", + "tips": "Совет:", + "visualSorting": "Визуальная сортировка", + "visual": "Визуальная сортировка", + "insertion": "Сортировка вставками", + "bubble": "Пузырьковая сортировка", + "cocktail": "Коктейльная сортировка", + "comb": "Сортировка расческой", + "pigeonHole": "Сортировка по принципу дырок для голубей", + "shell": "Сортировка Шелла", + "selection": "Сортировка выбором", + "gnome": "Сортировка гномом", + "cycle": "Циклическая сортировка", + "heap": "Сортировка кучей", + "quick": "Быстрая сортировка", + "merge": "Сортировка слиянием", + "sortingAlgorithmConfiguration": "Настройки сортировки", + "dataCount": "Количество данных", + "timeInterval": "Интервал времени", + "randomSeed": "Случайное зерно", + "codeGeneration": "Генерация кода", + "generateCode": "Сгенерировать код", + "artifactLocation": "Местоположение артефакта", + "codeClassLocation": "Местоположение класса кода", + "resourceDirectory": "Каталог ресурсов", + "iconfontResourceLocation": "Местоположение ресурсов iconfont", + "projectPath": "Путь проекта", + "inputProjectAddress": "Выберите или введите путь к проекту", + "iconfontCompressedPackagePath": "Путь к сжатию иконок", + "pleaseSelectOrInputIconfontCompressedPackagePath": "Пожалуйста, выберите или введите путь к сжатому пакету iconfont", + "stayTuned": "Ожидайте", + "iconFont": "IconFont", + "dataClass": "Класс данных", + "stateManagement": "Управление состоянием", + "jsonParsing": "Парсинг JSON", + "clickHereToJump": "Нажмите здесь для перехода", + + "knowledgeTabToly": "Библиотека Jet", + "knowledgeTabAlgo": "Алгоритмы", + "knowledgeTabLayout": "Библиотека макетов", + "knowledgeTabPoint": "Библиотека ключевых моментов", + "knowledgeConstruction": "На стадии строительства", + "knowledgeToJuejin": "Перейти на Juejin", + "srcPath": "Путь к исходному коду", + "widgetsInn": "Таверна компонентов", + "likedWidgets": "Избранные компоненты", + "relatedComponents": "Связанные компоненты", + + "backupFavoritesCollectionData": "Резервное копирование данных избранного", + "syncFavoritesCollectionData": "Синхронизация данных избранного", + "favoritesCollectionDataReset": "Сброс данных избранного", + "resetSuccess": "Сброс успешен!", + "dataSetBackupSuccess": "Резервное копирование данных прошло успешно!", + "dataSetBackupFailure": "Ошибка резервного копирования данных!", + "dataSynchronizationCopySuccess": "Синхронизация данных успешна!", + "dataSynchronizationCopyFailure": "Ошибка синхронизации данных!", + "destructionRed": "Красный разрушения", + "rageOrange": "Оранжевый гнева", + "warningYellow": "Желтый предупреждения", + "camouflageGreen": "Зеленый камуфляжа", + "coldBlue": "Холодный синий", + "infiniteBlue": "Бесконечный синий", + "mysteryPurple": "Тайный фиолетовый", + "destinyBlack": "Черный судьбы", + + "showBackground": "Показать фон", + "toly": "Толь", + "dartHandbook": "Руководство Dart", + + "codeCopiedSuccessfully": "Код успешно скопирован", + "favoriteFolderManagement": "Управление папками избранного", + "assembly": "Сборка", + "draw": "Рисование", + "knowledge": "Знания", + "collection": "Коллекция", + "my": "Мои", + "picture": "Картинка", + "widgetInn": "Таверна компонентов", + "emptySearch": "Данных нет, я тоже не знаю, что делать\n(≡ _ ≡)/~┴┴", + "searchSomething": "Друзья, давайте что-то искать…≧◔◡◔≦", + "slogan": "Связь Flutter, связь программистов" +} diff --git a/modules/basic_system/l10n/lib/arb/app_zh.arb b/modules/basic_system/l10n/lib/arb/app_zh.arb index 1569b6a4..b76c3bc1 100644 --- a/modules/basic_system/l10n/lib/arb/app_zh.arb +++ b/modules/basic_system/l10n/lib/arb/app_zh.arb @@ -5,13 +5,10 @@ "treasureTools": "工具宝箱", "collectCollection": "收藏集录", "essentialCollection": "要点集录", - "homeAccount": "应用信息", - "homeAccountTabInfo": "关于应用", "homeAccountTabMe": "联系本王", "homeAccountSupport": "支持项目", - "searchWidget": "搜索组件", "stateless":"无态", "stateful":"有态", @@ -25,12 +22,10 @@ "homeTabKnowledge": "知识", "homeTabTools": "工具", "homeTabMine": "我的", - "dataManagement":"数据管理", "userCollection":"我的收藏", "aboutApplications":"关于应用", "contactThisKing":"联系本王", - "appSettings":"应用设置", "darkMode":"深色模式", "themeColorSetting":"主题色设置", diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart index f9a128a2..bdf016a8 100644 --- a/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations.dart @@ -6,6 +6,9 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_ja.dart'; +import 'app_localizations_ko.dart'; +import 'app_localizations_ru.dart'; import 'app_localizations_zh.dart'; // ignore_for_file: type=lint @@ -92,6 +95,9 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ Locale('en'), + Locale('ja'), + Locale('ko'), + Locale('ru'), Locale('zh') ]; @@ -1209,7 +1215,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'ja', 'ko', 'ru', 'zh'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -1221,6 +1227,9 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'ja': return AppLocalizationsJa(); + case 'ko': return AppLocalizationsKo(); + case 'ru': return AppLocalizationsRu(); case 'zh': return AppLocalizationsZh(); } diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart new file mode 100644 index 00000000..8c4d33a2 --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ja.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppLocalizationsJa extends AppLocalizations { + AppLocalizationsJa([String locale = 'ja']) : super(locale); + + @override + String get widgetCollection => 'ウィジェットコレクション'; + + @override + String get paintCollection => '描画コレクション'; + + @override + String get knowledgeCollection => '知識集'; + + @override + String get treasureTools => 'ツールボックス'; + + @override + String get collectCollection => 'コレクション集'; + + @override + String get essentialCollection => '要点集'; + + @override + String get homeAccount => 'アプリ情報'; + + @override + String get homeAccountTabInfo => 'アプリについて'; + + @override + String get homeAccountTabMe => '本王に連絡'; + + @override + String get homeAccountSupport => 'プロジェクトをサポート'; + + @override + String get searchWidget => 'ウィジェットを検索'; + + @override + String get stateless => 'ステートレス'; + + @override + String get stateful => 'ステートフル'; + + @override + String get single => 'シングルレンダリング'; + + @override + String get multi => 'マルチレンダリング'; + + @override + String get sliver => 'スライバー'; + + @override + String get proxy => 'プロキシ'; + + @override + String get other => 'その他'; + + @override + String get homeTabWidget => 'ウィジェット'; + + @override + String get homeTabPaint => '描画'; + + @override + String get homeTabKnowledge => '知識'; + + @override + String get homeTabTools => 'ツール'; + + @override + String get homeTabMine => 'マイ'; + + @override + String get dataManagement => 'データ管理'; + + @override + String get userCollection => 'マイコレクション'; + + @override + String get aboutApplications => 'アプリについて'; + + @override + String get contactThisKing => '本王に連絡'; + + @override + String get appSettings => 'アプリ設定'; + + @override + String get darkMode => 'ダークモード'; + + @override + String get themeColorSetting => 'テーマカラー設定'; + + @override + String get fontSetting => 'フォント設定'; + + @override + String get settingLanguageText => '多言語'; + + @override + String get codeHighlightStyle => 'コードハイライトスタイル'; + + @override + String get versionInformation => 'バージョン情報'; + + @override + String get displayPerformanceFloatingLayer => 'パフォーマンスフローティングレイヤーを表示'; + + @override + String get showFloatingTools => 'フローティングツールを表示'; + + @override + String get followSystem => 'システムに従う'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '有効にすると、システムに従ってダークモードをオンまたはオフにします'; + + @override + String get manualSetting => '手動設定'; + + @override + String get lightMode => 'ライトモード'; + + @override + String get settingLanguage => '言語設定'; + + @override + String get appDetails => 'アプリ詳細'; + + @override + String get checkUpdate => '新しいバージョンを確認'; + + @override + String get downloadNewVersion => '新しいバージョンをダウンロード'; + + @override + String get downloadingNewVersion => '新しいバージョンをダウンロード中...'; + + @override + String get currentIsNew => '現在のアプリは最新バージョンです!'; + + @override + String get checkDatabaseNewVersion => 'データベースの新しいバージョンを確認'; + + @override + String get viewThisProjectGithubRepository => '《このプロジェクトのGithubリポジトリを表示》'; + + @override + String get favorite => 'お気に入り'; + + @override + String get enterComponentName => 'コンポーネント名を入力'; + + @override + String get containerComponents => 'コンテナコンポーネント'; + + @override + String get componentTavern => 'コンポーネント酒場'; + + @override + String get cherishedComponents => '大切なコンポーネント'; + + @override + String get textImageCollection => 'テキスト画像集'; + + @override + String get layoutCollection => 'レイアウト集'; + + @override + String get eventCollection => 'イベント集'; + + @override + String get animationCollection => 'アニメーション集'; + + @override + String get slidingCollection => 'スライド集'; + + @override + String get decorationCollection => '装飾集'; + + @override + String get assemblyCollection => 'アセンブリ集'; + + @override + String get functionCollection => '機能集'; + + @override + String get popupCollection => 'ポップアップ集'; + + @override + String get themeCollection => 'テーマ集'; + + @override + String get derivativeCollection => '派生集'; + + @override + String get hardToCategorize => '分類が難しい'; + + @override + String get basicDrawing => '基本描画'; + + @override + String get basicDrawingDesc => '基本的な図形描画のケースを収録しています。これらのケースは、描画を始めたばかりのプログラマーにとって非常に役立ちます。これらのケースを通じて、点、線、矩形、円、円弧、テキスト、画像などの基本的な図形の描画方法を学び、Canvas、Paint、Pathなどの描画の核心オブジェクトの使用方法を理解できます。'; + + @override + String get animationGesture => 'アニメーションとジェスチャー'; + + @override + String get animationGestureDesc => 'アニメーションとジェスチャーの描画ケースを収録しています。これらのケースは、描画をより操作可能にします。これらのケースを通じて、スライド、回転、拡大縮小、移動などの効果を学び、描画が静的な表現だけでなくなることを理解できます。'; + + @override + String get particleDrawing => '粒子描画'; + + @override + String get particleDrawingDesc => '粒子関連の描画ケースを収録しています。これらのケースは、描画のトップレベルの操作です。これらのケースを通じて、粒子を使用して驚くべき視覚効果を描画する方法を学び、粒子時計、粒子爆発、粒子背景などの効果を実現し、描画に無限の可能性を与えます。'; + + @override + String get interestingDrawing => '面白い描画'; + + @override + String get interestingDrawingDesc => 'いくつかの面白い描画ケースを収録しています。ここで一緒に描画の楽しさ、プログラミングの楽しさ、そして知恵の楽しさを体験しましょう。'; + + @override + String get artGallery => 'アートギャラリー'; + + @override + String get artGalleryDesc => '殿堂級の描画ケースを収録しています。これらのケースは、描画の頂点作品であり、それらは実用性がなく、いかなるニーズのためでもありません。それらは存在するために存在し、人間の知恵と表現の媒体であり、芸術と呼ばれます。'; + + @override + String get drawingOfImages => 'このサンプルでは、画像を描画する方法を紹介します。画像をロードし、指定された領域に画像リソースを描画します。上層に45度傾いたグリッド線を描画し、線の描画を練習します。'; + + @override + String get digitalDisplayTube => 'このサンプルでは、LEDデジタル表示管を描画する方法を紹介し、パスPathの使用、変換、組み合わせ、およびコンポーネントのカプセル化の知識を練習します。非常に良い描画ケースです。'; + + @override + String get pathDrawing => 'このサンプルでは、簡単なパスの描画とキャンバスの回転を紹介し、アニメーションと組み合わせて風車を回転させます。これは、描画とアニメーションを組み合わせた非常に簡潔なケースです。'; + + @override + String get gridCoordinateSystem => 'このサンプルでは、線パスとテキストを使用してグリッド座標系を描画し、描画オブジェクトをカプセル化して再利用しやすくします。座標系は描画時に参考を提供し、入門に最適です。'; + + @override + String get polarCoordinateSystemOfFaces => 'このサンプルでは、平面の極座標系を使用して描画し、関数方程式に基づいて極座標を収集して描画する方法を紹介します。'; + + @override + String get drawFunctionCurvesForPathPairs => 'このサンプルでは、パスを使用して関数曲線を描画し、関数曲線上の少数の点をベジェ曲線でフィッティングする方法を紹介します。'; + + @override + String get drawRegularPolygons => 'このサンプルでは、円内で点を収集し、正多角形を描画する方法を紹介します。描画とパス形成の練習に最適なケースです。\n特殊操作:+、- で辺の数を変更'; + + @override + String get randomNumberProcessing => 'このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。'; + + @override + String get clockDrawing => 'このサンプルでは、時計の描画を通じて、Flutterでの回転目盛りの描画テクニックを練習し、アニメーションで時計の針を回転させます。'; + + @override + String get drawSprings => 'このサンプルでは、バネを描画し、垂直にドラッグして伸縮し、手を離すと復元アニメーションを行う方法を紹介します。非常に良い総合的な小ケースです。特殊操作:上下にドラッグしてバネを伸縮'; + + @override + String get theApplicationOfAnglesInDrawing => 'このサンプルでは、ある点を中心に回転運動を行う方法を紹介します。これにより、2点間の角度を描画に適用する方法を学びます。\n特殊操作:クリックして実行'; + + @override + String get usingShadersAndFilters => 'このサンプルでは、描画でシェーダーとフィルターを使用し、アニメーションで数値を変化させて回転する光の効果を実現する方法を紹介します。'; + + @override + String get pathDrawingFunctionCurve => 'このサンプルでは、パスを使用して関数曲線を描画し、パス測定を使用してアニメーションを行う方法を紹介します。'; + + @override + String get thePathOfBingDwenDwen => 'このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンのパスを描画し、パス測定を使用してアニメーションを行います。\n特殊操作:クリックして実行'; + + @override + String get drawCubicBesselCurve => 'このサンプルでは、3次ベジェ曲線を描画し、タッチポイントを使用してある点がアクティブかどうかを判断し、それに応じて点の位置を制御してドラッグ制御効果を実現する方法を紹介します。\n特殊操作:クリックで点を描画、ダブルクリックでクリア'; + + @override + String get theEffectOfAnimationCurve => 'このサンプルでは、アニメーションカーブの効果を直感的に確認し、アニメーションに対する理解を深めます。\n特殊操作:クリックして実行'; + + @override + String get randomParticlesAndBoundaryBouncing => 'このサンプルでは、ランダムな粒子を作成し、境界でのバウンスロジックを処理する方法を紹介します。粒子運動を学ぶのに非常に良い入門ケースです。特殊操作:クリックで停止/実行'; + + @override + String get particleCollision => 'このサンプルでは、個々の粒子の衝突検出を行い、複数の粒子に分裂させる方法を紹介します。非常に面白いケースです。\n特殊操作:クリックでリセット'; + + @override + String get particle => 'このサンプルでは、画像を粒子として表現し、粒子にアニメーションを適用して爆発効果を実現する方法を紹介します。\n特殊操作:クリックして実行'; + + @override + String get rectangleAndRandomNumbers => 'このサンプルでは、矩形の描画と乱数処理を紹介します。点の集合を使用して矩形の位置情報を決定し、それを描画します。データの制御能力を練習できます。\n特殊操作:クリックしてランダム生成'; + + @override + String get bingDwenDwen => 'このサンプルでは、2022年北京冬季オリンピックのマスコットであるビンドゥンドゥンの形を描画し、パス描画やグラデーションなどの知識を学びます。'; + + @override + String get pufengInjectionTest => 'このサンプルでは、蒲豊の針投げテストのプロセスを実装し、確率を使用して円周率を推定します。描画の小技やデータの論理処理を学ぶことができます。'; + + @override + String get ticTacToe => 'このサンプルでは、三目並べの描画と論理検証を通じて、ジェスチャー、描画、アニメーション、検証などの重要なスキルを組み合わせます。非常に良い練習ケースです。\n特殊操作:ダブルクリックでリセット'; + + @override + String get tiledLines => 'このサンプルは、generativeartistry.comのtiled-linesに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get joyDivision => 'このサンプルは、generativeartistry.comのjoy-divisionに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get cubicDisarray => 'このサンプルは、generativeartistry.comのcubic-disarrayに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get triangularMesh => 'このサンプルは、generativeartistry.comのtriangular-meshに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get unDeuxTrois => 'このサンプルは、generativeartistry.comのun-deux-troisに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get circlePacking => 'このサンプルは、generativeartistry.comのcircle-packingに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get hypnoticSquares => 'このサンプルは、generativeartistry.comのhypnotic-squaresに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get pietMondrian => 'このサンプルは、generativeartistry.comのpiet-mondrianに由来し、xrr2016がFlutterで実装しました。リポジトリアドレス:flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '使用方法:\n1. iconfont.cnでアイコンを選び、プロジェクトに追加し、圧縮パッケージをダウンロードします。\n2. Flutterプロジェクトのアドレスを選択し、リソースと生成物ファイルの場所を設定します。\n3. コード生成ボタンをクリックすると、関連するコードが生成されます。'; + + @override + String get qAIssues => '要点集録のQAデータは、rUnitのpointタグが付いたissuesに収録されています。データを提供する必要がある場合は、issuesで質問してください。'; + + @override + String get tips => '注:'; + + @override + String get visualSorting => '可視化ソート'; + + @override + String get visual => '可視ソート'; + + @override + String get insertion => '挿入ソート'; + + @override + String get bubble => 'バブルソート'; + + @override + String get cocktail => 'カクテルソート(双方向バブルソート)'; + + @override + String get comb => 'コームソート'; + + @override + String get pigeonHole => '鳩の巣ソート'; + + @override + String get shell => 'シェルソート'; + + @override + String get selection => '選択ソート'; + + @override + String get gnome => 'ノームソート'; + + @override + String get cycle => 'サイクルソート'; + + @override + String get heap => 'ヒープソート'; + + @override + String get quick => 'クイックソート'; + + @override + String get merge => 'マージソート'; + + @override + String get sortingAlgorithmConfiguration => 'ソートアルゴリズム設定'; + + @override + String get dataCount => 'データ数(個数)'; + + @override + String get timeInterval => '時間間隔(マイクロ秒)'; + + @override + String get randomSeed => 'ランダムシード'; + + @override + String get codeGeneration => 'コード生成'; + + @override + String get generateCode => 'コードを生成'; + + @override + String get artifactLocation => '生成物の場所'; + + @override + String get codeClassLocation => 'コードクラスの保存場所'; + + @override + String get resourceDirectory => 'リソースディレクトリ'; + + @override + String get iconfontResourceLocation => 'iconfontリソースの保存場所'; + + @override + String get projectPath => 'プロジェクトパス'; + + @override + String get inputProjectAddress => 'プロジェクトアドレスを選択または入力してください'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont圧縮パッケージのパス'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'iconfontのダウンロードした圧縮パッケージのパスを選択または入力してください'; + + @override + String get stayTuned => 'お楽しみに'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'データクラス'; + + @override + String get stateManagement => '状態管理'; + + @override + String get jsonParsing => 'Json解析'; + + @override + String get clickHereToJump => 'ここをクリックしてジャンプ'; + + @override + String get knowledgeTabToly => 'ジェット文庫'; + + @override + String get knowledgeTabAlgo => 'アルゴリズム演繹'; + + @override + String get knowledgeTabLayout => 'レイアウト宝庫'; + + @override + String get knowledgeTabPoint => '要点宝庫'; + + @override + String get knowledgeConstruction => '建設中'; + + @override + String get knowledgeToJuejin => '掘金へ'; + + @override + String get srcPath => 'ソースアドレス'; + + @override + String get widgetsInn => 'ウィジェット酒場'; + + @override + String get likedWidgets => '大切なウィジェット'; + + @override + String get relatedComponents => '関連コンポーネント'; + + @override + String get backupFavoritesCollectionData => 'お気に入りコレクションデータのバックアップ'; + + @override + String get syncFavoritesCollectionData => 'お気に入りコレクションデータの同期'; + + @override + String get favoritesCollectionDataReset => 'お気に入りコレクションデータのリセット'; + + @override + String get resetSuccess => 'リセット成功!'; + + @override + String get dataSetBackupSuccess => 'データセットのバックアップ成功!'; + + @override + String get dataSetBackupFailure => 'データセットのバックアップ失敗!'; + + @override + String get dataSynchronizationCopySuccess => 'データ同期コピー成功!'; + + @override + String get dataSynchronizationCopyFailure => 'データ同期コピー失敗!'; + + @override + String get destructionRed => '破滅の赤'; + + @override + String get rageOrange => '怒りのオレンジ'; + + @override + String get warningYellow => '警告の黄'; + + @override + String get camouflageGreen => '偽装の緑'; + + @override + String get coldBlue => '冷徹な青'; + + @override + String get infiniteBlue => '無限の藍'; + + @override + String get mysteryPurple => '神秘の紫'; + + @override + String get destinyBlack => '帰宿の黒'; + + @override + String get showBackground => '背景を表示'; + + @override + String get toly => '張風捷特烈'; + + @override + String get dartHandbook => 'Dart 手引き'; + + @override + String get codeCopiedSuccessfully => 'コードがコピーされました'; + + @override + String get favoriteFolderManagement => 'お気に入りフォルダの管理'; + + @override + String get assembly => 'コンポーネント'; + + @override + String get draw => '描画'; + + @override + String get knowledge => '知識'; + + @override + String get collection => 'コレクション'; + + @override + String get my => '私の'; + + @override + String get picture => '枚'; + + @override + String get widgetInn => 'コンポーネント酒場'; + + @override + String get emptySearch => 'データがありません、俺もどうしようもない\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '友よ、何か検索しよう…≧◔◡◔≦'; + + @override + String get slogan => 'Flutterの連携、プログラマーの連携'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart new file mode 100644 index 00000000..5cd7f792 --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ko.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppLocalizationsKo extends AppLocalizations { + AppLocalizationsKo([String locale = 'ko']) : super(locale); + + @override + String get widgetCollection => '위젯 컬렉션'; + + @override + String get paintCollection => '그림 컬렉션'; + + @override + String get knowledgeCollection => '지식 모음'; + + @override + String get treasureTools => '도구 보물상자'; + + @override + String get collectCollection => '컬렉션 모음'; + + @override + String get essentialCollection => '핵심 모음'; + + @override + String get homeAccount => '앱 정보'; + + @override + String get homeAccountTabInfo => '앱 정보'; + + @override + String get homeAccountTabMe => '저에게 연락'; + + @override + String get homeAccountSupport => '프로젝트 지원'; + + @override + String get searchWidget => '위젯 검색'; + + @override + String get stateless => '무상태'; + + @override + String get stateful => '상태 있음'; + + @override + String get single => '단일 렌더링'; + + @override + String get multi => '다중 렌더링'; + + @override + String get sliver => '슬라이버'; + + @override + String get proxy => '프록시'; + + @override + String get other => '기타'; + + @override + String get homeTabWidget => '위젯'; + + @override + String get homeTabPaint => '그리기'; + + @override + String get homeTabKnowledge => '지식'; + + @override + String get homeTabTools => '도구'; + + @override + String get homeTabMine => '내 정보'; + + @override + String get dataManagement => '데이터 관리'; + + @override + String get userCollection => '내 컬렉션'; + + @override + String get aboutApplications => '앱 정보'; + + @override + String get contactThisKing => '저에게 연락'; + + @override + String get appSettings => '앱 설정'; + + @override + String get darkMode => '다크 모드'; + + @override + String get themeColorSetting => '테마 색상 설정'; + + @override + String get fontSetting => '폰트 설정'; + + @override + String get settingLanguageText => '다국어'; + + @override + String get codeHighlightStyle => '코드 하이라이트 스타일'; + + @override + String get versionInformation => '버전 정보'; + + @override + String get displayPerformanceFloatingLayer => '성능 플로팅 레이어 표시'; + + @override + String get showFloatingTools => '플로팅 도구 표시'; + + @override + String get followSystem => '시스템 따라가기'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => '시스템 설정에 따라 다크 모드를 켜거나 끕니다.'; + + @override + String get manualSetting => '수동 설정'; + + @override + String get lightMode => '라이트 모드'; + + @override + String get settingLanguage => '언어 설정'; + + @override + String get appDetails => '앱 상세 정보'; + + @override + String get checkUpdate => '새 버전 확인'; + + @override + String get downloadNewVersion => '새 버전 다운로드'; + + @override + String get downloadingNewVersion => '새 버전 다운로드 중...'; + + @override + String get currentIsNew => '현재 버전이 최신입니다!'; + + @override + String get checkDatabaseNewVersion => '데이터베이스 새 버전 확인'; + + @override + String get viewThisProjectGithubRepository => '《이 프로젝트의 Github 저장소 보기》'; + + @override + String get favorite => '즐겨찾기'; + + @override + String get enterComponentName => '컴포넌트 이름 입력'; + + @override + String get containerComponents => '컨테이너 컴포넌트'; + + @override + String get componentTavern => '컴포넌트 선술집'; + + @override + String get cherishedComponents => '소중한 컴포넌트'; + + @override + String get textImageCollection => '텍스트 이미지 모음'; + + @override + String get layoutCollection => '레이아웃 모음'; + + @override + String get eventCollection => '이벤트 모음'; + + @override + String get animationCollection => '애니메이션 모음'; + + @override + String get slidingCollection => '슬라이딩 모음'; + + @override + String get decorationCollection => '장식 모음'; + + @override + String get assemblyCollection => '조립 모음'; + + @override + String get functionCollection => '기능 모음'; + + @override + String get popupCollection => '팝업 모음'; + + @override + String get themeCollection => '테마 모음'; + + @override + String get derivativeCollection => '파생 모음'; + + @override + String get hardToCategorize => '분류하기 어려움'; + + @override + String get basicDrawing => '기본 그리기'; + + @override + String get basicDrawingDesc => '기본 도형 그리기 예제를 포함합니다. 이 예제들은 그리기를 처음 접하는 프로그래머에게 매우 친숙할 것입니다. 이 예제들을 통해 점, 선, 사각형, 원, 호, 텍스트, 이미지 등 기본 도형을 그리는 방법을 배우고, Canvas, Paint, Path 등 그리기의 핵심 객체 사용법을 익힐 수 있습니다.'; + + @override + String get animationGesture => '애니메이션 제스처'; + + @override + String get animationGestureDesc => '애니메이션과 제스처 그리기 예제를 포함합니다. 이 예제들은 그리기를 더욱 상호작용적으로 만듭니다. 이 예제들을 통해 슬라이드, 회전, 확대/축소, 이동 등의 효과를 배울 수 있으며, 그리기가 단순히 정적인 표현이 아니게 됩니다.'; + + @override + String get particleDrawing => '입자 그리기'; + + @override + String get particleDrawingDesc => '입자 관련 그리기 예제를 포함합니다. 이 예제들은 그리기의 최고 수준의 작업입니다. 이 예제들을 통해 입자를 사용하여 놀라운 시각적 효과를 그리는 방법을 배울 수 있습니다. 입자 시계, 입자 폭발, 입자 배경 등 다양한 효과를 통해 그리기의 무한한 가능성을 경험할 수 있습니다.'; + + @override + String get interestingDrawing => '재미있는 그리기'; + + @override + String get interestingDrawingDesc => '재미있는 그리기 예제를 포함합니다. 여기서 그리기, 프로그래밍, 지혜의 즐거움을 함께 경험해 보세요.'; + + @override + String get artGallery => '예술 갤러리'; + + @override + String get artGalleryDesc => '최고 수준의 그리기 예제를 포함합니다. 이 예제들은 그리기의 정점에 있는 작품들로, 실용성은 없지만 존재 자체로 의미가 있는 예술 작품입니다.'; + + @override + String get drawingOfImages => '이 예제는 이미지를 그리는 방법을 소개합니다: 이미지를 로드하고 지정된 영역에 그립니다. 상단에 45도 각도의 그리드 선을 그려 선 그리기를 연습합니다.'; + + @override + String get digitalDisplayTube => '이 예제는 LED 디지털 디스플레이 튜브를 그리는 방법을 소개하며, Path 사용, 변환, 조합 및 컴포넌트 캡슐화를 연습합니다. 매우 좋은 그리기 예제입니다.'; + + @override + String get pathDrawing => '이 예제는 간단한 경로 그리기 및 캔버스 회전을 소개하며, 애니메이션을 결합하여 풍차를 회전시킵니다. 매우 간결한 그리기와 애니메이션 결합 예제입니다.'; + + @override + String get gridCoordinateSystem => '이 예제는 선 경로와 텍스트를 사용하여 그리드 좌표계를 그리는 방법을 소개하며, 그리기 객체를 캡슐화하여 재사용하기 쉽게 만듭니다. 좌표계는 그리기 시 참조를 제공하며, 입문자에게 필수입니다.'; + + @override + String get polarCoordinateSystemOfFaces => '이 예제는 평면의 극좌표계를 그리는 방법을 소개하며, 함수 방정식에 따라 극좌표를 수집하여 그립니다.'; + + @override + String get drawFunctionCurvesForPathPairs => '이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 함수 곡선 상의 소량의 점을 베지어 곡선으로 피팅합니다.'; + + @override + String get drawRegularPolygons => '이 예제는 원 안에서 점을 수집하여 정다각형을 그리는 방법을 소개하며, 그리기 및 경로 형성 연습에 매우 좋은 예제입니다.\n특수 조작: +, - 로 변 수정'; + + @override + String get randomNumberProcessing => '이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.'; + + @override + String get clockDrawing => '이 예제는 시계 그리기를 통해 Flutter에서 회전 눈금 그리기 기술을 연습하고, 애니메이션을 통해 시계 바늘이 회전하도록 합니다.'; + + @override + String get drawSprings => '이 예제는 스프링을 그리는 방법을 소개하며, 수직 드래그로 스프링을 늘이거나 줄이고, 놓을 때 복원 애니메이션을 수행합니다. 매우 좋은 종합 예제입니다. 특수 조작: 위아래 드래그로 스프링 늘이기/줄이기'; + + @override + String get theApplicationOfAnglesInDrawing => '이 예제는 특정 점을 중심으로 회전 운동을 수행하는 방법을 소개합니다. 이를 통해 두 점 사이의 각도가 그리기에서 어떻게 적용되는지 배울 수 있습니다.\n특수 조작: 클릭하여 실행'; + + @override + String get usingShadersAndFilters => '이 예제는 그리기에서 셰이더와 필터를 사용하는 방법을 소개하며, 애니메이션을 통해 수치를 변경하여 회전하는 빛의 효과를 만듭니다.'; + + @override + String get pathDrawingFunctionCurve => '이 예제는 경로를 사용하여 함수 곡선을 그리는 방법을 소개하며, 경로 측정을 사용하여 애니메이션을 만듭니다.'; + + @override + String get thePathOfBingDwenDwen => '이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 경로를 그리며, 경로 측정을 사용하여 애니메이션을 만듭니다.\n특수 조작: 클릭하여 실행'; + + @override + String get drawCubicBesselCurve => '이 예제는 3차 베지어 곡선을 그리는 방법을 소개하며, 접점을 통해 특정 점이 활성화되었는지 판단하여 점의 위치를 제어합니다.\n특수 조작: 클릭하여 점 그리기, 더블 클릭하여 지우기'; + + @override + String get theEffectOfAnimationCurve => '이 예제는 애니메이션 곡선의 효과를 직관적으로 보여줍니다. 이를 통해 애니메이션에 대한 이해를 높일 수 있습니다.\n특수 조작: 클릭하여 실행'; + + @override + String get randomParticlesAndBoundaryBouncing => '이 예제는 무작위 입자를 생성하고 경계에서 튕기는 로직을 처리하는 방법을 소개합니다. 입자 운동을 배우기에 매우 좋은 입문 예제입니다. 특수 조작: 클릭하여 정지/실행'; + + @override + String get particleCollision => '이 예제는 개별 입자에 대한 충돌 감지를 수행하고, 여러 입자로 분열시키는 방법을 소개합니다. 매우 재미있는 예제입니다.\n특수 조작: 클릭하여 재설정'; + + @override + String get particle => '이 예제는 이미지를 입자로 표현하고, 입자에 애니메이션을 적용하여 폭발 효과를 만드는 방법을 소개합니다.\n특수 조작: 클릭하여 실행'; + + @override + String get rectangleAndRandomNumbers => '이 예제는 사각형 그리기 및 난수 처리를 소개합니다. 점 집합을 통해 사각형 위치 정보를 결정하고 그립니다. 데이터 제어 능력을 연습할 수 있습니다.\n특수 조작: 클릭하여 무작위 생성'; + + @override + String get bingDwenDwen => '이 예제는 2022년 베이징 동계 올림픽 마스코트 빙둔둔의 형태를 그리는 방법을 소개하며, 경로 그리기 및 그라데이션 색상 사용법을 배울 수 있습니다.'; + + @override + String get pufengInjectionTest => '이 예제는 푸펑 투시험의 테스트 과정을 구현하며, 확률을 통해 원주율을 추정합니다. 그리기 기술 및 데이터 논리 처리 방법을 배울 수 있습니다.'; + + @override + String get ticTacToe => '이 예제는 틱택토 그리기 및 논리 검증을 통해 제스처, 그리기, 애니메이션, 검증 등의 중요한 기술을 종합적으로 연습할 수 있는 매우 좋은 예제입니다.\n특수 조작: 더블 클릭하여 재설정'; + + @override + String get tiledLines => '이 예제는 generativeartistry.com의 tiled-lines에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get joyDivision => '이 예제는 generativeartistry.com의 joy-division에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get cubicDisarray => '이 예제는 generativeartistry.com의 cubic-disarray에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get triangularMesh => '이 예제는 generativeartistry.com의 triangular-mesh에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get unDeuxTrois => '이 예제는 generativeartistry.com의 un-deux-trois에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get circlePacking => '이 예제는 generativeartistry.com의 circle-packing에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get hypnoticSquares => '이 예제는 generativeartistry.com의 hypnotic-squares에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get pietMondrian => '이 예제는 generativeartistry.com의 piet-mondrian에서 유래되었으며, xrr2016이 Flutter로 구현했습니다. 저장소 주소: flutter-generative-artistry'; + + @override + String get downloadCompressedPackage => '사용 방법:\n1. iconfont.cn에서 아이콘을 선택하고 프로젝트에 추가한 후 압축 파일을 다운로드합니다.\n2. Flutter 프로젝트 경로를 선택하고 리소스 및 산출물 파일 위치를 설정합니다.\n3. 코드 생성 버튼을 클릭하여 관련 코드를 생성합니다.'; + + @override + String get qAIssues => '핵심 모음의 QA 데이터는 rUnit의 point 태그가 있는 issues에 포함되어 있습니다. 데이터를 제공하려면 issues에서 질문하세요.'; + + @override + String get tips => '참고:'; + + @override + String get visualSorting => '시각적 정렬'; + + @override + String get visual => '시각적 정렬'; + + @override + String get insertion => '삽입 정렬'; + + @override + String get bubble => '버블 정렬'; + + @override + String get cocktail => '칵테일 정렬(양방향 버블 정렬)'; + + @override + String get comb => '빗질 정렬'; + + @override + String get pigeonHole => '비둘기집 정렬'; + + @override + String get shell => '셸 정렬'; + + @override + String get selection => '선택 정렬'; + + @override + String get gnome => '노움 정렬'; + + @override + String get cycle => '순환 정렬'; + + @override + String get heap => '힙 정렬'; + + @override + String get quick => '퀵 정렬'; + + @override + String get merge => '병합 정렬'; + + @override + String get sortingAlgorithmConfiguration => '정렬 알고리즘 설정'; + + @override + String get dataCount => '데이터 수(개수)'; + + @override + String get timeInterval => '시간 간격(마이크로초)'; + + @override + String get randomSeed => '무작위 시드'; + + @override + String get codeGeneration => '코드 생성'; + + @override + String get generateCode => '코드 생성'; + + @override + String get artifactLocation => '산출물 위치'; + + @override + String get codeClassLocation => '코드 클래스 위치'; + + @override + String get resourceDirectory => '리소스 디렉토리'; + + @override + String get iconfontResourceLocation => 'iconfont 리소스 위치'; + + @override + String get projectPath => '프로젝트 경로'; + + @override + String get inputProjectAddress => '프로젝트 주소를 선택하거나 입력하세요'; + + @override + String get iconfontCompressedPackagePath => 'Iconfont 압축 파일 경로'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'iconfont 다운로드 압축 파일 경로를 선택하거나 입력하세요'; + + @override + String get stayTuned => '기대해 주세요'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => '데이터 클래스'; + + @override + String get stateManagement => '상태 관리'; + + @override + String get jsonParsing => 'Json 파싱'; + + @override + String get clickHereToJump => '여기를 클릭하여 이동'; + + @override + String get knowledgeTabToly => '제트 문고'; + + @override + String get knowledgeTabAlgo => '알고리즘 연습'; + + @override + String get knowledgeTabLayout => '레이아웃 보물'; + + @override + String get knowledgeTabPoint => '핵심 보물'; + + @override + String get knowledgeConstruction => '구축 중'; + + @override + String get knowledgeToJuejin => 'Juejin으로 이동'; + + @override + String get srcPath => '소스 경로'; + + @override + String get widgetsInn => '위젯 선술집'; + + @override + String get likedWidgets => '소중한 위젯'; + + @override + String get relatedComponents => '관련 컴포넌트'; + + @override + String get backupFavoritesCollectionData => '즐겨찾기 컬렉션 데이터 백업'; + + @override + String get syncFavoritesCollectionData => '즐겨찾기 컬렉션 데이터 동기화'; + + @override + String get favoritesCollectionDataReset => '즐겨찾기 컬렉션 데이터 재설정'; + + @override + String get resetSuccess => '재설정 성공!'; + + @override + String get dataSetBackupSuccess => '데이터 세트 백업 성공!'; + + @override + String get dataSetBackupFailure => '데이터 세트 백업 실패!'; + + @override + String get dataSynchronizationCopySuccess => '데이터 동기화 복사 성공!'; + + @override + String get dataSynchronizationCopyFailure => '데이터 동기화 복사 실패!'; + + @override + String get destructionRed => '파괴의 빨강'; + + @override + String get rageOrange => '분노의 주황'; + + @override + String get warningYellow => '경고의 노랑'; + + @override + String get camouflageGreen => '위장의 초록'; + + @override + String get coldBlue => '냉담의 파랑'; + + @override + String get infiniteBlue => '무한의 남색'; + + @override + String get mysteryPurple => '신비의 보라'; + + @override + String get destinyBlack => '운명의 검정'; + + @override + String get showBackground => '배경 표시'; + + @override + String get toly => '장풍제특렬'; + + @override + String get dartHandbook => 'Dart 핸드북'; + + @override + String get codeCopiedSuccessfully => '코드 복사 성공'; + + @override + String get favoriteFolderManagement => '즐겨찾기 폴더 관리'; + + @override + String get assembly => '컴포넌트'; + + @override + String get draw => '그리기'; + + @override + String get knowledge => '지식'; + + @override + String get collection => '컬렉션'; + + @override + String get my => '내 정보'; + + @override + String get picture => '그림'; + + @override + String get widgetInn => '위젯 선술집'; + + @override + String get emptySearch => '데이터가 없습니다, 형님도 방법이 없어요\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => '형님, 뭘 검색하시겠어요...≧◔◡◔≦'; + + @override + String get slogan => 'Flutter의 연합, 프로그래머의 연합'; +} diff --git a/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart new file mode 100644 index 00000000..ed59e2ec --- /dev/null +++ b/modules/basic_system/l10n/lib/gen_l10n/app_localizations_ru.dart @@ -0,0 +1,560 @@ +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppLocalizationsRu extends AppLocalizations { + AppLocalizationsRu([String locale = 'ru']) : super(locale); + + @override + String get widgetCollection => 'Сборник компонентов'; + + @override + String get paintCollection => 'Сборник рисования'; + + @override + String get knowledgeCollection => 'Сборник знаний'; + + @override + String get treasureTools => 'Сундучок инструментов'; + + @override + String get collectCollection => 'Сборник избранного'; + + @override + String get essentialCollection => 'Сборник ключевых моментов'; + + @override + String get homeAccount => 'Информация о приложении'; + + @override + String get homeAccountTabInfo => 'О приложении'; + + @override + String get homeAccountTabMe => 'Связаться с этим королём'; + + @override + String get homeAccountSupport => 'Проекты поддержки'; + + @override + String get searchWidget => 'Поиск компонентов'; + + @override + String get stateless => 'Без состояния'; + + @override + String get stateful => 'С состоянием'; + + @override + String get single => 'Один рендеринг'; + + @override + String get multi => 'Многократный рендеринг'; + + @override + String get sliver => 'Скользящая панель'; + + @override + String get proxy => 'Прокси'; + + @override + String get other => 'Другие'; + + @override + String get homeTabWidget => 'Компоненты'; + + @override + String get homeTabPaint => 'Рисование'; + + @override + String get homeTabKnowledge => 'Знания'; + + @override + String get homeTabTools => 'Инструменты'; + + @override + String get homeTabMine => 'Мой профиль'; + + @override + String get dataManagement => 'Управление данными'; + + @override + String get userCollection => 'Мои избранные'; + + @override + String get aboutApplications => 'О приложении'; + + @override + String get contactThisKing => 'Связаться с этим королём'; + + @override + String get appSettings => 'Настройки приложения'; + + @override + String get darkMode => 'Тёмный режим'; + + @override + String get themeColorSetting => 'Настройки темы'; + + @override + String get fontSetting => 'Настройки шрифта'; + + @override + String get settingLanguageText => 'Многоязычность'; + + @override + String get codeHighlightStyle => 'Стиль подсветки кода'; + + @override + String get versionInformation => 'Информация о версии'; + + @override + String get displayPerformanceFloatingLayer => 'Показать плавающий слой производительности'; + + @override + String get showFloatingTools => 'Показать плавающие инструменты'; + + @override + String get followSystem => 'Следовать за системой'; + + @override + String get afterOpeningWillFollowTheSystemToOpenOrCloseDarkMode => 'После включения будет следовать за системой для включения или отключения тёмного режима'; + + @override + String get manualSetting => 'Ручные настройки'; + + @override + String get lightMode => 'Светлый режим'; + + @override + String get settingLanguage => 'Настройки языка'; + + @override + String get appDetails => 'Детали приложения'; + + @override + String get checkUpdate => 'Проверить обновление'; + + @override + String get downloadNewVersion => 'Скачать новое обновление'; + + @override + String get downloadingNewVersion => 'Скачивание нового обновления...'; + + @override + String get currentIsNew => 'Текущая версия приложения уже самая новая!'; + + @override + String get checkDatabaseNewVersion => 'Проверить обновление базы данных'; + + @override + String get viewThisProjectGithubRepository => 'Посмотреть репозиторий проекта на Github'; + + @override + String get favorite => 'Добавлено в избранное'; + + @override + String get enterComponentName => 'Введите название компонента'; + + @override + String get containerComponents => 'Контейнерные компоненты'; + + @override + String get componentTavern => 'Таверна компонентов'; + + @override + String get cherishedComponents => 'Ценные компоненты'; + + @override + String get textImageCollection => 'Сборник изображений и текста'; + + @override + String get layoutCollection => 'Сборник макетов'; + + @override + String get eventCollection => 'Сборник событий'; + + @override + String get animationCollection => 'Сборник анимаций'; + + @override + String get slidingCollection => 'Сборник слайдов'; + + @override + String get decorationCollection => 'Сборник декораций'; + + @override + String get assemblyCollection => 'Сборник сборки'; + + @override + String get functionCollection => 'Сборник функций'; + + @override + String get popupCollection => 'Сборник всплывающих окон'; + + @override + String get themeCollection => 'Сборник тем'; + + @override + String get derivativeCollection => 'Сборник производных'; + + @override + String get hardToCategorize => 'Трудно классифицировать'; + + @override + String get basicDrawing => 'Основы рисования'; + + @override + String get basicDrawingDesc => 'Включает несколько примеров базового рисования, которые будут полезны для начинающих программистов. Эти примеры научат рисованию базовых фигур, таких как точки, линии, прямоугольники, круги и текст.'; + + @override + String get animationGesture => 'Анимация жестов'; + + @override + String get animationGestureDesc => 'Содержит примеры рисования анимаций и жестов, которые сделают рисование более интерактивным. Эти примеры научат использовать анимации и жесты, такие как скольжение, вращение, масштабирование и перемещение.'; + + @override + String get particleDrawing => 'Частицы в рисовании'; + + @override + String get particleDrawingDesc => 'Включает примеры рисования с использованием частиц. Эти примеры покажут, как использовать частицы для создания зрелищных эффектов, таких как взрывы или анимации с частицами.'; + + @override + String get interestingDrawing => 'Интересные рисунки'; + + @override + String get interestingDrawingDesc => 'Примеры интересных и забавных рисунков, где мы можем наслаждаться процессом рисования и программирования.'; + + @override + String get artGallery => 'Галерея искусства'; + + @override + String get artGalleryDesc => 'Содержит примеры высокого искусства, которые не предназначены для практических целей, а являются выражением человеческого интеллекта и творчества.'; + + @override + String get drawingOfImages => 'Пример рисования изображений: загрузка изображения и его отрисовка в определенной области. На верхнем слое добавлены линии сетки для практики рисования линий.'; + + @override + String get digitalDisplayTube => 'Пример рисования цифровых трубок с использованием пути Path и анимации.'; + + @override + String get pathDrawing => 'Пример рисования простых путей с анимацией.'; + + @override + String get gridCoordinateSystem => 'Пример рисования сетки координат с линиями и текстом для новичков.'; + + @override + String get polarCoordinateSystemOfFaces => 'Пример рисования полярной координатной системы с использованием функций.'; + + @override + String get drawFunctionCurvesForPathPairs => 'Пример рисования функциональных кривых с использованием пути и Беезье.'; + + @override + String get drawRegularPolygons => 'Пример рисования правильных многоугольников внутри круга.'; + + @override + String get randomNumberProcessing => 'Пример рисования прямоугольников с обработкой случайных чисел.'; + + @override + String get clockDrawing => 'Пример рисования часов с анимацией.'; + + @override + String get drawSprings => 'Пример рисования пружины с анимацией сжатия и растяжения.'; + + @override + String get theApplicationOfAnglesInDrawing => 'Пример рисования с использованием углов для вращения.'; + + @override + String get usingShadersAndFilters => 'Пример использования шейдеров и фильтров для создания анимации.'; + + @override + String get pathDrawingFunctionCurve => 'Пример рисования кривых с помощью пути и измерения анимации.'; + + @override + String get thePathOfBingDwenDwen => 'Пример рисования пути маскота Олимпиады Пекин-2022 с использованием анимации пути.'; + + @override + String get drawCubicBesselCurve => 'Пример рисования кривой кубического Безье с возможностью перетаскивания точек.'; + + @override + String get theEffectOfAnimationCurve => 'Пример демонстрации эффекта анимационной кривой для углубленного понимания анимаций.'; + + @override + String get randomParticlesAndBoundaryBouncing => 'Пример создания случайных частиц с отскоком от границ.'; + + @override + String get particleCollision => 'Пример столкновений частиц с анимацией их распада.'; + + @override + String get particle => 'Пример взрыва изображений с использованием частиц.'; + + @override + String get rectangleAndRandomNumbers => 'Пример рисования прямоугольников с использованием случайных чисел.'; + + @override + String get bingDwenDwen => 'Пример рисования формы маскота Олимпиады Пекин-2022.'; + + @override + String get pufengInjectionTest => 'Пример теста для вычисления числа Пи с использованием вероятности.'; + + @override + String get ticTacToe => 'Пример игры в крестики-нолики с логикой и анимацией.'; + + @override + String get tiledLines => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get joyDivision => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get cubicDisarray => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get triangularMesh => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get unDeuxTrois => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get circlePacking => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get hypnoticSquares => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get pietMondrian => 'Пример, основанный на генеративном искусстве, реализованный с помощью Flutter.'; + + @override + String get downloadCompressedPackage => 'Инструкция по использованию:\n1. Выберите и скачайте иконки на iconfont.cn.\n2. Настройте путь к проекту Flutter.\n3. Нажмите кнопку для генерации кода.'; + + @override + String get qAIssues => 'Данные QA из сборника важных моментов rUnit будут добавлены в issues с меткой point.'; + + @override + String get tips => 'Совет:'; + + @override + String get visualSorting => 'Визуальная сортировка'; + + @override + String get visual => 'Визуальная сортировка'; + + @override + String get insertion => 'Сортировка вставками'; + + @override + String get bubble => 'Пузырьковая сортировка'; + + @override + String get cocktail => 'Коктейльная сортировка'; + + @override + String get comb => 'Сортировка расческой'; + + @override + String get pigeonHole => 'Сортировка по принципу дырок для голубей'; + + @override + String get shell => 'Сортировка Шелла'; + + @override + String get selection => 'Сортировка выбором'; + + @override + String get gnome => 'Сортировка гномом'; + + @override + String get cycle => 'Циклическая сортировка'; + + @override + String get heap => 'Сортировка кучей'; + + @override + String get quick => 'Быстрая сортировка'; + + @override + String get merge => 'Сортировка слиянием'; + + @override + String get sortingAlgorithmConfiguration => 'Настройки сортировки'; + + @override + String get dataCount => 'Количество данных'; + + @override + String get timeInterval => 'Интервал времени'; + + @override + String get randomSeed => 'Случайное зерно'; + + @override + String get codeGeneration => 'Генерация кода'; + + @override + String get generateCode => 'Сгенерировать код'; + + @override + String get artifactLocation => 'Местоположение артефакта'; + + @override + String get codeClassLocation => 'Местоположение класса кода'; + + @override + String get resourceDirectory => 'Каталог ресурсов'; + + @override + String get iconfontResourceLocation => 'Местоположение ресурсов iconfont'; + + @override + String get projectPath => 'Путь проекта'; + + @override + String get inputProjectAddress => 'Выберите или введите путь к проекту'; + + @override + String get iconfontCompressedPackagePath => 'Путь к сжатию иконок'; + + @override + String get pleaseSelectOrInputIconfontCompressedPackagePath => 'Пожалуйста, выберите или введите путь к сжатому пакету iconfont'; + + @override + String get stayTuned => 'Ожидайте'; + + @override + String get iconFont => 'IconFont'; + + @override + String get dataClass => 'Класс данных'; + + @override + String get stateManagement => 'Управление состоянием'; + + @override + String get jsonParsing => 'Парсинг JSON'; + + @override + String get clickHereToJump => 'Нажмите здесь для перехода'; + + @override + String get knowledgeTabToly => 'Библиотека Jet'; + + @override + String get knowledgeTabAlgo => 'Алгоритмы'; + + @override + String get knowledgeTabLayout => 'Библиотека макетов'; + + @override + String get knowledgeTabPoint => 'Библиотека ключевых моментов'; + + @override + String get knowledgeConstruction => 'На стадии строительства'; + + @override + String get knowledgeToJuejin => 'Перейти на Juejin'; + + @override + String get srcPath => 'Путь к исходному коду'; + + @override + String get widgetsInn => 'Таверна компонентов'; + + @override + String get likedWidgets => 'Избранные компоненты'; + + @override + String get relatedComponents => 'Связанные компоненты'; + + @override + String get backupFavoritesCollectionData => 'Резервное копирование данных избранного'; + + @override + String get syncFavoritesCollectionData => 'Синхронизация данных избранного'; + + @override + String get favoritesCollectionDataReset => 'Сброс данных избранного'; + + @override + String get resetSuccess => 'Сброс успешен!'; + + @override + String get dataSetBackupSuccess => 'Резервное копирование данных прошло успешно!'; + + @override + String get dataSetBackupFailure => 'Ошибка резервного копирования данных!'; + + @override + String get dataSynchronizationCopySuccess => 'Синхронизация данных успешна!'; + + @override + String get dataSynchronizationCopyFailure => 'Ошибка синхронизации данных!'; + + @override + String get destructionRed => 'Красный разрушения'; + + @override + String get rageOrange => 'Оранжевый гнева'; + + @override + String get warningYellow => 'Желтый предупреждения'; + + @override + String get camouflageGreen => 'Зеленый камуфляжа'; + + @override + String get coldBlue => 'Холодный синий'; + + @override + String get infiniteBlue => 'Бесконечный синий'; + + @override + String get mysteryPurple => 'Тайный фиолетовый'; + + @override + String get destinyBlack => 'Черный судьбы'; + + @override + String get showBackground => 'Показать фон'; + + @override + String get toly => 'Толь'; + + @override + String get dartHandbook => 'Руководство Dart'; + + @override + String get codeCopiedSuccessfully => 'Код успешно скопирован'; + + @override + String get favoriteFolderManagement => 'Управление папками избранного'; + + @override + String get assembly => 'Сборка'; + + @override + String get draw => 'Рисование'; + + @override + String get knowledge => 'Знания'; + + @override + String get collection => 'Коллекция'; + + @override + String get my => 'Мои'; + + @override + String get picture => 'Картинка'; + + @override + String get widgetInn => 'Таверна компонентов'; + + @override + String get emptySearch => 'Данных нет, я тоже не знаю, что делать\n(≡ _ ≡)/~┴┴'; + + @override + String get searchSomething => 'Друзья, давайте что-то искать…≧◔◡◔≦'; + + @override + String get slogan => 'Связь Flutter, связь программистов'; +} diff --git a/modules/knowledge_system/note/lib/note.dart b/modules/knowledge_system/note/lib/note.dart index 90e30e16..53d57f65 100644 --- a/modules/knowledge_system/note/lib/note.dart +++ b/modules/knowledge_system/note/lib/note.dart @@ -1,4 +1,5 @@ export 'src/view/view.dart'; export 'src/bloc/bloc.dart'; export 'src/repository/repository.dart'; -export 'src/env/env.dart'; \ No newline at end of file +export 'src/env/env.dart'; +export 'package:flutter_quill/flutter_quill.dart' show FlutterQuillLocalizations; \ No newline at end of file diff --git a/modules/knowledge_system/note/lib/src/view/article_admin.dart b/modules/knowledge_system/note/lib/src/view/article_admin.dart index 3fc51a75..cd689878 100644 --- a/modules/knowledge_system/note/lib/src/view/article_admin.dart +++ b/modules/knowledge_system/note/lib/src/view/article_admin.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_quill/flutter_quill.dart'; import 'package:note/note.dart'; import 'package:tolyui/tolyui.dart'; import 'package:app/app.dart'; @@ -150,6 +151,7 @@ class _ArticleAdminState extends State { ), ), Divider(), + // Expanded(child: RichEditor()), Expanded( child: TextField( style: TextStyle(fontSize: 14), @@ -240,3 +242,31 @@ class _ArticleAdminState extends State { } } + +class RichEditor extends StatefulWidget { + const RichEditor({super.key}); + + @override + State createState() => _RichEditorState(); +} + +class _RichEditorState extends State { + QuillController _controller = QuillController.basic(); + @override + Widget build(BuildContext context) { + return Column( + children: [ + QuillSimpleToolbar( + controller: _controller, + config: const QuillSimpleToolbarConfig(), + ), + Expanded( + child: QuillEditor.basic( + controller: _controller, + config: const QuillEditorConfig(), + ), + ) + ], + ); + } +} diff --git a/modules/knowledge_system/note/pubspec.yaml b/modules/knowledge_system/note/pubspec.yaml index 0cd7efb8..3edac7c5 100644 --- a/modules/knowledge_system/note/pubspec.yaml +++ b/modules/knowledge_system/note/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: fx_dio: 0.0.4 flutter_bloc: ^8.1.6 # 状态管理 two_dimensional_scrollables: ^0.3.3 + flutter_quill: ^11.0.0-dev.21 dev_dependencies: flutter_test: diff --git a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart index 570ea682..68972270 100644 --- a/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart +++ b/modules/widget_system/widget_module/lib/views/components/widget_logo_map.dart @@ -18,6 +18,8 @@ class WidgetLogo extends StatelessWidget { Widget build(BuildContext context) { return Container( width: 110, + height: 110, + alignment: Alignment.center, decoration: BoxDecoration( color: background, gradient: LinearGradient( @@ -30,7 +32,7 @@ class WidgetLogo extends StatelessWidget { topLeft: Radius.circular(6), bottomLeft: Radius.circular(6)), ), child: - SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}'), + SvgPicture.asset('assets/images/widgets/${widgetLogo(widgetName)}',width: 100,), ); } } @@ -42,6 +44,9 @@ String widgetLogo(String widgetName) { 'GestureDetector' => 'GestureDetector.svg', 'Card' => 'Card.svg', 'ListView' => 'ListView.svg', + 'GridView' => 'GridView.svg', + 'SingleChildScrollView' => 'SingleChildScrollView.svg', + 'PageView' => 'PageView.svg', _ => 'Widget.svg', }; } diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json new file mode 100644 index 00000000..b00b56ff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Spaltenlayout", + "info": "Flex-Layout mit vertikaler Ausrichtung, das mehrere Komponenten aufnehmen kann. Alle anderen Eigenschaften sind identisch, siehe Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Grundlegende Verwendung von Column", + "desc": [ + "【children】 : Liste der Komponenten 【List】", + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】 : Textbaseline 【TextBaseline】", + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】 : Hauptachsengröße 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json new file mode 100644 index 00000000..f7250c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Column Layout", + "info": "A Flex layout with a vertical arrangement direction, capable of accommodating multiple components. All other properties are the same, see Flex for details.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Basic Usage of Column", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json new file mode 100644 index 00000000..933b7ab5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Disposición de columna", + "info": "Disposición Flex con dirección vertical, puede contener múltiples componentes. Todas las demás propiedades son iguales, consulte Flex para más detalles.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso básico de Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】 : Línea base del texto 【TextBaseline】", + "【verticalDirection】 : Dirección vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamaño del eje principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json new file mode 100644 index 00000000..105e2a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Disposition en colonne", + "info": "Une disposition Flex avec une orientation verticale, capable de contenir plusieurs composants. Toutes les autres propriétés sont identiques, voir Flex pour plus de détails.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Utilisation de base de Column", + "desc": [ + "【children】 : Liste des composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe secondaire 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json new file mode 100644 index 00000000..b8ca8dff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Layout Colonna", + "info": "Un layout Flex con direzione di disposizione verticale, in grado di contenere più componenti. Tutte le altre proprietà sono le stesse, vedi Flex per maggiori dettagli.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso di base di Column", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json new file mode 100644 index 00000000..a432e054 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "列レイアウト", + "info": "縦方向に配置するFlexレイアウトで、複数のコンポーネントを収容できます。他の属性はすべて同じです。詳細はFlexを参照してください。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Columnの基本的な使用法", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸サイズ 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json new file mode 100644 index 00000000..93f2ed26 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "열 레이아웃", + "info": "세로 방향으로 배열되는 Flex 레이아웃으로, 여러 컴포넌트를 수용할 수 있습니다. 다른 속성은 모두 동일하며, 자세한 내용은 Flex를 참조하십시오.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Column 기본 사용", + "desc": [ + "【children】 : 컴포넌트 목록 【List】", + "【mainAxisAlignment】 : 메인 축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차 축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 세로 방향 【VerticalDirection】", + "【mainAxisSize】 : 메인 축 크기 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json new file mode 100644 index 00000000..937db6d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Layout de Coluna", + "info": "Layout Flex com direção de disposição vertical, pode acomodar vários componentes. Todas as outras propriedades são iguais, consulte Flex para mais detalhes.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso Básico do Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo transversal 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json new file mode 100644 index 00000000..82d8686c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Column/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 96, + "name": "Column", + "localName": "Колонка", + "info": "Гибкий макет с вертикальным направлением размещения, который может содержать несколько компонентов. Все остальные свойства идентичны, подробнее см. Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Основное использование Column", + "desc": [ + "【children】 : Список компонентов 【List】", + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】 : Базовая линия текста 【TextBaseline】", + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】 : Размер главной оси 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json new file mode 100644 index 00000000..0259fe26 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Allgemeines Multi-Kind-Layout", + "info": "Verwenden Sie eine Proxy-Klasse, um das Layout einer Gruppe von Kinderkomponenten zu steuern. Die Kinderkomponenten müssen mit der LayoutId-Komponente gekennzeichnet werden.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Grundlegende Verwendung von CustomMultiChildLayout", + "desc": [ + "【children】 : Kinderkomponentensammlung 【List】", + "【delegate】 : Layout-Proxy 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json new file mode 100644 index 00000000..b93a246d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "General Multi-Child Layout", + "info": "Use a delegate class to control the layout of a set of child components. Child components must be identified using the LayoutId component.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Basic Usage of CustomMultiChildLayout", + "desc": [ + "【children】: Set of child components 【List】", + "【delegate】: Layout delegate 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json new file mode 100644 index 00000000..ab14f34d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Diseño de múltiples hijos genérico", + "info": "Utiliza una clase delegada para controlar el diseño de un conjunto de componentes hijos. Los componentes hijos deben identificarse utilizando el componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso básico de CustomMultiChildLayout", + "desc": [ + "【children】: Conjunto de componentes hijos 【List】", + "【delegate】: Delegado de diseño 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json new file mode 100644 index 00000000..11136463 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Disposition multi-enfants universelle", + "info": "Utilise une classe déléguée pour contrôler la disposition d'un ensemble de composants enfants. Les composants enfants doivent être identifiés à l'aide du composant LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Utilisation de base de CustomMultiChildLayout", + "desc": [ + "【children】 : Ensemble de composants enfants 【List】", + "【delegate】 : Délégué de disposition 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json new file mode 100644 index 00000000..8280c981 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Layout Multi-Figlio Generico", + "info": "Utilizza una classe delegata per controllare il layout di un insieme di componenti figli. I componenti figli devono essere identificati utilizzando il componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso di base di CustomMultiChildLayout", + "desc": [ + "【children】 : Insieme di componenti figli 【List】", + "【delegate】 : Delegato di layout 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json new file mode 100644 index 00000000..fe9199de --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "汎用マルチチャイルドレイアウト", + "info": "プロキシクラスを使用して子コンポーネントセットのレイアウトを制御します。子コンポーネントはLayoutIdコンポーネントで識別する必要があります。", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "CustomMultiChildLayoutの基本使用", + "desc": [ + "【children】 : 子コンポーネントセット 【List】", + "【delegate】 : レイアウトプロキシ 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json new file mode 100644 index 00000000..c21b9496 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "일반 다중 자식 레이아웃", + "info": "프록시 클래스를 사용하여 자식 위젯 집합의 레이아웃을 제어하며, 자식 위젯은 LayoutId 위젯으로 식별되어야 합니다.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "CustomMultiChildLayout 기본 사용", + "desc": [ + "【children】 : 자식 위젯 집합 【List】", + "【delegate】 : 레이아웃 프록시 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json new file mode 100644 index 00000000..09a840f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Layout Multi-Filho Personalizado", + "info": "Usa uma classe delegada para controlar o layout de um conjunto de componentes filhos, os componentes filhos devem ser identificados usando o componente LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Uso Básico do CustomMultiChildLayout", + "desc": [ + "【children】 : Conjunto de componentes filhos 【List】", + "【delegate】 : Delegado de layout 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json new file mode 100644 index 00000000..ad443c2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/CustomMultiChildLayout/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 341, + "name": "CustomMultiChildLayout", + "localName": "Универсальная компоновка с несколькими дочерними элементами", + "info": "Использует класс-делегат для управления компоновкой набора дочерних элементов, дочерние элементы должны быть идентифицированы с помощью компонента LayoutId.", + "lever": 4, + "family": 3, + "linkIds": [ + 315, + 285 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Основное использование CustomMultiChildLayout", + "desc": [ + "【children】 : Набор дочерних элементов 【List】", + "【delegate】 : Делегат компоновки 【MultiChildLayoutDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json new file mode 100644 index 00000000..fa3418e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Flexibles Layout", + "info": "Übergeordnete Klasse von Row und Column, die leistungsstärkste Layout-Methode in Flutter. Kann mehrere Komponenten aufnehmen und kann mit Spacer, Expended, Flexible Komponenten für flexibles Layout verwendet werden", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Ausrichtung von Flex", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【direction】 : Richtung 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Hauptachsenausrichtung von Flex", + "desc": [ + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Kreuzachsenausrichtung von Flex", + "desc": [ + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Vertikale Richtungsreihenfolge von Flex", + "desc": [ + "【verticalDirection】 : Vertikale Richtungsreihenfolge 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Horizontale Richtungsreihenfolge von Flex", + "desc": [ + "【textDirection】 : Horizontale Richtungsreihenfolge 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json new file mode 100644 index 00000000..75a4dfa9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Flex Layout", + "info": "The parent class of Row and Column, the most powerful layout method in Flutter. It can accommodate multiple components and can be used in conjunction with Spacer, Expended, and Flexible components for flexible layout.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flex Direction", + "desc": [ + "【children】: Component list 【List】", + "【direction】: Direction 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex Main Axis Alignment", + "desc": [ + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex Cross Axis Alignment", + "desc": [ + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex Vertical Direction", + "desc": [ + "【verticalDirection】: Vertical direction 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex Horizontal Direction", + "desc": [ + "【textDirection】: Horizontal direction 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json new file mode 100644 index 00000000..1936f39c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Diseño Flexible", + "info": "Clase padre de Row y Column, el método de diseño más potente en Flutter. Puede contener múltiples componentes y se puede usar con los componentes Spacer, Expended y Flexible para un diseño flexible.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Dirección de disposición de Flex", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【direction】 : Dirección 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alineación del eje principal de Flex", + "desc": [ + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alineación del eje transversal de Flex", + "desc": [ + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Orden de dirección vertical de Flex", + "desc": [ + "【verticalDirection】 : Orden de dirección vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Orden de dirección horizontal de Flex", + "desc": [ + "【textDirection】 : Orden de dirección horizontal 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json new file mode 100644 index 00000000..0a6f6f78 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Disposition flexible", + "info": "Classe parente de Row et Column, la méthode de disposition la plus puissante dans Flutter. Peut contenir plusieurs composants, peut être utilisé avec les composants Spacer, Expended, Flexible pour une disposition flexible", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direction de disposition de Flex", + "desc": [ + "【children】 : Liste des composants 【List】", + "【direction】 : Direction 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alignement de l'axe principal de Flex", + "desc": [ + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alignement de l'axe transversal de Flex", + "desc": [ + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordre de direction vertical de Flex", + "desc": [ + "【verticalDirection】 : Ordre de direction vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordre de direction horizontale de Flex", + "desc": [ + "【textDirection】 : Ordre de direction horizontale 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json new file mode 100644 index 00000000..a38b4033 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Layout Flessibile", + "info": "Classe genitore di Row e Column, il metodo di layout più potente in Flutter. Può contenere più componenti e può essere utilizzato con i componenti Spacer, Expended e Flexible per un layout flessibile", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direzione di disposizione di Flex", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【direction】 : Direzione 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Allineamento dell'asse principale di Flex", + "desc": [ + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Allineamento dell'asse trasversale di Flex", + "desc": [ + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordine della direzione verticale di Flex", + "desc": [ + "【verticalDirection】 : Ordine della direzione verticale 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordine della direzione orizzontale di Flex", + "desc": [ + "【textDirection】 : Ordine della direzione orizzontale 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json new file mode 100644 index 00000000..37e83a2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "フレックスレイアウト", + "info": "RowとColumnの親クラス、Flutterで最も強力なレイアウト方法。複数のコンポーネントを収容でき、Spacer、Expended、Flexibleコンポーネントと連携して柔軟なレイアウトを実現できます", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flexの配置方向", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【direction】 : 方向 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex主軸の整列方法", + "desc": [ + "【mainAxisAlignment】 : 主軸整列 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex交差軸の整列方法", + "desc": [ + "【crossAxisAlignment】 : 交差軸整列 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex垂直方向の順序", + "desc": [ + "【verticalDirection】 : 垂直方向の順序 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex水平方向の順序", + "desc": [ + "【textDirection】 : 水平方向の順序 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json new file mode 100644 index 00000000..a0c89888 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "유연한 레이아웃", + "info": "Row와 Column의 상위 클래스, Flutter에서 가장 강력한 레이아웃 방식. 여러 컴포넌트를 수용할 수 있으며, Spacer, Expended, Flexible 컴포넌트와 함께 사용하여 유연한 레이아웃을 구성할 수 있습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flex의 배치 방향", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【direction】 : 방향 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Flex 주축 정렬 방식", + "desc": [ + "【mainAxisAlignment】 : 주축 정렬 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Flex 교차축 정렬 방식", + "desc": [ + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Flex 수직 방향 순서", + "desc": [ + "【verticalDirection】 : 수직 방향 순서 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Flex 수평 방향 순서", + "desc": [ + "【textDirection】 : 수평 방향 순서 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json new file mode 100644 index 00000000..022b95f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Layout Flexível", + "info": "Classe pai de Row e Column, o método de layout mais poderoso no Flutter. Pode conter vários componentes e pode ser usado em conjunto com os componentes Spacer, Expended e Flexible para um layout flexível", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Direção de disposição do Flex", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【direction】 : Direção 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Alinhamento do eixo principal do Flex", + "desc": [ + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Alinhamento do eixo cruzado do Flex", + "desc": [ + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Ordem vertical do Flex", + "desc": [ + "【verticalDirection】 : Ordem vertical 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Ordem horizontal do Flex", + "desc": [ + "【textDirection】 : Ordem horizontal 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json new file mode 100644 index 00000000..4eeff29d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flex/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 94, + "name": "Flex", + "localName": "Гибкий макет", + "info": "Родительский класс для Row и Column, самый мощный способ компоновки во Flutter. Может содержать несколько компонентов, может использоваться вместе с компонентами Spacer, Expended, Flexible для гибкой компоновки", + "lever": 5, + "family": 3, + "linkIds": [ + 95, + 96, + 106, + 107, + 109 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Направление расположения Flex", + "desc": [ + "【children】 : Список компонентов 【List】", + "【direction】 : Направление 【Axis】" + ] + }, + { + "file": "node_02.dart", + "name": "Выравнивание по главной оси Flex", + "desc": [ + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】" + ] + }, + { + "file": "node_03.dart", + "name": "Выравнивание по поперечной оси Flex", + "desc": [ + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】" + ] + }, + { + "file": "node_04.dart", + "name": "Порядок по вертикали Flex", + "desc": [ + "【verticalDirection】 : Порядок по вертикали 【VerticalDirection】" + ] + }, + { + "file": "node_05.dart", + "name": "Порядок по горизонтали Flex", + "desc": [ + "【textDirection】 : Порядок по горизонтали 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json new file mode 100644 index 00000000..9b39ec33 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Fließendes Layout", + "info": "Kann mehrere Komponenten aufnehmen, erfordert die Festlegung eines Delegaten für die Anordnung, ermöglicht eine hochgradige Anpassung der Komponentenanordnung und erreicht Effekte, die mit normalen Layouts nicht möglich sind. Der König der Layouts, zu Recht.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Runde Anordnung mit Flow", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【delegate】 : Delegat 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Runde Anordnung mit Flow und Animation", + "desc": [ + "Erzielt Effekte durch die Änderung der Position umliegender Komponenten mittels Animation" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json new file mode 100644 index 00000000..890475c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Flow Layout", + "info": "Can accommodate multiple components, requires custom arrangement agents, allows high customization of component arrangement, achieving effects that ordinary layouts cannot. The king of layouts, well-deserved.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow Circular Arrangement", + "desc": [ + "【children】: Component list 【List】", + "【delegate】: Agent 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow Circular with Animation", + "desc": [ + "Achieve effects by changing the position of surrounding components through animation" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json new file mode 100644 index 00000000..aa0a65f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Diseño de flujo", + "info": "Puede contener múltiples componentes, requiere que especifiques un delegado para la disposición, permite una alta personalización en la distribución de los componentes, logrando efectos que los diseños comunes no pueden alcanzar. El rey de los diseños, sin duda.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposición circular de Flow", + "desc": [ + "【children】: Lista de componentes 【List】", + "【delegate】: Delegado 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinación de Flow circular con animación", + "desc": [ + "Logra el efecto cambiando la posición de los componentes circundantes a través de la animación" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json new file mode 100644 index 00000000..c7bbb208 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Disposition fluide", + "info": "Peut contenir plusieurs composants, nécessite de définir un délégué pour l'agencement, permet une personnalisation élevée de l'agencement des composants, atteignant des effets impossibles avec des dispositions ordinaires. Le roi des dispositions, sans aucun doute.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposition circulaire Flow", + "desc": [ + "【children】 : Liste des composants 【List】", + "【delegate】 : Délégué 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinaison de Flow circulaire et animation", + "desc": [ + "Modifier la position des composants environnants via une animation pour obtenir l'effet" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json new file mode 100644 index 00000000..1bb53fc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Layout di Flusso", + "info": "Può contenere più componenti, richiede la definizione di un delegato per la disposizione, permette un alto livello di personalizzazione della disposizione dei componenti, raggiungendo effetti che i layout comuni non possono ottenere. Il re dei layout, a pieno titolo.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposizione Circolare di Flow", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【delegate】 : Delegato 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinazione di Flow Circolare e Animazione", + "desc": [ + "Modifica la posizione dei componenti circostanti attraverso l'animazione per ottenere l'effetto desiderato" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json new file mode 100644 index 00000000..37f10f4c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "フローレイアウト", + "info": "複数のコンポーネントを収容でき、自身で配置のプロキシを指定する必要があります。コンポーネントの配置を高度にカスタマイズでき、通常のレイアウトでは実現できない効果を実現します。レイアウトの王者、その名にふさわしい。", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow円形配置", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【delegate】 : プロキシ 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow円形とアニメーションの組み合わせ", + "desc": [ + "アニメーションを使用して周囲のコンポーネントの位置を変更することで効果を実現" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json new file mode 100644 index 00000000..ae91c33a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "플로우 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 배치를 위한 대리자를 직접 지정해야 합니다. 컴포넌트 배치를 고도로 커스터마이징할 수 있어 일반 레이아웃으로는 달성할 수 없는 효과를 구현할 수 있습니다. 레이아웃의 왕, 그 이름에 걸맞습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Flow 원형 배치", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【delegate】 : 대리자 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Flow 원형과 애니메이션 결합", + "desc": [ + "애니메이션을 통해 주변 컴포넌트의 위치를 변경하여 효과를 구현" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json new file mode 100644 index 00000000..c7149aff --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Layout de Fluxo", + "info": "Pode acomodar vários componentes, é necessário definir um agente de disposição, permitindo uma alta personalização da disposição dos componentes, alcançando efeitos que layouts comuns não conseguem. O rei dos layouts, sem dúvida.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Disposição Circular do Flow", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【delegate】 : Agente 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Combinação de Flow Circular com Animação", + "desc": [ + "Alterar a posição dos componentes ao redor através de animação para alcançar o efeito" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json new file mode 100644 index 00000000..b280e78f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Flow/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 99, + "name": "Flow", + "localName": "Макет потока", + "info": "Может вмещать несколько компонентов, требует самостоятельного определения прокси для размещения, позволяет высоко настраивать расположение компонентов, достигая эффектов, недоступных для обычных макетов. Безусловный король макетов.", + "lever": 5, + "family": 3, + "linkIds": [ + 98, + 94 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Круговое расположение Flow", + "desc": [ + "【children】 : Список компонентов 【List】", + "【delegate】 : Прокси 【FlowDelegate】" + ] + }, + { + "file": "node_02.dart", + "name": "Круговое расположение Flow с анимацией", + "desc": [ + "Достижение эффекта путем изменения положения окружающих компонентов с помощью анимации" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json new file mode 100644 index 00000000..f4efeef8 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Indexierter Stapel", + "info": "Unterklasse der Stack-Komponente, kann mehrere Komponenten stapeln und durch den Index die anzuzeigende Komponente angeben, die anderen werden ausgeblendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IndexedStack", + "desc": [ + "【children】 : Liste der Unterkomponenten 【Lis】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【index】 : Aktuell angezeigte Komponente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json new file mode 100644 index 00000000..e25fb5f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Indexed Stack", + "info": "A subclass of the Stack component that can stack multiple components and specify the index of the component to be displayed, while the rest are hidden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IndexedStack", + "desc": [ + "【children】: List of child components 【List】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【index】: Currently displayed component 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json new file mode 100644 index 00000000..48b4714a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pila indexada", + "info": "Subclase del componente Stack, puede apilar múltiples componentes y especificar el índice del componente que se mostrará a través del índice, el resto se ocultará.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IndexedStack", + "desc": [ + "【children】 : Lista de componentes hijos 【Lis】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【index】 : Componente actualmente visible 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json new file mode 100644 index 00000000..8eb40e30 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Empilement indexé", + "info": "Sous-classe du composant Stack, permet d'empiler plusieurs composants et de spécifier l'index du composant à afficher via l'index, les autres seront masqués.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IndexedStack", + "desc": [ + "【children】 : Liste des composants enfants 【Lis】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【index】 : Composant actuellement affiché 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json new file mode 100644 index 00000000..b153327d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pila indicizzata", + "info": "Sottoclasse del componente Stack, può impilare più componenti e specificare l'indice del componente da visualizzare tramite index, gli altri verranno nascosti.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IndexedStack", + "desc": [ + "【children】 : Lista dei componenti figli 【Lis】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【index】 : Componente attualmente visualizzato 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json new file mode 100644 index 00000000..74da171b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "インデックススタック", + "info": "Stackコンポーネントのサブクラスで、複数のコンポーネントをスタックし、indexを指定して表示するコンポーネントを指定できます。それ以外のコンポーネントは非表示になります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStackの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【Lis】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【index】 : 現在表示されているコンポーネント 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json new file mode 100644 index 00000000..6352262c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "인덱스 스택", + "info": "Stack 컴포넌트의 하위 클래스로, 여러 컴포넌트를 쌓아 놓고 index를 통해 표시할 컴포넌트의 인덱스를 지정할 수 있으며, 나머지는 숨겨집니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IndexedStack 기본 사용", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【Lis】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【index】 : 현재 표시되는 컴포넌트 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json new file mode 100644 index 00000000..f785b891 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Pilha Indexada", + "info": "Subclasse do componente Stack, pode empilhar vários componentes e especificar o índice do componente a ser exibido através do index, os restantes serão ocultados.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do IndexedStack", + "desc": [ + "【children】 : Lista de componentes filhos 【Lis】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【index】 : Componente atualmente exibido 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json new file mode 100644 index 00000000..bb8625ec --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/IndexedStack/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 161, + "name": "IndexedStack", + "localName": "Индексированный стек", + "info": "Подкласс компонента Stack, который позволяет складывать несколько компонентов и указывать индекс отображаемого компонента через index, остальные будут скрыты.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IndexedStack", + "desc": [ + "【children】 : Список дочерних компонентов 【Lis】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【index】 : Текущий отображаемый компонент 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json new file mode 100644 index 00000000..17a86062 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Listenkörper", + "info": "Ordnet mehrere Unterkomponenten entlang einer Achse an, hat wenige einstellbare Attribute und wird selten verwendet, stattdessen wird meist ListView bevorzugt.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListView", + "desc": [ + "【mainAxis】: Hauptachsenrichtung 【Axis】", + "【reverse】: Umgekehrt oder nicht 【bool】", + "【children】: Sammlung von Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json new file mode 100644 index 00000000..33f49ae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "List Body", + "info": "Arranges several child components along the axis, with few properties that can be set. It is rarely used, and ListView is generally chosen instead.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListView", + "desc": [ + "【mainAxis】: Main axis direction 【Axis】", + "【reverse】: Whether to reverse 【bool】", + "【children】: Child component collection 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json new file mode 100644 index 00000000..11dc24b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Cuerpo de la lista", + "info": "Organiza varios subcomponentes a lo largo de un eje, con pocas propiedades configurables, generalmente se usa poco y se prefiere usar ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListView", + "desc": [ + "【mainAxis】 : Dirección del eje principal 【Axis】", + "【reverse】: Si es inverso 【bool】", + "【children】: Conjunto de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json new file mode 100644 index 00000000..8627f731 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corps de liste", + "info": "Dispose plusieurs sous-composants selon un axe, avec peu de propriétés configurables, rarement utilisé, on préfère généralement utiliser ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListView", + "desc": [ + "【mainAxis】 : Direction de l'axe principal 【Axis】", + "【reverse】: Inverser ou non 【bool】", + "【children】: Ensemble de sous-composants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json new file mode 100644 index 00000000..0034881b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corpo della lista", + "info": "Dispone diversi componenti figli lungo un asse, con poche proprietà configurabili. Viene utilizzato raramente, preferendo invece l'uso di ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListView", + "desc": [ + "【mainAxis】 : Direzione dell'asse principale 【Axis】", + "【reverse】: Inversione 【bool】", + "【children】: Insieme di componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json new file mode 100644 index 00000000..988ec58b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "リストボディ", + "info": "複数の子コンポーネントを軸方向に並べ替えます。設定可能な属性は少なく、通常はあまり使用されず、代わりにListViewが選択されます。", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListViewの基本的な使用", + "desc": [ + "【mainAxis】 : 主軸方向 【Axis】", + "【reverse】: 逆方向かどうか 【bool】", + "【children】: 子コンポーネント集 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json new file mode 100644 index 00000000..53f44f10 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "리스트 바디", + "info": "여러 하위 컴포넌트를 축 방향으로 배열하며, 설정 가능한 속성이 적어 일반적으로 잘 사용되지 않고, 대신 ListView를 선택하여 사용합니다.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView의 기본 사용법", + "desc": [ + "【mainAxis】 : 주축 방향 【Axis】", + "【reverse】: 역방향 여부 【bool】", + "【children】: 하위 컴포넌트 집합 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json new file mode 100644 index 00000000..0d9afb7f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Corpo da Lista", + "info": "Organiza vários subcomponentes ao longo de um eixo, com poucas propriedades configuráveis, geralmente pouco utilizado, optando-se por usar ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ListView", + "desc": [ + "【mainAxis】 : Direção do eixo principal 【Axis】", + "【reverse】: Se é invertido 【bool】", + "【children】: Conjunto de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json new file mode 100644 index 00000000..527c1623 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ListBody/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 342, + "name": "ListBody", + "localName": "Тело списка", + "info": "Располагает несколько дочерних компонентов по оси, имеет мало настраиваемых свойств, обычно редко используется, вместо этого выбирают ListView.", + "lever": 4, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListView", + "desc": [ + "【mainAxis】 : Направление основной оси 【Axis】", + "【reverse】: Обратное направление 【bool】", + "【children】: Набор дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json new file mode 100644 index 00000000..1ac51904 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Verschachtelter Scroll-Viewport", + "info": "Ein in NestedScrollView verwendeter Viewport, der ein SliverOverlapAbsorberHandle enthält und es benachrichtigt, wenn der Viewport sein Layout neu berechnen muss. Zum Beispiel, wenn es gescrollt wird.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in NestedScrollViewViewport", + "desc": [ + "【offset】 : *Versatz 【ViewportOffset】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【crossAxisDirection】 : Querachsenrichtung 【AxisDirection】", + "【slivers】 : Unterkomponenten 【List】", + "【clipBehavior】 : Abschneideverhalten 【Clip】", + "【anchor】 : Ankerpunkt 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json new file mode 100644 index 00000000..6ee55a66 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Nested Scroll Viewport", + "info": "A viewport used in NestedScrollView, which holds a SliverOverlapAbsorberHandle and notifies it when the viewport needs to recalculate its layout. For example, when scrolling it.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to NestedScrollViewViewport", + "desc": [ + "【offset】 : *Offset 【ViewportOffset】", + "【handle】 : *Handle 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : Axis Direction 【AxisDirection】", + "【crossAxisDirection】 : Cross Axis Direction 【AxisDirection】", + "【slivers】 : Child Components 【List】", + "【clipBehavior】 : Clip Behavior 【Clip】", + "【anchor】 : Anchor 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json new file mode 100644 index 00000000..139e1c8c --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Ventana de desplazamiento anidado", + "info": "Ventana utilizada en NestedScrollView que contiene un SliverOverlapAbsorberHandle y lo notifica cuando la ventana necesita recalcular su diseño. Por ejemplo, cuando se desplaza.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a NestedScrollViewViewport", + "desc": [ + "【offset】 : *desplazamiento 【ViewportOffset】", + "【handle】 : *manejador 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : dirección del eje 【AxisDirection】", + "【crossAxisDirection】 : dirección del eje cruzado 【AxisDirection】", + "【slivers】 : componentes hijos 【List】", + "【clipBehavior】 : comportamiento de recorte 【Clip】", + "【anchor】 : punto de anclaje 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json new file mode 100644 index 00000000..89464bb1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Vue de défilement imbriquée", + "info": "Une vue utilisée dans NestedScrollView, qui détient un SliverOverlapAbsorberHandle et le notifie lorsque la vue a besoin de recalculer sa disposition. Par exemple, lors du défilement.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à NestedScrollViewViewport", + "desc": [ + "【offset】 : *décalage 【ViewportOffset】", + "【handle】 : *gestionnaire 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direction de l'axe 【AxisDirection】", + "【crossAxisDirection】 : direction de l'axe croisé 【AxisDirection】", + "【slivers】 : composants enfants 【List】", + "【clipBehavior】 : comportement de découpage 【Clip】", + "【anchor】 : point d'ancrage 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json new file mode 100644 index 00000000..8aebc164 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Vista scorrevole annidata", + "info": "Vista utilizzata in NestedScrollView, che detiene SliverOverlapAbsorberHandle e lo notifica quando la vista necessita di ricalcolare il layout. Ad esempio, quando viene scorsa.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a NestedScrollViewViewport", + "desc": [ + "【offset】 : *offset 【ViewportOffset】", + "【handle】 : *gestore 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direzione dell'asse 【AxisDirection】", + "【crossAxisDirection】 : direzione dell'asse incrociato 【AxisDirection】", + "【slivers】 : componenti figli 【List】", + "【clipBehavior】 : comportamento di ritaglio 【Clip】", + "【anchor】 : punto di ancoraggio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json new file mode 100644 index 00000000..3d54dbd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "ネストされたスクロールビューポート", + "info": "NestedScrollView で使用されるビューポートで、このビューポートは SliverOverlapAbsorberHandle を保持し、ビューポートがレイアウトを再計算する必要があるときに通知します。例えば、スクロールするときなどです。", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport の紹介", + "desc": [ + "【offset】 : *オフセット 【ViewportOffset】", + "【handle】 : *ハンドル 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【crossAxisDirection】 : 交差軸方向 【AxisDirection】", + "【slivers】 : 子コンポーネント 【List】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【anchor】 : アンカー 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json new file mode 100644 index 00000000..832a8215 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "중첩 스크롤 뷰포트", + "info": "NestedScrollView에서 사용되는 뷰포트로, 이 뷰포트는 SliverOverlapAbsorberHandle을 보유하고 있으며, 뷰포트가 레이아웃을 다시 계산해야 할 때 이를 알립니다. 예를 들어, 스크롤할 때.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 소개", + "desc": [ + "【offset】 : *오프셋 【ViewportOffset】", + "【handle】 : *핸들러 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【crossAxisDirection】 : 교차 축 방향 【AxisDirection】", + "【slivers】 : 자식 위젯 【List】", + "【clipBehavior】 : 클립 동작 【Clip】", + "【anchor】 : 앵커 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json new file mode 100644 index 00000000..972d7304 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Porto de Rolagem Aninhado", + "info": "Porto utilizado no NestedScrollView, que detém o SliverOverlapAbsorberHandle e notifica-o quando o porto precisa recalcular o layout. Por exemplo, quando é rolado.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao NestedScrollViewViewport", + "desc": [ + "【offset】 : *deslocamento 【ViewportOffset】", + "【handle】 : *manipulador 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : direção do eixo 【AxisDirection】", + "【crossAxisDirection】 : direção do eixo cruzado 【AxisDirection】", + "【slivers】 : componentes filhos 【List】", + "【clipBehavior】 : comportamento de corte 【Clip】", + "【anchor】 : âncora 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json new file mode 100644 index 00000000..c3d2ff60 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/NestedScrollViewViewport/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 344, + "name": "NestedScrollViewViewport", + "localName": "Вложенный скроллируемый вид", + "info": "Вид, используемый в NestedScrollView, который содержит SliverOverlapAbsorberHandle и уведомляет его, когда вид требует пересчета макета. Например, при его прокрутке.", + "lever": 1, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Описание NestedScrollViewViewport", + "desc": [ + "【offset】 : *смещение 【ViewportOffset】", + "【handle】 : *обработчик 【SliverOverlapAbsorberHandle】", + "【axisDirection】 : направление оси 【AxisDirection】", + "【crossAxisDirection】 : направление поперечной оси 【AxisDirection】", + "【slivers】 : дочерние компоненты 【List】", + "【clipBehavior】 : поведение обрезки 【Clip】", + "【anchor】 : якорь 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json new file mode 100644 index 00000000..2152ab6f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "RichText", + "info": "Eine RichText-Komponente, die verschiedene Textstile oder verschiedene Komponenten aufnehmen kann und weit verbreitet ist.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RichText", + "desc": [ + "【text】: Text 【TextSpan】", + " Andere Eigenschaften sind identisch mit Text, siehe dazu." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText enthält andere Komponenten", + "desc": [ + "Verwenden Sie WidgetSpan, um normale Komponenten zu tragen, als Inhalt von RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json new file mode 100644 index 00000000..d8ed9ff9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Rich Text", + "info": "A rich text component that can accommodate various text styles or various components, widely used.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RichText", + "desc": [ + "【text】: text 【TextSpan】", + " Other properties are the same as Text, see it for details." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contains Other Components", + "desc": [ + "Use WidgetSpan to carry ordinary components as the content of RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json new file mode 100644 index 00000000..c0d3ccfd --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texto enriquecido", + "info": "Componente de texto enriquecido que puede contener varios estilos de texto o varios componentes, ampliamente utilizado.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RichText", + "desc": [ + "【text】 : texto 【TextSpan】", + " Otras propiedades son las mismas que Text, consulte para más detalles." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText contiene otros componentes", + "desc": [ + "Usa WidgetSpan para contener componentes comunes como contenido de RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json new file mode 100644 index 00000000..7af0eae1 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texte enrichi", + "info": "Un composant de texte enrichi qui peut contenir divers styles de texte ou divers composants, largement utilisé.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RichText", + "desc": [ + "【text】 : texte 【TextSpan】", + " Les autres propriétés sont les mêmes que Text, voir pour plus de détails." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText contenant d'autres composants", + "desc": [ + "Utilisez WidgetSpan pour contenir des composants ordinaires, en tant que contenu de RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json new file mode 100644 index 00000000..ffcd0345 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Testo Arricchito", + "info": "Un componente di testo arricchito che può contenere vari stili di testo o vari componenti, ampiamente utilizzato.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RichText", + "desc": [ + "【text】: testo 【TextSpan】", + " Altre proprietà sono le stesse di Text, vedi dettagli." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contiene Altri Componenti", + "desc": [ + "Utilizza WidgetSpan per contenere componenti comuni, come contenuto di RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json new file mode 100644 index 00000000..813973ee --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "リッチテキスト", + "info": "さまざまなテキストスタイルやコンポーネントを包含できるリッチテキストコンポーネントで、広く使用されています。", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichTextの基本的な使用", + "desc": [ + "【text】 : テキスト 【TextSpan】", + " 他のプロパティはTextと同じです。詳細はそちらを参照してください。" + ] + }, + { + "file": "node2_widget.dart", + "name": "RichTextに他のコンポーネントを含める", + "desc": [ + "WidgetSpanを使用して通常のコンポーネントをリッチテキストの内容として含める" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json new file mode 100644 index 00000000..834b5ad3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "리치 텍스트", + "info": "다양한 텍스트 스타일이나 다양한 컴포넌트를 포함할 수 있는 리치 텍스트 컴포넌트로, 널리 사용됩니다.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RichText 기본 사용", + "desc": [ + "【text】 : 텍스트 【TextSpan】", + " 다른 속성은 Text와 동일하며, 자세한 내용은 해당 항목을 참조하세요." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText에 다른 컴포넌트 포함", + "desc": [ + "WidgetSpan을 사용하여 일반 컴포넌트를 포함하고, 이를 RichText의 내용으로 사용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json new file mode 100644 index 00000000..018135f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Texto Rico", + "info": "Um componente de texto rico que pode acomodar vários estilos de texto ou vários componentes, amplamente utilizado.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RichText", + "desc": [ + "【text】 : texto 【TextSpan】", + " Outras propriedades são as mesmas que Text, consulte para mais detalhes." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText Contendo Outros Componentes", + "desc": [ + "Use WidgetSpan para suportar componentes comuns como conteúdo do RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json new file mode 100644 index 00000000..f9f07836 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/RichText/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 101, + "name": "RichText", + "localName": "Форматированный текст", + "info": "Компонент форматированного текста, который может содержать различные стили текста или компоненты, широко применяется.", + "lever": 5, + "family": 3, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RichText", + "desc": [ + "【text】 : текст 【TextSpan】", + " Другие свойства такие же, как у Text, подробнее см. там." + ] + }, + { + "file": "node2_widget.dart", + "name": "RichText содержит другие компоненты", + "desc": [ + "Используйте WidgetSpan для размещения обычных компонентов в качестве содержимого RichText" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json new file mode 100644 index 00000000..fbca374e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Zeilenlayout", + "info": "Ein Flex-Layout mit horizontaler Ausrichtung, das mehrere Komponenten aufnehmen kann. Alle anderen Eigenschaften sind identisch, siehe Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Row", + "desc": [ + "【children】: Komponentenliste 【List】", + "【mainAxisAlignment】: Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】: Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】: Textbaseline 【TextBaseline】", + "【verticalDirection】: Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】: Hauptachsengröße 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json new file mode 100644 index 00000000..21e94e2e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Row Layout", + "info": "A Flex layout with a horizontal arrangement direction that can accommodate multiple components. All other properties are the same, see Flex for details.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Row", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json new file mode 100644 index 00000000..d52d0480 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Disposición de fila", + "info": "Disposición Flex con dirección horizontal, puede contener múltiples componentes. Todas las demás propiedades son iguales, consulte Flex para más detalles.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Row", + "desc": [ + "【children】: Lista de componentes 【List】", + "【mainAxisAlignment】: Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】: Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】: Línea base del texto 【TextBaseline】", + "【verticalDirection】: Dirección vertical 【VerticalDirection】", + "【mainAxisSize】: Tamaño del eje principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json new file mode 100644 index 00000000..d663af76 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Disposition en ligne", + "info": "Une disposition Flex avec une orientation horizontale, capable de contenir plusieurs composants. Toutes les autres propriétés sont identiques, voir Flex pour plus de détails.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Row", + "desc": [ + "【children】 : Liste des composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe secondaire 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json new file mode 100644 index 00000000..1bcf1ed4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Layout a righe", + "info": "Layout Flex con direzione orizzontale, può contenere più componenti. Tutte le altre proprietà sono le stesse, vedi Flex per i dettagli.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Row", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json new file mode 100644 index 00000000..4330b887 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "行レイアウト", + "info": "レイアウト方向が横向きのFlexレイアウトで、複数のコンポーネントを収容できます。他の属性はすべて同じです。詳細はFlexを参照してください。", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Rowの基本使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸のサイズ 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json new file mode 100644 index 00000000..6ee04586 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "행 레이아웃", + "info": "배치 방향이 가로인 Flex 레이아웃으로, 여러 컴포넌트를 수용할 수 있습니다. 다른 속성은 모두 동일하며, 자세한 내용은 Flex를 참조하세요.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Row 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【mainAxisAlignment】 : 주축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 수직 방향 【VerticalDirection】", + "【mainAxisSize】 : 주축 크기 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json new file mode 100644 index 00000000..0dfd304b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Layout de Linha", + "info": "Um layout Flex com direção de disposição horizontal, que pode acomodar vários componentes. Todas as outras propriedades são as mesmas, consulte Flex para mais detalhes.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Row", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo transversal 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json new file mode 100644 index 00000000..5f557d63 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Row/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 95, + "name": "Row", + "localName": "Строка", + "info": "Горизонтальная компоновка Flex, которая может содержать несколько компонентов. Все остальные свойства такие же, как у Flex. Подробнее см. Flex.", + "lever": 4, + "family": 3, + "linkIds": [ + 94, + 96 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Row", + "desc": [ + "【children】: Список компонентов 【List】", + "【mainAxisAlignment】: Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】: Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】: Базовая линия текста 【TextBaseline】", + "【verticalDirection】: Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】: Размер главной оси 【MainAxisSize】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json new file mode 100644 index 00000000..2e5a4eec --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Schrumpfende Umhüllungsansicht", + "info": "Beziehung zur shrinkWrap-Eigenschaft von ScrollView. Die ShrinkWrappingViewport passt ihre Größe auf der Hauptachse an ihre untergeordneten Knoten an und wird verwendet, wenn keine Randbeschränkungen vorhanden sind.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in NestedScrollViewViewport", + "desc": [ + "【offset】 : *Versatz 【ViewportOffset】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【crossAxisDirection】 : Kreuzachsenrichtung 【AxisDirection】", + "【slivers】 : Untergeordnete Komponenten 【List】", + "【clipBehavior】 : Beschneidungsverhalten 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json new file mode 100644 index 00000000..ca49de6b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Shrink Wrap Viewport", + "info": "Related to the shrinkWrap property of ScrollView. ShrinkWrappingViewport adjusts its size on the main axis to fit its children, used when there are no boundary constraints.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to NestedScrollViewViewport", + "desc": [ + "【offset】: *offset 【ViewportOffset】", + "【axisDirection】: Axis direction 【AxisDirection】", + "【crossAxisDirection】: Cross axis direction 【AxisDirection】", + "【slivers】: Child components 【List】", + "【clipBehavior】: Clip behavior 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json new file mode 100644 index 00000000..fae42a2a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista de Envoltura Reducida", + "info": "Relación con la propiedad shrinkWrap de ScrollView. ShrinkWrappingViewport ajusta su tamaño en el eje principal para adaptarse a sus nodos hijos, utilizado en ausencia de restricciones de límites.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a NestedScrollViewViewport", + "desc": [ + "【offset】 : *desplazamiento 【ViewportOffset】", + "【axisDirection】 : dirección del eje 【AxisDirection】", + "【crossAxisDirection】 : dirección del eje cruzado 【AxisDirection】", + "【slivers】 : componentes hijos 【List】", + "【clipBehavior】 : comportamiento de recorte 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json new file mode 100644 index 00000000..3e91e0aa --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vue enveloppante rétrécissante", + "info": "Lié à la propriété shrinkWrap de ScrollView. ShrinkWrappingViewport ajuste sa taille sur l'axe principal pour s'adapter à ses enfants, utilisé en l'absence de contraintes de limites.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à NestedScrollViewViewport", + "desc": [ + "【offset】 : *décalage 【ViewportOffset】", + "【axisDirection】 : direction de l'axe 【AxisDirection】", + "【crossAxisDirection】 : direction de l'axe croisé 【AxisDirection】", + "【slivers】 : composants enfants 【List】", + "【clipBehavior】 : comportement de découpage 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json new file mode 100644 index 00000000..51a691a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista di avvolgimento a contrazione", + "info": "Relazione con la proprietà shrinkWrap di ScrollView. ShrinkWrappingViewport ridimensiona se stesso sull'asse principale per adattarsi ai suoi figli, utilizzato in assenza di vincoli di confine.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a NestedScrollViewViewport", + "desc": [ + "【offset】 : *offset 【ViewportOffset】", + "【axisDirection】 : direzione dell'asse 【AxisDirection】", + "【crossAxisDirection】 : direzione dell'asse incrociato 【AxisDirection】", + "【slivers】 : componenti figli 【List】", + "【clipBehavior】 : comportamento di ritaglio 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json new file mode 100644 index 00000000..a2ed4d80 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "収縮ラッピングビューポート", + "info": "ScrollViewのshrinkWrap属性との関連性。ShrinkWrappingViewportは、主軸上で自身のサイズを子ノードに合わせて調整し、境界制約がない場合に使用されます。", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 紹介", + "desc": [ + "【offset】 : *オフセット 【ViewportOffset】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【crossAxisDirection】 : 交差軸方向 【AxisDirection】", + "【slivers】 : 子コンポーネント 【List】", + "【clipBehavior】 : クリップ動作 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json new file mode 100644 index 00000000..f5992c13 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "축소 래핑 뷰포트", + "info": "ScrollView의 shrinkWrap 속성과의 관계. ShrinkWrappingViewport는 주축에서 자식 노드에 맞게 크기를 조정하며, 경계 제약이 없는 경우에 사용됩니다.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewViewport 소개", + "desc": [ + "【offset】 : *오프셋 【ViewportOffset】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【crossAxisDirection】 : 교차 축 방향 【AxisDirection】", + "【slivers】 : 자식 위젯 【List】", + "【clipBehavior】 : 클립 동작 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json new file mode 100644 index 00000000..6873fd27 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Vista de Envolvimento de Redução", + "info": "Associado à propriedade shrinkWrap do ScrollView. O ShrinkWrappingViewport ajusta o seu tamanho no eixo principal para se adaptar aos seus filhos, usado em casos sem restrições de limite.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao NestedScrollViewViewport", + "desc": [ + "【offset】 : *deslocamento 【ViewportOffset】", + "【axisDirection】 : direção do eixo 【AxisDirection】", + "【crossAxisDirection】 : direção do eixo cruzado 【AxisDirection】", + "【slivers】 : componentes filhos 【List】", + "【clipBehavior】 : comportamento de corte 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json new file mode 100644 index 00000000..71edc861 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/ShrinkWrappingViewport/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 343, + "name": "ShrinkWrappingViewport", + "localName": "Сжимающаяся оболочка Viewport", + "info": "Связь с атрибутом shrinkWrap ScrollView. ShrinkWrappingViewport регулирует свой размер по основной оси, чтобы соответствовать своим дочерним элементам, используется при отсутствии ограничений.", + "lever": 1, + "family": 3, + "linkIds": [ + 349, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в NestedScrollViewViewport", + "desc": [ + "【offset】 : *смещение 【ViewportOffset】", + "【axisDirection】 : направление оси 【AxisDirection】", + "【crossAxisDirection】 : направление поперечной оси 【AxisDirection】", + "【slivers】 : дочерние компоненты 【List】", + "【clipBehavior】 : поведение обрезки 【Clip】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json new file mode 100644 index 00000000..916acaba --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Stapellayout", + "info": "Kann mehrere Komponenten aufnehmen, Unterkomponenten werden gestapelt platziert, wobei die letzte oben liegt. Verfügt über eine alignment-Eigenschaft, die in Kombination mit der Positioned-Komponente verwendet werden kann, um eine präzise Positionierung zu erreichen.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Stack", + "desc": [ + "【children】: Komponentenliste 【List】", + "【textDirection】: Ausrichtung der Kinder 【MainAxisAlignment】", + "【alignment】: Ausrichtungsmethode 【AlignmentGeometry】", + "【overflow】: Überlaufmodus 【Overflow】", + "【fit】: Anpassungsmodus 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Kombinierte Verwendung von Stack und Positioned", + "desc": [ + "Die Positioned-Komponente kann nur innerhalb eines Stacks verwendet werden und ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json new file mode 100644 index 00000000..27bd446e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Stack Layout", + "info": "Can accommodate multiple components, arranging child components in a stacked manner, with the latter on top. Has the alignment property, which can be used in conjunction with the Positioned component for precise positioning.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Stack", + "desc": [ + "【children】: Component list 【List】", + "【textDirection】: Child arrangement direction 【MainAxisAlignment】", + "【alignment】: Alignment method 【AlignmentGeometry】", + "【overflow】: Overflow mode 【Overflow】", + "【fit】: Fit mode 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Combined Usage of Stack and Positioned", + "desc": [ + "The Positioned component can only be used within a Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json new file mode 100644 index 00000000..d3df9093 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Diseño apilado", + "info": "Puede contener múltiples componentes, colocando los componentes hijos de manera apilada, el último encima. Tiene la propiedad de alineación, que se puede usar junto con el componente Positioned para un posicionamiento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Stack", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【textDirection】 : Dirección de disposición de los hijos 【MainAxisAlignment】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】", + "【overflow】 : Modo de desbordamiento 【Overflow】", + "【fit】 : Modo de ajuste 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso combinado de Stack y Positioned", + "desc": [ + "El componente Positioned solo se puede usar en Stack, y se puede especificar la distancia desde la parte superior, izquierda, derecha e inferior para colocar un componente con precisión." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json new file mode 100644 index 00000000..90c39694 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Disposition en pile", + "info": "Peut contenir plusieurs composants, disposant les composants enfants de manière empilée, le dernier étant au-dessus. Possède une propriété d'alignement, pouvant être utilisée conjointement avec le composant Positioned pour un positionnement précis.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Stack", + "desc": [ + "【children】 : Liste des composants 【List】", + "【textDirection】 : Direction de disposition des enfants 【MainAxisAlignment】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】", + "【overflow】 : Mode de débordement 【Overflow】", + "【fit】 : Mode d'adaptation 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Utilisation combinée de Stack et Positioned", + "desc": [ + "Le composant Positioned ne peut être utilisé qu'avec Stack, permettant de positionner précisément un composant en spécifiant les distances en haut, bas, gauche et droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json new file mode 100644 index 00000000..06457d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Layout a Pila", + "info": "Può contenere più componenti, disposti in modo sovrapposto, con il successivo sopra il precedente. Possiede la proprietà alignment, che può essere utilizzata in combinazione con il componente Positioned per un posizionamento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Stack", + "desc": [ + "【children】: Lista di componenti 【List】", + "【textDirection】: Direzione di disposizione dei figli 【MainAxisAlignment】", + "【alignment】: Modalità di allineamento 【AlignmentGeometry】", + "【overflow】: Modalità di overflow 【Overflow】", + "【fit】: Modalità di adattamento 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso Combinato di Stack e Positioned", + "desc": [ + "Il componente Positioned può essere utilizzato solo con Stack, consentendo di specificare le distanze da sinistra, alto, destra e basso per posizionare con precisione un componente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json new file mode 100644 index 00000000..f9d78655 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "スタックレイアウト", + "info": "複数のコンポーネントを収容でき、子コンポーネントをスタック方式で配置し、後者が上に来ます。alignment属性を持ち、Positionedコンポーネントと組み合わせて使用することで、正確な位置指定が可能です。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stackの基本的な使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【textDirection】 : 子要素の配置方向 【MainAxisAlignment】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【overflow】 : オーバーフローモード 【Overflow】", + "【fit】 : フィットモード 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "StackとPositionedの組み合わせ使用", + "desc": [ + "PositionedコンポーネントはStack内でのみ使用でき、左上右下の距離を指定して特定のコンポーネントを正確に配置できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json new file mode 100644 index 00000000..a8299959 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "스택 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 자식 컴포넌트를 겹쳐서 배치합니다. 후자가 위에 위치합니다. alignment 속성을 가지고 있으며, Positioned 컴포넌트와 함께 사용하여 정확한 위치를 지정할 수 있습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stack 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【textDirection】 : 자식 배치 방향 【MainAxisAlignment】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【overflow】 : 오버플로우 모드 【Overflow】", + "【fit】 : 적응 모드 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Stack과 Positioned 함께 사용", + "desc": [ + "Positioned 컴포넌트는 Stack에서만 사용할 수 있으며, 특정 컴포넌트의 위치를 정확히 배치하기 위해 상하좌우 거리를 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json new file mode 100644 index 00000000..c06bc8b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Layout Empilhado", + "info": "Pode acomodar vários componentes, dispondo os subcomponentes de forma empilhada, com o último ficando por cima. Possui a propriedade alignment, que pode ser usada em conjunto com o componente Positioned para um posicionamento preciso.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Stack", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【textDirection】 : Direção de disposição dos filhos 【MainAxisAlignment】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【overflow】 : Modo de overflow 【Overflow】", + "【fit】 : Modo de ajuste 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Uso Combinado do Stack e Positioned", + "desc": [ + "O componente Positioned só pode ser usado dentro de um Stack, permitindo especificar as distâncias de topo, esquerda, direita e inferior para posicionar um componente com precisão." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json new file mode 100644 index 00000000..9edd87b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Stack/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 97, + "name": "Stack", + "localName": "Стек", + "info": "Может содержать несколько компонентов, располагая дочерние компоненты в стеке, последний сверху. Имеет свойство alignment, которое можно использовать вместе с компонентом Positioned для точного позиционирования.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95, + 161 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Stack", + "desc": [ + "【children】: Список компонентов 【List】", + "【textDirection】: Направление расположения детей 【MainAxisAlignment】", + "【alignment】: Способ выравнивания 【AlignmentGeometry】", + "【overflow】: Режим переполнения 【Overflow】", + "【fit】: Режим адаптации 【StackFit】" + ] + }, + { + "file": "node2_positioned.dart", + "name": "Использование Stack и Positioned вместе", + "desc": [ + "Компонент Positioned может использоваться только в Stack, позволяя точно размещать компонент, задавая расстояния сверху, слева, справа и снизу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json new file mode 100644 index 00000000..eda5bea8 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Ansichtsfenster-Komponente", + "info": "Wird normalerweise verwendet, um ein Ansichtsfenster für eine Scroll-Ansicht bereitzustellen, wobei nur die angezeigten und vorab geladenen Teile erstellt werden. Es kann die Länge des Vorladens, die Scroll-Achse usw. angegeben werden. Es ist eine der Kernimplementationskomponenten von ScrollView und wird im Allgemeinen nicht direkt verwendet.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Viewport", + "desc": [ + "【offset】: *Ansichtsfenster-Verschiebung 【ViewportOffset】", + "【cacheExtentStyle】: Vorladetyp 【CacheExtentStyle】", + "【cacheExtent】: Vorlademenge 【double】", + "【axisDirection】: Scrollrichtung 【AxisDirection】", + "【slivers】: Untergeordnete Sliver-Komponentensammlung 【List】", + "【anchor】: Ankerpunkt 【double】", + "Sie können diesen Code ausführen, um den Aufbau von ColorItem zu überprüfen, 128 Farbbalken werden nicht alle auf einmal erstellt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json new file mode 100644 index 00000000..4fa1c0a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Viewport Component", + "info": "Typically used to provide a viewport for a scrolling view, only building the displayed and preloaded parts. The preload length, scrolling axis, etc., can be specified. It is one of the core implementation components of ScrollView and is generally not used directly.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Viewport", + "desc": [ + "【offset】: *Viewport offset 【ViewportOffset】", + "【cacheExtentStyle】: Preload type 【CacheExtentStyle】", + "【cacheExtent】: Preload amount 【double】", + "【axisDirection】: Scrolling direction 【AxisDirection】", + "【slivers】: Child Sliver component set 【List】", + "【anchor】: Anchor point 【double】", + "You can run this code to see how the ColorItem is constructed, the 128 color bars are not all constructed at once." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json new file mode 100644 index 00000000..d10d5ef9 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente de ventana gráfica", + "info": "Normalmente se utiliza para proporcionar una ventana gráfica a las vistas deslizantes, construyendo solo las partes visibles y precargadas. Se puede especificar la longitud de precarga, la dirección de deslizamiento, etc. Es uno de los componentes centrales de la implementación de ScrollView y generalmente no se utiliza directamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Viewport", + "desc": [ + "【offset】: *Desplazamiento de la ventana gráfica 【ViewportOffset】", + "【cacheExtentStyle】: Tipo de precarga 【CacheExtentStyle】", + "【cacheExtent】: Cantidad de precarga 【double】", + "【axisDirection】: Dirección de deslizamiento 【AxisDirection】", + "【slivers】: Conjunto de componentes Sliver hijos 【List】", + "【anchor】: Punto de anclaje 【double】", + "Puedes ejecutar este código para ver cómo se construye ColorItem, las 128 barras de color no se construyen todas a la vez." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json new file mode 100644 index 00000000..b78da72e --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Composant de fenêtre", + "info": "Généralement utilisé pour fournir une fenêtre à une vue défilante, ne construit que les parties affichées et préchargées. Peut spécifier la longueur de préchargement, l'axe de défilement, etc. Est l'un des composants de base de l'implémentation de ScrollView, généralement non utilisé directement.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Viewport", + "desc": [ + "【offset】 : *Décalage de la fenêtre 【ViewportOffset】", + "【cacheExtentStyle】: Type de préchargement 【CacheExtentStyle】", + "【cacheExtent】: Quantité de préchargement 【double】", + "【axisDirection】: Direction de défilement 【AxisDirection】", + "【slivers】: Ensemble de composants Sliver enfants 【List】", + "【anchor】: Point d'ancrage 【double】", + "Vous pouvez exécuter ce code pour voir la construction de ColorItem, les 128 barres de couleur ne sont pas toutes construites en une seule fois." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json new file mode 100644 index 00000000..71dd37f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente Viewport", + "info": "Utilizzato solitamente per fornire una finestra di visualizzazione per le viste scorrevoli, costruendo solo le parti visibili e precaricate. È possibile specificare la lunghezza del precaricamento, l'asse di scorrimento, ecc. È uno dei componenti di implementazione centrale di ScrollView e generalmente non viene utilizzato direttamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Viewport", + "desc": [ + "【offset】 : *Offset della finestra di visualizzazione 【ViewportOffset】", + "【cacheExtentStyle】: Tipo di precaricamento 【CacheExtentStyle】", + "【cacheExtent】: Quantità di precaricamento 【double】", + "【axisDirection】: Direzione di scorrimento 【AxisDirection】", + "【slivers】: Insieme di componenti Sliver figli 【List】", + "【anchor】: Punto di ancoraggio 【double】", + "Puoi eseguire questi codici per vedere come viene costruito ColorItem, i 128 barre di colore non vengono costruiti tutti in una volta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json new file mode 100644 index 00000000..99b72394 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "ビューポートコンポーネント", + "info": "通常、スライドビューのビューポートを提供するために使用され、表示およびプリロードされる部分のみを構築します。プリロードの長さ、スライド軸などを指定できます。ScrollViewのコア実装コンポーネントの1つであり、通常は直接使用しません。", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewportの基本的な使用法", + "desc": [ + "【offset】 : *ビューポートオフセット 【ViewportOffset】", + "【cacheExtentStyle】: プリロードタイプ 【CacheExtentStyle】", + "【cacheExtent】: プリロード量 【double】", + "【axisDirection】: スライド方向 【AxisDirection】", + "【slivers】: 子Sliverコンポーネントセット 【List】", + "【anchor】: アンカー 【double】", + "これらのコードを実行して、ColorItemの構築状況を確認できます。128のカラーバーは一度にすべて構築されません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json new file mode 100644 index 00000000..d480441a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "뷰포트 컴포넌트", + "info": "일반적으로 스크롤 뷰에 뷰포트를 제공하기 위해 사용되며, 표시 및 미리 로드할 부분만 구성합니다. 미리 로드할 길이, 스크롤 방향 등을 지정할 수 있습니다. ScrollView의 핵심 구현 컴포넌트 중 하나로, 일반적으로 직접 사용하지 않습니다.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Viewport의 기본 사용", + "desc": [ + "【offset】 : *뷰포트 오프셋 【ViewportOffset】", + "【cacheExtentStyle】: 미리 로드 유형 【CacheExtentStyle】", + "【cacheExtent】: 미리 로드량 【double】", + "【axisDirection】: 스크롤 방향 【AxisDirection】", + "【slivers】: 하위 Sliver 컴포넌트 집합 【List】", + "【anchor】: 앵커 【double】", + "이 코드를 실행하여 ColorItem의 구성을 확인할 수 있으며, 128개의 색상 바가 한 번에 모두 구성되지는 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json new file mode 100644 index 00000000..6ba04fed --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Componente de Viewport", + "info": "Normalmente usado para fornecer uma viewport para uma vista deslizante, construindo apenas as partes exibidas e pré-carregadas. Pode especificar o comprimento do pré-carregamento, o eixo de deslizamento, etc. É um dos componentes principais de implementação do ScrollView, geralmente não é usado diretamente.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Viewport", + "desc": [ + "【offset】 : *Deslocamento da viewport 【ViewportOffset】", + "【cacheExtentStyle】: Tipo de pré-carregamento 【CacheExtentStyle】", + "【cacheExtent】: Quantidade de pré-carregamento 【double】", + "【axisDirection】: Direção de deslizamento 【AxisDirection】", + "【slivers】: Conjunto de componentes Sliver filhos 【List】", + "【anchor】: Ponto de ancoragem 【double】", + "Pode executar este código para verificar a construção do ColorItem, as 128 barras de cores não são construídas todas de uma vez." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json new file mode 100644 index 00000000..189f1014 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Viewport/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 340, + "name": "Viewport", + "localName": "Компонент Viewport", + "info": "Обычно используется для предоставления области просмотра для прокручиваемого вида, строя только отображаемые и предварительно загружаемые части. Можно указать длину предварительной загрузки, направление прокрутки и т.д. Это один из основных компонентов реализации ScrollView, обычно не используется напрямую.", + "lever": 1, + "family": 3, + "linkIds": [ + 253, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Viewport", + "desc": [ + "【offset】: *Смещение области просмотра 【ViewportOffset】", + "【cacheExtentStyle】: Тип предварительной загрузки 【CacheExtentStyle】", + "【cacheExtent】: Объем предварительной загрузки 【double】", + "【axisDirection】: Направление прокрутки 【AxisDirection】", + "【slivers】: Набор дочерних компонентов Sliver 【List】", + "【anchor】: Точка привязки 【double】", + "Можно запустить этот код, чтобы увидеть, как строится ColorItem, 128 цветных полос не строятся все сразу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json new file mode 100644 index 00000000..1fa4ebc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Wrap-Layout", + "info": "Kann mehrere Komponenten aufnehmen und sie in einer bestimmten Richtung anordnen. Es kann den Abstand zwischen den Kindern leicht verarbeiten und automatisch umbrechen, wenn die Grenze überschritten wird. Es hat Ausrichtungsmethoden für die Haupt- und Querachse und ist relativ flexibel.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Wrap", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【spacing】 : Abstand zwischen den Einträgen auf der Hauptachse 【double】", + "【runSpacing】 : Abstand zwischen den Einträgen auf der Querachse 【double】", + "【direction】 : Ausrichtung der Hauptachse 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Alignment-Eigenschaft von Wrap", + "desc": [ + "【alignment】 : Ausrichtung der Hauptachse 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "CrossAxisAlignment-Eigenschaft von Wrap", + "desc": [ + "【crossAxisAlignment】 : Ausrichtung der Querachse 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "TextDirection-Eigenschaft von Wrap", + "desc": [ + "【textDirection】 : Textrichtung 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "VerticalDirection-Eigenschaft von Wrap", + "desc": [ + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json new file mode 100644 index 00000000..65132c6b --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Wrap Layout", + "info": "Can accommodate multiple components, arranged in a specified direction, and can easily handle the spacing between children. It can automatically wrap when out of bounds. It has flexible alignment methods for the main axis and cross axis.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Wrap", + "desc": [ + "【children】: Component list 【List】", + "【spacing】: Main axis spacing between items 【double】", + "【runSpacing】: Cross axis spacing between items 【double】", + "【direction】: Main axis alignment 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap's alignment Property", + "desc": [ + "【alignment】: Main axis alignment 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap's crossAxisAlignment Property", + "desc": [ + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap's textDirection Property", + "desc": [ + "【textDirection】: Text direction 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap's verticalDirection Property", + "desc": [ + "【verticalDirection】: Vertical direction 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json new file mode 100644 index 00000000..ab8d1052 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Disposición de envoltura", + "info": "Puede contener múltiples componentes, que se organizan en la dirección especificada, y puede manejar fácilmente el espaciado entre los hijos. Cuando se excede el límite, puede envolver automáticamente. Tiene métodos de alineación en el eje principal y el eje cruzado, lo que lo hace bastante flexible.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Wrap", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【spacing】 : Espaciado entre elementos en el eje principal 【double】", + "【runSpacing】 : Espaciado entre elementos en el eje cruzado 【double】", + "【direction】 : Alineación del eje principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propiedad alignment de Wrap", + "desc": [ + "【alignment】 : Alineación del eje principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propiedad crossAxisAlignment de Wrap", + "desc": [ + "【crossAxisAlignment】 : Alineación del eje cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propiedad textDirection de Wrap", + "desc": [ + "【textDirection】 : Dirección del texto 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propiedad verticalDirection de Wrap", + "desc": [ + "【verticalDirection】 : Dirección vertical 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json new file mode 100644 index 00000000..7b96706f --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Disposition enveloppante", + "info": "Peut contenir plusieurs composants, disposés séquentiellement dans une direction spécifiée, peut facilement gérer l'espacement des enfants, et peut automatiquement passer à la ligne suivante en cas de débordement. Possède des méthodes d'alignement pour l'axe principal et l'axe transversal, offrant une grande flexibilité.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Wrap", + "desc": [ + "【children】 : Liste des composants 【List】", + "【spacing】 : Espacement des éléments sur l'axe principal 【double】", + "【runSpacing】 : Espacement des éléments sur l'axe transversal 【double】", + "【direction】 : Alignement de l'axe principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propriété alignment de Wrap", + "desc": [ + "【alignment】 : Alignement de l'axe principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propriété crossAxisAlignment de Wrap", + "desc": [ + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propriété textDirection de Wrap", + "desc": [ + "【textDirection】 : Direction du texte 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propriété verticalDirection de Wrap", + "desc": [ + "【verticalDirection】 : Direction verticale 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json new file mode 100644 index 00000000..d33ff5f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Layout a pacchetto", + "info": "Può contenere più componenti, disposti in sequenza secondo la direzione specificata, può gestire facilmente la spaziatura tra i figli e può andare a capo automaticamente quando si superano i limiti. Ha modalità di allineamento per l'asse principale e l'asse trasversale, è abbastanza flessibile.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Wrap", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【spacing】 : Spaziatura degli elementi sull'asse principale 【double】", + "【runSpacing】 : Spaziatura degli elementi sull'asse trasversale 【double】", + "【direction】 : Allineamento dell'asse principale 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Proprietà alignment di Wrap", + "desc": [ + "【alignment】 : Allineamento dell'asse principale 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Proprietà crossAxisAlignment di Wrap", + "desc": [ + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Proprietà textDirection di Wrap", + "desc": [ + "【textDirection】 : Direzione del testo 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Proprietà verticalDirection di Wrap", + "desc": [ + "【verticalDirection】 : Direzione verticale 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json new file mode 100644 index 00000000..50d7a744 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "ラップレイアウト", + "info": "複数のコンポーネントを収容でき、指定された方向に順番に配置し、子要素の間隔を簡単に処理できます。オーバーフロー時に自動的に折り返すことができます。主軸と交差軸の配置方法を持ち、比較的柔軟です。", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrapの基本的な使い方", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【spacing】 : 主軸アイテム間隔 【double】", + "【runSpacing】 : 交差軸アイテム間隔 【double】", + "【direction】 : 主軸整列 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrapのalignment属性", + "desc": [ + "【alignment】 : 主軸整列 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "WrapのcrossAxisAlignment属性", + "desc": [ + "【crossAxisAlignment】 : 交差軸整列 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "WrapのtextDirection属性", + "desc": [ + "【textDirection】 : テキスト方向 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "WrapのverticalDirection属性", + "desc": [ + "【verticalDirection】 : 垂直方向 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json new file mode 100644 index 00000000..4765ca5d --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "래핑 레이아웃", + "info": "여러 컴포넌트를 수용할 수 있으며, 지정된 방향으로 순차적으로 배치할 수 있습니다. 자식 간의 간격을 쉽게 처리할 수 있으며, 경계를 벗어날 경우 자동으로 줄 바꿈이 가능합니다. 주축과 교차축 정렬 방식을 가지고 있어 유연성이 높습니다.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wrap의 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【spacing】 : 주축 항목 간격 【double】", + "【runSpacing】 : 교차축 항목 간격 【double】", + "【direction】 : 주축 정렬 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Wrap의 alignment 속성", + "desc": [ + "【alignment】 : 주축 정렬 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Wrap의 crossAxisAlignment 속성", + "desc": [ + "【crossAxisAlignment】 : 교차축 정렬 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Wrap의 textDirection 속성", + "desc": [ + "【textDirection】 : 텍스트 방향 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Wrap의 verticalDirection 속성", + "desc": [ + "【verticalDirection】 : 수직 방향 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json new file mode 100644 index 00000000..f02fcbf7 --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Layout de Embalagem", + "info": "Pode acomodar vários componentes, dispostos sequencialmente na direção especificada, e pode facilmente lidar com o espaçamento entre os filhos. Quando ultrapassa o limite, pode quebrar automaticamente a linha. Possui métodos de alinhamento para o eixo principal e o eixo cruzado, sendo bastante flexível.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Wrap", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【spacing】 : Espaçamento entre itens no eixo principal 【double】", + "【runSpacing】 : Espaçamento entre itens no eixo cruzado 【double】", + "【direction】 : Alinhamento do eixo principal 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Propriedade alignment do Wrap", + "desc": [ + "【alignment】 : Alinhamento do eixo principal 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Propriedade crossAxisAlignment do Wrap", + "desc": [ + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Propriedade textDirection do Wrap", + "desc": [ + "【textDirection】 : Direção do texto 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Propriedade verticalDirection do Wrap", + "desc": [ + "【verticalDirection】 : Direção vertical 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json new file mode 100644 index 00000000..8422284a --- /dev/null +++ b/modules/widget_system/widgets/lib/MultiChildRenderObjectWidget/Wrap/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 98, + "name": "Wrap", + "localName": "Обёртка", + "info": "Может содержать несколько компонентов, которые располагаются в указанном направлении, легко управляет расстоянием между дочерними элементами, автоматически переносит строку при выходе за пределы. Имеет гибкие настройки выравнивания по основной и поперечной оси.", + "lever": 5, + "family": 3, + "linkIds": [ + 94, + 95 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Wrap", + "desc": [ + "【children】 : Список компонентов 【List】", + "【spacing】 : Расстояние между элементами по основной оси 【double】", + "【runSpacing】 : Расстояние между элементами по поперечной оси 【double】", + "【direction】 : Выравнивание по основной оси 【Axis】" + ] + }, + { + "file": "node2_alignment.dart", + "name": "Свойство alignment Wrap", + "desc": [ + "【alignment】 : Выравнивание по основной оси 【WrapAlignment】" + ] + }, + { + "file": "node3_crossAxisAlignment.dart", + "name": "Свойство crossAxisAlignment Wrap", + "desc": [ + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】" + ] + }, + { + "file": "node4_textDirection.dart", + "name": "Свойство textDirection Wrap", + "desc": [ + "【textDirection】 : Направление текста 【TextDirection】" + ] + }, + { + "file": "node5_verticalDirection.dart", + "name": "Свойство verticalDirection Wrap", + "desc": [ + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json new file mode 100644 index 00000000..8571c8e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Fehler-Widget", + "info": "Ein Widget zur Anzeige einer Fehlermeldung, roter Hintergrund mit gelber Schrift, wird häufig während der Entwicklung gesehen, wird jedoch normalerweise nicht verwendet.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ErrorWidget", + "desc": [ + "Parameter: Angezeigte Nachricht 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json new file mode 100644 index 00000000..6f7a4a4d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Error Component", + "info": "A component used to display an error message, with a red background and yellow text, often seen during development, generally not used.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ErrorWidget", + "desc": [ + "Parameters: Display Message 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json new file mode 100644 index 00000000..d94a2a8d --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget de Error", + "info": "Un componente utilizado para mostrar un mensaje de error, con fondo rojo y letras amarillas, se ve con frecuencia durante el desarrollo y generalmente no se utiliza.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ErrorWidget", + "desc": [ + "Parámetro de entrada: mensaje a mostrar 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json new file mode 100644 index 00000000..7ad1db59 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget d'erreur", + "info": "Un widget utilisé pour afficher un message d'erreur, fond rouge avec texte jaune, souvent vu pendant le développement, généralement non utilisé.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ErrorWidget", + "desc": [ + "Paramètre : message à afficher 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json new file mode 100644 index 00000000..cd33392c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Widget di Errore", + "info": "Componente utilizzato per visualizzare un messaggio di errore, sfondo rosso con testo giallo, spesso visto durante lo sviluppo, generalmente non utilizzato.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ErrorWidget", + "desc": [ + "Parametri : Messaggio da visualizzare 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json new file mode 100644 index 00000000..08edc507 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "エラーウィジェット", + "info": "エラーメッセージを表示するためのコンポーネントです。赤い背景に黄色い文字で表示され、開発中によく見かけますが、通常は使用しません。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidgetの基本使用", + "desc": [ + "引数 : 表示メッセージ 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json new file mode 100644 index 00000000..0e7f2aad --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "에러 위젯", + "info": "에러 메시지를 표시하는 위젯으로, 빨간 배경에 노란 글씨로 표시되며, 개발 과정에서 자주 보이지만 일반적으로 사용되지 않습니다.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ErrorWidget 기본 사용법", + "desc": [ + "입력 매개변수 : 표시할 정보 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json new file mode 100644 index 00000000..eabf6328 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Componente de Erro", + "info": "Componente usado para exibir uma mensagem de erro, com fundo vermelho e texto amarelo, frequentemente visto durante o desenvolvimento, geralmente não é utilizado.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ErrorWidget", + "desc": [ + "Parâmetro: Mensagem a ser exibida 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json new file mode 100644 index 00000000..a17ca651 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ErrorWidget/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 197, + "name": "ErrorWidget", + "localName": "Виджет ошибки", + "info": "Компонент для отображения сообщения об ошибке, красный фон с желтым текстом, часто встречается в процессе разработки, обычно не используется.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ErrorWidget", + "desc": [ + "Параметры: Отображаемое сообщение 【Object】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json new file mode 100644 index 00000000..106ca6ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Listenradansicht", + "info": "Ein Ansichtsfenster, das eine Liste von Kindern in einem zylindrischen Rad anzeigt. Es ist die zugrunde liegende Abhängigkeit von ListWheelScrollView und CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung von ListWheelViewport", + "desc": [ + "【itemExtent】 : Axiale Item-Größe 【double】", + "【offset】 : Ansichtsfenster-Versatz 【ViewportOffset】", + "【childDelegate】 : Kinderdelegat-Konstruktor 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Perspektivische Effekte von ListWheelViewport", + "desc": [ + "【perspective】 : Perspektivparameter 【double】", + "【squeeze】 : Quetschwert 【double】", + "【diameterRatio】 : Durchmesserverhältnis 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Vergrößerung von ListWheelViewport", + "desc": [ + "【useMagnifier】 : Ob vergrößert wird 【bool】", + "【magnification】 : Vergrößerungsverhältnis 【double】", + "【clipBehavior】 : Schneidverhalten 【Clip】", + "【renderChildrenOutsideViewport】 : Ob außerhalb des Sichtfelds gerendert wird 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Versatz und Transparenz", + "desc": [ + "【offAxisFraction】 : Achsenzentrum-Versatzverhältnis 【double】", + "【overAndUnderCenterOpacity】 : Transparenz außerhalb des Vergrößerers 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json new file mode 100644 index 00000000..ce02c9fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "List Wheel Viewport", + "info": "A viewport that displays a list of children on a cylindrical wheel, which is the underlying dependency of ListWheelScrollView and CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListWheelViewport", + "desc": [ + "【itemExtent】 : Axial item size 【double】", + "【offset】 : Viewport offset 【ViewportOffset】", + "【childDelegate】 : Child delegate constructor 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Perspective Effect of ListWheelViewport", + "desc": [ + "【perspective】 : Perspective parameter 【double】", + "【squeeze】 : Squeeze value 【double】", + "【diameterRatio】 : Diameter ratio 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Magnification of ListWheelViewport", + "desc": [ + "【useMagnifier】 : Whether to magnify 【bool】", + "【magnification】 : Magnification ratio 【double】", + "【clipBehavior】 : Clip behavior 【Clip】", + "【renderChildrenOutsideViewport】 : Whether to render children outside the viewport 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Offset and Opacity", + "desc": [ + "【offAxisFraction】 : Axis center offset ratio 【double】", + "【overAndUnderCenterOpacity】 : Opacity outside the magnifier 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json new file mode 100644 index 00000000..d90a4dcb --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vista de rueda de lista", + "info": "Una vista que muestra una lista de hijos en una rueda cilíndrica, es la dependencia subyacente de ListWheelScrollView y CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simple de ListWheelViewport", + "desc": [ + "【itemExtent】 : Tamaño del ítem en el eje 【double】", + "【offset】 : Desplazamiento de la vista 【ViewportOffset】", + "【childDelegate】 : Delegado de construcción de hijos 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Efecto de perspectiva en ListWheelViewport", + "desc": [ + "【perspective】 : Parámetro de perspectiva 【double】", + "【squeeze】 : Valor de compresión 【double】", + "【diameterRatio】 : Relación de diámetro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ampliación en ListWheelViewport", + "desc": [ + "【useMagnifier】 : Si se amplía 【bool】", + "【magnification】 : Proporción de ampliación 【double】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【renderChildrenOutsideViewport】 : Si se renderiza fuera de la vista 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Desplazamiento y opacidad", + "desc": [ + "【offAxisFraction】 : Relación de desplazamiento del centro del eje 【double】", + "【overAndUnderCenterOpacity】 : Opacidad fuera del amplificador 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json new file mode 100644 index 00000000..21e6c37f --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vue de roue de liste", + "info": "Une vue qui affiche une liste d'enfants sur une roue cylindrique, dépendance sous-jacente de ListWheelScrollView et CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple de ListWheelViewport", + "desc": [ + "【itemExtent】 : Taille de l'item axial 【double】", + "【offset】 : Décalage de la vue 【ViewportOffset】", + "【childDelegate】 : Constructeur de délégué enfant 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Effet de perspective de ListWheelViewport", + "desc": [ + "【perspective】 : Paramètre de perspective 【double】", + "【squeeze】 : Valeur de compression 【double】", + "【diameterRatio】 : Ratio de diamètre 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Agrandissement de ListWheelViewport", + "desc": [ + "【useMagnifier】 : Agrandir ou non 【bool】", + "【magnification】 : Taux d'agrandissement 【double】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【renderChildrenOutsideViewport】 : Rendu hors de la vue 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Décalage et opacité", + "desc": [ + "【offAxisFraction】 : Ratio de décalage du centre de l'axe 【double】", + "【overAndUnderCenterOpacity】 : Opacité en dehors de l'amplificateur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json new file mode 100644 index 00000000..aebbbc3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Vista della ruota di scorrimento", + "info": "Una vista che visualizza un elenco di elementi in una ruota cilindrica, è la dipendenza sottostante di ListWheelScrollView e CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice di ListWheelViewport", + "desc": [ + "【itemExtent】 : Dimensione dell'elemento lungo l'asse 【double】", + "【offset】 : Offset della vista 【ViewportOffset】", + "【childDelegate】 : Delegato di costruzione dei figli 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Effetto prospettico di ListWheelViewport", + "desc": [ + "【perspective】 : Parametro di prospettiva 【double】", + "【squeeze】 : Valore di compressione 【double】", + "【diameterRatio】 : Rapporto del diametro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ingrandimento di ListWheelViewport", + "desc": [ + "【useMagnifier】 : Se ingrandire 【bool】", + "【magnification】 : Rapporto di ingrandimento 【double】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【renderChildrenOutsideViewport】 : Se renderizzare i figli fuori dalla vista 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Offset e trasparenza", + "desc": [ + "【offAxisFraction】 : Rapporto di offset del centro dell'asse 【double】", + "【overAndUnderCenterOpacity】 : Trasparenza fuori dall'ingranditore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json new file mode 100644 index 00000000..ac889c04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "リストホイールビューポート", + "info": "子リストを円柱状のホイール上に表示するビューポートで、ListWheelScrollView、CupertinoPickerの基盤となる依存関係です", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport の簡単な使用", + "desc": [ + "【itemExtent】 : 軸方向のアイテムサイズ 【double】", + "【offset】 : ビューポートのオフセット 【ViewportOffset】", + "【childDelegate】 : 子デリゲートコンストラクタ 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport の遠近効果", + "desc": [ + "【perspective】 : 遠近パラメータ 【double】", + "【squeeze】 : 圧縮値 【double】", + "【diameterRatio】 : 直径比率 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport の拡大", + "desc": [ + "【useMagnifier】 : 拡大するかどうか 【bool】", + "【magnification】 : 拡大比率 【double】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【renderChildrenOutsideViewport】 : 視野外の子をレンダリングするか 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "オフセットと透明度", + "desc": [ + "【offAxisFraction】 : 軸中心のオフセット比率 【double】", + "【overAndUnderCenterOpacity】 : 拡大器外の透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json new file mode 100644 index 00000000..8e74bc4c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "리스트 휠 뷰포트", + "info": "자식 리스트를 원통형 휠에 표시하는 뷰포트로, ListWheelScrollView, CupertinoPicker의 기반이 됨", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelViewport 기본 사용법", + "desc": [ + "【itemExtent】 : 축 방향 아이템 크기 【double】", + "【offset】 : 뷰포트 오프셋 【ViewportOffset】", + "【childDelegate】 : 자식 위임 생성자 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "ListWheelViewport 원근 효과", + "desc": [ + "【perspective】 : 원근 매개변수 【double】", + "【squeeze】 : 압축 값 【double】", + "【diameterRatio】 : 직경 비율 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "ListWheelViewport 확대", + "desc": [ + "【useMagnifier】 : 확대 여부 【bool】", + "【magnification】 : 확대 비율 【double】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【renderChildrenOutsideViewport】 : 시야 밖 렌더링 여부 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "오프셋과 투명도", + "desc": [ + "【offAxisFraction】 : 축 중심 오프셋 비율 【double】", + "【overAndUnderCenterOpacity】 : 확대기 외부 투명도 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json new file mode 100644 index 00000000..5063eb01 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Porta de Roda de Lista", + "info": "Uma porta que exibe uma lista de filhos em uma roda cilíndrica, é a dependência subjacente de ListWheelScrollView e CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Simples de ListWheelViewport", + "desc": [ + "【itemExtent】 : Tamanho axial do item 【double】", + "【offset】 : Deslocamento da porta 【ViewportOffset】", + "【childDelegate】 : Construtor do delegado de filhos 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Efeito de Perspectiva de ListWheelViewport", + "desc": [ + "【perspective】 : Parâmetro de perspectiva 【double】", + "【squeeze】 : Valor de compressão 【double】", + "【diameterRatio】 : Razão de diâmetro 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Ampliação de ListWheelViewport", + "desc": [ + "【useMagnifier】 : Se amplia 【bool】", + "【magnification】 : Proporção de ampliação 【double】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【renderChildrenOutsideViewport】 : Se renderiza fora do campo de visão 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Deslocamento e Transparência", + "desc": [ + "【offAxisFraction】 : Razão de deslocamento do centro do eixo 【double】", + "【overAndUnderCenterOpacity】 : Transparência fora do ampliador 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json new file mode 100644 index 00000000..8b6bb345 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/ListWheelViewport/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 291, + "name": "ListWheelViewport", + "localName": "Вид списка колеса прокрутки", + "info": "Вид, который отображает список детей в виде цилиндрического колеса прокрутки, является базовой зависимостью для ListWheelScrollView и CupertinoPicker", + "lever": 4, + "family": 6, + "linkIds": [ + 179, + 139, + 137, + 253 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование ListWheelViewport", + "desc": [ + "【itemExtent】 : Размер элемента по оси 【double】", + "【offset】 : Смещение вида 【ViewportOffset】", + "【childDelegate】 : Делегат для создания детей 【ListWheelChildDelegate】" + ] + }, + { + "file": "node2_perspective.dart", + "name": "Эффект перспективы ListWheelViewport", + "desc": [ + "【perspective】 : Параметр перспективы 【double】", + "【squeeze】 : Значение сжатия 【double】", + "【diameterRatio】 : Коэффициент диаметра 【double】" + ] + }, + { + "file": "node3_magnifier.dart", + "name": "Увеличение ListWheelViewport", + "desc": [ + "【useMagnifier】 : Использовать ли увеличение 【bool】", + "【magnification】 : Коэффициент увеличения 【double】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【renderChildrenOutsideViewport】 : Рендерить ли детей за пределами вида 【bool】" + ] + }, + { + "file": "node4_opacity.dart", + "name": "Смещение и прозрачность", + "desc": [ + "【offAxisFraction】 : Отношение смещения от центра оси 【double】", + "【overAndUnderCenterOpacity】 : Прозрачность за пределами увеличителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json new file mode 100644 index 00000000..b54faf2e --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Leistungsüberlagerung", + "info": "Ermöglicht das einfache Aktivieren von zwei Leistungsüberwachungsdiagrammen, um die Änderungen der Bildrate beim Aktualisieren der Oberfläche zu verfolgen.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PerformanceOverlay", + "desc": [ + "Mit PerformanceOverlay.allEnabled können alle Überwachungsoptionen gestartet werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json new file mode 100644 index 00000000..5c7aa36a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Performance Overlay", + "info": "It is very convenient to enable two bar charts for performance monitoring, making it easy to see the changes in frame rate when refreshing the interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PerformanceOverlay", + "desc": [ + "Using PerformanceOverlay.allEnabled can start all monitoring items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json new file mode 100644 index 00000000..5af74d60 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Superposición de Rendimiento", + "info": "Permite habilitar muy convenientemente dos gráficos de barras para monitorear el rendimiento, facilitando la visualización de los cambios en la tasa de cuadros al actualizar la interfaz.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de PerformanceOverlay", + "desc": [ + "Usar PerformanceOverlay.allEnabled permite iniciar todos los elementos de monitoreo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json new file mode 100644 index 00000000..c60ad927 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Superposition de Performance", + "info": "Permet d'activer très facilement deux graphiques de surveillance des performances, facilitant la visualisation des variations de fréquence d'images lors du rafraîchissement de l'interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PerformanceOverlay", + "desc": [ + "Utiliser PerformanceOverlay.allEnabled pour démarrer tous les éléments de surveillance." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json new file mode 100644 index 00000000..f95c4684 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Sovrapposizione delle Prestazioni", + "info": "Può attivare molto comodamente due grafici a barre per il monitoraggio delle prestazioni, facilitando la visualizzazione delle variazioni della frequenza dei fotogrammi durante l'aggiornamento dell'interfaccia.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di PerformanceOverlay", + "desc": [ + "Utilizzando PerformanceOverlay.allEnabled è possibile avviare tutti gli elementi di monitoraggio." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json new file mode 100644 index 00000000..9523d59b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "パフォーマンスオーバーレイ", + "info": "パフォーマンスモニタリングの2つの柱グラフを非常に簡単に有効にでき、インターフェースのリフレッシュ時のフレームレートの変化を簡単に確認できます。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlayの基本使用", + "desc": [ + "PerformanceOverlay.allEnabledを使用してすべての監視項目を開始できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json new file mode 100644 index 00000000..6d4084ca --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "성능 오버레이", + "info": "성능 모니터링을 매우 편리하게 시작할 수 있는 두 개의 막대 그래프로, 화면을 새로 고칠 때 프레임 속도 변화를 쉽게 확인할 수 있습니다.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PerformanceOverlay 기본 사용", + "desc": [ + "PerformanceOverlay.allEnabled를 사용하여 모든 모니터링 항목을 시작할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json new file mode 100644 index 00000000..e17a5236 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Camada de Desempenho", + "info": "Permite ativar de forma muito conveniente dois gráficos de barras para monitorizar o desempenho, facilitando a visualização das mudanças na taxa de frames ao atualizar a interface.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PerformanceOverlay", + "desc": [ + "Usar PerformanceOverlay.allEnabled permite iniciar todos os itens de monitorização." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json new file mode 100644 index 00000000..85386e6a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/PerformanceOverlay/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 312, + "name": "PerformanceOverlay", + "localName": "Наложение производительности", + "info": "Очень удобно включить два столбчатых графика для мониторинга производительности, чтобы легко отслеживать изменения частоты кадров при обновлении интерфейса.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PerformanceOverlay", + "desc": [ + "Использование PerformanceOverlay.allEnabled позволяет начать все элементы мониторинга." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json new file mode 100644 index 00000000..2e357466 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Originalbild", + "info": "Ist die Kernkomponente zur Implementierung der Image-Komponente, kann das Image der UI anzeigen, die grundlegenden Eigenschaften sind identisch mit Image, wird selten allein verwendet.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawImage", + "desc": [ + "【image】 : Bild 【ui.Image】", + "【width】 : Breite 【int】", + "【height】: Höhe 【int】", + "【isAntiAlias】: Anti-Aliasing 【bool】", + "【filterQuality】: Filterqualität 【FilterQuality】", + "Viele Eigenschaften sind identisch mit Image, siehe dort." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json new file mode 100644 index 00000000..46bb1bf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Original Image", + "info": "It is the core component that implements the Image component, can display the ui.Image, and has the same basic properties as Image. It is rarely used alone.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawImage", + "desc": [ + "【image】: Image 【ui.Image】", + "【width】: Width 【int】", + "【height】: Height 【int】", + "【isAntiAlias】: Whether to anti-alias 【bool】", + "【filterQuality】: Filter quality 【FilterQuality】", + "Many properties are the same as Image, see details there." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json new file mode 100644 index 00000000..8ea04832 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Imagen Original", + "info": "Es el componente central que implementa el componente Image, puede mostrar la Image de la interfaz de usuario, las propiedades básicas son las mismas que Image, rara vez se usa por separado.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawImage", + "desc": [ + "【image】: Imagen 【ui.Image】", + "【width】: Ancho 【int】", + "【height】: Alto 【int】", + "【isAntiAlias】: Si es antialiasing 【bool】", + "【filterQuality】: Calidad de filtro 【FilterQuality】", + "Muchas propiedades son las mismas que Image, consulte para más detalles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json new file mode 100644 index 00000000..7db14198 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Image originale", + "info": "C'est le composant central pour implémenter le composant Image, capable d'afficher une image UI. Ses propriétés de base sont similaires à celles de Image, et il est rarement utilisé seul.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawImage", + "desc": [ + "【image】 : Image 【ui.Image】", + "【width】 : Largeur 【int】", + "【height】: Hauteur 【int】", + "【isAntiAlias】: Anti-crénelage 【bool】", + "【filterQuality】: Qualité de filtrage 【FilterQuality】", + "De nombreuses propriétés sont similaires à Image, voir les détails." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json new file mode 100644 index 00000000..91c6ac67 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Immagine originale", + "info": "È il componente principale per implementare il componente Image, può visualizzare l'Image dell'interfaccia utente, le proprietà di base sono le stesse di Image, generalmente raramente usato da solo.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RawImage", + "desc": [ + "【image】 : Immagine 【ui.Image】", + "【width】 : Larghezza 【int】", + "【height】: Altezza 【int】", + "【isAntiAlias】: Anti-alias 【bool】", + "【filterQuality】: Qualità del filtro 【FilterQuality】", + "Molte proprietà sono le stesse di Image, vedi dettagli." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json new file mode 100644 index 00000000..aae1a631 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "元画像", + "info": "Imageコンポーネントのコアコンポーネントであり、uiのImageを表示できます。基本的な属性はImageと同じで、単独で使用されることはほとんどありません。", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImageの基本使用", + "desc": [ + "【image】 : 画像 【ui.Image】", + "【width】 : 幅 【int】", + "【height】: 高さ 【int】", + "【isAntiAlias】: アンチエイリアスかどうか 【bool】", + "【filterQuality】: フィルタ品質 【FilterQuality】", + "多くの属性はImageと同じです。詳細はそちらを参照してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json new file mode 100644 index 00000000..b4b0dd6c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "원본 이미지", + "info": "Image 컴포넌트를 구현하는 핵심 컴포넌트로, ui의 Image를 표시할 수 있으며, 기본 속성은 Image와 동일하며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawImage 기본 사용", + "desc": [ + "【image】 : 이미지 【ui.Image】", + "【width】 : 너비 【int】", + "【height】: 높이 【int】", + "【isAntiAlias】: 안티앨리어싱 여부 【bool】", + "【filterQuality】: 필터 품질 【FilterQuality】", + "많은 속성이 Image와 동일하니, 자세한 내용은 해당 항목을 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json new file mode 100644 index 00000000..bb06bf43 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Imagem Original", + "info": "É o componente central que implementa o componente Image, pode exibir a Image da ui, as propriedades básicas são as mesmas que a Image, raramente é usado sozinho.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawImage", + "desc": [ + "【image】 : Imagem 【ui.Image】", + "【width】 : Largura 【int】", + "【height】: Altura 【int】", + "【isAntiAlias】: Anti-aliasing 【bool】", + "【filterQuality】: Qualidade do Filtro 【FilterQuality】", + "Muitas propriedades são as mesmas que a Image, consulte para mais detalhes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json new file mode 100644 index 00000000..062b9d79 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RawImage/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 313, + "name": "RawImage", + "localName": "Исходное изображение", + "info": "Это основной компонент, реализующий компонент Image, который может отображать изображение UI. Основные свойства такие же, как у Image, и он редко используется отдельно.", + "lever": 2, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawImage", + "desc": [ + "【image】 : изображение 【ui.Image】", + "【width】 : ширина 【int】", + "【height】: высота 【int】", + "【isAntiAlias】: сглаживание 【bool】", + "【filterQuality】: качество фильтрации 【FilterQuality】", + "Многие свойства такие же, как у Image, подробнее см. в нем." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json new file mode 100644 index 00000000..93d8f92c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Stammkomponente", + "info": "Brücke zwischen RenderObject und Element-Baum.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Rendering-Objekt 【RenderObjectWithChildMixin】", + "【child】 : Unterkomponente 【Widget】", + "【debugShortDescription】 : Debug-Kurzbeschreibung 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json new file mode 100644 index 00000000..ef938e9e --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Root Component", + "info": "The bridge between RenderObject and Element tree.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Render object 【RenderObjectWithChildMixin】", + "【child】 : Child component 【Widget】", + "【debugShortDescription】 : Debugging introduction 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json new file mode 100644 index 00000000..9120b742 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente raíz", + "info": "Puente entre RenderObject y el árbol de Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Objeto de renderizado 【RenderObjectWithChildMixin】", + "【child】 : Componente hijo 【Widget】", + "【debugShortDescription】 : Descripción corta de depuración 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json new file mode 100644 index 00000000..ea95a3db --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Composant racine", + "info": "Pont entre RenderObject et l'arbre Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : objet de rendu 【RenderObjectWithChildMixin】", + "【child】 : composant enfant 【Widget】", + "【debugShortDescription】 : description de débogage 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json new file mode 100644 index 00000000..a0e27e51 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente radice", + "info": "Ponte tra RenderObject e l'albero degli Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Oggetto di rendering 【RenderObjectWithChildMixin】", + "【child】 : Componente figlio 【Widget】", + "【debugShortDescription】 : Breve descrizione di debug 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json new file mode 100644 index 00000000..206fc9fc --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "ルートコンポーネント", + "info": "RenderObject と Element ツリーの橋渡し。", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 紹介", + "desc": [ + "【container】 : レンダリングオブジェクト 【RenderObjectWithChildMixin】", + "【child】 : 子コンポーネント 【Widget】", + "【debugShortDescription】 : デバッグ概要 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json new file mode 100644 index 00000000..35c8289a --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "루트 컴포넌트", + "info": "RenderObject와 Element 트리의 다리.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RenderObjectToWidgetAdapter 소개", + "desc": [ + "【container】 : 렌더링 객체 【RenderObjectWithChildMixin】", + "【child】 : 자식 컴포넌트 【Widget】", + "【debugShortDescription】 : 디버그 간략 설명 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json new file mode 100644 index 00000000..dbbcb458 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Componente Raiz", + "info": "Ponte entre RenderObject e a árvore de Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Objeto de renderização 【RenderObjectWithChildMixin】", + "【child】 : Componente filho 【Widget】", + "【debugShortDescription】 : Breve descrição de depuração 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json new file mode 100644 index 00000000..39198c7b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/RenderObjectToWidgetAdapter/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 289, + "name": "RenderObjectToWidgetAdapter", + "localName": "Корневой компонент", + "info": "Мост между RenderObject и деревом Element.", + "lever": 1, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в RenderObjectToWidgetAdapter", + "desc": [ + "【container】 : Объект рендеринга 【RenderObjectWithChildMixin】", + "【child】 : Дочерний компонент 【Widget】", + "【debugShortDescription】 : Краткое описание для отладки 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json b/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json new file mode 100644 index 00000000..f8555231 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Tabellenkomponente", + "info": "Eine Komponente zur Anzeige von Tabellen, bei der Eigenschaften wie Rahmen, Spaltenbreite, Textrichtung usw. angegeben werden können. Der Kernobjekttyp ist TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Table", + "desc": [ + "【children】: Widget-Liste 【List】", + "【columnWidths】: Spaltenbreite 【Map】", + "【defaultColumnWidth】: Standardspaltenbreite 【TableColumnWidth】", + "【border】: Rahmen 【TableBorder】", + "【textDirection】: Textrichtung 【TextDirection】", + "【defaultVerticalAlignment】: Vertikale Ausrichtung der Zellen 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json b/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json new file mode 100644 index 00000000..0e58923b --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Table Component", + "info": "A component for displaying tables, which can specify properties such as borders, column widths, text direction, etc. The core object type is TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Table", + "desc": [ + "【children】: Component list 【List】", + "【columnWidths】: Column widths 【Map】", + "【defaultColumnWidth】: Default column width 【TableColumnWidth】", + "【border】: Border 【TableBorder】", + "【textDirection】: Text direction 【TextDirection】", + "【defaultVerticalAlignment】: Vertical alignment mode of cells 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json b/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json new file mode 100644 index 00000000..34ded904 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente de tabla", + "info": "Componente utilizado para mostrar tablas, se pueden especificar atributos como bordes, ancho de columna, dirección del texto, etc. El tipo de objeto principal es TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Table", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【columnWidths】 : Ancho de columna 【Map】", + "【defaultColumnWidth】 : Ancho de columna predeterminado 【TableColumnWidth】", + "【border】 : Borde 【TableBorder】", + "【textDirection】 : Dirección del texto 【TextDirection】", + "【defaultVerticalAlignment】 : Modo de alineación vertical de la celda 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json b/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json new file mode 100644 index 00000000..790cee5c --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Composant de tableau", + "info": "Composant utilisé pour afficher des tableaux, permettant de spécifier des propriétés telles que les bordures, la largeur des colonnes, la direction du texte, etc. Le type d'objet principal est TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Table", + "desc": [ + "【children】 : Liste des composants 【List】", + "【columnWidths】 : Largeur des colonnes 【Map】", + "【defaultColumnWidth】 : Largeur de colonne par défaut 【TableColumnWidth】", + "【border】 : Bordure 【TableBorder】", + "【textDirection】 : Direction du texte 【TextDirection】", + "【defaultVerticalAlignment】 : Mode d'alignement vertical des cellules 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json b/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json new file mode 100644 index 00000000..f77e38ba --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente tabella", + "info": "Componente utilizzato per visualizzare tabelle, è possibile specificare attributi come bordi, larghezza delle colonne, direzione del testo, ecc. Il tipo di oggetto principale è TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Table", + "desc": [ + "【children】 : Lista dei componenti 【List】", + "【columnWidths】 : Larghezza delle colonne 【Map】", + "【defaultColumnWidth】 : Larghezza predefinita delle colonne 【TableColumnWidth】", + "【border】 : Bordo 【TableBorder】", + "【textDirection】 : Direzione del testo 【TextDirection】", + "【defaultVerticalAlignment】 : Modalità di allineamento verticale delle celle 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json b/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json new file mode 100644 index 00000000..63bdadae --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "テーブルコンポーネント", + "info": "テーブルを表示するためのコンポーネントで、境界線、列幅、テキストの方向などの属性を指定できます。コアオブジェクトタイプはTableRowです。", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テーブルの基本使用", + "desc": [ + "【children】 : コンポーネントリスト 【List】", + "【columnWidths】 : 列幅 【Map】", + "【defaultColumnWidth】 : デフォルトの列幅 【TableColumnWidth】", + "【border】 : 境界線 【TableBorder】", + "【textDirection】 : テキストの方向 【TextDirection】", + "【defaultVerticalAlignment】 : セルの垂直方向の整列モード 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json b/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json new file mode 100644 index 00000000..1be34418 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "테이블 컴포넌트", + "info": "테이블을 표시하는 컴포넌트로, 테두리, 열 너비, 텍스트 방향 등의 속성을 지정할 수 있으며, 핵심 객체 유형은 TableRow입니다.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Table 기본 사용법", + "desc": [ + "【children】 : 컴포넌트 리스트 【List】", + "【columnWidths】 : 열 너비 【Map】", + "【defaultColumnWidth】 : 기본 열 너비 【TableColumnWidth】", + "【border】 : 테두리 【TableBorder】", + "【textDirection】 : 텍스트 방향 【TextDirection】", + "【defaultVerticalAlignment】 : 셀 세로 정렬 모드 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json b/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json new file mode 100644 index 00000000..c1a9f991 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Componente de Tabela", + "info": "Componente utilizado para exibir tabelas, pode especificar propriedades como bordas, largura das colunas, direção do texto, etc., o tipo de objeto principal é TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico da Tabela", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【columnWidths】 : Largura das colunas 【Map】", + "【defaultColumnWidth】 : Largura padrão da coluna 【TableColumnWidth】", + "【border】 : Borda 【TableBorder】", + "【textDirection】 : Direção do texto 【TextDirection】", + "【defaultVerticalAlignment】 : Modo de alinhamento vertical das células 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json b/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json new file mode 100644 index 00000000..c3045e21 --- /dev/null +++ b/modules/widget_system/widgets/lib/Other/Table/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 110, + "name": "Table", + "localName": "Компонент таблицы", + "info": "Компонент для отображения таблиц, может задавать свойства границ, ширины столбцов, направления текста и т.д. Основной тип объекта - TableRow.", + "lever": 4, + "family": 6, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Table", + "desc": [ + "【children】 : Список компонентов 【List】", + "【columnWidths】 : Ширина столбцов 【Map】", + "【defaultColumnWidth】 : Ширина столбца по умолчанию 【TableColumnWidth】", + "【border】 : Границы 【TableBorder】", + "【textDirection】 : Направление текста 【TextDirection】", + "【defaultVerticalAlignment】 : Режим выравнивания по вертикали в ячейке 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json new file mode 100644 index 00000000..4d5f47cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Button-Leiste Thema", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende ButtonBar-Komponenten festzulegen. Es kann auch verwendet werden, um die Attribute des Standard-ButtonBarThemas zu erhalten.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ButtonBarTheme", + "desc": [ + "Kann die ButtonBarThemeData-Attribute festlegen, um Standardstile für nachfolgende ButtonBar-Komponenten zu setzen, wie Ausrichtung, Stil, Ränder usw. Es kann auch ButtonBarTheme.of verwendet werden, um die Theme-Attribute der ButtonBar zu erhalten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json new file mode 100644 index 00000000..cb837bfe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Button Bar Theme", + "info": "Mainly used to set default properties for descendant ButtonBar components uniformly. It can also be used to obtain the properties of the default ButtonBarTheme.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ButtonBarTheme", + "desc": [ + "You can specify the ButtonBarThemeData properties to set default styles for descendant ButtonBar components, such as alignment, style, margins, etc. You can also use ButtonBarTheme.of to get the theme properties of ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json new file mode 100644 index 00000000..e249df4f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema de la barra de botones", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes ButtonBar descendientes, también se pueden obtener las propiedades del tema ButtonBarTheme predeterminado a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ButtonBarTheme", + "desc": [ + "Se puede especificar el atributo de datos ButtonBarThemeData para establecer el estilo predeterminado para los componentes ButtonBar descendientes, como la alineación, el estilo, los márgenes, etc. También se puede usar ButtonBarTheme.of para obtener las propiedades del tema ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json new file mode 100644 index 00000000..f73070f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Thème de la barre de boutons", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants ButtonBar descendants. Il est également possible d'obtenir les propriétés du ButtonBarTheme par défaut via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ButtonBarTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ButtonBarThemeData pour définir le style par défaut des composants ButtonBar descendants, tels que l'alignement, le style, les marges, etc. Vous pouvez également utiliser ButtonBarTheme.of pour obtenir les propriétés du thème ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json new file mode 100644 index 00000000..9f3b9fa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema della barra dei pulsanti", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ButtonBar discendenti, oppure per ottenere le proprietà del tema ButtonBarTheme predefinito tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ButtonBarTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ButtonBarThemeData per impostare lo stile predefinito per i componenti ButtonBar discendenti, come allineamento, stile, margini, ecc. È anche possibile utilizzare ButtonBarTheme.of per ottenere le proprietà del tema ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json new file mode 100644 index 00000000..c74d681e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "ボタンバーテーマ", + "info": "主に子孫のButtonBarコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのButtonBarThemeのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarThemeの基本的な使用", + "desc": [ + "ButtonBarThemeDataデータ属性を指定して、子孫のButtonBarコンポーネントにデフォルトのスタイルを設定できます。例えば、配置、スタイル、余白などです。また、ButtonBarTheme.ofを使用してButtonBarのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json new file mode 100644 index 00000000..50339341 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "버튼 바 테마", + "info": "주로 후손 ButtonBar 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 ButtonBarTheme의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarTheme 기본 사용법", + "desc": [ + "ButtonBarThemeData 데이터 속성을 지정하여 후손 ButtonBar 컴포넌트의 기본 스타일(예: 정렬 방식, 스타일, 여백 등)을 설정할 수 있습니다. 또한 ButtonBarTheme.of를 사용하여 ButtonBar의 테마 속성을 가져올 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json new file mode 100644 index 00000000..058b46e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Tema da Barra de Botões", + "info": "Principalmente usado para definir propriedades padrão para componentes ButtonBar descendentes, também pode ser usado para obter as propriedades do ButtonBarTheme padrão.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ButtonBarTheme", + "desc": [ + "Pode especificar as propriedades de dados do ButtonBarThemeData para definir o estilo padrão para componentes ButtonBar descendentes, como alinhamento, estilo, margens, etc. Também pode usar ButtonBarTheme.of para obter as propriedades do tema do ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json new file mode 100644 index 00000000..5bdfa179 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonBarTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 338, + "name": "ButtonBarTheme", + "localName": "Тема панели кнопок", + "info": "В основном используется для установки стандартных свойств для компонентов ButtonBar у потомков, также можно получить свойства стандартной ButtonBarTheme через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ButtonBarTheme", + "desc": [ + "Можно указать свойства данных ButtonBarThemeData для установки стандартного стиля для компонентов ButtonBar у потомков, таких как выравнивание, стиль, отступы и т.д. Также можно использовать ButtonBarTheme.of для получения темы ButtonBar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json new file mode 100644 index 00000000..6deddb8e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Schaltflächendesign", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende Schaltflächenkomponenten festzulegen. Es kann auch verwendet werden, um die Standardattribute der Schaltfläche zu erhalten.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von ButtonTheme", + "desc": [ + "Die Attribute sind die gleichen wie bei MaterialButton. Die Schaltflächendesign-Daten können über ButtonTheme.of abgerufen werden.", + "Es kann auch das Standarddesign für Schaltflächenkomponenten, die Nachkommen von ButtonTheme sind, festgelegt werden, einschließlich Farbe, Form, Größe usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json new file mode 100644 index 00000000..86283d7d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Button Style", + "info": "Mainly used to set default properties for descendant Button-type components uniformly, and also to obtain the default properties of a Button through this component.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme Usage", + "desc": [ + "The property parameters are the same as MaterialButton. You can obtain button theme data through ButtonTheme.of, \"", + "and also set default styles for button components that are descendants of ButtonTheme, including color, shape, size, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json new file mode 100644 index 00000000..d3a22e41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema del botón", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes de tipo Button en los descendientes, también se pueden obtener las propiedades predeterminadas del Button a través de este componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de ButtonTheme", + "desc": [ + "Los parámetros de las propiedades son los mismos que MaterialButton, se pueden obtener los datos del tema del botón a través de ButtonTheme.of, \"", + "también se pueden establecer estilos predeterminados para los componentes de botón descendientes de ButtonTheme, incluyendo color, forma, tamaño, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json new file mode 100644 index 00000000..729454fa --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Thème de bouton", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Button pour les descendants, ou pour obtenir les propriétés par défaut d'un Button via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de ButtonTheme", + "desc": [ + "Les paramètres des propriétés sont les mêmes que MaterialButton, vous pouvez obtenir les données du thème du bouton via ButtonTheme.of, \"", + "ou définir le style par défaut pour les composants bouton descendants de ButtonTheme, y compris la couleur, la forme, la taille, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json new file mode 100644 index 00000000..6fc4a22d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema del pulsante", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Button discendenti, o per ottenere le proprietà predefinite del Button attraverso questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di ButtonTheme", + "desc": [ + "I parametri delle proprietà sono gli stessi di MaterialButton, è possibile ottenere i dati del tema del pulsante tramite ButtonTheme.of, \"", + "è anche possibile impostare lo stile predefinito per i componenti pulsante discendenti di ButtonTheme, inclusi colore, forma, dimensione, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json new file mode 100644 index 00000000..3b65829d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "ボタンスタイル", + "info": "主に子孫のButtonタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのButtonのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonThemeの使用", + "desc": [ + "MaterialButtonと同じ属性パラメータで、ButtonTheme.ofを使用してボタンのテーマデータを取得できます。", + "また、ButtonThemeの【子孫】のボタンコンポーネントにデフォルトのスタイルを設定することもできます。これには色、形状、サイズなどが含まれます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json new file mode 100644 index 00000000..ef5b7c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "버튼 스타일", + "info": "주로 후손 Button 유형의 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Button의 속성을 얻을 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonTheme 사용", + "desc": [ + "속성 매개변수는 MaterialButton과 동일하며, ButtonTheme.of를 통해 버튼 테마 데이터를 얻을 수 있습니다.", + "또한 ButtonTheme의 【후손】 버튼 컴포넌트에 기본 스타일(색상, 모양, 크기 등)을 설정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json new file mode 100644 index 00000000..c33815d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Tema do Botão", + "info": "Principalmente usado para definir propriedades padrão uniformes para componentes do tipo Button descendentes, também pode ser usado para obter as propriedades padrão do Button através deste componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do ButtonTheme", + "desc": [ + "Os parâmetros de propriedade são os mesmos que o MaterialButton, os dados do tema do botão podem ser obtidos através de ButtonTheme.of,", + "também pode definir estilos padrão para componentes de botão descendentes do ButtonTheme, incluindo cor, forma, tamanho, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json new file mode 100644 index 00000000..03a5a59b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ButtonTheme/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 326, + "name": "ButtonTheme", + "localName": "Тема кнопки", + "info": "В основном используется для установки стандартных свойств для компонентов типа Button у потомков, также можно получить свойства стандартной кнопки через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование ButtonTheme", + "desc": [ + "Параметры свойств аналогичны MaterialButton, можно получить данные темы кнопки через ButtonTheme.of,", + "также можно установить стандартные стили для компонентов кнопок-потомков ButtonTheme, включая цвет, форму, размер и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json new file mode 100644 index 00000000..b875ae52 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Chip-Stil", + "info": "Wird hauptsächlich verwendet, um Standardattribute für Chip-Typ-Komponenten für Nachkommen festzulegen. Es kann auch verwendet werden, um die Standardattribute des Chips abzurufen.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ChipTheme", + "desc": [ + "Kann ChipThemeData-Datenattribute angeben, um Standardstile für Chip-Typ-Komponenten für Nachkommen festzulegen. Die Attribute ähneln denen des Chips, wie Schatten, Farbe, Abstand, Form, Textstil usw. ChipTheme.of kann auch verwendet werden, um die Themendaten des Chips abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json new file mode 100644 index 00000000..8007a4be --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Chip Style", + "info": "Mainly used to set default properties for Chip type components of descendants, and can also be used to obtain the default properties of Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ChipTheme", + "desc": [ + "You can specify the ChipThemeData properties to set default styles for Chip type components of descendants. The properties are similar to those of Chip, such as shadow, color, margin, shape, text style, etc. You can also use ChipTheme.of to get the theme data of Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json new file mode 100644 index 00000000..7621db9a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Estilo de Chip", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para componentes de tipo Chip descendientes, también se puede utilizar este componente para obtener las propiedades predeterminadas de Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ChipTheme", + "desc": [ + "Se pueden especificar las propiedades de datos de ChipThemeData para establecer estilos predeterminados para componentes de tipo Chip descendientes, las propiedades son similares a las de Chip, como sombras, colores, márgenes, formas, estilos de texto, etc. También se puede usar ChipTheme.of para obtener los datos del tema de Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json new file mode 100644 index 00000000..aad67185 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Style de la petite barre", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Chip pour les descendants, il est également possible d'obtenir les propriétés par défaut de Chip via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ChipTheme", + "desc": [ + "Il est possible de spécifier les propriétés de données ChipThemeData pour définir le style par défaut des composants de type Chip pour les descendants, les propriétés sont similaires à celles de Chip, telles que l'ombre, la couleur, la marge, la forme, le style de texte, etc. Il est également possible d'obtenir les données de thème de Chip en utilisant ChipTheme.of." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json new file mode 100644 index 00000000..ec2f5d99 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Stile della linguetta", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Chip discendenti, è anche possibile ottenere le proprietà predefinite di Chip tramite questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ChipTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ChipThemeData per impostare lo stile predefinito per i componenti di tipo Chip discendenti, le proprietà sono simili a quelle di Chip, come ombre, colori, margini, forme, stili di testo, ecc. È anche possibile utilizzare ChipTheme.of per ottenere i dati del tema di Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json new file mode 100644 index 00000000..047f618a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "チップスタイル", + "info": "主に子孫のChipタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのChipのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipThemeの基本使用", + "desc": [ + "ChipThemeDataデータプロパティを指定して、【子孫】のChipタイプコンポーネントにデフォルトのスタイルを設定できます。プロパティはChipのプロパティと似ており、影、色、余白、形状、テキストスタイルなどがあります。また、ChipTheme.ofを使用してChipのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json new file mode 100644 index 00000000..596a5bec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "칩 스타일", + "info": "주로 후손의 Chip 타입 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Chip의 속성을 가져올 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChipTheme 기본 사용", + "desc": [ + "ChipThemeData 데이터 속성을 지정하여 【후손】의 Chip 타입 컴포넌트에 기본 스타일을 설정할 수 있습니다. 속성은 Chip 속성과 유사하며, 그림자, 색상, 여백, 모양, 텍스트 스타일 등이 포함됩니다. 또한 ChipTheme.of를 사용하여 Chip의 테마 데이터를 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json new file mode 100644 index 00000000..e2c9f4bd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Estilo de Chip", + "info": "Principalmente usado para definir propriedades padrão para componentes do tipo Chip descendentes, também pode ser usado para obter as propriedades padrão do Chip.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ChipTheme", + "desc": [ + "Pode especificar as propriedades de dados do ChipThemeData para definir o estilo padrão para componentes do tipo Chip descendentes, as propriedades são semelhantes às do Chip, como sombra, cor, margem, forma, estilo de texto, etc. Também pode usar ChipTheme.of para obter os dados do tema do Chip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json new file mode 100644 index 00000000..11fa7bbb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ChipTheme/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 328, + "name": "ChipTheme", + "localName": "Стиль чипа", + "info": "В основном используется для установки стандартных атрибутов для компонентов типа Chip у потомков, также можно получить атрибуты стандартного Chip через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 11, + 153, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ChipTheme", + "desc": [ + "Можно указать атрибуты данных ChipThemeData для установки стандартного стиля для компонентов типа Chip у потомков, атрибуты аналогичны атрибутам Chip, такие как тень, цвет, отступы, форма, стиль текста и т.д. Также можно получить данные темы Chip с помощью ChipTheme.of." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json new file mode 100644 index 00000000..984b189a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Benutzeroberflächenebene", + "info": "Ein Konzept in iOS, die visuelle Ebene der Benutzeroberfläche UIUserInterfaceLevel, unterteilt in base und elevated. Als InheritedWidget dient es hauptsächlich dazu, diese Daten zu teilen.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) kann CupertinoUserInterfaceLevelData-Daten abrufen. Mit dieser Komponente können auch diese Daten eingerichtet und mit Unterbäumen geteilt werden. Weitere Informationen zur Datenquelle finden Sie unter: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json new file mode 100644 index 00000000..608bb59b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "User Interface Level", + "info": "A concept in iOS, the content visibility level UIUserInterfaceLevel, divided into base and elevated. As an InheritedWidget, it mainly shares this data.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) can retrieve CupertinoUserInterfaceLevelData. This component can also be used to set and share this data with the subtree. For more information about the data source, see: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json new file mode 100644 index 00000000..7c2124b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Nivel de Interfaz de Usuario", + "info": "Concepto en iOS, nivel de visibilidad del contenido UIUserInterfaceLevel, dividido en base y elevated. Como un InheritedWidget, su función principal es compartir estos datos.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) puede obtener los datos de CupertinoUserInterfaceLevelData. También se puede usar este componente para configurar y compartir estos datos con el subárbol. Para más detalles sobre el origen de los datos, consulte: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json new file mode 100644 index 00000000..2c153d74 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Niveau de l'interface utilisateur", + "info": "Concept dans iOS, niveau de visibilité du contenu UIUserInterfaceLevel, divisé en base et elevated. En tant que InheritedWidget, il partage principalement ces données.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) peut récupérer les données CupertinoUserInterfaceLevelData. Ce composant peut également être utilisé pour partager ces données avec le sous-arbre. Pour plus d'informations sur le diagramme des données, voir : https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json new file mode 100644 index 00000000..17e17a49 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Livello dell'interfaccia utente", + "info": "Concetto in iOS, livello visivo del contenuto UIUserInterfaceLevel, diviso in base e elevated. Come InheritedWidget, principalmente condivide questi dati.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) può ottenere i dati di CupertinoUserInterfaceLevelData. Puoi anche utilizzare questo componente per impostare e condividere questi dati con il sottoalbero. Per ulteriori informazioni sui dati originali, consulta: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json new file mode 100644 index 00000000..abbec8fb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "ユーザーインターフェースレベル", + "info": "iOS の概念で、コンテンツの可視レベル UIUserInterfaceLevel で、base と elevated に分かれています。InheritedWidget として、主にこのデータを共有します。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 紹介", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) を使用して CupertinoUserInterfaceLevelData データを取得できます。また、このコンポーネントを使用してデータを設定し、サブツリーと共有することもできます。データの詳細については、以下を参照してください: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json new file mode 100644 index 00000000..b4ab14be --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "사용자 인터페이스 레벨", + "info": "iOS의 개념으로, 콘텐츠 가시성 레벨인 UIUserInterfaceLevel을 의미하며, base와 elevated로 나뉩니다. InheritedWidget으로서, 주로 이 데이터를 공유하는 역할을 합니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoUserInterfaceLevel 소개", + "desc": [ + "CupertinoUserInterfaceLevel.of(context)를 통해 CupertinoUserInterfaceLevelData 데이터를 얻을 수 있습니다. 또한 이 컴포넌트를 사용하여 해당 데이터를 설정하고 서브트리와 공유할 수 있습니다. 데이터 원본에 대한 자세한 내용은 다음을 참조하세요: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json new file mode 100644 index 00000000..7f712dbf --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Nível de Interface do Utilizador", + "info": "Conceito no iOS, nível de visibilidade do conteúdo UIUserInterfaceLevel, dividido em base e elevado. Como um InheritedWidget, o principal objetivo é compartilhar esses dados.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) pode obter os dados CupertinoUserInterfaceLevelData. Também pode usar este componente para definir e compartilhar esses dados com a subárvore. Para mais detalhes sobre o diagrama de dados, consulte: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json new file mode 100644 index 00000000..de7b0577 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/CupertinoUserInterfaceLevel/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 337, + "name": "CupertinoUserInterfaceLevel", + "localName": "Уровень пользовательского интерфейса", + "info": "Концепция в ios, уровень видимости контента UIUserInterfaceLevel, разделяется на base и elevated. Как InheritedWidget, в основном используется для обмена этими данными.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в CupertinoUserInterfaceLevel", + "desc": [ + "CupertinoUserInterfaceLevel.of(context) может получить данные CupertinoUserInterfaceLevelData. Также можно использовать этот компонент для настройки и обмена этих данных с поддеревом. Подробнее о данных см.: https://developer.apple.com/documentation/uikit/uiuserinterfacelevel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json new file mode 100644 index 00000000..d7b33549 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Standard-Ressourcenpaket", + "info": "Ein InheritedWidget, das nach der Einstellung des AssetBundle-Objekts es den Knoten nach diesem Knoten ermöglicht, das AssetBundle-Objekt über DefaultAssetBundle.of(context) zu erhalten, um auf Ressourcendateien zuzugreifen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in DefaultAssetBundle", + "desc": [ + "【bundle】 : *Ressourcenpaket 【AssetBundle】", + "【child】 : *Untergeordnete Komponente 【Widget】", + "Wir können unser eigenes DefaultAssetBundle definieren, das von nachfolgenden Knoten verwendet wird, oder direkt das Standardpaket verwenden. Dieses Beispiel zeigt, wie ein Ressourcenbild mithilfe des von Framework bereitgestellten DefaultAssetBundle geladen und angezeigt wird." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json new file mode 100644 index 00000000..36677835 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Default Asset Bundle", + "info": "An InheritedWidget that sets the AssetBundle object. After setting, the context of the nodes following this node can obtain the AssetBundle object through DefaultAssetBundle.of(context) for accessing resource files.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to DefaultAssetBundle", + "desc": [ + "【bundle】: *Resource Bundle 【AssetBundle】", + "【child】: *Child Widget 【Widget】", + "We can define our own DefaultAssetBundle for use by subsequent nodes, or we can directly use the default one. This case demonstrates loading and displaying a resource image using the DefaultAssetBundle provided by the framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json new file mode 100644 index 00000000..26058f6d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Paquete de recursos predeterminado", + "info": "Un InheritedWidget que, después de configurar el objeto AssetBundle, permite que los nodos posteriores en el contexto obtengan el objeto AssetBundle a través de DefaultAssetBundle.of(context) para acceder a los archivos de recursos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a DefaultAssetBundle", + "desc": [ + "【bundle】 : *Paquete de recursos 【AssetBundle】", + "【child】 : *Componente hijo 【Widget】", + "Podemos definir nuestro propio DefaultAssetBundle para que lo usen los nodos posteriores, o podemos usar el predeterminado directamente. Este caso demuestra cómo cargar y mostrar una imagen de recursos utilizando el DefaultAssetBundle proporcionado por el marco." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json new file mode 100644 index 00000000..2e711023 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Paquet de ressources par défaut", + "info": "Un InheritedWidget, après avoir défini l'objet AssetBundle, les nœuds suivants dans le contexte peuvent obtenir l'objet AssetBundle via DefaultAssetBundle.of(context) pour accéder aux fichiers de ressources.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Présentation de DefaultAssetBundle", + "desc": [ + "【bundle】 : *Paquet de ressources 【AssetBundle】", + "【child】 : *Composant enfant 【Widget】", + "Nous pouvons définir notre propre DefaultAssetBundle pour une utilisation ultérieure par les nœuds suivants, ou utiliser directement celui par défaut. Ce cas montre comment charger et afficher une image de ressource en utilisant le DefaultAssetBundle fourni par le framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json new file mode 100644 index 00000000..150558b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Pacchetto di risorse predefinito", + "info": "Un InheritedWidget che, una volta impostato l'oggetto AssetBundle, consente ai nodi successivi nel contesto di ottenere l'oggetto AssetBundle tramite DefaultAssetBundle.of(context) per accedere ai file delle risorse.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a DefaultAssetBundle", + "desc": [ + "【bundle】 : *Pacchetto di risorse 【AssetBundle】", + "【child】 : *Componente figlio 【Widget】", + "Possiamo definire il nostro DefaultAssetBundle per l'uso da parte dei nodi successivi, oppure possiamo utilizzare quello predefinito. Questo esempio dimostra come caricare e visualizzare un'immagine di risorsa utilizzando il DefaultAssetBundle fornito dal framework." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json new file mode 100644 index 00000000..000ac9cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "デフォルトアセットバンドル", + "info": "InheritedWidget で、AssetBundle オブジェクトを設定した後、このノード以降のノードコンテキストは DefaultAssetBundle.of(context) を使用して AssetBundle オブジェクトを取得し、リソースファイルにアクセスできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle の紹介", + "desc": [ + "【bundle】 : *リソースバンドル 【AssetBundle】", + "【child】 : *子コンポーネント 【Widget】", + "独自の DefaultAssetBundle を定義して後続のノードで使用することも、デフォルトのものを直接使用することもできます。この例では、フレームワークが提供する DefaultAssetBundle を使用してリソース画像を読み込み、表示します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json new file mode 100644 index 00000000..1b3dc477 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "기본 리소스 번들", + "info": "InheritedWidget으로, AssetBundle 객체를 설정한 후, 해당 노드 이후의 노드 컨텍스트에서 DefaultAssetBundle.of(context)를 통해 AssetBundle 객체를 얻어 리소스 파일에 접근할 수 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultAssetBundle 소개", + "desc": [ + "【bundle】 : *리소스 번들 【AssetBundle】", + "【child】 : *자식 위젯 【Widget】", + "우리는 후속 노드에서 사용할 수 있도록 자신만의 DefaultAssetBundle을 정의할 수도 있고, 기본값을 바로 사용할 수도 있습니다. 이 예제는 프레임워크에서 제공하는 DefaultAssetBundle을 통해 리소스 이미지를 로드하여 표시하는 방법을 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json new file mode 100644 index 00000000..f124827c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Pacote de Recursos Padrão", + "info": "Um InheritedWidget que, após configurar o objeto AssetBundle, permite que os nós subsequentes no contexto obtenham o objeto AssetBundle através de DefaultAssetBundle.of(context) para acessar arquivos de recursos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao DefaultAssetBundle", + "desc": [ + "【bundle】 : *Pacote de recursos 【AssetBundle】", + "【child】 : *Componente filho 【Widget】", + "Podemos definir nosso próprio DefaultAssetBundle para uso por nós subsequentes ou usar o padrão diretamente. Este exemplo demonstra o carregamento e exibição de uma imagem de recurso usando o DefaultAssetBundle fornecido pela estrutura." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json new file mode 100644 index 00000000..d4c86d0f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultAssetBundle/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 320, + "name": "DefaultAssetBundle", + "localName": "Пакет ресурсов по умолчанию", + "info": "InheritedWidget, который устанавливает объект AssetBundle, после чего контекст узлов после этого узла может получить объект AssetBundle с помощью DefaultAssetBundle.of(context) для доступа к файлам ресурсов.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в DefaultAssetBundle", + "desc": [ + "【bundle】 : *Пакет ресурсов 【AssetBundle】", + "【child】 : *Дочерний компонент 【Widget】", + "Мы можем определить собственный DefaultAssetBundle для использования последующими узлами или использовать предоставленный по умолчанию. Этот пример демонстрирует загрузку и отображение изображения ресурса с помощью DefaultAssetBundle, предоставленного фреймворком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json new file mode 100644 index 00000000..6c804ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Standardtextstil", + "info": "Kann ein Kind enthalten und den Standardstil für den Text der Nachkommen festlegen. Wird häufig verwendet, um den Stil mehrerer identischer Texte zu vereinheitlichen und so die individuelle Einstellung zu vermeiden.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von DefaultTextStyle", + "desc": [ + "Die Eigenschaften sind die gleichen wie bei Text, siehe dort für Details.", + "Seine Funktion ist: Den Standardtextstil für [Nachkomponenten] festlegen, beachten Sie, dass Nachkomponenten auch ihren eigenen Stil festlegen können" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json new file mode 100644 index 00000000..c7a0ca76 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Default Font Style", + "info": "Can contain a child, specifying the default style for descendant text. Commonly used to unify the style of multiple identical texts, avoiding setting them one by one.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle Usage", + "desc": [ + "The properties are the same as Text, see details there.", + "Its function is: Set the default text style to be applied to [descendant widgets], note that descendant widgets can also specify their own styles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json new file mode 100644 index 00000000..e4df5bdb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Estilo de texto predeterminado", + "info": "Puede contener un hijo, especifica el estilo de texto predeterminado para los descendientes. Se usa comúnmente para unificar el estilo de múltiples textos iguales, evitando configurarlos uno por uno.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DefaultTextStyle", + "desc": [ + "Los atributos son los mismos que Text, consulte los detalles.", + "Su función es: establecer el estilo de texto predeterminado para los【componentes descendientes】, tenga en cuenta que los componentes descendientes también pueden especificar su propio estilo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json new file mode 100644 index 00000000..249b4231 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Style de texte par défaut", + "info": "Peut contenir un enfant, spécifie le style de texte par défaut pour les descendants. Souvent utilisé pour unifier le style de plusieurs textes identiques, évitant de les définir un par un.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DefaultTextStyle", + "desc": [ + "Les propriétés sont les mêmes que Text, voir ci-dessus pour plus de détails.", + "Sa fonction est : définir le style de texte par défaut appliqué aux [composants descendants], notez que les composants descendants peuvent également spécifier leur propre style" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json new file mode 100644 index 00000000..6366506b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Stile di testo predefinito", + "info": "Può contenere un figlio e specifica lo stile predefinito per il testo dei discendenti. Comunemente utilizzato per uniformare lo stile di più testi identici, evitando di impostarli uno per uno.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di DefaultTextStyle", + "desc": [ + "Le proprietà sono le stesse di Text, per i dettagli vedere quello.", + "La sua funzione è: impostare lo stile di testo predefinito da applicare ai [componenti discendenti], notare che i componenti discendenti possono anche specificare il proprio stile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json new file mode 100644 index 00000000..1f090142 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "デフォルトフォントスタイル", + "info": "子要素を一つ持つことができ、子孫のテキストにデフォルトのスタイルを指定します。複数の同じテキストのスタイルを統一するためによく使用され、一つ一つ設定する手間を省きます。", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleの使用", + "desc": [ + "各属性はTextと同じです。詳細はそちらを参照してください。", + "その機能は: デフォルトのテキストスタイルを【子孫コンポーネント】に適用することです。子孫コンポーネントも自身のスタイルを指定できることに注意してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json new file mode 100644 index 00000000..ff0265e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "기본 글꼴 스타일", + "info": "하나의 자식을 수용할 수 있으며, 후손 텍스트에 기본 스타일을 지정합니다. 여러 동일한 텍스트의 스타일을 통일하여 일일이 설정하는 것을 방지하기 위해 자주 사용됩니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyle 사용", + "desc": [ + "각 속성은 Text와 동일하며, 자세한 내용은 해당 문서를 참조하십시오.", + "기능은: 기본 텍스트 스타일을 설정하여 【후손 컴포넌트】에 적용하며, 후손 컴포넌트는 자신의 스타일을 지정할 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json new file mode 100644 index 00000000..bd2458dc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Estilo de Texto Padrão", + "info": "Pode conter um filho, especificando o estilo padrão para o texto dos descendentes. Frequentemente usado para unificar o estilo de múltiplos textos iguais, evitando a configuração individual.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DefaultTextStyle", + "desc": [ + "As propriedades são as mesmas que o Text, consulte-o para mais detalhes.", + "Sua função é: definir o estilo de texto padrão para [componentes descendentes], note que os componentes descendentes também podem especificar seus próprios estilos" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json new file mode 100644 index 00000000..4fe407c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DefaultTextStyle/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 324, + "name": "DefaultTextStyle", + "localName": "Стиль текста по умолчанию", + "info": "Может содержать одного ребенка, задает стиль текста по умолчанию для потомков. Часто используется для унификации стиля нескольких одинаковых текстов, чтобы избежать индивидуальной настройки.", + "lever": 3, + "family": 5, + "linkIds": [ + 2, + 114, + 124 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DefaultTextStyle", + "desc": [ + "Атрибуты такие же, как у Text, подробнее см. там.", + "Его функция: установка стиля текста по умолчанию для [потомков], обратите внимание, что потомки также могут задавать свой собственный стиль" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json new file mode 100644 index 00000000..622b10f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Richtungsabhängigkeit", + "info": "Ändert den Eigenschaftswert für Komponenten mit textDirection-Attribut einheitlich für Nachkommen. Der aktuelle Standardwert von textDirection kann auch über Directionality.of(context) abgerufen werden.", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Directionality", + "desc": [ + "【textDirection】: Textausrichtung 【TextDirection】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json new file mode 100644 index 00000000..9c86d959 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Directionality", + "info": "Set the property value uniformly for components with the textDirection attribute for descendants, or get the default textDirection attribute through Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Directionality", + "desc": [ + "【textDirection】: Text arrangement direction 【TextDirection】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json new file mode 100644 index 00000000..8e90e8b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direccionalidad", + "info": "Establece un valor de propiedad unificado para los componentes con el atributo textDirection para los descendientes, también se puede obtener el valor predeterminado del atributo textDirection actual a través de Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Directionality", + "desc": [ + "【textDirection】: Dirección de alineación del texto 【TextDirection】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json new file mode 100644 index 00000000..ef429cb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Directionnalité", + "info": "Modifie la valeur de l'attribut pour les composants ayant l'attribut textDirection pour les descendants, ou obtenez la valeur par défaut de textDirection via Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Directionality", + "desc": [ + "【textDirection】 : Direction de l'arrangement du texte 【TextDirection】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json new file mode 100644 index 00000000..7e02c95a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direzionalità", + "info": "Imposta un valore di attributo uniforme per i componenti con l'attributo textDirection per i discendenti, oppure puoi ottenere l'attributo predefinito textDirection corrente tramite Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Directionality", + "desc": [ + "【textDirection】: direzione di disposizione del testo 【TextDirection】", + "【child】: componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json new file mode 100644 index 00000000..85dae336 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "方向性", + "info": "textDirectionプロパティを持つコンポーネントのプロパティ値を一括設定して子孫に変更します。また、Directionality.of(context)を使用して現在のtextDirectionのデフォルトプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionalityの基本的な使用法", + "desc": [ + "【textDirection】: テキストの配置方向 【TextDirection】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json new file mode 100644 index 00000000..a86f7d2c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "방향성", + "info": "후손을 위해 textDirection 속성이 있는 컴포넌트의 속성 값을 통일적으로 설정할 수 있으며, Directionality.of(context)를 통해 현재 textDirection의 기본 속성을 얻을 수 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Directionality 기본 사용", + "desc": [ + "【textDirection】 : 텍스트 배열 방향 【TextDirection】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json new file mode 100644 index 00000000..7bce778d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Direcionalidade", + "info": "Define o valor do atributo uniformemente para componentes com o atributo textDirection para os descendentes, ou pode obter o valor padrão do textDirection atual através de Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Directionality", + "desc": [ + "【textDirection】 : Direção de disposição do texto 【TextDirection】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json new file mode 100644 index 00000000..a4da56a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Directionality/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 319, + "name": "Directionality", + "localName": "Направленность", + "info": "Устанавливает значение атрибута для компонентов с атрибутом textDirection для потомков, также можно получить текущее значение по умолчанию textDirection через Directionality.of(context).", + "lever": 2, + "family": 5, + "linkIds": [ + 2, + 94 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Directionality", + "desc": [ + "【textDirection】 : Направление текста 【TextDirection】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json new file mode 100644 index 00000000..60cf42c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Trennlinienstil", + "info": "Wird hauptsächlich verwendet, um standardmäßige Attribute für Divider-Typ-Komponenten für Nachkommen festzulegen. Es kann auch verwendet werden, um die Standardattribute des Divider zu erhalten.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme Verwendung", + "desc": [ + "Die Attributeparameter ähneln denen von Divider. Die Trennlinienthemendaten können über DividerTheme.of abgerufen werden.", + "Es kann auch der Standardstil für Trennlinien von DividerTheme [Nachkommen] festgelegt werden, einschließlich Farbe, Dicke, Höhe usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json new file mode 100644 index 00000000..06f197ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Divider Style", + "info": "Mainly used to set default properties for descendant Divider type components uniformly, and it can also be used to obtain the default properties of Divider.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Using DividerTheme", + "desc": [ + "The property parameters are similar to Divider. You can obtain the divider theme data through DividerTheme.of,", + "and you can also set default styles for the dividers of DividerTheme【descendants】, including color, thickness, height, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json new file mode 100644 index 00000000..c70cc491 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Estilo de la línea divisoria", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes de tipo Divider descendientes, también se pueden obtener las propiedades predeterminadas de Divider a través de este componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DividerTheme", + "desc": [ + "Los parámetros de atributos son similares a Divider, se pueden obtener los datos del tema de la línea divisoria a través de DividerTheme.of, \"", + "también se pueden establecer estilos predeterminados para las líneas divisorias de los 【descendientes】 de DividerTheme, incluyendo color, grosor, altura, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json new file mode 100644 index 00000000..4b025c39 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Thème de séparateur", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants de type Divider pour les descendants, ou pour obtenir les propriétés par défaut du Divider via ce composant.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DividerTheme", + "desc": [ + "Les paramètres d'attributs sont similaires à ceux de Divider, vous pouvez obtenir les données du thème de séparateur via DividerTheme.of, \"", + "vous pouvez également définir le style par défaut pour les séparateurs des descendants de DividerTheme, y compris la couleur, l'épaisseur, la hauteur, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json new file mode 100644 index 00000000..3479698b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Stile della linea divisoria", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti di tipo Divider discendenti, è anche possibile ottenere le proprietà predefinite di Divider attraverso questo componente.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di DividerTheme", + "desc": [ + "I parametri delle proprietà sono simili a Divider, è possibile ottenere i dati del tema della linea divisoria tramite DividerTheme.of,\"", + "è anche possibile impostare uno stile predefinito per le linee divisorie dei [discendenti] di DividerTheme, inclusi colore, spessore, altezza, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json new file mode 100644 index 00000000..314f585d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "分割線スタイル", + "info": "主に子孫のDividerタイプコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのDividerのプロパティを取得することもできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerThemeの使用", + "desc": [ + "プロパティパラメータはDividerと類似しており、DividerTheme.ofを使用して分割線のテーマデータを取得できます。\"", + "また、DividerTheme【子孫】の分割線にデフォルトのスタイルを設定することもできます。これには色、太さ、高さなどが含まれます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json new file mode 100644 index 00000000..52bb21f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "구분선 스타일", + "info": "주로 후손 Divider 타입 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 Divider의 속성을 가져올 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DividerTheme 사용", + "desc": [ + "속성 매개변수는 Divider와 유사하며, DividerTheme.of를 통해 구분선 테마 데이터를 가져올 수 있습니다.", + "또한 DividerTheme【후손】의 구분선에 기본 스타일을 설정할 수 있으며, 색상, 두께, 높이 등을 포함합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json new file mode 100644 index 00000000..7165907d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Estilo da Linha Divisória", + "info": "Principalmente utilizado para definir propriedades padrão para componentes do tipo Divider descendentes, também pode ser usado para obter as propriedades padrão do Divider.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DividerTheme", + "desc": [ + "Os parâmetros de propriedade são semelhantes ao Divider, os dados do tema da linha divisória podem ser obtidos através de DividerTheme.of, \"", + "também pode definir o estilo padrão para as linhas divisórias dos descendentes do DividerTheme, incluindo cor, espessura, altura, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json new file mode 100644 index 00000000..efb2c0a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DividerTheme/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 329, + "name": "DividerTheme", + "localName": "Стиль разделителя", + "info": "В основном используется для установки стандартных свойств для компонентов типа Divider для потомков, также можно получить свойства стандартного Divider через этот компонент.", + "lever": 3, + "family": 5, + "linkIds": [ + 34, + 35 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DividerTheme", + "desc": [ + "Параметры свойств аналогичны Divider, можно получить данные темы разделителя через DividerTheme.of, \"", + "также можно установить стандартный стиль для разделителей потомков DividerTheme, включая цвет, толщину, высоту и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json new file mode 100644 index 00000000..244d7375 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Dropdown-Schaltfläche Unterstreichung ausblenden", + "info": "Wird verwendet, um die Unterstreichung der Dropdown-Schaltfläche zu entfernen, hat an sich keinen praktischen Nutzen.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json new file mode 100644 index 00000000..282aa47e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Dropdown Button Hide Underline", + "info": "Used to remove the underline of the DropdownButton, it has little practical value.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline Usage", + "desc": [ + "【child】 : Child component 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json new file mode 100644 index 00000000..df48e9dd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Botón desplegable ocultar subrayado", + "info": "Se utiliza para eliminar el subrayado de DropdownButton, en sí no tiene mucho valor práctico.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de DropDownButtonHideUnderline", + "desc": [ + "【child】 : Componente hijo 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json new file mode 100644 index 00000000..d285d584 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Bouton déroulant masquer le soulignement", + "info": "Utilisé pour supprimer le soulignement du DropdownButton, il n'a pas beaucoup de valeur pratique en soi.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de DropDownButtonHideUnderline", + "desc": [ + "【child】 : Composant enfant 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json new file mode 100644 index 00000000..1f43b003 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Pulsante a discesa nascondi sottolineatura", + "info": "Utilizzato per rimuovere la sottolineatura del DropdownButton, di per sé non ha un grande valore applicativo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di DropDownButtonHideUnderline", + "desc": [ + "【child】 : componente figlio 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json new file mode 100644 index 00000000..ede68d69 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "ドロップダウンボタンの下線を非表示", + "info": "DropdownButtonの下線を除去するために使用されますが、それ自体にはあまり実用的な価値はありません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderlineの使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json new file mode 100644 index 00000000..9314420e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "드롭다운 버튼 숨김 선", + "info": "DropdownButton의 밑줄을 제거하는 데 사용되며, 그 자체로는 큰 활용 가치가 없습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropDownButtonHideUnderline 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json new file mode 100644 index 00000000..c46534b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Botão de Dropdown Ocultar Sublinhado", + "info": "Usado para remover o sublinhado do DropdownButton, por si só não tem grande valor prático.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do DropDownButtonHideUnderline", + "desc": [ + "【child】 : Componente filho 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json new file mode 100644 index 00000000..c38d0924 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/DropdownButtonHideUnderline/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 181, + "name": "DropdownButtonHideUnderline", + "localName": "Кнопка выпадающего списка скрыть подчеркивание", + "info": "Используется для удаления подчеркивания у DropdownButton, само по себе не имеет практической ценности.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование DropDownButtonHideUnderline", + "desc": [ + "【child】 : Дочерний компонент 【Widget】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json new file mode 100644 index 00000000..4376d143 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Erweitertes Widget", + "info": "Die übergeordnete Klasse ist Flexible, entspricht einem Flexible-Widget mit dem Fit-Typ tight. Kann verschachtelte Kinder verwenden, um den verbleibenden Platz zu erweitern.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Expanded", + "desc": [ + "【child】 : Kind 【Widget】", + "【flex】 : Verhältnis der verbleibenden Platzverteilung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json new file mode 100644 index 00000000..916e4044 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Extended Component", + "info": "The parent class is Flexible, equivalent to a Flexible component with a fit type of tight. It can nest children to utilize the remaining space to extend the placeholder space.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Expanded", + "desc": [ + "【child】: child 【Widget】", + "【flex】: Proportion of remaining space allocation 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json new file mode 100644 index 00000000..d363072b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Expandido", + "info": "La clase padre es Flexible, equivalente a un componente Flexible con un tipo fit tight. Puede anidar hijos para expandir el espacio de marcador utilizando el espacio restante.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Expanded", + "desc": [ + "【child】 : hijo 【Widget】", + "【flex】 : proporción de asignación de espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json new file mode 100644 index 00000000..03bfcd0a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Composant Étendu", + "info": "La classe parente est Flexible, équivalente à un composant Flexible avec un fit de type tight. Peut imbriquer des enfants pour utiliser l'espace restant pour étendre l'espace de placement.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Expanded", + "desc": [ + "【child】 : Enfant 【Widget】", + "【flex】 : Proportion de distribution de l'espace restant 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json new file mode 100644 index 00000000..b0272f3c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Esteso", + "info": "La classe genitore è Flexible, equivalente a un componente Flexible con tipo fit tight. Può annidare figli per espandere lo spazio occupato utilizzando lo spazio rimanente.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Expanded", + "desc": [ + "【child】 : figlio 【Widget】", + "【flex】 : percentuale di allocazione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json new file mode 100644 index 00000000..39719a02 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "拡張コンポーネント", + "info": "親クラスはFlexibleで、fitタイプがtightのFlexibleコンポーネントに相当します。ネストされた子要素が残りのスペースを使用して占有スペースを拡張します。", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expandedの基本的な使用法", + "desc": [ + "【child】 : 子要素 【Widget】", + "【flex】 : 残りスペースの配分比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json new file mode 100644 index 00000000..5ae804d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "확장 컴포넌트", + "info": "부모 클래스는 Flexible이며, fit 타입이 tight인 Flexible 컴포넌트와 동일합니다. 자식을 중첩하여 남은 공간을 사용하여 공간을 확장할 수 있습니다.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Expanded 기본 사용법", + "desc": [ + "【child】 : 자식 【Widget】", + "【flex】 : 남은 공간 배분 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json new file mode 100644 index 00000000..3831e473 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Componente Expandido", + "info": "A classe pai é Flexible, equivalente a um componente Flexible com o tipo fit como tight. Pode aninhar filhos para utilizar o espaço restante e expandir o espaço ocupado.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Expanded", + "desc": [ + "【child】 : filho 【Widget】", + "【flex】 : proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json new file mode 100644 index 00000000..3873c103 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Expanded/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 106, + "name": "Expanded", + "localName": "Расширяемый компонент", + "info": "Родительский класс - Flexible, эквивалент компоненту Flexible с типом fit tight. Может вкладывать дочерние элементы для расширения занимаемого пространства.", + "lever": 4, + "family": 5, + "linkIds": [ + 94, + 109 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Expanded", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json new file mode 100644 index 00000000..faa0e1ff --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Flexible Komponente", + "info": "Kann nur in Row-, Column- und Flex-Layouts verwendet werden, kann Kinder verschachteln, um den verbleibenden Platz zu nutzen und den Platzhalterbereich zu erweitern, kann auch den Anpassungstyp angeben.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Flexible", + "desc": [ + "【child】 : Kind 【Widget】", + "【fit】 : Anpassungsmodus*2 【FlexFit】", + "【flex】 : Anteil der verbleibenden Platzverteilung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json new file mode 100644 index 00000000..db2399ef --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Flexible Component", + "info": "Can only be used in Row, Column, and Flex layouts. It can nest children to utilize the remaining space to extend the placeholder space, and the adaptation type can also be specified.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Flexible", + "desc": [ + "【child】: child 【Widget】", + "【fit】: adaptation mode*2 【FlexFit】", + "【flex】: remaining space allocation ratio 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json new file mode 100644 index 00000000..39e613ca --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Componente Flexible", + "info": "Solo se puede usar en diseños Row, Column y Flex, puede anidar hijos para extender el espacio de marcador de posición utilizando el espacio restante, también se puede especificar el tipo de adaptación.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Flexible", + "desc": [ + "【child】 : hijo 【Widget】", + "【fit】 : modo de adaptación*2 【FlexFit】", + "【flex】 : proporción de asignación de espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json new file mode 100644 index 00000000..0c271f94 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Composant Flexible", + "info": "Peut uniquement être utilisé dans les dispositions Row, Column et Flex, peut imbriquer des enfants pour étendre l'espace résiduel, et peut également spécifier le type d'adaptation.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Flexible", + "desc": [ + "【child】 : Enfant 【Widget】", + "【fit】 : Mode d'adaptation*2 【FlexFit】", + "【flex】 : Proportion de l'allocation de l'espace résiduel 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json new file mode 100644 index 00000000..25a628db --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Componente Flessibile", + "info": "Può essere utilizzato solo nei layout Row, Column e Flex, può annidare figli per espandere lo spazio rimanente, e può anche specificare il tipo di adattamento.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Flexible", + "desc": [ + "【child】 : Figlio 【Widget】", + "【fit】 : Modalità di adattamento*2 【FlexFit】", + "【flex】 : Percentuale di allocazione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json new file mode 100644 index 00000000..3ed301db --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "フレキシブルコンポーネント", + "info": "Row、Column、Flexレイアウトでのみ使用可能で、ネストされた子要素を使用して残りのスペースを拡張したり、適応タイプを指定したりできます。", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexibleの基本使用", + "desc": [ + "【child】 : 子要素 【Widget】", + "【fit】 : 適応モード*2 【FlexFit】", + "【flex】 : 残りスペースの分配比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json new file mode 100644 index 00000000..d683f4c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "유연한 컴포넌트", + "info": "Row, Column 및 Flex 레이아웃에서만 사용할 수 있으며, 자식을 중첩하여 남은 공간을 확장하거나 적응 유형을 지정할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Flexible 기본 사용법", + "desc": [ + "【child】 : 자식 【Widget】", + "【fit】 : 적응 모드*2 【FlexFit】", + "【flex】 : 남은 공간 할당 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json new file mode 100644 index 00000000..acd61655 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexível", + "localName": "Componente Flexível", + "info": "Só pode ser usado em layouts Row, Column e Flex, pode aninhar filhos para estender o espaço de preenchimento utilizando o espaço restante, e também pode especificar o tipo de ajuste.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Flexible", + "desc": [ + "【child】 : filho 【Widget】", + "【fit】 : modo de ajuste*2 【FlexFit】", + "【flex】 : proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json new file mode 100644 index 00000000..4a71dd91 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Flexible/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 109, + "name": "Flexible", + "localName": "Гибкий компонент", + "info": "Может использоваться только в макетах Row, Column и Flex, может вкладывать дочерние элементы для расширения занимаемого пространства с использованием оставшегося пространства, также можно указать тип адаптации.", + "lever": 3, + "family": 5, + "linkIds": [ + 94, + 106 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Flexible", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【fit】 : Режим адаптации*2 【FlexFit】", + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json new file mode 100644 index 00000000..0e9d23ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Icon-Stil", + "info": "Kann ein Kind aufnehmen und den Standardstil für die Icons der Nachkommen festlegen. Wird häufig verwendet, um den Stil mehrerer gleicher Icons zu vereinheitlichen und die individuelle Einstellung zu vermeiden.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von IconTheme", + "desc": [ + "Kann die Icon-Themen-Daten über IconTheme.of abrufen und den Standardstil für die Icon-Komponenten der Nachkommen von IconTheme festlegen, einschließlich Farbe, Transparenz und Größe." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json new file mode 100644 index 00000000..5fbd6356 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Icon Style", + "info": "Can accommodate one child, specifying the default style for the descendant icons. Commonly used to unify the styles of multiple identical icons, avoiding setting them one by one.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme Usage", + "desc": [ + "You can obtain the icon theme data through IconTheme.of, or set the default style for the icon components of IconTheme【descendants】, including color, opacity, and size." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json new file mode 100644 index 00000000..74294a70 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema de iconos", + "info": "Puede contener un hijo y especifica un estilo predeterminado para los iconos de los descendientes. Se usa comúnmente para unificar el estilo de múltiples iconos idénticos, evitando configurarlos uno por uno.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de IconTheme", + "desc": [ + "Puede obtener los datos del tema de iconos a través de IconTheme.of, y también puede establecer un estilo predeterminado para los componentes de iconos de los descendientes de IconTheme, incluyendo color, transparencia y tamaño." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json new file mode 100644 index 00000000..1f050871 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Thème d'icône", + "info": "Peut contenir un enfant, spécifie le style par défaut pour les icônes des descendants. Souvent utilisé pour unifier le style de plusieurs icônes identiques, évitant ainsi de les configurer une par une.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de IconTheme", + "desc": [ + "Vous pouvez obtenir les données du thème d'icône via IconTheme.of, ou définir un style par défaut pour les composants d'icône des descendants de IconTheme, y compris la couleur, la transparence et la taille." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json new file mode 100644 index 00000000..9a7ab28f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema Icona", + "info": "Può contenere un figlio, specifica lo stile predefinito per le icone dei discendenti. Comunemente utilizzato per uniformare lo stile di più icone identiche, evitando di impostarle una per una.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di IconTheme", + "desc": [ + "È possibile ottenere i dati del tema dell'icona tramite IconTheme.of, oppure impostare lo stile predefinito per i componenti icona dei discendenti di IconTheme, inclusi colore, trasparenza e dimensione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json new file mode 100644 index 00000000..9445365c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "アイコンテーマ", + "info": "子要素を1つ持つことができ、子孫のアイコンのデフォルトスタイルを指定します。複数の同じアイコンのスタイルを統一し、個別に設定する手間を省くために使用されます。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconThemeの使用", + "desc": [ + "IconTheme.ofを使用してアイコンテーマデータを取得できます。また、IconThemeの【子孫】のアイコンコンポーネントにデフォルトのスタイル(色、透明度、サイズ)を設定できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json new file mode 100644 index 00000000..329848a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "아이콘 스타일", + "info": "하나의 자식을 포함할 수 있으며, 후손 아이콘의 기본 스타일을 지정합니다. 여러 동일한 아이콘의 스타일을 통일하고, 일일이 설정하는 것을 방지하는 데 자주 사용됩니다.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconTheme 사용", + "desc": [ + "IconTheme.of를 통해 아이콘 테마 데이터를 얻을 수 있으며, IconTheme의 후손 아이콘 컴포넌트에 기본 스타일(색상, 투명도, 크기 등)을 설정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json new file mode 100644 index 00000000..002df5ed --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Tema de Ícones", + "info": "Pode conter um filho, especificando o estilo padrão para ícones descendentes. Frequentemente usado para unificar o estilo de vários ícones idênticos, evitando a configuração individual.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do IconTheme", + "desc": [ + "Pode obter os dados do tema do ícone através de IconTheme.of, e também pode definir o estilo padrão para componentes de ícone descendentes de IconTheme, incluindo cor, transparência e tamanho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json new file mode 100644 index 00000000..97124925 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/IconTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 325, + "name": "IconTheme", + "localName": "Тема иконок", + "info": "Может содержать один дочерний элемент, задающий стиль по умолчанию для иконок потомков. Часто используется для унификации стиля нескольких одинаковых иконок, чтобы избежать индивидуальной настройки.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование IconTheme", + "desc": [ + "Можно получить данные темы иконок через IconTheme.of, а также установить стиль по умолчанию для иконок-потомков IconTheme, включая цвет, прозрачность и размер." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json new file mode 100644 index 00000000..7001d683 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Gemeinsames Modell", + "info": "Es ist eine abstrakte Unterklasse von InheritedWidget, die Daten über den Kontext an den Unterbaum weiterleitet und die Granularität der Abhängigkeitsbenachrichtigung über den Aspekt Aspect steuert.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von InheritedModel", + "desc": [ + "【child】: Unterkomponente 【Widget】", + "Unten ist ein benutzerdefiniertes InheritedModel, das die gemeinsame Nutzung von Daten im Unterbaum implementiert; und definiert zwei Aspekte, Farbe und Wert, um die Granularität der Abhängigkeitsbenachrichtigung zu steuern." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json new file mode 100644 index 00000000..3f2d6164 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Shared Model", + "info": "It is an abstract subclass of InheritedWidget, which passes data to the subtree through context and controls the granularity of dependency notifications through Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel Usage", + "desc": [ + "【child】: child component 【Widget】", + "Below is a custom InheritedModel that implements subtree sharing of data; and defines two aspects, color and value, to control the granularity of dependency notifications." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json new file mode 100644 index 00000000..b257f274 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modelo Compartido", + "info": "Es una subclase abstracta de InheritedWidget, que pasa datos al subárbol a través del contexto y controla la granularidad de las notificaciones de dependencia a través del aspecto Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de InheritedModel", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "A continuación se muestra un InheritedModel personalizado que implementa el intercambio de datos en el subárbol; y define dos aspectos, color y valor, para controlar la granularidad de las notificaciones de dependencia." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json new file mode 100644 index 00000000..9d7d8fe9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modèle partagé", + "info": "Il s'agit d'une sous-classe abstraite de InheritedWidget, qui transmet des données au sous-arbre via le contexte, et contrôle la granularité des notifications de dépendance via l'aspect Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de InheritedModel", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Voici un InheritedModel personnalisé, qui permet le partage de données dans le sous-arbre ; et définit deux aspects, la couleur et la valeur, pour contrôler la granularité des notifications de dépendance." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json new file mode 100644 index 00000000..cf2406c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modello Condiviso", + "info": "È una sottoclasse astratta di InheritedWidget, che passa i dati al sottoalbero tramite il contesto e controlla la granularità delle notifiche di dipendenza attraverso l'aspetto Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di InheritedModel", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Di seguito è riportato un InheritedModel personalizzato che implementa la condivisione dei dati nel sottoalbero; e definisce due aspetti, colore e valore, per controllare la granularità delle notifiche di dipendenza." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json new file mode 100644 index 00000000..f90449e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "共有モデル", + "info": "これは InheritedWidget の抽象サブクラスで、context を介してサブツリーにデータを渡し、Aspect の側面を介して依存通知の粒度を制御します。", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel の使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "以下はカスタム InheritedModel で、データのサブツリー共有を実装し、色と数値の二つの側面を定義して、依存通知の粒度を制御します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json new file mode 100644 index 00000000..f2cf7ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "공유 모델", + "info": "이것은 InheritedWidget 추상 서브클래스로, context를 통해 서브트리에 데이터를 전달하고 Aspect 측면을 통해 의존성 알림의 세분화를 제어합니다.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "InheritedModel 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "다음은 사용자 정의 InheritedModel로, 데이터의 서브트리 공유를 구현하고 색상과 값 두 가지 측면을 정의하여 의존성 알림의 세분화를 제어합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json new file mode 100644 index 00000000..b5735a27 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Modelo Compartilhado", + "info": "É uma subclasse abstrata de InheritedWidget, que transmite dados para a subárvore através do context e controla a granularidade das notificações de dependência através do Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do InheritedModel", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Abaixo está um InheritedModel personalizado, que implementa o compartilhamento de dados na subárvore; e define dois aspectos, cor e valor, para controlar a granularidade das notificações de dependência." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json new file mode 100644 index 00000000..cc19d1a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedModel/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 336, + "name": "InheritedModel", + "localName": "Общая модель", + "info": "Это абстрактный подкласс InheritedWidget, который передает данные в поддерево через context и управляет гранулярностью уведомлений о зависимостях через аспект Aspect.", + "lever": 4, + "family": 5, + "linkIds": [346], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование InheritedModel", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Ниже приведен пример пользовательского InheritedModel, который реализует обмен данными в поддереве; а также определяет два аспекта: цвет и значение, чтобы управлять гранулярностью уведомлений о зависимостях." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json new file mode 100644 index 00000000..201bc84a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_de_DE.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Vererbungsthema", + "info": "Es ist eine abstrakte Klasse mit vielen XXXTheme-bezogenen Unterklassen, die verwendet werden, um Eigenschaften wie Farben und Textstile zu definieren und diese Eigenschaften in Unterbäumen gemeinsam zu nutzen.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in InheritedTheme", + "desc": [ + "InheritedTheme.capture kann das übergeordnete Thema erfassen und ein CapturedThemes-Objekt erhalten, durch dessen wrap-Methode das erfasste Thema routenübergreifend verwendet werden kann.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json new file mode 100644 index 00000000..1dce38c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_en_US.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Inherited Theme", + "info": "It is an abstract class with many XXXTheme related subclasses, used to define properties such as colors and text styles, and share these properties in the subtree.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to InheritedTheme", + "desc": [ + "InheritedTheme.capture can capture the upper theme, obtain the CapturedThemes object, and use the captured theme across routes through the wrap method of this object.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json new file mode 100644 index 00000000..bd1c9c21 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_es_ES.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema Heredado", + "info": "Es una clase abstracta con muchas subclases relacionadas con XXXTheme, utilizadas para definir propiedades como colores, estilos de texto, etc., y compartir estas propiedades en el subárbol.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a InheritedTheme", + "desc": [ + "InheritedTheme.capture puede capturar el tema superior y obtener un objeto CapturedThemes, a través del cual el método wrap puede usar el tema capturado entre rutas.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json new file mode 100644 index 00000000..d2511a09 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_fr_FR.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Thème Hérité", + "info": "C'est une classe abstraite, avec de nombreuses sous-classes XXXTheme associées, utilisées pour définir des propriétés telles que les couleurs, les styles de texte, etc., et partager ces propriétés dans l'arbre de sous-éléments.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à InheritedTheme", + "desc": [ + "InheritedTheme.capture peut capturer le thème supérieur, obtenir un objet CapturedThemes, et utiliser la méthode wrap de cet objet pour utiliser le thème capturé à travers les routes.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json new file mode 100644 index 00000000..b7d18dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_it_IT.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema Ereditato", + "info": "È una classe astratta, con molte sottoclassi correlate a XXXTheme, utilizzate per definire proprietà come colori, stili di testo, ecc., e condividere queste proprietà all'interno del sottoalbero.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a InheritedTheme", + "desc": [ + "InheritedTheme.capture può catturare il tema superiore, ottenendo un oggetto CapturedThemes, attraverso il metodo wrap di questo oggetto è possibile utilizzare il tema catturato attraverso le rotte.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json new file mode 100644 index 00000000..37d3da27 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ja_JP.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "継承テーマ", + "info": "これは抽象クラスで、非常に多くの XXXTheme 関連のサブクラスがあり、色やテキストスタイルなどの属性を定義し、サブツリー内でこれらの属性を共有するために使用されます。", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 紹介", + "desc": [ + "InheritedTheme.capture を使用して上位のテーマをキャプチャし、CapturedThemes オブジェクトを取得できます。このオブジェクトの wrap メソッドを使用して、キャプチャしたテーマをルート間で使用できます。", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json new file mode 100644 index 00000000..8d0752a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ko_KR.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "전통 테마", + "info": "추상 클래스이며, 많은 XXXTheme 관련 하위 클래스가 있어 색상, 텍스트 스타일 등의 속성을 정의하고 하위 트리에서 이러한 속성을 공유합니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InheritedTheme 소개", + "desc": [ + "InheritedTheme.capture는 상위 테마를 캡처하여 CapturedThemes 객체를 가져올 수 있으며, 이 객체의 wrap 메서드를 통해 캡처한 테마를 라우터 간에 사용할 수 있습니다.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json new file mode 100644 index 00000000..7976fa9f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_pt_PT.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Tema de Herança", + "info": "É uma classe abstrata, com muitas subclasses relacionadas a XXXTheme, usadas para definir propriedades como cores, estilos de texto, etc., e compartilhar essas propriedades na subárvore.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao InheritedTheme", + "desc": [ + "InheritedTheme.capture pode capturar o tema superior, obter o objeto CapturedThemes, e através do método wrap desse objeto, o tema capturado pode ser usado entre rotas.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json new file mode 100644 index 00000000..c8f3df04 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedTheme/desc_ru_RU.json @@ -0,0 +1,66 @@ +{ + "id": 345, + "name": "InheritedTheme", + "localName": "Тема наследования", + "info": "Это абстрактный класс, имеющий множество связанных подклассов XXXTheme, используемых для определения таких свойств, как цвета, стили текста и т.д., которые затем используются в поддереве.", + "lever": 1, + "family": 5, + "linkIds": [ + 324, + 326, + 328, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в InheritedTheme", + "desc": [ + "InheritedTheme.capture может захватывать тему верхнего уровня, получая объект CapturedThemes, через метод wrap которого можно использовать захваченную тему между маршрутами.", + " ", + "", + "class InheritedThemeDemo extends StatelessWidget {", + " const InheritedThemeDemo({Key? key) : super(key: key);", + "", + "", + " @override", + " Widget build(BuildContext context) {", + " return const DefaultTextStyle(", + " style: TextStyle(fontSize: 24, color: Colors.blue),", + " child: TestBody(),", + " );", + " ", + "", + "", + "class TestBody extends StatelessWidget {", + " const TestBody({Key? key) : super(key: key);", + "", + " @override", + " Widget build(BuildContext context) {", + "", + " return GestureDetector(", + " onTap: () => _toNextPage(context),", + " child: Container(", + " height: 60,", + " margin: const EdgeInsets.only(left: 40,right: 40),", + " alignment: Alignment.center,", + " color: Theme.of(context).primaryColor.withOpacity(0.1),", + " child: const Text('InheritedTheme')));", + " ", + "", + " void _toNextPage(BuildContext context) {", + " final NavigatorState navigator = Navigator.of(context);", + " final CapturedThemes themes =", + " InheritedTheme.capture(from: context, to: navigator.context);", + " ", + " Navigator.of(context).push(", + " MaterialPageRoute(", + " builder: (BuildContext _) {", + " return themes.wrap(Container(", + " alignment: Alignment.center,", + " color: Colors.white,", + " child: Text('Flutter Unit')," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json new file mode 100644 index 00000000..e23bcbe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Vererbte Komponente", + "info": "Diese Klasse ist eine abstrakte Klasse, deren Funktion darin besteht, Daten im aktuellen Kontext zu speichern und diese Daten in den Kontexten der nachfolgenden Knoten gemeinsam zu nutzen. Es gibt viele Implementierungsklassen, einschließlich verschiedener Themenkomponenten, MediaQuery usw.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Column", + "desc": [ + "【children】 : Komponentenliste 【List】", + "【mainAxisAlignment】 : Hauptachsenausrichtung 【MainAxisAlignment】", + "【crossAxisAlignment】 : Kreuzachsenausrichtung 【CrossAxisAlignment】", + "【textBaseline】 : Textbaseline 【TextBaseline】", + "【verticalDirection】 : Vertikale Richtung 【VerticalDirection】", + "【mainAxisSize】 : Hauptachsengröße 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget Beispiel", + "desc": [ + "Unten wird die Verwendung der InheritedWidget-Komponente anhand eines Farbzählerprojekts gezeigt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json new file mode 100644 index 00000000..e3e3c0e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Inherited Widget", + "info": "This class is an abstract class, which can store data in this context and share that data in the context of its subsequent nodes. There are many implementation classes, including various theme components, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Column", + "desc": [ + "【children】: Component list 【List】", + "【mainAxisAlignment】: Main axis alignment 【MainAxisAlignment】", + "【crossAxisAlignment】: Cross axis alignment 【CrossAxisAlignment】", + "【textBaseline】: Text baseline 【TextBaseline】", + "【verticalDirection】: Vertical direction 【VerticalDirection】", + "【mainAxisSize】: Main axis size 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget Example", + "desc": [ + "Below is an example of using the InheritedWidget component through a color counter project." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json new file mode 100644 index 00000000..2a335a4b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Heredado", + "info": "Esta clase es una clase abstracta que permite almacenar datos en este contexto y compartirlos en los contextos de sus nodos subsiguientes. Tiene muchas clases de implementación, incluyendo varios componentes temáticos, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alineación del eje principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alineación del eje transversal 【CrossAxisAlignment】", + "【textBaseline】 : Línea base del texto 【TextBaseline】", + "【verticalDirection】 : Dirección vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamaño del eje principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Ejemplo de InheritedWidget", + "desc": [ + "A continuación se muestra un proyecto de contador de colores que demuestra el uso del componente InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json new file mode 100644 index 00000000..0cba5d15 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Widget Hérité", + "info": "Cette classe est une classe abstraite, dont le rôle est de stocker des données dans ce contexte et de partager ces données dans les contextes des nœuds suivants. Il existe de nombreuses classes d'implémentation, y compris divers composants de thème, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Column", + "desc": [ + "【children】 : Liste de composants 【List】", + "【mainAxisAlignment】 : Alignement de l'axe principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alignement de l'axe transversal 【CrossAxisAlignment】", + "【textBaseline】 : Ligne de base du texte 【TextBaseline】", + "【verticalDirection】 : Direction verticale 【VerticalDirection】", + "【mainAxisSize】 : Taille de l'axe principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Exemple de InheritedWidget", + "desc": [ + "Ci-dessous, un projet de compteur de couleur illustre l'utilisation du composant InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json new file mode 100644 index 00000000..b8fa4f6c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Ereditato", + "info": "Questa classe è astratta e ha la funzione di memorizzare dati nel contesto corrente e condividerli nei contesti dei nodi successivi. Ci sono molte classi di implementazione, inclusi vari componenti tematici, MediaQuery, ecc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Column", + "desc": [ + "【children】 : Lista di componenti 【List】", + "【mainAxisAlignment】 : Allineamento dell'asse principale 【MainAxisAlignment】", + "【crossAxisAlignment】 : Allineamento dell'asse trasversale 【CrossAxisAlignment】", + "【textBaseline】 : Linea di base del testo 【TextBaseline】", + "【verticalDirection】 : Direzione verticale 【VerticalDirection】", + "【mainAxisSize】 : Dimensione dell'asse principale 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Esempio di InheritedWidget", + "desc": [ + "Di seguito è mostrato l'uso del componente InheritedWidget attraverso un progetto di contatore di colori." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json new file mode 100644 index 00000000..bff24ebe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "継承ウィジェット", + "info": "このクラスは抽象クラスで、このコンテキストにデータを保存し、その後のノードのコンテキストでそのデータを共有する役割を果たします。多くの実装クラスがあり、さまざまなテーマウィジェットやMediaQueryなどが含まれます。", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Columnの基本使用", + "desc": [ + "【children】 : ウィジェットリスト 【List】", + "【mainAxisAlignment】 : 主軸の整列 【MainAxisAlignment】", + "【crossAxisAlignment】 : 交差軸の整列 【CrossAxisAlignment】", + "【textBaseline】 : テキストベースライン 【TextBaseline】", + "【verticalDirection】 : 垂直方向 【VerticalDirection】", + "【mainAxisSize】 : 主軸のサイズ 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget の使用例", + "desc": [ + "以下は、色カウンタープロジェクトを通じてInheritedWidgetウィジェットの使用を展示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json new file mode 100644 index 00000000..99daa4cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "상속 위젯", + "info": "이 클래스는 추상 클래스로, 본 컨텍스트에서 데이터를 저장하고, 그 후속 노드의 컨텍스트에서 해당 데이터를 공유할 수 있습니다. 다양한 구현 클래스가 있으며, 다양한 테마 위젯, MediaQuery 등이 포함됩니다.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Column 기본 사용", + "desc": [ + "【children】 : 위젯 리스트 【List】", + "【mainAxisAlignment】 : 메인 축 정렬 【MainAxisAlignment】", + "【crossAxisAlignment】 : 교차 축 정렬 【CrossAxisAlignment】", + "【textBaseline】 : 텍스트 기준선 【TextBaseline】", + "【verticalDirection】 : 수직 방향 【VerticalDirection】", + "【mainAxisSize】 : 메인 축 크기 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "InheritedWidget 예제", + "desc": [ + "아래는 색상 카운터 프로젝트를 통해 InheritedWidget 위젯의 사용을 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json new file mode 100644 index 00000000..e56e8e50 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Componente Herdado", + "info": "Esta classe é abstrata e tem a função de armazenar dados no contexto atual e compartilhar esses dados nos contextos dos nós subsequentes. Existem muitas classes de implementação, incluindo vários componentes temáticos, MediaQuery, etc.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Column", + "desc": [ + "【children】 : Lista de componentes 【List】", + "【mainAxisAlignment】 : Alinhamento do eixo principal 【MainAxisAlignment】", + "【crossAxisAlignment】 : Alinhamento do eixo cruzado 【CrossAxisAlignment】", + "【textBaseline】 : Linha de base do texto 【TextBaseline】", + "【verticalDirection】 : Direção vertical 【VerticalDirection】", + "【mainAxisSize】 : Tamanho do eixo principal 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Exemplo de InheritedWidget", + "desc": [ + "Abaixo está um projeto de contador de cores que demonstra o uso do componente InheritedWidget." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json new file mode 100644 index 00000000..6c76cdeb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/InheritedWidget/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 346, + "name": "InheritedWidget", + "localName": "Наследуемый компонент", + "info": "Этот класс является абстрактным и используется для хранения данных в текущем контексте и совместного использования этих данных в контекстах последующих узлов. Существует множество реализаций этого класса, включая различные тематические компоненты, MediaQuery и другие.", + "lever": 4, + "family": 5, + "linkIds": [ + 167, + 319, + 328, + 324, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Column", + "desc": [ + "【children】 : Список компонентов 【List】", + "【mainAxisAlignment】 : Выравнивание по главной оси 【MainAxisAlignment】", + "【crossAxisAlignment】 : Выравнивание по поперечной оси 【CrossAxisAlignment】", + "【textBaseline】 : Базовая линия текста 【TextBaseline】", + "【verticalDirection】 : Вертикальное направление 【VerticalDirection】", + "【mainAxisSize】 : Размер главной оси 【MainAxisSize】" + ] + }, + { + "file": "node2_use.dart", + "name": "Пример использования InheritedWidget", + "desc": [ + "Ниже приведен пример использования компонента InheritedWidget в проекте счетчика цветов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json new file mode 100644 index 00000000..e152f61f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Lebendig halten", + "info": "Ob der Zustand der Kinder in einer faul geladenen Liste lebendig gehalten werden soll. Ist die zugrunde liegende Implementierung von AutomaticKeepAlive und wird normalerweise nicht alleine verwendet.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in KeepAlive", + "desc": [ + "【child】 : *Kindkomponente 【Widget】", + "【keepAlive】 : *Ob lebendig gehalten wird 【bool】", + "In der Flutter-Framework-Ebene wird es nur in AutomaticKeepAlive verwendet, und im Quellcode wird auch gesagt, dass es selten alleine verwendet wird. Dieses Beispiel zeigt die Zustandserhaltung der ListView-Einträge." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json new file mode 100644 index 00000000..231bcbdb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Keep Alive", + "info": "Whether the state of the child needs to be kept alive in a lazy-loaded list. It is the underlying implementation of AutomaticKeepAlive and is generally not used alone.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to KeepAlive", + "desc": [ + "【child】: *Child component 【Widget】", + "【keepAlive】: *Whether to keep alive 【bool】", + "In the Flutter framework layer, it is only used in AutomaticKeepAlive. The source code also mentions that it is rarely used alone. This example demonstrates the state keep-alive of ListView items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json new file mode 100644 index 00000000..077935c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Mantener activo", + "info": "En listas de carga perezosa, si el estado de los hijos necesita mantenerse activo. Es la implementación subyacente de AutomaticKeepAlive, generalmente no se usa por separado.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a KeepAlive", + "desc": [ + "【child】 : *Componente hijo 【Widget】", + "【keepAlive】 : *Si se mantiene activo 【bool】", + "En la capa del framework de Flutter, solo se usa en AutomaticKeepAlive, y en el código fuente también se menciona que rara vez se usa por separado. Este ejemplo muestra cómo mantener activo el estado de los elementos de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json new file mode 100644 index 00000000..6ff230cc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Maintenir en vie", + "info": "Dans une liste chargée de manière paresseuse, faut-il maintenir l'état de l'enfant en vie. C'est l'implémentation sous-jacente de AutomaticKeepAlive, généralement pas utilisé seul.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à KeepAlive", + "desc": [ + "【child】 : *composant enfant 【Widget】", + "【keepAlive】 : *maintenir en vie 【bool】", + "Dans la couche framework de Flutter, il est uniquement utilisé dans AutomaticKeepAlive, et le code source indique qu'il est rarement utilisé seul. Cet exemple montre la maintenance de l'état des éléments de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json new file mode 100644 index 00000000..b3ec17cb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Mantenimento Attivo", + "info": "In una lista caricata in modo lazy, lo stato del bambino deve essere mantenuto attivo. È l'implementazione sottostante di AutomaticKeepAlive e generalmente non viene utilizzato da solo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a KeepAlive", + "desc": [ + "【child】 : *componente figlio 【Widget】", + "【keepAlive】 : *se mantenere attivo 【bool】", + "Nel livello del framework Flutter, viene utilizzato solo in AutomaticKeepAlive, e il codice sorgente dice che è raramente usato da solo. Questo esempio mostra il mantenimento dello stato degli elementi di ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json new file mode 100644 index 00000000..77fce8d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "キープアライブ", + "info": "レイジーロードのリストで、子の状態をキープアライブする必要があるかどうか。AutomaticKeepAliveの基盤実装であり、通常は単独で使用しません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 紹介", + "desc": [ + "【child】 : *子コンポーネント 【Widget】", + "【keepAlive】 : *キープアライブするかどうか 【bool】", + "Flutterフレームワーク層では、AutomaticKeepAliveでのみ使用され、ソースコードでも単独で使用することはほとんどないとされています。この例は、ListViewアイテムの状態をキープアライブすることを示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json new file mode 100644 index 00000000..86a59289 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "유지", + "info": "지연 로딩된 목록에서 자식의 상태를 유지할 필요가 있는지 여부. AutomaticKeepAlive의 기본 구현이며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "KeepAlive 소개", + "desc": [ + "【child】 : *자식 위젯 【Widget】", + "【keepAlive】 : *유지 여부 【bool】", + "flutter 프레임워크 레이어에서는 AutomaticKeepAlive에서만 사용되며, 소스 코드에서도 단독으로 사용하는 경우가 드물다고 언급합니다. 이 예제는 ListView 항목의 상태 유지를 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json new file mode 100644 index 00000000..91c0dfb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Manter Ativo", + "info": "Em listas de carregamento preguiçoso, se o estado da criança precisa ser mantido ativo. É a implementação subjacente do AutomaticKeepAlive, geralmente não usado separadamente.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao KeepAlive", + "desc": [ + "【child】 : *componente filho 【Widget】", + "【keepAlive】 : *se deve manter ativo 【bool】", + "Na camada de framework do flutter, é usado apenas no AutomaticKeepAlive, e o código-fonte também diz que raramente é usado separadamente. Este exemplo mostra a manutenção do estado dos itens da ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json new file mode 100644 index 00000000..79c4db41 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/KeepAlive/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 316, + "name": "KeepAlive", + "localName": "Поддержание активности", + "info": "Нужно ли сохранять состояние дочерних элементов в лениво загружаемом списке. Это базовая реализация AutomaticKeepAlive, обычно не используется отдельно.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в KeepAlive", + "desc": [ + "【child】 : *Дочерний компонент 【Widget】", + "【keepAlive】 : *Сохранять ли активность 【bool】", + "На уровне фреймворка Flutter используется только в AutomaticKeepAlive, в исходном коде также сказано, что он редко используется отдельно. Этот пример демонстрирует поддержание состояния элементов ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json new file mode 100644 index 00000000..a03631fa --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "LayoutId", + "info": "Kann nur in der CustomMultiChildLayout-Komponente verwendet werden, um die Identität ihrer Kindkomponenten zu kennzeichnen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Anwendungsfall von LayoutId", + "desc": [ + "【id】 : Identifikations-ID 【Object】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json new file mode 100644 index 00000000..8ea43570 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Layout Id", + "info": "Can only be used in the CustomMultiChildLayout component to identify its child components.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId Usage Scenarios", + "desc": [ + "【id】 : Identifier id 【Object】", + "【child】 : Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json new file mode 100644 index 00000000..41bbd70e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de diseño", + "info": "Solo se puede usar en el componente CustomMultiChildLayout para identificar a sus componentes hijos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Escenarios de uso de LayoutId", + "desc": [ + "【id】 : Identificador de id 【Object】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json new file mode 100644 index 00000000..15dc1be9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de mise en page", + "info": "Ne peut être utilisé que dans le composant CustomMultiChildLayout pour identifier ses enfants.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scénario d'utilisation de LayoutId", + "desc": [ + "【id】 : Identifiant 【Object】", + "【child】 : Enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json new file mode 100644 index 00000000..ca5ca444 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id Layout", + "info": "Può essere utilizzato solo nel componente CustomMultiChildLayout per identificare i suoi componenti figli.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scenario di utilizzo di LayoutId", + "desc": [ + "【id】 : ID identificativo 【Object】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json new file mode 100644 index 00000000..798aaf9c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "レイアウトId", + "info": "CustomMultiChildLayoutコンポーネント内でのみ使用でき、その子コンポーネントの識別に使用されます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutIdの使用シナリオ", + "desc": [ + "【id】 : 識別id 【Object】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json new file mode 100644 index 00000000..b7de4fba --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "레이아웃 Id", + "info": "CustomMultiChildLayout 컴포넌트에서만 사용할 수 있으며, 자식 컴포넌트의 신원을 식별하는 데 사용됩니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutId 사용 사례", + "desc": [ + "【id】 : 식별 id 【Object】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json new file mode 100644 index 00000000..22315770 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Id de Layout", + "info": "Só pode ser usado no componente CustomMultiChildLayout para identificar os seus componentes filhos.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cenários de uso do LayoutId", + "desc": [ + "【id】 : Identificador de id 【Object】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json new file mode 100644 index 00000000..263741ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/LayoutId/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 315, + "name": "LayoutId", + "localName": "Идентификатор макета", + "info": "Может использоваться только в компоненте CustomMultiChildLayout для идентификации его дочерних компонентов.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Сценарии использования LayoutId", + "desc": [ + "【id】 : Идентификатор 【Object】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json new file mode 100644 index 00000000..7b9bbe12 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile-Thema", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für nachfolgende ListTile-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften von ListTile abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListTileTheme", + "desc": [ + "Kann die ListTileThemeData-Dateneigenschaften angeben, um Standardstile für nachfolgende ListTile-Komponenten festzulegen, wie Stile, Farben, Dekorationen, Ränder usw. Es kann auch ListTileTheme.of verwendet werden, um die Theme-Eigenschaften von ListTile abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json new file mode 100644 index 00000000..33c921b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile Theme", + "info": "Mainly used to set default properties for descendant ListTile components uniformly, and also to obtain the default properties of ListTile through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListTileTheme", + "desc": [ + "You can specify the ListTileThemeData properties to set default styles for descendant ListTile components, such as styles, colors, decorations, margins, etc. You can also use ListTileTheme.of to get the theme properties of ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json new file mode 100644 index 00000000..46b6a0d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema de ListTile", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes ListTile descendientes, y también se puede utilizar este componente para obtener las propiedades predeterminadas de ListTile.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListTileTheme", + "desc": [ + "Se puede especificar la propiedad de datos ListTileThemeData para establecer estilos predeterminados para los componentes ListTile descendientes, como estilos, colores, decoraciones, márgenes, etc. También se puede usar ListTileTheme.of para obtener las propiedades temáticas de ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json new file mode 100644 index 00000000..ecef7578 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Thème de ListTile", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants ListTile descendants de manière unifiée. Il est également possible d'obtenir les propriétés par défaut de ListTile via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListTileTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ListTileThemeData pour définir le style par défaut des composants ListTile descendants, tels que le style, la couleur, la décoration, la marge, etc. Vous pouvez également utiliser ListTileTheme.of pour obtenir les propriétés du thème de ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json new file mode 100644 index 00000000..e5586554 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema ListTile", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ListTile discendenti in modo uniforme, oppure per ottenere le proprietà predefinite di ListTile tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListTileTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di ListTileThemeData per impostare lo stile predefinito per i componenti ListTile discendenti, come stile, colore, decorazione, margine, ecc. Inoltre, è possibile utilizzare ListTileTheme.of per ottenere le proprietà del tema di ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json new file mode 100644 index 00000000..f6fe0cfd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTileテーマ", + "info": "主に子孫のListTileコンポーネントにデフォルトのプロパティを一括設定するために使用されます。また、このコンポーネントを通じてデフォルトのListTileのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileThemeの基本使用", + "desc": [ + "ListTileThemeDataデータプロパティを指定して、子孫のListTileコンポーネントにデフォルトのスタイル(スタイル、色、装飾、余白など)を設定できます。また、ListTileTheme.ofを使用してListTileのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json new file mode 100644 index 00000000..00696efc --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "ListTile 테마", + "info": "주로 후손 ListTile 컴포넌트에 대한 기본 속성을 통일적으로 설정하는 데 사용되며, 이 컴포넌트를 통해 기본 ListTile의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileTheme 기본 사용", + "desc": [ + "ListTileThemeData 데이터 속성을 지정하여 【후손】 ListTile 컴포넌트에 대한 기본 스타일(스타일, 색상, 장식, 여백 등)을 설정할 수 있습니다. ListTileTheme.of를 사용하여 ListTile의 테마 속성을 얻을 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json new file mode 100644 index 00000000..b638b2bd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Tema do ListTile", + "info": "Principalmente usado para definir propriedades padrão unificadas para componentes ListTile descendentes, também pode ser usado para obter as propriedades padrão do ListTile.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ListTileTheme", + "desc": [ + "Pode especificar os atributos de dados do ListTileThemeData para definir o estilo padrão para componentes ListTile descendentes, como estilo, cor, decoração, margens, etc. Também pode usar ListTileTheme.of para obter as propriedades do tema do ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json new file mode 100644 index 00000000..38e1d8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ListTileTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 334, + "name": "ListTileTheme", + "localName": "Тема ListTile", + "info": "В основном используется для установки свойств по умолчанию для компонентов ListTile-потомков, также можно получить свойства по умолчанию ListTile через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListTileTheme", + "desc": [ + "Можно указать свойства данных ListTileThemeData для установки стилей по умолчанию для компонентов ListTile-потомков, таких как стили, цвета, декорации, отступы и т.д. Также можно использовать ListTileTheme.of для получения тематических свойств ListTile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json new file mode 100644 index 00000000..bca3d929 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Banner-Stil", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für nachfolgende MaterialBanner-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften von MaterialBanner abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MaterialBannerTheme", + "desc": [ + "Kann die MaterialBannerThemeData-Dateneigenschaften verwenden, um Standardstile für nachfolgende MaterialBanner-Komponenten festzulegen, wie Hintergrundfarbe, Abstände, Textstile usw. Es kann auch MaterialBannerTheme.of verwenden, um die Themedaten von MaterialBanner abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json new file mode 100644 index 00000000..2eb954a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Banner Style", + "info": "Mainly used to set default properties for descendant MaterialBanner components uniformly, and it can also be used to obtain the default properties of MaterialBanner.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MaterialBannerTheme", + "desc": [ + "You can specify the MaterialBannerThemeData properties to set default styles for descendant MaterialBanner components, such as background color, margins, text styles, etc. You can also use MaterialBannerTheme.of to get the theme data of MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json new file mode 100644 index 00000000..2e9d4278 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema de Banner", + "info": "Principalmente utilizado para establecer propiedades predeterminadas unificadas para los componentes MaterialBanner descendientes. También se puede utilizar este componente para obtener las propiedades predeterminadas de MaterialBanner.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MaterialBannerTheme", + "desc": [ + "Se puede especificar la propiedad de datos MaterialBannerThemeData para establecer el estilo predeterminado de los componentes MaterialBanner descendientes, como el color de fondo, el margen, el estilo de texto, etc. También se puede usar MaterialBannerTheme.of para obtener los datos del tema de MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json new file mode 100644 index 00000000..03c958f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Thème de bannière", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants MaterialBanner descendants, ou pour obtenir les propriétés par défaut de MaterialBanner via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MaterialBannerTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de MaterialBannerThemeData pour définir le style par défaut des composants MaterialBanner descendants, tels que la couleur de fond, les marges, le style du texte, etc. Vous pouvez également utiliser MaterialBannerTheme.of pour obtenir les données de thème de MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json new file mode 100644 index 00000000..c9fc9050 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema del Banner", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti MaterialBanner discendenti, è anche possibile ottenere le proprietà predefinite di MaterialBanner attraverso questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MaterialBannerTheme", + "desc": [ + "È possibile specificare le proprietà di MaterialBannerThemeData per impostare lo stile predefinito per i componenti MaterialBanner discendenti, come il colore di sfondo, i margini, lo stile del testo, ecc. È anche possibile utilizzare MaterialBannerTheme.of per ottenere i dati del tema di MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json new file mode 100644 index 00000000..e2b376eb --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "バナースタイル", + "info": "主に子孫のMaterialBannerコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのMaterialBannerのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerThemeの基本使用", + "desc": [ + "MaterialBannerThemeDataデータプロパティを指定して、【子孫】のMaterialBannerコンポーネントにデフォルトのスタイル(背景色、余白、テキストスタイルなど)を設定できます。また、MaterialBannerTheme.ofを使用してMaterialBannerのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json new file mode 100644 index 00000000..efcbab08 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "배너 스타일", + "info": "주로 후손 MaterialBanner 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 MaterialBanner의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialBannerTheme 기본 사용법", + "desc": [ + "MaterialBannerThemeData 데이터 속성을 지정하여 후손 MaterialBanner 컴포넌트의 기본 스타일을 설정할 수 있습니다. 예를 들어 배경색, 여백, 텍스트 스타일 등. 또한 MaterialBannerTheme.of를 사용하여 MaterialBanner의 테마 데이터를 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json new file mode 100644 index 00000000..9824f516 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Tema de Banner", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes MaterialBanner descendentes, também pode ser usado para obter as propriedades padrão do MaterialBanner através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do MaterialBannerTheme", + "desc": [ + "Pode especificar as propriedades de dados do MaterialBannerThemeData para definir o estilo padrão para componentes MaterialBanner descendentes, como cor de fundo, margens, estilo de texto, etc. Também pode usar MaterialBannerTheme.of para obter os dados do tema do MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json new file mode 100644 index 00000000..342ca9a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MaterialBannerTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 327, + "name": "MaterialBannerTheme", + "localName": "Тема баннера", + "info": "Основное использование — установка стандартных свойств для компонентов MaterialBanner у потомков. Также можно получить стандартные свойства MaterialBanner через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MaterialBannerTheme", + "desc": [ + "Можно указать свойства данных MaterialBannerThemeData для установки стандартных стилей для компонентов MaterialBanner у потомков, таких как цвет фона, отступы, стиль текста и т.д. Также можно использовать MaterialBannerTheme.of для получения данных темы MaterialBanner." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json new file mode 100644 index 00000000..641c9d93 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Medienabfrage", + "info": "Über MediaQuery.of können Informationen wie Bildschirmgröße, Gerätedichte, Textskalierungsfaktor, Ränder usw. abgerufen werden.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery Dateninformationen abrufen", + "desc": [ + "MediaQuery.of(context) kann MediaQueryData abrufen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json new file mode 100644 index 00000000..187f601e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Media Query", + "info": "You can use MediaQuery.of to obtain information such as screen size, device density, text scaling ratio, margins, etc.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery Get Data Information", + "desc": [ + "MediaQuery.of(context) can obtain MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json new file mode 100644 index 00000000..b1ba389b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Consulta de Medios", + "info": "Se puede obtener información como el tamaño de la pantalla, la densidad del dispositivo, la escala de texto, los márgenes, etc., a través de MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obtener información de datos con MediaQuery", + "desc": [ + "MediaQuery.of(context) puede obtener MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json new file mode 100644 index 00000000..51afde9b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Requête média", + "info": "Vous pouvez obtenir des informations telles que la taille de l'écran, la densité de l'appareil, le facteur de zoom du texte, les marges, etc. via MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obtenir des informations de données avec MediaQuery", + "desc": [ + "MediaQuery.of(context) peut obtenir MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json new file mode 100644 index 00000000..f9fa1d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Query sui media", + "info": "È possibile ottenere informazioni come dimensioni dello schermo, densità del dispositivo, scala del testo, margini, ecc. tramite MediaQuery.of.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ottenere informazioni sui dati con MediaQuery", + "desc": [ + "MediaQuery.of(context) può ottenere MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json new file mode 100644 index 00000000..1994ff13 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "メディアクエリ", + "info": "MediaQuery.ofを使用して、画面サイズ、デバイスの密度、テキストのスケーリング比率、マージンなどの情報を取得できます。", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQueryでデータ情報を取得", + "desc": [ + "MediaQuery.of(context)を使用してMediaQueryDataを取得できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json new file mode 100644 index 00000000..0edde099 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "미디어 쿼리", + "info": "MediaQuery.of를 통해 화면 크기, 기기 밀도, 텍스트 확대 비율, 여백 등의 정보를 얻을 수 있습니다.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MediaQuery 데이터 정보 가져오기", + "desc": [ + "MediaQuery.of(context)를 통해 MediaQueryData를 얻을 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json new file mode 100644 index 00000000..d67c756f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Consulta de Mídia", + "info": "Pode usar MediaQuery.of para obter informações como o tamanho da tela, densidade do dispositivo, escala de texto, margens, etc.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Obter informações de dados com MediaQuery", + "desc": [ + "MediaQuery.of(context) pode obter MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json new file mode 100644 index 00000000..ba9d4b47 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/MediaQuery/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 167, + "name": "MediaQuery", + "localName": "Медиа-запросы", + "info": "С помощью MediaQuery.of можно получить информацию о размере экрана, плотности устройства, масштабе текста, отступах и т.д.", + "lever": 4, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Получение данных через MediaQuery", + "desc": [ + "MediaQuery.of(context) позволяет получить MediaQueryData" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json new file mode 100644 index 00000000..57f4d638 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Elterndaten-Widget", + "info": "Abstrakte Klasse, die verwendet wird, um ParentData-Informationen mit RenderObjectWidget-Kindkomponenten zu verbinden. Seine Unterklassen sind Positioned, Flexible, Expanded usw. Diese Komponenten können nur unter bestimmten Komponenten verwendet werden.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in ParentDataWidget", + "desc": [ + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json new file mode 100644 index 00000000..fff9f56f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Parent Data Widget", + "info": "An abstract class used to hook ParentData information to RenderObjectWidget child components. Its subclasses include Positioned, Flexible, Expanded, etc. These components can only be used under specific components.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ParentDataWidget", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json new file mode 100644 index 00000000..ae003e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget de Datos Parentales", + "info": "Clase abstracta utilizada para conectar información de ParentData a los subcomponentes de RenderObjectWidget. Sus subclases incluyen Positioned, Flexible, Expanded, etc., y estos componentes solo se pueden utilizar bajo componentes específicos.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ParentDataWidget", + "desc": [ + "【child】 : Subcomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json new file mode 100644 index 00000000..1727f5c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget de données parentales", + "info": "Classe abstraite utilisée pour associer des informations ParentData à des widgets enfants RenderObjectWidget. Ses sous-classes incluent Positioned, Flexible, Expanded, etc., ces widgets ne peuvent être utilisés que sous des composants spécifiques.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ParentDataWidget", + "desc": [ + "【child】 : widget enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json new file mode 100644 index 00000000..0fcb14e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Widget dei dati genitore", + "info": "Classe astratta utilizzata per collegare le informazioni ParentData ai widget figli di RenderObjectWidget. Le sue sottoclassi includono Positioned, Flexible, Expanded, ecc., e questi widget possono essere utilizzati solo sotto componenti specifici.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ParentDataWidget", + "desc": [ + "【child】 : Widget figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json new file mode 100644 index 00000000..dd0bd64c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "親データウィジェット", + "info": "抽象クラスで、ParentData情報をRenderObjectWidgetの子ウィジェットにフックするために使用されます。そのサブクラスにはPositioned、Flexible、Expandedなどがあり、これらのウィジェットは特定のコンポーネントの下でのみ使用できます。", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 紹介", + "desc": [ + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json new file mode 100644 index 00000000..da5b2a45 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "부모 데이터 위젯", + "info": "추상 클래스, ParentData 정보를 RenderObjectWidget 자식 위젯에 연결하는 데 사용됩니다. 하위 클래스로는 Positioned, Flexible, Expanded 등이 있으며, 이러한 위젯은 특정 위젯 아래에서만 사용할 수 있습니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ParentDataWidget 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json new file mode 100644 index 00000000..c44ff6d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Componente de Dados Parentais", + "info": "Classe abstrata usada para conectar informações de ParentData a componentes filhos de RenderObjectWidget. Suas subclasses incluem Positioned, Flexible, Expanded, etc. Esses componentes só podem ser usados sob componentes específicos.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ParentDataWidget", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json new file mode 100644 index 00000000..41988d6b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ParentDataWidget/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 347, + "name": "ParentDataWidget", + "localName": "Родительский виджет данных", + "info": "Абстрактный класс, используемый для привязки информации ParentData к дочерним виджетам RenderObjectWidget. Его подклассы включают Positioned, Flexible, Expanded и другие, которые могут использоваться только под определенными компонентами.", + "lever": 1, + "family": 5, + "linkIds": [ + 106, + 109, + 108, + 315 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ParentDataWidget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json new file mode 100644 index 00000000..4aded214 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Popup-Menü-Stil", + "info": "Wird hauptsächlich verwendet, um Standardeigenschaften für die nachfolgenden PopupMenuButton-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardeigenschaften des PopupMenu zu erhalten.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuTheme", + "desc": [ + "Kann die PopupMenuThemeData-Dateneigenschaften verwenden, um Standardstile für die nachfolgenden PopupMenuButton-Komponenten festzulegen, wie Form, Schattentiefe, Farbe, Textstil usw. Kann auch PopupMenuTheme.of verwenden, um die Themedaten des PopupMenu zu erhalten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json new file mode 100644 index 00000000..39033a47 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Popup Menu Theme", + "info": "Mainly used to set default properties uniformly for descendant PopupMenuButton components, and also to obtain the default properties of PopupMenu through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuTheme", + "desc": [ + "You can specify the PopupMenuThemeData properties to set default styles for descendant PopupMenuButton components, such as shape, elevation, color, text style, etc. You can also use PopupMenuTheme.of to obtain the theme data of PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json new file mode 100644 index 00000000..ec0d9a69 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema del menú emergente", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes PopupMenuButton descendientes, también se puede obtener las propiedades predeterminadas de PopupMenu a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuTheme", + "desc": [ + "Se pueden especificar las propiedades de datos de PopupMenuThemeData para establecer estilos predeterminados para los componentes PopupMenuButton descendientes, como forma, profundidad de sombra, color, estilo de texto, etc. También se puede usar PopupMenuTheme.of para obtener los datos del tema de PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json new file mode 100644 index 00000000..38338257 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Thème du menu contextuel", + "info": "Principalement utilisé pour définir des propriétés par défaut unifiées pour les composants PopupMenuButton descendants. Il est également possible d'obtenir les propriétés par défaut de PopupMenu via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de PopupMenuThemeData pour définir des styles par défaut pour les composants PopupMenuButton descendants, tels que la forme, la profondeur de l'ombre, la couleur, le style de texte, etc. Vous pouvez également utiliser PopupMenuTheme.of pour obtenir les données de thème de PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json new file mode 100644 index 00000000..07caa85b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema del menu a comparsa", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti PopupMenuButton discendenti, oppure per ottenere le proprietà predefinite del PopupMenu attraverso questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di PopupMenuThemeData per impostare lo stile predefinito per i componenti PopupMenuButton discendenti, come forma, profondità dell'ombra, colore, stile del testo, ecc. È anche possibile utilizzare PopupMenuTheme.of per ottenere i dati del tema del PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json new file mode 100644 index 00000000..4bd5bfd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "ポップアップメニュースタイル", + "info": "主に子孫のPopupMenuButtonコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのPopupMenuのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuThemeの基本使用", + "desc": [ + "PopupMenuThemeDataデータ属性を指定して、【子孫】のPopupMenuButtonコンポーネントにデフォルトのスタイルを設定できます。形状、影の深さ、色、テキストスタイルなどです。また、PopupMenuTheme.ofを使用してPopupMenuのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json new file mode 100644 index 00000000..e6683a3e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "팝업 메뉴 스타일", + "info": "주로 후손의 PopupMenuButton 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 PopupMenu의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuTheme 기본 사용", + "desc": [ + "PopupMenuThemeData 데이터 속성을 지정하여 후손의 PopupMenuButton 컴포넌트에 기본 스타일(예: 모양, 그림자, 색상, 텍스트 스타일 등)을 설정할 수 있습니다. 또한 PopupMenuTheme.of를 사용하여 PopupMenu의 테마 데이터를 얻을 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json new file mode 100644 index 00000000..30af0da8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Tema do Menu Pop-up", + "info": "Principalmente utilizado para definir propriedades padrão uniformes para os componentes PopupMenuButton descendentes, também é possível obter as propriedades padrão do PopupMenu através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuTheme", + "desc": [ + "Pode especificar as propriedades de dados do PopupMenuThemeData para definir o estilo padrão para os componentes PopupMenuButton descendentes, como forma, profundidade de sombra, cor, estilo de texto, etc. Também é possível usar PopupMenuTheme.of para obter os dados do tema do PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json new file mode 100644 index 00000000..bd6d8ef6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PopupMenuTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 330, + "name": "PopupMenuTheme", + "localName": "Тема всплывающего меню", + "info": "Основное использование для установки стандартных свойств для компонентов PopupMenuButton потомков, также можно получить свойства стандартного PopupMenu через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuTheme", + "desc": [ + "Можно указать атрибуты данных PopupMenuThemeData для установки стандартных стилей для компонентов PopupMenuButton потомков, таких как форма, глубина тени, цвет, стиль текста и т.д. Также можно использовать PopupMenuTheme.of для получения данных темы PopupMenu." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json new file mode 100644 index 00000000..c0fd65b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Positionierungskomponente", + "info": "Kann nur in einem Stack verwendet werden, ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Positioned", + "desc": [ + "【child】 : Komponente 【Widget】", + "【top】 : Abstand zum oberen Elternteil 【double】", + "【right】 : Abstand zum rechten Elternteil 【double】", + "【left】 : Abstand zum linken Elternteil 【double】", + "【bottom】 : Abstand zum unteren Elternteil 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json new file mode 100644 index 00000000..6c4ade67 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Positioning Component", + "info": "Can only be used in Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Positioned", + "desc": [ + "【child】: Component 【Widget】", + "【top】: Distance to the top of the parent 【double】", + "【right】: Distance to the right of the parent 【double】", + "【left】: Distance to the left of the parent 【double】", + "【bottom】: Distance to the bottom of the parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json new file mode 100644 index 00000000..9e450347 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente de posicionamiento", + "info": "Solo se puede usar en Stack, permite especificar las distancias superior, izquierda, derecha e inferior para colocar un componente con precisión.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distancia al borde superior del padre 【double】", + "【right】 : Distancia al borde derecho del padre 【double】", + "【left】 : Distancia al borde izquierdo del padre 【double】", + "【bottom】 : Distancia al borde inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json new file mode 100644 index 00000000..a263004d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Composant de positionnement", + "info": "Ne peut être utilisé que dans une Stack, permet de positionner précisément un composant en spécifiant les distances par rapport au haut, bas, gauche et droite.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Positioned", + "desc": [ + "【child】 : Composant 【Widget】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【right】 : Distance par rapport à la droite du parent 【double】", + "【left】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json new file mode 100644 index 00000000..1093c29e --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente di posizionamento", + "info": "Può essere utilizzato solo in Stack, consente di posizionare con precisione un componente specificando le distanze da sinistra, destra, alto e basso.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【right】 : Distanza dal bordo destro del genitore 【double】", + "【left】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json new file mode 100644 index 00000000..0aedbae0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "位置指定コンポーネント", + "info": "Stack内でのみ使用可能で、上下左右の距離を指定してコンポーネントを正確に配置できます。", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positionedの基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【top】 : 親の上端までの距離 【double】", + "【right】 : 親の右端までの距離 【double】", + "【left】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json new file mode 100644 index 00000000..c29eeb19 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "위치 지정 컴포넌트", + "info": "Stack에서만 사용할 수 있으며, 상하좌우 거리를 지정하여 특정 컴포넌트를 정확하게 배치할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Positioned 기본 사용법", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【top】 : 상단에서 부모까지의 거리 【double】", + "【right】 : 우측에서 부모까지의 거리 【double】", + "【left】 : 좌측에서 부모까지의 거리 【double】", + "【bottom】 : 하단에서 부모까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json new file mode 100644 index 00000000..58cee8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Componente de Posicionamento", + "info": "Só pode ser usado em Stack, pode especificar as distâncias superior, inferior, esquerda e direita para posicionar um componente com precisão.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Positioned", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distância do topo do pai 【double】", + "【right】 : Distância da direita do pai 【double】", + "【left】 : Distância da esquerda do pai 【double】", + "【bottom】 : Distância da base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json new file mode 100644 index 00000000..afa91ee1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/Positioned/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 108, + "name": "Positioned", + "localName": "Компонент позиционирования", + "info": "Может использоваться только в Stack, позволяет точно разместить компонент, указав расстояния сверху, слева, справа и снизу.", + "lever": 3, + "family": 5, + "linkIds": [ + 97, + 159, + 121 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Positioned", + "desc": [ + "【child】 : Компонент 【Widget】", + "【top】 : Расстояние до верха родителя 【double】", + "【right】 : Расстояние до правого края родителя 【double】", + "【left】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до низа родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json new file mode 100644 index 00000000..e027a2c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Primärer Scroll-Controller", + "info": "Es ist eine Unterklasse von InheritedWidget und stellt den standardmäßigen ScrollController-Objekt für scrollbare Ansichten im Unterbaum über den Kontext bereit.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in den PrimaryScrollController", + "desc": [ + "【controller】 : Scroll-Controller 【ScrollController】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json new file mode 100644 index 00000000..7595d787 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Primary Scroll Controller", + "info": "It is a subclass of InheritedWidget, providing a default ScrollController object to scrollable views in the subtree through context.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to PrimaryScrollController", + "desc": [ + "【controller】: Scroll Controller 【ScrollController】", + "【child】: Child Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json new file mode 100644 index 00000000..1441d306 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controlador de Desplazamiento Primario", + "info": "Es una subclase de InheritedWidget que proporciona un objeto ScrollController predeterminado a las vistas desplazables en el subárbol a través del contexto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a PrimaryScrollController", + "desc": [ + "【controller】 : Controlador de desplazamiento 【ScrollController】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json new file mode 100644 index 00000000..c097b0c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Contrôleur de défilement initial", + "info": "C'est une sous-classe d'InheritedWidget qui fournit un objet ScrollController par défaut aux vues défilables dans le sous-arbre via le contexte.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction de PrimaryScrollController", + "desc": [ + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json new file mode 100644 index 00000000..729e3e7f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controllore di scorrimento iniziale", + "info": "È una sottoclasse di InheritedWidget, che fornisce un oggetto ScrollController predefinito alle viste scorrevoli nel sottoalbero tramite il contesto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a PrimaryScrollController", + "desc": [ + "【controller】 : Controllore di scorrimento 【ScrollController】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json new file mode 100644 index 00000000..46787923 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "初期スクロールコントローラー", + "info": "これは InheritedWidget のサブクラスで、context を通じてサブツリー内のスクロール可能なビューにデフォルトの ScrollController オブジェクトを提供します。", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 紹介", + "desc": [ + "【controller】 : スクロールコントローラー 【ScrollController】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json new file mode 100644 index 00000000..5897c1b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "기본 스크롤 컨트롤러", + "info": "이것은 InheritedWidget의 하위 클래스로, context를 통해 하위 트리의 스크롤 가능한 뷰에 기본 ScrollController 객체를 제공합니다.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PrimaryScrollController 소개", + "desc": [ + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【child】 : 하위 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json new file mode 100644 index 00000000..d071d047 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Controlador de Deslocamento Inicial", + "info": "É uma subclasse de InheritedWidget que fornece um objeto ScrollController padrão para vistas roláveis na subárvore através do contexto.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao PrimaryScrollController", + "desc": [ + "【controller】 : Controlador de Deslocamento 【ScrollController】", + "【child】 : Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json new file mode 100644 index 00000000..4c828ad7 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/PrimaryScrollController/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 335, + "name": "PrimaryScrollController", + "localName": "Основной контроллер прокрутки", + "info": "Это подкласс InheritedWidget, который предоставляет объект ScrollController по умолчанию для прокручиваемых представлений в поддереве через контекст.", + "lever": 1, + "family": 5, + "linkIds": [ + 349, + 344, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в PrimaryScrollController", + "desc": [ + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json new file mode 100644 index 00000000..aba9b5c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iOS-Menüschaltfläche", + "info": "Muss eine scrollbare Komponente umschließen und durch das Verhalten-Attribut den Scroll-Effekt steuern, kann den blauen Schatten beim Scrollen entfernen usw.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ScrollConfiguration", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【behavior】: Scrollverhalten 【ScrollBehavior】", + " Kann ScrollConfiguration verwenden, um den blauen Schatten in ListView zu entfernen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json new file mode 100644 index 00000000..502a531f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iOS Menu Button", + "info": "Needs to wrap a scrollable component and control the scrolling effect through the behavior property, which can remove the blue shadow of the scrolling, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ScrollConfiguration", + "desc": [ + "【child】: Child component 【Widget】", + "【behavior】: Scroll behavior 【ScrollBehavior】", + " ScrollConfiguration can be used to remove the blue shadow of ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json new file mode 100644 index 00000000..446a72a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Botón de menú de iOS", + "info": "Necesita envolver un componente deslizable y controlar el efecto de deslizamiento a través de la propiedad behavior, lo que puede eliminar la sombra azul del deslizamiento, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ScrollConfiguration", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【behavior】 : Comportamiento de deslizamiento 【ScrollBehavior】", + " Puedes usar ScrollConfiguration para eliminar la sombra azul de ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json new file mode 100644 index 00000000..9e750c53 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Bouton de menu iOS", + "info": "Doit envelopper un composant défilable et contrôler l'effet de défilement via la propriété behavior, peut supprimer l'ombre bleue du défilement, etc.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ScrollConfiguration", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【behavior】 : Comportement de défilement 【ScrollBehavior】", + " Peut utiliser ScrollConfiguration pour supprimer l'ombre bleue de ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json new file mode 100644 index 00000000..627b4a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Pulsante menu ios", + "info": "Deve avvolgere un componente scorrevole e controllare l'effetto dello scorrimento attraverso la proprietà behavior, rimuovendo ad esempio l'ombra blu dello scorrimento.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ScrollConfiguration", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【behavior】 : Comportamento di scorrimento 【ScrollBehavior】", + " Puoi usare ScrollConfiguration per rimuovere l'ombra blu da ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json new file mode 100644 index 00000000..36c5d1ec --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "iosメニューボタン", + "info": "スクロール可能なコンポーネントをラップし、behaviorプロパティを通じてスクロール効果を制御します。これにより、スクロール時の青色の影などを取り除くことができます。", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfigurationの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【behavior】 : スクロール動作 【ScrollBehavior】", + " ScrollConfigurationを使用してListViewの青色の影をなくすことができます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json new file mode 100644 index 00000000..ae09e759 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "ios 메뉴 버튼", + "info": "스크롤 가능한 컴포넌트를 감싸고 behavior 속성을 통해 스크롤 효과를 제어할 수 있으며, 스크롤 시 파란색 그림자 등을 제거할 수 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollConfiguration 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【behavior】 : 스크롤 동작 【ScrollBehavior】", + " ScrollConfiguration을 사용하여 ListView의 파란색 그림자를 제거할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json new file mode 100644 index 00000000..a5dad2f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "Botão de menu ios", + "info": "Precisa envolver um componente deslizável e controlar o efeito de deslize através da propriedade behavior, podendo remover a sombra azul do deslize, entre outros.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ScrollConfiguration", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【behavior】 : Comportamento de deslize 【ScrollBehavior】", + " Pode usar o ScrollConfiguration para remover a sombra azul do ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json new file mode 100644 index 00000000..18999966 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ScrollConfiguration/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 180, + "name": "ScrollConfiguration", + "localName": "кнопка меню ios", + "info": "Необходимо обернуть прокручиваемый компонент и управлять эффектом прокрутки через свойство behavior, можно убрать синюю тень при прокрутке и т.д.", + "lever": 3, + "family": 5, + "linkIds": [ + 162, + 163, + 164 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ScrollConfiguration", + "desc": [ + "【child】 : дочерний компонент 【Widget】", + "【behavior】 : поведение прокрутки 【ScrollBehavior】", + " Можно использовать ScrollConfiguration, чтобы убрать синюю тень у ListView" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json new file mode 100644 index 00000000..919e8b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Schieberegler-Stil", + "info": "Kann ein Kind enthalten und gibt den Standardstil für nachfolgende Schieberegler an. Wird häufig verwendet, um den Stil von Schiebereglern zu vereinheitlichen und die individuelle Einstellung zu vermeiden. Kann auch verwendet werden, um den Stil von Schiebereglern anzupassen.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme Verwendung", + "desc": [ + "Kann SliderTheme.of verwenden, um das Slider-Themen-Datenobjekt zu erhalten, das eine Vielzahl von Attributen für die Einstellung des Schiebereglers enthält.", + "Kann Standardstile für Schaltflächenkomponenten von ButtonTheme [Nachkommen] festlegen, einschließlich Farbe, Form, Größe usw." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme Stilanpassung für Schieberegler", + "desc": [ + "Durch thumbShape und valueIndicatorShape kann der Stil des Schiebereglers angepasst werden.", + "Hinweis: Dieses Beispiel bezieht sich auf SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json new file mode 100644 index 00000000..95df2de4 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Slider Style", + "info": "Can contain a child, specifies the default style for descendant Sliders. Commonly used for unifying the style of Sliders to avoid setting them one by one, and can also customize the style of Sliders.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme Usage", + "desc": [ + "You can obtain the Slider theme data object through SliderTheme.of, which contains a large number of properties for setting the Slider.", + "You can set the default style for the button components of ButtonTheme【descendants】, including color, shape, size, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme Customization for Slider", + "desc": [ + "You can customize the style of the Slider through thumbShape and valueIndicatorShape.", + "Note: This example refers to the SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json new file mode 100644 index 00000000..0c19c2c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Estilo del deslizador", + "info": "Puede contener un hijo y especifica el estilo predeterminado para los Slider descendientes. Se usa comúnmente para unificar el estilo de los Slider, evitando configuraciones individuales, y también permite personalizar el estilo del Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de SliderTheme", + "desc": [ + "Se puede obtener el objeto de datos del tema Slider a través de SliderTheme.of, que contiene una gran cantidad de propiedades para configurar el Slider.", + "Puede establecer el estilo predeterminado para los componentes de botón [descendientes] de ButtonTheme, incluyendo color, forma, tamaño, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalización del estilo del Slider con SliderTheme", + "desc": [ + "Se puede personalizar el estilo del Slider a través de thumbShape y valueIndicatorShape.", + "Nota: Este ejemplo se basa en SlideDemo de flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json new file mode 100644 index 00000000..c9db739c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Style du curseur", + "info": "Peut contenir un enfant, spécifie le style par défaut pour les descendants Slider. Souvent utilisé pour unifier le style des Slider, évitant de les configurer un par un, et permet également de personnaliser le style du Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de SliderTheme", + "desc": [ + "Peut obtenir l'objet de données de thème Slider via SliderTheme.of, qui contient de nombreuses propriétés pour la configuration du Slider.\"", + "Peut définir un style par défaut pour les composants boutons des descendants de ButtonTheme, y compris la couleur, la forme, la taille, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personnalisation du style du Slider avec SliderTheme", + "desc": [ + "Permet de personnaliser le style du Slider via thumbShape et valueIndicatorShape.\"", + "Note: Cet exemple est inspiré de SlideDemo dans flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json new file mode 100644 index 00000000..0da8d57b --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Stile del cursore", + "info": "Può contenere un figlio e specifica lo stile predefinito per i cursori discendenti. Comunemente utilizzato per unificare lo stile dei cursori, evitando di impostarli uno per uno, e consente anche la personalizzazione dello stile del cursore.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di SliderTheme", + "desc": [ + "È possibile ottenere l'oggetto dati del tema del cursore tramite SliderTheme.of, che contiene numerose proprietà per la configurazione del cursore.", + "È possibile impostare uno stile predefinito per i componenti del pulsante [discendenti] di ButtonTheme, inclusi colore, forma, dimensioni, ecc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalizzazione dello stile del cursore con SliderTheme", + "desc": [ + "È possibile personalizzare lo stile del cursore tramite thumbShape e valueIndicatorShape.", + "Nota: Questo esempio si riferisce a SlideDemo in flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json new file mode 100644 index 00000000..46441db3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "スライダースタイル", + "info": "1つの子要素を収容し、子孫のSliderにデフォルトのスタイルを指定します。Sliderのスタイル統一に使用され、個別に設定する必要がなく、Sliderのスタイルをカスタマイズすることもできます。", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderThemeの使用", + "desc": [ + "SliderTheme.ofを使用してSliderのテーマデータオブジェクトを取得できます。これには、Sliderの設定に使用される多くの属性が含まれています。\"", + "ButtonTheme【子孫】のボタンコンポーネントにデフォルトのスタイルを設定できます。これには、色、形状、サイズなどが含まれます。" + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderThemeによるSliderのスタイルカスタマイズ", + "desc": [ + "thumbShapeとvalueIndicatorShapeを使用してSliderのスタイルをカスタマイズできます。\"", + "注: この例はflutter-galleryのSlideDemoを参考にしています" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json new file mode 100644 index 00000000..09d0c527 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "슬라이더 스타일", + "info": "하나의 자식을 포함할 수 있으며, 후손 Slider에 기본 스타일을 지정합니다. 주로 Slider의 스타일 통일을 위해 사용되며, 일일이 설정하는 것을 방지하고, Slider의 스타일을 커스터마이징할 수도 있습니다.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliderTheme 사용", + "desc": [ + "SliderTheme.of를 통해 Slider 테마 데이터 객체를 얻을 수 있으며, 여기에는 Slider 설정을 위한 다양한 속성이 포함되어 있습니다.", + "ButtonTheme【후손】의 버튼 컴포넌트에 기본 스타일을 설정할 수 있으며, 색상, 모양, 크기 등을 포함합니다." + ] + }, + { + "file": "node2_diy.dart", + "name": "SliderTheme를 통한 Slider 스타일 커스터마이징", + "desc": [ + "thumbShape와 valueIndicatorShape를 통해 Slider의 스타일을 커스터마이징할 수 있습니다.", + "참고: 이 예제는 flutter-gallery의 SlideDemo를 참고했습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json new file mode 100644 index 00000000..7e669c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Estilo do Controlo Deslizante", + "info": "Pode conter um filho, especificando o estilo padrão para o Controlo Deslizante descendente. Comumente usado para unificar o estilo do Controlo Deslizante, evitando a configuração individual, também pode personalizar o estilo do Controlo Deslizante.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do SliderTheme", + "desc": [ + "Pode obter o objeto de dados do tema do Controlo Deslizante através de SliderTheme.of, que contém uma grande quantidade de propriedades para configurar o Controlo Deslizante.", + "Pode definir o estilo padrão para os componentes de botão [descendentes] do ButtonTheme, incluindo cor, forma, tamanho, etc." + ] + }, + { + "file": "node2_diy.dart", + "name": "Personalização do estilo do Controlo Deslizante com SliderTheme", + "desc": [ + "Através de thumbShape e valueIndicatorShape, pode personalizar o estilo do Controlo Deslizante.", + "Nota: Este exemplo é baseado no SlideDemo do flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json new file mode 100644 index 00000000..0f4ed94a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/SliderTheme/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 331, + "name": "SliderTheme", + "localName": "Стиль слайдера", + "info": "Может содержать один дочерний элемент, задает стиль по умолчанию для потомков Slider. Часто используется для унификации стилей Slider, чтобы избежать индивидуальной настройки, также позволяет настраивать стиль Slider.", + "lever": 3, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование SliderTheme", + "desc": [ + "Можно получить объект данных темы Slider через SliderTheme.of, который содержит множество свойств для настройки Slider.", + "Можно задать стиль по умолчанию для компонентов кнопок, являющихся потомками ButtonTheme, включая цвет, форму, размер и т.д." + ] + }, + { + "file": "node2_diy.dart", + "name": "Настройка стиля Slider с помощью SliderTheme", + "desc": [ + "С помощью thumbShape и valueIndicatorShape можно настроить стиль Slider.", + "Примечание: этот пример взят из SlideDemo в flutter-gallery" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json new file mode 100644 index 00000000..1a1cc3b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Tabellenzelle", + "info": "Muss in den Nachkommen der Table-Komponente verwendet werden, um die vertikale Ausrichtung der Tabellenkinder zu steuern, und hat keine große Bedeutung.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TableCell", + "desc": [ + "【child】 : Komponente 【Widget】", + "【verticalAlignment】 : Vertikale Ausrichtung 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json new file mode 100644 index 00000000..d1228b6f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Table Cell", + "info": "Must be used within the descendants of a Table component to control the vertical alignment of table children, and it doesn't have much significant function.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TableCell", + "desc": [ + "【child】: Component 【Widget】", + "【verticalAlignment】: Vertical Alignment 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json new file mode 100644 index 00000000..9166ac77 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Celda de tabla", + "info": "Debe usarse en los descendientes del componente Table, para controlar la alineación vertical de los hijos de la tabla, y no tiene un gran efecto.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Alineación vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json new file mode 100644 index 00000000..db2ee9d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Cellule de tableau", + "info": "Doit être utilisé dans la descendance du composant Table, pour contrôler l'alignement vertical des enfants du tableau, et n'a pas beaucoup d'effet.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TableCell", + "desc": [ + "【child】 : Composant 【Widget】", + "【verticalAlignment】 : Alignement vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json new file mode 100644 index 00000000..90ae875a --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Cella della tabella", + "info": "Deve essere utilizzato all'interno dei discendenti del componente Table, per controllare l'allineamento verticale dei figli della tabella, e non ha un ruolo particolarmente significativo.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Allineamento verticale 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json new file mode 100644 index 00000000..cd93b7ea --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "表室", + "info": "Tableコンポーネントの子孫で使用する必要があり、表の子の垂直方向の整列を制御するために使用されますが、大きな役割はありません。", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCellの基本的な使用法", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【verticalAlignment】 : 垂直方向の整列 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json new file mode 100644 index 00000000..2540d6fd --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "테이블 셀", + "info": "Table 컴포넌트의 후손에서 사용해야 하며, 테이블 자식의 수직 정렬 방식을 제어하는 데 사용되며 큰 역할은 없습니다.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableCell 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【verticalAlignment】 : 수직 정렬 방식 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json new file mode 100644 index 00000000..df8c90a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Célula da Tabela", + "info": "Deve ser usado nos descendentes do componente Table, para controlar o alinhamento vertical dos filhos da tabela, e não tem um grande impacto.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TableCell", + "desc": [ + "【child】 : Componente 【Widget】", + "【verticalAlignment】 : Alinhamento Vertical 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json new file mode 100644 index 00000000..143246f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TableCell/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 317, + "name": "TableCell", + "localName": "Ячейка таблицы", + "info": "Должен использоваться в потомках компонента Table для управления вертикальным выравниванием дочерних элементов таблицы, но не имеет большого значения.", + "lever": 1, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TableCell", + "desc": [ + "【child】 : Компонент 【Widget】", + "【verticalAlignment】 : Вертикальное выравнивание 【TableCellVerticalAlignment】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json new file mode 100644 index 00000000..b03e2be3 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Schaltflächenstil", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende ToggleButtons-Komponenten festzulegen. Es kann auch verwendet werden, um die Standardattribute von ToggleButtons abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ToggleButtonsTheme", + "desc": [ + "Mit ToggleButtonsThemeData können Standardstile wie Rahmenstil, Farbe, Dekoration usw. für nachfolgende ToggleButtons-Komponenten festgelegt werden. Mit ToggleButtonsTheme.of können auch die Themendaten von ToggleButtons abgerufen werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json new file mode 100644 index 00000000..8b9d2017 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Slider Style", + "info": "Mainly used to set default properties for descendant ToggleButtons components uniformly. You can also get the default properties of ToggleButtons through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ToggleButtonsTheme", + "desc": [ + "You can specify the ToggleButtonsThemeData properties to set default styles for descendant ToggleButtons components, such as border style, color, decoration, etc. You can also use ToggleButtonsTheme.of to get the theme data of ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json new file mode 100644 index 00000000..0cfe28b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema de botones de alternancia", + "info": "Se utiliza principalmente para establecer propiedades predeterminadas unificadas para los componentes ToggleButtons descendientes, también se puede obtener las propiedades predeterminadas de ToggleButtons a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ToggleButtonsTheme", + "desc": [ + "Se puede especificar la propiedad de datos ToggleButtonsThemeData para establecer estilos predeterminados para los componentes ToggleButtons descendientes, como estilos de borde, colores, decoraciones, etc. También se puede usar ToggleButtonsTheme.of para obtener los datos del tema de ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json new file mode 100644 index 00000000..34f273ee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Thème des boutons bascule", + "info": "Principalement utilisé pour définir des propriétés par défaut unifiées pour les composants ToggleButtons descendants, ou pour obtenir les propriétés par défaut des ToggleButtons via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ToggleButtonsTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de données de ToggleButtonsThemeData pour définir le style par défaut des composants ToggleButtons descendants, tels que le style de bordure, la couleur, la décoration, etc. Vous pouvez également utiliser ToggleButtonsTheme.of pour obtenir les données de thème des ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json new file mode 100644 index 00000000..2e7b7069 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema dei pulsanti di commutazione", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti ToggleButtons dei discendenti. È anche possibile ottenere le proprietà predefinite dei ToggleButtons tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ToggleButtonsTheme", + "desc": [ + "È possibile specificare le proprietà dei dati ToggleButtonsThemeData per impostare lo stile predefinito per i componenti ToggleButtons dei discendenti, come lo stile del bordo, il colore, la decorazione, ecc. È anche possibile utilizzare ToggleButtonsTheme.of per ottenere i dati del tema dei ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json new file mode 100644 index 00000000..dd837f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "スライダースタイル", + "info": "主に子孫のToggleButtonsコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのToggleButtonsのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsThemeの基本使用", + "desc": [ + "ToggleButtonsThemeDataデータプロパティを指定して、子孫のToggleButtonsコンポーネントにデフォルトのスタイル(ボーダースタイル、色、装飾など)を設定できます。また、ToggleButtonsTheme.ofを使用してToggleButtonsのテーマデータを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json new file mode 100644 index 00000000..6083acee --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "토글 버튼 스타일", + "info": "주로 후손 ToggleButtons 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 ToggleButtons의 속성을 얻을 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ToggleButtonsTheme 기본 사용법", + "desc": [ + "ToggleButtonsThemeData 데이터 속성을 지정하여 후손 ToggleButtons 컴포넌트에 기본 스타일(예: 테두리 스타일, 색상, 장식 등)을 설정할 수 있습니다. 또한 ToggleButtonsTheme.of를 사용하여 ToggleButtons의 테마 데이터를 얻을 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json new file mode 100644 index 00000000..b5f22631 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Tema dos Botões de Alternância", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes ToggleButtons descendentes, também é possível obter as propriedades padrão do ToggleButtons através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ToggleButtonsTheme", + "desc": [ + "Pode especificar as propriedades de dados do ToggleButtonsThemeData para definir o estilo padrão para componentes ToggleButtons descendentes, como estilo de borda, cor, decoração, etc. Também é possível usar ToggleButtonsTheme.of para obter os dados do tema do ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json new file mode 100644 index 00000000..c5789f62 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/ToggleButtonsTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 332, + "name": "ToggleButtonsTheme", + "localName": "Тема переключателей", + "info": "В основном используется для установки стандартных свойств для компонентов ToggleButtons у потомков, также можно получить свойства по умолчанию для ToggleButtons через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ToggleButtonsTheme", + "desc": [ + "Можно указать свойства данных ToggleButtonsThemeData для установки стандартных стилей для компонентов ToggleButtons у потомков, таких как стиль границы, цвет, оформление и т.д. Также можно использовать ToggleButtonsTheme.of для получения тематических данных ToggleButtons." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json new file mode 100644 index 00000000..7c6030a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tooltip-Thema", + "info": "Wird hauptsächlich verwendet, um Standardattribute für nachfolgende Tooltip-Komponenten festzulegen. Es kann auch verwendet werden, um die Attribute des standardmäßigen Tooltip-Themas abzurufen.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TooltipTheme", + "desc": [ + "Kann die TooltipThemeData-Datenattribute festlegen, um Standardstile für nachfolgende Tooltip-Komponenten zu definieren, wie Dekoration, Textstil, Anzeigedauer, Randabstand usw. Es kann auch TooltipTheme.of verwenden, um die Themenattribute des Tooltips abzurufen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json new file mode 100644 index 00000000..a51860c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tooltip Theme", + "info": "Mainly used to set default properties for descendant Tooltip components uniformly. You can also retrieve the properties of the default TooltipTheme through this component.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TooltipTheme", + "desc": [ + "You can specify the TooltipThemeData properties to set default styles for descendant Tooltip components, such as decoration, text style, display duration, margins, etc. You can also use TooltipTheme.of to get the theme properties of Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json new file mode 100644 index 00000000..f9f3e91d --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema de Tooltip", + "info": "Principalmente se utiliza para establecer propiedades predeterminadas unificadas para los componentes Tooltip descendientes. También se pueden obtener las propiedades predeterminadas de TooltipTheme a través de este componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TooltipTheme", + "desc": [ + "Se pueden especificar las propiedades de TooltipThemeData para establecer estilos predeterminados para los componentes Tooltip descendientes, como decoración, estilo de texto, duración de visualización, márgenes, etc. También se puede usar TooltipTheme.of para obtener las propiedades del tema de Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json new file mode 100644 index 00000000..c8fc68cf --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Thème d'infobulle", + "info": "Principalement utilisé pour définir les propriétés par défaut des composants Tooltip pour les descendants. Il est également possible d'obtenir les propriétés du TooltipTheme par défaut via ce composant.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TooltipTheme", + "desc": [ + "Vous pouvez spécifier les propriétés de TooltipThemeData pour définir le style par défaut des composants Tooltip pour les descendants, comme la décoration, le style du texte, la durée d'affichage, les marges, etc. Vous pouvez également utiliser TooltipTheme.of pour obtenir les propriétés du thème Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json new file mode 100644 index 00000000..6689bbad --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema del Tooltip", + "info": "Utilizzato principalmente per impostare le proprietà predefinite per i componenti Tooltip discendenti. È anche possibile ottenere le proprietà del TooltipTheme predefinito tramite questo componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TooltipTheme", + "desc": [ + "È possibile specificare le proprietà dei dati di TooltipThemeData per impostare lo stile predefinito per i componenti Tooltip discendenti, come decorazioni, stili di testo, durata di visualizzazione, margini, ecc. È anche possibile utilizzare TooltipTheme.of per ottenere le proprietà del tema del Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json new file mode 100644 index 00000000..a4b3839f --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "ツールチップテーマ", + "info": "主に、子孫のTooltipコンポーネントにデフォルトのプロパティを統一して設定するために使用されます。また、このコンポーネントを通じてデフォルトのTooltipThemeのプロパティを取得することもできます。", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipThemeの基本使用", + "desc": [ + "TooltipThemeDataデータプロパティを指定して、【子孫】のTooltipコンポーネントにデフォルトのスタイルを設定できます。例えば、装飾、テキストスタイル、表示時間、余白など。また、TooltipTheme.ofを使用してTooltipのテーマプロパティを取得することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json new file mode 100644 index 00000000..bb80ad7c --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "툴팁 테마", + "info": "주로 후손의 Tooltip 컴포넌트에 기본 속성을 통일적으로 설정하기 위해 사용되며, 이 컴포넌트를 통해 기본 TooltipTheme의 속성을 가져올 수도 있습니다.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TooltipTheme 기본 사용", + "desc": [ + "TooltipThemeData 데이터 속성을 지정하여 【후손】의 Tooltip 컴포넌트에 기본 스타일을 설정할 수 있습니다. 예를 들어, 장식, 텍스트 스타일, 표시 시간, 여백 등이 있습니다. 또한 TooltipTheme.of를 사용하여 Tooltip의 테마 속성을 가져올 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json new file mode 100644 index 00000000..e5fceabe --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Tema de Dica", + "info": "Principalmente utilizado para definir propriedades padrão unificadas para componentes Tooltip descendentes, também é possível obter as propriedades do TooltipTheme padrão através deste componente.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TooltipTheme", + "desc": [ + "Pode especificar as propriedades de dados do TooltipThemeData para definir o estilo padrão para componentes Tooltip descendentes, como decoração, estilo de texto, duração de exibição, margens, etc. Também é possível usar TooltipTheme.of para obter as propriedades temáticas do Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json new file mode 100644 index 00000000..af7aa3ff --- /dev/null +++ b/modules/widget_system/widgets/lib/ProxyWidget/TooltipTheme/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 333, + "name": "TooltipTheme", + "localName": "Тема подсказки", + "info": "В основном используется для установки стандартных свойств для компонентов Tooltip потомков, также можно получить свойства стандартного TooltipTheme через этот компонент.", + "lever": 2, + "family": 5, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TooltipTheme", + "desc": [ + "Можно указать свойства данных TooltipThemeData для установки стандартного стиля для компонентов Tooltip потомков, таких как декор, стиль текста, продолжительность отображения, отступы и т.д. Также можно использовать TooltipTheme.of для получения тематических свойств Tooltip." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json new file mode 100644 index 00000000..6f468c5b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Klicks absorbieren", + "info": "Enthält ein Kind-Widget und kann durch das Festlegen des Attributs ignoring entscheiden, ob das Kind Gestenereignisse ignoriert, während es selbst Ereignisse akzeptiert.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AbsorbPointer", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【absorbing】 : Ob Ereignisse absorbiert werden 【bool】", + "Wie unten gezeigt, wenn der Switch ausgewählt ist, ist absorbing true, und die Schaltflächenereignisse werden absorbiert und können nicht geklickt werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json new file mode 100644 index 00000000..d8d6217b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorb Click", + "info": "Contains a child component, and it can decide whether the child ignores gesture events by specifying the ignoring attribute, while it itself accepts events.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AbsorbPointer", + "desc": [ + "【child】: Child component 【Widget】", + "【absorbing】: Whether to absorb events 【bool】", + "As shown below, when the Switch is selected, absorbing is true, and the button event will be absorbed and cannot be clicked." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json new file mode 100644 index 00000000..69fbccce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorber Clics", + "info": "Contiene un componente hijo y puede decidir si el hijo ignora los eventos de gestos especificando la propiedad ignoring, mientras que él mismo acepta los eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AbsorbPointer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【absorbing】 : Si absorbe eventos 【bool】", + "Como se muestra a continuación, cuando el Switch está seleccionado, absorbing es true y los eventos del botón serán absorbidos, no se podrá hacer clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json new file mode 100644 index 00000000..f4e3f32e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorber les clics", + "info": "Contient un composant enfant et peut décider si l'enfant ignore les événements gestuels en spécifiant la propriété ignoring, tout en acceptant les événements lui-même.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AbsorbPointer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【absorbing】 : Si les événements sont absorbés 【bool】", + "Comme ci-dessous, lorsque le Switch est sélectionné, absorbing est true, les événements du bouton seront absorbés et ne pourront pas être cliqués." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json new file mode 100644 index 00000000..3bd4e2e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Assorbi Clic", + "info": "Contiene un componente figlio, è possibile decidere se il figlio ignora gli eventi del gesto specificando l'attributo ignoring, mentre esso stesso accetta gli eventi.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AbsorbPointer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【absorbing】 : Se assorbire gli eventi 【bool】", + "Come mostrato di seguito, quando Switch è selezionato, absorbing è true, gli eventi del pulsante verranno assorbiti e non sarà possibile fare clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json new file mode 100644 index 00000000..87d7845d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "クリックを吸収", + "info": "子コンポーネントを含み、ignoring属性を指定することで、子がジェスチャーイベントを無視するかどうかを決定し、それ自体がイベントを受け取ります。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【absorbing】 : イベントを吸収するかどうか 【bool】", + "以下の例では、Switchが選択されている場合、absorbingがtrueになり、ボタンのイベントが吸収され、クリックできなくなります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json new file mode 100644 index 00000000..5c8c5577 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "클릭 흡수", + "info": "자식 위젯을 포함하며, ignoring 속성을 지정하여 자식이 제스처 이벤트를 무시할지 여부를 결정할 수 있습니다. 그 자체는 이벤트를 받습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AbsorbPointer 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【absorbing】 : 이벤트를 흡수할지 여부 【bool】", + "아래와 같이, Switch가 선택되면 absorbing이 true가 되어 버튼 이벤트가 흡수되어 클릭할 수 없게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json new file mode 100644 index 00000000..8a4c7c7d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Absorver Clique", + "info": "Contém um componente filho e pode decidir se o filho ignora eventos de gestos especificando o atributo ignoring, enquanto ele próprio aceita eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AbsorbPointer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【absorbing】 : Se absorve eventos 【bool】", + "Como mostrado abaixo, quando o Switch está selecionado, absorbing é true e o evento do botão será absorvido, não podendo ser clicado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json new file mode 100644 index 00000000..c5552f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AbsorbPointer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 295, + "name": "AbsorbPointer", + "localName": "Поглощение кликов", + "info": "Содержит дочерний компонент, который может игнорировать жестовые события в зависимости от указанного свойства ignoring, при этом сам компонент принимает события.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 149, + 150, + 292 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AbsorbPointer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【absorbing】 : Поглощать ли события 【bool】", + "Как показано ниже, когда Switch выбран, absorbing равно true, и событие кнопки будет поглощено, и нажатие будет невозможно." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json new file mode 100644 index 00000000..2fe4515f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Ausrichtungskomponente", + "info": "Kann ein Unterelement aufnehmen und kann das Unterelement durch Ausrichtung an jeder angegebenen Position der Breite und Höhe des übergeordneten Elements positionieren.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Align", + "desc": [ + "【child】: Unterelement 【Widget】", + "【alignment】: Ausrichtung 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Andere Verwendungen von Align", + "desc": [ + "Da das Alignment-Objekt eine Position im Verhältnis zur Breite und Höhe des übergeordneten Containers angeben kann", + "kann Align verwendet werden, um komplexe Layoutanforderungen zu erfüllen, z.B. die Position nach einer bestimmten mathematischen Gleichung zu ändern" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json new file mode 100644 index 00000000..713413e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Align Component", + "info": "Can accommodate a child component, and the child component can be positioned at any specified fraction of the parent component's width and height through alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Align", + "desc": [ + "【child】 : Child component 【Widget】", + "【alignment】 : Alignment method 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Other Usages of Align", + "desc": [ + "Since the Alignment object can specify the fractional position of the width and height in the parent container", + "Align can be used to achieve some complex layout requirements, such as changing positions according to specified mathematical equations" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json new file mode 100644 index 00000000..ca2eee77 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente de Alineación", + "info": "Puede contener un componente hijo, y se puede posicionar en cualquier fracción específica del ancho y alto del componente padre a través de alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Align", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【alignment】: Método de alineación 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Otros usos de Align", + "desc": [ + "Dado que el objeto Alignment puede especificar la posición de la fracción del ancho y alto en el contenedor padre", + "Se puede usar Align para implementar algunas necesidades de disposición complejas, como cambiar la posición según ecuaciones matemáticas específicas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json new file mode 100644 index 00000000..0afdeb17 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Composant d'alignement", + "info": "Peut contenir un composant enfant, et permet de positionner le composant enfant à n'importe quelle fraction spécifiée de la largeur et de la hauteur du composant parent via l'alignement.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Align", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【alignment】 : Méthode d'alignement 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Autres utilisations d'Align", + "desc": [ + "Puisque l'objet Alignment peut spécifier une position fractionnaire dans la largeur et la hauteur du conteneur parent", + "Align peut être utilisé pour répondre à des besoins de mise en page complexes, tels que des changements de position selon des équations mathématiques spécifiées" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json new file mode 100644 index 00000000..c9dec642 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente Allineamento", + "info": "Può contenere un componente figlio, e può posizionare il componente figlio in qualsiasi frazione specificata della larghezza e altezza del componente genitore tramite l'allineamento.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Align", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Altri usi di Align", + "desc": [ + "Poiché l'oggetto Alignment può specificare la posizione della frazione di larghezza e altezza nel contenitore genitore", + "è possibile utilizzare Align per soddisfare alcune esigenze di layout complesse, come cambiare posizione secondo equazioni matematiche specificate" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json new file mode 100644 index 00000000..1a06a336 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "整列コンポーネント", + "info": "1つの子コンポーネントを収容でき、alignmentを使用して子コンポーネントを親コンポーネントの幅と高さの任意の指定された比率に配置できます。", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alignの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【alignment】 : 整列方法 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Alignのその他の使用法", + "desc": [ + "Alignmentオブジェクトは、親コンテナ内の幅と高さの比率位置を指定できるため", + "Alignを使用して、指定された数学的方程式に従って位置を変化させるなど、複雑なレイアウト要件を実現できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json new file mode 100644 index 00000000..d7c244cb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "정렬 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, alignment를 통해 자식 컴포넌트를 부모 컴포넌트의 너비와 높이의 지정된 비율 위치에 배치할 수 있습니다.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Align 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Align 기타 사용법", + "desc": [ + "Alignment 객체는 부모 컨테이너에서 너비와 높이의 비율 위치를 지정할 수 있으므로", + "Align을 사용하여 복잡한 배치 요구 사항을 구현할 수 있습니다. 예를 들어 지정된 수학 방정식에 따라 위치를 변경하는 것과 같은 요구 사항을 구현할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json new file mode 100644 index 00000000..c3da9f49 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Componente de Alinhamento", + "info": "Pode conter um componente filho, e pode posicionar o componente filho em qualquer fração especificada da largura e altura do componente pai através do alinhamento.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Align", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Outros Usos do Align", + "desc": [ + "Como o objeto Alignment pode especificar a posição da fração de largura e altura no contêiner pai", + "Pode-se usar o Align para implementar algumas necessidades complexas de layout, como mudar a posição de acordo com uma equação matemática especificada" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json new file mode 100644 index 00000000..af7806c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Align/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 85, + "name": "Align", + "localName": "Компонент выравнивания", + "info": "Может содержать один дочерний компонент, который можно расположить в любом указанном месте ширины и высоты родительского компонента с помощью alignment.", + "lever": 5, + "family": 2, + "linkIds": [ + 1, + 86, + 111, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Align", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + }, + { + "file": "node2_other.dart", + "name": "Другие способы использования Align", + "desc": [ + "Поскольку объект Alignment может указывать положение в долях ширины и высоты родительского контейнера", + "Можно использовать Align для реализации сложных требований к расположению, например, для изменения положения по указанному математическому уравнению" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json new file mode 100644 index 00000000..cef55e3b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Größenanimation", + "info": "Wenn sich die Größe der Unterkomponente ändert, erfolgt eine animierte Überblendung. Attribute wie Dauer, Ausrichtung, Kurve, vsync usw. können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedSize", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【curve】 : Animationskurve 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json new file mode 100644 index 00000000..8c6d66b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Size Animation", + "info": "When the size of the child component changes, it animates gradually. You can specify properties such as duration, alignment, curve, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedSize", + "desc": [ + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【alignment】 : Alignment 【AlignmentGeometry】", + "【curve】 : Animation curve 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json new file mode 100644 index 00000000..0bd59a18 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animación de Tamaño", + "info": "Cuando el tamaño del componente hijo cambia, se realiza una transición animada. Se pueden especificar propiedades como la duración, la alineación, la curva, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de AnimatedSize", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【curve】 : Curva de la animación 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json new file mode 100644 index 00000000..5acea2c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animation de taille", + "info": "Lorsque la taille du composant enfant change, une transition animée est effectuée. Vous pouvez spécifier des propriétés telles que la durée, l'alignement, la courbe, vsync, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedSize", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【curve】 : Courbe de l'animation 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json new file mode 100644 index 00000000..59207c7e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animazione delle dimensioni", + "info": "Quando le dimensioni del componente figlio cambiano, viene eseguita una transizione animata. È possibile specificare proprietà come durata, allineamento, curva, vsync, ecc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedSize", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【curve】 : Curva dell'animazione 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json new file mode 100644 index 00000000..f427d6d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "サイズアニメーション", + "info": "子コンポーネントのサイズが変化する際に、アニメーションで滑らかに変化させます。持続時間、整列方法、曲線、vsyncなどの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSizeの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの持続時間 【Duration】", + "【alignment】 : 整列方法 【AlignmentGeometry】", + "【curve】 : アニメーション曲線 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json new file mode 100644 index 00000000..2060ce8c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "크기 애니메이션", + "info": "자식 컴포넌트의 크기가 변경될 때 애니메이션을 통해 점진적으로 변화시킵니다. 지속 시간, 정렬 방식, 곡선, vsync 등의 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSize 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json new file mode 100644 index 00000000..b6bb9f9f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Animação de Tamanho", + "info": "Quando o tamanho do componente filho muda, ocorre uma transição animada, podendo especificar duração, alinhamento, curva, vsync, entre outros atributos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedSize", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【curve】 : Curva da animação 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json new file mode 100644 index 00000000..465dd96f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnimatedSize/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 201, + "name": "AnimatedSize", + "localName": "Анимация размера", + "info": "Когда размер дочернего компонента изменяется, происходит плавная анимация. Можно указать такие свойства, как продолжительность, способ выравнивания, кривая, vsync и другие.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedSize", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【curve】 : Кривая анимации 【Duration】", + "【vsync】 : vsync 【TickerProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json new file mode 100644 index 00000000..8b062ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Annotierter Bereich", + "info": "Es gibt einen generischen Typ, der im Quellcode nur in app_bar und nav_bar verwendet wird, um den Zustand und das Styling der Navigationsleiste zu ändern. Der generische Typ ist normalerweise SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion ändert Zustand und Stil", + "desc": [ + "【value】 : Wert 【T】", + "【sized】 : Gibt die Größe an 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json new file mode 100644 index 00000000..f99c679a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Annotation Area", + "info": "There is a generic type, which is only used in app_bar and nav_bar in the source code to change the state variables and navigation bar styles. The generic type is usually SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion Changes State Variables and Styles", + "desc": [ + "【value】 : value 【T】", + "【sized】 : whether to provide size 【bool】", + "【child】 : child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json new file mode 100644 index 00000000..459a57c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Región Anotada", + "info": "Tiene un genérico, en el código fuente solo se usa este componente en app_bar, nav_bar para cambiar el estado y el estilo de la barra de navegación, el genérico suele ser SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion cambia el estilo del estado", + "desc": [ + "【value】 : valor 【T】", + "【sized】 : si proporciona tamaño 【bool】", + "【child】 : componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json new file mode 100644 index 00000000..0f73321e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Région annotée", + "info": "Il y a un générique, dans le code source, il est uniquement utilisé dans app_bar, nav_bar pour modifier les variables d'état et le style de la barre de navigation, le générique est généralement SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion modifie le style des variables d'état", + "desc": [ + "【value】 : valeur 【T】", + "【sized】 : fournit-il une taille 【bool】", + "【child】 : composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json new file mode 100644 index 00000000..05a27dc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Area Annotata", + "info": "Ha un generico, nel codice sorgente viene utilizzato solo in app_bar, nav_bar per modificare lo stato e lo stile della barra di navigazione, il generico è solitamente SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion cambia lo stile dello stato", + "desc": [ + "【value】 : valore 【T】", + "【sized】 : se fornisce dimensione 【bool】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json new file mode 100644 index 00000000..4c1e0e95 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "注釈領域", + "info": "ジェネリックがあり、ソースコードでは app_bar と nav_bar でのみ使用され、状態量やナビゲーションバーのスタイルを変更するために使用されます。ジェネリックは通常 SystemUiOverlayStyle です。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegionが状態量のスタイルを変更", + "desc": [ + "【value】 : 値 【T】", + "【sized】 : サイズを提供するかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json new file mode 100644 index 00000000..fc2a0df6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "주석 영역", + "info": "제네릭이 있으며, 소스 코드에서는 app_bar, nav_bar에서만 이 컴포넌트를 사용하여 상태 변수와 네비게이션 바 스타일을 변경합니다. 제네릭은 일반적으로 SystemUiOverlayStyle입니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion 상태 변수 스타일 변경", + "desc": [ + "【value】 : 값 【T】", + "【sized】 : 크기 제공 여부 【bool】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json new file mode 100644 index 00000000..91c03b45 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Região Anotada", + "info": "Tem um genérico, no código-fonte, este componente é usado apenas em app_bar e nav_bar para alterar variáveis de estado e o estilo da barra de navegação, o genérico geralmente é SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion altera o estilo da variável de estado", + "desc": [ + "【value】 : valor 【T】", + "【sized】 : se fornece tamanho 【bool】", + "【child】 : componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json new file mode 100644 index 00000000..8a65397d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AnnotatedRegion/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 288, + "name": "AnnotatedRegion", + "localName": "Область аннотации", + "info": "Имеет обобщение, в исходном коде используется только в app_bar, nav_bar для изменения состояния и стиля навигационной панели, обобщение обычно SystemUiOverlayStyle.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnnotatedRegion изменяет состояние и стиль", + "desc": [ + "【value】 : значение 【T】", + "【sized】 : предоставляет ли размер 【bool】", + "【child】 : дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json new file mode 100644 index 00000000..5c92c3eb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Proportion Box", + "info": "Kann ein Kindelement aufnehmen und durch die Angabe des Seitenverhältnisses aspectRatio den Bereich für das Kindelement begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AspectRatio", + "desc": [ + "【child】: Kindelement 【Widget】", + "【aspectRatio】: Seitenverhältnis 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json new file mode 100644 index 00000000..b70c7005 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Aspect Ratio Box", + "info": "Can contain a child component, and limit the area of the child component by specifying the aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AspectRatio", + "desc": [ + "【child】: Child component 【Widget】", + "【aspectRatio】: Aspect ratio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json new file mode 100644 index 00000000..9965faeb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Caja de proporción", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando la relación de aspecto aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AspectRatio", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【aspectRatio】 : Relación de aspecto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json new file mode 100644 index 00000000..77b231b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Boîte de proportion", + "info": "Peut contenir un composant enfant, en spécifiant le rapport largeur/hauteur aspectRatio pour limiter la zone d'accueil du composant enfant.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AspectRatio", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【aspectRatio】 : Rapport largeur/hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json new file mode 100644 index 00000000..720e84a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Scatola delle proporzioni", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando il rapporto larghezza-altezza aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AspectRatio", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【aspectRatio】 : Rapporto larghezza-altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json new file mode 100644 index 00000000..489aa460 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "アスペクト比ボックス", + "info": "一つの子コンポーネントを収容し、aspectRatioを指定して子コンポーネントの収容領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatioの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【aspectRatio】 : アスペクト比 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json new file mode 100644 index 00000000..edbafc88 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "비율 상자", + "info": "하위 컴포넌트를 포함할 수 있으며, aspectRatio를 지정하여 하위 컴포넌트의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AspectRatio 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【aspectRatio】 : 너비 높이 비율 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json new file mode 100644 index 00000000..510b1676 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Caixa de Proporção", + "info": "Pode conter um componente filho, limitando a área do componente filho ao especificar a proporção de aspecto aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AspectRatio", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【aspectRatio】 : Proporção de largura e altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json new file mode 100644 index 00000000..17a1611f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/AspectRatio/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 77, + "name": "AspectRatio", + "localName": "Пропорциональная коробка", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента, задавая соотношение сторон aspectRatio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AspectRatio", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【aspectRatio】 : Соотношение сторон 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json new file mode 100644 index 00000000..c9c76df7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Hintergrundfilter", + "info": "Kann ein Kind aufnehmen und den Hintergrund mit einem Unschärfefilter versehen. Durch Stack kann der Hintergrund unscharf gemacht werden, um den Unschärfeeffekt der Komponente zu erreichen.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BackdropFilter", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【filter】 : Filter 【ImageFilter】", + "ImageFilter.blur kann eine Gaußsche Unschärfe erzeugen, indem die x- und y-Unschärfefaktoren angegeben werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json new file mode 100644 index 00000000..1f60983e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Background Filter", + "info": "Can hold a child and apply a blur filter to the background. The background blur effect of the component can be achieved through Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BackdropFilter", + "desc": [ + "【child】: Child component 【Widget】", + "【filter】: Filter 【ImageFilter】", + "ImageFilter.blur can achieve Gaussian blur by specifying the x and y blur factors." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json new file mode 100644 index 00000000..742f80d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro de fondo", + "info": "Puede contener un hijo y aplicar un filtro de desenfoque al fondo. El efecto de desenfoque en los componentes se puede lograr utilizando Stack para desenfocar el fondo.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BackdropFilter", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur puede implementar un desenfoque gaussiano, especificando los factores de desenfoque x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json new file mode 100644 index 00000000..bf45ee80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtre d'arrière-plan", + "info": "Peut contenir un enfant et appliquer un filtre de flou à l'arrière-plan. Le flou de l'arrière-plan peut être réalisé via Stack pour obtenir l'effet de flou du composant.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BackdropFilter", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【filter】 : Filtre 【ImageFilter】", + "ImageFilter.blur peut réaliser un flou gaussien en spécifiant les facteurs de flou x et y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json new file mode 100644 index 00000000..6ec0f087 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro Sfondo", + "info": "Può contenere un figlio e applica un filtro di sfocatura allo sfondo. È possibile ottenere l'effetto di sfocatura del componente utilizzando Stack per sfocare lo sfondo.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BackdropFilter", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur può realizzare una sfocatura gaussiana, specificando i fattori di sfocatura x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json new file mode 100644 index 00000000..6e54a9ae --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "背景フィルター", + "info": "子を1つ収容し、背景にぼかしフィルターを適用します。Stackを使用して背景をぼかすことで、コンポーネントのぼかし効果を実現できます。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilterの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【filter】 : フィルター 【ImageFilter】", + "ImageFilter.blurはガウスぼかしを実現し、x、yのぼかし係数を指定できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json new file mode 100644 index 00000000..30eb7655 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "배경 필터", + "info": "하나의 자식을 포함할 수 있고, 배경에 흐림 필터를 적용합니다. Stack을 통해 배경 흐림 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackdropFilter 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【filter】 : 필터 【ImageFilter】", + "ImageFilter.blur를 통해 가우시안 흐림 효과를 구현할 수 있으며, x, y 흐림 인자를 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json new file mode 100644 index 00000000..6599ff51 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Filtro de Fundo", + "info": "Pode conter uma criança e aplicar um filtro de desfoque ao fundo. O efeito de desfoque do componente pode ser alcançado através do Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BackdropFilter", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【filter】 : Filtro 【ImageFilter】", + "ImageFilter.blur pode realizar um desfoque gaussiano, especificando os fatores de desfoque x e y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json new file mode 100644 index 00000000..e0840323 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/BackdropFilter/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 278, + "name": "BackdropFilter", + "localName": "Фоновый фильтр", + "info": "Может содержать один дочерний элемент и применять размытие к фону. Эффект размытия компонента можно реализовать с помощью Stack.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 97, + 67 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BackdropFilter", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【filter】 : Фильтр 【ImageFilter】", + "ImageFilter.blur может реализовать гауссово размытие, задавая коэффициенты размытия по x и y." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json new file mode 100644 index 00000000..974fe193 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Baseline-Komponente", + "info": "Kann ein Unterelement aufnehmen und die Position des Unterelements durch die Kontrolle der Baseline-Höhe steuern. Wird normalerweise für Textkomponenten verwendet.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Baseline", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【baseline】 : Baseline-Position 【double】", + "【baselineType】 : Baseline-Typ 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json new file mode 100644 index 00000000..f347bd8f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Baseline Component", + "info": "Can contain a child component, and control the position of the child component by adjusting the baseline height. Generally used for text components.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Baseline", + "desc": [ + "【child】 : Child component 【Widget】", + "【baseline】 : Baseline position 【double】", + "【baselineType】 : Baseline type 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json new file mode 100644 index 00000000..9bf361d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente de línea base", + "info": "Puede contener un componente hijo, controlando la posición del componente hijo mediante la altura de la línea base. Generalmente se utiliza para componentes de texto.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Baseline", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【baseline】 : Posición de la línea base 【double】", + "【baselineType】 : Tipo de línea base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json new file mode 100644 index 00000000..d6b66c03 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Composant de base", + "info": "Peut contenir un composant enfant, en contrôlant la hauteur de la ligne de base pour positionner le composant enfant. Généralement utilisé pour les composants de texte.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Baseline", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【baseline】 : Position de la ligne de base 【double】", + "【baselineType】 : Type de ligne de base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json new file mode 100644 index 00000000..10f820e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente di base", + "info": "Può contenere un componente figlio, controllando la posizione del componente figlio attraverso il controllo dell'altezza della linea di base. Generalmente utilizzato per i componenti di testo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Baseline", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【baseline】 : Posizione della linea di base 【double】", + "【baselineType】 : Tipo di linea di base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json new file mode 100644 index 00000000..9f1296d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "ベースラインコンポーネント", + "info": "1つの子コンポーネントを収容し、ベースラインの高さを制御して子コンポーネントの位置を制御します。一般的にテキストコンポーネントに使用されます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baselineの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【baseline】 : ベースライン位置 【double】", + "【baselineType】 : ベースラインタイプ 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json new file mode 100644 index 00000000..e55ad0e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "기준선 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 기준선 높이를 조절하여 자식 컴포넌트의 위치를 제어합니다. 일반적으로 텍스트 컴포넌트에 사용됩니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Baseline 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【baseline】 : 기준선 위치 【double】", + "【baselineType】 : 기준선 유형 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json new file mode 100644 index 00000000..b89e2c88 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Componente de Linha de Base", + "info": "Pode acomodar um componente filho, controlando a posição do componente filho através da altura da linha de base. Geralmente usado para componentes de texto.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Baseline", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【baseline】 : Posição da linha de base 【double】", + "【baselineType】 : Tipo de linha de base 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json new file mode 100644 index 00000000..a1b8ed3f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Baseline/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 75, + "name": "Baseline", + "localName": "Базовый компонент", + "info": "Может содержать один дочерний компонент, контролируя положение дочернего компонента через управление высотой базовой линии. Обычно используется для текстовых компонентов.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Baseline", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【baseline】 : Позиция базовой линии 【double】", + "【baselineType】 : Тип базовой линии 【TextBaseline】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json new file mode 100644 index 00000000..b87f8589 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Tastenkombinationen-Rückruf", + "info": "Kombinationen können als Tastenkombinationen festgelegt werden, die nach dem Erhalt des Fokus auf Tastenkombinationsereignisse reagieren.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von Tastenkombinationen", + "desc": [ + "Nach der Aktivierung des Fokus im Beispiel können die Kombinationen Strg+↑ und Strg+↓ die Zahl erhöhen oder verringern", + "【enabled】 : Ob verfügbar 【bool】", + "【onTapOutside】 : Außenklick-Listener 【TapRegionCallback?】", + "【onTapInside】 : Innenklick-Listener 【TapRegionCallback?】", + "【groupId】 : Kennung der Klickbereichsgruppe 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json new file mode 100644 index 00000000..4b0b9a70 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Shortcut Callback", + "info": "You can set combinations as shortcuts, and after gaining focus, respond to shortcut events.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Shortcut Usage", + "desc": [ + "After activating focus in the example, the Ctrl+↑ and Ctrl+↓ key combinations can increase or decrease the number", + "【enabled】: Whether it is available 【bool】", + "【onTapOutside】: Click outside listener 【TapRegionCallback?】", + "【onTapInside】: Click inside listener 【TapRegionCallback?】", + "【groupId】: Click area group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json new file mode 100644 index 00000000..1d33d303 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Accesos directos de devolución de llamada", + "info": "Se pueden configurar combinaciones como accesos directos, que responderán a eventos de teclas rápidas después de obtener el foco.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de accesos directos", + "desc": [ + "En el caso, después de activar el foco, las combinaciones de teclas Ctrl+↑ y Ctrl+↓ pueden aumentar o disminuir el número", + "【enabled】: Si está disponible 【bool】", + "【onTapOutside】: Escucha de clic fuera 【TapRegionCallback?】", + "【onTapInside】: Escucha de clic dentro 【TapRegionCallback?】", + "【groupId】: Identificador del grupo de área de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json new file mode 100644 index 00000000..b248d152 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Raccourcis de rappel", + "info": "Vous pouvez définir des combinaisons comme raccourcis clavier, qui répondront aux événements de raccourci après avoir obtenu le focus.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation des raccourcis", + "desc": [ + "Dans l'exemple, après activation du focus, les combinaisons Ctrl+↑ et Ctrl+↓ peuvent augmenter ou diminuer le nombre", + "【enabled】 : Disponible 【bool】", + "【onTapOutside】 : Écouteur de clic extérieur 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic intérieur 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json new file mode 100644 index 00000000..18986c20 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Scorciatoie di callback", + "info": "È possibile impostare combinazioni come scorciatoie da tastiera, che rispondono agli eventi delle scorciatoie dopo aver ottenuto il focus.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso delle scorciatoie", + "desc": [ + "Nel caso attivato, le combinazioni Ctrl+↑ e Ctrl+↓ possono aumentare o diminuire il numero", + "【enabled】 : Disponibile 【bool】", + "【onTapOutside】 : Ascolto del clic esterno 【TapRegionCallback?】", + "【onTapInside】 : Ascolto del clic interno 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo di area di clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json new file mode 100644 index 00000000..7af909d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "ショートカットコールバック", + "info": "組み合わせをショートカットとして設定し、フォーカスを取得した後にショートカットイベントに応答できます。", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "ショートカットの使用", + "desc": [ + "ケースでフォーカスをアクティブにした後、Ctrl+↑ と Ctrl+↓ の組み合わせキーで数字を増減できます", + "【enabled】 : 使用可能かどうか 【bool】", + "【onTapOutside】 : 外部クリックリスナー 【TapRegionCallback?】", + "【onTapInside】 : 内部クリックリスナー 【TapRegionCallback?】", + "【groupId】 : クリック領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json new file mode 100644 index 00000000..1eb94cfc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "단축키 콜백", + "info": "조합을 단축키로 설정할 수 있으며, 포커스를 얻은 후 단축키 이벤트에 응답합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "단축키 사용", + "desc": [ + "예제에서 포커스를 활성화한 후, Ctrl+↑ 및 Ctrl+↓ 조합키로 숫자를 증가 또는 감소시킬 수 있습니다.", + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 클릭 리스너 【TapRegionCallback?】", + "【onTapInside】 : 내부 클릭 리스너 【TapRegionCallback?】", + "【groupId】 : 클릭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json new file mode 100644 index 00000000..b9117fb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Atalhos de Teclado", + "info": "Pode definir combinações como atalhos de teclado, que respondem a eventos de atalhos após obter o foco.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de Atalhos", + "desc": [ + "No exemplo, após ativar o foco, as combinações de teclas Ctrl+↑ e Ctrl+↓ podem aumentar ou diminuir o número", + "【enabled】 : Disponível 【bool】", + "【onTapOutside】 : Ouvinte de clique externo 【TapRegionCallback?】", + "【onTapInside】 : Ouvinte de clique interno 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo de área de clique 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json new file mode 100644 index 00000000..124c280f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CallbackShortcuts/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 283, + "name": "CallbackShortcuts", + "localName": "Горячие клавиши обратного вызова", + "info": "Можно настроить комбинации как горячие клавиши, которые будут реагировать на события горячих клавиш после получения фокуса.", + "lever": 3, + "family": 2, + "linkIds": [ + 282, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование горячих клавиш", + "desc": [ + "В примере после активации фокуса комбинации клавиш Ctrl+↑ и Ctrl+↓ могут увеличивать или уменьшать число", + "【enabled】 : Доступно ли 【bool】", + "【onTapOutside】 : Прослушивание клика снаружи 【TapRegionCallback?】", + "【onTapInside】 : Прослушивание клика внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области клика 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json new file mode 100644 index 00000000..9380e9a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Zentrierungskomponente", + "info": "Kann ein Unterelement aufnehmen und es im übergeordneten Element zentrieren. Es ist eine vereinfachte Version der Align-Komponente.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Center", + "desc": [ + "【child】 : Unterelement 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json new file mode 100644 index 00000000..c69385b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Center Component", + "info": "Can contain a child component and center it within the parent component, serving as a simplified mode of the Align component.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Center", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json new file mode 100644 index 00000000..88bed554 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centrado", + "info": "Puede contener un componente hijo y centrarlo en el componente padre, es un modo simplificado del componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Center", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json new file mode 100644 index 00000000..89548fc7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Composant centré", + "info": "Peut contenir un composant enfant et le centrer dans le composant parent, c'est une version simplifiée du composant Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Center", + "desc": [ + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json new file mode 100644 index 00000000..c09ac191 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centrato", + "info": "Può contenere un componente figlio e centrarlo rispetto al componente genitore, è una versione semplificata del componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Center", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json new file mode 100644 index 00000000..aa9c2c65 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "中央コンポーネント", + "info": "一つの子コンポーネントを収容し、それを親コンポーネントの中央に配置します。Alignコンポーネントの簡易版です。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Centerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json new file mode 100644 index 00000000..0f48acb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "중앙 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용하고 부모 컴포넌트의 중앙에 위치시킬 수 있습니다. Align 컴포넌트의 간소화된 모드입니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Center 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json new file mode 100644 index 00000000..7c4a44ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Componente Centralizado", + "info": "Pode conter um componente filho e centralizá-lo no componente pai, sendo uma versão simplificada do componente Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Center", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json new file mode 100644 index 00000000..c9df7850 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Center/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 86, + "name": "Center", + "localName": "Центрирующий компонент", + "info": "Может содержать один дочерний компонент и центрировать его внутри родительского компонента. Это упрощенная версия компонента Align.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Center", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json new file mode 100644 index 00000000..904c5f80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Ovale Zuschneidung", + "info": "Kann ein Unterelement aufnehmen und es entlang der Haupt- und Nebenachse der Breite und Höhe elliptisch zuschneiden.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipOval", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json new file mode 100644 index 00000000..dc93ef5e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Oval Clipping", + "info": "Can contain a child component and clip it into an ellipse with the width and height as the major and minor axes.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipOval", + "desc": [ + "【child】: Child component 【Widget】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json new file mode 100644 index 00000000..4904d945 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Recorte Ovalado", + "info": "Puede contener un componente hijo y lo recorta en forma de elipse utilizando el ancho y la altura como ejes mayor y menor.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipOval", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json new file mode 100644 index 00000000..6d4bf5a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Découpe ovale", + "info": "Peut contenir un composant enfant et le découper en forme ovale avec la largeur et la hauteur comme axes majeur et mineur.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipOval", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpe 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json new file mode 100644 index 00000000..22398369 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Ritaglio ovale", + "info": "Può contenere un componente figlio e lo ritaglia in un'ellisse con larghezza e altezza come assi maggiore e minore.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ClipOval", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json new file mode 100644 index 00000000..bf02d466 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "楕円クリップ", + "info": "1つの子コンポーネントを収容し、幅と高さを長軸と短軸として楕円形にクリップします。", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOvalの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json new file mode 100644 index 00000000..5d5c72fe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "타원 자르기", + "info": "하위 컴포넌트를 포함할 수 있으며, 너비와 높이를 장축과 단축으로 하여 타원형으로 자릅니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipOval 기본 사용법", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【clipBehavior】 : 자르기 동작 【Clip】", + "【clipper】 : 자르기 도구 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json new file mode 100644 index 00000000..b0cee887 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Recorte Oval", + "info": "Pode conter um componente filho e cortá-lo em forma de elipse com os eixos maior e menor como largura e altura.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipOval", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【clipper】 : Cortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json new file mode 100644 index 00000000..237cf0e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipOval/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 66, + "name": "ClipOval", + "localName": "Эллиптическое обрезание", + "info": "Может содержать один дочерний компонент и обрезать его по эллипсу с большой и малой осями, равными ширине и высоте.", + "lever": 3, + "family": 2, + "linkIds": [ + 67, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipOval", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезания 【Clip】", + "【clipper】 : Обрезатель 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json new file mode 100644 index 00000000..7f30af8b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Pfadausschnitt", + "info": "Kann ein Kindelement aufnehmen und es entlang eines angegebenen Pfads zuschneiden. Ermöglicht die Anpassung der Pfadform und ist ein sehr flexibles Zuschneidelement.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipPath", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json new file mode 100644 index 00000000..658b062d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Path Clipping", + "info": "Can contain a child component and clip it according to the specified path. The path shape can be customized, making it a very flexible clipping component.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipPath", + "desc": [ + "【child】 : Child component 【Widget】", + "【clipBehavior】 : Clipping behavior 【Clip】", + "【clipper】 : Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json new file mode 100644 index 00000000..81ad23f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Recorte de ruta", + "info": "Puede contener un componente hijo y recortarlo según la ruta especificada. Se puede personalizar la forma de la ruta, es un componente de recorte muy flexible.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipPath", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json new file mode 100644 index 00000000..2e55bb95 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Découpage de chemin", + "info": "Peut contenir un composant enfant et le découper selon un chemin spécifié. Permet de personnaliser la forme du chemin, c'est un composant de découpage très flexible.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipPath", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json new file mode 100644 index 00000000..bd535f5b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Ritaglio percorso", + "info": "Può contenere un componente figlio e ritagliarlo secondo un percorso specificato. È possibile personalizzare la forma del percorso, rendendolo un componente di ritaglio molto flessibile.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ClipPath", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json new file mode 100644 index 00000000..ed0eeff1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "パスクリップ", + "info": "子コンポーネントを1つ収容し、指定されたパスに従ってクリップします。パスの形状をカスタマイズでき、非常に柔軟なクリップコンポーネントです。", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPathの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json new file mode 100644 index 00000000..a5a7fada --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "경로 클리핑", + "info": "하위 컴포넌트를 수용하고 지정된 경로에 따라 클리핑할 수 있습니다. 경로 모양을 사용자 정의할 수 있어 매우 유연한 클리핑 컴포넌트입니다.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipPath 기본 사용", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json new file mode 100644 index 00000000..68b9446a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Recorte de Caminho", + "info": "Pode conter um componente filho e recortá-lo de acordo com o caminho especificado. Permite personalizar a forma do caminho, sendo um componente de recorte muito flexível.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipPath", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【clipBehavior】 : Comportamento de Recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json new file mode 100644 index 00000000..70914212 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipPath/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 69, + "name": "ClipPath", + "localName": "Обрезка по пути", + "info": "Может содержать один дочерний компонент и обрезать его по указанному пути. Можно настроить форму пути, это очень гибкий компонент для обрезки.", + "lever": 5, + "family": 2, + "linkIds": [ + 66, + 67, + 68 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipPath", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【clipper】 : Обрезчик 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json new file mode 100644 index 00000000..abddb8ae --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Abgerundetes Rechteck zuschneiden", + "info": "Kann ein Kindelement aufnehmen und es mit abgerundeten Ecken zuschneiden. Geben Sie borderRadius als Eckradius an.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipRRect", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【borderRadius】 : Randradius 【BorderRadius】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json new file mode 100644 index 00000000..46e2e47a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Rounded Rectangle Clipping", + "info": "Can contain a child component and perform rounded rectangle clipping on it. Specify borderRadius as the corner radius.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipRRect", + "desc": [ + "【child】: Child component 【Widget】", + "【borderRadius】: Border radius 【BorderRadius】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json new file mode 100644 index 00000000..81bb5ffb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Recorte rectangular con esquinas redondeadas", + "info": "Puede contener un componente hijo y realizar un recorte rectangular con esquinas redondeadas. Especifica borderRadius como el radio de las esquinas.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipRRect", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【borderRadius】 : Radio del borde 【BorderRadius】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json new file mode 100644 index 00000000..e7fcbc89 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Rognage rectangulaire arrondi", + "info": "Peut contenir un composant enfant et le rogner en forme de rectangle arrondi. Spécifiez borderRadius comme rayon des coins.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipRRect", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【borderRadius】 : Rayon des bords 【BorderRadius】", + "【clipBehavior】 : Comportement de rognage 【Clip】", + "【clipper】 : Rogneur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json new file mode 100644 index 00000000..032a195b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Ritaglio rettangolo arrotondato", + "info": "Può contenere un componente figlio e ritagliarlo in un rettangolo con angoli arrotondati. Specifica borderRadius come raggio degli angoli.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ClipRRect", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【borderRadius】 : Raggio del bordo 【BorderRadius】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json new file mode 100644 index 00000000..6b4c29dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "角丸矩形クリップ", + "info": "子コンポーネントを収容し、角丸矩形でクリップできます。borderRadiusを角の半径として指定します。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRectの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【borderRadius】 : 角の半径 【BorderRadius】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json new file mode 100644 index 00000000..a1786f7a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "둥근 사각형 클리핑", + "info": "하위 위젯을 포함하고 둥근 사각형으로 클리핑할 수 있습니다. borderRadius를 모서리 반지름으로 지정합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRRect 기본 사용법", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【borderRadius】 : 모서리 반지름 【BorderRadius】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json new file mode 100644 index 00000000..2cd1570a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Recorte de Retângulo com Cantos Arredondados", + "info": "Pode conter um componente filho e aplica um recorte de retângulo com cantos arredondados. Especifique o borderRadius como o raio dos cantos.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipRRect", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【borderRadius】 : Raio da Borda 【BorderRadius】", + "【clipBehavior】 : Comportamento de Recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json new file mode 100644 index 00000000..43ae1b60 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRRect/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 68, + "name": "ClipRRect", + "localName": "Обрезка прямоугольника с закругленными углами", + "info": "Может содержать один дочерний компонент и обрезать его в форме прямоугольника с закругленными углами. Укажите borderRadius как радиус углов.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 67, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipRRect", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【borderRadius】 : Радиус границы 【BorderRadius】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【clipper】 : Обрезчик 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json new file mode 100644 index 00000000..bfb91cc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Rechteckiger Zuschnitt", + "info": "Kann ein Unterelement aufnehmen und es rechteckig zuschneiden. Kann mit SizedBox, Align, AspectRadio usw. eingeschränkt werden, um den Bereich zu begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ClipRect", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【clipper】 : Zuschneider 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json new file mode 100644 index 00000000..52b73167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Rectangular Clipping", + "info": "Can contain a child component and perform rectangular clipping. Can be localized using components such as SizedBox, Align, AspectRatio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ClipRect", + "desc": [ + "【child】: Child component 【Widget】", + "【clipBehavior】: Clipping behavior 【Clip】", + "【clipper】: Clipper 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json new file mode 100644 index 00000000..56331eb8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Recorte rectangular", + "info": "Puede contener un componente hijo y recortarlo en forma rectangular. Se puede delimitar utilizando componentes como SizedBox, Align, AspectRadio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ClipRect", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【clipper】 : Recortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json new file mode 100644 index 00000000..c01fb51d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Découpage rectangulaire", + "info": "Peut contenir un composant enfant et le découper en forme rectangulaire. Peut être limité à une zone spécifique en utilisant des composants tels que SizedBox, Align, AspectRatio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ClipRect", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【clipper】 : Découpeur 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json new file mode 100644 index 00000000..8478d887 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Ritaglio rettangolare", + "info": "Può contenere un componente figlio e ritagliarlo in forma rettangolare. Può essere delimitato utilizzando componenti come SizedBox, Align, AspectRadio, ecc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ClipRect", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【clipper】 : Ritagliatore 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json new file mode 100644 index 00000000..cca70308 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "矩形クリップ", + "info": "子コンポーネントを収容し、それを矩形にクリップします。SizedBox、Align、AspectRadioなどの限定コンポーネントを使用して領域を指定できます。", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRectの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【clipper】 : クリッパー 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json new file mode 100644 index 00000000..36c4a05c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "사각형 클리핑", + "info": "하위 위젯을 포함하고 사각형으로 클리핑할 수 있습니다. SizedBox, Align, AspectRadio 등을 사용하여 영역을 제한할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ClipRect 기본 사용", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【clipper】 : 클리퍼 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json new file mode 100644 index 00000000..a2eaffb7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Recorte Retangular", + "info": "Pode conter um componente filho e cortá-lo em forma retangular. Pode ser delimitado com componentes como SizedBox, Align, AspectRadio, etc.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ClipRect", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【clipBehavior】 : Comportamento de Corte 【Clip】", + "【clipper】 : Cortador 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json new file mode 100644 index 00000000..535825d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ClipRect/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 67, + "name": "ClipRect", + "localName": "Прямоугольное обрезание", + "info": "Может содержать один дочерний компонент и обрезать его в прямоугольной форме. Может быть ограничен с помощью таких компонентов, как SizedBox, Align, AspectRatio и других.", + "lever": 3, + "family": 2, + "linkIds": [ + 66, + 68, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ClipRect", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【clipBehavior】 : Поведение обрезания 【Clip】", + "【clipper】 : Обрезатель 【CustomClipper】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json new file mode 100644 index 00000000..f6876531 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Farbfilter", + "info": "Kann ein Kindelement aufnehmen und das Element mit 29 Überblendungsmodi und beliebigen Komponenten mischen, so leistungsstark, dass ich nicht weiß, was ich sagen soll. Erfahren Sie mehr über die App, die mit einem Klick alles grau macht.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ColorFiltered", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【colorFilter】 : Farbfilter 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json new file mode 100644 index 00000000..526d50cb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Color Filter", + "info": "Can accommodate a child component, and can mix the component with any other component using 29 blending modes, so powerful that I don't know what to say. Learn about the one-click grayscale app feature.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ColorFiltered", + "desc": [ + "【child】: Child component 【Widget】", + "【colorFilter】: Color filter 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json new file mode 100644 index 00000000..0edca167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro de color", + "info": "Puede contener un componente hijo y mezclar el componente con cualquier otro componente en 29 modos de superposición de colores, tan poderoso que no sé qué decir. Conoce la función de convertir toda la aplicación a gris con un solo clic.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ColorFiltered", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【colorFilter】 : Filtro de color 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json new file mode 100644 index 00000000..43ac7ce0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtre de couleur", + "info": "Peut contenir un composant enfant et peut mélanger le composant avec n'importe quel composant selon 29 modes de superposition de couleurs, si puissant que je ne sais pas quoi dire. Découvrez comment rendre toute l'application en niveaux de gris en un clic.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ColorFiltered", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【colorFilter】 : Filtre de couleur 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json new file mode 100644 index 00000000..773bace4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro colore", + "info": "Può contenere un componente figlio e può mescolare il componente con qualsiasi altro componente in 29 modalità di sovrapposizione del colore, così potente che non so cosa dire. Scopri come rendere tutto grigio con un solo clic nell'app.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ColorFiltered", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【colorFilter】 : Filtro colore 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json new file mode 100644 index 00000000..4de51818 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "カラーフィルター", + "info": "1つの子コンポーネントを収容でき、29種類のオーバーレイモードと任意のコンポーネントを混合できます。その強力さに言葉を失います。アプリのワンクリックで全体をグレーにする機能もご覧ください。", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFilteredの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【colorFilter】 : カラーフィルター 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json new file mode 100644 index 00000000..dc8dd199 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "색상 필터", + "info": "하위 컴포넌트를 포함할 수 있으며, 29가지 색상 혼합 모드와 임의의 컴포넌트를 혼합할 수 있습니다. 너무 강력해서 뭐라고 말해야 할지 모르겠습니다. 앱에서 한 번에 전체를 회색으로 만드는 기능을 확인해 보세요.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColorFiltered 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【colorFilter】 : 색상 필터 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json new file mode 100644 index 00000000..49091b01 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Filtro de Cor", + "info": "Pode conter um componente filho e pode misturar o componente com qualquer outro componente em 29 modos de sobreposição de cores, tão poderoso que não sei o que dizer. Saiba mais sobre o aplicativo que transforma tudo em cinza com um toque.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ColorFiltered", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【colorFilter】 : Filtro de cor 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json new file mode 100644 index 00000000..382d73c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColorFiltered/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 88, + "name": "ColorFiltered", + "localName": "Фильтр цвета", + "info": "Может содержать дочерний компонент, который можно смешивать с любым компонентом по 29 режимам наложения цветов. Настолько мощный, что я не знаю, что сказать. Узнайте, как сделать приложение полностью серым одним кликом.", + "lever": 5, + "family": 2, + "linkIds": [ + 277, + 38 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ColorFiltered", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【colorFilter】 : Фильтр цвета 【ColorFilter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json new file mode 100644 index 00000000..cca1d143 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Farbbox", + "info": "Zeichnet die angegebene Farbe auf dem Layoutbereich des Unterelements und zeichnet dann das Unterelement auf dem Hintergrund.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ColoredBox", + "desc": [ + "【color】 : Komponente 【Color】", + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json new file mode 100644 index 00000000..bc61c3b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Color Box", + "info": "Draws a specified color on the layout area of the child component, then draws the child component on the background color.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ColoredBox", + "desc": [ + "【color】: Component 【Color】", + "【child】: Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json new file mode 100644 index 00000000..664143d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Caja de colores", + "info": "Dibuja un color especificado en el área de diseño del componente hijo, y luego dibuja el componente hijo sobre el color de fondo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json new file mode 100644 index 00000000..569999dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Boîte de couleur", + "info": "Dessine une couleur spécifiée sur la zone de mise en page du composant enfant, puis dessine le composant enfant sur la couleur de fond.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ColoredBox", + "desc": [ + "【color】 : composant 【Color】", + "【child】 : composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json new file mode 100644 index 00000000..d610aeaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Scatola dei colori", + "info": "Disegna un colore specifico nell'area di layout del componente figlio, quindi disegna il componente figlio sullo sfondo colorato.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json new file mode 100644 index 00000000..fbf34b6c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "カラーボックス", + "info": "子コンポーネントのレイアウト領域に指定された色を描画し、その後、子コンポーネントを背景色の上に描画します。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBoxの基本使用", + "desc": [ + "【color】 : コンポーネント 【Color】", + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json new file mode 100644 index 00000000..53d44163 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "색상 상자", + "info": "하위 구성 요소의 레이아웃 영역에 지정된 색상을 그린 다음 배경색 위에 하위 구성 요소를 그립니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ColoredBox 기본 사용", + "desc": [ + "【color】 : 구성 요소 【Color】", + "【child】 : 구성 요소 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json new file mode 100644 index 00000000..51b8903d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Caixa de Cores", + "info": "Desenha uma cor especificada na área de layout do componente filho e, em seguida, desenha o componente filho sobre a cor de fundo.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ColoredBox", + "desc": [ + "【color】 : componente 【Color】", + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json new file mode 100644 index 00000000..308f2719 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ColoredBox/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 267, + "name": "ColoredBox", + "localName": "Цветная коробка", + "info": "Рисует указанный цвет на области макета дочернего компонента, а затем рисует дочерний компонент на фоновом цвете.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ColoredBox", + "desc": [ + "【color】 : компонент 【Color】", + "【child】 : компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json new file mode 100644 index 00000000..8e4dcbfb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Synthetischer Transformationsfolger", + "info": "Wird in der Regel in Verbindung mit der Komponente CompositedTransformTarget verwendet, um das Overlay an die Zieltransformation anzupassen.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von CompositedTransformFollower", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【link】 : Verknüpfung 【LayerLink】", + "【offset】 : Versatz 【Offset】", + "【targetAnchor】 : Zielankerpunkt 【Alignment】", + "【followerAnchor】 : Ankerpunkt des Folgers 【Alignment】", + "【showWhenUnlinked】 : Anzeige bei Nichtverknüpfung 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json new file mode 100644 index 00000000..d4f07044 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Composited Transform Follower", + "info": "Generally used in conjunction with the CompositedTransformTarget component to enable the Overlay to follow the target transformation.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usage of CompositedTransformFollower", + "desc": [ + "【child】 : Child widget 【Widget】", + "【link】 : Link 【LayerLink】", + "【offset】 : Offset 【Offset】", + "【targetAnchor】 : Target anchor 【Alignment】", + "【followerAnchor】 : Follower anchor 【Alignment】", + "【showWhenUnlinked】 : Whether to show when unlinked 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json new file mode 100644 index 00000000..7b7667b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguidor de Transformación Compuesta", + "info": "Generalmente se usa junto con el componente CompositedTransformTarget, lo que permite que el Overlay siga la transformación del objetivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CompositedTransformFollower", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【link】 : Enlace 【LayerLink】", + "【offset】 : Desplazamiento 【Offset】", + "【targetAnchor】 : Punto de anclaje del objetivo 【Alignment】", + "【followerAnchor】 : Punto de anclaje del seguidor 【Alignment】", + "【showWhenUnlinked】 : Mostrar cuando no está enlazado 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json new file mode 100644 index 00000000..4292fa56 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Suiveur de transformation composite", + "info": "Généralement utilisé conjointement avec le composant CompositedTransformTarget, permet à l'Overlay de suivre la transformation de la cible.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CompositedTransformFollower", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【link】 : Lien 【LayerLink】", + "【offset】 : Décalage 【Offset】", + "【targetAnchor】 : Point d'ancrage de la cible 【Alignment】", + "【followerAnchor】 : Point d'ancrage du suiveur 【Alignment】", + "【showWhenUnlinked】 : Afficher si non lié 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json new file mode 100644 index 00000000..cf13a2de --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguace di Trasformazione Composta", + "info": "Generalmente utilizzato in combinazione con il componente CompositedTransformTarget, consente a Overlay di seguire le trasformazioni dell'obiettivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di CompositedTransformFollower", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【link】 : Collegamento 【LayerLink】", + "【offset】 : Offset 【Offset】", + "【targetAnchor】 : Ancoraggio obiettivo 【Alignment】", + "【followerAnchor】 : Ancoraggio seguace 【Alignment】", + "【showWhenUnlinked】 : Mostra quando non collegato 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json new file mode 100644 index 00000000..db21d167 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "合成変換フォロワー", + "info": "通常、CompositedTransformTarget コンポーネントと組み合わせて使用され、Overlay をターゲットの変換に伴わせることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【link】 : リンク 【LayerLink】", + "【offset】 : オフセット 【Offset】", + "【targetAnchor】 : ターゲットアンカー 【Alignment】", + "【followerAnchor】 : フォロワーアンカー 【Alignment】", + "【showWhenUnlinked】 : リンクされていない場合に表示するか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json new file mode 100644 index 00000000..6d54eabc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "합성 변형 팔로워", + "info": "일반적으로 CompositedTransformTarget 컴포넌트와 함께 사용되어 Overlay가 대상 변형을 따라가도록 합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformFollower 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【link】 : 링크 【LayerLink】", + "【offset】 : 오프셋 【Offset】", + "【targetAnchor】 : 타겟 앵커 【Alignment】", + "【followerAnchor】 : 팔로워 앵커 【Alignment】", + "【showWhenUnlinked】 : 링크되지 않을 때 표시 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json new file mode 100644 index 00000000..df81a3ce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Seguidor de Transformação Composta", + "info": "Geralmente usado em conjunto com o componente CompositedTransformTarget, permite que o Overlay acompanhe a transformação do alvo.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CompositedTransformFollower", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【link】 : Link 【LayerLink】", + "【offset】 : Deslocamento 【Offset】", + "【targetAnchor】 : Âncora do alvo 【Alignment】", + "【followerAnchor】 : Âncora do seguidor 【Alignment】", + "【showWhenUnlinked】 : Mostrar quando não estiver vinculado 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json new file mode 100644 index 00000000..2d7e6572 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformFollower/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 265, + "name": "CompositedTransformFollower", + "localName": "Следователь композитного преобразования", + "info": "Обычно используется совместно с компонентом CompositedTransformTarget, позволяя Overlay следовать за преобразованием цели.", + "lever": 3, + "family": 2, + "linkIds": [ + 266, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CompositedTransformFollower", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【link】 : Ссылка 【LayerLink】", + "【offset】 : Смещение 【Offset】", + "【targetAnchor】 : Якорь цели 【Alignment】", + "【followerAnchor】 : Якорь следящего 【Alignment】", + "【showWhenUnlinked】 : Показывать при отсутствии связи 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json new file mode 100644 index 00000000..9f212b54 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Zusammengesetztes Transformationsziel", + "info": "Wird in der Regel in Verbindung mit der CompositedTransformFollower-Komponente verwendet, um das Overlay an die Zieltransformation anzupassen.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von CompositedTransformTarget", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【link】 : Verknüpfung 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json new file mode 100644 index 00000000..25b5ad35 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Composite Transform Target", + "info": "Generally used in conjunction with the CompositedTransformFollower component, it allows the Overlay to follow the target transformation.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget Usage", + "desc": [ + "【child】 : Child component 【Widget】", + "【link】 : Link 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json new file mode 100644 index 00000000..0fe0dd5d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Objetivo de transformación compuesta", + "info": "Generalmente se usa junto con el componente CompositedTransformFollower, lo que permite que el Overlay siga la transformación del objetivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CompositedTransformTarget", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【link】 : Enlace 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json new file mode 100644 index 00000000..714f08cf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Cible de transformation composite", + "info": "Généralement utilisé conjointement avec le composant CompositedTransformFollower, il permet à l'Overlay de suivre les transformations de la cible.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CompositedTransformTarget", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【link】 : Lien 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json new file mode 100644 index 00000000..0440bbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Obiettivo di trasformazione composita", + "info": "Generalmente utilizzato insieme al componente CompositedTransformFollower, consente all'Overlay di seguire le trasformazioni dell'obiettivo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di CompositedTransformTarget", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【link】 : Collegamento 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json new file mode 100644 index 00000000..c6b8469c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "合成変換ターゲット", + "info": "一般的に CompositedTransformFollower コンポーネントと組み合わせて使用され、Overlay をターゲットの変換に伴わせることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget の使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【link】 : リンク 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json new file mode 100644 index 00000000..a82981b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "합성 변환 대상", + "info": "일반적으로 CompositedTransformFollower 컴포넌트와 함께 사용되며, Overlay가 대상 변환을 따라가도록 할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CompositedTransformTarget 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【link】 : 링크 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json new file mode 100644 index 00000000..56e64b59 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Alvo de Transformação Composta", + "info": "Geralmente usado em conjunto com o componente CompositedTransformFollower, pode fazer com que o Overlay acompanhe a transformação do alvo.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CompositedTransformTarget", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【link】 : Link 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json new file mode 100644 index 00000000..291a2959 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CompositedTransformTarget/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 266, + "name": "CompositedTransformTarget", + "localName": "Цель составного преобразования", + "info": "Обычно используется совместно с компонентом CompositedTransformFollower, что позволяет Overlay следовать за преобразованием цели.", + "lever": 3, + "family": 2, + "linkIds": [ + 265, + 182 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CompositedTransformTarget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【link】 : Ссылка 【LayerLink】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json new file mode 100644 index 00000000..5f54b474 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Eingeschränkte Box", + "info": "Kann ein Unterelement aufnehmen und durch die Angabe von maximaler und minimaler Breite und Höhe den Bereich des Unterelements begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BoxConstraints", + "desc": [ + "【child】 : Kind-Komponente 【Widget】", + "【minWidth】 : Minimale Breite 【double】", + "【minHeight】 : Minimale Höhe 【double】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json new file mode 100644 index 00000000..c1d16da0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Constrained Box", + "info": "Can contain a child component, and limit the area of the child component by specifying the maximum and minimum width and height.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BoxConstraints", + "desc": [ + "【child】 : Child component 【Widget】", + "【minWidth】 : Minimum width 【double】", + "【minHeight】 : Minimum height 【double】", + "【maxHeight】 : Maximum height 【double】", + "【maxWidth】 : Maximum width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json new file mode 100644 index 00000000..5b3675ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Caja con restricciones", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y alto máximo y mínimo.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BoxConstraints", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【minWidth】 : Ancho mínimo 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json new file mode 100644 index 00000000..857eb2d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Boîte de contraintes", + "info": "Peut contenir un composant enfant, en spécifiant la largeur et la hauteur maximales et minimales pour limiter la zone du composant enfant.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BoxConstraints", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【minWidth】 : Largeur minimale 【double】", + "【minHeight】 : Hauteur minimale 【double】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json new file mode 100644 index 00000000..5147457f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Scatola Vincolata", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando larghezza e altezza massime e minime.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BoxConstraints", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【minWidth】 : Larghezza minima 【double】", + "【minHeight】 : Altezza minima 【double】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json new file mode 100644 index 00000000..57709223 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "制約ボックス", + "info": "子コンポーネントを収容でき、最大・最小の幅と高さを指定して、子コンポーネントの領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraintsの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【minWidth】 : 最小幅 【double】", + "【minHeight】 : 最小高さ 【double】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json new file mode 100644 index 00000000..02b077fb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "제한 상자", + "info": "하위 위젯을 수용할 수 있으며, 최대 및 최소 너비와 높이를 지정하여 하위 위젯의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxConstraints 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【minWidth】 : 최소 너비 【double】", + "【minHeight】 : 최소 높이 【double】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json new file mode 100644 index 00000000..585ab4ef --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Caixa Restrita", + "info": "Pode conter um componente filho, limitando a área onde o componente filho pode estar, especificando a largura e altura mínima e máxima.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de BoxConstraints", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【minWidth】 : Largura mínima 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json new file mode 100644 index 00000000..65a5a04f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ConstrainedBox/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 80, + "name": "ConstrainedBox", + "localName": "Ограниченный контейнер", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента путем указания минимальной и максимальной ширины и высоты.", + "lever": 3, + "family": 2, + "linkIds": [ + 1, + 79, + 81 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BoxConstraints", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【minWidth】 : Минимальная ширина 【double】", + "【minHeight】 : Минимальная высота 【double】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json new file mode 100644 index 00000000..924c857c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOS-Textauswahl-Werkzeugleiste", + "info": "Eine iOS-stil Werkzeugleiste, die auf Textauswahl reagiert", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Diese Komponente kann nicht verwendet werden", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json new file mode 100644 index 00000000..9b985784 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOS Text Selection Toolbar", + "info": "An iOS-style toolbar that responds to text selection", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "This component is not available", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json new file mode 100644 index 00000000..1fefc04f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra de herramientas de selección de texto iOS", + "info": "Barra de herramientas de estilo iOS que responde a la selección de texto", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Este componente no se puede usar", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json new file mode 100644 index 00000000..39d455a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barre d'outils de sélection de texte iOS", + "info": "Barre d'outils de style iOS qui répond à la sélection de texte", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ce composant ne peut pas être utilisé", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json new file mode 100644 index 00000000..0837589c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra degli strumenti di selezione del testo per iOS", + "info": "Barra degli strumenti in stile iOS che risponde alla selezione del testo", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Questo componente non può essere utilizzato", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json new file mode 100644 index 00000000..ffbb4028 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "iOSテキスト選択ツールバー", + "info": "テキスト選択に応答するiOSスタイルのツールバー", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "このコンポーネントは使用できません", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json new file mode 100644 index 00000000..2040ec18 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "ios 텍스트 선택 도구 모음", + "info": "텍스트 선택에 반응하는 ios 스타일의 도구 모음", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "이 컴포넌트는 사용할 수 없습니다", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json new file mode 100644 index 00000000..531eaca3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Barra de ferramentas de seleção de texto iOS", + "info": "Barra de ferramentas no estilo iOS que responde à seleção de texto", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Este componente não pode ser usado", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json new file mode 100644 index 00000000..5c65d5a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CupertinoTextSelectionToolbar/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 299, + "name": "CupertinoTextSelectionToolbar", + "localName": "Панель инструментов для выбора текста iOS", + "info": "Панель инструментов в стиле iOS, реагирующая на выбор текста", + "lever": 1, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Этот компонент недоступен", + "desc": [ + "【-】 : - 【-】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json new file mode 100644 index 00000000..c4e97d67 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Zeichnungskomponente", + "info": "Durch CustomPainter können komplexe benutzerdefinierte Zeichnungskomponenten erstellt werden, was die Seele der benutzerdefinierten Komponenten in Flutter darstellt.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint Linienzeichnung", + "desc": [ + "【painter】 : Zeichnungsgerät 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint Bézier-Kurven", + "desc": [ + "Flutter unterstützt auch komplexe Zeichnungen wie Bézier-Kurven." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json new file mode 100644 index 00000000..6f131930 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Drawing Component", + "info": "Drawing through CustomPainter can achieve some complex custom drawing components, and it is the soul of custom components in Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint Line Drawing", + "desc": [ + "【painter】: Painter 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint Bezier Curve", + "desc": [ + "Flutter also supports complex drawings such as Bezier curves." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json new file mode 100644 index 00000000..ca8bd5f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente de dibujo", + "info": "A través de CustomPainter, se pueden implementar algunos componentes de dibujo personalizados complejos, siendo el alma de los componentes personalizados en Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint dibuja formas de línea", + "desc": [ + "【painter】: pintor 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint dibuja curvas de Bézier", + "desc": [ + "Flutter también admite dibujos complejos como curvas de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json new file mode 100644 index 00000000..7eaf8e7f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Composant de dessin", + "info": "En utilisant CustomPainter, il est possible de réaliser des composants de dessin personnalisés complexes, ce qui en fait une figure essentielle des composants personnalisés dans Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Dessin de lignes avec CustomPaint", + "desc": [ + "【painter】 : Peintre 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Dessin de courbes de Bézier avec CustomPaint", + "desc": [ + "Flutter prend également en charge des dessins complexes comme les courbes de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json new file mode 100644 index 00000000..698e0db3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente di disegno", + "info": "Attraverso CustomPainter, è possibile realizzare alcuni componenti di disegno personalizzati complessi, che rappresentano l'anima dei componenti personalizzati in Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Disegno di linee con CustomPaint", + "desc": [ + "【painter】 : strumento di disegno 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Curva di Bézier con CustomPaint", + "desc": [ + "Flutter supporta anche disegni complessi come le curve di Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json new file mode 100644 index 00000000..98a0fa61 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "描画コンポーネント", + "info": "CustomPainterを使用して描画することで、複雑なカスタム描画コンポーネントを実現できます。これはFlutterのカスタムコンポーネントの中心的な存在です。", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaintで線と図形を描画", + "desc": [ + "【painter】 : ペインター 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaintでベジェ曲線を描画", + "desc": [ + "Flutterはベジェ曲線などの複雑な描画もサポートしています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json new file mode 100644 index 00000000..7fd754bb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "그리기 컴포넌트", + "info": "CustomPainter를 통해 그리기를 수행하며, 복잡한 사용자 정의 그리기 컴포넌트를 구현할 수 있습니다. Flutter에서 사용자 정의 컴포넌트의 핵심 요소입니다.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "CustomPaint로 선 그리기", + "desc": [ + "【painter】 : 페인터 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "CustomPaint로 베지어 곡선 그리기", + "desc": [ + "Flutter는 베지어 곡선과 같은 복잡한 그리기도 지원합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json new file mode 100644 index 00000000..4cdbd577 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Componente de Desenho", + "info": "Através do CustomPainter, é possível realizar alguns componentes de desenho personalizados complexos, sendo uma figura central na criação de componentes personalizados no Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Desenho de Linhas com CustomPaint", + "desc": [ + "【painter】 : Pintor 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Desenho de Curvas de Bézier com CustomPaint", + "desc": [ + "O Flutter também suporta desenhos complexos como curvas de Bézier." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json new file mode 100644 index 00000000..27456915 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomPaint/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 166, + "name": "CustomPaint", + "localName": "Компонент рисования", + "info": "Рисование с помощью CustomPainter позволяет реализовать сложные пользовательские компоненты рисования, являясь ключевым элементом пользовательских компонентов во Flutter.", + "lever": 5, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_clock.dart", + "name": "Рисование линий с помощью CustomPaint", + "desc": [ + "【painter】 : рисовальщик 【CustomPainter】" + ] + }, + { + "file": "node2_bezier.dart", + "name": "Рисование кривых Безье с помощью CustomPaint", + "desc": [ + "Flutter также поддерживает сложное рисование, такое как кривые Безье." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json new file mode 100644 index 00000000..e87b36dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Allgemeines Einzelkind-Layout", + "info": "Kann ein Unterelement aufnehmen und eine Delegiertenklasse angeben, um das Unterelement anzuordnen. Die Delegiertenklasse kann den Bereich des übergeordneten Containers und die Bereichsgröße des Unterelements sowie die Bereichsbeschränkungen abrufen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CustomSingleChildLayout", + "desc": [ + "【delegate】 : Delegat 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Verschiebungsverwendung von CustomSingleChildLayout", + "desc": [ + "Kann die Verschiebungsfähigkeit des Delegaten nutzen, um das Unterelement zu positionieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json new file mode 100644 index 00000000..377116b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Universal Single Child Layout", + "info": "Can accommodate one child component and specify a delegate class to arrange the child component. The delegate class can obtain the parent container area, the child component's area size, and the area constraints.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegate 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Offset Usage of CustomSingleChildLayout", + "desc": [ + "The offset capability of the delegate can be used to position the child component with an offset." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json new file mode 100644 index 00000000..f829cee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Diseño de un solo hijo personalizado", + "info": "Puede contener un componente hijo y especificar una clase delegada para organizar el componente hijo. La clase delegada puede obtener el área del contenedor padre y el tamaño del área del componente hijo, así como las restricciones del área.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegado 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso de desplazamiento en CustomSingleChildLayout", + "desc": [ + "Se puede utilizar la capacidad de desplazamiento del delegado para posicionar el componente hijo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json new file mode 100644 index 00000000..819d6eaf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Disposition personnalisée à un seul enfant", + "info": "Peut contenir un seul composant enfant et spécifie une classe déléguée pour organiser le composant enfant. La classe déléguée peut obtenir la zone du conteneur parent et la taille de la zone du composant enfant, ainsi que les contraintes de zone.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CustomSingleChildLayout", + "desc": [ + "【delegate】 : délégué 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Utilisation du décalage de CustomSingleChildLayout", + "desc": [ + "Peut utiliser la capacité de décalage du délégué pour positionner le composant enfant avec un décalage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json new file mode 100644 index 00000000..43ddc574 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Layout Singolo Figlio Personalizzato", + "info": "Può contenere un componente figlio e specificare una classe delegata per disporre il componente figlio. La classe delegata può ottenere l'area del contenitore padre e le dimensioni dell'area del componente figlio, nonché i vincoli dell'area.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CustomSingleChildLayout", + "desc": [ + "【delegate】 : delegato 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso dello spostamento in CustomSingleChildLayout", + "desc": [ + "È possibile utilizzare la capacità di spostamento del delegato per posizionare il componente figlio." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json new file mode 100644 index 00000000..5c5db389 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "汎用シングルチャイルドレイアウト", + "info": "1つの子コンポーネントを収容し、代理クラスを指定して子コンポーネントをレイアウトします。代理クラスは、親コンテナ領域と子コンポーネントの領域サイズ、および領域の制約状況を取得できます。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayoutの基本使用", + "desc": [ + "【delegate】 : 代理 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayoutのオフセット使用", + "desc": [ + "代理のオフセット能力を利用して、子コンポーネントをオフセット位置に配置できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json new file mode 100644 index 00000000..20753e7d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "일반 단일 자식 레이아웃", + "info": "하나의 자식 위젯을 수용하고, 대리 클래스를 지정하여 자식 위젯을 배치합니다. 대리 클래스는 부모 컨테이너 영역과 자식 위젯의 영역 크기 및 영역 제약 조건을 얻을 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomSingleChildLayout 기본 사용", + "desc": [ + "【delegate】 : 대리 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "CustomSingleChildLayout의 오프셋 사용", + "desc": [ + "대리의 오프셋 기능을 활용하여 자식 위젯을 오프셋 위치시킬 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json new file mode 100644 index 00000000..6a3704d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Layout de Filho Único Personalizado", + "info": "Pode acomodar um componente filho e especificar uma classe de proxy para organizar o componente filho. A classe de proxy pode obter a área do contêiner pai e o tamanho da área do componente filho, bem como as restrições da área.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CustomSingleChildLayout", + "desc": [ + "【delegate】 : proxy 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Uso de Deslocamento do CustomSingleChildLayout", + "desc": [ + "Pode utilizar a capacidade de deslocamento do proxy para posicionar o componente filho com deslocamento." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json new file mode 100644 index 00000000..d25be61c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/CustomSingleChildLayout/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 285, + "name": "CustomSingleChildLayout", + "localName": "Универсальный макет с одним дочерним элементом", + "info": "Может содержать один дочерний компонент и задавать класс-делегат для размещения дочернего компонента. Класс-делегат может получить область родительского контейнера и размер области дочернего компонента, а также ограничения области.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CustomSingleChildLayout", + "desc": [ + "【delegate】 : делегат 【SingleChildLayoutDelegate】" + ] + }, + { + "file": "node2_offset.dart", + "name": "Использование смещения в CustomSingleChildLayout", + "desc": [ + "Можно использовать возможности смещения делегата для позиционирования дочернего компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json new file mode 100644 index 00000000..00a0aab8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_de_DE.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Dekorationsbox", + "info": "Kann ein Kindelement aufnehmen und es dekorieren. Die Kerneigenschaft ist decoration, mit der Rahmen, Verläufe, Schatten, Hintergrundbilder usw. festgelegt werden können.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DecoratedBox", + "desc": [ + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【position】 : Vordergrundfarbe (links)/Hintergrundfarbe (rechts) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Form und Bilddekoration von DecoratedBox", + "desc": [ + "【shape】 : Form 【BoxShape】", + "【image】 : Hintergrundbild 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Rahmendekoration von DecoratedBox", + "desc": [ + "【border】 : Rahmen 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Formdekoration von DecoratedBox", + "desc": [ + "Mit dem ShapeDecoration-Objekt kann die Rahmenform angegeben werden," + ] + }, + { + "file": "node5_line.dart", + "name": "Unterstreichungsdekoration von DecoratedBox", + "desc": [ + "Mit dem UnderlineTabIndicator-Objekt kann die Unterstreichung angegeben werden," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration-Dekoration", + "desc": [ + "Mit dem FlutterLogoDecoration-Objekt kann die Flutter-Icon-Dekoration angegeben werden (hat keine große Bedeutung)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json new file mode 100644 index 00000000..6fa9323e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_en_US.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Decorated Box", + "info": "Can contain a child component and decorate it. The core property is decoration, which can set borders, gradients, shadows, background images, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DecoratedBox", + "desc": [ + "【decoration】: Decoration object 【Decoration】", + "【position】: Foreground color (left)/Background color (right) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Shape and Image Decoration of DecoratedBox", + "desc": [ + "【shape】: Shape 【BoxShape】", + "【image】: Background image 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Border Decoration of DecoratedBox", + "desc": [ + "【border】: Border 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Shape Decoration of DecoratedBox", + "desc": [ + "You can specify the border shape through the ShapeDecoration object," + ] + }, + { + "file": "node5_line.dart", + "name": "Bottom Line Decoration of DecoratedBox", + "desc": [ + "You can specify the bottom line through the UnderlineTabIndicator object," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration Decoration", + "desc": [ + "You can specify Flutter icon decoration through the FlutterLogoDecoration object (not very useful)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json new file mode 100644 index 00000000..c21db3db --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_es_ES.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Caja Decorada", + "info": "Puede contener un componente hijo y decorarlo. La propiedad principal es decoration, que permite configurar bordes, degradados, sombras, imágenes de fondo, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DecoratedBox", + "desc": [ + "【decoration】 : Objeto de decoración 【Decoration】", + "【position】 : Color de primer plano (izquierda)/Color de fondo (derecha) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Decoración de forma e imagen en DecoratedBox", + "desc": [ + "【shape】 : Forma 【BoxShape】", + "【image】 : Imagen de fondo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decoración de borde en DecoratedBox", + "desc": [ + "【border】 : Borde 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decoración de forma en DecoratedBox", + "desc": [ + "Se puede especificar la forma del borde mediante el objeto ShapeDecoration," + ] + }, + { + "file": "node5_line.dart", + "name": "Decoración de línea inferior en DecoratedBox", + "desc": [ + "Se puede especificar la línea inferior mediante el objeto UnderlineTabIndicator," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decoración con FlutterLogoDecoration", + "desc": [ + "Se puede especificar la decoración del ícono de Flutter mediante el objeto FlutterLogoDecoration (no tiene mucho uso)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json new file mode 100644 index 00000000..dc641c56 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_fr_FR.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Boîte décorée", + "info": "Peut contenir un composant enfant et le décorer. La propriété principale est decoration, qui permet de définir des bordures, des dégradés, des ombres, des images de fond, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DecoratedBox", + "desc": [ + "【decoration】 : Objet de décoration 【Decoration】", + "【position】 : Couleur de premier plan (gauche)/couleur d'arrière-plan (droite) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Forme et image de décoration de DecoratedBox", + "desc": [ + "【shape】 : Forme 【BoxShape】", + "【image】 : Image de fond 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Bordure de décoration de DecoratedBox", + "desc": [ + "【border】 : Bordure 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Forme de décoration de DecoratedBox", + "desc": [ + "L'objet ShapeDecoration permet de spécifier la forme de la bordure," + ] + }, + { + "file": "node5_line.dart", + "name": "Ligne de décoration de DecoratedBox", + "desc": [ + "L'objet UnderlineTabIndicator permet de spécifier la ligne de fond," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Décoration FlutterLogoDecoration", + "desc": [ + "L'objet FlutterLogoDecoration permet de spécifier la décoration de l'icône Flutter (sans grande utilité)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json new file mode 100644 index 00000000..9fbe1046 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_it_IT.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Scatola decorata", + "info": "Può contenere un componente figlio e decorarlo. La proprietà principale è decoration, che può impostare bordi, gradienti, ombre, immagini di sfondo, ecc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DecoratedBox", + "desc": [ + "【decoration】 : oggetto decorativo 【Decoration】", + "【position】 : colore in primo piano (sinistra)/colore di sfondo (destra) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Decorazione di forma e immagine di DecoratedBox", + "desc": [ + "【shape】 : forma 【BoxShape】", + "【image】 : immagine di sfondo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decorazione del bordo di DecoratedBox", + "desc": [ + "【border】 : bordo 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decorazione della forma di DecoratedBox", + "desc": [ + "È possibile specificare la forma del bordo tramite l'oggetto ShapeDecoration," + ] + }, + { + "file": "node5_line.dart", + "name": "Decorazione della linea di base di DecoratedBox", + "desc": [ + "È possibile specificare la linea di base tramite l'oggetto UnderlineTabIndicator," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decorazione FlutterLogoDecoration", + "desc": [ + "È possibile specificare la decorazione dell'icona Flutter tramite l'oggetto FlutterLogoDecoration (non ha un grande utilità)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json new file mode 100644 index 00000000..21dabc4f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ja_JP.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "装飾ボックス", + "info": "子コンポーネントを収容し、装飾することができます。コアプロパティはdecorationで、枠線、グラデーション、影、背景画像などを設定できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxの基本使用", + "desc": [ + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【position】 : 前景色(左)/背景色(右) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBoxの形状と画像装飾", + "desc": [ + "【shape】 : 形状 【BoxShape】", + "【image】 : 背景画像 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBoxの枠線装飾", + "desc": [ + "【border】 : 枠線 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBoxの形状装飾", + "desc": [ + "ShapeDecorationオブジェクトを使用して枠線の形状を指定できます," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBoxの下線装飾", + "desc": [ + "UnderlineTabIndicatorオブジェクトを使用して下線を指定できます," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration装飾", + "desc": [ + "FlutterLogoDecorationオブジェクトを使用してFlutterアイコン装飾を指定できます(特に大きな効果はありません)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json new file mode 100644 index 00000000..feff512f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ko_KR.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "장식 상자", + "info": "하위 컴포넌트를 포함할 수 있으며, 이를 장식할 수 있습니다. 핵심 속성은 decoration으로, 테두리, 그라데이션, 그림자, 배경 이미지 등을 설정할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBox 기본 사용", + "desc": [ + "【decoration】 : 장식 객체 【Decoration】", + "【position】 : 전경색(왼쪽)/배경색(오른쪽) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "DecoratedBox 형태와 이미지 장식", + "desc": [ + "【shape】 : 형태 【BoxShape】", + "【image】 : 배경 이미지 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "DecoratedBox 테두리 장식", + "desc": [ + "【border】 : 테두리 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "DecoratedBox 형태 장식", + "desc": [ + "ShapeDecoration 객체를 통해 테두리 형태를 지정할 수 있습니다," + ] + }, + { + "file": "node5_line.dart", + "name": "DecoratedBox 밑줄 장식", + "desc": [ + "UnderlineTabIndicator 객체를 통해 밑줄을 지정할 수 있습니다," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "FlutterLogoDecoration 장식", + "desc": [ + "FlutterLogoDecoration 객체를 통해 Flutter 아이콘 장식을 지정할 수 있습니다(별다른 기능은 없습니다)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json new file mode 100644 index 00000000..c8a9195b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_pt_PT.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Caixa Decorada", + "info": "Pode conter um componente filho e decorá-lo. A propriedade principal é decoration, que pode definir bordas, gradientes, sombras, imagens de fundo, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DecoratedBox", + "desc": [ + "【decoration】 : Objeto de decoração 【Decoration】", + "【position】 : Cor de primeiro plano (esquerda)/Cor de fundo (direita) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Forma e Decoração de Imagem do DecoratedBox", + "desc": [ + "【shape】 : Forma 【BoxShape】", + "【image】 : Imagem de fundo 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Decoração de Borda do DecoratedBox", + "desc": [ + "【border】 : Borda 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Decoração de Forma do DecoratedBox", + "desc": [ + "O objeto ShapeDecoration pode especificar a forma da borda," + ] + }, + { + "file": "node5_line.dart", + "name": "Decoração de Linha de Base do DecoratedBox", + "desc": [ + "O objeto UnderlineTabIndicator pode especificar a linha de base," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Decoração com FlutterLogoDecoration", + "desc": [ + "O objeto FlutterLogoDecoration pode especificar a decoração do ícone Flutter (não tem grande utilidade)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json new file mode 100644 index 00000000..afd56ba9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/DecoratedBox/desc_ru_RU.json @@ -0,0 +1,55 @@ +{ + "id": 70, + "name": "DecoratedBox", + "localName": "Декорированный блок", + "info": "Может содержать один дочерний компонент и декорировать его. Основное свойство - decoration, которое позволяет настроить границы, градиенты, тени, фоновые изображения и т.д.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DecoratedBox", + "desc": [ + "【decoration】 : Объект декора 【Decoration】", + "【position】 : Передний план (слева)/Задний план (справа) 【DecorationPosition】" + ] + }, + { + "file": "node2_image.dart", + "name": "Форма и изображение декора в DecoratedBox", + "desc": [ + "【shape】 : Форма 【BoxShape】", + "【image】 : Фоновое изображение 【DecorationImage】," + ] + }, + { + "file": "node3_border.dart", + "name": "Декорирование границ в DecoratedBox", + "desc": [ + "【border】 : Граница 【BoxBorder】," + ] + }, + { + "file": "node4_shape.dart", + "name": "Декорирование формы в DecoratedBox", + "desc": [ + "С помощью объекта ShapeDecoration можно указать форму границы," + ] + }, + { + "file": "node5_line.dart", + "name": "Декорирование нижней линии в DecoratedBox", + "desc": [ + "С помощью объекта UnderlineTabIndicator можно указать нижнюю линию," + ] + }, + { + "file": "node6_flutterLogo.dart", + "name": "Декорирование FlutterLogoDecoration", + "desc": [ + "С помощью объекта FlutterLogoDecoration можно указать декорирование иконкой Flutter (не имеет особого значения)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json new file mode 100644 index 00000000..72b9e13a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transparenzübergang", + "info": "Kann ein Kindelement aufnehmen und eine Transparenzverlaufsanimation durchführen, wobei ein Animator opacity erforderlich ist.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FadeTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json new file mode 100644 index 00000000..78215438 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Fade Transition", + "info": "Can contain a child component and make it perform a fade animation, requires an animator opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FadeTransition", + "desc": [ + "【child】 : Child Component 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json new file mode 100644 index 00000000..b40ee163 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transición de desvanecimiento", + "info": "Puede contener un componente hijo y hacer que realice una animación de cambio de opacidad, requiere un animador de opacidad.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FadeTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【opacity】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json new file mode 100644 index 00000000..a0336dee --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transition de transparence", + "info": "Peut contenir un composant enfant et lui appliquer une animation de transition d'opacité, nécessite un animateur opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FadeTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【opacity】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json new file mode 100644 index 00000000..9ba5f410 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transizione di trasparenza", + "info": "Può contenere un componente figlio e fargli eseguire un'animazione di dissolvenza della trasparenza, richiede un animatore opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di FadeTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【opacity】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json new file mode 100644 index 00000000..5dbe65a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "フェードトランジション", + "info": "1つの子コンポーネントを収容し、透明度の変化アニメーションを行わせることができます。アニメーターopacityを提供する必要があります。", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【opacity】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json new file mode 100644 index 00000000..1bae8dc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "투명도 전환", + "info": "하나의 자식 위젯을 포함할 수 있으며, 투명도가 점진적으로 변하는 애니메이션을 수행합니다. 애니메이터 opacity를 제공해야 합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【opacity】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json new file mode 100644 index 00000000..20a6bf53 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Transição de Transparência", + "info": "Pode conter um componente filho e fazer com que ele realize uma animação de transição de transparência, é necessário fornecer o animador opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FadeTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【opacity】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json new file mode 100644 index 00000000..3814c364 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FadeTransition/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 89, + "name": "FadeTransition", + "localName": "Прозрачное преобразование", + "info": "Может содержать один дочерний компонент и выполнять анимацию изменения прозрачности, требует предоставления аниматора opacity.", + "lever": 3, + "family": 2, + "linkIds": [ + 73, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FadeTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【opacity】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json new file mode 100644 index 00000000..3a4aa12f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Anpassungsbox", + "info": "Kann ein Kindelement aufnehmen, verwendet die fit-Eigenschaft, um den Anpassungsmodus des Kindelements im Verhältnis zum Elternelement zu bestimmen, und verfügt über die Ausrichtungseigenschaft alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FittedBox", + "desc": [ + "【child】: Kindelement 【Widget】", + "【fit】: Anpassungsmodus 【BoxFit】", + "【alignment】: Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json new file mode 100644 index 00000000..8c894a01 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Fitted Box", + "info": "Can accommodate a child component, using the fit property to determine the adaptation mode of the child component area relative to the parent component, and has the alignment property.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FittedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【fit】: Adaptation mode 【BoxFit】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json new file mode 100644 index 00000000..144cf6a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Caja ajustada", + "info": "Puede contener un componente hijo, utiliza la propiedad fit para determinar el modo de adaptación del área del componente hijo en relación con el componente padre, y tiene la propiedad de alineación alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FittedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【fit】 : Modo de adaptación 【BoxFit】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json new file mode 100644 index 00000000..2e8ade46 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Boîte ajustée", + "info": "Peut contenir un composant enfant, utilise la propriété fit pour déterminer le mode d'adaptation de la zone du composant enfant par rapport au composant parent, possède la propriété d'alignement alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FittedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【fit】 : Mode d'adaptation 【BoxFit】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json new file mode 100644 index 00000000..2a64e52a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Scatola adattata", + "info": "Può contenere un componente figlio, utilizza la proprietà fit per determinare la modalità di adattamento dell'area del componente figlio rispetto al componente padre, ha la proprietà di allineamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di FittedBox", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【fit】 : modalità di adattamento 【BoxFit】", + "【alignment】 : modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json new file mode 100644 index 00000000..0e7173dd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "フィットボックス", + "info": "1つの子コンポーネントを収容でき、fitプロパティを使用して子コンポーネントの領域を親コンポーネントに対する適応モードを決定し、alignmentプロパティを持っています。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【fit】 : 適応モード 【BoxFit】", + "【alignment】 : 整列方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json new file mode 100644 index 00000000..bfee7328 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "적응 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, fit 속성을 사용하여 하위 컴포넌트 영역이 상위 컴포넌트에 대한 적응 모드를 결정합니다. alignment 속성을 가지고 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FittedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【fit】 : 적응 모드 【BoxFit】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json new file mode 100644 index 00000000..4f31e07c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Caixa Ajustada", + "info": "Pode conter um componente filho, usando a propriedade fit para determinar o modo de ajuste da área do componente filho em relação ao componente pai, possui a propriedade de alinhamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FittedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【fit】 : Modo de ajuste 【BoxFit】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json new file mode 100644 index 00000000..e8f902e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FittedBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 87, + "name": "FittedBox", + "localName": "Адаптивный бокс", + "info": "Может содержать один дочерний компонент, использует свойство fit для определения режима адаптации области дочернего компонента относительно родительского компонента, имеет свойство выравнивания alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FittedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【fit】 : Режим адаптации 【BoxFit】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json new file mode 100644 index 00000000..c0c0f1a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Teilverschiebung", + "info": "Verschiebt das Kindelement durch die offset-Eigenschaft, die Verschiebung ist OffSet horizontal/vertikal * Größe des Kindelements.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FractionalTranslation", + "desc": [ + "【translation】 : Verschiebungsteilungswert 【Offset】", + "【child】: Kindelement 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json new file mode 100644 index 00000000..aaad7c9a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Fractional Translation", + "info": "Offset the child component through the offset property, the offset is the horizontal and vertical OffSet * the size of the child component.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FractionalTranslation", + "desc": [ + "【translation】: Offset fraction value 【Offset】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json new file mode 100644 index 00000000..aab50acb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Desplazamiento fraccional", + "info": "Desplaza el componente hijo mediante la propiedad offset, la cantidad de desplazamiento es el tamaño del componente hijo multiplicado por el OffSet horizontal y vertical.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FractionalTranslation", + "desc": [ + "【translation】: Valor de desplazamiento fraccional 【Offset】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json new file mode 100644 index 00000000..34d54e5c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Translation fractionnaire", + "info": "Déplace le composant enfant via la propriété offset, le déplacement est égal à la taille du composant enfant multipliée par les valeurs horizontale et verticale de l'Offset.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FractionalTranslation", + "desc": [ + "【translation】 : Valeur de déplacement fractionnaire 【Offset】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json new file mode 100644 index 00000000..38fac9c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Traduzione Frazionaria", + "info": "Sposta il componente figlio tramite la proprietà offset, dove lo spostamento è determinato da OffSet orizzontale e verticale moltiplicato per la dimensione del componente figlio.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di FractionalTranslation", + "desc": [ + "【translation】 : Valore di spostamento frazionario 【Offset】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json new file mode 100644 index 00000000..b74f4b4a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "分度オフセット", + "info": "offsetプロパティを使用して子コンポーネントをオフセットします。オフセット量はOffSetの横縦×子コンポーネントのサイズです。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslationの基本使用", + "desc": [ + "【translation】 : オフセット分度値 【Offset】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json new file mode 100644 index 00000000..670b7fc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "분할 오프셋", + "info": "offset 속성을 통해 자식 컴포넌트를 오프셋하며, 오프셋량은 OffSet의 가로 및 세로 * 자식 컴포넌트 크기입니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionalTranslation 기본 사용", + "desc": [ + "【translation】 : 오프셋 분할 값 【Offset】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json new file mode 100644 index 00000000..b988006f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Deslocamento Fracionado", + "info": "Desloca o componente filho através da propriedade offset, onde o deslocamento é o tamanho do componente filho multiplicado pelo valor horizontal e vertical do Offset.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FractionalTranslation", + "desc": [ + "【translation】 : Valor de deslocamento fracionado 【Offset】", + "【child】: Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json new file mode 100644 index 00000000..a8e84089 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionalTranslation/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 263, + "name": "FractionalTranslation", + "localName": "Дробное смещение", + "info": "Смещение дочернего компонента с помощью свойства offset, величина смещения равна OffSet по горизонтали и вертикали * размер дочернего компонента.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FractionalTranslation", + "desc": [ + "【translation】 : Значение дробного смещения 【Offset】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json new file mode 100644 index 00000000..6b1d6f63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Teilweise Größenbox", + "info": "Kann ein Kindelement aufnehmen, gibt die Breiten- und Höhenanteile an, begrenzt den Bereich des Kindelements auf die Breite und Höhe des Elterncontainers * die jeweiligen Anteile sowie die Ausrichtung alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FractionallySizedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【widthFactor】 : Breitenanteil 【double】", + "【heightFactor】 : Höhenanteil 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json new file mode 100644 index 00000000..f2f27034 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "FractionallySizedBox", + "info": "Can contain a child component, specify width and height fractions, limit the child component area to the parent container's width and height * each fraction, and alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FractionallySizedBox", + "desc": [ + "【child】 : Child component 【Widget】", + "【widthFactor】 : Width fraction 【double】", + "【heightFactor】 : Height fraction 【double】", + "【alignment】 : Alignment 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json new file mode 100644 index 00000000..b78005e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Caja de tamaño fraccional", + "info": "Puede contener un componente hijo, especifica la proporción de ancho y alto, limita el área del componente hijo al ancho y alto del contenedor padre multiplicado por cada proporción, y la alineación.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FractionallySizedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【widthFactor】 : Proporción de ancho 【double】", + "【heightFactor】 : Proporción de alto 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json new file mode 100644 index 00000000..0dc0f2a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Boîte à taille fractionnée", + "info": "Peut contenir un composant enfant, spécifie le taux de largeur et de hauteur, limite la zone du composant enfant à la largeur et à la hauteur du conteneur parent * chaque taux, ainsi que l'alignement.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FractionallySizedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【widthFactor】 : Taux de largeur 【double】", + "【heightFactor】 : Taux de hauteur 【double】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json new file mode 100644 index 00000000..dd2e681f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Scatola a Frazione", + "info": "Può contenere un componente figlio, specifica la frazione di larghezza e altezza, limita l'area del componente figlio alla larghezza e altezza del contenitore padre * ciascuna frazione, e il modo di allineamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di FractionallySizedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【widthFactor】 : Frazione di larghezza 【double】", + "【heightFactor】 : Frazione di altezza 【double】", + "【alignment】 : Modo di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json new file mode 100644 index 00000000..ca0219d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "分率ボックス", + "info": "子コンポーネントを収容し、幅と高さの分率を指定し、子コンポーネントの領域を親コンテナの幅と高さ×各分率に制限し、および配置方法alignmentを指定します。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【widthFactor】 : 幅分率 【double】", + "【heightFactor】 : 高さ分率 【double】", + "【alignment】 : 配置方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json new file mode 100644 index 00000000..a9b98329 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "분율 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, 너비와 높이의 분율을 지정하여 하위 컴포넌트의 영역을 부모 컨테이너의 너비와 높이에 각 분율을 곱한 값으로 제한하고, 정렬 방식을 지정합니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FractionallySizedBox 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【widthFactor】 : 너비 분율 【double】", + "【heightFactor】 : 높이 분율 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json new file mode 100644 index 00000000..291294b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Caixa de Tamanho Fracionado", + "info": "Pode conter um componente filho, especifica a taxa de largura e altura, limitando a área do componente filho à largura e altura do contêiner pai * cada taxa, e o alinhamento.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do FractionallySizedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【widthFactor】 : Taxa de largura 【double】", + "【heightFactor】 : Taxa de altura 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json new file mode 100644 index 00000000..65d44be0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/FractionallySizedBox/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 82, + "name": "FractionallySizedBox", + "localName": "Дробный контейнер", + "info": "Может содержать один дочерний компонент, задает дробные значения ширины и высоты, ограничивая область дочернего компонента шириной и высотой родительского контейнера, умноженными на соответствующие дроби, а также способ выравнивания alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FractionallySizedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【widthFactor】 : Дробное значение ширины 【double】", + "【heightFactor】 : Дробное значение высоты 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json new file mode 100644 index 00000000..05561221 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignoriere Klicks", + "info": "Enthält ein Kind-Widget und kann durch Festlegen der Eigenschaft ignoring entscheiden, ob das Kind Gestenereignisse ignoriert. Es selbst empfängt keine Ereignisse.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IgnorePointer", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【ignoring】 : Ob Ereignisse ignoriert werden sollen 【bool】", + "Wie unten gezeigt, wenn der Switch ausgewählt ist, ist ignoring true, und die Schaltflächenereignisse werden gesperrt und können nicht geklickt werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json new file mode 100644 index 00000000..9c643e1e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignore Click", + "info": "Contains a child component, and it can decide whether the child ignores gesture events by specifying the ignoring property. It does not accept events itself.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IgnorePointer", + "desc": [ + "【child】 : Child component 【Widget】", + "【ignoring】 : Whether to ignore events 【bool】", + "As shown below, when the Switch is selected, ignoring is true, and the button event will be locked and cannot be clicked." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json new file mode 100644 index 00000000..1c1c9c8f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorar clic", + "info": "Contiene un componente hijo, y puede decidir si el hijo ignora los eventos de gestos especificando la propiedad ignoring, mientras que él mismo no acepta eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IgnorePointer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【ignoring】 : Si se ignoran los eventos 【bool】", + "A continuación, cuando el Switch está seleccionado, ignoring es true, y los eventos del botón se bloquearán, no se podrá hacer clic." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json new file mode 100644 index 00000000..9cf81b6e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorer les clics", + "info": "Contient un composant enfant, et peut décider si l'enfant ignore les événements de geste en spécifiant la propriété ignoring, lui-même n'accepte pas les événements.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IgnorePointer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【ignoring】 : Ignorer les événements 【bool】", + "Comme ci-dessous, lorsque le Switch est sélectionné, ignoring est true, l'événement du bouton sera verrouillé et ne pourra pas être cliqué." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json new file mode 100644 index 00000000..cae053ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignora Clic", + "info": "Contiene un componente figlio e può decidere se il figlio ignora gli eventi del gesto specificando l'attributo ignoring, mentre esso stesso non accetta eventi.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IgnorePointer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【ignoring】 : Se ignorare gli eventi 【bool】", + "Come mostrato di seguito, quando Switch è selezionato, ignoring è true e l'evento del pulsante sarà bloccato, non cliccabile." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json new file mode 100644 index 00000000..433c594c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "クリックを無視", + "info": "子コンポーネントを含み、ignoring属性を指定することで、子がジェスチャーイベントを無視するかどうかを決定できます。それ自体はイベントを受け取りません。", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointerの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【ignoring】 : イベントを無視するかどうか 【bool】", + "以下のように、Switchが選択されている場合、ignoringがtrueになり、ボタンイベントがロックされ、クリックできなくなります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json new file mode 100644 index 00000000..15024f6d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "클릭 무시", + "info": "하위 위젯을 포함하며, ignoring 속성을 지정하여 하위 위젯이 제스처 이벤트를 무시할지 여부를 결정할 수 있습니다. 그 자체는 이벤트를 받지 않습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IgnorePointer 기본 사용법", + "desc": [ + "【child】 : 하위 위젯 【Widget】", + "【ignoring】 : 이벤트 무시 여부 【bool】", + "아래 예시에서 Switch가 선택되면 ignoring이 true가 되어 버튼 이벤트가 잠기고 클릭할 수 없게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json new file mode 100644 index 00000000..27dfa846 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Ignorar Cliques", + "info": "Contém um componente filho e pode decidir se o filho ignora eventos de gestos especificando o atributo ignoring, ele próprio não aceita eventos.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IgnorePointer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【ignoring】 : Se deve ignorar eventos 【bool】", + "Abaixo, quando o Switch está selecionado, ignoring é true, e o evento do botão será bloqueado, não podendo ser clicado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json new file mode 100644 index 00000000..5acc7320 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IgnorePointer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 292, + "name": "IgnorePointer", + "localName": "Игнорировать клик", + "info": "Содержит дочерний компонент, который может игнорировать жестовые события в зависимости от указанного свойства ignoring, сам по себе не принимает события.", + "lever": 4, + "family": 2, + "linkIds": [ + 295, + 146, + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IgnorePointer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【ignoring】 : Игнорировать ли события 【bool】", + "Как показано ниже, когда Switch выбран, ignoring становится true, и события кнопки блокируются, делая её неактивной для кликов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json new file mode 100644 index 00000000..03f46e2e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Bildfilter", + "info": "Mit dem ImageFilter-Bildfilter können beliebige Komponenten mit Effekten wie Gaußscher Unschärfe, Farbfiltern, Transformationen usw. verarbeitet werden.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Gaußsche Unschärfe", + "desc": [ + "【imageFilter】 : Bildfilter 【ImageFilter】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Farbeffekt", + "desc": [ + "Farbfilter wird durch das ColorFilter-Objekt implementiert." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Transformationseffekt", + "desc": [ + "Matrix-Transformation durch ImageFilter.matrix-Konstruktion, aber eher unbrauchbar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json new file mode 100644 index 00000000..3501a59e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Image Filter", + "info": "Through the ImageFilter image filter, any component can be processed with special effects, including but not limited to Gaussian blur, color filter, transformation, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Gaussian Blur", + "desc": [ + "【imageFilter】 : Image filter 【ImageFilter】", + "【child】 : Child component 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Color Effect", + "desc": [ + "Achieve color filter through the ColorFilter object." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Transformation Effect", + "desc": [ + "Perform matrix transformation through the ImageFilter.matrix constructor, but it is relatively weak." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json new file mode 100644 index 00000000..66a8d1dd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro de imagen", + "info": "Con el filtro de imagen ImageFilter, se pueden aplicar efectos especiales a cualquier componente, incluyendo pero no limitado a desenfoque gaussiano, filtros de color, transformaciones, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Desenfoque gaussiano ImageFilter", + "desc": [ + "【imageFilter】 : Filtro de imagen 【ImageFilter】", + "【child】 : Componente hijo 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Efecto de filtro de color ImageFilter", + "desc": [ + "Se implementa un filtro de color a través del objeto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Efecto de transformación ImageFilter", + "desc": [ + "Se realiza una transformación de matriz a través de la construcción ImageFilter.matrix, pero es bastante limitado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json new file mode 100644 index 00000000..a9b78902 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtre d'image", + "info": "Avec le filtre d'image ImageFilter, vous pouvez appliquer des effets spéciaux à n'importe quel composant, y compris mais sans s'y limiter, le flou gaussien, les filtres de couleur, les transformations, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter Flou Gaussien", + "desc": [ + "【imageFilter】 : Filtre d'image 【ImageFilter】", + "【child】 : Composant enfant 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter Effet de Filtre de Couleur", + "desc": [ + "Réalisez un filtre de couleur via l'objet ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter Effet de Transformation", + "desc": [ + "Effectuez une transformation matricielle via la construction ImageFilter.matrix, mais c'est assez limité." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json new file mode 100644 index 00000000..49690509 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro Immagine", + "info": "Con il filtro immagine ImageFilter, è possibile applicare effetti speciali a qualsiasi componente, inclusi ma non limitati a sfocatura gaussiana, filtri colore, trasformazioni, ecc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Sfocatura Gaussiana ImageFilter", + "desc": [ + "【imageFilter】 : Filtro immagine 【ImageFilter】", + "【child】 : Componente figlio 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Effetto Filtro Colore ImageFilter", + "desc": [ + "Implementazione del filtro colore tramite l'oggetto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Effetto Trasformazione ImageFilter", + "desc": [ + "Trasformazione della matrice tramite la costruzione ImageFilter.matrix, ma è piuttosto limitata." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json new file mode 100644 index 00000000..53bdef98 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "画像フィルター", + "info": "ImageFilter 画像フィルターを使用すると、任意のコンポーネントに特殊効果を適用できます。これには、ガウスぼかし、カラーフィルター、変形などが含まれます。", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter ガウスぼかし", + "desc": [ + "【imageFilter】 : 画像フィルター 【ImageFilter】", + "【child】 : 子コンポーネント 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter カラーフィルター効果", + "desc": [ + "ColorFilter オブジェクトを使用してカラーフィルターを実現します。" + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 変形効果", + "desc": [ + "ImageFilter.matrix コンストラクタを使用して行列変換を行いますが、あまり役に立ちません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json new file mode 100644 index 00000000..7b4088e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "이미지 필터", + "info": "ImageFilter 이미지 필터를 통해 모든 컴포넌트에 효과를 적용할 수 있습니다. 이는 가우시안 블러, 색상 필터, 변환 등을 포함하지만 이에 국한되지 않습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter 가우시안 블러", + "desc": [ + "【imageFilter】 : 이미지 필터 【ImageFilter】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter 색상 필터 효과", + "desc": [ + "ColorFilter 객체를 통해 색상 필터를 구현합니다." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter 변환 효과", + "desc": [ + "ImageFilter.matrix 생성자를 통해 매트릭스 변환을 수행하지만, 다소 실용성이 떨어집니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json new file mode 100644 index 00000000..da190d40 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Filtro de Imagem", + "info": "Com o filtro de imagem ImageFilter, você pode aplicar efeitos especiais a qualquer componente, incluindo, mas não se limitando a, desfoque gaussiano, filtros de cores, transformações, etc.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "Desfoque Gaussiano ImageFilter", + "desc": [ + "【imageFilter】 : filtro de imagem 【ImageFilter】", + "【child】 : componente filho 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "Efeito de Filtro de Cor ImageFilter", + "desc": [ + "Implementa o filtro de cor através do objeto ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "Efeito de Transformação ImageFilter", + "desc": [ + "Realiza transformações de matriz através da construção ImageFilter.matrix, mas é um pouco limitado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json new file mode 100644 index 00000000..6a00e147 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ImageFiltered/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 357, + "name": "ImageFiltered", + "localName": "Фильтр изображений", + "info": "С помощью фильтра изображений ImageFilter можно применять эффекты к любому компоненту, включая, но не ограничиваясь, размытием по Гауссу, цветовыми фильтрами, преобразованиями и т.д.", + "lever": 4, + "family": 2, + "linkIds": [ + 278, + 88 + ], + "nodes": [ + { + "file": "node1_blur.dart", + "name": "ImageFilter размытие по Гауссу", + "desc": [ + "【imageFilter】 : фильтр изображений 【ImageFilter】", + "【child】 : дочерний компонент 【Widget】" + ] + }, + { + "file": "node2_color.dart", + "name": "ImageFilter цветовой фильтр", + "desc": [ + "Реализация цветового фильтра через объект ColorFilter." + ] + }, + { + "file": "node3_matrix.dart", + "name": "ImageFilter эффект преобразования", + "desc": [ + "Преобразование матрицы через конструкцию ImageFilter.matrix, но это довольно неудобно." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json new file mode 100644 index 00000000..9a0619c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Intrinsische Höhe", + "info": "Eine Komponente, die die Größe ihrer Kindelemente basierend auf deren intrinsischer Höhe anpasst. Sie kann viele Layoutprobleme lösen, ist aber relativ teuer.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IntrinsicHeight", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "Wie im Beispiel: Die Höhe auf der linken Seite ist variabel, die Höhe in der Mitte ist fest, und die Höhe auf der rechten Seite nimmt den höchsten Wert der beiden vorherigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json new file mode 100644 index 00000000..427b01c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Intrinsic Height", + "info": "A component that adjusts the size of its children based on their intrinsic height, which can solve many layout issues, but is relatively expensive.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IntrinsicHeight", + "desc": [ + "【child】: Child component 【Widget】", + "As shown in the example: the height on the left can vary, the height in the middle is fixed, and the height on the right takes the highest value of the previous two." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json new file mode 100644 index 00000000..7bc26a1a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altura intrínseca", + "info": "Un componente que ajusta el tamaño de sus hijos según la altura intrínseca de los elementos hijos, puede resolver muchos problemas de diseño, pero es relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IntrinsicHeight", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "Como en el ejemplo: la altura del lado izquierdo puede variar, la altura del centro es fija, y la altura del lado derecho toma el valor más alto de los dos anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json new file mode 100644 index 00000000..e20b1c23 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Hauteur intrinsèque", + "info": "Un composant qui ajuste la taille de ses enfants en fonction de leur hauteur intrinsèque, résout de nombreux problèmes de mise en page, mais est relativement coûteux.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IntrinsicHeight", + "desc": [ + "【child】 : Enfant 【Widget】", + "Comme dans l'exemple : la hauteur de gauche est variable, la hauteur du milieu est fixe, la hauteur de droite prend la valeur maximale des deux premières." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json new file mode 100644 index 00000000..14ca5a63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altezza intrinseca", + "info": "Un componente che regola le dimensioni dei suoi elementi figli in base all'altezza intrinseca degli elementi figli, risolve molti problemi di layout, ma è relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IntrinsicHeight", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Come nell'esempio: l'altezza a sinistra è variabile, l'altezza al centro è fissa, l'altezza a destra prende il valore più alto dei due precedenti." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json new file mode 100644 index 00000000..cbaaf8df --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "固有高", + "info": "子要素の固有の高さに基づいてその子要素のサイズを調整するコンポーネントで、多くのレイアウトの問題を解決できますが、比較的高価です。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeightの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例: 左側の高さは可変、中央の高さは固定、右側の高さは前2つの最大値を取ります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json new file mode 100644 index 00000000..de0dd7d9 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "고유 높이", + "info": "자식 요소의 고유 높이에 따라 자식 요소의 크기를 조정하는 컴포넌트로, 많은 레이아웃 문제를 해결할 수 있지만 상대적으로 비용이 많이 듭니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicHeight 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "예시: 왼쪽 높이는 변동 가능, 중간 높이는 고정, 오른쪽 높이는 앞 두 개의 최대값을 취합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json new file mode 100644 index 00000000..b0ba3243 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Altura Intrínseca", + "info": "Um componente que ajusta o tamanho dos seus filhos com base na altura intrínseca dos elementos filhos, pode resolver muitos problemas de layout, mas é relativamente caro.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IntrinsicHeight", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Como no exemplo: a altura à esquerda pode variar, a altura do meio é fixa, e a altura à direita assume o valor mais alto dos dois anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json new file mode 100644 index 00000000..560076bf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicHeight/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 298, + "name": "IntrinsicHeight", + "localName": "Встроенная высота", + "info": "Компонент, который регулирует размер своих дочерних элементов в зависимости от их собственной высоты, может решить множество проблем с макетом, но относительно дорог.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IntrinsicHeight", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Как в примере: высота слева может изменяться, высота в середине фиксирована, высота справа берет максимальное значение из первых двух." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json new file mode 100644 index 00000000..441cf9af --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Intrinsische Breite", + "info": "Eine Komponente, die die Größe ihrer Kinder basierend auf deren intrinsischer Breite anpasst, kann viele Layoutprobleme lösen, ist jedoch relativ teuer.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von IntrinsicWidth", + "desc": [ + "【child】: Kindkomponente 【Widget】", + "Wie im Beispiel: Die Breite oben kann variieren, die Breite in der Mitte ist fest, und die Breite unten nimmt den höchsten Wert der beiden vorherigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json new file mode 100644 index 00000000..9b103bc3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Intrinsic Width", + "info": "A component that adjusts the size of its child elements based on their intrinsic width, which can solve many layout issues but is relatively expensive.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of IntrinsicWidth", + "desc": [ + "【child】: Child component 【Widget】", + "As shown in the example: the width above can be changed, the width in the middle is fixed, and the width below takes the highest value of the former two." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json new file mode 100644 index 00000000..4db7a69f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Ancho intrínseco", + "info": "Componente que ajusta el tamaño de sus elementos secundarios según el ancho intrínseco de los mismos, puede resolver muchos problemas de diseño, pero es relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de IntrinsicWidth", + "desc": [ + "【child】 : Componente secundario 【Widget】", + "Como en el ejemplo: el ancho de arriba puede variar, el ancho del medio es fijo, el ancho de abajo toma el valor más alto de los dos anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json new file mode 100644 index 00000000..1b96204e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Largeur intrinsèque", + "info": "Un composant qui ajuste la taille de ses enfants en fonction de leur largeur intrinsèque, résout de nombreux problèmes de mise en page, mais est relativement coûteux.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'IntrinsicWidth", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Comme dans l'exemple : la largeur du haut peut varier, celle du milieu est fixe, et celle du bas prend la valeur maximale des deux précédentes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json new file mode 100644 index 00000000..91edb57c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Larghezza intrinseca", + "info": "Un componente che regola le dimensioni dei suoi elementi figli in base alla larghezza intrinseca degli elementi figli, risolve molti problemi di layout, ma è relativamente costoso.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di IntrinsicWidth", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Come nell'esempio: la larghezza superiore è variabile, quella centrale è fissa, quella inferiore prende il valore più alto tra le prime due." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json new file mode 100644 index 00000000..eecce94f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "固有幅", + "info": "子要素の固有の幅に基づいて子要素のサイズを調整するコンポーネントで、多くのレイアウトの問題を解決できますが、比較的高コストです。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidthの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例: 上の幅は可変、中間の幅は固定、下の幅は前2つの最大値を取ります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json new file mode 100644 index 00000000..a0fd16f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "고유 너비", + "info": "자식 요소의 고유 너비에 따라 크기를 조정하는 컴포넌트로, 많은 레이아웃 문제를 해결할 수 있지만 상대적으로 비용이 많이 듭니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IntrinsicWidth 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "예시: 위쪽 너비는 변동 가능, 중간 너비는 고정, 아래쪽 너비는 앞 두 값 중 최대값을 취합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json new file mode 100644 index 00000000..908e1280 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Largura Intrínseca", + "info": "Componente que ajusta o tamanho dos seus elementos filhos com base na largura intrínseca dos mesmos, resolvendo muitos problemas de layout, mas relativamente caro.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do IntrinsicWidth", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Como no exemplo: a largura acima pode variar, a largura do meio é fixa, e a largura abaixo assume o valor mais alto dos dois anteriores." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json new file mode 100644 index 00000000..af6625d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/IntrinsicWidth/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 297, + "name": "IntrinsicWidth", + "localName": "Встроенная ширина", + "info": "Компонент, который регулирует размер своих дочерних элементов в зависимости от их внутренней ширины, решает множество проблем с макетом, но относительно дорогостоящий.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование IntrinsicWidth", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Как в примере: ширина сверху может изменяться, ширина в середине фиксирована, ширина снизу принимает максимальное значение из первых двух." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json new file mode 100644 index 00000000..a084cd4f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Layout-Builder", + "info": "Kann die Größe des übergeordneten Containers erkennen und eine benutzerdefinierte Layout basierend auf den Abmessungen des übergeordneten Containers erstellen. Es ist ein sehr nützliches Layout-Komponente.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegendes Verständnis von LayoutBuilder", + "desc": [ + "【builder】: Layout-Builder 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Anpassungsfähiges Layout von LayoutBuilder", + "desc": [ + "Kann das Design der Komponentenanzeige basierend auf der Größe des Bereichs durchführen.", + "Zum Beispiel können unterschiedliche Layout-Strukturen in verschiedenen Breitenbereichen angezeigt werden.", + "Schließlich ist es an vielen Stellen nicht einfach, den Bereich der übergeordneten Komponente zu erhalten, und die Verwendung von LayoutBuilder wird sehr angenehm sein." + ] + }, + { + "file": "node3_expend.dart", + "name": "Erweiterte Verwendung von LayoutBuilder", + "desc": [ + "Verwenden Sie TextPainter, um die Anzahl der Textzeilen zu überprüfen und die Funktion zum Erweitern oder Reduzieren zu implementieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json new file mode 100644 index 00000000..266ade59 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Layout Constructor", + "info": "Can detect the size of the parent container and complete custom layouts based on the size information of the parent container. It is a very practical layout component.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Understanding of LayoutBuilder", + "desc": [ + "【builder】: Layout Constructor 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptive Layout of LayoutBuilder", + "desc": [ + "Can design component display based on the size of the area.", + "For example, displaying different layout structures in different width areas.", + "After all, it is not easy to obtain the parent component area in many places, and using LayoutBuilder will be very refreshing." + ] + }, + { + "file": "node3_expend.dart", + "name": "Expanded Use of LayoutBuilder", + "desc": [ + "Use TextPainter to detect the number of lines of text to implement expand or collapse functionality." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json new file mode 100644 index 00000000..e88b9cec --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Constructor de diseño", + "info": "Puede detectar el tamaño del área del contenedor padre y completar el diseño personalizado según la información de tamaño del contenedor padre. Es un componente de diseño muy práctico.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conocimiento básico de LayoutBuilder", + "desc": [ + "【builder】: Constructor de diseño 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptación de diseño de LayoutBuilder", + "desc": [ + "Puede diseñar la presentación de componentes según el tamaño del área.", + "Por ejemplo, mostrar diferentes estructuras de diseño en áreas de diferentes anchos.", + "Después de todo, en muchos lugares no es fácil obtener el área del componente padre, y usar LayoutBuilder será muy útil." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso extendido de LayoutBuilder", + "desc": [ + "Usar TextPainter para detectar el número de líneas de texto y lograr la función de expandir o contraer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json new file mode 100644 index 00000000..24c1445f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Constructeur de mise en page", + "info": "Peut détecter la taille de la zone du conteneur parent et compléter la mise en page personnalisée en fonction des informations de taille du conteneur parent. C'est un composant de mise en page très pratique.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Connaissance de base de LayoutBuilder", + "desc": [ + "【builder】 : Constructeur de mise en page 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptation de la mise en page de LayoutBuilder", + "desc": [ + "Peut concevoir l'affichage des composants en fonction de la taille de la zone.", + "Par exemple, afficher différentes structures de mise en page dans des zones de largeur différente.", + "Après tout, il n'est pas facile d'obtenir la zone du composant parent dans de nombreux endroits, l'utilisation de LayoutBuilder sera très agréable." + ] + }, + { + "file": "node3_expend.dart", + "name": "Utilisation étendue de LayoutBuilder", + "desc": [ + "Utilisez TextPainter pour détecter le nombre de lignes de texte et implémenter la fonction d'expansion ou de réduction." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json new file mode 100644 index 00000000..c1ac0694 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Costruttore di layout", + "info": "Può rilevare le dimensioni dell'area del contenitore padre e completare il layout personalizzato in base alle informazioni sulle dimensioni del contenitore padre. È un componente di layout molto pratico.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conoscenza di base di LayoutBuilder", + "desc": [ + "【builder】: Costruttore di layout 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adattamento del layout di LayoutBuilder", + "desc": [ + "È possibile progettare la visualizzazione dei componenti in base alle dimensioni dell'area.", + "Ad esempio, mostrare diverse strutture di layout in aree di larghezza diversa.", + "Dopotutto, in molti posti non è facile ottenere l'area del componente padre, usare LayoutBuilder sarà molto utile." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso esteso di LayoutBuilder", + "desc": [ + "Usa TextPainter per rilevare il numero di righe del testo e implementare la funzione di espansione o di chiusura." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json new file mode 100644 index 00000000..2e7598ac --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "レイアウトビルダー", + "info": "親コンテナの領域サイズを検出し、親コンテナのサイズ情報に基づいてカスタムレイアウトを完成させることができます。非常に実用的なレイアウトコンポーネントです。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilderの基本認識", + "desc": [ + "【builder】 : レイアウトビルダー 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilderの適応レイアウト", + "desc": [ + "領域のサイズに基づいてコンポーネントの表示デザインを行うことができます。\"", + "たとえば、異なる幅の領域で異なるレイアウト構造を表示します。\"", + "結局のところ、多くの場所で親コンポーネントの領域を取得するのは容易ではなく、LayoutBuilderを使用すると非常に便利です。" + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilderの展開使用", + "desc": [ + "TextPainterを使用してテキストの行数を検出し、展開または折りたたみ機能を実装します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json new file mode 100644 index 00000000..ace16c97 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "레이아웃 빌더", + "info": "부모 컨테이너의 영역 크기를 감지하고, 부모 컨테이너의 크기 정보를 기반으로 사용자 정의 레이아웃을 완성할 수 있습니다. 매우 실용적인 레이아웃 구성 요소입니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LayoutBuilder 기본 이해", + "desc": [ + "【builder】 : 레이아웃 빌더 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "LayoutBuilder의 적응형 레이아웃", + "desc": [ + "영역의 크기에 따라 컴포넌트 디스플레이를 설계할 수 있습니다.", + "예를 들어, 다른 너비 영역에서 다른 레이아웃 구조를 표시할 수 있습니다.", + "결국 많은 곳에서 부모 컴포넌트 영역을 쉽게 얻을 수 없기 때문에 LayoutBuilder를 사용하면 매우 편리합니다." + ] + }, + { + "file": "node3_expend.dart", + "name": "LayoutBuilder의 확장 사용", + "desc": [ + "TextPainter를 사용하여 텍스트의 줄 수를 감지하고, 확장 또는 축소 기능을 구현합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json new file mode 100644 index 00000000..5c983efd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Construtor de Layout", + "info": "Pode detectar o tamanho da área do contêiner pai e completar o layout personalizado de acordo com as informações de dimensão do contêiner pai. É um componente de layout muito útil.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Conhecimento Básico do LayoutBuilder", + "desc": [ + "【builder】 : Construtor de Layout 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Adaptação de Layout do LayoutBuilder", + "desc": [ + "Pode projetar a exibição dos componentes de acordo com o tamanho da área.", + "Por exemplo, exibir diferentes estruturas de layout em áreas de diferentes larguras.", + "Afinal, em muitos lugares não é fácil obter a área do componente pai, usar o LayoutBuilder será muito conveniente." + ] + }, + { + "file": "node3_expend.dart", + "name": "Uso Expandido do LayoutBuilder", + "desc": [ + "Usar TextPainter para detectar o número de linhas de texto e implementar a função de expandir ou recolher." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json new file mode 100644 index 00000000..a0fa492e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LayoutBuilder/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 287, + "name": "LayoutBuilder", + "localName": "Конструктор макета", + "info": "Может обнаружить размер области родительского контейнера и выполнить пользовательский макет на основе информации о размере родительского контейнера. Это очень полезный компонент макета.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное понимание LayoutBuilder", + "desc": [ + "【builder】 : Конструктор макета 【LayoutWidgetBuilder】" + ] + }, + { + "file": "node2_fit.dart", + "name": "Адаптация макета LayoutBuilder", + "desc": [ + "Можно проектировать отображение компонентов в зависимости от размера области.", + "Например, отображать различные структуры макета в областях с разной шириной.", + "Ведь во многих местах нелегко получить область родительского компонента, и использование LayoutBuilder будет очень удобным." + ] + }, + { + "file": "node3_expend.dart", + "name": "Расширенное использование LayoutBuilder", + "desc": [ + "Использование TextPainter для обнаружения количества строк текста и реализации функции развертывания или сворачивания." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json new file mode 100644 index 00000000..658010b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Begrenzungsbox", + "info": "Kann ein Unterelement aufnehmen und den Bereich des Unterelements durch Angabe der maximalen Breite und Höhe begrenzen.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LimitedBox", + "desc": [ + "【child】 : Unterelement 【Widget】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json new file mode 100644 index 00000000..0fa69576 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Limited Box", + "info": "Can contain one child component, limiting the area where the child component can reside by specifying the maximum width and height.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LimitedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【maxHeight】: Maximum height 【double】", + "【maxWidth】: Maximum width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json new file mode 100644 index 00000000..3558aa47 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Caja Limitada", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y alto máximos.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LimitedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json new file mode 100644 index 00000000..99cb8f71 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Boîte limitée", + "info": "Peut contenir un composant enfant, en limitant la zone de ce composant par une largeur et une hauteur maximales spécifiées.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LimitedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json new file mode 100644 index 00000000..61900467 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Scatola Limitata", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando l'altezza e la larghezza massime.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di LimitedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json new file mode 100644 index 00000000..2bb36c0b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "制限ボックス", + "info": "子コンポーネントを1つ収容でき、最大幅と高さを指定して子コンポーネントの収容領域を制限します。", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBoxの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json new file mode 100644 index 00000000..6123b09c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "제한 상자", + "info": "하나의 하위 구성 요소를 수용할 수 있으며, 최대 너비와 높이를 지정하여 하위 구성 요소의 영역을 제한합니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox 기본 사용", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json new file mode 100644 index 00000000..a84a0299 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Caixa Limitada", + "info": "Pode conter um componente filho, limitando a área onde o componente filho pode residir, especificando a largura e altura máximas.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LimitedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json new file mode 100644 index 00000000..5ac51440 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/LimitedBox/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 79, + "name": "LimitedBox", + "localName": "Ограничивающая коробка", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента путем указания максимальной ширины и высоты.", + "lever": 3, + "family": 2, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LimitedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json new file mode 100644 index 00000000..a4346c4e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Verschwindende Komponente", + "info": "Kann eine Unterkomponente aufnehmen und deren Verschwinden ändern. Das Attribut offstage auf true bedeutet versteckt.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LimitedBox", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【offstage】 : Ob verschwunden 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json new file mode 100644 index 00000000..23e3c8ea --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Disappearing Component", + "info": "Can contain a child component, and can change its visibility. The offstage property set to true means hidden.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LimitedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【offstage】: Whether to disappear 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json new file mode 100644 index 00000000..7639fe92 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Desaparecido", + "info": "Puede contener un componente hijo y cambiar su visibilidad. Si la propiedad offstage es true, indica que está oculto.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LimitedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【offstage】 : Si está desaparecido 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json new file mode 100644 index 00000000..491cda0f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Composant disparu", + "info": "Peut contenir un composant enfant et peut modifier sa disparition ou non. L'attribut offstage à true signifie qu'il est caché.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LimitedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【offstage】 : Disparaît ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json new file mode 100644 index 00000000..ab1d8569 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Scomparso", + "info": "Può contenere un componente figlio e può cambiarne la visibilità. L'attributo offstage è true per indicare che è nascosto.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di LimitedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【offstage】 : Se è nascosto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json new file mode 100644 index 00000000..4dd62d85 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "非表示コンポーネント", + "info": "1つの子コンポーネントを収容でき、その表示・非表示を変更できます。offstage属性がtrueの場合、非表示になります。", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBoxの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【offstage】 : 非表示かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json new file mode 100644 index 00000000..fb751e28 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "사라진 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 그 컴포넌트의 사라짐 여부를 변경할 수 있습니다. offstage 속성이 true이면 숨겨집니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LimitedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【offstage】 : 사라짐 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json new file mode 100644 index 00000000..475ec95a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Componente Desaparecido", + "info": "Pode conter um componente filho e alterar a sua visibilidade. A propriedade offstage é true para ocultar.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LimitedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【offstage】 : Se desaparece 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json new file mode 100644 index 00000000..9f3af1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OffStage/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 71, + "name": "Offstage", + "localName": "Исчезающий компонент", + "info": "Может содержать один дочерний компонент, можно изменить его видимость. Свойство offstage, равное true, означает скрытие.", + "lever": 3, + "family": 2, + "linkIds": [ + 10 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LimitedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【offstage】 : Видимость 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json new file mode 100644 index 00000000..ca1011dc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparenz", + "info": "Kann ein Kindelement aufnehmen und dessen Transparenz in den Opazitätswert ändern, Opazität liegt zwischen 0 und 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Opacity", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【opacity】 : Transparenz 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json new file mode 100644 index 00000000..352c2e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparency", + "info": "Can contain a child component, changing its transparency to the opacity value, where opacity is between 0 and 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Opacity", + "desc": [ + "【child】 : Child component 【Widget】", + "【opacity】 : Transparency 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json new file mode 100644 index 00000000..f8028eca --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Transparencia", + "info": "Puede contener un componente hijo y cambiar su transparencia al valor de opacity, donde opacity está entre 0 y 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Opacity", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【opacity】 : Transparencia 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json new file mode 100644 index 00000000..0a1e98d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Opacité", + "info": "Peut contenir un composant enfant, transformant sa transparence en valeur d'opacité, l'opacité est comprise entre 0 et 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Opacity", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【opacity】 : Opacité 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json new file mode 100644 index 00000000..d5191899 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Trasparenza", + "info": "Può contenere un componente figlio, trasformandone la trasparenza in un valore di opacità, dove l'opacità è compresa tra 0 e 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Opacity", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【opacity】 : Trasparenza 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json new file mode 100644 index 00000000..cf759bb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "不透明度", + "info": "子コンポーネントを1つ収容し、その不透明度をopacity値に変更できます。opacityは0〜1の間です。", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacityの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【opacity】 : 不透明度0〜1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json new file mode 100644 index 00000000..41a13f67 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "투명도", + "info": "하위 컴포넌트를 포함할 수 있으며, 그 투명도를 opacity 값으로 변경합니다. opacity는 0~1 사이입니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Opacity 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【opacity】 : 투명도 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json new file mode 100644 index 00000000..faafe027 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Opacidade", + "info": "Pode conter um componente filho, alterando a sua opacidade para o valor de opacity, onde opacity está entre 0 e 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Opacity", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【opacity】 : Opacidade 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json new file mode 100644 index 00000000..19a9bc74 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Opacity/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 73, + "name": "Opacity", + "localName": "Прозрачность", + "info": "Может содержать один дочерний компонент, изменяя его прозрачность на значение opacity, где opacity находится в диапазоне от 0 до 1.", + "lever": 3, + "family": 2, + "linkIds": [ + 89, + 118 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Opacity", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【opacity】 : Прозрачность 0~1 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json new file mode 100644 index 00000000..f8e35218 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Überlaufbox", + "info": "Kann ein Kindelement aufnehmen, und das Kindelement darf den Bereich des Elternelements überlaufen. Es kann der maximale und minimale Bereich für Breite und Höhe festgelegt werden und verfügt über eine Ausrichtungseigenschaft alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OverflowBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【minWidth】 : Minimale Breite 【double】", + "【minHeight】 : Minimale Höhe 【double】", + "【maxHeight】 : Maximale Höhe 【double】", + "【maxWidth】 : Maximale Breite 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json new file mode 100644 index 00000000..decab995 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Overflow Box", + "info": "Can contain a child component, and the child component is allowed to overflow the parent component area. The maximum and minimum width and height can be specified for constraints, and it has the alignment property.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OverflowBox", + "desc": [ + "【child】: Child component 【Widget】", + "【minWidth】: Minimum width 【double】", + "【minHeight】: Minimum height 【double】", + "【maxHeight】: Maximum height 【double】", + "【maxWidth】: Maximum width 【double】", + "【alignment】: Alignment 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json new file mode 100644 index 00000000..109703b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Caja de desbordamiento", + "info": "Puede contener un componente hijo, y el componente hijo puede desbordar el área del componente padre. Se pueden especificar áreas máximas y mínimas de ancho y alto para limitar, y tiene la propiedad de alineación alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OverflowBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【minWidth】 : Ancho mínimo 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Ancho máximo 【double】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json new file mode 100644 index 00000000..25b95564 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Boîte de débordement", + "info": "Peut contenir un composant enfant, et le composant enfant est autorisé à déborder de la zone du composant parent. Il est possible de spécifier les zones maximales et minimales de largeur et de hauteur pour les limiter, et il possède une propriété d'alignement.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de OverflowBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【minWidth】 : Largeur minimale 【double】", + "【minHeight】 : Hauteur minimale 【double】", + "【maxHeight】 : Hauteur maximale 【double】", + "【maxWidth】 : Largeur maximale 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json new file mode 100644 index 00000000..ca94efd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Scatola di overflow", + "info": "Può contenere un componente figlio e consente al componente figlio di fuoriuscire dall'area del componente padre. È possibile specificare le aree massime e minime di larghezza e altezza per i limiti e ha la proprietà di allineamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di OverflowBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【minWidth】 : Larghezza minima 【double】", + "【minHeight】 : Altezza minima 【double】", + "【maxHeight】 : Altezza massima 【double】", + "【maxWidth】 : Larghezza massima 【double】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json new file mode 100644 index 00000000..28db137c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "オーバーフローボックス", + "info": "子コンポーネントを収容でき、子コンポーネントは親コンポーネントの領域をオーバーフローすることができます。幅と高さの最大最小領域を指定して制限することができ、アライメント属性alignmentを持っています。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBoxの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【minWidth】 : 最小幅 【double】", + "【minHeight】 : 最小高さ 【double】", + "【maxHeight】 : 最大高さ 【double】", + "【maxWidth】 : 最大幅 【double】", + "【alignment】 : アライメント方法 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json new file mode 100644 index 00000000..1d253a68 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "오버플로우 박스", + "info": "하위 컴포넌트를 수용할 수 있으며, 하위 컴포넌트가 상위 컴포넌트 영역을 벗어날 수 있습니다. 최소 및 최대 너비와 높이를 지정하여 제한할 수 있으며, 정렬 속성 alignment를 가지고 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverflowBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【minWidth】 : 최소 너비 【double】", + "【minHeight】 : 최소 높이 【double】", + "【maxHeight】 : 최대 높이 【double】", + "【maxWidth】 : 최대 너비 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json new file mode 100644 index 00000000..12e6d9b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Caixa de Transbordamento", + "info": "Pode conter um componente filho, e o componente filho pode transbordar a área do componente pai. Pode especificar as áreas mínimas e máximas de largura e altura para restringir, e possui o atributo de alinhamento alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do OverflowBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【minWidth】 : Largura mínima 【double】", + "【minHeight】 : Altura mínima 【double】", + "【maxHeight】 : Altura máxima 【double】", + "【maxWidth】 : Largura máxima 【double】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json new file mode 100644 index 00000000..919e4dfe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/OverflowBox/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 83, + "name": "OverflowBox", + "localName": "Переполненная коробка", + "info": "Может содержать один дочерний компонент, и дочерний компонент может выходить за пределы области родительского компонента. Можно указать минимальные и максимальные области ширины и высоты для ограничения, имеет свойство выравнивания alignment.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OverflowBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【minWidth】 : Минимальная ширина 【double】", + "【minHeight】 : Минимальная высота 【double】", + "【maxHeight】 : Максимальная высота 【double】", + "【maxWidth】 : Максимальная ширина 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json new file mode 100644 index 00000000..510451de --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Abstandskomponente", + "info": "Kann ein Kindelement aufnehmen und fügt seinen eigenen Innenabstand hinzu, um den Platz des Kindelements zu begrenzen. Die Kerneigenschaft ist padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding gleicher Abstand auf allen Seiten", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【padding】 : Innenabstand auf allen vier Seiten 【EdgeInsetsGeometry】", + "EdgeInsets.all wird verwendet, um den gleichen Abstand auf allen vier Seiten festzulegen" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding einzelner Abstand", + "desc": [ + "EdgeInsets.only wird verwendet, um den gleichen Abstand auf allen vier Seiten festzulegen" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding Richtungsabstand", + "desc": [ + "EdgeInsets.symmetric wird verwendet, um den horizontalen und vertikalen Abstand festzulegen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json new file mode 100644 index 00000000..e5dd8395 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Margin Component", + "info": "Can accommodate a child component, adding its own padding to limit the child component's placement. The core property is padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding Equal Margin on All Sides", + "desc": [ + "【child】: Child component 【Widget】", + "【padding】: Inner four-sided margin 【EdgeInsetsGeometry】", + "EdgeInsets.all is used to define the same margin on all four sides" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding Individual Margin", + "desc": [ + "EdgeInsets.only is used to define the same margin on all four sides" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding Directional Margin", + "desc": [ + "EdgeInsets.symmetric is used to define horizontal and vertical margins" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json new file mode 100644 index 00000000..754298f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente de margen", + "info": "Puede contener un componente hijo, agregando su propio relleno interno para limitar el espacio ocupado por el componente hijo, la propiedad principal es el padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding con márgenes iguales en los cuatro lados", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno en los cuatro lados 【EdgeInsetsGeometry】", + "EdgeInsets.all se utiliza para definir el mismo margen en los cuatro lados" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding con márgenes individuales", + "desc": [ + "EdgeInsets.only se utiliza para definir márgenes específicos en los cuatro lados" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding con márgenes direccionales", + "desc": [ + "EdgeInsets.symmetric se utiliza para definir márgenes en las direcciones horizontal y vertical" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json new file mode 100644 index 00000000..f840c12e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Composant de marge", + "info": "Peut contenir un composant enfant, ajoute une marge intérieure pour limiter l'espace occupé par le composant enfant, la propriété principale est padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding avec marge égale sur les quatre côtés", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure sur les quatre côtés 【EdgeInsetsGeometry】", + "EdgeInsets.all est utilisé pour définir une marge égale sur les quatre côtés" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding avec marge individuelle", + "desc": [ + "EdgeInsets.only est utilisé pour définir une marge individuelle sur les quatre côtés" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding avec marge directionnelle", + "desc": [ + "EdgeInsets.symmetric est utilisé pour définir une marge horizontale et verticale" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json new file mode 100644 index 00000000..4dc40d3a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente margine", + "info": "Può contenere un componente figlio, aggiungendo il proprio padding interno per limitare il posizionamento del componente figlio, la proprietà principale è padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding margine uguale su tutti i lati", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【padding】 : margine interno su tutti i lati 【EdgeInsetsGeometry】\"", + "EdgeInsets.all viene utilizzato per definire lo stesso margine su tutti i lati" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding margine singolo", + "desc": [ + "EdgeInsets.only viene utilizzato per definire lo stesso margine su tutti i lati" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding margine direzionale", + "desc": [ + "EdgeInsets.symmetric viene utilizzato per definire i margini orizzontali e verticali" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json new file mode 100644 index 00000000..d4009c66 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "余白コンポーネント", + "info": "一つの子コンポーネントを収容し、自身の内側の余白を追加して子コンポーネントの占めるスペースを制限します。コア属性はpaddingです。", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding四面等余白", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の四辺の余白 【EdgeInsetsGeometry】", + "EdgeInsets.allは同じ四辺の余白を制限するために使用されます" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding単独余白", + "desc": [ + "EdgeInsets.onlyは同じ四辺の余白を制限するために使用されます" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding方向余白", + "desc": [ + "EdgeInsets.symmetricは水平方向と垂直方向の余白を制限するために使用されます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json new file mode 100644 index 00000000..bfa917b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "여백 컴포넌트", + "info": "하나의 자식 컴포넌트를 수용할 수 있으며, 자체 내부 여백을 추가하여 자식 컴포넌트의 공간을 제한합니다. 핵심 속성은 padding입니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding 사면 동일 여백", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 내부 사면 여백 【EdgeInsetsGeometry】\"", + "EdgeInsets.all은 동일한 사면 여백을 지정하는 데 사용됩니다." + ] + }, + { + "file": "node2_only.dart", + "name": "Padding 개별 여백", + "desc": [ + "EdgeInsets.only는 동일한 사면 여백을 지정하는 데 사용됩니다." + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding 방향 여백", + "desc": [ + "EdgeInsets.symmetric는 수평 및 수직 방향의 여백을 지정하는 데 사용됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json new file mode 100644 index 00000000..185dc4cf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Componente de Margem", + "info": "Pode acomodar um componente filho, adicionando o seu próprio preenchimento interno para limitar o espaço ocupado pelo componente filho, a propriedade central é o padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding com Margens Iguais em Todos os Lados", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Margens internas 【EdgeInsetsGeometry】\"", + "EdgeInsets.all é usado para definir margens iguais em todos os lados" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding com Margens Individuais", + "desc": [ + "EdgeInsets.only é usado para definir margens específicas" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding com Margens Direcionais", + "desc": [ + "EdgeInsets.symmetric é usado para definir margens horizontais e verticais" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json new file mode 100644 index 00000000..8cc5d92b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Padding/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 74, + "name": "Padding", + "localName": "Компонент отступов", + "info": "Может содержать один дочерний компонент, добавляя собственные внутренние отступы для ограничения места, занимаемого дочерним компонентом. Основное свойство - padding.", + "lever": 4, + "family": 2, + "linkIds": [ + 1, + 191 + ], + "nodes": [ + { + "file": "node1_all.dart", + "name": "Padding равные отступы со всех сторон", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "EdgeInsets.all используется для задания одинаковых отступов со всех сторон" + ] + }, + { + "file": "node2_only.dart", + "name": "Padding отдельные отступы", + "desc": [ + "EdgeInsets.only используется для задания одинаковых отступов со всех сторон" + ] + }, + { + "file": "node3_symmetric.dart", + "name": "Padding направленные отступы", + "desc": [ + "EdgeInsets.symmetric используется для задания отступов по горизонтали и вертикали" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json new file mode 100644 index 00000000..68dd4911 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Physikalisches Modul", + "info": "Ermöglicht das Zuschneiden von Unterkomponenten in runder oder quadratischer Form und ermöglicht die Angabe von Hintergrundfarbe, Rundung, Schattentiefe, Schattenfarbe und Zuschneideverhalten.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PhysicalModel", + "desc": [ + "【clipBehavior】: Zuschneideverhalten 【Clip】", + "【borderRadius】: Rundung 【BorderRadius】", + "【child】: Unterkomponente 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【shadowColor】: Schattenfarbe 【Color】", + "【shape】: Form 【BoxShape】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json new file mode 100644 index 00000000..b9351db8 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Physical Module", + "info": "Allows child components to be clipped according to circles and squares, and can specify background color, rounded corners, shadow depth, shadow color, and clipping behavior.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PhysicalModel", + "desc": [ + "【clipBehavior】: Clipping Behavior 【Clip】", + "【borderRadius】: Rounded Corners 【BorderRadius】", + "【child】: Child Component 【Widget】", + "【elevation】: Shadow Depth 【double】", + "【shadowColor】: Shadow Color 【Color】", + "【shape】: Shape 【BoxShape】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json new file mode 100644 index 00000000..e00162d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Módulo Físico", + "info": "Permite recortar los componentes secundarios en forma circular o cuadrada, y se puede especificar el color de fondo, el radio de las esquinas, la profundidad de la sombra, el color de la sombra y el comportamiento de recorte.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【borderRadius】 : Radio de las esquinas 【BorderRadius】", + "【child】 : Componente secundario 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】", + "【shadowColor】 : Color de la sombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json new file mode 100644 index 00000000..43674cf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Module Physique", + "info": "Permet de découper les composants enfants selon une forme circulaire ou carrée, et de spécifier la couleur de fond, les coins arrondis, la profondeur de l'ombre, la couleur de l'ombre et le comportement de découpe.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportement de découpe 【Clip】", + "【borderRadius】 : Coins arrondis 【BorderRadius】", + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【shape】 : Forme 【BoxShape】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json new file mode 100644 index 00000000..97130486 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Modulo Fisico", + "info": "Permette di ritagliare i componenti figli in base a forme circolari o quadrate, e di specificare il colore di sfondo, gli angoli arrotondati, la profondità dell'ombra, il colore dell'ombra e il comportamento di ritaglio.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【borderRadius】 : Angoli arrotondati 【BorderRadius】", + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json new file mode 100644 index 00000000..82ad3a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "物理モジュール", + "info": "子コンポーネントを円形や四角形でクリップし、背景色、角丸、影の深さ、影の色、クリップ動作を指定することができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModelの基本的な使用", + "desc": [ + "【clipBehavior】 : クリップ動作 【Clip】", + "【borderRadius】 : 角丸 【BorderRadius】", + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【shape】 : 形状 【BoxShape】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json new file mode 100644 index 00000000..8d153b75 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "물리 모듈", + "info": "자식 위젯을 원형 또는 사각형으로 자를 수 있으며, 배경색, 모서리 반경, 그림자 깊이, 그림자 색상, 클리핑 동작을 지정할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalModel 기본 사용", + "desc": [ + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【borderRadius】 : 모서리 반경 【BorderRadius】", + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【shape】 : 모양 【BoxShape】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json new file mode 100644 index 00000000..2ee84c80 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Módulo Físico", + "info": "Permite que os subcomponentes sejam cortados de acordo com formas circulares ou quadradas, e pode especificar a cor de fundo, cantos arredondados, profundidade da sombra, cor da sombra e comportamento de corte.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PhysicalModel", + "desc": [ + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【borderRadius】 : Cantos arredondados 【BorderRadius】", + "【child】 : Subcomponente 【Widget】", + "【elevation】 : Profundidade da sombra 【double】", + "【shadowColor】 : Cor da sombra 【Color】", + "【shape】 : Forma 【BoxShape】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json new file mode 100644 index 00000000..2c6f69f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalModel/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 296, + "name": "PhysicalModel", + "localName": "Физический модуль", + "info": "Позволяет обрезать дочерние компоненты по кругу или квадрату, а также можно указать цвет фона, радиус скругления, глубину тени, цвет тени и поведение обрезки.", + "lever": 3, + "family": 2, + "linkIds": [ + 279, + 69 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PhysicalModel", + "desc": [ + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【borderRadius】 : Радиус скругления 【BorderRadius】", + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【shape】 : Форма 【BoxShape】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json new file mode 100644 index 00000000..73eed096 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Physikalische Form", + "info": "Ermöglicht es den Unterkomponenten, entlang eines Pfads beschnitten zu werden, und ermöglicht die Angabe von Hintergrundfarbe, Schattentiefe, Schattenfarbe und Schneidverhalten.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PhysicalShape", + "desc": [ + "【clipper】 : Clipper 【CustomClipper】", + "【clipBehavior】 : Schneidverhalten 【Clip】", + "【child】 : Unterkomponente 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json new file mode 100644 index 00000000..4ea4b73e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Physical Shape", + "info": "Allows child components to be clipped according to the path, and can specify background color, shadow depth, shadow color, and clipping behavior.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PhysicalShape", + "desc": [ + "【clipper】: Clipper 【CustomClipper】", + "【clipBehavior】: Clipping Behavior 【Clip】", + "【child】: Child Component 【Widget】", + "【elevation】: Shadow Depth 【double】", + "【shadowColor】: Shadow Color 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json new file mode 100644 index 00000000..dcf2db89 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Física", + "info": "Permite que los componentes hijos se recorten según una ruta, y se puede especificar el color de fondo, la profundidad de la sombra, el color de la sombra y el comportamiento de recorte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PhysicalShape", + "desc": [ + "【clipper】: Recortador 【CustomClipper】", + "【clipBehavior】: Comportamiento de recorte 【Clip】", + "【child】: Componente hijo 【Widget】", + "【elevation】: Profundidad de la sombra 【double】", + "【shadowColor】: Color de la sombra 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json new file mode 100644 index 00000000..5eb0c9f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forme physique", + "info": "Permet de découper les composants enfants selon un chemin, et permet de spécifier la couleur de fond, la profondeur de l'ombre, la couleur de l'ombre et le comportement de découpage.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PhysicalShape", + "desc": [ + "【clipper】 : coupeur 【CustomClipper】", + "【clipBehavior】 : comportement de découpage 【Clip】", + "【child】 : composant enfant 【Widget】", + "【elevation】 : profondeur de l'ombre 【double】", + "【shadowColor】 : couleur de l'ombre 【Color】", + "【color】: couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json new file mode 100644 index 00000000..6946db31 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Fisica", + "info": "Consente ai componenti figli di essere ritagliati secondo un percorso e può specificare il colore di sfondo, la profondità dell'ombra, il colore dell'ombra e il comportamento di ritaglio.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PhysicalShape", + "desc": [ + "【clipper】 : Ritagliatore 【CustomClipper】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json new file mode 100644 index 00000000..73e8f5f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "物理形状", + "info": "子コンポーネントをパスに沿ってクリップし、背景色、影の深さ、影の色、クリップ動作を指定できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShapeの基本使用", + "desc": [ + "【clipper】 : クリッパー 【CustomClipper】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json new file mode 100644 index 00000000..edbc87f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "물리적 모양", + "info": "자식 위젯이 경로에 따라 잘릴 수 있도록 하고, 배경색, 그림자 깊이, 그림자 색상, 클리핑 동작을 지정할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PhysicalShape 기본 사용", + "desc": [ + "【clipper】 : 클리퍼 【CustomClipper】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json new file mode 100644 index 00000000..293b4bd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Forma Física", + "info": "Permite que os componentes filhos sejam cortados de acordo com o caminho, e pode especificar a cor de fundo, profundidade da sombra, cor da sombra, comportamento de corte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PhysicalShape", + "desc": [ + "【clipper】: Cortador 【CustomClipper】", + "【clipBehavior】: Comportamento de Corte 【Clip】", + "【child】: Componente Filho 【Widget】", + "【elevation】: Profundidade da Sombra 【double】", + "【shadowColor】: Cor da Sombra 【Color】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json new file mode 100644 index 00000000..e9ee5238 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/PhysicalShape/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 279, + "name": "PhysicalShape", + "localName": "Физическая форма", + "info": "Позволяет обрезать дочерние компоненты по пути, а также можно указать цвет фона, глубину тени, цвет тени и поведение обрезки.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PhysicalShape", + "desc": [ + "【clipper】 : Обрезчик 【CustomClipper】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json new file mode 100644 index 00000000..3f21c340 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Neulackgrenze", + "info": "Erstellt eine separate Anzeigeliste für Unterkomponenten, um die Leistung zu verbessern. Im Quellcode wird es in Komponenten wie TextField, DrawerController, Scrollbar, Sliver usw. verwendet.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RepaintBoundary", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "Zum Beispiel wird in der obigen Zeichenansicht die paint-Methode auch dann kontinuierlich ausgeführt, wenn shouldRepaint false ist. Die Verwendung von RepaintBoundary kann unnötiges Zeichnen vermeiden." + ] + }, + { + "file": "node2_save.dart", + "name": "Speichern eines Widgets als Bild", + "desc": [ + "Mit RenderRepaintBoundary können Bildinformationen der Unterkomponente abgerufen werden, um sie als Bilddatei zu speichern." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json new file mode 100644 index 00000000..420495ba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Repaint Boundary", + "info": "Creates a separate display list for child components to improve performance. It is used in components such as TextField, DrawerController, Scrollbar, and Sliver in the source code.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RepaintBoundary", + "desc": [ + "【child】 : Child component 【Widget】", + "For example, in the above drawing view, even if shouldRepaint is false, the paint method will be continuously executed during scrolling. Using RepaintBoundary can avoid unnecessary drawing." + ] + }, + { + "file": "node2_save.dart", + "name": "Save Widget as Image", + "desc": [ + "Through RenderRepaintBoundary, you can obtain the Image information of the child component, and then save the bytes as an image file." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json new file mode 100644 index 00000000..82831684 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Límite de repintado", + "info": "Crea una lista de visualización separada para los componentes hijos, mejorando el rendimiento. Se utiliza en componentes como TextField, DrawerController, Scrollbar, Sliver, etc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RepaintBoundary", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "Por ejemplo, en la vista de dibujo anterior, incluso si shouldRepaint es false, el método paint se ejecutará continuamente durante el desplazamiento. Usar RepaintBoundary puede evitar pinturas innecesarias." + ] + }, + { + "file": "node2_save.dart", + "name": "Guardar Widget como imagen", + "desc": [ + "A través de RenderRepaintBoundary se puede obtener la información de la imagen del componente hijo, y así guardar los bytes como un archivo de imagen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json new file mode 100644 index 00000000..838e65f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Limite de Repaint", + "info": "Crée une liste d'affichage séparée pour les composants enfants, améliorant ainsi les performances. Utilisé dans les composants tels que TextField, DrawerController, Scrollbar, Sliver, etc. dans le code source.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RepaintBoundary", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Par exemple, dans la vue de dessin ci-dessus, même si shouldRepaint est false, la méthode paint sera constamment exécutée lors du défilement. L'utilisation de RepaintBoundary peut éviter les peintures inutiles." + ] + }, + { + "file": "node2_save.dart", + "name": "Sauvegarder un Widget en tant qu'image", + "desc": [ + "Grâce à RenderRepaintBoundary, il est possible d'obtenir les informations d'image du composant enfant, puis de les sauvegarder sous forme de fichier image." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json new file mode 100644 index 00000000..5ca39800 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Confine di ridisegno", + "info": "Crea una lista di visualizzazione separata per i componenti figli, migliorando le prestazioni. Nel codice sorgente, viene utilizzato in componenti come TextField, DrawerController, Scrollbar, Sliver, ecc.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RepaintBoundary", + "desc": [ + "【child】 : componente figlio 【Widget】", + "Ad esempio, nella vista di disegno sopra, anche se shouldRepaint è false, il metodo paint verrà eseguito continuamente durante lo scorrimento. L'uso di RepaintBoundary può evitare ridisegni non necessari." + ] + }, + { + "file": "node2_save.dart", + "name": "Salvare un Widget come immagine", + "desc": [ + "Attraverso RenderRepaintBoundary è possibile ottenere le informazioni sull'immagine del componente figlio, ottenendo così i byte per salvarli come file immagine." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json new file mode 100644 index 00000000..ac0a6721 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "再描画境界", + "info": "子コンポーネントのための別個の表示リストを作成し、パフォーマンスを向上させます。ソースコードではTextField、DrawerController、Scrollbar、Sliverなどのコンポーネントに適用されています", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundaryの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "例えば、上記の描画ビューでは、shouldRepaintがfalseであっても、スクロール中にpaintメソッドが繰り返し実行されます。RepaintBoundaryを使用することで、不要な描画を避けることができます。" + ] + }, + { + "file": "node2_save.dart", + "name": "Widgetを画像として保存", + "desc": [ + "RenderRepaintBoundaryを使用して、子コンポーネントのImage情報を取得し、バイトとして画像ファイルに保存することができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json new file mode 100644 index 00000000..79bd059f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "리페인트 경계", + "info": "자식 위젯을 위한 별도의 디스플레이 리스트를 생성하여 성능을 향상시킵니다. 소스 코드에서 TextField, DrawerController, Scrollbar, Sliver 등 다양한 위젯에 적용되어 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RepaintBoundary 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "예를 들어 위의 그리기 뷰는 shouldRepaint가 false인 경우에도 스크롤 중에 paint 메소드가 계속 실행됩니다. RepaintBoundary를 사용하면 불필요한 그리기를 방지할 수 있습니다." + ] + }, + { + "file": "node2_save.dart", + "name": "위젯을 이미지로 저장", + "desc": [ + "RenderRepaintBoundary를 통해 자식 위젯의 이미지 정보를 얻어 바이트로 저장하여 이미지 파일로 저장할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json new file mode 100644 index 00000000..78089c63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Limite de Repintura", + "info": "Cria uma lista de exibição separada para componentes filhos, melhorando o desempenho. É utilizado em componentes como TextField, DrawerController, Scrollbar, Sliver, entre outros, no código-fonte.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RepaintBoundary", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Por exemplo, na vista de desenho acima, mesmo que shouldRepaint seja falso, o método paint será executado continuamente durante o deslizamento. Usar RepaintBoundary pode evitar pinturas desnecessárias." + ] + }, + { + "file": "node2_save.dart", + "name": "Salvar Widget como Imagem", + "desc": [ + "Através do RenderRepaintBoundary, é possível obter informações de imagem do componente filho e, assim, salvar os bytes como um arquivo de imagem." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json new file mode 100644 index 00000000..ef65d3e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RepaintBoundary/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 264, + "name": "RepaintBoundary", + "localName": "Граница перерисовки", + "info": "Создает отдельный список отображения для дочерних компонентов, повышая производительность. Используется в компонентах, таких как TextField, DrawerController, Scrollbar, Sliver и других в исходном коде.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RepaintBoundary", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Например, в приведенном выше примере отображения, даже если shouldRepaint равен false, метод paint будет постоянно выполняться во время прокрутки. Использование RepaintBoundary позволяет избежать ненужной перерисовки." + ] + }, + { + "file": "node2_save.dart", + "name": "Сохранение Widget в виде изображения", + "desc": [ + "С помощью RenderRepaintBoundary можно получить информацию об изображении дочернего компонента и сохранить его в виде файла изображения." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json new file mode 100644 index 00000000..731df615 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Drehbox", + "info": "Kann ein Unterelement aufnehmen und es im Uhrzeigersinn um quarterTurns*90° drehen.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RotatedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【quarterTurns】 : Um wie viele 90° gedreht werden soll 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json new file mode 100644 index 00000000..7dcd5cb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Rotated Box", + "info": "Can contain a child widget, rotating it clockwise by quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RotatedBox", + "desc": [ + "【child】 : Child widget 【Widget】", + "【quarterTurns】 : How many 90° to rotate 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json new file mode 100644 index 00000000..1cb8f9ce --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Caja Rotada", + "info": "Puede contener un componente hijo, girándolo en sentido horario en quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RotatedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【quarterTurns】 : Cuántos 90° girar 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json new file mode 100644 index 00000000..6088e564 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Boîte Rotée", + "info": "Peut contenir un composant enfant, le faisant pivoter dans le sens horaire de quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RotatedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【quarterTurns】 : Nombre de rotations de 90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json new file mode 100644 index 00000000..e7323602 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Scatola Ruotata", + "info": "Può contenere un componente figlio, ruotandolo in senso orario di quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RotatedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【quarterTurns】 : Quanti 90° ruotare 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json new file mode 100644 index 00000000..9ab2b233 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "回転ボックス", + "info": "1つの子コンポーネントを収容し、それを時計回りにquarterTurns*90°回転させます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBoxの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【quarterTurns】 : 90°回転する回数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json new file mode 100644 index 00000000..7b476c41 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "회전 상자", + "info": "하나의 자식 위젯을 포함할 수 있으며, 시계 방향으로 quarterTurns*90°만큼 회전시킵니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotatedBox 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【quarterTurns】 : 90° 회전 횟수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json new file mode 100644 index 00000000..cb67f1bf --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Caixa Giratória", + "info": "Pode conter um componente filho, girando-o no sentido horário em quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RotatedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【quarterTurns】 : Quantos 90° para girar 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json new file mode 100644 index 00000000..7f6465f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/RotatedBox/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 72, + "name": "RotatedBox", + "localName": "Повернутый ящик", + "info": "Может содержать один дочерний компонент, поворачивая его по часовой стрелке на quarterTurns*90°.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RotatedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【quarterTurns】 : Сколько раз повернуть на 90° 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json new file mode 100644 index 00000000..b630b69d --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Shader-Maske", + "info": "Kann ein Kind aufnehmen und das Kind durch einen Shader einfärben, wobei der Mischmodus angegeben werden kann. Wird häufig für die Farbverlaufsverarbeitung von Komponenten verwendet.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Radialer Farbverlauf", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【shaderCallback】 : Shader-Rückruf 【ShaderCallback】", + "【blendMode】 : Mischmodus 【BlendMode】", + " Erstellt einen radialen Farbverlaufsshader durch RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Linearer Farbverlauf", + "desc": [ + "Erstellt einen linearen Farbverlaufsshader durch LinearGradient#createShader", + "Weitere Informationen zu Shadern finden Sie im 【Zeichnungsalbum】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json new file mode 100644 index 00000000..bf1fb1ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Shader Mask", + "info": "Can accommodate a child and apply shading to the child through a shader, with the ability to specify blending modes. Commonly used for gradient processing of components.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Radial Gradient Shading", + "desc": [ + "【child】: Child component 【Widget】", + "【shaderCallback】: Shader callback 【ShaderCallback】", + "【blendMode】: Blending mode 【BlendMode】", + " Create a radial gradient shader through RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Linear Gradient Shading", + "desc": [ + "Create a linear gradient shader through LinearGradient#createShader", + "For more information on shaders, see 【Drawing Album】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json new file mode 100644 index 00000000..7d568a3c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Máscara de sombreado", + "info": "Puede contener un hijo y aplicar sombreado al hijo a través de un sombreador, se puede especificar el modo de mezcla. Normalmente se utiliza para el procesamiento de gradientes de color en componentes.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Sombreado de gradiente radial", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【shaderCallback】 : Callback del sombreador 【ShaderCallback】", + "【blendMode】 : Modo de mezcla 【BlendMode】", + " Crea un sombreador de gradiente radial a través de RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Sombreado de gradiente lineal", + "desc": [ + "Crea un sombreador de gradiente lineal a través de LinearGradient#createShader", + "Para más información sobre sombreadores, consulte el 【Álbum de dibujo】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json new file mode 100644 index 00000000..4a4f8f29 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Masque de nuance", + "info": "Peut contenir un enfant et appliquer une teinte à l'enfant via un nuanceur, avec la possibilité de spécifier un mode de mélange. Couramment utilisé pour le traitement des dégradés de composants.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Teinte de dégradé radial", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【shaderCallback】 : Rappel du nuanceur 【ShaderCallback】", + "【blendMode】 : Mode de mélange 【BlendMode】", + " Crée un nuanceur de dégradé radial via RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Teinte de dégradé linéaire", + "desc": [ + "Crée un nuanceur de dégradé linéaire via LinearGradient#createShader", + "Pour plus d'informations sur les nuanceurs, voir 【Album de dessin】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json new file mode 100644 index 00000000..14396a8e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Maschera Shader", + "info": "Può contenere un figlio e colorare il figlio attraverso uno shader, specificando la modalità di fusione. Solitamente utilizzato per il trattamento della gradazione dei componenti.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Sfumatura Radiale", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【shaderCallback】 : Callback dello shader 【ShaderCallback】", + "【blendMode】 : Modalità di fusione 【BlendMode】", + " Crea uno shader di sfumatura radiale attraverso RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Sfumatura Lineare", + "desc": [ + "Crea uno shader di sfumatura lineare attraverso LinearGradient#createShader", + "Per ulteriori informazioni sugli shader, consulta 【Album di disegno】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json new file mode 100644 index 00000000..5e543115 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "シェーダーマスク", + "info": "1つの子要素を保持し、シェーダーを使用して子要素に色を付けることができます。ブレンドモードを指定できます。通常、コンポーネントのグラデーション処理に使用されます。", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "ラジアルグラデーションシェーダー", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【shaderCallback】 : シェーダーコールバック 【ShaderCallback】", + "【blendMode】 : ブレンドモード 【BlendMode】", + " RadialGradient#createShaderを使用してラジアルグラデーションシェーダーを作成します。" + ] + }, + { + "file": "node2_linear.dart", + "name": "リニアグラデーションシェーダー", + "desc": [ + "LinearGradient#createShaderを使用してリニアグラデーションシェーダーを作成します", + "シェーダーに関する詳細は【描画アルバム】を参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json new file mode 100644 index 00000000..09343418 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "셰이더 마스크", + "info": "하나의 자식을 포함할 수 있으며, 셰이더를 통해 자식에 색상을 입힐 수 있습니다. 혼합 모드를 지정할 수 있습니다. 일반적으로 컴포넌트 그라데이션 처리에 사용됩니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "방사형 그라데이션 색상", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【shaderCallback】 : 셰이더 콜백 【ShaderCallback】", + "【blendMode】 : 혼합 모드 【BlendMode】", + " RadialGradient#createShader를 통해 방사형 그라데이션 셰이더를 생성합니다." + ] + }, + { + "file": "node2_linear.dart", + "name": "선형 그라데이션 색상", + "desc": [ + "LinearGradient#createShader를 통해 선형 그라데이션 셰이더를 생성합니다", + "셰이더 관련 지식은 【그리기 앨범】을 참조하세요" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json new file mode 100644 index 00000000..a0bf5dd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Máscara de Shader", + "info": "Pode conter um filho e colorir o filho através de um shader, podendo especificar o modo de mistura. Geralmente usado para processamento de gradiente de componentes.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Coloração de Gradiente Radial", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【shaderCallback】 : Callback do shader 【ShaderCallback】", + "【blendMode】 : Modo de mistura 【BlendMode】", + " Cria um shader de gradiente radial através de RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Coloração de Gradiente Linear", + "desc": [ + "Cria um shader de gradiente linear através de LinearGradient#createShader", + "Para mais informações sobre shaders, consulte o 【Álbum de Desenho】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json new file mode 100644 index 00000000..99c04db0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/ShaderMask/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 277, + "name": "ShaderMask", + "localName": "Маска шейдера", + "info": "Может содержать один дочерний элемент и применять к нему шейдер, можно указать режим смешивания. Обычно используется для градиентной обработки компонентов.", + "lever": 4, + "family": 2, + "linkIds": [ + 88, + 38 + ], + "nodes": [ + { + "file": "node1_radial.dart", + "name": "Радиальный градиент", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【shaderCallback】 : Коллбэк шейдера 【ShaderCallback】", + "【blendMode】 : Режим смешивания 【BlendMode】", + " Создание радиального градиентного шейдера через RadialGradient#createShader." + ] + }, + { + "file": "node2_linear.dart", + "name": "Линейный градиент", + "desc": [ + "Создание линейного градиентного шейдера через LinearGradient#createShader", + "Подробнее о шейдерах см. в 【Альбоме рисования】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json new file mode 100644 index 00000000..0dcba6cc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Größenänderungsbenachrichtigung", + "info": "Mit SizeChangedLayoutNotifier kann eine Benachrichtigung gesendet werden, nachdem sich der Layoutbereich eines Kindelements ändert. Die Benachrichtigung kann mit NotificationListener überwacht werden.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json new file mode 100644 index 00000000..b67b9139 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Size Change Notification", + "info": "Using SizeChangedLayoutNotifier can send a notification after the layout area of the child component changes. NotificationListener can be used to monitor it.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【child】 : Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json new file mode 100644 index 00000000..9f4a9aef --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notificador de cambio de tamaño", + "info": "Usando SizeChangedLayoutNotifier, se puede emitir una notificación cuando cambia el área de diseño de un componente hijo. Se puede escuchar usando NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json new file mode 100644 index 00000000..4ba60dba --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notification de changement de taille", + "info": "Utiliser SizeChangedLayoutNotifier permet d'émettre une notification lorsque la zone de mise en page d'un composant enfant change. Utilisez NotificationListener pour écouter ces notifications.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json new file mode 100644 index 00000000..ef73a668 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notifica di Cambio Dimensione", + "info": "Utilizzando SizeChangedLayoutNotifier, è possibile inviare una notifica quando l'area di layout di un componente figlio cambia. È possibile ascoltare questa notifica utilizzando NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di Base", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json new file mode 100644 index 00000000..75ee50c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "サイズ変更通知", + "info": "SizeChangedLayoutNotifierを使用すると、子コンポーネントのレイアウト領域が変更された後に通知を発行できます。NotificationListenerを使用して監視することができます。", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json new file mode 100644 index 00000000..77ef19fc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "크기 변경 알림", + "info": "SizeChangedLayoutNotifier를 사용하면 하위 구성 요소 레이아웃 영역이 변경된 후 알림을 보낼 수 있습니다. NotificationListener를 사용하여 이를 감지할 수 있습니다.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용", + "desc": [ + "【child】 : 구성 요소 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json new file mode 100644 index 00000000..928126c5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Notificador de Mudança de Tamanho", + "info": "Usando o SizeChangedLayoutNotifier, é possível emitir uma notificação após uma mudança na área de layout do componente filho. O NotificationListener pode ser usado para monitorar.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json new file mode 100644 index 00000000..5380f36b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizeChangedLayoutNotifier/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 294, + "name": "SizeChangedLayoutNotifier", + "localName": "Уведомление об изменении размера", + "info": "Использование SizeChangedLayoutNotifier позволяет отправлять уведомления после изменения области макета дочернего компонента. Для прослушивания можно использовать NotificationListener.", + "lever": 2, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json new file mode 100644 index 00000000..5b1876fa --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Größenfestgelegte Box", + "info": "Kann ein Kindelement aufnehmen und den Bereich für das Kindelement durch Angabe von Breite und Höhe begrenzen.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json new file mode 100644 index 00000000..ff26d6bd --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "SizedBox", + "info": "Can contain a child component, limiting the area of the child component by specifying width and height.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizedBox", + "desc": [ + "【child】 : Child component 【Widget】", + "【width】 : Width 【double】", + "【height】 : Height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json new file mode 100644 index 00000000..ced0e87b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Caja de tamaño fijo", + "info": "Puede contener un componente hijo, limitando el área del componente hijo especificando el ancho y el alto.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json new file mode 100644 index 00000000..22607dbb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Boîte de taille fixe", + "info": "Peut contenir un composant enfant, en spécifiant la largeur et la hauteur pour limiter la zone du composant enfant.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json new file mode 100644 index 00000000..0fd5d488 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Scatola di dimensioni fisse", + "info": "Può contenere un componente figlio, limitando l'area del componente figlio specificando larghezza e altezza.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SizedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json new file mode 100644 index 00000000..396c2501 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "サイズ指定ボックス", + "info": "子コンポーネントを収容し、幅と高さを指定して子コンポーネントの領域を制限します。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json new file mode 100644 index 00000000..da76fdd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "고정 크기 상자", + "info": "하위 컴포넌트를 수용할 수 있으며, 너비와 높이를 지정하여 하위 컴포넌트의 영역을 제한합니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedBox 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json new file mode 100644 index 00000000..20ca3e91 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Caixa de Tamanho Fixo", + "info": "Pode conter um componente filho, limitando a área do componente filho especificando a largura e altura.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json new file mode 100644 index 00000000..e201ebc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 76, + "name": "SizedBox", + "localName": "Коробка с фиксированным размером", + "info": "Может содержать один дочерний компонент, ограничивая область размещения дочернего компонента указанием ширины и высоты.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json new file mode 100644 index 00000000..27ce75d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Größenüberlaufbox", + "info": "Kann ein Kindelement aufnehmen, und das Kindelement darf den Bereich des Elternelements überlaufen. Das Kindelement kann durch die size-Eigenschaft verschoben werden und verfügt über die Ausrichtungseigenschaft alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizedOverflowBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【size】 : Größenverschiebung 【Size】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json new file mode 100644 index 00000000..6f3ed70a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Sized Overflow Box", + "info": "Can contain a child component, and the child component is allowed to overflow the parent component area. The child component can be offset through the size property, and has the alignment property.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizedOverflowBox", + "desc": [ + "【child】: Child component 【Widget】", + "【size】: Size offset 【Size】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json new file mode 100644 index 00000000..774d3627 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Caja de desbordamiento de tamaño", + "info": "Puede contener un componente hijo, y el componente hijo puede desbordar el área del componente padre. Se puede desplazar el componente hijo mediante la propiedad size y tiene la propiedad de alineación alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizedOverflowBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【size】 : Desplazamiento de tamaño 【Size】", + "【alignment】 : Método de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json new file mode 100644 index 00000000..38f12409 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Boîte de débordement dimensionnée", + "info": "Peut contenir un composant enfant, et le composant enfant est autorisé à déborder de la zone du composant parent. Il est possible de décaler le composant enfant à l'aide de la propriété size, et il possède la propriété d'alignement alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizedOverflowBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【size】 : Décalage de taille 【Size】", + "【alignment】 : Méthode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json new file mode 100644 index 00000000..2a4ebf9f --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Scatola di dimensioni eccessive", + "info": "Può contenere un componente figlio e il componente figlio può fuoriuscire dall'area del componente genitore. È possibile spostare il componente figlio tramite la proprietà size e ha la proprietà di allineamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SizedOverflowBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【size】 : Spostamento delle dimensioni 【Size】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json new file mode 100644 index 00000000..872a5e1b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "サイズオーバーフローボックス", + "info": "子コンポーネントを収容でき、子コンポーネントは親コンポーネントの領域をオーバーフローすることが許可されています。size属性を使用して子コンポーネントをオフセットでき、alignment属性を持っています。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【size】 : サイズオフセット 【Size】", + "【alignment】 : アラインメント 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json new file mode 100644 index 00000000..db62b43b --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "크기 오버플로우 박스", + "info": "하위 컴포넌트를 포함할 수 있으며, 하위 컴포넌트가 상위 컴포넌트 영역을 벗어날 수 있습니다. size 속성을 통해 하위 컴포넌트를 오프셋할 수 있으며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizedOverflowBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【size】 : 크기 오프셋 【Size】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json new file mode 100644 index 00000000..0edaf0bc --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Caixa de Transbordamento Dimensionada", + "info": "Pode conter um componente filho, e o componente filho pode transbordar a área do componente pai. O componente filho pode ser deslocado através da propriedade size, e possui a propriedade de alinhamento alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizedOverflowBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【size】 : Deslocamento de tamanho 【Size】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json new file mode 100644 index 00000000..ded711d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/SizedOverflowBox/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 84, + "name": "SizedOverflowBox", + "localName": "Размерный переполняющий ящик", + "info": "Может содержать один дочерний компонент, и дочерний компонент может выходить за пределы области родительского компонента. Можно смещать дочерний компонент с помощью свойства size, имеет свойство выравнивания alignment.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizedOverflowBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【size】 : Смещение размера 【Size】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json new file mode 100644 index 00000000..fa94071a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Klickbereich", + "info": "Komponente, die interne oder externe Klickrückrufe erkennen kann. Durch die groupId können mehrere Bereiche als eine Einheit betrachtet werden.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Interne und externe Klicks überwachen", + "desc": [ + "【enabled】 : Verfügbar 【bool】", + "【onTapOutside】 : Externer Klick-Listener 【TapRegionCallback?】", + "【onTapInside】 : Interner Klick-Listener 【TapRegionCallback?】", + "【groupId】 : Klickbereichsgruppenkennung 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json new file mode 100644 index 00000000..bbe560ab --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Tap Region", + "info": "A component that can detect internal or external click callbacks, and multiple regions can be treated as one through the groupId.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Listen to clicks inside and outside the component", + "desc": [ + "【enabled】 : Whether it is available 【bool】", + "【onTapOutside】 : Listen to clicks outside 【TapRegionCallback?】", + "【onTapInside】 : Listen to clicks inside 【TapRegionCallback?】", + "【groupId】 : Click region group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json new file mode 100644 index 00000000..5cf6a1b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Área de toque", + "info": "Componente capaz de detectar devoluciones de llamada de toques internos o externos, mediante groupId varias áreas pueden considerarse como una sola.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar toques dentro y fuera del componente", + "desc": [ + "【enabled】 : ¿Está disponible? 【bool】", + "【onTapOutside】 : Escucha de toques externos 【TapRegionCallback?】", + "【onTapInside】 : Escucha de toques internos 【TapRegionCallback?】", + "【groupId】 : Identificador del grupo de área de toque 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json new file mode 100644 index 00000000..ca3ba3fe --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Zone de clic", + "info": "Un composant capable de détecter les rappels de clic internes ou externes, plusieurs zones peuvent être considérées comme une seule via groupId.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les clics à l'intérieur et à l'extérieur du composant", + "desc": [ + "【enabled】 : Activé ou non 【bool】", + "【onTapOutside】 : Écouteur de clic externe 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic interne 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json new file mode 100644 index 00000000..6faac12c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Area di tocco", + "info": "Componente in grado di rilevare i callback di clic interni o esterni, tramite groupId più aree possono essere considerate come una sola.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta i clic interni ed esterni del componente", + "desc": [ + "【enabled】 : Se è disponibile 【bool】", + "【onTapOutside】 : Ascolta i clic esterni 【TapRegionCallback?】", + "【onTapInside】 : Ascolta i clic interni 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo dell'area di tocco 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json new file mode 100644 index 00000000..e071c615 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "タップ範囲", + "info": "内部または外部のタップコールバックを検出できるコンポーネントで、groupId を使用して複数の領域を一体として扱うことができます。", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "コンポーネントの内部と外部のタップを監視", + "desc": [ + "【enabled】 : 有効かどうか 【bool】", + "【onTapOutside】 : 外部タップ監視 【TapRegionCallback?】", + "【onTapInside】 : 内部タップ監視 【TapRegionCallback?】", + "【groupId】 : タップ領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json new file mode 100644 index 00000000..403aeae2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "탭 영역", + "info": "내부 또는 외부 탭 콜백을 감지할 수 있는 구성 요소로, groupId를 통해 여러 영역을 하나로 간주할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "내부 및 외부 탭 구성 요소 감시", + "desc": [ + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 탭 감시 【TapRegionCallback?】", + "【onTapInside】 : 내부 탭 감시 【TapRegionCallback?】", + "【groupId】 : 탭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json new file mode 100644 index 00000000..3402fa25 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Área de Toque", + "info": "Componente capaz de detectar retornos de chamada de toque interno ou externo, através do groupId várias áreas podem ser consideradas como uma só.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorizar toques internos e externos do componente", + "desc": [ + "【enabled】 : Se está disponível 【bool】", + "【onTapOutside】 : Monitorização de toque externo 【TapRegionCallback?】", + "【onTapInside】 : Monitorização de toque interno 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo de área de toque 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json new file mode 100644 index 00000000..f52b260a --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TapRegion/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 280, + "name": "TapRegion", + "localName": "Область нажатия", + "info": "Компонент, который может обнаруживать обратные вызовы при нажатии внутри или снаружи, с помощью groupId несколько областей могут рассматриваться как одно целое.", + "lever": 4, + "family": 2, + "linkIds": [ + 146, + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Прослушивание нажатий внутри и снаружи компонента", + "desc": [ + "【enabled】 : Доступен ли 【bool】", + "【onTapOutside】 : Прослушивание нажатия снаружи 【TapRegionCallback?】", + "【onTapInside】 : Прослушивание нажатия внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области нажатия 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json new file mode 100644 index 00000000..2a33f026 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Eingabefeld-Klickbereich", + "info": "TapRegion mit der groupId EditableText, der den Klickbereich anderer Komponenten als Teil des Eingabefelds behandelt.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Klicks innerhalb und außerhalb der Komponente überwachen", + "desc": [ + "Im Beispiel wird der Fokus des Eingabefelds nicht aufgehoben, wenn auf das Plus- oder Minuszeichen geklickt wird, und die Tastatur kann weiterhin verwendet werden.", + "【enabled】 : Verfügbar 【bool】", + "【onTapOutside】 : Überwachung von Klicks außerhalb 【TapRegionCallback?】", + "【onTapInside】 : Überwachung von Klicks innerhalb 【TapRegionCallback?】", + "【groupId】 : Gruppenkennung des Klickbereichs 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json new file mode 100644 index 00000000..b42d276c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "TextField Tap Region", + "info": "The TapRegion with groupId as EditableText allows the clickable area of other components to be considered as one with the input field.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitor Clicks Inside and Outside the Component", + "desc": [ + "In the example, clicking the plus and minus signs does not cancel the focus of the input field, and the keyboard can still be used for input.", + "【enabled】 : Whether it is available 【bool】", + "【onTapOutside】 : External click listener 【TapRegionCallback?】", + "【onTapInside】 : Internal click listener 【TapRegionCallback?】", + "【groupId】 : Clickable area group identifier 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json new file mode 100644 index 00000000..88bb35b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Área de clic del campo de texto", + "info": "El TapRegion con groupId como EditableText permite que el área de clic de otros componentes se considere como parte del campo de texto.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar clics dentro y fuera del componente", + "desc": [ + "En el ejemplo, al hacer clic en los botones de más y menos, no se cancela el enfoque del campo de texto, y el teclado aún puede escribir.", + "【enabled】 : ¿Está disponible? 【bool】", + "【onTapOutside】 : Escucha de clic fuera 【TapRegionCallback?】", + "【onTapInside】 : Escucha de clic dentro 【TapRegionCallback?】", + "【groupId】 : Identificador del grupo de área de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json new file mode 100644 index 00000000..db182a21 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Zone de clic du champ de saisie", + "info": "Le TapRegion avec groupId pour EditableText permet de considérer la zone de clic d'autres composants comme faisant partie du champ de saisie.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les clics à l'intérieur et à l'extérieur du composant", + "desc": [ + "Dans l'exemple, cliquer sur les boutons plus et moins ne supprime pas le focus du champ de saisie, le clavier reste actif pour la saisie.", + "【enabled】 : Actif ou non 【bool】", + "【onTapOutside】 : Écouteur de clic à l'extérieur 【TapRegionCallback?】", + "【onTapInside】 : Écouteur de clic à l'intérieur 【TapRegionCallback?】", + "【groupId】 : Identifiant du groupe de la zone de clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json new file mode 100644 index 00000000..e1e9d93e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Area di clic del campo di testo", + "info": "Il TapRegion con groupId EditableText consente di considerare l'area di clic di altri componenti come parte integrante del campo di testo.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta i clic all'interno e all'esterno del componente", + "desc": [ + "Nell'esempio, cliccando sui pulsanti più e meno, il focus del campo di testo non viene perso e la tastiera rimane attiva per l'input.", + "【enabled】 : Se è abilitato 【bool】", + "【onTapOutside】 : Ascolta i clic all'esterno 【TapRegionCallback?】", + "【onTapInside】 : Ascolta i clic all'interno 【TapRegionCallback?】", + "【groupId】 : Identificatore del gruppo dell'area di clic 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json new file mode 100644 index 00000000..a4ea1125 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "テキストフィールドタップ範囲", + "info": "groupId が EditableText の TapRegion で、他のコンポーネントのタップ範囲をテキストフィールドと一体化させることができます。", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "クリックコンポーネントの内部と外部を監視", + "desc": [ + "ケースでプラスとマイナスをクリックしても、テキストフィールドのフォーカスは解除されず、キーボードで入力が可能です。", + "【enabled】 : 有効かどうか 【bool】", + "【onTapOutside】 : 外部クリック監視 【TapRegionCallback?】", + "【onTapInside】 : 内部クリック監視 【TapRegionCallback?】", + "【groupId】 : タップ領域グループ識別子 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json new file mode 100644 index 00000000..a42cb79e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "입력란 클릭 범위", + "info": "groupId가 EditableText인 TapRegion으로, 다른 컴포넌트의 클릭 범위를 입력란과 일체로 간주할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "컴포넌트 내부 및 외부 클릭 감지", + "desc": [ + "예시에서 더하기 및 빼기 버튼을 클릭해도 입력란의 포커스가 해제되지 않으며, 키보드로 입력이 가능합니다.", + "【enabled】 : 사용 가능 여부 【bool】", + "【onTapOutside】 : 외부 클릭 감지 【TapRegionCallback?】", + "【onTapInside】 : 내부 클릭 감지 【TapRegionCallback?】", + "【groupId】 : 클릭 영역 그룹 식별자 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json new file mode 100644 index 00000000..9561c633 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Área de Clique da Caixa de Texto", + "info": "O TapRegion com groupId como EditableText permite que a área de clique de outros componentes seja considerada como parte da caixa de texto.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorar Cliques Dentro e Fora do Componente", + "desc": [ + "No exemplo, clicar nos botões de adicionar e subtrair não cancela o foco da caixa de texto, e o teclado ainda pode ser usado para digitar.", + "【enabled】 : Disponível ou não 【bool】", + "【onTapOutside】 : Monitoramento de clique fora 【TapRegionCallback?】", + "【onTapInside】 : Monitoramento de clique dentro 【TapRegionCallback?】", + "【groupId】 : Identificador do grupo da área de clique 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json new file mode 100644 index 00000000..aace9a55 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/TextFieldTapRegion/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 281, + "name": "TextFieldTapRegion", + "localName": "Область нажатия текстового поля", + "info": "TapRegion с groupId EditableText позволяет рассматривать область нажатия других компонентов как единое целое с текстовым полем.", + "lever": 3, + "family": 2, + "linkIds": [ + 280, + 54, + 245 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Слушатель нажатий внутри и снаружи компонента", + "desc": [ + "В примере нажатие на плюс и минус не снимает фокус с текстового поля, и клавиатура все еще может вводить текст.", + "【enabled】 : Доступно ли 【bool】", + "【onTapOutside】 : Слушатель нажатий снаружи 【TapRegionCallback?】", + "【onTapInside】 : Слушатель нажатий внутри 【TapRegionCallback?】", + "【groupId】 : Идентификатор группы области нажатия 【Object?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json new file mode 100644 index 00000000..4f6ecf63 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformation", + "info": "Kann ein Unterelement aufnehmen und kann das Unterelement über eine 4*4-Transformationsmatrix transformieren.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Schieftransformation skew", + "desc": [ + "Die Schiefe x wird durch die Zahl R0C1 gesteuert, der Eingabeparameter ist ein Bogenmaßwert, der den Schiefewinkel darstellt", + "Die Schiefe y wird durch die Zahl R1C0 gesteuert, der Eingabeparameter ist ein Bogenmaßwert, der den Schiefewinkel darstellt" + ] + }, + { + "file": "node2_translation.dart", + "name": "Verschiebungstransformation translationValues", + "desc": [ + "Die Verschiebung x wird durch die Zahl R0C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt", + "Die Verschiebung y wird durch die Zahl R1C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt", + "Die Verschiebung z wird durch die Zahl R2C3 gesteuert, der Eingabeparameter ist ein numerischer Wert, der die Verschiebungslänge darstellt" + ] + }, + { + "file": "node3_scale.dart", + "name": "Skalierungstransformation diagonal3Values", + "desc": [ + "Die Skalierung x wird durch die Zahl R0C0 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt", + "Die Skalierung y wird durch die Zahl R1C2 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt", + "Die Skalierung z wird durch die Zahl R2C2 gesteuert, der Eingabeparameter ist ein numerischer Wert, der den Skalierungsfaktor darstellt" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Rotationstransformation rotation", + "desc": [ + "Die x-Rotation wird durch R1C1, R1C2, R2C1, R2C2 gesteuert, der Eingabeparameter stellt ein Bogenmaß dar", + "Die y-Rotation wird durch R0C0, R0C2, R2C0, R2C2 gesteuert, der Eingabeparameter stellt ein Bogenmaß dar", + "Die z-Rotation wird durch R0C0, R0C1, R1C0, R1C1 gesteuert" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Perspektivtransformation rotation", + "desc": [ + "Die Perspektive wird durch R3C1, R3C2, R3C3 gesteuert" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json new file mode 100644 index 00000000..789280b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transform", + "info": "Can accommodate a child component, and can transform the child component through a 4*4 transformation matrix.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Skew Transform skew", + "desc": [ + "Skew x is controlled by the R0C1 number, the input is in radians, representing the skew angle", + "Skew y is controlled by the R1C0 number, the input is in radians, representing the skew angle" + ] + }, + { + "file": "node2_translation.dart", + "name": "Translation Transform translationValues", + "desc": [ + "Translation x is controlled by the R0C3 number, the input is a value, representing the translation length", + "Translation y is controlled by the R1C3 number, the input is a value, representing the translation length", + "Translation z is controlled by the R2C3 number, the input is a value, representing the translation length" + ] + }, + { + "file": "node3_scale.dart", + "name": "Scale Transform diagonal3Values", + "desc": [ + "Scale x is controlled by the R0C0 number, the input is a value, representing the scaling factor", + "Scale y is controlled by the R1C2 number, the input is a value, representing the scaling factor", + "Scale z is controlled by the R2C2 number, the input is a value, representing the scaling factor" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Rotation Transform rotation", + "desc": [ + "x rotation is controlled by R1C1, R1C2, R2C1, R2C2, the input represents radians", + "y rotation is controlled by R0C0, R0C2, R2C0, R2C2, the input represents radians", + "z rotation is controlled by R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Perspective Transform rotation", + "desc": [ + "Perspective is controlled by R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json new file mode 100644 index 00000000..079d402e --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformación", + "info": "Puede contener un subcomponente, y se puede transformar el subcomponente mediante una matriz de transformación 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformación de sesgo skew", + "desc": [ + "El sesgo x está controlado por el número R0C1, el parámetro de entrada es un valor en radianes, que representa el ángulo de sesgo.", + "El sesgo y está controlado por el número R1C0, el parámetro de entrada es un valor en radianes, que representa el ángulo de sesgo." + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformación de traslación translationValues", + "desc": [ + "La traslación x está controlada por el número R0C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación.", + "La traslación y está controlada por el número R1C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación.", + "La traslación z está controlada por el número R2C3, el parámetro de entrada es un valor numérico, que representa la longitud de la traslación." + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformación de escala diagonal3Values", + "desc": [ + "La escala x está controlada por el número R0C0, el parámetro de entrada es un valor numérico, que representa la tasa de escala.", + "La escala y está controlada por el número R1C2, el parámetro de entrada es un valor numérico, que representa la tasa de escala.", + "La escala z está controlada por el número R2C2, el parámetro de entrada es un valor numérico, que representa la tasa de escala." + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformación de rotación rotation", + "desc": [ + "La rotación x está controlada por R1C1, R1C2, R2C1, R2C2, el parámetro de entrada representa radianes.", + "La rotación y está controlada por R0C0, R0C2, R2C0, R2C2, el parámetro de entrada representa radianes.", + "La rotación z está controlada por R0C0, R0C1, R1C0, R1C1." + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformación de perspectiva rotation", + "desc": [ + "La perspectiva está controlada por R3C1, R3C2, R3C3." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json new file mode 100644 index 00000000..3057ac29 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformation", + "info": "Peut contenir un composant enfant, et peut transformer le composant enfant via une matrice de transformation 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformation en biais skew", + "desc": [ + "Le biais x est contrôlé par le nombre R0C1, l'entrée est une valeur en radians, représentant l'angle de biais", + "Le biais y est contrôlé par le nombre R1C0, l'entrée est une valeur en radians, représentant l'angle de biais" + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformation de translation translationValues", + "desc": [ + "La translation x est contrôlée par le nombre R0C3, l'entrée est une valeur numérique, représentant la longueur de la translation", + "La translation y est contrôlée par le nombre R1C3, l'entrée est une valeur numérique, représentant la longueur de la translation", + "La translation z est contrôlée par le nombre R2C3, l'entrée est une valeur numérique, représentant la longueur de la translation" + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformation de mise à l'échelle diagonal3Values", + "desc": [ + "La mise à l'échelle x est contrôlée par le nombre R0C0, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle", + "La mise à l'échelle y est contrôlée par le nombre R1C2, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle", + "La mise à l'échelle z est contrôlée par le nombre R2C2, l'entrée est une valeur numérique, représentant le facteur de mise à l'échelle" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformation de rotation rotation", + "desc": [ + "La rotation x est contrôlée par R1C1, R1C2, R2C1, R2C2, l'entrée représente des radians", + "La rotation y est contrôlée par R0C0, R0C2, R2C0, R2C2, l'entrée représente des radians", + "La rotation z est contrôlée par R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformation de perspective rotation", + "desc": [ + "La perspective est contrôlée par R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json new file mode 100644 index 00000000..7c069639 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Trasformazione", + "info": "Può contenere un componente figlio e può trasformare il componente figlio tramite una matrice di trasformazione 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Trasformazione inclinata skew", + "desc": [ + "L'inclinazione x è controllata dal numero R0C1, il parametro è un valore in radianti, che rappresenta l'angolo di inclinazione", + "L'inclinazione y è controllata dal numero R1C0, il parametro è un valore in radianti, che rappresenta l'angolo di inclinazione" + ] + }, + { + "file": "node2_translation.dart", + "name": "Trasformazione di traslazione translationValues", + "desc": [ + "La traslazione x è controllata dal numero R0C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione", + "La traslazione y è controllata dal numero R1C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione", + "La traslazione z è controllata dal numero R2C3, il parametro è un valore numerico, che rappresenta la lunghezza della traslazione" + ] + }, + { + "file": "node3_scale.dart", + "name": "Trasformazione di scala diagonal3Values", + "desc": [ + "La scala x è controllata dal numero R0C0, il parametro è un valore numerico, che rappresenta il fattore di scala", + "La scala y è controllata dal numero R1C2, il parametro è un valore numerico, che rappresenta il fattore di scala", + "La scala z è controllata dal numero R2C2, il parametro è un valore numerico, che rappresenta il fattore di scala" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Trasformazione di rotazione rotation", + "desc": [ + "La rotazione x è controllata da R1C1, R1C2, R2C1, R2C2, il parametro rappresenta i radianti", + "La rotazione y è controllata da R0C0, R0C2, R2C0, R2C2, il parametro rappresenta i radianti", + "La rotazione z è controllata da R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Trasformazione prospettica rotation", + "desc": [ + "La prospettiva è controllata da R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json new file mode 100644 index 00000000..9b422585 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "変換", + "info": "子コンポーネントを収容でき、4*4の変換マトリックスを使用して子コンポーネントを変換できます。", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "スキュー変換skew", + "desc": [ + "スキューxはR0C1の数値で制御され、入力はラジアン値で、スキュー角度を表します", + "スキューyはR1C0の数値で制御され、入力はラジアン値で、スキュー角度を表します" + ] + }, + { + "file": "node2_translation.dart", + "name": "平行移動変換translationValues", + "desc": [ + "平行移動xはR0C3の数値で制御され、入力は数値で、平行移動の長さを表します", + "平行移動yはR1C3の数値で制御され、入力は数値で、平行移動の長さを表します", + "平行移動zはR2C3の数値で制御され、入力は数値で、平行移動の長さを表します" + ] + }, + { + "file": "node3_scale.dart", + "name": "スケール変換diagonal3Values", + "desc": [ + "スケールxはR0C0の数値で制御され、入力は数値で、スケールの比率を表します", + "スケールyはR1C2の数値で制御され、入力は数値で、スケールの比率を表します", + "スケールzはR2C2の数値で制御され、入力は数値で、スケールの比率を表します" + ] + }, + { + "file": "node4_rotate.dart", + "name": "回転変換rotation", + "desc": [ + "x回転はR1C1、R1C2、R2C1、R2C2で制御され、入力はラジアンを表します", + "y回転はR0C0、R0C2、R2C0、R2C2で制御され、入力はラジアンを表します", + "z回転はR0C0、R0C1、R1C0、R1C1で制御されます" + ] + }, + { + "file": "node5_perspective.dart", + "name": "遠近法変換rotation", + "desc": [ + "遠近法はR3C1、R3C2、R3C3で制御されます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json new file mode 100644 index 00000000..efe55467 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "변환", + "info": "하위 컴포넌트를 수용할 수 있으며, 4*4 변환 행렬을 통해 하위 컴포넌트를 변환할 수 있습니다.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "기울임 변환 skew", + "desc": [ + "x 기울임은 R0C1 숫자로 제어되며, 입력은 라디안 값으로 기울임 각도를 나타냅니다.", + "y 기울임은 R1C0 숫자로 제어되며, 입력은 라디안 값으로 기울임 각도를 나타냅니다." + ] + }, + { + "file": "node2_translation.dart", + "name": "이동 변환 translationValues", + "desc": [ + "x 이동은 R0C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다.", + "y 이동은 R1C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다.", + "z 이동은 R2C3 숫자로 제어되며, 입력은 숫자 값으로 이동 길이를 나타냅니다." + ] + }, + { + "file": "node3_scale.dart", + "name": "크기 조절 변환 diagonal3Values", + "desc": [ + "x 크기 조절은 R0C0 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다.", + "y 크기 조절은 R1C2 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다.", + "z 크기 조절은 R2C2 숫자로 제어되며, 입력은 숫자 값으로 크기 비율을 나타냅니다." + ] + }, + { + "file": "node4_rotate.dart", + "name": "회전 변환 rotation", + "desc": [ + "x 회전은 R1C1, R1C2, R2C1, R2C2로 제어되며, 입력은 라디안 값을 나타냅니다.", + "y 회전은 R0C0, R0C2, R2C0, R2C2로 제어되며, 입력은 라디안 값을 나타냅니다.", + "z 회전은 R0C0, R0C1, R1C0, R1C1로 제어됩니다." + ] + }, + { + "file": "node5_perspective.dart", + "name": "원근 변환 rotation", + "desc": [ + "R3C1, R3C2, R3C3로 원근을 제어합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json new file mode 100644 index 00000000..368179eb --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Transformação", + "info": "Pode acomodar um subcomponente, pode transformar o subcomponente através de uma matriz de transformação 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Transformação de inclinação skew", + "desc": [ + "A inclinação x é controlada pelo número R0C1, o parâmetro de entrada é o valor em radianos, indicando o ângulo de inclinação", + "A inclinação y é controlada pelo número R1C0, o parâmetro de entrada é o valor em radianos, indicando o ângulo de inclinação" + ] + }, + { + "file": "node2_translation.dart", + "name": "Transformação de translação translationValues", + "desc": [ + "A translação x é controlada pelo número R0C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação", + "A translação y é controlada pelo número R1C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação", + "A translação z é controlada pelo número R2C3, o parâmetro de entrada é um valor numérico, indicando o comprimento da translação" + ] + }, + { + "file": "node3_scale.dart", + "name": "Transformação de escala diagonal3Values", + "desc": [ + "A escala x é controlada pelo número R0C0, o parâmetro de entrada é um valor numérico, indicando a taxa de escala", + "A escala y é controlada pelo número R1C2, o parâmetro de entrada é um valor numérico, indicando a taxa de escala", + "A escala z é controlada pelo número R2C2, o parâmetro de entrada é um valor numérico, indicando a taxa de escala" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Transformação de rotação rotation", + "desc": [ + "A rotação x é controlada por R1C1, R1C2, R2C1, R2C2, o parâmetro de entrada representa radianos", + "A rotação y é controlada por R0C0, R0C2, R2C0, R2C2, o parâmetro de entrada representa radianos", + "A rotação z é controlada por R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Transformação de perspetiva rotation", + "desc": [ + "A perspetiva é controlada por R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json new file mode 100644 index 00000000..a77e34e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/Transform/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 78, + "name": "Transform", + "localName": "Преобразование", + "info": "Может содержать один дочерний компонент, который может быть преобразован с использованием матрицы преобразования 4*4.", + "lever": 4, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_skew.dart", + "name": "Наклонное преобразование skew", + "desc": [ + "Наклон по x управляется числом R0C1, входной параметр - значение в радианах, обозначающее угол наклона", + "Наклон по y управляется числом R1C0, входной параметр - значение в радианах, обозначающее угол наклона" + ] + }, + { + "file": "node2_translation.dart", + "name": "Преобразование перемещения translationValues", + "desc": [ + "Перемещение по x управляется числом R0C3, входной параметр - числовое значение, обозначающее длину перемещения", + "Перемещение по y управляется числом R1C3, входной параметр - числовое значение, обозначающее длину перемещения", + "Перемещение по z управляется числом R2C3, входной параметр - числовое значение, обозначающее длину перемещения" + ] + }, + { + "file": "node3_scale.dart", + "name": "Преобразование масштабирования diagonal3Values", + "desc": [ + "Масштабирование по x управляется числом R0C0, входной параметр - числовое значение, обозначающее коэффициент масштабирования", + "Масштабирование по y управляется числом R1C2, входной параметр - числовое значение, обозначающее коэффициент масштабирования", + "Масштабирование по z управляется числом R2C2, входной параметр - числовое значение, обозначающее коэффициент масштабирования" + ] + }, + { + "file": "node4_rotate.dart", + "name": "Преобразование вращения rotation", + "desc": [ + "Вращение по x управляется числами R1C1, R1C2, R2C1, R2C2, входной параметр - значение в радианах", + "Вращение по y управляется числами R0C0, R0C2, R2C0, R2C2, входной параметр - значение в радианах", + "Вращение по z управляется числами R0C0, R0C1, R1C0, R1C1" + ] + }, + { + "file": "node5_perspective.dart", + "name": "Преобразование перспективы rotation", + "desc": [ + "Перспектива управляется числами R3C1, R3C2, R3C3" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json new file mode 100644 index 00000000..c53fc137 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Unbegrenzte Box", + "info": "Kann ein Unterelement aufnehmen und hebt alle Bereichsbeschränkungen dieses Elements auf, um seine eigene Größe zu zeigen.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von UnconstrainedBox", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【constrainedAxis】 : Noch eingeschränkte Achse*2 【Axis】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json new file mode 100644 index 00000000..0173f769 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Unconstrained Box", + "info": "Can contain a child component and remove all area constraints of the component, displaying its own size.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of UnconstrainedBox", + "desc": [ + "【child】: Child component 【Widget】", + "【constrainedAxis】: Axes still constrained*2 【Axis】", + "【alignment】: Alignment method 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json new file mode 100644 index 00000000..d66a2aa2 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Caja sin restricciones", + "info": "Puede contener un componente hijo y elimina todas las restricciones de área de ese componente, mostrando su tamaño propio.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de UnconstrainedBox", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【constrainedAxis】 : Eje aún restringido*2 【Axis】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json new file mode 100644 index 00000000..2062709c --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Boîte sans contrainte", + "info": "Peut contenir un composant enfant et libère toutes les contraintes de zone de ce composant, montrant sa taille réelle.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'UnconstrainedBox", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【constrainedAxis】 : Axe toujours contraint*2 【Axis】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json new file mode 100644 index 00000000..399a4548 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Scatola senza vincoli", + "info": "Può contenere un componente figlio e rimuove tutti i vincoli di area di quel componente, mostrando le proprie dimensioni.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di UnconstrainedBox", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【constrainedAxis】 : Asse ancora vincolato*2 【Axis】", + "【alignment】 : Allineamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json new file mode 100644 index 00000000..5d603883 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "無制約ボックス", + "info": "子コンポーネントを収容し、そのコンポーネントのすべての領域制約を解除し、自己サイズを表示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBoxの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【constrainedAxis】 : 制約を受ける軸*2 【Axis】", + "【alignment】 : 整列方式 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json new file mode 100644 index 00000000..334a6f72 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "제약 없는 상자", + "info": "하위 컴포넌트를 수용하고 해당 컴포넌트의 모든 영역 제약을 해제하여 자체 크기를 표시합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UnconstrainedBox 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【constrainedAxis】 : 여전히 제약을 받는 축*2 【Axis】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json new file mode 100644 index 00000000..37b03da3 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Caixa sem Restrições", + "info": "Pode conter um componente filho e remove todas as restrições de área desse componente, exibindo o seu próprio tamanho.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do UnconstrainedBox", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【constrainedAxis】 : Eixo ainda restrito*2 【Axis】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json new file mode 100644 index 00000000..b9a740d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/SingleChildRenderObjectWidget/UnConstrainedBox/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 81, + "name": "UnconstrainedBox", + "localName": "Неограниченный контейнер", + "info": "Может содержать один дочерний компонент и снимает все ограничения области для этого компонента, позволяя ему отображать свои собственные размеры.", + "lever": 3, + "family": 1, + "linkIds": [ + 80 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование UnconstrainedBox", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【constrainedAxis】 : Ось, которая остается ограниченной*2 【Axis】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..f93798a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver-Navigationsleiste", + "info": "Navigationsleisten-Effekt in iOS11, der largeTitle beim Ausklappen anzeigt, beim Hochscrollen der Liste jedoch nicht. Wenn middle leer ist, wird der largeTitle in kleiner Schriftgröße als middle angezeigt.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Navigationsleiste", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【middle】 : Mittlere Komponente 【Widget】", + "【trailing】 : Rechte Komponente 【Widget】", + "【largeTitle】 : Untere ausklappbare Komponente 【Widget】", + "【border】 : Randlinie 【Border】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【padding】 : Innenabstand 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json new file mode 100644 index 00000000..d639ce44 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver Navigation Bar", + "info": "The navigation bar effect in iOS11, the largeTitle is displayed when expanded, and it is not displayed when the list is scrolled up. If the middle is empty, the largeTitle will be displayed as the middle in a smaller font size.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Navigation Bar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【largeTitle】: Bottom expandable component 【Widget】", + "【border】: Border 【Border】", + "【backgroundColor】: Background color 【Color】", + "【padding】: Padding 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..2442c5d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra de navegación Sliver", + "info": "Efecto de la barra de navegación en iOS11, el largeTitle se muestra cuando se expande, no se muestra cuando la lista se desliza hacia arriba. Si el middle está vacío, el largeTitle se mostrará como middle con un tamaño de fuente pequeño.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de la barra de navegación", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente derecho 【Widget】", + "【largeTitle】 : Componente de expansión inferior 【Widget】", + "【border】 : Borde 【Border】", + "【backgroundColor】 : Color de fondo 【Color】", + "【padding】 : Relleno interno 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..125aec02 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barre de navigation Sliver", + "info": "Effet de la barre de navigation dans iOS11, le largeTitle s'affiche lors du déploiement, disparaît lors du défilement vers le haut de la liste. Si le middle est vide, le largeTitle sera affiché en petite taille comme middle.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de la barre de navigation", + "desc": [ + "【leading】 : Composant de gauche 【Widget】", + "【middle】 : Composant du milieu 【Widget】", + "【trailing】 : Composant de droite 【Widget】", + "【largeTitle】 : Composant de déploiement en bas 【Widget】", + "【border】 : Bordure 【Border】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..07b5f945 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra di navigazione Sliver", + "info": "Effetto della barra di navigazione in iOS11, il largeTitle viene visualizzato quando espanso, non viene visualizzato quando la lista scorre verso l'alto, se il middle è vuoto, il largeTitle verrà visualizzato come middle con un carattere più piccolo.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base della barra di navigazione", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】 : Componente centrale 【Widget】", + "【trailing】 : Componente finale 【Widget】", + "【largeTitle】 : Componente di espansione inferiore 【Widget】", + "【border】 : Bordo 【Border】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..1f1abc56 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliverナビゲーションバー", + "info": "iOS11のナビゲーションバー効果で、展開時にlargeTitleが表示され、リストを上にスクロールすると表示されなくなります。もしmiddleが空の場合、largeTitleは小さいフォントサイズでmiddleとして表示されます。", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ナビゲーションバーの基本使用", + "desc": [ + "【leading】 : 左側のコンポーネント 【Widget】", + "【middle】 : 中間のコンポーネント 【Widget】", + "【trailing】 : 末尾のコンポーネント 【Widget】", + "【largeTitle】 : 下部折りたたみコンポーネント 【Widget】", + "【border】 : ボーダー 【Border】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内側の余白 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..d0388828 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver 네비게이션 바", + "info": "iOS11에서의 네비게이션 바 효과, 펼칠 때 largeTitle이 표시되며, 리스트를 위로 스크롤하면 표시되지 않습니다. middle이 비어 있으면 largeTitle이 작은 글자 크기로 middle로 표시됩니다.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "네비게이션 바 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】 : 중간 컴포넌트 【Widget】", + "【trailing】 : 오른쪽 컴포넌트 【Widget】", + "【largeTitle】 : 하단 확장 컴포넌트 【Widget】", + "【border】 : 테두리 【Border】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 안쪽 여백 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..e363bc47 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Barra de navegação Sliver", + "info": "Efeito da barra de navegação no iOS11, o largeTitle é exibido quando expandido, não é exibido quando a lista é deslizada para cima, se o middle estiver vazio, o largeTitle será exibido como middle com um tamanho de fonte menor.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico da barra de navegação", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【middle】 : Componente do meio 【Widget】", + "【trailing】 : Componente da cauda 【Widget】", + "【largeTitle】 : Componente de expansão inferior 【Widget】", + "【border】 : Borda 【Border】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Preenchimento interno 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..a51f90df --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverNavigationBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 302, + "name": "CupertinoSliverNavigationBar", + "localName": "Sliver навигационная панель", + "info": "Эффект навигационной панели в iOS11, largeTitle отображается при раскрытии, не отображается при прокрутке списка вверх. Если middle пуст, largeTitle будет отображаться как middle с меньшим размером шрифта.", + "lever": 2, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование навигационной панели", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】 : Средний компонент 【Widget】", + "【trailing】 : Хвостовой компонент 【Widget】", + "【largeTitle】 : Нижний раскрывающийся компонент 【Widget】", + "【border】 : Граница 【Border】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренний отступ 【EdgeInsetsDirectional】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json new file mode 100644 index 00000000..3e180a10 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver Aktualisierungssteuerung", + "info": "iOS-Stil Pull-to-Refresh-Steuerung, die asynchrone Aktualisierungsmethoden, benutzerdefinierte Steuerungskomponenten, die Höhe des Indikators und die Höhe des Auslösens des Ladens durchziehen kann.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Aktualisierungssteuerung", + "desc": [ + "【refreshIndicatorExtent】 : Höhe des Ladeindikators 【double】", + "【refreshTriggerPullDistance】 : Höhe des Auslösens des Ladens durchziehen 【double】", + "【onRefresh】 : Pull-to-Refresh-Ereignis 【RefreshCallback】", + "【builder】 : Indikator-Builder 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json new file mode 100644 index 00000000..759043ab --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver Refresh Controller", + "info": "iOS-style pull-to-refresh controller that can execute asynchronous refresh methods, customize controller components, set the height at which the indicator stays, and the scroll height that triggers loading.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Refresh Controller", + "desc": [ + "【refreshIndicatorExtent】: Height of the loading indicator 【double】", + "【refreshTriggerPullDistance】: Scroll height that triggers loading 【double】", + "【onRefresh】: Pull-down event 【RefreshCallback】", + "【builder】: Indicator builder 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json new file mode 100644 index 00000000..b3bbc36d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controlador de actualización Sliver", + "info": "Controlador de actualización de estilo iOS que puede ejecutar métodos de actualización asíncronos, personalizar componentes del controlador, altura de permanencia del indicador y altura de deslizamiento para activar la carga.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del controlador de actualización", + "desc": [ + "【refreshIndicatorExtent】 : Altura del indicador de carga 【double】", + "【refreshTriggerPullDistance】 : Altura de deslizamiento para activar la carga 【double】", + "【onRefresh】 : Evento de deslizamiento hacia abajo 【RefreshCallback】", + "【builder】 : Constructor del indicador 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json new file mode 100644 index 00000000..97e8293d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Contrôleur de rafraîchissement Sliver", + "info": "Contrôleur de rafraîchissement de style iOS, capable d'exécuter des méthodes de rafraîchissement asynchrones, de personnaliser les composants du contrôleur, la hauteur de séjour de l'indicateur et la hauteur de glissement pour déclencher le chargement.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du contrôleur de rafraîchissement", + "desc": [ + "【refreshIndicatorExtent】 : Hauteur de l'indicateur de chargement 【double】", + "【refreshTriggerPullDistance】 : Hauteur de glissement pour déclencher le chargement 【double】", + "【onRefresh】 : Événement de glissement vers le bas 【RefreshCallback】", + "【builder】 : Constructeur de l'indicateur 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json new file mode 100644 index 00000000..657a1847 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controller di aggiornamento Sliver", + "info": "Controller di aggiornamento a stile iOS, esegue metodi di aggiornamento asincroni, personalizza i componenti del controller, l'altezza di sosta dell'indicatore e l'altezza di scorrimento per attivare il caricamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base del controller di aggiornamento", + "desc": [ + "【refreshIndicatorExtent】 : Altezza dell'indicatore di caricamento 【double】", + "【refreshTriggerPullDistance】 : Altezza di scorrimento per attivare il caricamento 【double】", + "【onRefresh】 : Evento di trascinamento verso il basso 【RefreshCallback】", + "【builder】 : Costruttore dell'indicatore 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json new file mode 100644 index 00000000..2ef32644 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliverリフレッシュコントローラー", + "info": "iOSスタイルのプルダウンリフレッシュコントローラーで、非同期リフレッシュメソッドの実行、カスタムコントローラーコンポーネント、インジケーターの停留高さ、およびロードをトリガーするスワイプ高さを設定できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "リフレッシュコントローラーの基本使用", + "desc": [ + "【refreshIndicatorExtent】 : ロード中インジケーターの高さ 【double】", + "【refreshTriggerPullDistance】 : ロードをトリガーするスワイプ高さ 【double】", + "【onRefresh】 : プルダウンイベント 【RefreshCallback】", + "【builder】 : インジケーターコンストラクター 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json new file mode 100644 index 00000000..dc59fef1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver 새로고침 컨트롤러", + "info": "iOS 스타일의 풀다운 새로고침 컨트롤러로, 비동기 새로고침 메소드 실행, 사용자 정의 컨트롤러 컴포넌트, 인디케이터 고정 높이 및 로딩을 트리거하는 스와이프 높이를 설정할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "새로고침 컨트롤러 기본 사용", + "desc": [ + "【refreshIndicatorExtent】 : 로딩 중 인디케이터 높이 【double】", + "【refreshTriggerPullDistance】 : 로딩을 트리거하는 스와이프 높이 【double】", + "【onRefresh】 : 풀다운 이벤트 【RefreshCallback】", + "【builder】 : 인디케이터 빌더 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json new file mode 100644 index 00000000..dfcb1391 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Controlador de Atualização Sliver", + "info": "Controlador de atualização de deslizar para baixo no estilo iOS, capaz de executar métodos de atualização assíncronos, personalizar componentes do controlador, altura de permanência do indicador e altura de deslize para acionar o carregamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Controlador de Atualização", + "desc": [ + "【refreshIndicatorExtent】 : Altura do indicador de carregamento 【double】", + "【refreshTriggerPullDistance】 : Altura de deslize para acionar o carregamento 【double】", + "【onRefresh】 : Evento de deslizar para baixo 【RefreshCallback】", + "【builder】 : Construtor do indicador 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json new file mode 100644 index 00000000..ba7d2b0e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CupertinoSliverRefreshControl/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 303, + "name": "CupertinoSliverRefreshControl", + "localName": "Sliver контроллер обновления", + "info": "Контроллер обновления в стиле iOS, который может выполнять асинхронные методы обновления, настраивать компоненты контроллера, высоту остановки индикатора и высоту скольжения для запуска загрузки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование контроллера обновления", + "desc": [ + "【refreshIndicatorExtent】 : Высота индикатора загрузки 【double】", + "【refreshTriggerPullDistance】 : Высота скольжения для запуска загрузки 【double】", + "【onRefresh】 : Событие прокрутки вниз 【RefreshCallback】", + "【builder】 : Конструктор индикатора 【RefreshControlIndicatorBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json new file mode 100644 index 00000000..65808d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Allgemeine Scroll-Ansicht", + "info": "Eine allgemeine Scroll-Struktur, die Eigenschaften wie Scroll-Richtung, ob umgekehrt, Scroll-Controller usw. festlegen kann. Die darin enthaltenen Unterkomponenten müssen zur Sliver-Familie gehören.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CustomScrollView", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】", + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scroll-Richtung 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json new file mode 100644 index 00000000..5eb90c19 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "General Scroll View", + "info": "A general scroll structure that can specify properties such as scroll direction, whether to reverse, scroll controller, etc. The child components it contains must be from the Sliver family.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CustomScrollView", + "desc": [ + "【slivers】 : Child component list 【List】", + "【reverse】 : Whether to reverse 【bool】", + "【scrollDirection】 : Scroll direction 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json new file mode 100644 index 00000000..8544d175 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Vista de desplazamiento universal", + "info": "Una estructura de desplazamiento universal que puede especificar la dirección de desplazamiento, si es inverso, el controlador de desplazamiento y otras propiedades. Los componentes secundarios que contiene deben ser de la familia Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CustomScrollView", + "desc": [ + "【slivers】 : Lista de componentes secundarios 【List】", + "【reverse】 : Si es inverso 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json new file mode 100644 index 00000000..3491884b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Vue de défilement universelle", + "info": "Une structure de défilement universelle qui permet de spécifier la direction du défilement, l'inversion, le contrôleur de défilement, etc. Les composants enfants inclus doivent être de la famille Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CustomScrollView", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】", + "【reverse】 : Inversion 【bool】", + "【scrollDirection】 : Direction du défilement 【Axis】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json new file mode 100644 index 00000000..ef4f3b17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Visualizzazione a scorrimento universale", + "info": "Una struttura di scorrimento universale che consente di specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà. I componenti figli inclusi devono appartenere alla famiglia Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CustomScrollView", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】", + "【reverse】 : Se invertire 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json new file mode 100644 index 00000000..610f11f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "汎用スクロールビュー", + "info": "汎用的なスクロール構造で、スクロール方向、逆方向かどうか、スクロールコントローラーなどの属性を指定できます。含まれる子コンポーネントはSliverファミリーでなければなりません。", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollViewの基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】", + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json new file mode 100644 index 00000000..5ce0e4b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "일반 스크롤 뷰", + "info": "일반적인 스크롤 구조로, 스크롤 방향, 역방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다. 포함된 하위 컴포넌트들은 반드시 Sliver 패밀리여야 합니다.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CustomScrollView 기본 사용법", + "desc": [ + "【slivers】 : 하위 컴포넌트 목록 【List】", + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json new file mode 100644 index 00000000..3195984f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Visão de Rolagem Universal", + "info": "Uma estrutura de rolagem universal que pode especificar a direção de rolagem, se é reversa, o controlador de rolagem e outras propriedades. Os componentes filhos incluídos devem ser da família Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CustomScrollView", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】", + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json new file mode 100644 index 00000000..1d1e586b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/CustomScrollView/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 183, + "name": "CustomScrollView", + "localName": "Универсальная прокрутка", + "info": "Универсальная структура прокрутки, которая позволяет задать направление прокрутки, обратное ли оно, контроллер прокрутки и другие свойства. Вложенные компоненты должны принадлежать семейству Sliver.", + "lever": 5, + "family": 4, + "linkIds": [ + 184, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CustomScrollView", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】", + "【reverse】 : Обратная ли прокрутка 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json new file mode 100644 index 00000000..c5891b0d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Dekorierte Gleitfläche", + "info": "Diese Komponente wird in einem Scroll-Viewport verwendet und kann ein untergeordnetes Sliver-Element umhüllen, um ihm einen Dekorationseffekt hinzuzufügen.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von DecoratedSliver", + "desc": [ + "【sliver】 : Kindkomponente 【Widget?】", + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【position】 : Dekorationsposition 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json new file mode 100644 index 00000000..8a4de0b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Decorated Sliver", + "info": "This component is used in sliding viewports and can wrap a child Sliver component to add Decoration effects.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of DecoratedSliver", + "desc": [ + "【sliver】: Child component 【Widget?】", + "【decoration】: Decoration object 【Decoration】", + "【position】: Decoration position 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json new file mode 100644 index 00000000..78ade3b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Panel deslizante decorado", + "info": "Este componente se aplica en ventanas deslizantes y puede envolver un componente Sliver hijo para agregar efectos de decoración Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de DecoratedSliver", + "desc": [ + "【sliver】 : Componente hijo 【Widget?】", + "【decoration】 : Objeto de decoración 【Decoration】", + "【position】 : Posición de la decoración 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json new file mode 100644 index 00000000..2a9b5860 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Glissière décorée", + "info": "Ce composant est utilisé dans une vue défilante et peut envelopper un composant Sliver enfant pour ajouter un effet de décoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de DecoratedSliver", + "desc": [ + "【sliver】 : Composant enfant 【Widget?】", + "【decoration】 : Objet de décoration 【Decoration】", + "【position】 : Position de la décoration 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json new file mode 100644 index 00000000..b9b45c95 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Decorazione Sliver", + "info": "Questo componente viene utilizzato in una vista scorrevole e può avvolgere un componente Sliver figlio, aggiungendo un effetto decorativo Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di DecoratedSliver", + "desc": [ + "【sliver】 : Componente figlio 【Widget?】", + "【decoration】 : Oggetto decorativo 【Decoration】", + "【position】 : Posizione della decorazione 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json new file mode 100644 index 00000000..4bff3278 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "装飾スライバー", + "info": "このコンポーネントはスクロールビューで使用され、子スライバーコンポーネントをラップして、装飾効果を追加します。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver の基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget?】", + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【position】 : 装飾位置 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json new file mode 100644 index 00000000..8ea23507 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "장식 슬라이더", + "info": "이 컴포넌트는 슬라이딩 뷰포트에 적용되며, 자식 Sliver 컴포넌트를 감싸서 Decoration 장식 효과를 추가할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "DecoratedSliver 기본 사용법", + "desc": [ + "【sliver】 : 자식 컴포넌트 【Widget?】", + "【decoration】 : 장식 객체 【Decoration】", + "【position】 : 장식 위치 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json new file mode 100644 index 00000000..d55a2668 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Slider Decorado", + "info": "Este componente é aplicado em portas de visualização deslizantes, pode envolver um componente Sliver filho, adicionando um efeito de decoração Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do DecoratedSliver", + "desc": [ + "【sliver】 : Componente filho 【Widget?】", + "【decoration】 : Objeto de decoração 【Decoration】", + "【position】 : Posição da decoração 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json new file mode 100644 index 00000000..633b7d75 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/DecoratedSliver/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 209, + "name": "DecoratedSliver", + "localName": "Декорированный слайдер", + "info": "Этот компонент используется в прокручиваемых окнах и может обернуть дочерний компонент Sliver, добавляя эффекты декорации Decoration.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование DecoratedSliver", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget?】", + "【decoration】 : Объект декорации 【Decoration】", + "【position】 : Позиция декорации 【DecorationPosition】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json new file mode 100644 index 00000000..36a9e492 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Dehnbarer Raumleiste", + "info": "Wird normalerweise im dehnbaren Bereich von SliverAppBar verwendet und kann Titel, Titelabstand, Hintergrund, Faltmodus usw. angeben.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FlexibleSpaceBar", + "desc": [ + "【title】 : Titelkomponente 【Widget】", + "【titlePadding】 : Titelabstand 【EdgeInsetsGeometry】", + "【collapseMode】 : Faltmodus 【CollapseMode】", + "【stretchModes】 : Dehnmodi 【List】", + "【background】 : Hintergrundkomponente 【Widget】", + "【centerTitle】 : Zentralisiert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json new file mode 100644 index 00000000..fee8b71a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Stretch Space Bar", + "info": "Typically used in the stretchable area of SliverAppBar, it can specify the title, title spacing, background, collapse mode, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FlexibleSpaceBar", + "desc": [ + "【title】 : Title component 【Widget】", + "【titlePadding】 : Title spacing 【EdgeInsetsGeometry】", + "【collapseMode】 : Collapse mode 【CollapseMode】", + "【stretchModes】 : Stretch modes 【List】", + "【background】 : Background component 【Widget】", + "【centerTitle】 : Whether to center 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json new file mode 100644 index 00000000..04bd8a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra de espacio flexible", + "info": "Normalmente se utiliza en la región extensible de SliverAppBar, donde se pueden especificar el título, el espaciado del título, el fondo, el modo de plegado, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FlexibleSpaceBar", + "desc": [ + "【title】 : Componente de título 【Widget】", + "【titlePadding】 : Espaciado del título 【EdgeInsetsGeometry】", + "【collapseMode】 : Modo de plegado 【CollapseMode】", + "【stretchModes】 : Modos de extensión 【List】", + "【background】 : Componente de fondo 【Widget】", + "【centerTitle】 : Centrado o no 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json new file mode 100644 index 00000000..7af61bbf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barre d'espace flexible", + "info": "Utilisé généralement dans la zone extensible de SliverAppBar, permet de spécifier le titre, l'espacement du titre, l'arrière-plan, le mode de repli, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FlexibleSpaceBar", + "desc": [ + "【title】 : Composant de titre 【Widget】", + "【titlePadding】 : Espacement du titre 【EdgeInsetsGeometry】", + "【collapseMode】 : Mode de repli 【CollapseMode】", + "【stretchModes】 : Modes d'extension 【List】", + "【background】 : Composant d'arrière-plan 【Widget】", + "【centerTitle】 : Centré ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json new file mode 100644 index 00000000..0fbf71be --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra spaziale flessibile", + "info": "Utilizzata solitamente nell'area estensibile di SliverAppBar, può specificare titolo, spaziatura del titolo, sfondo, modalità di collasso, ecc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di FlexibleSpaceBar", + "desc": [ + "【title】 : Componente del titolo 【Widget】", + "【titlePadding】 : Spaziatura del titolo 【EdgeInsetsGeometry】", + "【collapseMode】 : Modalità di collasso 【CollapseMode】", + "【stretchModes】 : Modalità di estensione 【List】", + "【background】 : Componente di sfondo 【Widget】", + "【centerTitle】 : Centrato o meno 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json new file mode 100644 index 00000000..b0b59ec1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "伸縮スペースバー", + "info": "通常、SliverAppBar内の伸縮可能な領域に使用され、タイトル、タイトルの間隔、背景、折りたたみモードなどを指定できます。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBarの基本使用", + "desc": [ + "【title】 : タイトルコンポーネント 【Widget】", + "【titlePadding】 : タイトルの間隔 【EdgeInsetsGeometry】", + "【collapseMode】 : 折りたたみモード 【CollapseMode】", + "【stretchModes】 : 伸縮モード 【List】", + "【background】 : 背景コンポーネント 【Widget】", + "【centerTitle】 : 中央揃えかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json new file mode 100644 index 00000000..50308618 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "확장 가능한 공간 바", + "info": "일반적으로 SliverAppBar에서 확장 가능한 영역으로 사용되며, 제목, 제목 간격, 배경, 접기 모드 등을 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlexibleSpaceBar 기본 사용법", + "desc": [ + "【title】 : 제목 컴포넌트 【Widget】", + "【titlePadding】 : 제목 간격 【EdgeInsetsGeometry】", + "【collapseMode】 : 접기 모드 【CollapseMode】", + "【stretchModes】 : 확장 모드 【List】", + "【background】 : 배경 컴포넌트 【Widget】", + "【centerTitle】 : 중앙 정렬 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json new file mode 100644 index 00000000..16985132 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Barra de Espaço Flexível", + "info": "Normalmente usado na área expansível de um SliverAppBar, pode especificar o título, espaçamento do título, fundo, modo de recolhimento, etc.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FlexibleSpaceBar", + "desc": [ + "【title】 : Componente do título 【Widget】", + "【titlePadding】 : Espaçamento do título 【EdgeInsetsGeometry】", + "【collapseMode】 : Modo de recolhimento 【CollapseMode】", + "【stretchModes】 : Modos de extensão 【List】", + "【background】 : Componente de fundo 【Widget】", + "【centerTitle】 : Centralizar 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json new file mode 100644 index 00000000..a0a1a9fe --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/FlexibleSpaceBar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 196, + "name": "FlexibleSpaceBar", + "localName": "Растягивающееся пространство", + "info": "Обычно используется в растягиваемой области SliverAppBar, можно указать заголовок, отступы заголовка, фон, режим сворачивания и т.д.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FlexibleSpaceBar", + "desc": [ + "【title】 : Заголовок 【Widget】", + "【titlePadding】 : Отступ заголовка 【EdgeInsetsGeometry】", + "【collapseMode】 : Режим сворачивания 【CollapseMode】", + "【stretchModes】 : Режимы растяжения 【List】", + "【background】 : Фон 【Widget】", + "【centerTitle】 : Центрировать заголовок 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json new file mode 100644 index 00000000..a7a8130b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Fixierter Header-Sliver", + "info": "Ein Sliver, der am oberen Rand des Viewports verbleiben kann und den Effekt des Festklebens einfach erreicht.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver offizielles Beispiel", + "display": "new_page", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget?】", + "PinnedHeaderSliver kann nur in Scroll-Viewports verwendet werden, wobei die untergeordnete Komponente beim Scrollen nach oben nicht aus dem Viewport verschwindet, sondern am oberen Rand des Viewports verbleibt." + ] + }, + { + "file": "node_02.dart", + "name": "Titel festkleben", + "display": "new_page", + "desc": [ + "Ein auf PinnedHeaderSliver basierender Effekt, bei dem der Titel festklebt. Beachten Sie, dass auch die Trennlinie unten den Effekt des Festklebens hat." + ] + }, + { + "file": "node_03.dart", + "name": "Titel+Suche festkleben", + "display": "new_page", + "desc": [ + "Ein auf PinnedHeaderSliver basierender Effekt, bei dem der Titel und das Suchfeld festkleben." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json new file mode 100644 index 00000000..cd8ac1f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Pinned Header Sliver", + "info": "A sliver that can stay at the top of the viewport, easily achieving a sticky header effect.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver Official Example", + "display": "new_page", + "desc": [ + "【child】 : Child widget 【Widget?】", + "PinnedHeaderSliver can only be used in a scroll viewport, where the child widget will not move out of the viewport when scrolling to the top, thus staying above the viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Sticky Header", + "display": "new_page", + "desc": [ + "The sticky header effect implemented based on PinnedHeaderSliver, note that the divider below also has a sticky effect." + ] + }, + { + "file": "node_03.dart", + "name": "Sticky Header + Search", + "display": "new_page", + "desc": [ + "The sticky header + search box effect implemented based on PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json new file mode 100644 index 00000000..520a0506 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Cabecera Fija Deslizante", + "info": "Un panel deslizante que puede permanecer en la parte superior de la ventana gráfica, logrando fácilmente el efecto de fijación en la parte superior.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Ejemplo oficial de PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente hijo 【Widget?】", + "PinnedHeaderSliver solo se puede usar en ventanas gráficas desplazables, donde el componente hijo no sale de la ventana gráfica cuando se desliza hacia la parte superior, permaneciendo así en la parte superior de la ventana gráfica." + ] + }, + { + "file": "node_02.dart", + "name": "Título fijado en la parte superior", + "display": "new_page", + "desc": [ + "Efecto de título fijado en la parte superior basado en PinnedHeaderSliver, observe que la línea divisoria inferior también tiene el efecto de fijación en la parte superior." + ] + }, + { + "file": "node_03.dart", + "name": "Título + Búsqueda fijada en la parte superior", + "display": "new_page", + "desc": [ + "Efecto de título + cuadro de búsqueda fijado en la parte superior basado en PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json new file mode 100644 index 00000000..0e1a5c81 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Glissière d'en-tête fixe", + "info": "Une glissière qui peut rester en haut de la vue, permettant de réaliser facilement un effet de fixation en haut.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Exemple officiel de PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Composant enfant 【Widget?】", + "PinnedHeaderSliver ne peut être utilisé que dans une vue défilante, où le composant enfant ne sort pas de la vue lorsqu'il est glissé vers le haut, restant ainsi en haut de la vue." + ] + }, + { + "file": "node_02.dart", + "name": "Titre fixé en haut", + "display": "new_page", + "desc": [ + "Effet de titre fixé en haut basé sur PinnedHeaderSliver, notez que la ligne de séparation en dessous a également un effet de fixation en haut." + ] + }, + { + "file": "node_03.dart", + "name": "Titre + recherche fixés en haut", + "display": "new_page", + "desc": [ + "Effet de titre + boîte de recherche fixés en haut basé sur PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json new file mode 100644 index 00000000..29a97b67 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Sliver con intestazione fissa", + "info": "Uno sliver che può rimanere nella parte superiore della viewport, per ottenere facilmente l'effetto di adesione in cima.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Esempio ufficiale di PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente figlio 【Widget?】", + "PinnedHeaderSliver può essere utilizzato solo in una viewport scorrevole, dove il componente figlio, quando scorre verso l'alto, non esce dalla viewport, rimanendo così nella parte superiore della viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Intestazione adesiva", + "display": "new_page", + "desc": [ + "Effetto di intestazione adesiva realizzato con PinnedHeaderSliver, nota che anche la linea di separazione sotto ha un effetto adesivo." + ] + }, + { + "file": "node_03.dart", + "name": "Intestazione + ricerca adesiva", + "display": "new_page", + "desc": [ + "Effetto di intestazione e casella di ricerca adesiva realizzato con PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json new file mode 100644 index 00000000..dd19b43d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "固定ヘッダースライバー", + "info": "ビューポート上部に留まるスライバーで、簡単に吸着効果を実現できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 公式サンプル", + "display": "new_page", + "desc": [ + "【child】 : 子コンポーネント 【Widget?】", + "PinnedHeaderSliver はスクロールビューポートでのみ使用でき、子コンポーネントはトップにスクロールしてもビューポートから出ず、ビューポート上部に留まります。" + ] + }, + { + "file": "node_02.dart", + "name": "タイトル吸着", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver に基づいて実装されたタイトル吸着効果です。下の分割線にも吸着効果があることに注意してください。" + ] + }, + { + "file": "node_03.dart", + "name": "タイトル+検索吸着", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver に基づいて実装されたタイトル+検索ボックスの吸着効果です。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json new file mode 100644 index 00000000..2b05b022 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "고정 헤더 슬라이버", + "info": "뷰포트 상단에 고정될 수 있는 슬라이버로, 쉽게 상단 고정 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "PinnedHeaderSliver 공식 예제", + "display": "new_page", + "desc": [ + "【child】 : 자식 위젯 【Widget?】", + "PinnedHeaderSliver는 스크롤 뷰포트에서만 사용할 수 있으며, 자식 위젯이 상단으로 스크롤될 때 뷰포트에서 벗어나지 않고 상단에 고정됩니다." + ] + }, + { + "file": "node_02.dart", + "name": "제목 상단 고정", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver를 기반으로 구현한 제목 상단 고정 효과, 아래 구분선도 상단 고정 효과가 적용된 것을 확인할 수 있습니다." + ] + }, + { + "file": "node_03.dart", + "name": "제목+검색 상단 고정", + "display": "new_page", + "desc": [ + "PinnedHeaderSliver를 기반으로 구현한 제목과 검색창의 상단 고정 효과." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json new file mode 100644 index 00000000..126b966f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Cabeçalho Fixo Deslizante", + "info": "Um painel deslizante que pode permanecer na parte superior da viewport, facilitando o efeito de fixação no topo.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Exemplo Oficial do PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Componente filho 【Widget?】", + "O PinnedHeaderSliver só pode ser usado em viewports de rolagem, onde o componente filho não sai da viewport ao rolar para o topo, permanecendo assim na parte superior da viewport." + ] + }, + { + "file": "node_02.dart", + "name": "Título Fixo no Topo", + "display": "new_page", + "desc": [ + "Efeito de título fixo no topo baseado no PinnedHeaderSliver, observe que a linha divisória abaixo também tem o efeito de fixação no topo." + ] + }, + { + "file": "node_03.dart", + "name": "Título + Barra de Pesquisa Fixa no Topo", + "display": "new_page", + "desc": [ + "Efeito de título + barra de pesquisa fixa no topo baseado no PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json new file mode 100644 index 00000000..00291bfa --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/PinnedHeaderSliver/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 309, + "name": "PinnedHeaderSliver", + "localName": "Фиксированный верхний слайдер", + "info": "Слайдер, который может оставаться в верхней части окна просмотра, легко достигая эффекта прилипания к верху.", + "lever": 4, + "family": 4, + "linkIds": [ + 190 + ], + "nodes": [ + { + "file": "node_01.dart", + "name": "Официальный пример PinnedHeaderSliver", + "display": "new_page", + "desc": [ + "【child】 : Дочерний компонент 【Widget?】", + "PinnedHeaderSliver может использоваться только в прокручиваемом окне просмотра, где дочерний компонент при прокрутке до верха не выходит из окна просмотра, а остается в его верхней части." + ] + }, + { + "file": "node_02.dart", + "name": "Прилипание заголовка к верху", + "display": "new_page", + "desc": [ + "Эффект прилипания заголовка к верху, реализованный на основе PinnedHeaderSliver. Обратите внимание, что разделительная линия внизу также имеет эффект прилипания к верху." + ] + }, + { + "file": "node_03.dart", + "name": "Прилипание заголовка и поиска к верху", + "display": "new_page", + "desc": [ + "Эффект прилипания заголовка и поля поиска к верху, реализованный на основе PinnedHeaderSliver." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json new file mode 100644 index 00000000..3b1fdbf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver animierte Liste", + "info": "Eine Sliver-Komponente, die beim Einfügen oder Entfernen von Elementen Animationseffekte erzeugt.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverAnimatedList", + "desc": [ + "【itemBuilder】 : Item-Konstruktor 【AnimatedListItemBuilder】", + "【initialItemCount】 : Anfangszahl der Items 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json new file mode 100644 index 00000000..aebb2f92 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver Animated List", + "info": "A sliver component that animates items when they are inserted or removed.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverAnimatedList", + "desc": [ + "【itemBuilder】: Item builder 【AnimatedListItemBuilder】", + "【initialItemCount】: Initial item count 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json new file mode 100644 index 00000000..d25e85a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista animada Sliver", + "info": "Componente sliver que anima los elementos al insertar o eliminar.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverAnimatedList", + "desc": [ + "【itemBuilder】: Constructor de elementos 【AnimatedListItemBuilder】", + "【initialItemCount】: Número inicial de elementos 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json new file mode 100644 index 00000000..5286a69e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Liste animée Sliver", + "info": "Un composant sliver qui anime les éléments lors de leur insertion ou suppression.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverAnimatedList", + "desc": [ + "【itemBuilder】 : constructeur d'item 【AnimatedListItemBuilder】", + "【initialItemCount】 : nombre initial d'items 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json new file mode 100644 index 00000000..10b79a1d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista animata Sliver", + "info": "Componente sliver che aggiunge effetti animati quando si inseriscono o rimuovono elementi.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverAnimatedList", + "desc": [ + "【itemBuilder】: costruttore di item 【AnimatedListItemBuilder】", + "【initialItemCount】: numero iniziale di item 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json new file mode 100644 index 00000000..c161c7a0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliverアニメーションリスト", + "info": "アイテムを挿入または削除する際にアニメーション効果を持つsliverコンポーネント。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList基本使用", + "desc": [ + "【itemBuilder】 : アイテムビルダー 【AnimatedListItemBuilder】", + "【initialItemCount】 : 初期アイテム数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json new file mode 100644 index 00000000..623980fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Sliver 애니메이션 리스트", + "info": "항목을 삽입하거나 삭제할 때 애니메이션 효과를 주는 sliver 컴포넌트입니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAnimatedList 기본 사용", + "desc": [ + "【itemBuilder】 : 아이템 생성기 【AnimatedListItemBuilder】", + "【initialItemCount】 : 초기 아이템 개수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json new file mode 100644 index 00000000..f05bec08 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Lista Animada Sliver", + "info": "Componente sliver que anima itens ao inserir ou remover.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverAnimatedList", + "desc": [ + "【itemBuilder】: construtor de itens 【AnimatedListItemBuilder】", + "【initialItemCount】: número inicial de itens 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json new file mode 100644 index 00000000..f1897729 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAnimatedList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 301, + "name": "SliverAnimatedList", + "localName": "Анимированный список Sliver", + "info": "Компонент Sliver, который анимирует элементы при их вставке или удалении.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverAnimatedList", + "desc": [ + "【itemBuilder】: конструктор элемента 【AnimatedListItemBuilder】", + "【initialItemCount】: начальное количество элементов 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json new file mode 100644 index 00000000..ed587190 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver-Kopfleiste", + "info": "Die allgemeine Struktur der oberen Leiste der Sliver-Familie, die linke, mittlere und rechte Komponenten, Schrumpfraum, Schattentiefe, Festmodus, Hintergrundfarbe usw. angeben kann.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverAppBar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【title】 : Mittlere Komponente 【Widget】", + "【actions】 : Liste der rechten Komponenten 【List】", + "【floating】 : Ob schwebend 【bool】", + "【pinned】 : Ob oben verbleibend 【bool】", + "【snap】 : Ob halb zusammengeklappt 【bool】", + "【bottom】 : Untere Komponente 【PreferredSizeWidget】", + "【expandedHeight】 : Erweiterungshöhe 【double】", + "【elevation】 : Schattentiefe 【double】", + "【flexibleSpace】 : Erweiterungsraum 【FlexibleSpaceBar】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【controller】 : Controller 【ScrollController】", + " Wenn snap true ist, muss floating true sein" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json new file mode 100644 index 00000000..d149c4ec --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver Header Bar", + "info": "A common structure for the top bar of the Sliver family, which can specify left, center, and right components, collapse space, shadow depth, fixed mode, background color, and other properties.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverAppBar", + "desc": [ + "【leading】: Left component 【Widget】", + "【title】: Center component 【Widget】", + "【actions】: List of trailing components 【List】", + "【floating】: Whether to float 【bool】", + "【pinned】: Whether to stay at the top 【bool】", + "【snap】: Whether to semi-collapse 【bool】", + "【bottom】: Bottom component 【PreferredSizeWidget】", + "【expandedHeight】: Expanded height 【double】", + "【elevation】: Shadow depth 【double】", + "【flexibleSpace】: Expanded space 【FlexibleSpaceBar】", + "【backgroundColor】: Background color 【Color】", + "【controller】: Controller 【ScrollController】", + " When snap is true, floating must be true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json new file mode 100644 index 00000000..561d9e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra superior Sliver", + "info": "Estructura común de la barra superior de la familia Sliver, que puede especificar componentes izquierdos, centrales y derechos, espacio de contracción, profundidad de sombra, modo fijo, color de fondo, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverAppBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Lista de componentes finales 【List】", + "【floating】 : Si flota 【bool】", + "【pinned】 : Si se queda en la parte superior 【bool】", + "【snap】 : Si se contrae parcialmente 【bool】", + "【bottom】 : Componente inferior 【PreferredSizeWidget】", + "【expandedHeight】 : Altura extendida 【double】", + "【elevation】 : Profundidad de sombra 【double】", + "【flexibleSpace】 : Espacio extendido 【FlexibleSpaceBar】", + "【backgroundColor】 : Color de fondo 【Color】", + "【controller】 : Controlador 【ScrollController】", + " snap debe ser true cuando floating es true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json new file mode 100644 index 00000000..875a641f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barre d'en-tête Sliver", + "info": "Structure générique de la barre supérieure de la famille Sliver, qui peut spécifier des composants gauche, centre et droit, un espace de rétrécissement, une profondeur d'ombre, un mode fixe, une couleur d'arrière-plan, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverAppBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【title】 : Composant central 【Widget】", + "【actions】 : Liste des composants de fin 【List】", + "【floating】 : Flottant ou non 【bool】", + "【pinned】 : Reste en haut ou non 【bool】", + "【snap】 : Semi-déployé ou non 【bool】", + "【bottom】 : Composant inférieur 【PreferredSizeWidget】", + "【expandedHeight】 : Hauteur étendue 【double】", + "【elevation】 : Profondeur d'ombre 【double】", + "【flexibleSpace】 : Espace étendu 【FlexibleSpaceBar】", + "【backgroundColor】 : Couleur d'arrière-plan 【Color】", + "【controller】 : Contrôleur 【ScrollController】", + " snap doit être true lorsque floating est true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json new file mode 100644 index 00000000..3e967d78 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra superiore Sliver", + "info": "Struttura generica della barra superiore della famiglia Sliver, che consente di specificare componenti sinistra, centro e destra, spazio di contrazione, profondità dell'ombra, modalità fissa, colore di sfondo e altre proprietà.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverAppBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【title】 : Componente centrale 【Widget】", + "【actions】 : Lista dei componenti finali 【List】", + "【floating】 : Se fluttuante 【bool】", + "【pinned】 : Se rimane in cima 【bool】", + "【snap】 : Se semi-collassato 【bool】", + "【bottom】 : Componente inferiore 【PreferredSizeWidget】", + "【expandedHeight】 : Altezza estesa 【double】", + "【elevation】 : Profondità dell'ombra 【double】", + "【flexibleSpace】 : Spazio esteso 【FlexibleSpaceBar】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【controller】 : Controller 【ScrollController】", + " Quando snap è true, floating deve essere true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json new file mode 100644 index 00000000..1ccc855e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliverヘッダーバー", + "info": "Sliverファミリーのトップバー共通構造。左中右のコンポーネント、収縮スペース、影の深さ、固定モード、背景色などの属性を指定できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar基本使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【title】 : 中央コンポーネント 【Widget】", + "【actions】 : 末尾コンポーネントリスト 【List】", + "【floating】 : フローティングするか 【bool】", + "【pinned】 : トップに留まるか 【bool】", + "【snap】 : 半収展するか 【bool】", + "【bottom】 : 底部コンポーネント 【PreferredSizeWidget】", + "【expandedHeight】 : 拡張高さ 【double】", + "【elevation】 : 影の深さ 【double】", + "【flexibleSpace】 : 拡張スペース 【FlexibleSpaceBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : コントローラー 【ScrollController】", + " snapがtrueの場合、floatingはtrueである必要があります" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json new file mode 100644 index 00000000..89628f4e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver 헤더 바", + "info": "Sliver 패밀리의 상단 바 공통 구조로, 좌중우 컴포넌트, 축소 공간, 그림자 깊이, 고정 모드, 배경색 등 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverAppBar 기본 사용", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【title】 : 중앙 컴포넌트 【Widget】", + "【actions】 : 오른쪽 컴포넌트 리스트 【List】", + "【floating】 : 플로팅 여부 【bool】", + "【pinned】 : 상단 고정 여부 【bool】", + "【snap】 : 반 접힘 여부 【bool】", + "【bottom】 : 하단 컴포넌트 【PreferredSizeWidget】", + "【expandedHeight】 : 확장 높이 【double】", + "【elevation】 : 그림자 깊이 【double】", + "【flexibleSpace】 : 확장 공간 【FlexibleSpaceBar】", + "【backgroundColor】 : 배경색 【Color】", + "【controller】 : 컨트롤러 【ScrollController】", + " snap이 true일 경우 floating은 반드시 true여야 함" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json new file mode 100644 index 00000000..7c2ce222 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Barra de Cabeçalho Sliver", + "info": "Estrutura comum da barra superior da família Sliver, pode especificar componentes esquerdo, central e direito, espaço de recolhimento, profundidade de sombra, modo fixo, cor de fundo, etc.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverAppBar", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Lista de componentes da cauda 【List】", + "【floating】 : Se flutua 【bool】", + "【pinned】 : Se fica no topo 【bool】", + "【snap】 : Se recolhe parcialmente 【bool】", + "【bottom】 : Componente inferior 【PreferredSizeWidget】", + "【expandedHeight】 : Altura estendida 【double】", + "【elevation】 : Profundidade da sombra 【double】", + "【flexibleSpace】 : Espaço flexível 【FlexibleSpaceBar】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【controller】 : Controlador 【ScrollController】", + " Quando snap é true, floating deve ser true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json new file mode 100644 index 00000000..9cf0712a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverAppBar/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 184, + "name": "SliverAppBar", + "localName": "Sliver заголовок", + "info": "Общая структура верхней панели семейства Sliver, которая может указывать левый, центральный и правый компоненты, пространство сжатия, глубину тени, фиксированный режим, цвет фона и другие атрибуты.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 196 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverAppBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【title】 : Центральный компонент 【Widget】", + "【actions】 : Список конечных компонентов 【List】", + "【floating】 : Плавающий ли 【bool】", + "【pinned】 : Остается ли наверху 【bool】", + "【snap】 : Полузакрытый ли 【bool】", + "【bottom】 : Нижний компонент 【PreferredSizeWidget】", + "【expandedHeight】 : Высота расширения 【double】", + "【elevation】 : Глубина тени 【double】", + "【flexibleSpace】 : Пространство расширения 【FlexibleSpaceBar】", + "【backgroundColor】 : Цвет фона 【Color】", + "【controller】 : Контроллер 【ScrollController】", + " snap true, необходимо floating true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json new file mode 100644 index 00000000..713fe618 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Kreuzachsen-Größenbeschränkung für Sliver", + "info": "Legt die Größe für eine Sliver-Komponente in der Kreuzachsenrichtung fest, um die Größe des Slivers zu begrenzen.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : Größe 【double】", + "【sliver】 : Untergeordnete Komponente 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json new file mode 100644 index 00000000..bf34df04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Cross Axis Size Constrained Sliver", + "info": "Specifies the size in the cross-axis direction for a Sliver component to constrain the sliver size.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : size 【double】", + "【sliver】 : child component 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json new file mode 100644 index 00000000..d22b986c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Restricción de tamaño en el eje cruzado para Sliver", + "info": "Especifica un tamaño en la dirección del eje cruzado para limitar el tamaño de un componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : tamaño 【double】", + "【sliver】 : componente hijo 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json new file mode 100644 index 00000000..7888ed00 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Contrainte de taille de l'axe transversal pour Sliver", + "info": "Spécifie une taille pour contraindre la dimension d'un composant Sliver dans la direction de l'axe transversal.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : taille 【double】", + "【sliver】 : composant enfant 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json new file mode 100644 index 00000000..1d305ce8 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Vincolo dimensionale dell'asse trasversale per Sliver", + "info": "Specifica una dimensione per limitare la dimensione di un componente Sliver nella direzione dell'asse trasversale.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : dimensione 【double】", + "【sliver】 : componente figlio 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json new file mode 100644 index 00000000..5557edd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "クロス軸サイズ制約スライバー", + "info": "Sliverコンポーネントに対して、クロス軸方向にサイズを指定してスライバーのサイズを制限します。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 基本使用", + "desc": [ + "【maxExtent】 : サイズ 【double】", + "【sliver】 : 子コンポーネント 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json new file mode 100644 index 00000000..85817932 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "교차축 크기 제약 슬라이버", + "info": "Sliver 컴포넌트의 교차축 방향에서 크기를 지정하여 슬라이버 크기를 제한합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverConstrainedCrossAxis 기본 사용", + "desc": [ + "【maxExtent】 : 크기 【double】", + "【sliver】 : 자식 컴포넌트 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json new file mode 100644 index 00000000..e6080d01 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Folha de deslizamento com restrição de tamanho do eixo cruzado", + "info": "Especifica o tamanho na direção do eixo cruzado para limitar o tamanho da folha de deslizamento para um componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : Tamanho 【double】", + "【sliver】 : Componente filho 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json new file mode 100644 index 00000000..7029456c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverConstrainedCrossAxis/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 270, + "name": "SliverConstrainedCrossAxis", + "localName": "Ограничение размера слайдера по поперечной оси", + "info": "Задает размер для компонента Sliver в направлении поперечной оси, чтобы ограничить размер слайдера.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverConstrainedCrossAxis", + "desc": [ + "【maxExtent】 : размер 【double】", + "【sliver】 : дочерний компонент 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json new file mode 100644 index 00000000..7a6e31d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cross-Axis-Erweiterungsschieber", + "info": "Gibt für eine Sliver-Komponente in der Richtung der Querachse einen Flex-Anteil an, um die Größe des Schiebers zu begrenzen.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverCrossAxisExpanded", + "desc": [ + "【flex】 : Anteil 【int】", + "【sliver】 : Untergeordnete Komponente 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json new file mode 100644 index 00000000..9bf13408 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cross Axis Expanded Sliver", + "info": "Specifies the flex ratio in the cross-axis direction for a Sliver component to constrain the size of the sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverCrossAxisExpanded", + "desc": [ + "【flex】: Ratio 【int】", + "【sliver】: Child Component 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json new file mode 100644 index 00000000..15f422ad --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Deslizador Expandido en Eje Cruzado", + "info": "Para un componente Sliver, especifica la proporción flex en la dirección del eje cruzado para limitar el tamaño del deslizador.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proporción 【int】", + "【sliver】 : componente hijo 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json new file mode 100644 index 00000000..d0a99dff --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Glissière d'expansion de l'axe croisé", + "info": "Pour un composant Sliver, spécifie la proportion de flex dans la direction de l'axe croisé pour limiter la taille de la glissière.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proportion 【int】", + "【sliver】 : composant enfant 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json new file mode 100644 index 00000000..0538e9fb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Cursore Espanso sull'Asse Incrociato", + "info": "Specifica la proporzione flex per limitare le dimensioni del cursore in direzione dell'asse incrociato per un componente Sliver.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverCrossAxisExpanded", + "desc": [ + "【flex】 : proporzione 【int】", + "【sliver】 : componente figlio 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json new file mode 100644 index 00000000..b8ce18cd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "クロス軸拡張スライバー", + "info": "スライバーコンポーネントのクロス軸方向に、flex比率を指定してスライバーのサイズを制限します。", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 基本使用", + "desc": [ + "【flex】 : 比率 【int】", + "【sliver】 : 子コンポーネント 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json new file mode 100644 index 00000000..33dd18a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "교차축 확장 슬라이스", + "info": "Sliver 컴포넌트의 교차축 방향에서 flex 비율을 지정하여 슬라이스 크기를 제한합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisExpanded 기본 사용", + "desc": [ + "【flex】 : 비율 【int】", + "【sliver】 : 하위 컴포넌트 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json new file mode 100644 index 00000000..52a4b46c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Slider de Expansão do Eixo Cruzado", + "info": "Para um componente Sliver, especifica a proporção flex na direção do eixo cruzado para limitar o tamanho do slider.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverCrossAxisExpanded", + "desc": [ + "【flex】 : Proporção 【int】", + "【sliver】 : Componente Filho 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json new file mode 100644 index 00000000..5982223e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisExpanded/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 271, + "name": "SliverCrossAxisExpanded", + "localName": "Расширенный слайвер по поперечной оси", + "info": "Для компонента Sliver указывает долю flex в направлении поперечной оси, чтобы ограничить размер слайвера.", + "lever": 3, + "family": 4, + "linkIds": [ + 269, + 270 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverCrossAxisExpanded", + "desc": [ + "【flex】 : доля 【int】", + "【sliver】 : дочерний компонент 【Widget?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json new file mode 100644 index 00000000..c9882cb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Kreuzachsen-Gruppe", + "info": "Kann mehrere Sliver-Komponenten aufnehmen und sie in der gleitenden Querhauptachse als Gruppe behandeln.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json new file mode 100644 index 00000000..0a942bf2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Cross Axis Sliver Group", + "info": "Can contain multiple Sliver components, treating them as a group in the cross main axis direction of scrolling.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverCrossAxisGroup", + "desc": [ + "【slivers】 : List of child components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json new file mode 100644 index 00000000..19cfce97 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Grupo de deslizadores en eje cruzado", + "info": "Puede contener múltiples componentes Sliver, tratándolos como un grupo en la dirección del eje principal cruzado durante el desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes hijos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json new file mode 100644 index 00000000..7bb64137 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Groupe de glissières d'axe croisé", + "info": "Peut contenir plusieurs composants Sliver, les traitant comme un groupe dans la direction de l'axe principal de défilement.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json new file mode 100644 index 00000000..ae753b3e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Gruppo di scorrimento dell'asse trasversale", + "info": "Può contenere più componenti Sliver, considerandoli come un gruppo nella direzione dell'asse trasversale durante lo scorrimento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json new file mode 100644 index 00000000..1d063bba --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "クロス軸スライドグループ", + "info": "複数のSliverコンポーネントを収容し、それらをスクロールのクロスメイン軸方向でグループとして扱うことができます。", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json new file mode 100644 index 00000000..1c50ba54 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "교차축 슬라이더 그룹", + "info": "여러 개의 Sliver 컴포넌트를 수용할 수 있으며, 스크롤 교차 주축 방향에서 하나의 그룹으로 간주되도록 합니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverCrossAxisGroup 기본 사용법", + "desc": [ + "【slivers】 : 자식 컴포넌트 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json new file mode 100644 index 00000000..576fa851 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Grupo de Slides do Eixo Cruzado", + "info": "Pode acomodar vários componentes Sliver, tratando-os como um grupo na direção do eixo principal cruzado durante o deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json new file mode 100644 index 00000000..752077fb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverCrossAxisGroup/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 269, + "name": "SliverCrossAxisGroup", + "localName": "Группа слайдов по поперечной оси", + "info": "Может содержать несколько компонентов Sliver, позволяя рассматривать их как группу в направлении главной оси скольжения.", + "lever": 4, + "family": 4, + "linkIds": [ + 268, + 270, + 271 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverCrossAxisGroup", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json new file mode 100644 index 00000000..5c9d5f77 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver füllt den Rest", + "info": "Ein Sliver, das ein einzelnes Box-Kind enthält und den verbleibenden Platz im Viewport ausfüllt. Es können zwei boolesche Werte angegeben werden, um den Scroll-Effekt zu steuern, wie im folgenden Beispiel gezeigt, um es selbst zu erleben.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Ob es einen Scroll-Body hat 【bool】", + "【fillOverscroll】 : Ob der Scroll-Bereich gefüllt werden kann 【bool】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json new file mode 100644 index 00000000..0b8149b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver Fill Remaining", + "info": "A sliver that contains a single box child element, which fills the remaining space in the viewport. Two boolean values can be specified to control the scrolling effect, as shown in the example below, experience it yourself.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFillRemaining", + "desc": [ + "【hasScrollBody】: Whether it has a scroll body 【bool】", + "【fillOverscroll】: Whether it can fill the scroll area 【bool】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json new file mode 100644 index 00000000..871bd203 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver llenar el espacio restante", + "info": "Un sliver que contiene un solo elemento hijo de tipo box, que llena el espacio restante en la ventana gráfica. Se pueden especificar dos valores booleanos para controlar el efecto de desplazamiento, como en el siguiente ejemplo, para que lo experimentes por ti mismo.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Si tiene un cuerpo de desplazamiento 【bool】", + "【fillOverscroll】 : Si se puede llenar el área de desplazamiento 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json new file mode 100644 index 00000000..0601452f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver remplir le reste", + "info": "Un sliver qui contient un seul élément box, il remplit l'espace restant dans la fenêtre. Deux valeurs booléennes peuvent être spécifiées pour contrôler l'effet de défilement, comme dans l'exemple suivant, à expérimenter par vous-même.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Si le corps a un défilement 【bool】", + "【fillOverscroll】 : Si la zone de défilement peut être remplie 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json new file mode 100644 index 00000000..4d90f745 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver riempie il rimanente", + "info": "Un sliver che contiene un singolo elemento figlio box, che riempie lo spazio rimanente nella finestra. È possibile specificare due valori bool per controllare l'effetto di scorrimento, come nell'esempio seguente, da provare personalmente.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Se ha un corpo di scorrimento 【bool】", + "【fillOverscroll】 : Se può riempire l'area di scorrimento 【bool】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json new file mode 100644 index 00000000..76b57533 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver残りを埋める", + "info": "ビューポート内の残りのスペースを埋める単一のbox子要素を含むsliverです。以下の例のように、スライド効果を制御するために2つのbool値を指定できます。自分で体験してください。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining基本使用", + "desc": [ + "【hasScrollBody】 : スクロール本体を持つかどうか 【bool】", + "【fillOverscroll】 : スクロール領域を埋めることができるかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json new file mode 100644 index 00000000..22432e3e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver 남은 공간 채우기", + "info": "단일 box 자식을 포함하는 sliver로, 뷰포트의 남은 공간을 채웁니다. 아래 예시와 같이 두 개의 bool 값을 지정하여 스크롤 효과를 제어할 수 있습니다. 직접 경험해 보세요.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillRemaining 기본 사용법", + "desc": [ + "【hasScrollBody】 : 스크롤 본체 여부 【bool】", + "【fillOverscroll】 : 스크롤 영역 채우기 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json new file mode 100644 index 00000000..e9c9a50e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver preencher restante", + "info": "Um sliver que contém um único elemento box, que preenche o espaço restante na janela de visualização. Dois valores bool podem ser especificados para controlar o efeito de deslizamento, como no exemplo a seguir, experimente você mesmo.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Se tem um corpo de rolagem 【bool】", + "【fillOverscroll】 : Se pode preencher a área de rolagem 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json new file mode 100644 index 00000000..913a2816 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillRemaining/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 306, + "name": "SliverFillRemaining", + "localName": "Sliver заполняет оставшееся", + "info": "Sliver, содержащий один дочерний элемент box, который заполняет оставшееся пространство в окне просмотра. Можно указать два логических значения для управления эффектом прокрутки, как показано в следующем примере, попробуйте сами.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFillRemaining", + "desc": [ + "【hasScrollBody】 : Имеет ли прокручиваемую основу 【bool】", + "【fillOverscroll】 : Можно ли заполнить область прокрутки 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json new file mode 100644 index 00000000..cd900f24 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver-Füllansichtsliste", + "info": "Eine Listenkomponente der Sliver-Familie, die über einen Delegate Unterkomponenten erstellt. Die Höhe der Elemente füllt den Ansichtsbereich, und es kann angegeben werden, ob ein Bruchteil verwendet wird.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFillViewport", + "desc": [ + "【viewportFraction】 : Ansichtsbruchteil 【double】", + "【delegate】 : Kind-Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json new file mode 100644 index 00000000..70abeab9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver Fill Viewport", + "info": "A list component of the Sliver family, which constructs child components through a delegate. The height of the item will fill the viewport, and you can specify the fraction.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFillViewport", + "desc": [ + "【viewportFraction】 : Viewport Fraction 【double】", + "【delegate】 : Child Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json new file mode 100644 index 00000000..99a48b3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Lista de vista de relleno Sliver", + "info": "Componente de lista de la familia Sliver, construye subcomponentes a través de delegate, la altura del elemento llenará la ventana gráfica, se puede especificar si es una fracción.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fracción de la ventana gráfica 【double】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json new file mode 100644 index 00000000..2b768323 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Liste de vue de remplissage Sliver", + "info": "Composant de liste de la famille Sliver, qui construit des sous-composants via un délégué, la hauteur de l'élément remplira la vue, et il est possible de spécifier si la fraction est divisée.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fraction de la vue 【double】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json new file mode 100644 index 00000000..b6e42bae --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver riempie la vista", + "info": "Componente della lista della famiglia Sliver, costruisce i componenti figli tramite il delegate, l'altezza dell'elemento riempirà la vista, è possibile specificare la frazione.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFillViewport", + "desc": [ + "【viewportFraction】 : Frazione della vista 【double】", + "【delegate】 : Delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json new file mode 100644 index 00000000..8d2507f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliverビューポートを埋めるリスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを通じて子コンポーネントを構築し、アイテムの高さがビューポートを埋めます。分率を指定することもできます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewportの基本使用", + "desc": [ + "【viewportFraction】 : ビューポート分率 【double】", + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json new file mode 100644 index 00000000..fbeb3ab5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver 뷰포트 채우기", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 통해 자식 컴포넌트를 구성하며, 아이템의 높이가 뷰포트를 채웁니다. 분율을 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFillViewport 기본 사용법", + "desc": [ + "【viewportFraction】 : 뷰포트 분율 【double】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json new file mode 100644 index 00000000..a40a323a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Lista de visualização de preenchimento Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes através de um delegate. A altura do item preencherá a viewport, e pode-se especificar a fração de preenchimento.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverFillViewport", + "desc": [ + "【viewportFraction】 : Fração da viewport 【double】", + "【delegate】 : Delegado dos filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json new file mode 100644 index 00000000..934b4569 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFillViewport/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 187, + "name": "SliverFillViewport", + "localName": "Sliver заполнение списка представлений", + "info": "Компонент списка семейства Sliver, который создает дочерние компоненты через делегат, высота элемента заполняет видимую область, можно указать долю.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFillViewport", + "desc": [ + "【viewportFraction】 : Доля видимой области 【double】", + "【delegate】 : Делегат дочерних элементов 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json new file mode 100644 index 00000000..229d8972 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver feste erweiterte Liste", + "info": "Eine Listenkomponente der Sliver-Familie, die über einen Delegate Unterkomponenten konstruiert und die Höhe der Elemente festlegen kann. Wird häufig in CustomScrollView verwendet.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Erzwungene Länge in Hauptachsenrichtung 【double】", + "【delegate】 : Kinderdelegat 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json new file mode 100644 index 00000000..15722257 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver Fixed Extent List", + "info": "A list component of the Sliver family, which constructs child components through a delegate and can specify the height of the item. It is commonly used in CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverFixedExtentList", + "desc": [ + "【itemExtent】: Forced length in the main axis 【double】", + "【delegate】: Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json new file mode 100644 index 00000000..cefbb2af --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista de extensión fija de Sliver", + "info": "Componente de lista de la familia Sliver, que construye subcomponentes a través de un delegado y puede especificar la altura de los elementos. Normalmente se utiliza en CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Longitud forzada en la dirección del eje principal 【double】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json new file mode 100644 index 00000000..35b9e914 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Liste d'extension fixe Sliver", + "info": "Composant de liste de la famille Sliver, qui construit les sous-composants via un délégué et permet de spécifier la hauteur des éléments. Généralement utilisé dans CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Longueur forcée dans la direction principale 【double】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json new file mode 100644 index 00000000..655ceb5a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista estensibile fissa Sliver", + "info": "Componente della lista della famiglia Sliver, che costruisce i componenti figli tramite il delegate, consente di specificare l'altezza dell'elemento. Solitamente utilizzato in CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Lunghezza forzata nella direzione dell'asse principale 【double】", + "【delegate】 : Delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json new file mode 100644 index 00000000..430e4383 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver固定延展リスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを使用して子コンポーネントを構築し、アイテムの高さを指定できます。通常、CustomScrollViewで使用されます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList基本使用", + "desc": [ + "【itemExtent】 : 主軸方向の強制長さ 【double】", + "【delegate】 : 子要素の代理 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json new file mode 100644 index 00000000..a2579c18 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver 고정 확장 리스트", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 통해 자식 컴포넌트를 구성하고, 아이템의 높이를 지정할 수 있습니다. 일반적으로 CustomScrollView에서 사용됩니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverFixedExtentList 기본 사용", + "desc": [ + "【itemExtent】 : 주축 방향 강제 길이 【double】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json new file mode 100644 index 00000000..21fa98fd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Lista de Extensão Fixa Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes através de um delegate, permitindo especificar a altura do item. Geralmente usado em CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Comprimento forçado na direção do eixo principal 【double】", + "【delegate】 : Delegate dos filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json new file mode 100644 index 00000000..b2e677eb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverFixedExtentList/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 186, + "name": "SliverFixedExtentList", + "localName": "Sliver фиксированный расширяемый список", + "info": "Компонент списка семейства Sliver, который создает дочерние компоненты через делегат и позволяет указать высоту элемента. Обычно используется в CustomScrollView.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 185, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverFixedExtentList", + "desc": [ + "【itemExtent】 : Принудительная длина по главной оси 【double】", + "【delegate】 : Делегат дочерних элементов 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json new file mode 100644 index 00000000..af304815 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver-Gitter", + "info": "Ein Gitterlisten-Widget der Sliver-Familie, ähnlich wie GirdView, das durch count und extent konstruiert wird. Wird normalerweise in CustomScrollView verwendet.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverList", + "desc": [ + "SliverGrid.count Konstruktion mit spezifizierter axialer Anzahl", + "SliverGrid.extent Konstruktion mit spezifizierter axialer Länge", + "Attributeigenschaften sind ähnlich wie bei GridView, siehe dazu" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json new file mode 100644 index 00000000..89980569 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver Grid", + "info": "A grid list component of the Sliver family, similar to GridView, constructed with count and extent. Usually used in CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverList", + "desc": [ + "SliverGrid.count constructs with specified axial count", + "SliverGrid.extent constructs with specified axial length", + "The attribute characteristics are the same as GridView, see it for details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json new file mode 100644 index 00000000..f0ccd1a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Cuadrícula Sliver", + "info": "Componente de lista de cuadrícula de la familia Sliver, similar a GirdView, construido a través de count y extent. Normalmente se utiliza en CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "SliverGrid.count construye especificando la cantidad axial", + "SliverGrid.extent construye especificando la longitud axial", + "Las características de los atributos son las mismas que GridView, se pueden ver en detalle" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json new file mode 100644 index 00000000..feac18d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Grille Sliver", + "info": "Composant de liste de grille de la famille Sliver, similaire à GirdView, construit via count et extent. Généralement utilisé dans CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverList", + "desc": [ + "SliverGrid.count construction avec un nombre spécifié dans l'axe", + "SliverGrid.extent construction avec une longueur spécifiée dans l'axe", + "Les caractéristiques des propriétés sont similaires à GridView, voir les détails" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json new file mode 100644 index 00000000..1fa0db2f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Griglia Sliver", + "info": "Componente della lista a griglia della famiglia Sliver, simile a GirdView, costruito tramite count e extent. Solitamente utilizzato in CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverList", + "desc": [ + "SliverGrid.count costruisce specificando il numero di assi", + "SliverGrid.extent costruisce specificando la lunghezza dell'asse", + "Le caratteristiche degli attributi sono le stesse di GridView, si può fare riferimento a quello per i dettagli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json new file mode 100644 index 00000000..f453572b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliverグリッド", + "info": "Sliverファミリーのグリッドリストコンポーネントで、GirdViewと類似しており、countとextentで構築されます。通常はCustomScrollViewで使用されます。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverListの基本的な使用", + "desc": [ + "SliverGrid.count 軸方向の数を指定して構築", + "SliverGrid.extent 軸方向の長さを指定して構築", + "属性特性はGridViewと同じで、詳細はそちらを参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json new file mode 100644 index 00000000..9495f1c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver 그리드", + "info": "Sliver 패밀리의 그리드 리스트 컴포넌트로, GirdView와 유사하며 count와 extent로 구성됩니다. 주로 CustomScrollView에서 사용됩니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList 기본 사용", + "desc": [ + "SliverGrid.count는 축 방향 수량으로 구성", + "SliverGrid.extent는 축 방향 길이로 구성", + "속성 특성은 GridView와 동일하며, 자세한 내용은 해당 문서 참조" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json new file mode 100644 index 00000000..68b0edae --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Grelha Sliver", + "info": "Componente de lista de grelha da família Sliver, semelhante ao GirdView, construído através de count e extent. Geralmente usado em CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "SliverGrid.count especifica a construção do número axial", + "SliverGrid.extent especifica a construção do comprimento axial", + "As características dos atributos são semelhantes ao GridView, consulte para mais detalhes" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json new file mode 100644 index 00000000..9bb25afd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverGrid/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 188, + "name": "SliverGrid", + "localName": "Sliver сетка", + "info": "Компонент списка сетки семейства Sliver, аналогичный GirdView, создается с помощью count и extent. Обычно используется в CustomScrollView.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverList", + "desc": [ + "SliverGrid.count создается с указанием количества по оси", + "SliverGrid.extent создается с указанием длины по оси", + "Характеристики атрибутов такие же, как у GridView, подробности см. в нем" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json new file mode 100644 index 00000000..27f63ad3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignorieren Ereignisse", + "info": "Kann ein Sliver-Widget umhüllen und durch ignoring steuern, ob dieses Sliver-Widget auf Ereignisse reagieren kann.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverIgnorePointer", + "desc": [ + "【sliver】: Sliver-Widget 【Widget】", + "【ignoring】: Ereignisse ignorieren 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json new file mode 100644 index 00000000..ca7fcfdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignore Events", + "info": "Can wrap a sliver component, and control whether the sliver component can respond to events through ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverIgnorePointer", + "desc": [ + "【sliver】: sliver component 【Widget】", + "【ignoring】: whether to ignore events 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json new file mode 100644 index 00000000..f838f0f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignorar eventos", + "info": "Puede envolver un componente sliver, y controlar si este componente sliver puede responder a eventos a través de ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: si se ignoran los eventos 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json new file mode 100644 index 00000000..5e97cdb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignorer les Événements", + "info": "Peut envelopper un composant sliver, en contrôlant via 'ignoring' si ce composant sliver peut répondre aux événements.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverIgnorePointer", + "desc": [ + "【sliver】 : composant sliver 【Widget】", + "【ignoring】 : ignorer les événements 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json new file mode 100644 index 00000000..a66bb9dd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver ignora eventi", + "info": "Può avvolgere un componente sliver, controllando se il componente sliver può rispondere agli eventi tramite ignoring.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: ignora eventi 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json new file mode 100644 index 00000000..be097455 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliverイベント無視", + "info": "sliverコンポーネントをラップし、ignoringを使用してそのsliverコンポーネントがイベントに応答するかどうかを制御できます。", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointerの基本使用", + "desc": [ + "【sliver】 : sliverコンポーネント 【Widget】", + "【ignoring】 : イベントを無視するかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json new file mode 100644 index 00000000..44933a44 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver 이벤트 무시", + "info": "sliver 컴포넌트를 감싸고, ignoring을 통해 해당 sliver 컴포넌트가 이벤트에 반응할지 여부를 제어할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverIgnorePointer 기본 사용", + "desc": [ + "【sliver】 : sliver 컴포넌트 【Widget】", + "【ignoring】 : 이벤트 무시 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json new file mode 100644 index 00000000..8aba19eb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver Ignorar Eventos", + "info": "Pode envolver um componente sliver, controlando através de ignoring se este componente sliver pode responder a eventos.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverIgnorePointer", + "desc": [ + "【sliver】: componente sliver 【Widget】", + "【ignoring】: ignorar eventos 【bool】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json new file mode 100644 index 00000000..cbe4f7b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverIgnorePointer/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 305, + "name": "SliverIgnorePointer", + "localName": "Sliver игнорировать события", + "info": "Может обернуть sliver-компонент, и с помощью ignoring контролировать, может ли этот sliver-компонент реагировать на события.", + "lever": 3, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverIgnorePointer", + "desc": [ + "【sliver】 : sliver-компонент 【Widget】", + "【ignoring】 : игнорировать ли события 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json new file mode 100644 index 00000000..77965bcf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver-Layout-Builder", + "info": "Ein Mitglied der Sliver-Familie, das während des Scrollvorgangs durch das zurückgegebene SliverConstraints-Objekt die Konstruktion von Unterkomponenten ermöglicht.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverLayoutBuilder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json new file mode 100644 index 00000000..92c87ab4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver Layout Builder", + "info": "A member of the Sliver family, which allows the construction of child components through the SliverConstraints object during the scrolling process.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverLayoutBuilder", + "desc": [ + "【builder】: Component Builder 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json new file mode 100644 index 00000000..9983b1ea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Constructor de diseño Sliver", + "info": "Miembro de la familia Sliver, que permite la construcción de componentes secundarios a través del objeto SliverConstraints devuelto durante el desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverLayoutBuilder", + "desc": [ + "【builder】: Constructor de componentes 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json new file mode 100644 index 00000000..eca65d51 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Constructeur de mise en page Sliver", + "info": "Membre de la famille Sliver, il permet de construire des composants enfants via l'objet SliverConstraints rappelé pendant le défilement.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverLayoutBuilder", + "desc": [ + "【builder】 : Constructeur de composant 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json new file mode 100644 index 00000000..a2d547f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Costruttore di layout Sliver", + "info": "Membro della famiglia Sliver, durante lo scorrimento è possibile costruire i componenti figli utilizzando l'oggetto SliverConstraints restituito dalla callback.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverLayoutBuilder", + "desc": [ + "【builder】 : Costruttore di componenti 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json new file mode 100644 index 00000000..26a99a1f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliverレイアウトビルダー", + "info": "Sliverファミリーの一員で、スライド中にコールバックされるSliverConstraintsオブジェクトを使用して子コンポーネントを構築できます。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilderの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json new file mode 100644 index 00000000..84a48d73 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Sliver 레이아웃 빌더", + "info": "Sliver 패밀리의 일원으로, 스크롤 중에 콜백된 SliverConstraints 객체를 통해 하위 컴포넌트를 구성할 수 있습니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverLayoutBuilder 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json new file mode 100644 index 00000000..46c083b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Construtor de Layout Sliver", + "info": "Membro da família Sliver, que permite a construção de componentes filhos através do objeto SliverConstraints retornado durante o deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverLayoutBuilder", + "desc": [ + "【builder】 : Construtor de componentes 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json new file mode 100644 index 00000000..0daadcdd --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverLayoutBuilder/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 304, + "name": "SliverLayoutBuilder", + "localName": "Конструктор макета Sliver", + "info": "Член семейства Sliver, который позволяет создавать дочерние компоненты через объект SliverConstraints, возвращаемый в процессе прокрутки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 251 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverLayoutBuilder", + "desc": [ + "【builder】 : Конструктор компонентов 【SliverLayoutWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json new file mode 100644 index 00000000..e55576cb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver-Liste", + "info": "Eine Listenkomponente der Sliver-Familie, die durch die Angabe eines Delegaten Unterkomponenten erstellt. Wird normalerweise in CustomScrollView verwendet.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverList", + "desc": [ + "【delegate】 : Kinderdelegierter 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json new file mode 100644 index 00000000..74c96848 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver List", + "info": "A list component of the Sliver family, which constructs child components by specifying a delegate. It is commonly used in CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverList", + "desc": [ + "【delegate】: Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json new file mode 100644 index 00000000..4be4dda9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente de lista de la familia Sliver, que construye subcomponentes especificando un delegate. Normalmente se utiliza en CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverList", + "desc": [ + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json new file mode 100644 index 00000000..81be999c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Liste Sliver", + "info": "Composant de liste de la famille Sliver, qui construit des sous-composants en spécifiant un délégué. Généralement utilisé dans CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverList", + "desc": [ + "【delegate】 : délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json new file mode 100644 index 00000000..d5cda55e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente lista della famiglia Sliver, che costruisce i componenti figli specificando un delegate. Comunemente utilizzato in CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverList", + "desc": [ + "【delegate】 : delegato dei figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json new file mode 100644 index 00000000..952207b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliverリスト", + "info": "Sliverファミリーのリストコンポーネントで、delegateを指定して子コンポーネントを構築します。通常、CustomScrollViewで使用されます。", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverListの基本使用", + "desc": [ + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json new file mode 100644 index 00000000..ab539a54 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Sliver 리스트", + "info": "Sliver 패밀리의 리스트 컴포넌트로, delegate를 지정하여 자식 컴포넌트를 구성합니다. 주로 CustomScrollView에서 사용됩니다.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverList 기본 사용", + "desc": [ + "【delegate】 : 자식 대리 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json new file mode 100644 index 00000000..e5dbe650 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Lista Sliver", + "info": "Componente de lista da família Sliver, que constrói subcomponentes especificando um delegate. Normalmente usado em CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverList", + "desc": [ + "【delegate】 : Delegado de filhos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json new file mode 100644 index 00000000..0aed5120 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 185, + "name": "SliverList", + "localName": "Список Sliver", + "info": "Компонент списка семейства Sliver, который создает дочерние элементы через указанный делегат. Обычно используется в CustomScrollView.", + "lever": 5, + "family": 4, + "linkIds": [ + 183, + 186, + 187 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverList", + "desc": [ + "【delegate】 : Дочерний делегат 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json new file mode 100644 index 00000000..b7417fa7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Hauptachsen-Sliver-Gruppe", + "info": "Kann mehrere Sliver-Komponenten aufnehmen, die in der gleitenden Hauptachsenrichtung als Gruppe behandelt werden.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung von SliverMainAxisGroup", + "desc": [ + "【slivers】 : Liste der Unterkomponenten 【List】", + "Kann mit SliverPersistentHeader kombiniert werden, um Gruppierungen und den Effekt von fixierten Überschriften zu erzielen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json new file mode 100644 index 00000000..8478aa50 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Main Axis Sliver Group", + "info": "Can accommodate multiple Sliver components, treating them as a group in the sliding main axis direction.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage of SliverMainAxisGroup", + "desc": [ + "【slivers】: List of child components 【List】", + "Can be combined with SliverPersistentHeader to achieve grouping and sticky header effects." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json new file mode 100644 index 00000000..8665856f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Grupo de deslizamiento del eje principal", + "info": "Puede contener múltiples componentes Sliver, permitiendo que se consideren como un grupo en la dirección del eje principal de desplazamiento.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico de SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes hijos 【List】", + "Se puede combinar con SliverPersistentHeader para lograr un efecto de agrupación y fijación de títulos en la parte superior." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json new file mode 100644 index 00000000..7a5206ec --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Groupe d'axe principal glissant", + "info": "Peut contenir plusieurs composants Sliver, les considérant comme un groupe dans la direction de l'axe principal de défilement.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base de SliverMainAxisGroup", + "desc": [ + "【slivers】 : Liste des composants enfants 【List】", + "Peut être combiné avec SliverPersistentHeader pour réaliser un effet de regroupement et de fixation du titre en haut." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json new file mode 100644 index 00000000..776ae341 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Gruppo di Sliver sull'Asse Principale", + "info": "Può contenere più componenti Sliver, trattandoli come un gruppo nella direzione di scorrimento dell'asse principale.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di base di SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista dei componenti figli 【List】", + "Può essere combinato con SliverPersistentHeader per realizzare raggruppamenti e l'effetto di titolo fisso in cima." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json new file mode 100644 index 00000000..046878ed --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "主軸スライダーグループ", + "info": "複数のSliverコンポーネントを収容し、それらをスクロールする主軸方向で一つのグループとして扱うことができます。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 基本使用", + "desc": [ + "【slivers】 : 子コンポーネントリスト 【List】", + "SliverPersistentHeaderと組み合わせて、グループ化やタイトルの吸着効果を実現できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json new file mode 100644 index 00000000..590367ab --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "주축 슬라이더 그룹", + "info": "여러 개의 Sliver 컴포넌트를 수용할 수 있으며, 스크롤하는 주축 방향에서 하나의 그룹으로 간주됩니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "SliverMainAxisGroup 기본 사용법", + "desc": [ + "【slivers】 : 자식 컴포넌트 리스트 【List】", + "SliverPersistentHeader와 결합하여 그룹화 및 제목 고정 효과를 구현할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json new file mode 100644 index 00000000..ba26253b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Grupo de Slides do Eixo Principal", + "info": "Pode conter vários componentes Sliver, permitindo que sejam tratados como um grupo na direção do eixo de deslizamento.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico do SliverMainAxisGroup", + "desc": [ + "【slivers】 : Lista de componentes filhos 【List】", + "Pode ser combinado com SliverPersistentHeader para alcançar efeitos de agrupamento e fixação de títulos no topo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json new file mode 100644 index 00000000..5b809284 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverMainAxisGroup/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 268, + "name": "SliverMainAxisGroup", + "localName": "Группа слайдеров главной оси", + "info": "Может содержать несколько компонентов Sliver, позволяя рассматривать их как группу в направлении скольжения главной оси.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование SliverMainAxisGroup", + "desc": [ + "【slivers】 : Список дочерних компонентов 【List】", + "Может использоваться в сочетании с SliverPersistentHeader для реализации группировки и эффекта прилипания заголовка." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json new file mode 100644 index 00000000..50b283d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver Transparenz", + "info": "Kann ein Kindelement der Sliver-Familie aufnehmen und die Transparenz des Kindelements durch opacity angeben.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOpacity", + "desc": [ + "【opacity】 : Transparenz 【double】", + "【sliver】 : Kindelement 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json new file mode 100644 index 00000000..a3d1e34e --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver Opacity", + "info": "Can accommodate a child component of the Sliver family and specify the opacity of the child component through opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOpacity", + "desc": [ + "【opacity】: Opacity 【double】", + "【sliver】: Child Component 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json new file mode 100644 index 00000000..1a4aac8d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacidad de Sliver", + "info": "Puede contener un componente hijo de la familia Sliver y especificar la opacidad del componente hijo a través de opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOpacity", + "desc": [ + "【opacity】 : Opacidad 【double】", + "【sliver】 : Componente hijo 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json new file mode 100644 index 00000000..62627403 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacité de Sliver", + "info": "Peut contenir un composant enfant de la famille Sliver et spécifier l'opacité du composant enfant via opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOpacity", + "desc": [ + "【opacity】 : opacité 【double】", + "【sliver】 : composant enfant 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json new file mode 100644 index 00000000..25668b4c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacità Sliver", + "info": "Può contenere un componente figlio della famiglia Sliver e specificare l'opacità del componente figlio tramite opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverOpacity", + "desc": [ + "【opacity】 : opacità 【double】", + "【sliver】 : componente figlio 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json new file mode 100644 index 00000000..ff4b4bcb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver透明度", + "info": "Sliverファミリーの子コンポーネントを収容でき、opacityを通じて子コンポーネントの透明度を指定できます。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacityの基本使用", + "desc": [ + "【opacity】 : 透明度 【double】", + "【sliver】 : 子コンポーネント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json new file mode 100644 index 00000000..09c33194 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Sliver 투명도", + "info": "Sliver 계열의 자식 위젯을 포함할 수 있으며, opacity를 통해 자식 위젯의 투명도를 지정할 수 있습니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOpacity 기본 사용", + "desc": [ + "【opacity】 : 투명도 【double】", + "【sliver】 : 자식 위젯 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json new file mode 100644 index 00000000..4f9e76ef --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Opacidade Sliver", + "info": "Pode acomodar um componente filho da família Sliver e especificar a opacidade do componente filho através de opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverOpacity", + "desc": [ + "【opacity】 : opacidade 【double】", + "【sliver】 : componente filho 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json new file mode 100644 index 00000000..ca602737 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOpacity/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 192, + "name": "SliverOpacity", + "localName": "Прозрачность Sliver", + "info": "Может содержать дочерний компонент из семейства Sliver и указывать прозрачность дочернего компонента через opacity.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOpacity", + "desc": [ + "【opacity】 : прозрачность 【double】", + "【sliver】 : дочерний компонент 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json new file mode 100644 index 00000000..8067bd07 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Überlappungsabsorber", + "info": "Wickelt einen anderen Sliver ein und zwingt ihn, seinen Layoutbereich als überlappend zu betrachten. Muss in Verbindung mit SliverOverlapInjector verwendet werden.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Untergeordnete Komponente 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "Wenn die Komponenten SliverOverlapAbsorber und SliverOverlapInjector nicht verwendet werden, überlappt der Inhalt von NestedScrollView die Kopfleiste." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json new file mode 100644 index 00000000..b582af34 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Overlap Absorber", + "info": "Wraps another sliver and forces its layout extent to be treated as overlapping. Needs to be used in conjunction with SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Child component 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "If the SliverOverlapAbsorber and SliverOverlapInjector components are not used, the content of the NestedScrollView will overlap with the header bar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json new file mode 100644 index 00000000..b04a0462 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorbedor de superposición", + "info": "Envuelve otro sliver y fuerza a que su rango de diseño sea considerado como superposición. Debe usarse junto con SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente hijo 【Widget】", + "【handle】 : *Manejador 【SliverOverlapAbsorberHandle】", + "Si no se utilizan los componentes SliverOverlapAbsorber y SliverOverlapInjector, el contenido de NestedScrollView se superpondrá con la barra de encabezado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json new file mode 100644 index 00000000..11f24176 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorbeur de chevauchement", + "info": "Enveloppe un autre sliver et force sa plage de disposition à être considérée comme un chevauchement. Doit être utilisé avec SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【handle】 : *Gestionnaire 【SliverOverlapAbsorberHandle】", + "Si vous n'utilisez pas les composants SliverOverlapAbsorber et SliverOverlapInjector, le contenu de NestedScrollView se chevauchera avec la barre d'en-tête." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json new file mode 100644 index 00000000..621213c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Assorbitore di Sovrapposizione", + "info": "Avvolge un altro sliver e costringe la sua area di layout a essere considerata sovrapposta. Deve essere utilizzato insieme a SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【handle】 : *Gestore 【SliverOverlapAbsorberHandle】", + "Se non si utilizzano i componenti SliverOverlapAbsorber e SliverOverlapInjector, il contenuto di NestedScrollView si sovrapporrà alla barra dell'intestazione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json new file mode 100644 index 00000000..698bb492 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "オーバーラップアブソーバー", + "info": "別のsliverをラップし、そのレイアウト範囲をオーバーラップとして扱うように強制します。SliverOverlapInjectorと一緒に使用する必要があります。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorberの基本的な使用法", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【handle】 : *ハンドラ 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorberとSliverOverlapInjectorコンポーネントを使用しない場合、NestedScrollViewの内容がヘッダーバーと重なります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json new file mode 100644 index 00000000..7181ed39 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "겹침 흡수기", + "info": "다른 sliver를 감싸고, 그 레이아웃 범위가 겹치는 것으로 간주되도록 강제합니다. SliverOverlapInjector와 함께 사용해야 합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapAbsorber 기본 사용", + "desc": [ + "【sliver】 : 자식 위젯 【Widget】", + "【handle】 *핸들러 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorber와 SliverOverlapInjector 컴포넌트를 사용하지 않으면, NestedScrollView의 내용이 헤더 바와 겹치게 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json new file mode 100644 index 00000000..2fd274d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Absorvedor de Sobreposição", + "info": "Envolve outro sliver e força que o seu alcance de layout seja considerado sobreposto. Precisa ser usado em conjunto com o SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Componente filho 【Widget】", + "【handle】 : *Manipulador 【SliverOverlapAbsorberHandle】", + "Se os componentes SliverOverlapAbsorber e SliverOverlapInjector não forem usados, o conteúdo do NestedScrollView sobreporá a barra de cabeçalho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json new file mode 100644 index 00000000..c7b565f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapAbsorber/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 307, + "name": "SliverOverlapAbsorber", + "localName": "Поглотитель перекрытия", + "info": "Обертывает другой sliver и заставляет его область макета считаться перекрывающейся. Необходимо использовать вместе с SliverOverlapInjector.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 308 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOverlapAbsorber", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【handle】 : *Обработчик 【SliverOverlapAbsorberHandle】", + "Если не использовать компоненты SliverOverlapAbsorber и SliverOverlapInjector, содержимое NestedScrollView будет перекрываться с заголовком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json new file mode 100644 index 00000000..50ef4e3f --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Überlappungsinjektor", + "info": "Ein Sliver, der in Verbindung mit SliverOverlapAbsorber verwendet werden muss, um Überlappungsprobleme in der Ansicht zu behandeln.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverOverlapInjector", + "desc": [ + "【sliver】 : Untergeordnete Komponente 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "Wenn die Komponenten SliverOverlapAbsorber und SliverOverlapInjector nicht verwendet werden, überlappt der Inhalt von NestedScrollView die Kopfleiste." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json new file mode 100644 index 00000000..f942f82a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Overlap Injector", + "info": "A sliver that needs to be used with SliverOverlapAbsorber to handle view overlap issues.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverOverlapInjector", + "desc": [ + "【sliver】 : Child component 【Widget】", + "【handle】 : *Handler 【SliverOverlapAbsorberHandle】", + "If the SliverOverlapAbsorber and SliverOverlapInjector components are not used, the content of the NestedScrollView will overlap with the header bar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json new file mode 100644 index 00000000..e8189dc5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Inyector de superposición", + "info": "Un sliver que debe usarse junto con SliverOverlapAbsorber para manejar problemas de superposición de vistas.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverOverlapInjector", + "desc": [ + "【sliver】 : componente hijo 【Widget】", + "【handle】 : *manejador 【SliverOverlapAbsorberHandle】", + "Si no se utilizan los componentes SliverOverlapAbsorber y SliverOverlapInjector, el contenido de NestedScrollView se superpondrá con la barra de encabezado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json new file mode 100644 index 00000000..49fdcb17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Injecteur de chevauchement", + "info": "Un sliver, doit être utilisé conjointement avec SliverOverlapAbsorber pour gérer les problèmes de chevauchement de vues.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverOverlapInjector", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【handle】 : *Gestionnaire 【SliverOverlapAbsorberHandle】", + "Si les composants SliverOverlapAbsorber et SliverOverlapInjector ne sont pas utilisés, le contenu de NestedScrollView chevauchera la barre d'en-tête." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json new file mode 100644 index 00000000..88185fd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Iniettore di sovrapposizione", + "info": "Uno sliver, deve essere utilizzato insieme a SliverOverlapAbsorber per gestire il problema della sovrapposizione delle viste.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverOverlapInjector", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【handle】 : *Processore 【SliverOverlapAbsorberHandle】", + "Se non si utilizzano i componenti SliverOverlapAbsorber e SliverOverlapInjector, il contenuto di NestedScrollView si sovrapporrà alla barra dell'intestazione." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json new file mode 100644 index 00000000..5a2a19af --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "オーバーラップインジェクター", + "info": "Sliverで、SliverOverlapAbsorberと一緒に使用する必要があり、ビューのオーバーラップ問題を処理します。", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjectorの基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【handle】 : *プロセッサ 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorberとSliverOverlapInjectorコンポーネントを使用しない場合、NestedScrollViewの内容はヘッダーバーと重なります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json new file mode 100644 index 00000000..8154e410 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "겹침 인젝터", + "info": "SliverOverlapAbsorber와 함께 사용해야 하는 sliver로, 뷰 겹침 문제를 처리합니다.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverOverlapInjector 기본 사용법", + "desc": [ + "【sliver】 : 자식 컴포넌트 【Widget】", + "【handle】 : *처리기 【SliverOverlapAbsorberHandle】", + "SliverOverlapAbsorber와 SliverOverlapInjector 컴포넌트를 사용하지 않으면, NestedScrollView의 내용이 헤더 바와 겹칩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json new file mode 100644 index 00000000..2aad85e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Injector de Sobreposição", + "info": "Um sliver que precisa ser usado em conjunto com o SliverOverlapAbsorber para lidar com problemas de sobreposição de visualizações.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverOverlapInjector", + "desc": [ + "【sliver】 : Componente Filho 【Widget】", + "【handle】 : *Manipulador 【SliverOverlapAbsorberHandle】", + "Se os componentes SliverOverlapAbsorber e SliverOverlapInjector não forem usados, o conteúdo do NestedScrollView irá sobrepor-se à barra do cabeçalho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json new file mode 100644 index 00000000..7becb227 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverOverlapInjector/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 308, + "name": "SliverOverlapInjector", + "localName": "Инжектор перекрытия", + "info": "Sliver, который необходимо использовать вместе с SliverOverlapAbsorber для решения проблемы перекрытия представлений.", + "lever": 3, + "family": 4, + "linkIds": [ + 251, + 307 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverOverlapInjector", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【handle】 : *Обработчик 【SliverOverlapAbsorberHandle】", + "Если не использовать компоненты SliverOverlapAbsorber и SliverOverlapInjector, содержимое NestedScrollView будет перекрываться с заголовком." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json new file mode 100644 index 00000000..0baed114 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver Innenabstand", + "info": "Kann ein untergeordnetes Element der Sliver-Familie aufnehmen, fügt einen eigenen Innenabstand hinzu, um die Platzierung des untergeordneten Elements zu begrenzen, wobei padding die Kern-Eigenschaft ist.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPadding", + "desc": [ + "【sliver】 : Untergeordnetes Element 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json new file mode 100644 index 00000000..0907c91a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver Padding", + "info": "Can accommodate a child component of the Sliver family, adding its own padding to limit the placement of the child component, with the core property being padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPadding", + "desc": [ + "【sliver】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json new file mode 100644 index 00000000..f30d9897 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Relleno interno de Sliver", + "info": "Puede contener un componente hijo de la familia Sliver, añadiendo su propio relleno interno para limitar el espacio ocupado por el componente hijo, la propiedad principal es padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPadding", + "desc": [ + "【sliver】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json new file mode 100644 index 00000000..801d55e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Espacement intérieur de Sliver", + "info": "Peut contenir un composant enfant de la famille Sliver, ajoute sa propre marge intérieure pour limiter l'emplacement du composant enfant, la propriété principale étant padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPadding", + "desc": [ + "【sliver】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json new file mode 100644 index 00000000..2e02d440 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Spaziatura interna Sliver", + "info": "Può contenere un componente figlio della famiglia Sliver, aggiungendo il proprio padding interno per limitare il posizionamento del componente figlio, la proprietà principale è padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SliverPadding", + "desc": [ + "【sliver】 : Componente figlio 【Widget】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json new file mode 100644 index 00000000..ce93600b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver内間隔", + "info": "Sliverファミリーの子コンポーネントを収容し、自身の内側の余白を追加して子コンポーネントの占める位置を制限します。コア属性はpaddingです。", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPaddingの基本使用", + "desc": [ + "【sliver】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json new file mode 100644 index 00000000..fa541f02 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Sliver 내부 여백", + "info": "Sliver 가족의 하위 구성 요소를 수용할 수 있으며, 자체 내부 여백을 추가하여 자식 구성 요소의 위치를 제한합니다. 핵심 속성은 padding입니다.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPadding 기본 사용", + "desc": [ + "【sliver】 : 하위 구성 요소 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json new file mode 100644 index 00000000..840c02b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Espaçamento interno do Sliver", + "info": "Pode acomodar um componente filho da família Sliver, adicionando o próprio preenchimento interno para limitar o espaço ocupado pelo componente filho, sendo o atributo principal o padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverPadding", + "desc": [ + "【sliver】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json new file mode 100644 index 00000000..6fb97bea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPadding/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 191, + "name": "SliverPadding", + "localName": "Отступ внутри Sliver", + "info": "Может содержать дочерний компонент из семейства Sliver, добавляя собственные внутренние отступы для ограничения места, занимаемого дочерним компонентом. Основное свойство - padding.", + "lever": 3, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPadding", + "desc": [ + "【sliver】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json new file mode 100644 index 00000000..3ab0ea20 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Fixierter Header", + "info": "Wird normalerweise in CustomScrollView verwendet, um eine Komponente beim Scrollen oben zu fixieren, damit sie nicht verschwindet.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPersistentHeader", + "desc": [ + "【delegate】 : Delegat 【SliverPersistentHeaderDelegate】", + "【floating】 : Ob schwebend 【bool】", + "【pinned】 : Ob oben fixiert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json new file mode 100644 index 00000000..ef494ee2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Sticky Slider", + "info": "Usually used in CustomScrollView, it allows a component to stay at the top during scrolling and not disappear.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPersistentHeader", + "desc": [ + "【delegate】: Delegate 【SliverPersistentHeaderDelegate】", + "【floating】: Whether to float 【bool】", + "【pinned】: Whether to stay at the top 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json new file mode 100644 index 00000000..c0373b7d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Cabecera persistente", + "info": "Se utiliza normalmente en CustomScrollView para permitir que un componente permanezca en la parte superior durante el desplazamiento y no desaparezca.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPersistentHeader", + "desc": [ + "【delegate】 : delegado 【SliverPersistentHeaderDelegate】", + "【floating】 : si flota 【bool】", + "【pinned】 : si se queda en la parte superior 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json new file mode 100644 index 00000000..1f02f849 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "En-tête persistant", + "info": "Utilisé généralement dans CustomScrollView, il permet à un composant de rester en haut lors du défilement sans disparaître.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPersistentHeader", + "desc": [ + "【delegate】 : Délégué 【SliverPersistentHeaderDelegate】", + "【floating】 : Flottant 【bool】", + "【pinned】 : Reste en haut 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json new file mode 100644 index 00000000..8a3505c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Intestazione persistente", + "info": "Utilizzato solitamente in CustomScrollView, consente a un componente di rimanere in cima durante lo scorrimento, senza scomparire.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverPersistentHeader", + "desc": [ + "【delegate】 : delegato 【SliverPersistentHeaderDelegate】", + "【floating】 : se galleggiante 【bool】", + "【pinned】 : se rimane in cima 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json new file mode 100644 index 00000000..5e4734e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "吸頂スライド", + "info": "通常、CustomScrollViewで使用され、コンポーネントがスクロール中に上部に留まり、スクロールして消えないようにします。", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeaderの基本的な使用法", + "desc": [ + "【delegate】 : デリゲート 【SliverPersistentHeaderDelegate】", + "【floating】 : フローティングするかどうか 【bool】", + "【pinned】 : 上部に留まるかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json new file mode 100644 index 00000000..020f8232 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "스티커 슬라이드", + "info": "일반적으로 CustomScrollView에서 사용되며, 스크롤 중에 상단에 고정되어 사라지지 않도록 하는 컴포넌트입니다.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPersistentHeader 기본 사용법", + "desc": [ + "【delegate】 : 대리자 【SliverPersistentHeaderDelegate】", + "【floating】 : 플로팅 여부 【bool】", + "【pinned】 : 상단 고정 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json new file mode 100644 index 00000000..2c485a8a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Cabeçalho Fixo Deslizante", + "info": "Geralmente usado em CustomScrollView, permite que um componente permaneça no topo durante a rolagem, sem desaparecer.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverPersistentHeader", + "desc": [ + "【delegate】 : Delegado 【SliverPersistentHeaderDelegate】", + "【floating】 : Se flutua 【bool】", + "【pinned】 : Se fica no topo 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json new file mode 100644 index 00000000..d5baa3db --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPersistentHeader/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 190, + "name": "SliverPersistentHeader", + "localName": "Прилипающий заголовок", + "info": "Обычно используется в CustomScrollView, позволяет компоненту оставаться вверху при прокрутке и не исчезать.", + "lever": 5, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPersistentHeader", + "desc": [ + "【delegate】 : делегат 【SliverPersistentHeaderDelegate】", + "【floating】 : плавающий 【bool】", + "【pinned】 : закреплённый вверху 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json new file mode 100644 index 00000000..6274480b --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver-Prototyp-Erweiterungsliste", + "info": "Die Eigenschaft prototypeItem ist ein Widget, das die Größe der Elemente in der Hauptachsenrichtung einschränkt, aber nicht angezeigt wird. Der delegate akzeptiert einen SliverChildDelegate, um die Erstellung der Elemente abzuschließen.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Hauptachsenrichtungsgrößenkomponente 【Widget】", + "【delegate】 : Kind-Delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json new file mode 100644 index 00000000..471973db --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver Prototype Extent List", + "info": "The prototypeItem property is a Widget, which is responsible for constraining the size of the item in the main axis direction, but it will not be displayed. The delegate accepts a SliverChildDelegate to complete the creation of the item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Main axis size component 【Widget】", + "【delegate】 : Child delegate 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json new file mode 100644 index 00000000..6755cc3c --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista de Extensión de Prototipo Sliver", + "info": "La propiedad prototypeItem es un Widget, que se encarga de restringir el tamaño del ítem en la dirección del eje principal, pero no se mostrará. El delegate acepta un SliverChildDelegate para completar la creación del ítem.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente de tamaño en la dirección del eje principal 【Widget】", + "【delegate】 : Delegado de hijos 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json new file mode 100644 index 00000000..0642cc05 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Liste d'extension de prototype Sliver", + "info": "La propriété prototypeItem est un Widget, elle est responsable de contraindre la taille de l'item dans la direction de l'axe principal, mais ne sera pas affichée. Le delegate accepte un SliverChildDelegate pour créer l'item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Composant de taille dans la direction de l'axe principal 【Widget】", + "【delegate】 : Délégué des enfants 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json new file mode 100644 index 00000000..b0130d17 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista di estensione del prototipo Sliver", + "info": "La proprietà prototypeItem è un Widget, che si occupa di vincolare le dimensioni dell'elemento nella direzione dell'asse principale, ma non viene visualizzato. Il delegate accetta un SliverChildDelegate per completare la creazione dell'elemento.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente di dimensioni nella direzione dell'asse principale 【Widget】", + "【delegate】 : Delegato per i figli 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json new file mode 100644 index 00000000..5b31fd93 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliverプロトタイプ拡張リスト", + "info": "prototypeItemプロパティはWidgetで、主軸方向のitemのサイズを制約しますが、表示されません。delegateはSliverChildDelegateを受け取り、itemの作成を完了します。", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentListの基本使用", + "desc": [ + "【prototypeItem】 : 主軸方向サイズコンポーネント 【Widget】", + "【delegate】 : 子デリゲート 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json new file mode 100644 index 00000000..033af177 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Sliver 프로토타입 확장 리스트", + "info": "prototypeItem 속성은 Widget이며, 주축 방향의 item 크기를 제한하지만 표시되지는 않습니다. delegate는 SliverChildDelegate를 받아 item 생성을 완료합니다.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverPrototypeExtentList 기본 사용", + "desc": [ + "【prototypeItem】 : 주축 방향 크기 컴포넌트 【Widget】", + "【delegate】 : 자식 대리자 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json new file mode 100644 index 00000000..daa4feea --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Lista de Extensão de Protótipo Sliver", + "info": "A propriedade prototypeItem é um Widget, que é responsável por restringir o tamanho do item na direção do eixo principal, mas não será exibido. O delegate aceita um SliverChildDelegate para criar o item.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Componente de tamanho na direção do eixo principal 【Widget】", + "【delegate】 : Delegado de criança 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json new file mode 100644 index 00000000..6ce33abf --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverPrototypeExtentList/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 314, + "name": "SliverPrototypeExtentList", + "localName": "Список расширений прототипа Sliver", + "info": "Свойство prototypeItem является Widget, оно отвечает за ограничение размера элемента в направлении основной оси, но не отображается. Delegate принимает SliverChildDelegate для создания элементов.", + "lever": 2, + "family": 4, + "linkIds": [ + 185, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverPrototypeExtentList", + "desc": [ + "【prototypeItem】 : Компонент размера в направлении основной оси 【Widget】", + "【delegate】 : Делегат детей 【SliverChildDelegate】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json new file mode 100644 index 00000000..e2848f0a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver-Adapter", + "info": "Kann ein normales Widget aufnehmen und in ein Sliver-Widget umwandeln.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SliverToBoxAdapter", + "desc": [ + "【child】 : Untergeordnetes Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json new file mode 100644 index 00000000..efcf4521 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver Adapter", + "info": "An adapter that can accommodate a common component and convert it into a component of the Sliver family.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SliverToBoxAdapter", + "desc": [ + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json new file mode 100644 index 00000000..fc7ad225 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptador Sliver", + "info": "Puede contener un componente común y convertirlo en un adaptador para los componentes de la familia Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SliverToBoxAdapter", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json new file mode 100644 index 00000000..0d6c369d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptateur Sliver", + "info": "Un adaptateur qui peut contenir un composant ordinaire et le transformer en un composant de la famille Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SliverToBoxAdapter", + "desc": [ + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json new file mode 100644 index 00000000..684fd564 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adattatore Sliver", + "info": "Un adattatore che può contenere un componente normale e trasformarlo in un componente della famiglia Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SliverToBoxAdapter", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json new file mode 100644 index 00000000..30979cf2 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliverアダプター", + "info": "通常のコンポーネントを収容し、それをSliverファミリーのコンポーネントに変換するアダプターです。", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapterの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json new file mode 100644 index 00000000..89baca35 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver 어댑터", + "info": "일반 컴포넌트를 수용하고 Sliver 패밀리 컴포넌트로 변환할 수 있는 어댑터입니다.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverToBoxAdapter 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json new file mode 100644 index 00000000..cd781211 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Adaptador Sliver", + "info": "Pode acomodar um componente comum e transformá-lo num adaptador para componentes da família Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do SliverToBoxAdapter", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json new file mode 100644 index 00000000..5912820d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverToBoxAdapter/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 189, + "name": "SliverToBoxAdapter", + "localName": "Sliver адаптер", + "info": "Адаптер, который может вместить обычный компонент и преобразовать его в компонент семейства Sliver.", + "lever": 4, + "family": 4, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SliverToBoxAdapter", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json new file mode 100644 index 00000000..7e133c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver Keep-Alive-Container", + "info": "Es ist eine abstrakte Klasse und kann nicht alleine verwendet werden. Nur seine Unterklassen können Keep-Alive-Kinder aufnehmen.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in SliverWithKeepAliveWidget", + "desc": [ + "【key】 : Schlüssel 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json new file mode 100644 index 00000000..fd21e244 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver Keep-Alive Container", + "info": "It is an abstract class and cannot be used alone. Only its subclasses can accommodate KeepAlive children.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to SliverWithKeepAliveWidget", + "desc": [ + "【key】 : key 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json new file mode 100644 index 00000000..f71c8206 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Contenedor Sliver con KeepAlive", + "info": "Es una clase abstracta y no se puede usar por sí sola. Solo sus subclases pueden contener hijos con KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a SliverWithKeepAliveWidget", + "desc": [ + "【key】 : clave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json new file mode 100644 index 00000000..30bc843a --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Conteneur Sliver avec KeepAlive", + "info": "C'est une classe abstraite et ne peut pas être utilisée seule. Seules ses sous-classes peuvent contenir des enfants KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à SliverWithKeepAliveWidget", + "desc": [ + "【key】 : clé 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json new file mode 100644 index 00000000..2679e37d --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Contenitore Sliver con KeepAlive", + "info": "È una classe astratta e non può essere utilizzata da sola. Solo le sue sottoclassi possono contenere figli KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a SliverWithKeepAliveWidget", + "desc": [ + "【key】 : chiave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json new file mode 100644 index 00000000..7871fae7 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver保活コンテナ", + "info": "これは抽象クラスであり、単独で使用することはできません。そのサブクラスのみがKeepAliveの子を保持できます。", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 紹介", + "desc": [ + "【key】 : キー 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json new file mode 100644 index 00000000..ce057802 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver 생존 유지 컨테이너", + "info": "이것은 추상 클래스로, 단독으로 사용할 수 없습니다. 오직 그 하위 클래스만이 KeepAlive 자식을 포함할 수 있습니다.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SliverWithKeepAliveWidget 소개", + "desc": [ + "【key】 : 키 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json new file mode 100644 index 00000000..6ad1ecdb --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Recipiente Sliver com KeepAlive", + "info": "É uma classe abstrata e não pode ser usada sozinha. Apenas suas subclasses podem conter filhos KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao SliverWithKeepAliveWidget", + "desc": [ + "【key】 : chave 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json new file mode 100644 index 00000000..42890b04 --- /dev/null +++ b/modules/widget_system/widgets/lib/Sliver/SliverWithKeepAliveWidget/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 348, + "name": "SliverWithKeepAliveWidget", + "localName": "Sliver контейнер с поддержкой активности", + "info": "Это абстрактный класс, который нельзя использовать отдельно. Только его подклассы могут содержать дочерние элементы KeepAlive.", + "lever": 1, + "family": 4, + "linkIds": [ + 316, + 239, + 188, + 185, + 314, + 186 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в SliverWithKeepAliveWidget", + "desc": [ + "【key】 : ключ 【Key】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json new file mode 100644 index 00000000..5ab06a88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Ausrichtungsübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Alignment verwendet, um eine Übergangsanimation zwischen zwei Alignment-Objekten für das untergeordnete Widget zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AlignTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【alignment】 : Ausrichtungsanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json new file mode 100644 index 00000000..cb576d3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Alignment Transition", + "info": "A subclass of AnimatedWidget, using an animator of type Alignment to allow child components to transition between two Alignment objects.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AlignTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【alignment】: Alignment animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json new file mode 100644 index 00000000..969c3b2c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transición de alineación", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Alignment para permitir que los componentes hijos realicen una animación de transición entre dos objetos Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AlignTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【alignment】 : Animación de alineación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json new file mode 100644 index 00000000..afe4f300 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transition d'alignement", + "info": "Sous-classe de AnimatedWidget, utilisant un animateur de type Alignment pour permettre à un composant enfant de faire une transition animée entre deux objets Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AlignTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【alignment】 : Animation d'alignement 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json new file mode 100644 index 00000000..252739a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transizione di allineamento", + "info": "Una sottoclasse di AnimatedWidget, utilizza un animatore di tipo Alignment per far sì che i componenti figli effettuino una transizione animata tra due oggetti Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AlignTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【alignment】 : Animazione di allineamento 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json new file mode 100644 index 00000000..9d05b594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "整列遷移", + "info": "AnimatedWidgetのサブクラスで、Alignmentタイプのアニメーターを使用して子コンポーネントを2つのAlignmentオブジェクト間で遷移アニメーションさせます。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【alignment】 : 整列アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json new file mode 100644 index 00000000..4af24abf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "정렬 변환", + "info": "AnimatedWidget의 하위 클래스, Alignment 타입의 애니메이터를 사용하여 자식 위젯이 두 Alignment 객체 사이에서 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlignTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【alignment】 : 정렬 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json new file mode 100644 index 00000000..a7abb56e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Transição de Alinhamento", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Alignment para permitir que um componente filho faça uma animação de transição entre dois objetos Alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AlignTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【alignment】 : Animação de alinhamento 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json new file mode 100644 index 00000000..5ef6388f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AlignTransition/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 111, + "name": "AlignTransition", + "localName": "Анимация выравнивания", + "info": "Подкласс AnimatedWidget, использующий аниматор типа Alignment для создания переходной анимации между двумя объектами Alignment для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 120 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AlignTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【alignment】 : Анимация выравнивания 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json new file mode 100644 index 00000000..553c66f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Ausrichtungsanimation", + "info": "Ermöglicht die Ausrichtungsanimation von Unterkomponenten, ermöglicht die Angabe von Dauer und Kurve und verfügt über ein Ereignis für das Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedAlign", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【duration】: Animationsdauer 【Duration】", + "【onEnd】: Rückruf bei Ende der Animation 【Function()】", + "【alignment】: Ausrichtungsart 【AlignmentGeometry】", + "【curve】: Animationskurve 【Duration】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json new file mode 100644 index 00000000..d3e7481b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Alignment Animation", + "info": "Allows child components to perform Align (alignment) animations, with specified duration and curve, and includes an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedAlign", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【alignment】: Alignment method 【AlignmentGeometry】", + "【curve】: Animation curve 【Duration】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json new file mode 100644 index 00000000..af8b46dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animación de alineación", + "info": "Permite que los componentes hijos realicen una animación de Align (alineación), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedAlign", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【alignment】 : Modo de alineación 【AlignmentGeometry】", + "【curve】 : Curva de la animación 【Duration】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json new file mode 100644 index 00000000..38d3c4a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animation d'alignement", + "info": "Permet à un composant enfant de réaliser une animation d'alignement (Align), avec la possibilité de spécifier la durée et la courbe, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AnimatedAlign", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【alignment】 : Mode d'alignement 【AlignmentGeometry】", + "【curve】 : Courbe de l'animation 【Duration】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json new file mode 100644 index 00000000..0c6ea987 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Allineamento Animato", + "info": "Consente ai componenti figli di eseguire animazioni di allineamento (Align), con la possibilità di specificare la durata e la curva, e con un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedAlign", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【alignment】 : Modalità di allineamento 【AlignmentGeometry】", + "【curve】 : Curva dell'animazione 【Duration】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json new file mode 100644 index 00000000..f14ebc2f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "アニメーションアライメント", + "info": "子コンポーネントにAlign(アライメント)アニメーションを行わせることができます。時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlignの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【alignment】 : アライメント方法 【AlignmentGeometry】", + "【curve】 : アニメーション曲線 【Duration】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json new file mode 100644 index 00000000..1dcd679e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "정렬 애니메이션", + "info": "자식 위젯이 Align(정렬) 애니메이션을 수행할 수 있게 하며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedAlign 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json new file mode 100644 index 00000000..2a9dfac3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Animação de Alinhamento", + "info": "Permite que os componentes filhos realizem animações de Alinhamento (Align), podendo especificar a duração e a curva, com evento de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AnimatedAlign", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【alignment】 : Modo de alinhamento 【AlignmentGeometry】", + "【curve】 : Curva da animação 【Duration】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json new file mode 100644 index 00000000..782ec832 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedAlign/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 120, + "name": "AnimatedAlign", + "localName": "Анимация выравнивания", + "info": "Позволяет дочернему компоненту выполнять анимацию выравнивания (Align), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 85, + 111 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedAlign", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【curve】 : Кривая анимации 【Duration】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json new file mode 100644 index 00000000..57e1754f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Animations-Builder", + "info": "Durch den Builder werden die entsprechenden Knoten der Animation lokal aktualisiert, und es wird vermieden, dass untergeordnete Komponenten aktualisiert werden, wodurch die Bauzeit reduziert und die Animationsleistung verbessert wird.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Anwendungsbeispiel für AnimatedBuilder", + "desc": [ + "【animation】 : *beobachtbares Objekt 【Listenable】", + "【builder】 : *Komponenten-Builder 【TransitionBuilder】", + "【child】 : untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json new file mode 100644 index 00000000..700c5563 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Animated Builder", + "info": "By using the builder, the corresponding node of the animation can be updated locally, and the refresh of child components can be avoided, reducing the build time and improving animation performance.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder Usage Example", + "desc": [ + "【animation】: *Listenable object 【Listenable】", + "【builder】: *Component builder 【TransitionBuilder】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json new file mode 100644 index 00000000..4c55c51f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Constructor de Animación", + "info": "A través del builder, hace que los nodos correspondientes a la animación se actualicen parcialmente, y evita la actualización de los componentes hijos, reduciendo el tiempo de construcción y mejorando el rendimiento de la animación.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Caso de uso de AnimatedBuilder", + "desc": [ + "【animation】 : *Objeto observable 【Listenable】", + "【builder】 : *Constructor de componentes 【TransitionBuilder】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json new file mode 100644 index 00000000..5f566be4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Constructeur d'animation", + "info": "Rend les nœuds correspondant à l'animation mis à jour localement via le builder, évite le rafraîchissement des composants enfants, réduit le temps de construction et améliore les performances de l'animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemple d'utilisation d'AnimatedBuilder", + "desc": [ + "【animation】 : *Objet observable 【Listenable】", + "【builder】 : *Constructeur de composant 【TransitionBuilder】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json new file mode 100644 index 00000000..24f5dc3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Costruttore di animazioni", + "info": "Attraverso il builder, il nodo corrispondente all'animazione viene aggiornato localmente, evitando l'aggiornamento dei componenti figli, riducendo il tempo di costruzione e migliorando le prestazioni dell'animazione.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Esempio di utilizzo di AnimatedBuilder", + "desc": [ + "【animation】 : *oggetto ascoltabile 【Listenable】", + "【builder】 : *costruttore di componenti 【TransitionBuilder】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json new file mode 100644 index 00000000..bb283ed6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "アニメーションビルダー", + "info": "ビルダーを通じてアニメーションに対応するノードを部分的に更新し、子コンポーネントのリフレッシュを避け、ビルド時間を短縮し、アニメーションのパフォーマンスを向上させます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 使用例", + "desc": [ + "【animation】 : *リスナブルオブジェクト 【Listenable】", + "【builder】 : *コンポーネントビルダー 【TransitionBuilder】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json new file mode 100644 index 00000000..8f79a9c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "애니메이션 빌더", + "info": "빌더를 통해 애니메이션에 해당하는 노드를 부분적으로 업데이트하고, 하위 컴포넌트의 새로고침을 방지하여 빌드 시간을 줄이고 애니메이션 성능을 향상시킵니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedBuilder 사용 예제", + "desc": [ + "【animation】 : *리스너 가능 객체 【Listenable】", + "【builder】 : *컴포넌트 빌더 【TransitionBuilder】", + "【child】 : 하위 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json new file mode 100644 index 00000000..6fa9c0de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Construtor de Animação", + "info": "Através do builder, o nó correspondente à animação é atualizado localmente, evitando a atualização de componentes filhos, reduzindo o tempo de construção e melhorando o desempenho da animação.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemplo de uso do AnimatedBuilder", + "desc": [ + "【animation】 : *objeto observável 【Listenable】", + "【builder】 : *construtor de componente 【TransitionBuilder】", + "【child】 : componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json new file mode 100644 index 00000000..1eac5f1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 228, + "name": "AnimatedBuilder", + "localName": "Анимационный конструктор", + "info": "С помощью builder делает узел, соответствующий анимации, частично обновляемым, а также позволяет избежать обновления дочерних компонентов, сократить время сборки и повысить производительность анимации.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Пример использования AnimatedBuilder", + "desc": [ + "【animation】 : *Объект, который можно прослушивать 【Listenable】", + "【builder】 : *Конструктор компонентов 【TransitionBuilder】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json new file mode 100644 index 00000000..3c9dd45c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animierter Container", + "info": "Vereint alignment, padding, color, decoration, width, height, constraints, margin, transform in einem. Alle diese Eigenschaften können animiert werden, können Dauer und Kurve angeben und haben ein Ereignis am Ende der Animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedContainer", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【color】 : Farbe 【Color】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【decoration】 : Dekoration 【Decoration】", + "【constraints】 : Einschränkungen 【BoxConstraints】", + "【transform】 : Transformation 【Matrix4】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json new file mode 100644 index 00000000..f9f0462c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Container Animation", + "info": "Combines alignment, padding, color, decoration, width, height, constraints, margin, and transform, all of which can be animated. You can specify the duration and curve, and there is an animation end event.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedContainer", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【color】: Color 【Color】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【decoration】: Decoration 【Decoration】", + "【constraints】: Constraints 【BoxConstraints】", + "【transform】: Transformation 【Matrix4】", + "【margin】: Margin 【EdgeInsetsGeometry】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json new file mode 100644 index 00000000..c8284b88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Contenedor Animado", + "info": "Combina alignment, padding, color, decoration, width, height, constraints, margin, transform en uno solo. Todas estas propiedades pueden animarse, se pueden especificar la duración y la curva, y tiene un evento de finalización de animación.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedContainer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【color】 : Color 【Color】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【decoration】 : Decoración 【Decoration】", + "【constraints】 : Restricciones 【BoxConstraints】", + "【transform】 : Transformación 【Matrix4】", + "【margin】 : Margen exterior 【EdgeInsetsGeometry】", + "【padding】 : Margen interior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json new file mode 100644 index 00000000..430220de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animation de conteneur", + "info": "Combine alignment, padding, color, decoration, width, height, constraints, margin, transform en un seul, toutes ces propriétés peuvent être animées, la durée et la courbe peuvent être spécifiées, et il y a un événement de fin d'animation.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedContainer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【color】 : Couleur 【Color】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【decoration】 : Décoration 【Decoration】", + "【constraints】 : Contraintes 【BoxConstraints】", + "【transform】 : Transformation 【Matrix4】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json new file mode 100644 index 00000000..fcb17f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animazione del contenitore", + "info": "Raccoglie alignment, padding, color, decoration, width, height, constraints, margin, transform in un unico componente. Tutti questi attributi possono essere animati, è possibile specificare la durata e la curva, e c'è un evento di fine animazione.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedContainer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【color】 : Colore 【Color】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【decoration】 : Decorazione 【Decoration】", + "【constraints】 : Vincoli 【BoxConstraints】", + "【transform】 : Trasformazione 【Matrix4】", + "【margin】 : Margine esterno 【EdgeInsetsGeometry】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json new file mode 100644 index 00000000..85d41bc0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "コンテナアニメーション", + "info": "alignment、padding、color、decoration、width、height、constraints、margin、transformを集約し、これらのプロパティはすべてアニメーション可能で、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainerの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【color】 : 色 【Color】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】", + "【alignment】 : 配置 【AlignmentGeometry】", + "【decoration】 : 装飾 【Decoration】", + "【constraints】 : 制約 【BoxConstraints】", + "【transform】 : 変換 【Matrix4】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json new file mode 100644 index 00000000..0e4e5f8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "애니메이션 컨테이너", + "info": "alignment, padding, color, decoration, width, height, constraints, margin, transform을 모두 포함하며, 이러한 속성들은 모두 애니메이션 가능하며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedContainer 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【color】 : 색상 【Color】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】", + "【alignment】 : 정렬 【AlignmentGeometry】", + "【decoration】 : 장식 【Decoration】", + "【constraints】 : 제약 【BoxConstraints】", + "【transform】 : 변환 【Matrix4】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json new file mode 100644 index 00000000..f13eb49f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Animação de Contêiner", + "info": "Combina alignment, padding, color, decoration, width, height, constraints, margin, transform em um único lugar, todas essas propriedades podem ser animadas, é possível especificar a duração e a curva, e há um evento de término da animação.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedContainer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【color】 : Cor 【Color】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【decoration】 : Decoração 【Decoration】", + "【constraints】 : Restrições 【BoxConstraints】", + "【transform】 : Transformação 【Matrix4】", + "【margin】 : Margem externa 【EdgeInsetsGeometry】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json new file mode 100644 index 00000000..d0a51b15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedContainer/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 123, + "name": "AnimatedContainer", + "localName": "Анимация контейнера", + "info": "Объединяет alignment, padding, color, decoration, width, height, constraints, margin, transform. Все эти свойства могут быть анимированы, можно указать длительность и кривую, есть событие завершения анимации.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedContainer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【color】 : Цвет 【Color】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】", + "【alignment】 : Выравнивание 【AlignmentGeometry】", + "【decoration】 : Декорация 【Decoration】", + "【constraints】 : Ограничения 【BoxConstraints】", + "【transform】 : Преобразование 【Matrix4】", + "【margin】 : Внешний отступ 【EdgeInsetsGeometry】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json new file mode 100644 index 00000000..f98e5055 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Komponentenwechsel", + "info": "Zeigt Animationseffekte beim Wechsel zwischen zwei Komponenten an. Eigenschaften wie Animationskurve, Dauer, Ausrichtung usw. können angegeben werden. Es ist eine sehr nützliche Komponente.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedCrossFade", + "desc": [ + "【firstChild】 : Erstes Kind 【Widget】", + "【secondChild】 : Zweites Kind 【Widget】", + "【crossFadeState】 : Welches anzeigen 【CrossFadeState】", + "【duration】 : Dauer 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Animationskurve von AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Erste Kurve 【Curve】", + "【secondCurve】 : Zweite Kurve 【Curve】", + "【sizeCurve】 : Größenänderungskurve 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json new file mode 100644 index 00000000..047e68db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Component Switch", + "info": "Presents animation effects when switching between two components, allowing you to specify properties such as animation curves, duration, alignment, etc. It is a very useful component.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedCrossFade", + "desc": [ + "【firstChild】 : First Child 【Widget】", + "【secondChild】 : Second Child 【Widget】", + "【crossFadeState】 : Which to Display 【CrossFadeState】", + "【duration】 : Duration 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Animation Curves of AnimatedCrossFade", + "desc": [ + "【firstCurve】 : First Curve 【Curve】", + "【secondCurve】 : Second Curve 【Curve】", + "【sizeCurve】 : Size Change Curve 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json new file mode 100644 index 00000000..f743f544 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transición de componentes", + "info": "Muestra un efecto de animación al cambiar entre dos componentes, se pueden especificar propiedades como la curva de animación, la duración, la alineación, etc. Es un componente muy útil.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primer hijo 【Widget】", + "【secondChild】 : Segundo hijo 【Widget】", + "【crossFadeState】 : Mostrar cuál 【CrossFadeState】", + "【duration】 : Duración 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva de animación de AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Primera curva 【Curve】", + "【secondCurve】 : Segunda curva 【Curve】", + "【sizeCurve】 : Curva de cambio de tamaño 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json new file mode 100644 index 00000000..530d0ad9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transition de composants", + "info": "Anime la transition entre deux composants avec des effets, en spécifiant des propriétés telles que la courbe d'animation, la durée, l'alignement, etc. C'est un composant très utile.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedCrossFade", + "desc": [ + "【firstChild】 : Premier enfant 【Widget】", + "【secondChild】 : Deuxième enfant 【Widget】", + "【crossFadeState】 : Afficher lequel 【CrossFadeState】", + "【duration】 : Durée 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Courbe d'animation d'AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Première courbe 【Curve】", + "【secondCurve】 : Deuxième courbe 【Curve】", + "【sizeCurve】 : Courbe de changement de taille 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json new file mode 100644 index 00000000..9795e9a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transizione Componenti", + "info": "Presenta un effetto animato quando si passa da un componente all'altro, è possibile specificare proprietà come la curva di animazione, la durata, l'allineamento, ecc. È un componente molto utile.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primo figlio 【Widget】", + "【secondChild】 : Secondo figlio 【Widget】", + "【crossFadeState】 : Mostra quale 【CrossFadeState】", + "【duration】 : Durata 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva di Animazione di AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Prima curva 【Curve】", + "【secondCurve】 : Seconda curva 【Curve】", + "【sizeCurve】 : Curva di variazione dimensionale 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json new file mode 100644 index 00000000..33881318 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "コンポーネント切り替え", + "info": "2つのコンポーネントを切り替える際にアニメーション効果を表示し、アニメーションカーブ、時間、配置方法などの属性を指定できます。非常に便利なコンポーネントです。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFadeの基本使用", + "desc": [ + "【firstChild】 : 最初の子 【Widget】", + "【secondChild】 : 2番目の子 【Widget】", + "【crossFadeState】 : 表示する番号 【CrossFadeState】", + "【duration】 : 時間 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFadeのアニメーションカーブ", + "desc": [ + "【firstCurve】 : 最初のカーブ 【Curve】", + "【secondCurve】 : 2番目のカーブ 【Curve】", + "【sizeCurve】 : サイズ変化カーブ 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json new file mode 100644 index 00000000..6531263e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "컴포넌트 전환", + "info": "두 컴포넌트를 전환할 때 애니메이션 효과를 나타내며, 애니메이션 곡선, 지속 시간, 정렬 방식 등의 속성을 지정할 수 있습니다. 매우 유용한 컴포넌트입니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedCrossFade 기본 사용", + "desc": [ + "【firstChild】 : 첫 번째 자식 【Widget】", + "【secondChild】 : 두 번째 자식 【Widget】", + "【crossFadeState】 : 몇 번째를 표시할지 【CrossFadeState】", + "【duration】 : 지속 시간 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "AnimatedCrossFade 애니메이션 곡선", + "desc": [ + "【firstCurve】 : 첫 번째 곡선 【Curve】", + "【secondCurve】 : 두 번째 곡선 【Curve】", + "【sizeCurve】 : 크기 변화 곡선 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json new file mode 100644 index 00000000..1537e8a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Transição de Componentes", + "info": "Apresenta um efeito de animação ao alternar entre dois componentes, podendo especificar propriedades como a curva de animação, duração, alinhamento, etc. É um componente muito útil.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedCrossFade", + "desc": [ + "【firstChild】 : Primeiro filho 【Widget】", + "【secondChild】 : Segundo filho 【Widget】", + "【crossFadeState】 : Mostrar qual 【CrossFadeState】", + "【duration】 : Duração 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Curva de Animação do AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Primeira curva 【Curve】", + "【secondCurve】 : Segunda curva 【Curve】", + "【sizeCurve】 : Curva de mudança de tamanho 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json new file mode 100644 index 00000000..2ab52f73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedCrossFade/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 100, + "name": "AnimatedCrossFade", + "localName": "Переключение компонентов", + "info": "При переключении двух компонентов отображается анимация, можно указать такие свойства, как кривая анимации, продолжительность, выравнивание и т.д. Это очень полезный компонент.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedCrossFade", + "desc": [ + "【firstChild】 : Первый ребенок 【Widget】", + "【secondChild】 : Второй ребенок 【Widget】", + "【crossFadeState】 : Показать какой 【CrossFadeState】", + "【duration】 : Продолжительность 【Duration】" + ] + }, + { + "file": "node2_curve.dart", + "name": "Кривая анимации AnimatedCrossFade", + "desc": [ + "【firstCurve】 : Первая кривая 【Curve】", + "【secondCurve】 : Вторая кривая 【Curve】", + "【sizeCurve】 : Кривая изменения размера 【CrossFadeState】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json new file mode 100644 index 00000000..100cc066 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Container-Animation", + "info": "Ermöglicht die Animation von TextStyle (Textstil) für untergeordnete Textkomponenten, gibt Dauer und Kurve an und verfügt über ein Ereignis zum Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【textAlign】 : Textausrichtung 【TextAlign】", + "【softWrap】 : Umhüllung 【bool】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【overflow】 : Überlaufmodus 【TextOverflow】", + "【style】 : Textstil 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json new file mode 100644 index 00000000..59279303 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Container Animation", + "info": "Allows child text components to perform TextStyle (text style) animations, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedDefaultTextStyle", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【textAlign】: Text alignment 【TextAlign】", + "【softWrap】: Whether to wrap 【bool】", + "【maxLines】: Maximum number of lines 【int】", + "【overflow】: Overflow mode 【TextOverflow】", + "【style】: Text style 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json new file mode 100644 index 00000000..c54a2bd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animación de contenedor", + "info": "Permite que los componentes de texto hijos realicen una animación de TextStyle (estilo de texto), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【softWrap】 : Si se envuelve 【bool】", + "【maxLines】 : Número máximo de líneas 【int】", + "【overflow】 : Modo de desbordamiento 【TextOverflow】", + "【style】 : Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json new file mode 100644 index 00000000..939dd077 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animation de conteneur", + "info": "Permet aux composants texte enfants d'effectuer une animation TextStyle (style de texte), peut spécifier la durée et la courbe, et dispose d'un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【softWrap】 : Encapsulage 【bool】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【overflow】 : Mode de débordement 【TextOverflow】", + "【style】 : Style de texte 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json new file mode 100644 index 00000000..058c9f6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animazione del contenitore", + "info": "Consente ai componenti di testo figlio di animare lo stile del testo (TextStyle), con la possibilità di specificare durata e curva, e un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【softWrap】 : Avvolgimento del testo 【bool】", + "【maxLines】 : Numero massimo di righe 【int】", + "【overflow】 : Modalità di overflow 【TextOverflow】", + "【style】 : Stile del testo 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json new file mode 100644 index 00000000..77d50c44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "コンテナアニメーション", + "info": "子テキストコンポーネントにTextStyle(テキストスタイル)アニメーションを適用できます。時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyleの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【softWrap】 : ラップするかどうか 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : オーバーフローモード 【TextOverflow】", + "【style】 : テキストスタイル 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json new file mode 100644 index 00000000..b68b4dce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "컨테이너 애니메이션", + "info": "자식 텍스트 컴포넌트에 TextStyle(텍스트 스타일) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedDefaultTextStyle 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【softWrap】 : 감싸기 여부 【bool】", + "【maxLines】 : 최대 줄 수 【int】", + "【overflow】 : 오버플로우 모드 【TextOverflow】", + "【style】 : 텍스트 스타일 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json new file mode 100644 index 00000000..d95c63a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Animação de Contêiner", + "info": "Permite que componentes de texto filhos realizem animações de TextStyle (estilo de texto), pode especificar duração e curva, e possui evento de término de animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【softWrap】 : Se deve envolver 【bool】", + "【maxLines】 : Número máximo de linhas 【int】", + "【overflow】 : Modo de overflow 【TextOverflow】", + "【style】 : Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json new file mode 100644 index 00000000..83117ad5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedDefaultTextStyle/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 124, + "name": "AnimatedDefaultTextStyle", + "localName": "Анимация контейнера", + "info": "Позволяет дочерним текстовым компонентам анимировать TextStyle (стиль текста), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 114, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedDefaultTextStyle", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【softWrap】 : Обёртка 【bool】", + "【maxLines】 : Максимальное количество строк 【int】", + "【overflow】 : Режим переполнения 【TextOverflow】", + "【style】 : Стиль текста 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json new file mode 100644 index 00000000..df9f0464 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Animierte Bruchteilbox", + "info": "Animierte Version von FractionallySizedBox, die sich automatisch und sanft innerhalb der angegebenen Dauer zur Zielgröße und Position des Kindelements übergeht, wenn sich widthFactor oder heightFactor ändern sowie wenn sich die Ausrichtung ändert.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animationsübergangseffekt", + "desc": [ + "In diesem Fall werden die Parameter heightFactor, widthFactor und alignment beim Klicken geändert, um den Animationseffekt zu sehen.", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Animationsende 【Function()】", + "【alignment】 : Animationszentrum 【Alignment】", + "【curve】 : Animationskurve 【Duration】", + "【heightFactor】 : Höhenfaktor 【double?】", + "【widthFactor】 : Breitenfaktor 【double?】", + "【turns】 : Drehungsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json new file mode 100644 index 00000000..5edb98fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Animated Fractionally Sized Box", + "info": "An animated version of FractionallySizedBox, which automatically and smoothly transitions to the target size and position of the child component within the specified duration when the widthFactor or heightFactor changes, or when the alignment changes.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animation Transition Effect", + "desc": [ + "In this case, the heightFactor, widthFactor, and alignment parameters are modified when clicked to view the animation effect.", + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【onEnd】 : Animation end callback 【Function()】", + "【alignment】 : Animation transformation center 【Alignment】", + "【curve】 : Animation curve 【Duration】", + "【heightFactor】 : Height factor 【double?】", + "【widthFactor】 : Width factor 【double?】", + "【turns】 : Rotation amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json new file mode 100644 index 00000000..a05b4fdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Caja de tamaño fraccional animada", + "info": "Versión animada de FractionallySizedBox, cuando cambia el widthFactor o el heightFactor, así como cuando cambia el alignment, se realizará una transición suave automática a las dimensiones y posición objetivo del componente hijo en la duración especificada.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de transición animada", + "desc": [ + "En este caso, al hacer clic se modifican los parámetros heightFactor, widthFactor, alignment para ver el efecto de movimiento animado.", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【curve】 : Curva de la animación 【Duration】", + "【heightFactor】 : Factor de altura 【double?】", + "【widthFactor】 : Factor de ancho 【double?】", + "【turns】 : Cantidad de rotación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json new file mode 100644 index 00000000..9662b770 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Boîte fractionnée animée", + "info": "Version animée de FractionallySizedBox, lorsque widthFactor ou heightFactor change, ainsi que lorsque l'alignement change, elle transite automatiquement et en douceur vers la taille et la position cible du composant enfant dans la durée spécifiée.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet de transition animée", + "desc": [ + "Dans ce cas, en cliquant, les paramètres heightFactor, widthFactor et alignment sont modifiés pour observer l'effet de mouvement animé.", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【curve】 : Courbe de l'animation 【Duration】", + "【heightFactor】 : Facteur de hauteur 【double?】", + "【widthFactor】 : Facteur de largeur 【double?】", + "【turns】 : Quantité de rotation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json new file mode 100644 index 00000000..96dd4486 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Scatola animata frazionata", + "info": "Versione animata di FractionallySizedBox, quando widthFactor o heightFactor cambiano, così come quando alignment cambia, si transiziona automaticamente e dolcemente alle dimensioni e posizioni target del componente figlio entro la durata specificata.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di transizione animata", + "desc": [ + "In questo caso, cliccando si modificano i parametri heightFactor, widthFactor, alignment, per osservare l'effetto del movimento animato.", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【alignment】 : Centro di trasformazione dell'animazione 【Alignment】", + "【curve】 : Curva dell'animazione 【Duration】", + "【heightFactor】 : Fattore di altezza 【double?】", + "【widthFactor】 : Fattore di larghezza 【double?】", + "【turns】 : Quantità di rotazione 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json new file mode 100644 index 00000000..70b690cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "アニメーションフラクショナリーボックス", + "info": "FractionallySizedBox のアニメーションバージョンで、widthFactor または heightFactor が変化したとき、および alignment が変更されたときに、指定された期間内で子コンポーネントの目標サイズと位置に自動的にスムーズに遷移します。", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "アニメーション遷移効果", + "desc": [ + "このケースでは、クリックすると heightFactor、widthFactor、alignment パラメータが変更され、アニメーションの動きを確認できます。", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【alignment】 : アニメーション変換中心 【Alignment】", + "【curve】 : アニメーションカーブ 【Duration】", + "【heightFactor】 : 高さ分率 【double?】", + "【widthFactor】 : 幅分率 【double?】", + "【turns】 : 回転量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json new file mode 100644 index 00000000..036dd40f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "애니메이션 분율 박스", + "info": "FractionallySizedBox의 애니메이션 버전으로, widthFactor 또는 heightFactor가 변경될 때, 그리고 alignment가 변경될 때 지정된 지속 시간 동안 자동으로 부드럽게 자식 위젯의 목표 크기와 위치로 전환됩니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "애니메이션 전환 효과", + "desc": [ + "이 예제에서는 클릭 시 heightFactor, widthFactor, alignment 매개변수를 수정하여 애니메이션 동작 효과를 확인합니다.", + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【heightFactor】 : 높이 분율 【double?】", + "【widthFactor】 : 너비 분율 【double?】", + "【turns】 : 회전량 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json new file mode 100644 index 00000000..1b385553 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Caixa de Fração Animada", + "info": "Versão animada do FractionallySizedBox, quando o widthFactor ou heightFactor muda, assim como a alignment, ele faz automaticamente uma transição suave para o tamanho e posição desejados do componente filho dentro da duração especificada.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Transição Animada", + "desc": [ + "Neste caso, ao clicar, os parâmetros heightFactor, widthFactor e alignment são modificados para visualizar o efeito de movimento da animação.", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim da animação 【Function()】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【curve】 : Curva da animação 【Duration】", + "【heightFactor】 : Fator de altura 【double?】", + "【widthFactor】 : Fator de largura 【double?】", + "【turns】 : Quantidade de rotação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json new file mode 100644 index 00000000..8efe05d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedFractionallySizedBox/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 260, + "name": "AnimatedFractionallySizedBox", + "localName": "Анимированный FractionallySizedBox", + "info": "Анимированная версия FractionallySizedBox, которая автоматически плавно переходит к целевому размеру и положению дочернего компонента в течение указанной продолжительности при изменении widthFactor или heightFactor, а также при изменении alignment.", + "lever": 3, + "family": 1, + "linkIds": [ + 82, + 120, + 123, + 121 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Анимационный переход", + "desc": [ + "В этом примере при нажатии изменяются параметры heightFactor, widthFactor и alignment, чтобы увидеть эффект анимации.", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【alignment】 : Центр анимационного преобразования 【Alignment】", + "【curve】 : Кривая анимации 【Duration】", + "【heightFactor】 : Коэффициент высоты 【double?】", + "【widthFactor】 : Коэффициент ширины 【double?】", + "【turns】 : Количество поворотов 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json new file mode 100644 index 00000000..4b077f16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Animierte Liste", + "info": "Erweiterte Version von ListView, die Animationen für Elemente ermöglicht. Zum Beispiel Animationen beim Hinzufügen oder Entfernen von Elementen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedList", + "desc": [ + "【itemBuilder】 : Komponentenkonstruktor 【AnimatedListItemBuilder】", + "【initialItemCount】 : Anzahl der Unterkomponenten 【int】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【controller】 : Scroll-Controller 【ScrollController】", + "【reverse】 : Daten umgekehrt 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json new file mode 100644 index 00000000..ffc8e335 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Animated List", + "info": "An enhanced version of ListView, which can animate items. For example, animations for adding or deleting items.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedList", + "desc": [ + "【itemBuilder】: Component builder 【AnimatedListItemBuilder】", + "【initialItemCount】: Number of child components 【int】", + "【scrollDirection】: Scroll direction 【Axis】", + "【controller】: Scroll controller 【ScrollController】", + "【reverse】: Whether the data is reversed 【bool】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json new file mode 100644 index 00000000..e4b800f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista animada", + "info": "Versión mejorada de ListView, permite animar los ítems. Por ejemplo, animaciones al añadir o eliminar ítems.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedList", + "desc": [ + "【itemBuilder】: Constructor de componentes 【AnimatedListItemBuilder】", + "【initialItemCount】: Número de componentes hijos 【int】", + "【scrollDirection】: Dirección de desplazamiento 【Axis】", + "【controller】: Controlador de desplazamiento 【ScrollController】", + "【reverse】: Si los datos están invertidos 【bool】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json new file mode 100644 index 00000000..085b8bb7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Liste animée", + "info": "Une version améliorée de ListView, permettant d'animer les éléments. Par exemple, des animations lors de l'ajout ou de la suppression d'éléments.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedList", + "desc": [ + "【itemBuilder】 : Constructeur de composants 【AnimatedListItemBuilder】", + "【initialItemCount】 : Nombre de composants enfants 【int】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【reverse】 : Inversion des données 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json new file mode 100644 index 00000000..d31874c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista Animata", + "info": "Versione potenziata di ListView, consente di animare gli item. Ad esempio, animazioni degli item durante l'aggiunta o la rimozione.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedList", + "desc": [ + "【itemBuilder】 : Costruttore di componenti 【AnimatedListItemBuilder】", + "【initialItemCount】 : Numero di componenti figli 【int】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【controller】 : Controllore di scorrimento 【ScrollController】", + "【reverse】 : Se i dati sono invertiti 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json new file mode 100644 index 00000000..3a73e79f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "アニメーションリスト", + "info": "強化版のListViewで、アイテムにアニメーションを適用できます。例えば、追加や削除時のアイテムのアニメーションなど。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedListの基本使用", + "desc": [ + "【itemBuilder】 : コンポーネントビルダー 【AnimatedListItemBuilder】", + "【initialItemCount】 : サブコンポーネントの数 【int】", + "【scrollDirection】 : スライド方向 【Axis】", + "【controller】 : スライドコントローラー 【ScrollController】", + "【reverse】 : データが逆順かどうか 【bool】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json new file mode 100644 index 00000000..6e1f1c13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "애니메이션 리스트", + "info": "강화된 ListView, 아이템에 애니메이션을 적용할 수 있습니다. 예를 들어 추가, 삭제 시 아이템의 애니메이션.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedList 기본 사용", + "desc": [ + "【itemBuilder】 : 컴포넌트 생성기 【AnimatedListItemBuilder】", + "【initialItemCount】 : 하위 컴포넌트 수 【int】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【reverse】 : 데이터 반전 여부 【bool】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json new file mode 100644 index 00000000..5b981ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Lista Animada", + "info": "Versão aprimorada do ListView, que permite animar os itens. Por exemplo, animações ao adicionar ou remover itens.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedList", + "desc": [ + "【itemBuilder】: Construtor de componentes 【AnimatedListItemBuilder】", + "【initialItemCount】: Número de subcomponentes 【int】", + "【scrollDirection】: Direção de deslizamento 【Axis】", + "【controller】: Controlador de deslizamento 【ScrollController】", + "【reverse】: Se os dados estão invertidos 【bool】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json new file mode 100644 index 00000000..7aade432 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedList/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 117, + "name": "AnimatedList", + "localName": "Анимированный список", + "info": "Улучшенная версия ListView, которая позволяет анимировать элементы. Например, анимация при добавлении или удалении элементов.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedList", + "desc": [ + "【itemBuilder】 : Конструктор компонента 【AnimatedListItemBuilder】", + "【initialItemCount】 : Количество дочерних компонентов 【int】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【reverse】 : Обратный порядок данных 【bool】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json new file mode 100644 index 00000000..1b4de573 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Animierte Modalschranke", + "info": "Intern basiert es auf ModalBarrier und bietet die gleiche Funktionalität, jedoch kann dieser Komponente eine Farbanimation übergeben werden, um einen Übergangseffekt zu erzielen.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Gibt an, ob ein Klick zurückkehrt 【bool】", + "【color】 : Farbe 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json new file mode 100644 index 00000000..e412ca89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Animated Barrier Module", + "info": "Internally relies on ModalBarrier for implementation, with the same functionality, except that this component can accept a color animation for transition display.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to AnimatedModalBarrier", + "desc": [ + "【dismissible】: Whether to return on click 【bool】", + "【color】: Color 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json new file mode 100644 index 00000000..18c13fdb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barrera Modal Animada", + "info": "Implementado internamente con ModalBarrier, con la misma funcionalidad, pero este componente puede recibir una animación de color para una transición suave.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a AnimatedModalBarrier", + "desc": [ + "【dismissible】: Si se puede volver al hacer clic 【bool】", + "【color】: Color 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json new file mode 100644 index 00000000..e9ed5dea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barrière Modale Animée", + "info": "Implémenté en interne avec ModalBarrier, fonctionne de la même manière, mais ce composant peut recevoir une animation de couleur pour une transition visuelle.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Retour au clic 【bool】", + "【color】 : Couleur 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json new file mode 100644 index 00000000..c127583c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barriera Modale Animata", + "info": "Implementato internamente con ModalBarrier, le funzionalità sono le stesse, ma questo componente può ricevere un'animazione di colore per una transizione graduale.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Se cliccato, ritorna 【bool】", + "【color】 : Colore 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json new file mode 100644 index 00000000..8bf23aef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "アニメーションバリアモジュール", + "info": "内部的にModalBarrierに依存して実装されており、機能は同じですが、このコンポーネントにはカラーアニメーションを渡して、トランジションを表示することができます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 紹介", + "desc": [ + "【dismissible】 : クリックで戻るかどうか 【bool】", + "【color】 : 色 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json new file mode 100644 index 00000000..041ab445 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "애니메이션 배리어 모드", + "info": "내부적으로 ModalBarrier를 기반으로 구현되었으며, 기능은 동일합니다. 다만 이 컴포넌트는 색상 애니메이션을 전달하여 전환 효과를 나타낼 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedModalBarrier 소개", + "desc": [ + "【dismissible】 : 클릭 시 반환 여부 【bool】", + "【color】 : 색상 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json new file mode 100644 index 00000000..8614f706 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Barreira Modal Animada", + "info": "Implementado internamente com ModalBarrier, com funcionalidades idênticas, exceto que este componente pode receber uma animação de cor para transição.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao AnimatedModalBarrier", + "desc": [ + "【dismissible】: Clicar para retornar 【bool】", + "【color】: Cor 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json new file mode 100644 index 00000000..a4d6fdce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedModalBarrier/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 227, + "name": "AnimatedModalBarrier", + "localName": "Анимированный барьер", + "info": "Внутренняя реализация зависит от ModalBarrier, функциональность идентична, за исключением того, что этот компонент может принимать анимацию цвета для плавного отображения.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в AnimatedModalBarrier", + "desc": [ + "【dismissible】 : Возврат при клике 【bool】", + "【color】 : Цвет 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json new file mode 100644 index 00000000..37fe54b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Transparenz-Animation", + "info": "Ermöglicht die Animation der Opazität (Transparenz) von Kindkomponenten, ermöglicht die Angabe von Dauer und Kurve und verfügt über ein Ereignis zum Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedOpacity", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【opacity】 : Transparenz 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json new file mode 100644 index 00000000..bbfbc733 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Opacity Animation", + "info": "Allows child components to perform opacity animations, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedOpacity", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【opacity】: Opacity 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json new file mode 100644 index 00000000..3b874d14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animación de Opacidad", + "info": "Permite animar la opacidad de los componentes hijos, se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedOpacity", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【opacity】 : Opacidad 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json new file mode 100644 index 00000000..2217fa08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animation de transparence", + "info": "Permet à un composant enfant de réaliser une animation d'opacité, avec une durée et une courbe spécifiables, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedOpacity", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Callback de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【opacity】 : Opacité 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json new file mode 100644 index 00000000..f2ad7713 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animazione di opacità", + "info": "Consente ai componenti figli di eseguire un'animazione di Opacity (opacità), può specificare la durata e la curva, e ha un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedOpacity", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【opacity】 : Opacità 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json new file mode 100644 index 00000000..b36dddf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "透明度アニメーション", + "info": "子コンポーネントにOpacity(透明度)アニメーションを適用でき、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacityの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【opacity】 : 透明度 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json new file mode 100644 index 00000000..7305222c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "투명도 애니메이션", + "info": "자식 위젯에 Opacity(투명도) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedOpacity 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【opacity】 : 투명도 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json new file mode 100644 index 00000000..0c8f1602 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Animação de Opacidade", + "info": "Permite que os componentes filhos realizem animações de Opacidade, podendo especificar a duração e a curva, com eventos de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedOpacity", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【opacity】 : Opacidade 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json new file mode 100644 index 00000000..1320b3bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedOpacity/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 118, + "name": "AnimatedOpacity", + "localName": "Анимация прозрачности", + "info": "Позволяет дочерним компонентам выполнять анимацию Opacity (прозрачности), можно указать продолжительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [ + 89, + 73 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedOpacity", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【opacity】 : Прозрачность 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json new file mode 100644 index 00000000..b87470c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animierter Abstand", + "info": "Ermöglicht Padding (Innenabstand) Animationen für Kind-Komponenten, kann Dauer und Kurve angeben, hat ein Ereignis für das Ende der Animation.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPadding", + "desc": [ + "【child】 : Kind-Komponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json new file mode 100644 index 00000000..ab9b53fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Padding Animation", + "info": "Allows child components to perform padding animation, with specified duration and curve, and has an animation end event.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPadding", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json new file mode 100644 index 00000000..1b6f6113 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animación de margen", + "info": "Permite que los componentes hijos realicen una animación de Padding (margen interior), se puede especificar la duración y la curva, y tiene un evento de finalización de la animación.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPadding", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【padding】 : Margen interior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json new file mode 100644 index 00000000..f0cd004b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animation de marge", + "info": "Permet à un composant enfant d'animer le Padding (marge intérieure), avec la possibilité de spécifier la durée et la courbe, et un événement de fin d'animation.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPadding", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json new file mode 100644 index 00000000..ec6ac5f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animazione del margine", + "info": "Consente ai componenti figli di eseguire animazioni di Padding (margine interno), con la possibilità di specificare durata e curva, e con un evento di fine animazione.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPadding", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json new file mode 100644 index 00000000..31976442 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "パディングアニメーション", + "info": "子コンポーネントにPadding(パディング)アニメーションを行わせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPaddingの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【padding】 : パディング 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json new file mode 100644 index 00000000..6d5c3d4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "패딩 애니메이션", + "info": "자식 위젯에 패딩(내부 여백) 애니메이션을 적용할 수 있으며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPadding 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json new file mode 100644 index 00000000..bf6ac0b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Animação de Margem", + "info": "Permite que os componentes filhos realizem animações de Padding (margem interna), pode especificar a duração e a curva, e tem um evento de término da animação.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPadding", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json new file mode 100644 index 00000000..7b2c17d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPadding/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 119, + "name": "AnimatedPadding", + "localName": "Анимация отступов", + "info": "Позволяет дочерним компонентам анимировать отступы (Padding), можно указать длительность и кривую, есть событие завершения анимации.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPadding", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json new file mode 100644 index 00000000..12cbe318 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animiertes Physikalisches Modell", + "info": "Eine PhysicalModel-Komponente mit Animationseffekten bei Änderungen der relevanten Eigenschaften, im Wesentlichen eine Kombination aus PhysicalModel und Animation. Es können Eigenschaften wie Schatten, Schattentiefe, abgerundete Ecken, Animationsdauer, Endrückruf usw. angegeben werden.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPhysicalModel", + "desc": [ + "【color】 : Hintergrundfarbe 【Color】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf nach Abschluss der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【shape】 : Form 【BoxShape】", + "【elevation】 : Schattentiefe 【double】", + "【borderRadius】 : Abgerundete Ecken 【BorderRadius】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json new file mode 100644 index 00000000..70d62f75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animated Physical Model", + "info": "A PhysicalModel component with animation effects when related properties change, essentially a combination of PhysicalModel and animation. Properties such as shadow, elevation, borderRadius, animation duration, and end callback can be specified.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPhysicalModel", + "desc": [ + "【color】: Background color 【Color】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【shape】: Shape 【BoxShape】", + "【elevation】: Elevation 【double】", + "【borderRadius】: Border radius 【BorderRadius】", + "【shadowColor】: Shadow color 【Color】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json new file mode 100644 index 00000000..d7df7f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modelo Físico Animado", + "info": "Un componente PhysicalModel con efectos de animación cuando cambian las propiedades relacionadas, esencialmente es una combinación de PhysicalModel y animación. Se pueden especificar propiedades como sombra, profundidad de sombra, esquinas redondeadas, duración de la animación, devolución de llamada al finalizar, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPhysicalModel", + "desc": [ + "【color】 : Color de fondo 【Color】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profundidad de sombra 【double】", + "【borderRadius】 : Esquinas redondeadas 【BorderRadius】", + "【shadowColor】 : Color de la sombra 【Color】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json new file mode 100644 index 00000000..53c14c05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Animation de module physique", + "info": "Un composant PhysicalModel avec des effets d'animation lorsque les propriétés associées changent, essentiellement une combinaison de PhysicalModel et d'animation. Vous pouvez spécifier des propriétés telles que l'ombre, la profondeur de l'ombre, le rayon de bordure, la durée de l'animation, le rappel de fin, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPhysicalModel", + "desc": [ + "【color】 : Couleur de fond 【Color】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【shape】 : Forme 【BoxShape】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【borderRadius】 : Rayon de bordure 【BorderRadius】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json new file mode 100644 index 00000000..8ffe12ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modello Fisico Animato", + "info": "Componente PhysicalModel con effetti di animazione quando cambiano le proprietà relative, essenzialmente una combinazione di PhysicalModel e animazione. È possibile specificare proprietà come ombre, profondità dell'ombra, angoli arrotondati, durata dell'animazione, callback di fine, ecc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPhysicalModel", + "desc": [ + "【color】 : Colore di sfondo 【Color】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profondità dell'ombra 【double】", + "【borderRadius】 : Angoli arrotondati 【BorderRadius】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json new file mode 100644 index 00000000..ef133412 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "物理モジュールアニメーション", + "info": "関連する属性が変化する際にアニメーション効果を持つPhysicalModelコンポーネントで、本質的にはPhysicalModelとアニメーションの組み合わせです。影、影の深さ、角の丸み、アニメーションの長さ、終了コールバックなどの属性を指定できます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModelの基本使用", + "desc": [ + "【color】 : 背景色 【Color】", + "【duration】 : アニメーションの長さ 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーションカーブ 【Duration】", + "【shape】 : 形状 【BoxShape】", + "【elevation】 : 影の深さ 【double】", + "【borderRadius】 : 角の丸み 【BorderRadius】", + "【shadowColor】 : 影の色 【Color】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json new file mode 100644 index 00000000..a5814d3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "물리 모듈 애니메이션", + "info": "관련 속성이 변경될 때 애니메이션 효과가 있는 PhysicalModel 컴포넌트로, 본질적으로 PhysicalModel과 애니메이션의 결합체입니다. 그림자, 그림자 깊이, 둥근 모서리, 애니메이션 지속 시간, 종료 콜백 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPhysicalModel 기본 사용", + "desc": [ + "【color】 : 배경색 【Color】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【shape】 : 모양 【BoxShape】", + "【elevation】 : 그림자 깊이 【double】", + "【borderRadius】 : 둥근 모서리 【BorderRadius】", + "【shadowColor】 : 그림자 색상 【Color】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json new file mode 100644 index 00000000..1157fca6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Modelo Físico Animado", + "info": "Componente PhysicalModel com efeitos de animação quando as propriedades relacionadas mudam, essencialmente uma combinação de PhysicalModel e animação. Pode especificar propriedades como sombra, profundidade de sombra, cantos arredondados, duração da animação, callback de término, etc.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPhysicalModel", + "desc": [ + "【color】 : Cor de fundo 【Color】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【shape】 : Forma 【BoxShape】", + "【elevation】 : Profundidade de sombra 【double】", + "【borderRadius】 : Cantos arredondados 【BorderRadius】", + "【shadowColor】 : Cor da sombra 【Color】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json new file mode 100644 index 00000000..4f04e95f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPhysicalModel/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 225, + "name": "AnimatedPhysicalModel", + "localName": "Анимация физического модуля", + "info": "Компонент PhysicalModel с анимацией при изменении связанных свойств, по сути, представляет собой комбинацию PhysicalModel и анимации. Можно указать такие свойства, как тень, глубина тени, скругление углов, длительность анимации, обратный вызов по завершении и другие.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPhysicalModel", + "desc": [ + "【color】 : Цвет фона 【Color】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【shape】 : Форма 【BoxShape】", + "【elevation】 : Глубина тени 【double】", + "【borderRadius】 : Скругление углов 【BorderRadius】", + "【shadowColor】 : Цвет тени 【Color】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json new file mode 100644 index 00000000..c1da6abe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Positionierte Animation", + "info": "Ermöglicht die Positionierungsanimation von Unterkomponenten, kann Dauer und Kurve angeben und hat ein Ereignis zum Ende der Animation. Kann nur in einem Stack verwendet werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPositioned", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【top】 : Abstand zum oberen Rand des Elternteils 【double】", + "【right】 : Abstand zum rechten Rand des Elternteils 【double】", + "【left】 : Abstand zum linken Rand des Elternteils 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternteils 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json new file mode 100644 index 00000000..a27ec880 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Positioning Animation", + "info": "Allows child components to perform Positioned (positioning) animations, with specified duration and curves, and has an animation end event. Can only be used within a Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPositioned", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【top】: Distance to parent top 【double】", + "【right】: Distance to parent right 【double】", + "【left】: Distance to parent left 【double】", + "【bottom】: Distance to parent bottom 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json new file mode 100644 index 00000000..5128fa97 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animación de Posicionamiento", + "info": "Permite que los componentes hijos realicen animaciones de Positioned (posicionamiento), se pueden especificar la duración y la curva, y hay un evento de finalización de la animación. Solo se puede usar dentro de Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPositioned", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【top】 : Distancia a la parte superior del padre 【double】", + "【right】 : Distancia a la derecha del padre 【double】", + "【left】 : Distancia a la izquierda del padre 【double】", + "【bottom】 : Distancia a la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json new file mode 100644 index 00000000..fb134380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animation de positionnement", + "info": "Permet à un composant enfant d'effectuer une animation Positioned (positionnement), avec une durée et une courbe spécifiables, et un événement de fin d'animation. Ne peut être utilisé que dans un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPositioned", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【right】 : Distance par rapport à la droite du parent 【double】", + "【left】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json new file mode 100644 index 00000000..2e5cb4dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animazione di Posizionamento", + "info": "Consente ai componenti figli di eseguire animazioni di posizionamento (Positioned), con durata e curva specificabili, e un evento di fine animazione. Può essere utilizzato solo all'interno di uno Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPositioned", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【right】 : Distanza dal bordo destro del genitore 【double】", + "【left】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json new file mode 100644 index 00000000..2ed82519 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "位置アニメーション", + "info": "子コンポーネントをPositioned(位置)アニメーションさせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。Stack内でのみ使用できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【top】 : 親の上端までの距離 【double】", + "【right】 : 親の右端までの距離 【double】", + "【left】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json new file mode 100644 index 00000000..0bbbb46b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "위치 애니메이션", + "info": "자식 컴포넌트를 Positioned(위치) 애니메이션으로 이동시킬 수 있으며, 지속 시간과 곡선을 지정할 수 있고 애니메이션 종료 이벤트가 있습니다. Stack 내에서만 사용할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositioned 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【top】 : 부모 상단까지의 거리 【double】", + "【right】 : 부모 오른쪽까지의 거리 【double】", + "【left】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json new file mode 100644 index 00000000..117e6a50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Animação de Posicionamento", + "info": "Permite que os componentes filhos realizem animações de Positioned (posicionamento), podendo especificar a duração e a curva, com evento de término da animação. Só pode ser usado dentro de uma Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedPositioned", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【top】 : Distância até o topo do pai 【double】", + "【right】 : Distância até a direita do pai 【double】", + "【left】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json new file mode 100644 index 00000000..577fb636 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositioned/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 121, + "name": "AnimatedPositioned", + "localName": "Анимация позиционирования", + "info": "Позволяет дочерним компонентам выполнять анимацию Positioned (позиционирования), можно указать продолжительность и кривую, есть событие завершения анимации. Может использоваться только в Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 108, + 93, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPositioned", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【top】 : Расстояние до верхнего края родителя 【double】", + "【right】 : Расстояние до правого края родителя 【double】", + "【left】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до нижнего края родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json new file mode 100644 index 00000000..2ef2b715 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Richtungsbasierte Positionierungsanimation", + "info": "Ermöglicht es Kindkomponenten, eine PositionedDirectional (richtungsbasierte Positionierung) Animation durchzuführen, wobei Dauer und Kurve angegeben werden können und ein Ereignis am Ende der Animation vorhanden ist. Kann nur innerhalb eines Stacks verwendet werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedPositionedDirectional", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf am Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【top】 : Abstand zum oberen Rand des Elternteils 【double】", + "【end】 : Abstand zum rechten Rand des Elternteils 【double】", + "【start】 : Abstand zum linken Rand des Elternteils 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternteils 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json new file mode 100644 index 00000000..b4f69a91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Directional Positioning Animation", + "info": "Allows child components to perform PositionedDirectional (directional positioning) animations, with specified duration and curve, and has an animation end event. Can only be used within Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedPositionedDirectional", + "desc": [ + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【top】: Distance to parent top 【double】", + "【end】: Distance to parent right 【double】", + "【start】: Distance to parent left 【double】", + "【bottom】: Distance to parent bottom 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json new file mode 100644 index 00000000..dfd55b24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animación de Posicionamiento Direccional", + "info": "Permite que los componentes hijos realicen animaciones de PositionedDirectional (posicionamiento direccional), se pueden especificar la duración y la curva, y tiene un evento de finalización de la animación. Solo se puede usar dentro de un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback de finalización de la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【top】 : Distancia desde la parte superior del padre 【double】", + "【end】 : Distancia desde la derecha del padre 【double】", + "【start】 : Distancia desde la izquierda del padre 【double】", + "【bottom】 : Distancia desde la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json new file mode 100644 index 00000000..0bab7f7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animation de positionnement directionnel", + "info": "Permet à un composant enfant d'effectuer une animation de PositionedDirectional (positionnement directionnel), avec une durée et une courbe spécifiables, et un événement de fin d'animation. Ne peut être utilisé que dans un Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedPositionedDirectional", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【top】 : Distance du haut du parent 【double】", + "【end】 : Distance de la droite du parent 【double】", + "【start】 : Distance de la gauche du parent 【double】", + "【bottom】 : Distance du bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json new file mode 100644 index 00000000..c435d24c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animazione di posizionamento direzionale", + "info": "Consente ai componenti figli di eseguire un'animazione PositionedDirectional (posizionamento direzionale), con durata e curva specificabili, e un evento di fine animazione. Può essere utilizzato solo all'interno di uno Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【end】 : Distanza dal bordo destro del genitore 【double】", + "【start】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json new file mode 100644 index 00000000..f4ccfa9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "方向定位アニメーション", + "info": "子コンポーネントをPositionedDirectional(方向定位)アニメーションさせることができ、時間と曲線を指定でき、アニメーション終了イベントがあります。Stack内でのみ使用できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【top】 : 親の上端までの距離 【double】", + "【end】 : 親の右端までの距離 【double】", + "【start】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json new file mode 100644 index 00000000..7fb29376 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "방향 위치 애니메이션", + "info": "자식 구성 요소를 PositionedDirectional(방향 위치) 애니메이션으로 만들 수 있으며, 지속 시간과 곡선을 지정할 수 있고, 애니메이션 종료 이벤트가 있습니다. Stack 내에서만 사용할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedPositionedDirectional 기본 사용", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【top】 : 부모 상단까지의 거리 【double】", + "【end】 : 부모 오른쪽까지의 거리 【double】", + "【start】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json new file mode 100644 index 00000000..2bc583d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Animação de Posicionamento Direcional", + "info": "Permite que os componentes filhos realizem animações de PositionedDirectional (Posicionamento Direcional), podendo especificar a duração e a curva, com eventos de término da animação. Só pode ser usado dentro de uma Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AnimatedPositionedDirectional", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【top】 : Distância até o topo do pai 【double】", + "【end】 : Distância até a direita do pai 【double】", + "【start】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json new file mode 100644 index 00000000..e68ad622 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedPositionedDirectional/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 122, + "name": "AnimatedPositionedDirectional", + "localName": "Анимация направленного позиционирования", + "info": "Позволяет дочерним компонентам выполнять анимацию PositionedDirectional (направленное позиционирование), можно указать продолжительность и кривую, есть событие окончания анимации. Может использоваться только внутри Stack.", + "lever": 3, + "family": 1, + "linkIds": [ + 121, + 159 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedPositionedDirectional", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов окончания анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【top】 : Расстояние до верха родителя 【double】", + "【end】 : Расстояние до правой стороны родителя 【double】", + "【start】 : Расстояние до левой стороны родителя 【double】", + "【bottom】 : Расстояние до низа родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json new file mode 100644 index 00000000..31511c6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Rotationsanimation", + "info": "Wenn sich die gegebene Rotationsmenge ändert, kann die Unterkomponente automatisch den relativen Rotationswert anpassen, und es gibt eine animierte Änderung zwischen den vorherigen und nachfolgenden Werten.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Rotationsanimationseffekt", + "desc": [ + "In diesem Beispiel wird der Parameter turns durch Ziehen angepasst, um den animierten Bewegungseffekt zu sehen. Der Rotationswinkel beträgt: turns*2*pi", + "【child】 : Kinderkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Animationsende 【Function()】", + "【alignment】 : Zentrum der Animationstransformation 【Alignment】", + "【curve】 : Animationskurve 【Duration】", + "【filterQuality】 : Filterqualität 【FilterQuality】", + "【turns】 : Rotationsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json new file mode 100644 index 00000000..f11797f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Rotation Animation", + "info": "When the given rotation amount changes, the child component can automatically adjust relative to the rotation value, and there is an animated transition between the previous and new values.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Rotation Animation Effect", + "desc": [ + "In this case, drag to adjust the turns parameter to see the animation effect. The rotation angle is: turns*2*pi", + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【alignment】: Animation transformation center 【Alignment】", + "【curve】: Animation curve 【Duration】", + "【filterQuality】: Filter quality 【FilterQuality】", + "【turns】: Rotation amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json new file mode 100644 index 00000000..15e01c40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animación de rotación", + "info": "Cuando cambia la cantidad de rotación dada, el componente hijo puede ajustarse automáticamente en relación con el valor de rotación, y hay un cambio animado entre los valores anteriores y posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de rotación", + "desc": [ + "En este caso, arrastra para ajustar el parámetro turns y observa el efecto de movimiento de la animación. El ángulo de rotación es: turns*2*pi", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Callback al finalizar la animación 【Function()】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【curve】 : Curva de la animación 【Duration】", + "【filterQuality】 : Calidad del filtro 【FilterQuality】", + "【turns】 : Cantidad de rotación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json new file mode 100644 index 00000000..970fae79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animation de rotation", + "info": "Lorsque la quantité de rotation donnée change, le composant enfant peut s'ajuster automatiquement par rapport à la valeur de rotation, avec une animation entre les valeurs précédentes et suivantes.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de rotation", + "desc": [ + "Dans cet exemple, faites glisser pour ajuster le paramètre turns et observez l'effet de l'animation. L'angle de rotation est : turns*2*pi", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel à la fin de l'animation 【Function()】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【curve】 : Courbe de l'animation 【Duration】", + "【filterQuality】 : Qualité du filtre 【FilterQuality】", + "【turns】 : Quantité de rotation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json new file mode 100644 index 00000000..5fdc7385 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animazione di rotazione", + "info": "Quando la quantità di rotazione specificata cambia, il componente figlio può regolarsi automaticamente rispetto al valore di rotazione, con un'animazione che mostra la transizione tra i valori precedenti e successivi.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di animazione di rotazione", + "desc": [ + "In questo esempio, trascina per regolare il parametro turns e osserva l'effetto dell'animazione. L'angolo di rotazione è: turns*2*pi", + "【child】 : componente figlio 【Widget】", + "【duration】 : durata dell'animazione 【Duration】", + "【onEnd】 : callback alla fine dell'animazione 【Function()】", + "【alignment】 : centro di trasformazione dell'animazione 【Alignment】", + "【curve】 : curva dell'animazione 【Duration】", + "【filterQuality】 : qualità del filtro 【FilterQuality】", + "【turns】 : quantità di rotazione 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json new file mode 100644 index 00000000..1e813b8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "回転アニメーション", + "info": "指定された回転量が変化した場合、子コンポーネントは回転値に応じて自動的に調整され、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "回転アニメーション効果", + "desc": [ + "このケースでは、turns パラメータをドラッグして調整し、アニメーションの動きを確認します。回転角度は: turns*2*pi", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【alignment】 : アニメーションの変換中心 【Alignment】", + "【curve】 : アニメーション曲線 【Duration】", + "【filterQuality】 : フィルター品質 【FilterQuality】", + "【turns】 : 回転量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json new file mode 100644 index 00000000..4f3ac69c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "회전 애니메이션", + "info": "주어진 회전량이 변경될 때, 자식 구성 요소가 회전 값에 따라 자동으로 조정되며, 이전 값과 이후 값 사이에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "회전 애니메이션 효과", + "desc": [ + "이 예제에서는 turns 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인합니다. 회전 각도는: turns*2*pi", + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【filterQuality】 : 필터 품질 【FilterQuality】", + "【turns】 : 회전량 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json new file mode 100644 index 00000000..10bc8835 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Animação de Rotação", + "info": "Quando a quantidade de rotação dada muda, o componente filho pode ajustar automaticamente o valor relativo à rotação, e há uma animação entre os valores anteriores e posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Rotação", + "desc": [ + "Neste exemplo, arraste para ajustar o parâmetro turns e observe o efeito da animação. O ângulo de rotação é: turns*2*pi", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【curve】 : Curva da animação 【Duration】", + "【filterQuality】 : Qualidade do filtro 【FilterQuality】", + "【turns】 : Quantidade de rotação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json new file mode 100644 index 00000000..78487046 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedRotation/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 259, + "name": "AnimatedRotation", + "localName": "Анимация вращения", + "info": "Когда заданное количество вращения изменяется, дочерний компонент может автоматически настраиваться относительно значения вращения, и есть анимационные изменения между предыдущим и текущим значениями.", + "lever": 3, + "family": 1, + "linkIds": [ + 247, + 249 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации вращения", + "desc": [ + "В этом примере, перетащите для регулировки параметра turns, чтобы увидеть эффект анимации. Угол вращения: turns*2*pi", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【alignment】 : Центр преобразования анимации 【Alignment】", + "【curve】 : Кривая анимации 【Duration】", + "【filterQuality】 : Качество фильтра 【FilterQuality】", + "【turns】 : Количество вращения 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json new file mode 100644 index 00000000..1d2dc66d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Skalierungsanimation", + "info": "Wenn sich die gegebene Skalierung ändert, kann die Unterkomponente automatisch relativ zum Skalierungswert angepasst werden, und die vorherigen und nachfolgenden Werte haben eine animierte Änderung.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Skalierungsanimationseffekt", + "desc": [ + "In diesem Beispiel ziehen Sie den scale-Parameter, um den Animationsbewegungseffekt zu sehen.", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf beim Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【alignment】 : Animationszentrum 【Alignment】", + "【filterQuality】 : Filterqualität 【FilterQuality】", + "【scale】 : Skalierungsmenge 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json new file mode 100644 index 00000000..7bacac75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Scaling Animation", + "info": "When the given scaling amount changes, the child component can automatically adjust relative to the scaling value, and there is an animation change between the previous and next values.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Scaling Animation Effect", + "desc": [ + "In this case, drag to adjust the scale parameter to view the animation effect.", + "【child】: Child component 【Widget】", + "【duration】: Animation duration 【Duration】", + "【onEnd】: Animation end callback 【Function()】", + "【curve】: Animation curve 【Duration】", + "【alignment】: Animation transformation center 【Alignment】", + "【filterQuality】: Filter quality 【FilterQuality】", + "【scale】: Scaling amount 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json new file mode 100644 index 00000000..ccab272e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animación de escala", + "info": "Cuando cambia la cantidad de escala dada, el componente hijo puede ajustarse automáticamente en relación con el valor de escala, y hay una animación entre los valores anteriores y posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de escala", + "desc": [ + "En este caso, arrastre para ajustar el parámetro scale y observe el efecto de movimiento de la animación.", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【alignment】 : Centro de transformación de la animación 【Alignment】", + "【filterQuality】 : Calidad del filtro 【FilterQuality】", + "【scale】 : Cantidad de escala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json new file mode 100644 index 00000000..f5116c21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animation de mise à l'échelle", + "info": "Lorsque la quantité de mise à l'échelle donnée change, le composant enfant peut s'ajuster automatiquement par rapport à la valeur de mise à l'échelle, et les valeurs avant et après ont une animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de mise à l'échelle", + "desc": [ + "Dans ce cas, faites glisser pour ajuster le paramètre scale et observez l'effet de l'animation.", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【alignment】 : Centre de transformation de l'animation 【Alignment】", + "【filterQuality】 : Qualité du filtre 【FilterQuality】", + "【scale】 : Quantité de mise à l'échelle 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json new file mode 100644 index 00000000..43bd1950 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animazione di Scala", + "info": "Quando la quantità di scala data cambia, il componente figlio può regolarsi automaticamente rispetto al valore di scala, con un'animazione tra i valori precedenti e successivi.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto di Animazione di Scala", + "desc": [ + "In questo caso, trascina per regolare il parametro scale e osserva l'effetto di movimento dell'animazione.", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback alla fine dell'animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【alignment】 : Centro di trasformazione dell'animazione 【Alignment】", + "【filterQuality】 : Qualità del filtro 【FilterQuality】", + "【scale】 : Quantità di scala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json new file mode 100644 index 00000000..99a8ee38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "スケーリングアニメーション", + "info": "指定されたスケーリング量が変化すると、子コンポーネントは自動的にスケーリング値に応じて調整され、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "スケーリングアニメーション効果", + "desc": [ + "このケースでは、scaleパラメータをドラッグして調整し、アニメーションの動き効果を確認します。", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの持続時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【alignment】 : アニメーションの変形中心 【Alignment】", + "【filterQuality】 : フィルター品質 【FilterQuality】", + "【scale】 : スケーリング量 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json new file mode 100644 index 00000000..c18e6510 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "스케일 애니메이션", + "info": "주어진 스케일 양이 변경될 때, 자식 구성 요소가 스케일 값에 따라 자동으로 조정되며, 이전 값과 이후 값 간에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "스케일 애니메이션 효과", + "desc": [ + "이 예제에서는 scale 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인합니다.", + "【child】 : 자식 구성 요소 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【alignment】 : 애니메이션 변환 중심 【Alignment】", + "【filterQuality】 : 필터 품질 【FilterQuality】", + "【scale】 : 스케일 양 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json new file mode 100644 index 00000000..3d30020a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Animação de Escala", + "info": "Quando a quantidade de escala fornecida muda, o componente filho pode ajustar automaticamente em relação ao valor de escala, e há uma animação entre os valores anteriores e posteriores.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Escala", + "desc": [ + "Neste exemplo, arraste para ajustar o parâmetro de escala e observe o efeito da animação.", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【alignment】 : Centro de transformação da animação 【Alignment】", + "【filterQuality】 : Qualidade do filtro 【FilterQuality】", + "【scale】 : Quantidade de escala 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json new file mode 100644 index 00000000..fe5c1558 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedScale/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 249, + "name": "AnimatedScale", + "localName": "Анимация масштабирования", + "info": "Когда заданный масштаб изменяется, дочерний компонент может автоматически регулироваться относительно значения масштабирования, и значения до и после имеют анимационные изменения.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 247, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации масштабирования", + "desc": [ + "В этом примере перетащите для настройки параметра scale и посмотрите эффект анимации.", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по окончании анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【alignment】 : Центр преобразования анимации 【Alignment】", + "【filterQuality】 : Качество фильтра 【FilterQuality】", + "【scale】 : Масштаб 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json new file mode 100644 index 00000000..5d979ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Gleitende Animation", + "info": "Wenn sich der gegebene Versatz ändert, kann die Unterkomponente den relativen Versatz automatisch anpassen, und die vorherigen und nachfolgenden Werte haben eine animierte Veränderung.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Gleitende Animationseffekt", + "desc": [ + "In diesem Fall ziehen Sie die x,y-Parameter, um den Animationseffekt zu sehen. Dabei ist der Versatz = x,y * Breite und Höhe des Rahmens", + "【child】 : Kindkomponente 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf beim Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【offset】 : Versatz 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json new file mode 100644 index 00000000..bac59c4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Slide Animation", + "info": "When the given offset changes, the child component can automatically adjust the relative offset, and there is an animated change between the previous and current values.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Slide Animation Effect", + "desc": [ + "In this case, drag to adjust the x, y parameters to view the animation effect. The offset = x, y * the width and height of the box.", + "【child】: child component 【Widget】", + "【duration】: animation duration 【Duration】", + "【onEnd】: animation end callback 【Function()】", + "【curve】: animation curve 【Duration】", + "【offset】: offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json new file mode 100644 index 00000000..70971c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animación de deslizamiento", + "info": "Cuando el desplazamiento dado cambia, los componentes hijos pueden ajustar automáticamente el desplazamiento relativo, y los valores anteriores y posteriores tienen una animación de cambio.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efecto de animación de deslizamiento", + "desc": [ + "En este caso, arrastre para ajustar los parámetros x, y y observe el efecto de movimiento de la animación. Donde el desplazamiento = x, y * ancho y alto del cuadro", + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al final de la animación 【Function()】", + "【curve】 : Curva de animación 【Duration】", + "【offset】 : Desplazamiento 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json new file mode 100644 index 00000000..30064c4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animation de glissement", + "info": "Lorsque l'offset donné change, le composant enfant peut ajuster automatiquement l'offset relatif, et les valeurs avant et après ont une animation.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effet d'animation de glissement", + "desc": [ + "Dans ce cas, faites glisser pour ajuster les paramètres x, y et observez l'effet de l'animation. Où l'offset = x, y * largeur et hauteur de la boîte", + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe d'animation 【Duration】", + "【offset】 : Offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json new file mode 100644 index 00000000..1b46a47b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animazione di scorrimento", + "info": "Quando l'offset dato cambia, i componenti figli possono regolare automaticamente l'offset relativo e i valori precedenti e successivi hanno un'animazione.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Effetto animazione di scorrimento", + "desc": [ + "In questo caso, trascina per regolare i parametri x,y e osserva l'effetto di movimento dell'animazione. Dove offset = x,y * larghezza e altezza del riquadro", + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【offset】 : Offset 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json new file mode 100644 index 00000000..c70d021a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "スライドアニメーション", + "info": "指定されたオフセットが変化するとき、子コンポーネントは自動的に相対的なオフセットを調整し、前後の値にアニメーションの変化があります。", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "スライドアニメーション効果", + "desc": [ + "このケースでは、x、yパラメータをドラッグして調整し、アニメーションの動き効果を確認します。オフセット = x、y * ボックスの幅と高さ", + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーションの時間 【Duration】", + "【onEnd】 : アニメーション終了時のコールバック 【Function()】", + "【curve】 : アニメーションカーブ 【Duration】", + "【offset】 : オフセット 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json new file mode 100644 index 00000000..ae881562 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "슬라이드 애니메이션", + "info": "주어진 오프셋이 변경될 때, 자식 컴포넌트가 자동으로 상대 오프셋을 조정할 수 있으며, 이전과 이후 값에 애니메이션 변화가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "슬라이드 애니메이션 효과", + "desc": [ + "이 예제에서 x, y 매개변수를 드래그하여 조정하고 애니메이션 효과를 확인하세요. 여기서 오프셋 = x, y * 상자 너비 및 높이", + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【offset】 : 오프셋 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json new file mode 100644 index 00000000..728d47cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Animação de Deslize", + "info": "Quando o deslocamento fornecido muda, o componente filho pode ajustar automaticamente o deslocamento relativo, e os valores anteriores e posteriores têm uma mudança animada.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Efeito de Animação de Deslize", + "desc": [ + "Neste caso, arraste para ajustar os parâmetros x, y e observe o efeito do movimento da animação. Onde o deslocamento = x, y * largura e altura da caixa", + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de fim de animação 【Function()】", + "【curve】 : Curva de animação 【Duration】", + "【offset】 : Deslocamento 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json new file mode 100644 index 00000000..102c86d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSlide/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 247, + "name": "AnimatedSlide", + "localName": "Анимация скольжения", + "info": "Когда заданное смещение изменяется, дочерний компонент может автоматически регулировать относительное смещение, и значения до и после имеют анимационные изменения.", + "lever": 3, + "family": 1, + "linkIds": [ + 120, + 201 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Эффект анимации скольжения", + "desc": [ + "В этом примере перетащите параметры x, y, чтобы увидеть эффект анимации. Смещение = x, y * ширина и высота рамки", + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Длительность анимации 【Duration】", + "【onEnd】 : Обратный вызов по завершении анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【offset】 : Смещение 【Offset】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json new file mode 100644 index 00000000..11a1f9c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Animierter Wechsel", + "info": "Führt eine Animation aus, wenn sich das Kind-Widget ändert. Der Schlüssel des Kind-Widgets muss angegeben werden. Die Animationsart kann angepasst werden, und Eigenschaften wie Animationsdauer und Animationskurve können festgelegt werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedSwitcher", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【duration】 : Animationsdauer 【Duration】", + "【switchOutCurve】 : Ausblendkurve 【Curves】", + "【switchInCurve】 : Einblendkurve 【Curves】", + "【switchInCurve】 : Einblendkurve 【Curves】", + "【transitionBuilder】 : Animationsgenerator 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json new file mode 100644 index 00000000..1efd5c64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Animated Switcher", + "info": "Executes animations when child components change. The key of the child components needs to be specified for identification. The animation method can be customized, and properties such as animation duration and animation curve can be specified.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedSwitcher", + "desc": [ + "【child】 : Child component 【Widget】", + "【duration】 : Animation duration 【Duration】", + "【switchOutCurve】 : Switch out curve 【Curves】", + "【switchInCurve】 : Switch in curve 【Curves】", + "【switchInCurve】 : Switch in curve 【Curves】", + "【transitionBuilder】 : Animation builder 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json new file mode 100644 index 00000000..e6686707 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Cambio animado", + "info": "Ejecuta una animación cuando cambia el componente hijo, es necesario especificar la clave del componente hijo para identificarlo. La forma de la animación se puede personalizar, se pueden especificar propiedades como la duración de la animación, la curva de la animación, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedSwitcher", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【duration】 : Duración de la animación 【Duration】", + "【switchOutCurve】 : Curva de salida 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【transitionBuilder】 : Constructor de animación 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json new file mode 100644 index 00000000..b7002d43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Changement animé", + "info": "Exécute une animation lorsque les composants enfants changent, nécessite de spécifier une clé pour identifier les composants enfants. Le style d'animation peut être personnalisé, permettant de spécifier la durée de l'animation, la courbe d'animation, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AnimatedSwitcher", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【duration】 : Durée de l'animation 【Duration】", + "【switchOutCurve】 : Courbe de sortie 【Curves】", + "【switchInCurve】 : Courbe d'entrée 【Curves】", + "【switchInCurve】 : Courbe d'entrée 【Curves】", + "【transitionBuilder】 : Constructeur d'animation 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json new file mode 100644 index 00000000..f82759ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Cambio Animato", + "info": "Esegue un'animazione quando il componente figlio cambia, è necessario specificare la chiave del componente figlio per l'identificazione. Il metodo di animazione può essere personalizzato, è possibile specificare la durata dell'animazione, la curva dell'animazione e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedSwitcher", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【duration】 : Durata dell'animazione 【Duration】", + "【switchOutCurve】 : Curva di uscita 【Curves】", + "【switchInCurve】 : Curva di ingresso 【Curves】", + "【switchInCurve】 : Curva di ingresso 【Curves】", + "【transitionBuilder】 : Costruttore di animazione 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json new file mode 100644 index 00000000..343dac5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "アニメーション切り替え", + "info": "子コンポーネントが変更されたときにアニメーションを実行します。子コンポーネントのkeyを指定して識別する必要があります。アニメーションの方法はカスタマイズ可能で、アニメーションの時間やアニメーションカーブなどの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcherの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【duration】 : アニメーション時間 【Duration】", + "【switchOutCurve】 : 切り出しカーブ 【Curves】", + "【switchInCurve】 : 切り込みカーブ 【Curves】", + "【switchInCurve】 : 切り込みカーブ 【Curves】", + "【transitionBuilder】 : アニメーションビルダー 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json new file mode 100644 index 00000000..127b5bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "애니메이션 전환", + "info": "자식 컴포넌트가 변경될 때 애니메이션을 실행하며, 자식 컴포넌트의 key를 지정하여 식별해야 합니다. 애니메이션 방식은 사용자 정의가 가능하며, 애니메이션 지속 시간, 애니메이션 곡선 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedSwitcher 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【switchOutCurve】 : 전환 아웃 곡선 【Curves】", + "【switchInCurve】 : 전환 인 곡선 【Curves】", + "【switchInCurve】 : 전환 인 곡선 【Curves】", + "【transitionBuilder】 : 애니메이션 빌더 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json new file mode 100644 index 00000000..bcb3ab6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Alternância Animada", + "info": "Executa uma animação quando o componente filho muda, é necessário especificar a chave do componente filho para identificação. O modo de animação pode ser personalizado, podendo especificar a duração da animação, a curva da animação, entre outros atributos.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedSwitcher", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【duration】 : Duração da animação 【Duration】", + "【switchOutCurve】 : Curva de saída 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【switchInCurve】 : Curva de entrada 【Curves】", + "【transitionBuilder】 : Construtor de animação 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json new file mode 100644 index 00000000..8b2cf9cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedSwitcher/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 116, + "name": "AnimatedSwitcher", + "localName": "Анимированный переключатель", + "info": "Выполняет анимацию при изменении дочернего компонента, необходимо указать ключ дочернего компонента для идентификации. Способ анимации может быть настроен, можно указать продолжительность анимации, кривую анимации и другие свойства.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedSwitcher", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【duration】 : Продолжительность анимации 【Duration】", + "【switchOutCurve】 : Кривая выхода 【Curves】", + "【switchInCurve】 : Кривая входа 【Curves】", + "【switchInCurve】 : Кривая входа 【Curves】", + "【transitionBuilder】 : Конструктор анимации 【Widget Function(Widget, Animation)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json new file mode 100644 index 00000000..3800fd0a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Animiertes Thema", + "info": "Eine Komponente mit animierten Effekten bei Themenänderungen, im Wesentlichen eine Kombination aus der Theme-Komponente und Animationen. Kann ThemeData, Animationsdauer, Kurve, Endrückruf usw. angeben. Entspricht einer erweiterten Version der Theme-Komponente.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedTheme", + "desc": [ + "【data】 : Themen-Daten 【ThemeData】", + "【duration】 : Animationsdauer 【Duration】", + "【onEnd】 : Rückruf bei Ende der Animation 【Function()】", + "【curve】 : Animationskurve 【Duration】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json new file mode 100644 index 00000000..922c7eec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Animated Theme", + "info": "A component with animation effects when the theme changes, essentially a combination of the Theme component and animation. You can specify ThemeData, animation duration, curve, end callback, etc. It is equivalent to an enhanced version of the Theme component.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedTheme", + "desc": [ + "【data】 : Theme data 【ThemeData】", + "【duration】 : Animation duration 【Duration】", + "【onEnd】 : Animation end callback 【Function()】", + "【curve】 : Animation curve 【Duration】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json new file mode 100644 index 00000000..75c8c2b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animado", + "info": "Componente con efectos de animación cuando cambia el tema, esencialmente es una combinación del componente Theme y animaciones. Se puede especificar ThemeData, duración de la animación, curva, devolución de llamada al finalizar, etc. Equivale a una versión mejorada del componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedTheme", + "desc": [ + "【data】 : Datos del tema 【ThemeData】", + "【duration】 : Duración de la animación 【Duration】", + "【onEnd】 : Devolución de llamada al finalizar la animación 【Function()】", + "【curve】 : Curva de la animación 【Duration】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json new file mode 100644 index 00000000..f0926763 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Thème animé", + "info": "Un composant avec des effets d'animation lors du changement de thème, essentiellement une combinaison du composant Theme et d'animations. Peut spécifier ThemeData, la durée de l'animation, la courbe, le rappel de fin, etc. Équivalent à une version améliorée du composant Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedTheme", + "desc": [ + "【data】 : Données du thème 【ThemeData】", + "【duration】 : Durée de l'animation 【Duration】", + "【onEnd】 : Rappel de fin d'animation 【Function()】", + "【curve】 : Courbe de l'animation 【Duration】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json new file mode 100644 index 00000000..ec4dc6e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animato", + "info": "Componente con effetti animati quando il tema cambia, essenzialmente una combinazione del componente Theme e delle animazioni. È possibile specificare ThemeData, durata dell'animazione, curva, callback di fine, ecc. Equivale a una versione potenziata del componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedTheme", + "desc": [ + "【data】 : Dati del tema 【ThemeData】", + "【duration】 : Durata dell'animazione 【Duration】", + "【onEnd】 : Callback di fine animazione 【Function()】", + "【curve】 : Curva dell'animazione 【Duration】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json new file mode 100644 index 00000000..35034028 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "アニメーションテーマ", + "info": "テーマ変更時にアニメーション効果を持つコンポーネントで、本質的にはThemeコンポーネントとアニメーションを組み合わせたものです。ThemeData、アニメーション時間、曲線、終了コールバックなどを指定できます。強化版のThemeコンポーネントと言えます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedThemeの基本使用", + "desc": [ + "【data】 : テーマデータ 【ThemeData】", + "【duration】 : アニメーション時間 【Duration】", + "【onEnd】 : アニメーション終了コールバック 【Function()】", + "【curve】 : アニメーション曲線 【Duration】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json new file mode 100644 index 00000000..8081edd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "애니메이션 테마", + "info": "테마 변경 시 애니메이션 효과가 있는 컴포넌트로, 본질적으로 Theme 컴포넌트와 애니메이션의 결합물입니다. ThemeData, 애니메이션 지속 시간, 곡선, 종료 콜백 등을 지정할 수 있습니다. 강화된 버전의 Theme 컴포넌트에 해당합니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedTheme 기본 사용", + "desc": [ + "【data】 : 테마 데이터 【ThemeData】", + "【duration】 : 애니메이션 지속 시간 【Duration】", + "【onEnd】 : 애니메이션 종료 콜백 【Function()】", + "【curve】 : 애니메이션 곡선 【Duration】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json new file mode 100644 index 00000000..978ace02 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Tema Animado", + "info": "Componente com efeitos de animação durante a mudança de tema, essencialmente uma combinação do componente Theme com animação. Pode especificar ThemeData, duração da animação, curva, callback de término, etc. Equivalente a uma versão aprimorada do componente Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AnimatedTheme", + "desc": [ + "【data】 : Dados do tema 【ThemeData】", + "【duration】 : Duração da animação 【Duration】", + "【onEnd】 : Callback de término da animação 【Function()】", + "【curve】 : Curva da animação 【Duration】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json new file mode 100644 index 00000000..fb343373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AnimatedTheme/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 224, + "name": "AnimatedTheme", + "localName": "Анимированная тема", + "info": "Компонент с анимацией при изменении темы, по сути, является комбинацией компонента Theme и анимации. Можно указать ThemeData, продолжительность анимации, кривую, обратный вызов завершения и т.д. Это улучшенная версия компонента Theme.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedTheme", + "desc": [ + "【data】 : Данные темы 【ThemeData】", + "【duration】 : Продолжительность анимации 【Duration】", + "【onEnd】 : Обратный вызов завершения анимации 【Function()】", + "【curve】 : Кривая анимации 【Duration】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json new file mode 100644 index 00000000..cf8888cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Anwendungsleiste", + "info": "Eine allgemeine Struktur für die obere Leiste einer Anwendung, in der entsprechende Komponenten an bestimmten Stellen platziert werden können. Wird häufig in Scaffold-Komponenten verwendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AppBar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【title】 : Mittlere Komponente 【Widget】", + "【actions】 : Rechte Komponente 【List】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【backgroundColor】 : Hintergrundfarbe 【Hintergrundfarbe】", + "【centerTitle】 : Zentrierung in der Mitte 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Verwendung von AppBar mit TabBar und TabBarView", + "desc": [ + "【bottom】 : Untere Komponente 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json new file mode 100644 index 00000000..0a73cc16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "App Header", + "info": "A common structure for the top bar of an application, where corresponding components can be placed in specified areas, often used in the Scaffold component.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AppBar", + "desc": [ + "【leading】 : Left component 【Widget】", + "【title】 : Middle component 【Widget】", + "【actions】 : Right component 【List】", + "【elevation】 : Shadow depth 【double】", + "【shape】 : Shape 【ShapeBorder】", + "【backgroundColor】 : Background color 【Color】", + "【centerTitle】 : Whether the title is centered 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Using AppBar with TabBar and TabBarView", + "desc": [ + "【bottom】 : Bottom component 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json new file mode 100644 index 00000000..b055e3b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra de aplicación", + "info": "Una estructura común para la barra superior de una aplicación, que permite colocar componentes correspondientes en áreas específicas, comúnmente utilizada en el componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AppBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【title】 : Componente central 【Widget】", + "【actions】 : Componente derecho 【List】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Profundidad de sombra 【Color de fondo】", + "【centerTitle】 : Centrar el título 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso combinado de AppBar con TabBar y TabBarView", + "desc": [ + "【bottom】 : Componente inferior 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json new file mode 100644 index 00000000..99b7c29c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barre d'application", + "info": "Une structure commune pour une barre en haut de l'application, où des composants peuvent être placés dans des zones spécifiées, souvent utilisée dans le composant Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de l'AppBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【title】 : Composant central 【Widget】", + "【actions】 : Composant droit 【List】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【backgroundColor】 : Profondeur de l'ombre 【Couleur de fond】", + "【centerTitle】 : Centrage du titre 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Utilisation combinée de l'AppBar avec TabBar et TabBarView", + "desc": [ + "【bottom】 : Composant inférieur 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json new file mode 100644 index 00000000..67ffa34d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra dell'applicazione", + "info": "Una struttura comune per la barra superiore di un'applicazione, che consente di posizionare componenti specifici in aree designate, spesso utilizzata nel componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AppBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【title】 : Componente centrale 【Widget】", + "【actions】 : Componente destro 【List】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Colore di sfondo 【Colore】", + "【centerTitle】 : Centratura del titolo 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso combinato di AppBar con TabBar e TabBarView", + "desc": [ + "【bottom】 : Componente inferiore 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json new file mode 100644 index 00000000..55bc8d2a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "アプリケーションバー", + "info": "アプリの上部バーの一般的な構造で、指定された部分に適切なコンポーネントを配置できます。Scaffoldコンポーネントでよく使用されます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBarの基本使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【title】 : 中央コンポーネント 【Widget】", + "【actions】 : 右側コンポーネント 【List】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【backgroundColor】 : 背景色 【背景色】", + "【centerTitle】 : 中央を中央揃えにするか 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBarとTabBar、TabBarViewの連携使用", + "desc": [ + "【bottom】 : 下部コンポーネント 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json new file mode 100644 index 00000000..09bbd0c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "앱 상단 바", + "info": "앱 상단 바의 일반적인 구조로, 지정된 위치에 해당 컴포넌트를 배치할 수 있으며, 주로 Scaffold 컴포넌트에서 사용됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AppBar 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【title】 : 중앙 컴포넌트 【Widget】", + "【actions】 : 오른쪽 컴포넌트 【List】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【backgroundColor】 : 배경색 【Color】", + "【centerTitle】 : 중앙 제목 정렬 여부 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "AppBar와 TabBar, TabBarView 함께 사용", + "desc": [ + "【bottom】 : 하단 컴포넌트 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json new file mode 100644 index 00000000..2f139cc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Barra de Aplicação", + "info": "Uma estrutura comum para a barra superior de uma aplicação, onde componentes correspondentes podem ser colocados em áreas específicas, frequentemente utilizada no componente Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AppBar", + "desc": [ + "【leading】 : Componente do lado esquerdo 【Widget】", + "【title】 : Componente do meio 【Widget】", + "【actions】 : Componente do lado direito 【List】", + "【elevation】 : Profundidade da sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【backgroundColor】 : Cor de fundo 【Cor de fundo】", + "【centerTitle】 : Centralizar no meio 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Uso do AppBar com TabBar e TabBarView", + "desc": [ + "【bottom】 : Componente inferior 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json new file mode 100644 index 00000000..b3d5c22a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AppBar/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 57, + "name": "AppBar", + "localName": "Верхняя панель приложения", + "info": "Общая структура верхней панели приложения, в которой можно разместить соответствующие компоненты в указанных местах, часто используется в компоненте Scaffold.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AppBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【title】 : Центральный компонент 【Widget】", + "【actions】 : Правый компонент 【List】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【backgroundColor】 : Цвет фона 【Цвет】", + "【centerTitle】 : Центрирование заголовка 【bool】" + ] + }, + { + "file": "node2_tab.dart", + "name": "Использование AppBar с TabBar и TabBarView", + "desc": [ + "【bottom】 : Нижний компонент 【PreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json new file mode 100644 index 00000000..926bc240 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Automatische Lebenserhaltung", + "info": "In einer Liste mit verzögerter Ladung ermöglicht es den Unterbäumen, den Zustand beizubehalten. Allein verwendet hat es keine Wirkung und muss in Verbindung mit KeepAliveNotification verwendet werden.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in AutomaticKeepAlive", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "In den Quellcodes von Listen- und Seitenwechselkomponenten wie ListView, SliverList, GridView, SliverGrid, PageView, TabBarView wird die AutomaticKeepAlive-Komponente verwendet. Um den Zustand eines States zu erhalten, kann AutomaticKeepAliveClientMixin verwendet werden, das eine einfache Kapselung der Verwendung von KeepAliveNotification darstellt. Dieses Beispiel zeigt die Zustandserhaltung der ListView-Einträge." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json new file mode 100644 index 00000000..721b09ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Automatic Keep Alive", + "info": "In lazy-loaded lists, allows subtrees to request to maintain state. It has no effect when used alone and needs to be used in conjunction with KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to AutomaticKeepAlive", + "desc": [ + "【child】: Child component 【Widget】", + "The AutomaticKeepAlive component is used in the source code of list and page-switching components such as ListView, SliverList, GridView, SliverGrid, PageView, and TabBarView. When keeping a State alive, you can use AutomaticKeepAliveClientMixin, which is a simple encapsulation of the use of KeepAliveNotification. This example demonstrates the state preservation of ListView items." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json new file mode 100644 index 00000000..ab29b9ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Mantenimiento automático", + "info": "En listas de carga perezosa, permite que los subárboles soliciten mantener el estado. No tiene efecto si se usa solo, debe usarse junto con KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a AutomaticKeepAlive", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "El componente AutomaticKeepAlive se utiliza en el código fuente de componentes de lista y cambio de página como ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, etc. Para mantener vivo un State, se puede usar AutomaticKeepAliveClientMixin, que es una encapsulación simple del uso de KeepAliveNotification. Este ejemplo muestra cómo mantener vivo el estado de un elemento en ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json new file mode 100644 index 00000000..e4380b34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Maintien automatique en vie", + "info": "Dans les listes chargées de manière paresseuse, permet aux sous-arbres de demander à maintenir leur état. Utilisé seul, il n'a aucun effet. Doit être utilisé avec KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à AutomaticKeepAlive", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Le composant AutomaticKeepAlive est utilisé dans les composants de liste et de pagination tels que ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, etc. Pour maintenir en vie un certain State, on peut utiliser AutomaticKeepAliveClientMixin, qui est un enrobage simplifié de l'utilisation de KeepAliveNotification. Cet exemple montre le maintien en vie de l'état des entrées de ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json new file mode 100644 index 00000000..8a34fd8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Mantenimento Automatico", + "info": "Nelle liste a caricamento lento, consente ai sottoalberi di richiedere il mantenimento dello stato. Non ha effetto se usato da solo, deve essere utilizzato insieme a KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a AutomaticKeepAlive", + "desc": [ + "【child】 : componente figlio 【Widget】", + "Nei componenti come ListView, SliverList, GridView, SliverGrid, PageView, TabBarView, il componente AutomaticKeepAlive è ampiamente utilizzato. Per mantenere attivo uno stato, è possibile utilizzare AutomaticKeepAliveClientMixin, che è un'implementazione semplificata dell'uso di KeepAliveNotification. Questo esempio mostra il mantenimento dello stato degli elementi in ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json new file mode 100644 index 00000000..ec58d18d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "自動キープアライブ", + "info": "遅延読み込みのリストで、サブツリーが状態を維持することを許可します。単独で使用しても効果はなく、KeepAliveNotification と併用する必要があります。", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "ListView、SliverList、GridView、SliverGrid、PageView、TabBarView などのリストやページ切り替えコンポーネントのソースコードでは、AutomaticKeepAlive コンポーネントが使用されています。特定の State をキープアライブする場合、AutomaticKeepAliveClientMixin を使用して操作できます。これは KeepAliveNotification を使用するための簡易なラッパーです。この例では、ListView の項目の状態をキープアライブする方法を示しています。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json new file mode 100644 index 00000000..a1b74b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "자동 생존 유지", + "info": "지연 로드 목록에서 하위 트리가 상태를 유지하도록 요청할 수 있으며, 단독으로 사용할 경우 효과가 없으며 KeepAliveNotification과 함께 사용해야 합니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AutomaticKeepAlive 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "ListView, SliverList, GridView, SliverGrid, PageView, TabBarView 등의 목록 및 페이지 전환 위젯 소스 코드에는 AutomaticKeepAlive 위젯이 사용됩니다. 특정 State를 생존 유지할 때 AutomaticKeepAliveClientMixin을 사용하여 작업할 수 있으며, 이는 KeepAliveNotification 사용을 간단하게 캡슐화한 것입니다. 이 예제는 ListView 항목의 상태 생존 유지를 보여줍니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json new file mode 100644 index 00000000..c234a4e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Manutenção automática", + "info": "Em listas de carregamento preguiçoso, permite que as subárvores solicitem a manutenção do estado. O uso isolado não tem efeito e deve ser usado em conjunto com o KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao AutomaticKeepAlive", + "desc": [ + "【child】 : componente filho 【Widget】", + "O componente AutomaticKeepAlive é utilizado em ListView, SliverList, GridView, SliverGrid, PageView, TabBarView e outros componentes de lista e de mudança de página. Para manter o estado de um State, pode-se usar o AutomaticKeepAliveClientMixin, que é um encapsulamento simplificado do uso do KeepAliveNotification. Este exemplo mostra a manutenção do estado de um item da ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json new file mode 100644 index 00000000..6b757e2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/AutomaticKeepAlive/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 239, + "name": "AutomaticKeepAlive", + "localName": "Автоматическое поддержание активности", + "info": "В лениво загружаемых списках позволяет поддеревьям запрашивать сохранение состояния. Само по себе не имеет эффекта, необходимо использовать вместе с KeepAliveNotification.", + "lever": 1, + "family": 1, + "linkIds": [ + 59, + 162, + 163, + 165, + 185, + 188 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в AutomaticKeepAlive", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Компонент AutomaticKeepAlive используется в исходном коде списков и страничных компонентов, таких как ListView, SliverList, GridView, SliverGrid, PageView, TabBarView и других. Для поддержания активности определенного State можно использовать AutomaticKeepAliveClientMixin, который представляет собой простую обертку для использования KeepAliveNotification. Этот пример демонстрирует поддержание состояния элементов ListView." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json new file mode 100644 index 00000000..5659293c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Untere Navigationsleiste", + "info": "Eine einbettbare untere Navigationsleiste, die normalerweise am unteren Ende des Scaffold-Widgets verwendet wird. Kann Eigenschaften wie Farbe, Schattentiefe, Form usw. angeben und kann mit PageView einen Seitenwechsel-Effekt erzielen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomAppBar", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【NotchedShape】", + "【notchMargin】 : Abstand 【double】", + "【color】 : Farbe 【Color】", + "【child】 : Kind 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json new file mode 100644 index 00000000..c4bb3f05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Bottom Navigation", + "info": "A recessed bottom navigation bar, typically used at the bottom of a Scaffold component, can specify properties such as color, elevation, shape, etc., and can achieve page-switching effects with PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomAppBar", + "desc": [ + "【elevation】: Elevation 【double】", + "【shape】: Shape 【NotchedShape】", + "【notchMargin】: Notch Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json new file mode 100644 index 00000000..ac76510d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra de navegación inferior", + "info": "Una barra de navegación inferior que se puede incrustar, generalmente se usa en la parte inferior del componente Scaffold, se pueden especificar propiedades como color, profundidad de sombra, forma, etc., y se puede implementar un efecto de cambio de página con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BottomAppBar", + "desc": [ + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【NotchedShape】", + "【notchMargin】 : Distancia de separación 【double】", + "【color】 : Color 【Color】", + "【child】 : Hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json new file mode 100644 index 00000000..bcfc5fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barre de navigation inférieure", + "info": "Une barre de navigation inférieure encastrable, généralement utilisée au bas du composant Scaffold, peut spécifier des propriétés telles que la couleur, la profondeur de l'ombre, la forme, etc., et peut réaliser un effet de changement de page avec PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomAppBar", + "desc": [ + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【NotchedShape】", + "【notchMargin】 : Distance d'intervalle 【double】", + "【color】 : Couleur 【Color】", + "【child】 : Enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json new file mode 100644 index 00000000..ccdb358b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra di navigazione inferiore", + "info": "Una barra di navigazione inferiore incassabile, solitamente utilizzata nella parte inferiore del componente Scaffold, può specificare proprietà come colore, profondità dell'ombra, forma, ecc., e può realizzare l'effetto di cambio pagina con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BottomAppBar", + "desc": [ + "【elevation】 : profondità dell'ombra 【double】", + "【shape】 : forma 【NotchedShape】", + "【notchMargin】 : distanza di intervallo 【double】", + "【color】 : colore 【Color】", + "【child】 : figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json new file mode 100644 index 00000000..de775395 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "ボトムナビゲーション", + "info": "凹型のボトムナビゲーションバーで、通常Scaffoldコンポーネントの下部に使用され、色、影の深さ、形状などの属性を指定できます。PageViewと組み合わせてページ切り替え効果を実現できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBarの基本使用法", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【NotchedShape】", + "【notchMargin】 : 間隔距離 【double】", + "【color】 : 色 【Color】", + "【child】 : 子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json new file mode 100644 index 00000000..c91f6fa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "하단 네비게이션", + "info": "들여쓰기 가능한 하단 네비게이션 바로, 일반적으로 Scaffold 컴포넌트의 하단에 사용되며, 색상, 그림자 깊이, 모양 등 속성을 지정할 수 있으며, PageView와 함께 페이지 전환 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomAppBar 기본 사용법", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【NotchedShape】", + "【notchMargin】 : 간격 거리 【double】", + "【color】 : 색상 【Color】", + "【child】 : 자식 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json new file mode 100644 index 00000000..33969f6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Barra de Navegação Inferior", + "info": "Uma barra de navegação inferior recortável, geralmente usada na parte inferior do componente Scaffold, pode especificar propriedades como cor, profundidade de sombra, forma, etc., e pode ser usada com PageView para implementar efeitos de mudança de página.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomAppBar", + "desc": [ + "【elevation】 : Profundidade de Sombra 【double】", + "【shape】 : Forma 【NotchedShape】", + "【notchMargin】 : Distância de Espaçamento 【double】", + "【color】 : Cor 【Color】", + "【child】 : Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json new file mode 100644 index 00000000..105a260a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomAppBar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 61, + "name": "BottomAppBar", + "localName": "Нижняя навигация", + "info": "Встраиваемая нижняя панель навигации, обычно используемая в нижней части компонента Scaffold, может быть указана с такими свойствами, как цвет, глубина тени, форма и может быть реализована с эффектом перелистывания страниц с помощью PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomAppBar", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【NotchedShape】", + "【notchMargin】 : Расстояние между элементами 【double】", + "【color】 : Цвет 【Color】", + "【child】 : Дочерний элемент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..768c2371 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Untere Navigationsleiste", + "info": "Eine untere Navigationsleiste, die normalerweise am unteren Rand des Scaffold-Widgets verwendet wird. Kann Farben und Modi angeben, akzeptiert Klick-Rückrufe und kann mit PageView Seiteneffekte erzielen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomNavigationBar", + "desc": [ + "【currentIndex】 : Aktueller Index 【int】", + "【elevation】 : Schattentiefe 【double】", + "【type】 : Typ*2 【BottomNavigationBarType】", + "【fixedColor】 : Farbe, wenn type fix ist 【Color】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【iconSize】 : Symbolgröße 【double】", + "【selectedLabelStyle】 : Stil des ausgewählten Textes 【TextStyle】", + "【unselectedLabelStyle】 : Stil des nicht ausgewählten Textes 【TextStyle】", + "【showUnselectedLabels】 : Nicht ausgewählte Labels anzeigen 【bool】", + "【showSelectedLabels】 : Ausgewählte Labels anzeigen 【bool】", + "【items】 : Elemente 【List】", + "【onTap】 : Klick-Ereignis 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Kann mit PageView für Seitenwechsel kombiniert werden", + "desc": [ + "Verwenden Sie den Controller beim onTap für den Seitenwechsel" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json new file mode 100644 index 00000000..1c7aba5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Bottom Navigation", + "info": "A bottom navigation bar, usually used at the bottom of the Scaffold component, can specify colors and modes, accepts click callbacks, and can achieve page switching effects with PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomNavigationBar", + "desc": [ + "【currentIndex】 : Current index 【int】", + "【elevation】 : Shadow depth 【double】", + "【type】 : Type*2 【BottomNavigationBarType】", + "【fixedColor】 : Color when type is fix 【Color】", + "【backgroundColor】 : Background color 【Color】", + "【iconSize】 : Icon size 【double】", + "【selectedLabelStyle】 : Selected text style 【TextStyle】", + "【unselectedLabelStyle】 : Unselected text style 【TextStyle】", + "【showUnselectedLabels】 : Show unselected labels 【bool】", + "【showSelectedLabels】 : Show selected labels 【bool】", + "【items】 : Items 【List】", + "【onTap】 : Click event 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Page Switching with PageView", + "desc": [ + "Use the controller for page switching during onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..18116112 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Barra de navegación inferior", + "info": "Una barra de navegación inferior, generalmente utilizada en la parte inferior del componente Scaffold, puede especificar colores y modos, acepta devoluciones de llamada de clics y puede lograr efectos de cambio de página con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de BottomNavigationBar", + "desc": [ + "【currentIndex】 : Índice actual 【int】", + "【elevation】 : Profundidad de sombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Color cuando el tipo es fix 【Color】", + "【backgroundColor】 : Color de fondo 【Color】", + "【iconSize】 : Tamaño del ícono 【double】", + "【selectedLabelStyle】 : Estilo del texto seleccionado 【TextStyle】", + "【unselectedLabelStyle】 : Estilo del texto no seleccionado 【TextStyle】", + "【showUnselectedLabels】 : Mostrar etiquetas no seleccionadas 【bool】", + "【showSelectedLabels】 : Mostrar etiquetas seleccionadas 【bool】", + "【items】 : Elementos 【List】", + "【onTap】 : Evento de clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Se puede combinar con PageView para cambiar de página", + "desc": [ + "Usar el controlador para cambiar de página durante onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..db97216b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Navigation inférieure", + "info": "Une barre de navigation inférieure, généralement utilisée au bas du composant Scaffold, peut spécifier la couleur et le mode, accepte un rappel de clic et peut réaliser un effet de changement de page avec PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomNavigationBar", + "desc": [ + "【currentIndex】 : Index actuel 【int】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【type】 : Type*2 【BottomNavigationBarType】", + "【fixedColor】 : Couleur lorsque le type est fixe 【Color】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【iconSize】 : Taille de l'icône 【double】", + "【selectedLabelStyle】 : Style du texte sélectionné 【TextStyle】", + "【unselectedLabelStyle】 : Style du texte non sélectionné 【TextStyle】", + "【showUnselectedLabels】 : Afficher les étiquettes non sélectionnées 【bool】", + "【showSelectedLabels】 : Afficher les étiquettes sélectionnées 【bool】", + "【items】 : Éléments 【List】", + "【onTap】 : Événement de clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Peut être combiné avec PageView pour changer de page", + "desc": [ + "Utiliser le contrôleur pour changer de page lors de onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..d7cc293f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Barra di navigazione inferiore", + "info": "Una barra di navigazione inferiore, solitamente utilizzata nella parte inferiore del componente Scaffold, può specificare colore e modalità, accetta callback di clic e può realizzare l'effetto di cambio pagina con PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di BottomNavigationBar", + "desc": [ + "【currentIndex】 : Indice corrente 【int】", + "【elevation】 : Profondità dell'ombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Colore quando il tipo è fix 【Color】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【selectedLabelStyle】 : Stile del testo selezionato 【TextStyle】", + "【unselectedLabelStyle】 : Stile del testo non selezionato 【TextStyle】", + "【showUnselectedLabels】 : Mostra etichette non selezionate 【bool】", + "【showSelectedLabels】 : Mostra etichette selezionate 【bool】", + "【items】 : Voci 【List】", + "【onTap】 : Evento di clic 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Può essere combinato con PageView per il cambio pagina", + "desc": [ + "Utilizza il controller per il cambio pagina durante onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..c9b5e946 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "ボトムナビゲーション", + "info": "ボトムナビゲーションバーは、通常Scaffoldコンポーネントの下部に使用され、色やモードを指定でき、クリックコールバックを受け取り、PageViewと組み合わせてページ切り替え効果を実現できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBarの基本使用", + "desc": [ + "【currentIndex】 : 現在のインデックス 【int】", + "【elevation】 : 影の深さ 【double】", + "【type】 : タイプ*2 【BottomNavigationBarType】", + "【fixedColor】 : typeがfixの場合の色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【iconSize】 : アイコンサイズ 【double】", + "【selectedLabelStyle】 : 選択されたテキストスタイル 【TextStyle】", + "【unselectedLabelStyle】 : 選択されていないテキストスタイル 【TextStyle】", + "【showUnselectedLabels】 : 選択されていないラベルを表示 【bool】", + "【showSelectedLabels】 : 選択されたラベルを表示 【bool】", + "【items】 : アイテム 【List】", + "【onTap】 : クリックイベント 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "PageViewと組み合わせてページ切り替え", + "desc": [ + "onTap時にコントローラーを使用してページ切り替えを行う" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..40574e58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "하단 네비게이션", + "info": "하단 네비게이션 바는 일반적으로 Scaffold 컴포넌트의 하단에 사용되며, 색상과 모드를 지정할 수 있고, 클릭 콜백을 받으며, PageView와 함께 페이지 전환 효과를 구현할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomNavigationBar 기본 사용", + "desc": [ + "【currentIndex】 : 현재 인덱스 【int】", + "【elevation】 : 그림자 깊이 【double】", + "【type】 : 타입*2 【BottomNavigationBarType】", + "【fixedColor】 : type이 fix일 때의 색상 【Color】", + "【backgroundColor】 : 배경색 【Color】", + "【iconSize】 : 아이콘 크기 【double】", + "【selectedLabelStyle】 : 선택된 텍스트 스타일 【TextStyle】", + "【unselectedLabelStyle】 : 선택되지 않은 텍스트 스타일 【TextStyle】", + "【showUnselectedLabels】 : 선택되지 않은 라벨 표시 【bool】", + "【showSelectedLabels】 : 선택된 라벨 표시 【bool】", + "【items】 : 항목 【List】", + "【onTap】 : 클릭 이벤트 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "PageView와 함께 페이지 전환", + "desc": [ + "onTap 시 컨트롤러를 사용하여 페이지 전환" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..5a815723 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Navegação Inferior", + "info": "Uma barra de navegação inferior, normalmente usada na parte inferior de um componente Scaffold, pode especificar cores e modos, aceita callbacks de clique e pode ser usada com PageView para efeitos de mudança de página.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomNavigationBar", + "desc": [ + "【currentIndex】 : Índice atual 【int】", + "【elevation】 : Profundidade da sombra 【double】", + "【type】 : Tipo*2 【BottomNavigationBarType】", + "【fixedColor】 : Cor quando o tipo é fixo 【Color】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【iconSize】 : Tamanho do ícone 【double】", + "【selectedLabelStyle】 : Estilo do texto selecionado 【TextStyle】", + "【unselectedLabelStyle】 : Estilo do texto não selecionado 【TextStyle】", + "【showUnselectedLabels】 : Mostrar etiquetas não selecionadas 【bool】", + "【showSelectedLabels】 : Mostrar etiquetas selecionadas 【bool】", + "【items】 : Itens 【List】", + "【onTap】 : Evento de clique 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Pode ser combinado com PageView para mudar de página", + "desc": [ + "Usar o controlador para mudar de página durante o onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..86f96093 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/BottomNavigationBar/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 60, + "name": "BottomNavigationBar", + "localName": "Нижняя навигация", + "info": "Нижняя панель навигации, обычно используется внизу компонента Scaffold, может задавать цвет и режим, принимает обратный вызов при нажатии, может реализовать эффект переключения страниц с PageView.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomNavigationBar", + "desc": [ + "【currentIndex】 : текущий индекс 【int】", + "【elevation】 : глубина тени 【double】", + "【type】 : тип*2 【BottomNavigationBarType】", + "【fixedColor】 : цвет для типа fix 【Color】", + "【backgroundColor】 : цвет фона 【Color】", + "【iconSize】 : размер иконки 【double】", + "【selectedLabelStyle】 : стиль выбранного текста 【TextStyle】", + "【unselectedLabelStyle】 : стиль невыбранного текста 【TextStyle】", + "【showUnselectedLabels】 : показывать невыбранные метки 【bool】", + "【showSelectedLabels】 : показывать выбранные метки 【bool】", + "【items】 : элементы 【List】", + "【onTap】 : событие нажатия 【Function(int)】" + ] + }, + { + "file": "node2_page.dart", + "name": "Можно использовать с PageView для переключения страниц", + "desc": [ + "Использовать контроллер для переключения страниц при onTap" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json new file mode 100644 index 00000000..05061a64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Karussellansicht", + "info": "Eine Karussell-Komponente, die den Material Design-Richtlinien entspricht. Zeigt eine scrollbare Liste von Elementen an, wobei jedes Element basierend auf dem ausgewählten Layout dynamisch angepasst werden kann.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CarouselView", + "desc": [ + "【itemExtent】 : Erzwungene Größe in der Hauptachse 【double】", + "【shrinkExtent】: Minimale Größe des Elements in der Hauptachse während des Scrollens 【double】", + "【scrollDirection】 : Scrollrichtung 【Axis?】", + "【children】: Liste der Unterkomponenten 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Stilkonfiguration von CarouselView", + "desc": [ + "【padding】 : Innenabstand 【EdgeInsets? 】", + "【backgroundColor】 : Hintergrundfarbe 【Color? 】", + "【elevation】 : Schattentiefe 【double?】", + "【shape】 : Form 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Umgekehrtes Scrollen 【bool】", + "【onTap】 : Klick-Ereignis 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json new file mode 100644 index 00000000..714743fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Carousel View", + "info": "A carousel component that conforms to Material Design specifications. Displays a scrollable list of items, each of which can dynamically resize based on the selected layout.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView Basic Usage", + "desc": [ + "【itemExtent】 : Forced size in the main axis direction 【double】", + "【shrinkExtent】: Minimum size of the item in the main axis direction during scrolling 【double】", + "【scrollDirection】 : Scroll axis direction 【Axis?】", + "【children】: List of child components 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView Style Configuration", + "desc": [ + "【padding】 : Padding 【EdgeInsets? 】", + "【backgroundColor】 : Background color 【Color? 】", + "【elevation】 : Shadow depth 【double?】", + "【shape】 : Shape 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【onTap】 : Click event 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json new file mode 100644 index 00000000..8d303b7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vista de Carrusel", + "info": "Un componente de carrusel que cumple con las especificaciones de Material Design. Muestra una lista de elementos desplazables, donde cada elemento puede ajustar dinámicamente su tamaño según el diseño seleccionado.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CarouselView", + "desc": [ + "【itemExtent】 : Tamaño forzado en la dirección del eje principal 【double】", + "【shrinkExtent】: Tamaño mínimo de los elementos en la dirección del eje principal durante el desplazamiento 【double】", + "【scrollDirection】 : Dirección del desplazamiento 【Axis?】", + "【children】: Lista de componentes hijos 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuración de estilo de CarouselView", + "desc": [ + "【padding】 : Relleno interno 【EdgeInsets? 】", + "【backgroundColor】 : Color de fondo 【Color? 】", + "【elevation】 : Profundidad de la sombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controlador 【CarouselController?】", + "【reverse】 : Desplazamiento inverso 【bool】", + "【onTap】 : Evento de clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json new file mode 100644 index 00000000..f780de40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vue Carrousel", + "info": "Un composant de carrousel conforme aux normes Material Design. Affiche une liste d'éléments défilables, chaque élément pouvant être redimensionné dynamiquement en fonction de la mise en page sélectionnée.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CarouselView", + "desc": [ + "【itemExtent】 : Taille forcée dans la direction de l'axe principal 【double】", + "【shrinkExtent】: Taille minimale des éléments dans la direction de l'axe principal pendant le défilement 【double】", + "【scrollDirection】 : Direction de défilement 【Axis?】", + "【children】: Liste des composants enfants 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuration du style de CarouselView", + "desc": [ + "【padding】 : Marge intérieure 【EdgeInsets? 】", + "【backgroundColor】 : Couleur de fond 【Color? 】", + "【elevation】 : Profondeur de l'ombre 【double?】", + "【shape】 : Forme 【ShapeBorder?】", + "【controller】 : Contrôleur 【CarouselController?】", + "【reverse】 : Défilement inversé 【bool】", + "【onTap】 : Événement de clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json new file mode 100644 index 00000000..554e0326 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Vista Carosello", + "info": "Un componente carosello conforme alle specifiche di Material Design. Visualizza un elenco di elementi scorrevoli, ciascuno dei quali può ridimensionarsi dinamicamente in base al layout selezionato.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CarouselView", + "desc": [ + "【itemExtent】 : Dimensione forzata nella direzione principale 【double】", + "【shrinkExtent】: Dimensione minima dell'elemento nella direzione principale durante lo scorrimento 【double】", + "【scrollDirection】 : Direzione di scorrimento 【Axis?】", + "【children】: Lista dei componenti figli 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configurazione dello stile di CarouselView", + "desc": [ + "【padding】 : Spaziatura interna 【EdgeInsets? 】", + "【backgroundColor】 : Colore di sfondo 【Color? 】", + "【elevation】 : Profondità dell'ombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controller 【CarouselController?】", + "【reverse】 : Scorrimento inverso 【bool】", + "【onTap】 : Evento di clic 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json new file mode 100644 index 00000000..12f3963b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "カルーセルビュー", + "info": "Material Design 仕様に準拠したカルーセルコンポーネント。スクロール可能な項目リストを表示し、各項目は選択されたレイアウトに基づいて動的にサイズを調整できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView 基本の使い方", + "desc": [ + "【itemExtent】 : 主軸方向の強制サイズ 【double】", + "【shrinkExtent】: スクロール中、主軸方向の項目の最小サイズ 【double】", + "【scrollDirection】 : スクロール軸方向 【Axis?】", + "【children】: 子コンポーネントリスト 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView スタイル設定", + "desc": [ + "【padding】 : パディング 【EdgeInsets? 】", + "【backgroundColor】 : 背景色 【Color? 】", + "【elevation】 : 影の深さ 【double?】", + "【shape】 : 形状 【ShapeBorder?】", + "【controller】 : コントローラー 【CarouselController?】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【onTap】 : クリックイベント 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json new file mode 100644 index 00000000..cb49905c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "캐러셀 뷰", + "info": "Material Design 규격에 부합하는 캐러셀 컴포넌트입니다. 스크롤 가능한 항목 목록을 표시하며, 각 항목은 선택된 레이아웃에 따라 동적으로 크기를 조정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CarouselView 기본 사용법", + "desc": [ + "【itemExtent】 : 주축 방향 강제 크기 【double】", + "【shrinkExtent】: 스크롤 중, 주축 방향 항목 최소 크기 【double】", + "【scrollDirection】 : 스크롤 방향 【Axis?】", + "【children】: 하위 컴포넌트 목록 【List】" + ] + }, + { + "file": "node2.dart", + "name": "CarouselView 스타일 설정", + "desc": [ + "【padding】 : 안쪽 여백 【EdgeInsets? 】", + "【backgroundColor】 : 배경색 【Color? 】", + "【elevation】 : 그림자 깊이 【double?】", + "【shape】 : 모양 【ShapeBorder?】", + "【controller】 : 컨트롤러 【CarouselController?】", + "【reverse】 : 역방향 스크롤 여부 【bool】", + "【onTap】 : 클릭 이벤트 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json new file mode 100644 index 00000000..23c1508e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Visualização de Carrossel", + "info": "Um componente de carrossel que segue as especificações do Material Design. Exibe uma lista de itens roláveis, onde cada item pode ser redimensionado dinamicamente com base no layout selecionado.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CarouselView", + "desc": [ + "【itemExtent】 : Tamanho fixo na direção do eixo principal 【double】", + "【shrinkExtent】: Tamanho mínimo do item na direção do eixo principal durante o deslize 【double】", + "【scrollDirection】 : Direção do deslize 【Axis?】", + "【children】: Lista de componentes filhos 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Configuração de Estilo do CarouselView", + "desc": [ + "【padding】 : Preenchimento interno 【EdgeInsets? 】", + "【backgroundColor】 : Cor de fundo 【Color? 】", + "【elevation】 : Profundidade da sombra 【double?】", + "【shape】 : Forma 【ShapeBorder?】", + "【controller】 : Controlador 【CarouselController?】", + "【reverse】 : Deslize reverso 【bool】", + "【onTap】 : Evento de clique 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json new file mode 100644 index 00000000..d42e0100 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CarouselView/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 237, + "name": "CarouselView", + "localName": "Карусель", + "info": "Карусельный компонент, соответствующий спецификациям Material Design. Отображает прокручиваемый список элементов, каждый из которых может динамически изменять размер в зависимости от выбранного макета.", + "lever": 4, + "family": 1, + "linkIds": [ + 253, + 340, + 160 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CarouselView", + "desc": [ + "【itemExtent】 : Фиксированный размер по главной оси 【double】", + "【shrinkExtent】: Минимальный размер элемента по главной оси при прокрутке 【double】", + "【scrollDirection】 : Направление прокрутки 【Axis?】", + "【children】: Список дочерних элементов 【List】" + ] + }, + { + "file": "node2.dart", + "name": "Настройка стиля CarouselView", + "desc": [ + "【padding】 : Внутренний отступ 【EdgeInsets? 】", + "【backgroundColor】 : Цвет фона 【Color? 】", + "【elevation】 : Глубина тени 【double?】", + "【shape】 : Форма 【ShapeBorder?】", + "【controller】 : Контроллер 【CarouselController?】", + "【reverse】 : Прокрутка в обратном направлении 【bool】", + "【onTap】 : Событие нажатия 【ValueChanged? 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json new file mode 100644 index 00000000..e2ca253c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Checkbox", + "info": "Checkbox-Komponente, häufig für Konfigurationswechsel verwendet, kann Farben angeben, empfängt Statusänderungsrückrufe und kann auch einen dreistufigen Zustand angeben.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der Checkbox", + "desc": [ + "【value】 : Ob ausgewählt 【double】", + "【checkColor】: Farbe des Häkchens ✔️, wenn ausgewählt 【Color】", + "【activeColor】: Farbe innerhalb des Rahmens, wenn ausgewählt 【Color】", + "【onChanged】: Ereignis bei Zustandsänderung 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Dreistufige Checkbox", + "desc": [ + "【tristate】 : Ob dreistufig 【double】", + " bei onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json new file mode 100644 index 00000000..c2413a9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Checkbox", + "info": "Checkbox component, commonly used for toggling configurations, can specify colors, receive state change callbacks, and can also specify tristate.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Checkbox", + "desc": [ + "【value】 : Whether it is selected 【double】", + "【checkColor】: Color of ✔️ when selected 【Color】", + "【activeColor】: Color inside the box when selected 【Color】", + "【onChanged】: State change event 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tristate of Checkbox", + "desc": [ + "【tristate】 : Whether it is tristate 【double】", + " when onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json new file mode 100644 index 00000000..5b500e89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Casilla de verificación", + "info": "Componente de casilla de verificación, comúnmente utilizado para alternar configuraciones, puede especificar colores, recibir devoluciones de llamada de cambios de estado, y también puede especificar tres estados.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Checkbox", + "desc": [ + "【value】 : Si está seleccionado 【double】", + "【checkColor】: Color de la marca ✔️ cuando está seleccionado 【Color】", + "【activeColor】: Color dentro del cuadro cuando está seleccionado 【Color】", + "【onChanged】: Evento de cambio de estado 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tres estados de Checkbox", + "desc": [ + "【tristate】 : Si tiene tres estados 【double】", + " en onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json new file mode 100644 index 00000000..5f996059 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Case à cocher", + "info": "Composant de case à cocher, souvent utilisé pour basculer les configurations, peut spécifier la couleur, recevoir un rappel de changement d'état, et peut également spécifier un état ternaire.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Checkbox", + "desc": [ + "【value】 : Est-ce sélectionné 【double】", + "【checkColor】: Couleur du ✔️gou lorsque sélectionné 【Color】", + "【activeColor】: Couleur à l'intérieur de la case lorsque sélectionné 【Color】", + "【onChanged】: Événement de changement d'état 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "État ternaire de Checkbox", + "desc": [ + "【tristate】 : Est-ce un état ternaire 【double】", + " lors de onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json new file mode 100644 index 00000000..26f3c698 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Casella di controllo", + "info": "Componente casella di controllo, comunemente utilizzato per l'alternanza delle configurazioni, può specificare il colore, ricevere callback di cambio di stato e può anche specificare tre stati.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base della casella di controllo", + "desc": [ + "【value】 : Se è selezionato 【double】", + "【checkColor】: Colore del segno di spunta quando selezionato 【Color】", + "【activeColor】: Colore all'interno del riquadro quando selezionato 【Color】", + "【onChanged】: Evento di cambio di stato 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Tre stati della casella di controllo", + "desc": [ + "【tristate】 : Se è a tre stati 【double】", + " Quando onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json new file mode 100644 index 00000000..87d86739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "チェックボックス", + "info": "チェックボックスコンポーネントは、設定の切り替えによく使用され、色を指定でき、状態変化のコールバックを受け取り、三状態も指定できます。", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "チェックボックスの基本使用法", + "desc": [ + "【value】 : 選択されているかどうか 【double】", + "【checkColor】: 選択時の✔️チェックマークの色 【Color】", + "【activeColor】: 選択時のボックス内の色 【Color】", + "【onChanged】: 状態変更イベント 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "チェックボックスの三状態", + "desc": [ + "【tristate】 : 三状態かどうか 【double】", + " onChanged時," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json new file mode 100644 index 00000000..e6a3927b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "체크박스", + "info": "체크박스 컴포넌트는 설정 전환에 자주 사용되며, 색상을 지정할 수 있고, 상태 변경 콜백을 받을 수 있으며, 삼중 상태를 지정할 수도 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Checkbox 기본 사용법", + "desc": [ + "【value】 : 선택 여부 【double】", + "【checkColor】: 선택 시 ✔️ 체크 색상 【Color】", + "【activeColor】: 선택 시 상자 내부 색상 【Color】", + "【onChanged】: 상태 변경 이벤트 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Checkbox의 삼중 상태", + "desc": [ + "【tristate】 : 삼중 상태 여부 【double】", + " onChanged 시," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json new file mode 100644 index 00000000..4a7be755 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Caixa de verificação", + "info": "Componente de caixa de verificação, frequentemente usado para alternar configurações, pode especificar cores, receber retorno de chamada de alteração de estado e também pode especificar três estados.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Checkbox", + "desc": [ + "【value】 : se está selecionado 【double】", + "【checkColor】: cor do ✔️gou quando selecionado 【Color】", + "【activeColor】: cor dentro da caixa quando selecionado 【Color】", + "【onChanged】: evento de mudança de estado 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Três estados do Checkbox", + "desc": [ + "【tristate】 : se é de três estados 【double】", + " onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json new file mode 100644 index 00000000..f20275f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Checkbox/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 39, + "name": "Checkbox", + "localName": "Флажок", + "info": "Компонент флажка, часто используется для переключения настроек, может быть указан цвет, принимает обратный вызов изменения состояния, также может быть указан трехсостояний.", + "lever": 4, + "family": 1, + "linkIds": [326,17], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Checkbox", + "desc": [ + "【value】 : Выбрано ли 【double】", + "【checkColor】: Цвет галочки при выборе 【Color】", + "【activeColor】: Цвет внутри рамки при выборе 【Color】", + "【onChanged】: Событие изменения состояния 【Function(bool)】," + ] + }, + { + "file": "node2_tristate.dart", + "name": "Трехсостояний Checkbox", + "desc": [ + "【tristate】 : Является ли трехсостояний 【double】", + " onChanged," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json new file mode 100644 index 00000000..1e2eaed9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Rundes Fortschrittsanzeige", + "info": "Runde Fortschrittsanzeige, bei der Eigenschaften wie Farbe, Linienstärke, Fortschritt usw. angegeben werden können. Wenn der Wert null ist, dreht sie sich ununterbrochen.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CircularProgressIndicator", + "desc": [ + "【value】 : Fortschritt 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【valueColor】 : Fortschrittsfarbe 【Animation】", + "【strokeWidth】 : Linienstärke 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json new file mode 100644 index 00000000..69d3e60c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Circular Progress", + "info": "A circular progress display that can specify properties such as color, line width, and progress. It will keep rotating when value is null.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CircularProgressIndicator", + "desc": [ + "【value】 : Progress 【double】", + "【backgroundColor】 : Background Color 【Color】", + "【valueColor】 : Progress Color 【Animation】", + "【strokeWidth】 : Line Width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json new file mode 100644 index 00000000..028316bd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicador de progreso circular", + "info": "Muestra de progreso circular, se pueden especificar propiedades como color, ancho de línea, progreso, etc. Si el valor es nulo, girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CircularProgressIndicator", + "desc": [ + "【value】 : progreso 【double】", + "【backgroundColor】 : color de fondo 【Color】", + "【valueColor】 : color de progreso 【Animation】", + "【strokeWidth】 : ancho de línea 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json new file mode 100644 index 00000000..e2b75ebd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Progrès circulaire", + "info": "Affichage de progression circulaire, permettant de spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, la progression, etc. Lorsque la valeur est null, il tourne en continu.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CircularProgressIndicator", + "desc": [ + "【value】 : Progression 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【valueColor】 : Couleur de progression 【Animation】", + "【strokeWidth】 : Épaisseur de la ligne 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json new file mode 100644 index 00000000..52119102 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicatore di progresso circolare", + "info": "Visualizzazione del progresso circolare, con possibilità di specificare colore, larghezza della linea, progresso, ecc. Ruota continuamente quando il valore è null.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CircularProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【valueColor】 : Colore del progresso 【Animation】", + "【strokeWidth】 : Larghezza della linea 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json new file mode 100644 index 00000000..5da05787 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "円形の進捗", + "info": "円形の進捗表示、色、線幅、進捗などの属性を指定できます。valueがnullの場合、回転し続けます。", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicatorの基本使用", + "desc": [ + "【value】 : 進捗 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 進捗色 【Animation】", + "【strokeWidth】 : 線幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json new file mode 100644 index 00000000..130e986b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "원형 진행률", + "info": "원형 진행률 표시, 색상, 선 두께, 진행률 등 속성을 지정할 수 있습니다. value가 null일 경우 계속 회전합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircularProgressIndicator 기본 사용", + "desc": [ + "【value】 : 진행률 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【valueColor】 : 진행률 색상 【Animation】", + "【strokeWidth】 : 선 두께 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json new file mode 100644 index 00000000..9f3c2822 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Indicador de Progresso Circular", + "info": "Exibição de progresso circular, pode especificar atributos como cor, largura da linha, progresso, etc. Quando o valor é nulo, ele gira continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CircularProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Cor de Fundo 【Color】", + "【valueColor】 : Cor do Progresso 【Animation】", + "【strokeWidth】 : Largura da Linha 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json new file mode 100644 index 00000000..2ce4fce9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CircularProgressIndicator/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 46, + "name": "CircularProgressIndicator", + "localName": "Круговой индикатор прогресса", + "info": "Круговой индикатор прогресса, можно указать цвет, ширину линии, прогресс и другие свойства. Если значение value равно null, индикатор будет вращаться бесконечно.", + "lever": 3, + "family": 1, + "linkIds": [ + 47, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CircularProgressIndicator", + "desc": [ + "【value】 : Прогресс 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【valueColor】 : Цвет прогресса 【Animation】", + "【strokeWidth】 : Ширина линии 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json new file mode 100644 index 00000000..6830a170 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS-Indikator", + "info": "iOS-stilisiertes Ladeanzeige-Widget, kann Radius und Drehung angeben.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActivityIndicator", + "desc": [ + "【animating】 : Ob Ladeanimation aktiviert ist 【bool】", + "【radius】 : Radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json new file mode 100644 index 00000000..f126511f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS Indicator", + "info": "iOS style loading display component, can specify radius and whether to rotate.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActivityIndicator", + "desc": [ + "【animating】 : Whether the loading animation is active 【bool】", + "【radius】 : Radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json new file mode 100644 index 00000000..4ddefe72 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicador de iOS", + "info": "Componente de visualización de carga con estilo iOS, que permite especificar el radio y si gira.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActivityIndicator", + "desc": [ + "【animating】 : Si la animación está cargando 【bool】", + "【radius】 : Radio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json new file mode 100644 index 00000000..4528f85e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicateur iOS", + "info": "Composant d'affichage de chargement de style iOS, peut spécifier le rayon et s'il tourne.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActivityIndicator", + "desc": [ + "【animating】 : Si l'animation de chargement est active 【bool】", + "【radius】 : Rayon 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json new file mode 100644 index 00000000..510c2e87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicatore iOS", + "info": "Componente di caricamento in stile iOS, può specificare il raggio e se ruotare.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActivityIndicator", + "desc": [ + "【animating】 : Se l'animazione di caricamento è attiva 【bool】", + "【radius】 : Raggio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json new file mode 100644 index 00000000..762661b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOSインジケーター", + "info": "iOSスタイルのローディング表示コンポーネントで、半径と回転の有無を指定できます。", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicatorの基本的な使用", + "desc": [ + "【animating】 : ローディングアニメーションの有無 【bool】", + "【radius】 : 半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json new file mode 100644 index 00000000..2dadbffe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "iOS 인디케이터", + "info": "iOS 스타일의 로딩 표시 컴포넌트, 반지름 및 회전 여부를 지정할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActivityIndicator 기본 사용", + "desc": [ + "【animating】 : 로딩 애니메이션 여부 【bool】", + "【radius】 : 반지름 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json new file mode 100644 index 00000000..38480d9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Indicador iOS", + "info": "Componente de exibição de carregamento no estilo iOS, pode especificar o raio e se deve girar.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActivityIndicator", + "desc": [ + "【animating】 : Se a animação de carregamento está ativa 【bool】", + "【radius】 : Raio 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json new file mode 100644 index 00000000..5105df86 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoActivityIndicator/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 48, + "name": "CupertinoActivityIndicator", + "localName": "Индикатор iOS", + "info": "Компонент отображения загрузки в стиле iOS, можно указать радиус и вращение.", + "lever": 2, + "family": 1, + "linkIds": [ + 46, + 47 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActivityIndicator", + "desc": [ + "【animating】 : Анимация загрузки 【bool】", + "【radius】 : Радиус 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json new file mode 100644 index 00000000..f342ac7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS-App", + "info": "Top-Level-Komponente für iOS-stil-Apps, enthält Eigenschaften wie Routen-Generator, Thema, Sprache, Startseite usw.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoApp", + "desc": [ + "【theme】 : Thema 【ThemeData】", + "【title】 : Taskleisten-Titel 【String】", + "【onGenerateRoute】 : Routen-Generator 【RouteFactory】", + "【home】 : Startseite 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json new file mode 100644 index 00000000..a3a5f423 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS App", + "info": "Top-level component for iOS-style apps, including route generator, theme, language, home page, and other attributes.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoApp", + "desc": [ + "【theme】 : Theme 【ThemeData】", + "【title】 : Taskbar Title 【String】", + "【onGenerateRoute】 : Route Generator 【RouteFactory】", + "【home】 : Home Page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json new file mode 100644 index 00000000..761bbe64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Aplicación iOS", + "info": "Componente de nivel superior para aplicaciones con estilo iOS, que incluye generador de rutas, tema, idioma, página de inicio, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título de la barra de tareas 【String】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【home】 : Página de inicio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json new file mode 100644 index 00000000..85ce4672 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Application iOS", + "info": "Composant de haut niveau pour les applications de style iOS, incluant un générateur de routes, un thème, une langue, une page d'accueil, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoApp", + "desc": [ + "【theme】 : Thème 【ThemeData】", + "【title】 : Titre de la barre des tâches 【String】", + "【onGenerateRoute】 : Générateur de routes 【RouteFactory】", + "【home】 : Page d'accueil 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json new file mode 100644 index 00000000..76516eeb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "App iOS", + "info": "Componente di alto livello per applicazioni in stile iOS, include generatore di rotte, tema, lingua, home page e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Titolo della barra delle applicazioni 【String】", + "【onGenerateRoute】 : Generatore di rotte 【RouteFactory】", + "【home】 : Home page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json new file mode 100644 index 00000000..38fec145 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOSアプリ", + "info": "iOSスタイルのアプリのトップレベルコンポーネントで、ルートジェネレーター、テーマ、言語、ホームなどの属性を含みます。", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoAppの基本使用法", + "desc": [ + "【theme】 : テーマ 【ThemeData】", + "【title】 : タスクバータイトル 【String】", + "【onGenerateRoute】 : ルートジェネレーター 【RouteFactory】", + "【home】 : ホーム 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json new file mode 100644 index 00000000..aaa445e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS 앱", + "info": "iOS 스타일 앱의 최상위 컴포넌트로, 라우트 생성기, 테마, 언어, 홈페이지 등의 속성을 포함합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoApp 기본 사용법", + "desc": [ + "【theme】 : 테마 【ThemeData】", + "【title】 : 작업 표시줄 제목 【String】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【home】 : 홈페이지 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json new file mode 100644 index 00000000..145e285f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "Aplicação iOS", + "info": "Componente de topo para aplicações de estilo iOS, incluindo gerador de rotas, tema, idioma, página inicial, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título da barra de tarefas 【String】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【home】 : Página inicial 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json new file mode 100644 index 00000000..96c62ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 156, + "name": "CupertinoApp", + "localName": "iOS приложение", + "info": "Верхнеуровневый компонент для приложений в стиле iOS, включающий генератор маршрутов, темы, язык, домашнюю страницу и другие атрибуты.", + "lever": 4, + "family": 1, + "linkIds": [ + 157, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoApp", + "desc": [ + "【theme】 : Тема 【ThemeData】", + "【title】 : Заголовок в панели задач 【String】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【home】 : Домашняя страница 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json new file mode 100644 index 00000000..b5c3e3e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS-Schaltfläche", + "info": "iOS-stilige Schaltfläche. Kann Farbe, Transparenz beim Klicken, Innenabstand, abgerundete Ecken usw. festlegen. Kann Klickereignisse empfangen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton Klickereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【pressedOpacity】: Transparenz beim Drücken 【double】", + "【child】: Kind-Widget 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【borderRadius】: Radius der abgerundeten Ecken 【BorderRadius】", + "【onPressed】: Klickereignis 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json new file mode 100644 index 00000000..7641c471 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS Button", + "info": "A button with iOS style. You can specify color, opacity when pressed, padding, border radius, etc. It can receive click events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【pressedOpacity】: Opacity when pressed 【double】", + "【child】: Child widget 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderRadius】: Border radius 【BorderRadius】", + "【onPressed】: Click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json new file mode 100644 index 00000000..1299f825 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Botón de iOS", + "info": "Botón con estilo iOS. Se puede especificar el color, la opacidad al hacer clic, el relleno interno, el radio de las esquinas, etc. Puede recibir eventos de clic.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de CupertinoButton", + "desc": [ + "【color】: Color 【Color】", + "【pressedOpacity】: Opacidad al presionar 【double】", + "【child】: Componente hijo 【Widget】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【borderRadius】: Radio de las esquinas 【BorderRadius】", + "【onPressed】: Evento de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json new file mode 100644 index 00000000..27faffb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Bouton iOS", + "info": "Bouton de style iOS. Peut spécifier la couleur, l'opacité lors du clic, le remplissage interne, les coins arrondis, etc. Peut recevoir des événements de clic.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic CupertinoButton", + "desc": [ + "【color】: Couleur 【Color】", + "【pressedOpacity】: Opacité lors de la pression 【double】", + "【child】: Composant enfant 【Widget】", + "【padding】: Remplissage interne 【EdgeInsetsGeometry】", + "【borderRadius】: Rayon des coins arrondis 【BorderRadius】", + "【onPressed】: Événement de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json new file mode 100644 index 00000000..dc95032a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Pulsante iOS", + "info": "Pulsante in stile iOS. Puoi specificare colore, opacità al click, padding, bordi arrotondati, ecc. Può ricevere eventi di click.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di click di CupertinoButton", + "desc": [ + "【color】: Colore 【Color】", + "【pressedOpacity】: Opacità quando premuto 【double】", + "【child】: Componente figlio 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderRadius】: Raggio del bordo arrotondato 【BorderRadius】", + "【onPressed】: Evento di click 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json new file mode 100644 index 00000000..567eccc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOSボタン", + "info": "iOSスタイルのボタン。色、クリック時の透明度、パディング、角丸などを指定できます。クリックイベントを受け取ることができます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【pressedOpacity】: 押下時の透明度 【double】", + "【child】: 子コンポーネント 【Widget】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【borderRadius】: 角丸半径 【BorderRadius】", + "【onPressed】: クリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json new file mode 100644 index 00000000..7d48b760 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "iOS 버튼", + "info": "iOS 스타일의 버튼. 색상, 클릭 시 투명도, 내부 여백, 모서리 반경 등을 지정할 수 있습니다. 클릭 이벤트를 수신할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【pressedOpacity】: 눌렀을 때 투명도 【double】", + "【child】: 자식 위젯 【Widget】", + "【padding】: 내부 여백 【EdgeInsetsGeometry】", + "【borderRadius】: 모서리 반경 【BorderRadius】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json new file mode 100644 index 00000000..636a8701 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Botão iOS", + "info": "Botão de estilo iOS. Pode especificar cor, opacidade ao clicar, preenchimento interno, bordas arredondadas, etc. Pode receber eventos de clique.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do CupertinoButton", + "desc": [ + "【color】: Cor 【Color】", + "【pressedOpacity】: Opacidade ao pressionar 【double】", + "【child】: Componente filho 【Widget】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【borderRadius】: Raio da borda arredondada 【BorderRadius】", + "【onPressed】: Evento de clique 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json new file mode 100644 index 00000000..80bdb35f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 24, + "name": "CupertinoButton", + "localName": "Кнопка iOS", + "info": "Кнопка в стиле iOS. Можно указать цвет, прозрачность при нажатии, внутренние отступы, радиус скругления и т.д. Может принимать события нажатия.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия CupertinoButton", + "desc": [ + "【color】: Цвет 【Color】", + "【pressedOpacity】: Прозрачность при нажатии 【double】", + "【child】: Дочерний виджет 【Widget】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【borderRadius】: Радиус скругления 【BorderRadius】", + "【onPressed】: Событие нажатия 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json new file mode 100644 index 00000000..f9da14be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Checkbox·macOS-Stil", + "info": "Ein macOS-stilisiertes Checkbox, das drei Zustände unterstützt; bei der Verwendung müssen der Wert und die onChanged-Rückruffunktion bereitgestellt werden.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox Verwendung", + "desc": [ + "【value】 : Ob ausgewählt 【bool?】", + "【onChanged】 : Änderungsrückruf 【ValueChanged?】", + "【checkColor】 : Farbe des Häkchens bei Auswahl 【Color?】", + "【activeColor】 : Hintergrundfarbe bei Auswahl 【Color?】", + "【activeColor】 : Hintergrundfarbe bei Auswahl 【Color?】", + "【inactiveColor】 : Randfarbe/Hintergrundfarbe bei Inaktivität 【Color?】", + "Wenn onChanged null ist, bedeutet dies, dass es nicht verfügbar ist." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Drei Zustände", + "desc": [ + "【tristate】 : Ob der Dreizustand aktiviert ist 【bool】", + "Im Dreizustand ist der Wert null als -" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox Randlinie und Form", + "desc": [ + "【shape】 : Form 【OutlinedBorder?】", + "【side】 : Randlinie 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json new file mode 100644 index 00000000..94551595 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Checkbox·macOS Style", + "info": "A macOS-style checkbox that supports three states; requires providing a value and an onChanged callback function when used.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox Usage", + "desc": [ + "【value】: Whether it is selected 【bool?】", + "【onChanged】: Change callback 【ValueChanged?】", + "【checkColor】: Checkmark color when selected 【Color?】", + "【activeColor】: Background color when selected 【Color?】", + "【activeColor】: Background color when selected 【Color?】", + "【inactiveColor】: Border color when inactive/background color when disabled 【Color?】", + "When onChanged is null, it means it is disabled." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Three States", + "desc": [ + "【tristate】: Whether to enable three states 【bool】", + "In three states, the value is null for -" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox Border and Shape", + "desc": [ + "【shape】: Shape 【OutlinedBorder?】", + "【side】: Border 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json new file mode 100644 index 00000000..453a0995 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Casilla de verificación·Estilo macOS", + "info": "Una casilla de verificación con estilo macOS, compatible con tres estados; se debe proporcionar un valor value y una función de devolución de llamada onChanged al usarla.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de CupertinoCheckbox", + "desc": [ + "【value】 : Si está seleccionado 【bool?】", + "【onChanged】 : Función de devolución de llamada para cambios 【ValueChanged?】", + "【checkColor】 : Color de la marca de verificación cuando está seleccionado 【Color?】", + "【activeColor】 : Color de fondo cuando está seleccionado 【Color?】", + "【activeColor】 : Color de fondo cuando está seleccionado 【Color?】", + "【inactiveColor】 : Color de borde cuando no está activo/Color de fondo cuando no está disponible 【Color?】", + "Cuando onChanged es null, significa que no está disponible." + ] + }, + { + "file": "node2.dart", + "name": "Tres estados de CupertinoCheckbox", + "desc": [ + "【tristate】 : Si está habilitado el estado tristate 【bool】", + "En el estado tristate, el valor null representa -" + ] + }, + { + "file": "node3.dart", + "name": "Borde y forma de CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Borde 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json new file mode 100644 index 00000000..a94227ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Case à cocher·Style macOS", + "info": "Une case à cocher de style macOS, prenant en charge trois états ; nécessite de fournir une valeur value et une fonction de rappel onChanged lors de l'utilisation.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de CupertinoCheckbox", + "desc": [ + "【value】 : Est-ce sélectionné 【bool?】", + "【onChanged】 : Rappel de changement 【ValueChanged?】", + "【checkColor】 : Couleur de la coche √ lorsqu'elle est sélectionnée 【Color?】", + "【activeColor】 : Couleur de fond lorsqu'elle est sélectionnée 【Color?】", + "【activeColor】 : Couleur de fond lorsqu'elle est sélectionnée 【Color?】", + "【inactiveColor】 : Couleur de bordure/arrière-plan non activé 【Color?】", + "Lorsque onChanged est null, cela signifie qu'il est désactivé." + ] + }, + { + "file": "node2.dart", + "name": "Trois états de CupertinoCheckbox", + "desc": [ + "【tristate】 : Activer trois états 【bool】", + "En mode tristate, la valeur null représente -" + ] + }, + { + "file": "node3.dart", + "name": "Bordure et forme de CupertinoCheckbox", + "desc": [ + "【shape】 : Forme 【OutlinedBorder?】", + "【side】 : Bordure 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json new file mode 100644 index 00000000..9999264e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Casella di controllo·Stile macOS", + "info": "Una casella di controllo in stile macOS, supporta tre stati; richiede un valore value e una funzione di callback onChanged.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di CupertinoCheckbox", + "desc": [ + "【value】 : Se selezionato 【bool?】", + "【onChanged】 : Callback di modifica 【ValueChanged?】", + "【checkColor】 : Colore del segno di spunta quando selezionato 【Color?】", + "【activeColor】 : Colore di sfondo quando selezionato 【Color?】", + "【activeColor】 : Colore di sfondo quando selezionato 【Color?】", + "【inactiveColor】 : Colore del bordo/colore di sfondo non attivo 【Color?】", + "Quando onChanged è null, indica che non è utilizzabile." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox a tre stati", + "desc": [ + "【tristate】 : Se abilitare i tre stati 【bool】", + "In modalità tristate, il valore null rappresenta -" + ] + }, + { + "file": "node3.dart", + "name": "Bordo e forma di CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Bordo 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json new file mode 100644 index 00000000..3f66dfdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "チェックボックス・macOSスタイル", + "info": "macOSスタイルのチェックボックスで、三態をサポートしています。使用時にはvalue値とonChangedコールバック関数を提供する必要があります。", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 使用", + "desc": [ + "【value】 : 選択されているかどうか 【bool?】", + "【onChanged】 : 変更コールバック 【ValueChanged?】", + "【checkColor】 : 選択時の√色 【Color?】", + "【activeColor】 : 選択時の背景色 【Color?】", + "【activeColor】 : 選択時の背景色 【Color?】", + "【inactiveColor】 : 非アクティブ時の枠線色/無効な背景色 【Color?】", + "onChangedがnullの場合、無効であることを示します。" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 三態", + "desc": [ + "【tristate】 : 三態を有効にするかどうか 【bool】", + "三態の場合、値がnullの場合は - です" + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 枠線と形状", + "desc": [ + "【shape】 : 形状 【OutlinedBorder?】", + "【side】 : 枠線 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json new file mode 100644 index 00000000..8d70a6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "체크박스·macOS 스타일", + "info": "macOS 스타일의 체크박스로, 3가지 상태를 지원합니다. 사용 시 value 값과 onChanged 콜백 함수를 제공해야 합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoCheckbox 사용", + "desc": [ + "【value】 : 선택 여부 【bool?】", + "【onChanged】 : 변경 콜백 【ValueChanged?】", + "【checkColor】 : 선택 시 √ 색상 【Color?】", + "【activeColor】 : 선택 배경 색상 【Color?】", + "【activeColor】 : 선택 배경 색상 【Color?】", + "【inactiveColor】 : 비활성 시 테두리 색상/사용 불가 배경 색상 【Color?】", + "onChanged이 null일 경우, 사용 불가를 나타냅니다." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox 3가지 상태", + "desc": [ + "【tristate】 : 3가지 상태 활성화 여부 【bool】", + "3가지 상태일 때, 값이 null이면 -로 표시됩니다." + ] + }, + { + "file": "node3.dart", + "name": "CupertinoCheckbox 테두리와 모양", + "desc": [ + "【shape】 : 모양 【OutlinedBorder?】", + "【side】 : 테두리 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json new file mode 100644 index 00000000..28c44467 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Caixa de verificação - Estilo macOS", + "info": "Uma caixa de verificação no estilo macOS, suporta três estados; ao usar, é necessário fornecer o valor 'value' e a função de retorno 'onChanged'.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do CupertinoCheckbox", + "desc": [ + "【value】 : Se está selecionado 【bool?】", + "【onChanged】 : Retorno de chamada de mudança 【ValueChanged?】", + "【checkColor】 : Cor do √ quando selecionado 【Color?】", + "【activeColor】 : Cor de fundo quando selecionado 【Color?】", + "【activeColor】 : Cor de fundo quando selecionado 【Color?】", + "【inactiveColor】 : Cor da borda/Cor de fundo inativa 【Color?】", + "Quando onChanged é null, indica que está inativo." + ] + }, + { + "file": "node2.dart", + "name": "CupertinoCheckbox Três Estados", + "desc": [ + "【tristate】 : Se ativa três estados 【bool】", + "Em três estados, o valor null representa -" + ] + }, + { + "file": "node3.dart", + "name": "Borda e Forma do CupertinoCheckbox", + "desc": [ + "【shape】 : Forma 【OutlinedBorder?】", + "【side】 : Borda 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json new file mode 100644 index 00000000..f8374ba4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoCheckbox/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 238, + "name": "CupertinoCheckbox", + "localName": "Флажок·стиль macOS", + "info": "Флажок в стиле macOS, поддерживающий три состояния; при использовании необходимо предоставить значение value и функцию обратного вызова onChanged.", + "lever": 4, + "family": 1, + "linkIds": [ + 39, + 17 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование CupertinoCheckbox", + "desc": [ + "【value】 : Выбрано ли 【bool?】", + "【onChanged】 : Обратный вызов при изменении 【ValueChanged?】", + "【checkColor】 : Цвет галочки при выборе 【Color?】", + "【activeColor】 : Цвет фона при выборе 【Color?】", + "【activeColor】 : Цвет фона при выборе 【Color?】", + "【inactiveColor】 : Цвет границы/фона при неактивности 【Color?】", + "Когда onChanged равен null, это означает, что элемент недоступен." + ] + }, + { + "file": "node2.dart", + "name": "Три состояния CupertinoCheckbox", + "desc": [ + "【tristate】 : Включены ли три состояния 【bool】", + "В режиме три состояния значение null означает -" + ] + }, + { + "file": "node3.dart", + "name": "Границы и форма CupertinoCheckbox", + "desc": [ + "【shape】 : Форма 【OutlinedBorder?】", + "【side】 : Граница 【BorderSide?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json new file mode 100644 index 00000000..8f7ce548 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iOS-Popup-Menü", + "info": "Ein beeindruckendes iOS-stilisiertes Popup-Menü, das bei langem Drücken animiert erscheint. Wird oft in Verbindung mit CupertinoContextMenuAction verwendet.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoContextMenu", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【actions】 : Aktionen-Komponentensammlung 【List】", + "【previewBuilder】 : Animationskonstruktor 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json new file mode 100644 index 00000000..cd760b19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iOS Pop-up Menu", + "info": "A gorgeous iOS-style button pop-up box. When long-pressed, a menu panel will pop up in an animated form. It is usually used in conjunction with CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoContextMenu", + "desc": [ + "【child】 : Child Component 【Widget】", + "【actions】 : Action Components Set 【List】", + "【previewBuilder】 : Animation Builder 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json new file mode 100644 index 00000000..71410853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menú emergente de iOS", + "info": "Un impresionante botón de estilo iOS que muestra un panel de menú emergente con animación cuando se mantiene presionado, generalmente se usa junto con CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenu", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【actions】 : Conjunto de componentes de acción 【List】", + "【previewBuilder】 : Constructor de animación 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json new file mode 100644 index 00000000..5a4a4e82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu contextuel iOS", + "info": "Un magnifique bouton contextuel de style iOS, qui affiche un panneau de menu animé lors d'un appui long, généralement utilisé avec CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoContextMenu", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【actions】 : Ensemble de composants d'action 【List】", + "【previewBuilder】 : Constructeur d'animation 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json new file mode 100644 index 00000000..e89db3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu a comparsa iOS", + "info": "Un elegante menu a comparsa in stile iOS che appare con un'animazione quando viene premuto a lungo, solitamente utilizzato insieme a CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoContextMenu", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【actions】 : Insieme di componenti di azione 【List】", + "【previewBuilder】 : Costruttore di animazione 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json new file mode 100644 index 00000000..ea29dae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "iosポップアップメニュー", + "info": "華やかなiOSスタイルのボタンポップアップです。長押しするとアニメーションでメニューパネルが表示され、通常はCupertinoContextMenuActionと一緒に使用されます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【actions】 : アクションコンポーネント集 【List】", + "【previewBuilder】 : アニメーションビルダー 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json new file mode 100644 index 00000000..34c13947 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios 팝업 메뉴", + "info": "화려한 iOS 스타일 버튼 팝업 상자로, 길게 누르면 애니메이션 형태로 메뉴 패널이 팝업됩니다. 일반적으로 CupertinoContextMenuAction와 함께 사용됩니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenu 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【actions】 : 액션 위젯 집합 【List】", + "【previewBuilder】 : 애니메이션 빌더 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json new file mode 100644 index 00000000..f69a9978 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "Menu pop-up iOS", + "info": "Um botão de estilo iOS elegante que exibe um painel de menu com animação ao ser pressionado por um longo tempo, geralmente usado em conjunto com CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoContextMenu", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【actions】 : Conjunto de componentes de ação 【List】", + "【previewBuilder】 : Construtor de animação 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json new file mode 100644 index 00000000..e12d61c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenu/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 143, + "name": "CupertinoContextMenu", + "localName": "ios всплывающее меню", + "info": "Эффективное всплывающее меню в стиле iOS, которое появляется с анимацией при длительном нажатии, обычно используется вместе с CupertinoContextMenuAction.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoContextMenu", + "desc": [ + "【child】 : дочерний компонент 【Widget】", + "【actions】 : набор компонентов действий 【List】", + "【previewBuilder】 : конструктор анимации 【ContextMenuPreviewBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json new file mode 100644 index 00000000..5de2763d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iOS-Popup-Menü-Schaltfläche", + "info": "Wird im Allgemeinen nur für die Klick-Schaltfläche in CupertinoContextMenu verwendet. Kann Kind- und Endsymbole angeben und empfängt Klick-Ereignisse.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoContextMenuAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【trailingIcon】 : Ende 【bool】", + "【onPressed】 : Klick-Ereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json new file mode 100644 index 00000000..4f631c36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iOS Popup Menu Button", + "info": "Generally used only for click buttons in CupertinoContextMenu. Can specify child and trailing icons, and receives click events.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoContextMenuAction", + "desc": [ + "【child】 : Child Component 【Widget】", + "【isDefaultAction】 : Whether it is the default action 【bool】", + "【trailingIcon】 : Trailing Icon 【bool】", + "【onPressed】 : Click Event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json new file mode 100644 index 00000000..f2d62182 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Botón de menú emergente de iOS", + "info": "Generalmente se usa solo para el botón de clic en CupertinoContextMenu. Se puede especificar el icono del hijo y el icono de la cola, y recibe el evento de clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【trailingIcon】 : Icono de cola 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json new file mode 100644 index 00000000..61ca09a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Bouton de menu contextuel iOS", + "info": "Généralement utilisé uniquement pour les boutons cliquables dans CupertinoContextMenu. Peut spécifier un enfant et une icône de fin, et reçoit les événements de clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoContextMenuAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce sélectionné par défaut 【bool】", + "【trailingIcon】 : Icône de fin 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json new file mode 100644 index 00000000..e08ede5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Pulsante del menu a comparsa iOS", + "info": "Generalmente utilizzato solo per i pulsanti di clic in CupertinoContextMenu. È possibile specificare l'icona del figlio e della coda, ricevere eventi di clic.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Se selezionato per default 【bool】", + "【trailingIcon】 : Coda 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json new file mode 100644 index 00000000..5a6c599a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "iosポップアップメニューボタン", + "info": "通常、CupertinoContextMenu内のクリックボタンにのみ使用されます。子要素と末尾アイコンを指定でき、クリックイベントを受け取ります。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuActionの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【trailingIcon】 : 末尾アイコン 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json new file mode 100644 index 00000000..9999b523 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios 팝업 메뉴 버튼", + "info": "일반적으로 CupertinoContextMenu 내의 클릭 버튼에만 사용됩니다. 자식 및 꼬리 아이콘을 지정하고 클릭 이벤트를 수신할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoContextMenuAction 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【trailingIcon】 : 꼬리 아이콘 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json new file mode 100644 index 00000000..89f34b48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "Botão de menu pop-up iOS", + "info": "Geralmente usado apenas para botões de clique em CupertinoContextMenu. Pode especificar ícones de criança e cauda, e receber eventos de clique.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoContextMenuAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Selecionado por padrão 【bool】", + "【trailingIcon】 : Ícone de cauda 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json new file mode 100644 index 00000000..6fc6d61e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoContextMenuAction/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 144, + "name": "CupertinoContextMenuAction", + "localName": "ios всплывающее меню кнопка", + "info": "Обычно используется только для кнопки нажатия в CupertinoContextMenu. Можно указать дочерний элемент и значок в конце, принимает событие нажатия.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoContextMenuAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано ли по умолчанию 【bool】", + "【trailingIcon】 : Конечный значок 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json new file mode 100644 index 00000000..89d30b76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS-Datumsauswahl", + "info": "Hochwertige Roll-Datumsauswahl, die den Auswahltyp, Datumsbereich usw. angeben kann und Datumsauswahlereignisse empfängt.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Anfangsdatum 【DateTime】", + "【minimumYear】 : Mindestjahr 【int】", + "【maximumYear】 : Höchstjahr 【int】", + "【onDateTimeChanged】 : Klick-Rückruf 【Function(DateTime)】", + "【minuteInterval】 : Minutenintervall 【int】", + "【use24hFormat】 : Ist 24-Stunden-Format 【bool】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【mode】 : Modus*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json new file mode 100644 index 00000000..eea93649 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS Date Picker", + "info": "A high-end rolling date picker that allows you to specify the type of selection, date range, etc., and receive date selection events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Initial date 【DateTime】", + "【minimumYear】 : Minimum year 【int】", + "【maximumYear】 : Maximum year 【int】", + "【onDateTimeChanged】 : Click callback 【Function(DateTime)】", + "【minuteInterval】 : Minute interval 【int】", + "【use24hFormat】 : Whether it is 24-hour format 【bool】", + "【backgroundColor】 : Background color 【Color】", + "【mode】 : Mode*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json new file mode 100644 index 00000000..b6cb9f30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Selector de fecha de iOS", + "info": "Selector de fecha de desplazamiento de alta gama, que puede especificar el tipo de selección, el rango de fechas, etc., y recibir eventos de selección de fecha.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Fecha inicial 【DateTime】", + "【minimumYear】 : Año mínimo 【int】", + "【maximumYear】 : Año máximo 【int】", + "【onDateTimeChanged】 : Devolución de llamada al hacer clic 【Function(DateTime)】", + "【minuteInterval】 : Intervalo de minutos 【int】", + "【use24hFormat】 : Si es formato de 24 horas 【bool】", + "【backgroundColor】 : Color de fondo 【Color】", + "【mode】 : Modo*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json new file mode 100644 index 00000000..cfca4dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Sélecteur de date iOS", + "info": "Sélecteur de date élégant à défilement, permettant de spécifier le type de sélection, la plage de dates, etc., et de recevoir des événements de sélection de date.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Date initiale 【DateTime】", + "【minimumYear】 : Année minimale 【int】", + "【maximumYear】 : Année maximale 【int】", + "【onDateTimeChanged】 : Rappel au clic 【Function(DateTime)】", + "【minuteInterval】 : Intervalle des minutes 【int】", + "【use24hFormat】 : Format 24 heures 【bool】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【mode】 : Mode*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json new file mode 100644 index 00000000..02fdf730 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Selettore di data iOS", + "info": "Un selettore di data di alta qualità con scorrimento, che consente di specificare il tipo di selezione, l'intervallo di date, ecc., e riceve eventi di selezione della data.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Data iniziale 【DateTime】", + "【minimumYear】 : Anno minimo 【int】", + "【maximumYear】 : Anno massimo 【int】", + "【onDateTimeChanged】 : Callback al click 【Function(DateTime)】", + "【minuteInterval】 : Intervallo di minuti 【int】", + "【use24hFormat】 : Se è in formato 24 ore 【bool】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【mode】 : Modalità*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json new file mode 100644 index 00000000..6e5aedcf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS日付ピッカー", + "info": "高級感のあるスクロール日付ピッカーで、選択するタイプや日付範囲などを指定でき、日付選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePickerの基本使用", + "desc": [ + "【initialDateTime】 : 初期日付 【DateTime】", + "【minimumYear】 : 最小年 【int】", + "【maximumYear】 : 最大年 【int】", + "【onDateTimeChanged】 : クリックコールバック 【Function(DateTime)】", + "【minuteInterval】 : 分間隔 【int】", + "【use24hFormat】 : 24時間制かどうか 【bool】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : モード*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json new file mode 100644 index 00000000..a0b820e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS 날짜 선택기", + "info": "고급스러운 스크롤 날짜 선택기로, 선택 유형, 날짜 범위 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDatePicker 기본 사용", + "desc": [ + "【initialDateTime】 : 초기 날짜 【DateTime】", + "【minimumYear】 : 최소 연도 【int】", + "【maximumYear】 : 최대 연도 【int】", + "【onDateTimeChanged】 : 클릭 콜백 【Function(DateTime)】", + "【minuteInterval】 : 분 간격 【int】", + "【use24hFormat】 : 24시간 형식 여부 【bool】", + "【backgroundColor】 : 배경색 【Color】", + "【mode】 : 모드*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json new file mode 100644 index 00000000..761e0003 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "Seletor de Data iOS", + "info": "Um seletor de data sofisticado com rolagem, que permite especificar o tipo de seleção, intervalo de datas, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Data inicial 【DateTime】", + "【minimumYear】 : Ano mínimo 【int】", + "【maximumYear】 : Ano máximo 【int】", + "【onDateTimeChanged】 : Callback de clique 【Function(DateTime)】", + "【minuteInterval】 : Intervalo de minutos 【int】", + "【use24hFormat】 : Se é formato de 24 horas 【bool】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【mode】 : Modo*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json new file mode 100644 index 00000000..8dea1b31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoDatePicker/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 137, + "name": "CupertinoDatePicker", + "localName": "iOS-выбор даты", + "info": "Стильный колесный выбор даты, который позволяет указать тип выбора, диапазон дат и т.д., получает событие выбора даты.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoDatePicker", + "desc": [ + "【initialDateTime】 : Начальная дата 【DateTime】", + "【minimumYear】 : Минимальный год 【int】", + "【maximumYear】 : Максимальный год 【int】", + "【onDateTimeChanged】 : Обратный вызов при нажатии 【Function(DateTime)】", + "【minuteInterval】 : Интервал минут 【int】", + "【use24hFormat】 : Используется ли 24-часовой формат 【bool】", + "【backgroundColor】 : Цвет фона 【Color】", + "【mode】 : Режим*3 【CupertinoDatePickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json new file mode 100644 index 00000000..11528d25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS-Navigation", + "info": "Eine allgemeine Struktur für eine iOS-ähnliche Anwendungsleiste oben, die es ermöglicht, entsprechende Komponenten an bestimmten Stellen zu platzieren. Attribute wie Hintergrundfarbe, Abstände und Rahmen können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoNavigationBar", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【middle】: Mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【padding】: Innenabstand 【EdgeInsetsDirectional】", + "【border】: Rahmen 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json new file mode 100644 index 00000000..67150e6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS Navigation", + "info": "A general structure for an iOS-style app top bar, where corresponding components can be placed in specified areas. Attributes such as background color, spacing, and border can be specified.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoNavigationBar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【padding】: Padding 【EdgeInsetsDirectional】", + "【border】: Border 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json new file mode 100644 index 00000000..7e03967d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navegación iOS", + "info": "Una estructura común para la barra superior de aplicaciones con estilo iOS, donde se pueden colocar componentes correspondientes en las partes especificadas. Se pueden especificar propiedades como el color de fondo, el espaciado, el borde, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente izquierdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente derecho 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【padding】 : Relleno interno 【EdgeInsetsDirectional】", + "【border】 : Borde 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json new file mode 100644 index 00000000..18ffb31e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navigation iOS", + "info": "Une structure générique pour une barre supérieure d'application de style iOS, permettant de placer des composants correspondants dans des parties spécifiées. Peut spécifier des propriétés telles que la couleur de fond, l'espacement, la bordure, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoNavigationBar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【middle】 : Composant central 【Widget】", + "【trailing】 : Composant de fin 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsDirectional】", + "【border】 : Bordure 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json new file mode 100644 index 00000000..d99005b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navigazione iOS", + "info": "Una struttura generica per una barra superiore di un'app in stile iOS, che consente di posizionare i componenti corrispondenti nelle aree specificate. È possibile specificare proprietà come il colore di sfondo, la spaziatura, il bordo, ecc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】 : Componente centrale 【Widget】", + "【trailing】 : Componente destro 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsDirectional】", + "【border】 : Bordo 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json new file mode 100644 index 00000000..c6b20cf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOSナビゲーション", + "info": "iOSスタイルのアプリトップバーの一般的な構造で、指定された部分に適切なコンポーネントを配置できます。背景色、間隔、ボーダーなどの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar基本使用法", + "desc": [ + "【leading】 : 左側のコンポーネント 【Widget】", + "【middle】 : 中央のコンポーネント 【Widget】", + "【trailing】 : 右側のコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : パディング 【EdgeInsetsDirectional】", + "【border】 : ボーダー 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json new file mode 100644 index 00000000..a51e2768 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS 네비게이션", + "info": "iOS 스타일의 앱 상단 바의 일반적인 구조로, 지정된 부분에 해당하는 컴포넌트를 배치할 수 있습니다. 배경색, 간격, 테두리 등 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoNavigationBar 기본 사용법", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】 : 중간 컴포넌트 【Widget】", + "【trailing】 : 오른쪽 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 내부 여백 【EdgeInsetsDirectional】", + "【border】 : 테두리 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json new file mode 100644 index 00000000..c7ccb911 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "Navegação iOS", + "info": "Uma estrutura genérica para uma barra superior de aplicativos no estilo iOS, onde é possível colocar componentes correspondentes em áreas especificadas. Pode-se especificar atributos como cor de fundo, espaçamento, borda, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoNavigationBar", + "desc": [ + "【leading】 : Componente esquerdo 【Widget】", + "【middle】 : Componente central 【Widget】", + "【trailing】 : Componente direito 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Margem interna 【EdgeInsetsDirectional】", + "【border】 : Borda 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json new file mode 100644 index 00000000..4b957476 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoNavigationBar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 62, + "name": "CupertinoNavigationBar", + "localName": "iOS навигация", + "info": "Универсальная структура для верхней панели приложения в стиле iOS, позволяющая размещать соответствующие компоненты в указанных местах. Можно указать такие свойства, как цвет фона, отступы, границы и т.д.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoNavigationBar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】 : Центральный компонент 【Widget】", + "【trailing】 : Правый компонент 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренние отступы 【EdgeInsetsDirectional】", + "【border】 : Граница 【Border】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json new file mode 100644 index 00000000..99bcfa1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS-Seitengerüst", + "info": "iOS-stilisiertes Seitenlayout-Gerüst, das die Navigationsleiste oben und die Hintergrundfarbe der Seite festlegen kann.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoPageScaffold", + "desc": [ + "【child】 : Inhalt 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【navigationBar】 : Kopf 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json new file mode 100644 index 00000000..13b13ee4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS Page Scaffold", + "info": "iOS style page layout scaffold structure, can specify the top navigation bar and page background color.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoPageScaffold", + "desc": [ + "【child】 : Content 【Widget】", + "【backgroundColor】 : Background Color 【Color】", + "【navigationBar】 : Header 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json new file mode 100644 index 00000000..9cd2fb31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Estructura de andamio de página iOS", + "info": "Estructura de andamio de diseño de página estilo iOS, puede especificar la barra de navegación superior y el color de fondo de la página.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoPageScaffold", + "desc": [ + "【child】 : contenido 【Widget】", + "【backgroundColor】 : color de fondo 【Color】", + "【navigationBar】 : cabecera 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json new file mode 100644 index 00000000..919cd6c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Structure de base de page iOS", + "info": "Structure de base de mise en page de page de style iOS, permettant de spécifier la barre de navigation supérieure et la couleur de fond de la page.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoPageScaffold", + "desc": [ + "【child】 : contenu 【Widget】", + "【backgroundColor】 : couleur de fond 【Color】", + "【navigationBar】 : en-tête 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json new file mode 100644 index 00000000..41ade473 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Impalcatura della pagina iOS", + "info": "Struttura di impalcatura per layout di pagine in stile iOS, consente di specificare la barra di navigazione superiore e il colore di sfondo della pagina.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoPageScaffold", + "desc": [ + "【child】 : Contenuto 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【navigationBar】 : Testa 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json new file mode 100644 index 00000000..2c9c1ec7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOSページスキャフォールド", + "info": "iOSスタイルのページレイアウトスキャフォールド構造で、上部のナビゲーションバーとページの背景色を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold基本使用法", + "desc": [ + "【child】 : コンテンツ 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【navigationBar】 : ヘッダー 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json new file mode 100644 index 00000000..c20f6372 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS 페이지 스캐폴드", + "info": "iOS 스타일의 페이지 레이아웃 스캐폴드 구조로, 상단의 내비게이션 바와 페이지 배경색을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold 기본 사용법", + "desc": [ + "【child】 : 내용 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【navigationBar】 : 헤더 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json new file mode 100644 index 00000000..bcae3024 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "Estrutura de Scaffold de Página iOS", + "info": "Estrutura de scaffold de layout de página no estilo iOS, que pode especificar a barra de navegação superior e a cor de fundo da página.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoPageScaffold", + "desc": [ + "【child】 : Conteúdo 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【navigationBar】 : Cabeçalho 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json new file mode 100644 index 00000000..4efe5996 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPageScaffold/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 157, + "name": "CupertinoPageScaffold", + "localName": "iOS страница каркас", + "info": "iOS-стиль макета страницы каркасной структуры, можно указать верхнюю навигационную панель и цвет фона страницы.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageScaffold базовое использование", + "desc": [ + "【child】 : содержимое 【Widget】", + "【backgroundColor】 : цвет фона 【Color】", + "【navigationBar】 : верхняя часть 【ObstructingPreferredSizeWidget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json new file mode 100644 index 00000000..2cde8206 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS-Auswahl", + "info": "Hochwertiger zylindrischer Schieberegler, äußerst raffiniert, kann viele Konfigurationsattribute angeben und empfängt ausgewählte Ereignisse beim Schieben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker Grundlegende Verwendung", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【offAxisFraction】 : Achsversatzrate 【double】", + "【squeeze】 : Quetschrate 【double】", + "【diameterRatio】 : Verhältnis von Höhe zu Zylinderdurchmesser 【double】", + "【itemExtent】 : Abstand 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【onSelectedItemChanged】 : Ausgewähltes Ereignis 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json new file mode 100644 index 00000000..440bae87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS Picker", + "info": "A high-end cylindrical sliding picker, very sophisticated, with many configurable attributes, and it receives the selected event when sliding.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoPicker", + "desc": [ + "【children】 : List of child components 【List】", + "【offAxisFraction】 : Axis offset rate 【double】", + "【squeeze】 : Squeeze rate 【double】", + "【diameterRatio】 : Ratio of height to cylinder diameter 【double】", + "【itemExtent】 : Spacing 【double】", + "【backgroundColor】 : Background color 【Color】", + "【onSelectedItemChanged】 : Selected event 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json new file mode 100644 index 00000000..24584447 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Selector iOS", + "info": "Selector de deslizamiento cilíndrico de alta gama, muy ingenioso, con muchas propiedades de configuración, recibe eventos de selección al deslizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoPicker", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【offAxisFraction】 : Tasa de desplazamiento del eje 【double】", + "【squeeze】 : Tasa de compresión 【double】", + "【diameterRatio】 : Relación entre la altura y el diámetro del cilindro 【double】", + "【itemExtent】 : Espaciado 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【onSelectedItemChanged】 : Evento de selección 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json new file mode 100644 index 00000000..fb1445e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Sélecteur iOS", + "info": "Un sélecteur cylindrique haut de gamme, très sophistiqué, avec de nombreuses propriétés configurables, recevant des événements de sélection lors du glissement.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoPicker", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【offAxisFraction】 : Taux de décalage de l'axe 【double】", + "【squeeze】 : Taux de compression 【double】", + "【diameterRatio】 : Rapport hauteur/diamètre du cylindre 【double】", + "【itemExtent】 : Espacement 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【onSelectedItemChanged】 : Événement de sélection 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json new file mode 100644 index 00000000..436b0ec2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Selettore iOS", + "info": "Un selettore a scorrimento cilindrico di alta gamma, estremamente sofisticato, con molte proprietà configurabili e in grado di ricevere eventi di selezione durante lo scorrimento.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoPicker", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【offAxisFraction】 : Frazione di offset dell'asse 【double】", + "【squeeze】 : Frazione di compressione 【double】", + "【diameterRatio】 : Rapporto tra altezza e diametro del cilindro 【double】", + "【itemExtent】 : Spaziatura 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【onSelectedItemChanged】 : Evento di selezione 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json new file mode 100644 index 00000000..c348d5fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOSピッカー", + "info": "高級感あふれる円柱スライドピッカーで、精巧で、多くの設定属性を指定でき、スライド時の選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPickerの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【offAxisFraction】 : 軸オフセット率 【double】", + "【squeeze】 : 圧縮率 【double】", + "【diameterRatio】 : 高さと円柱直径の比率 【double】", + "【itemExtent】 : 間隔 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【onSelectedItemChanged】 : 選択イベント 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json new file mode 100644 index 00000000..64c6fc06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS 선택기", + "info": "고급스러운 원통형 슬라이드 선택기로, 정교하며 많은 설정 속성을 지정할 수 있고 슬라이드 시 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPicker 기본 사용법", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【offAxisFraction】 : 축 오프셋 비율 【double】", + "【squeeze】 : 압축 비율 【double】", + "【diameterRatio】 : 높이와 원통 직경 비율 【double】", + "【itemExtent】 : 간격 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【onSelectedItemChanged】 : 선택 이벤트 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json new file mode 100644 index 00000000..0d17c373 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "Seletor iOS", + "info": "Um seletor deslizante cilíndrico de alta classe, extremamente sofisticado, que permite especificar muitos atributos de configuração e recebe eventos de seleção ao deslizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoPicker", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【offAxisFraction】 : Taxa de desvio do eixo 【double】", + "【squeeze】 : Taxa de compressão 【double】", + "【diameterRatio】 : Razão entre altura e diâmetro do cilindro 【double】", + "【itemExtent】 : Espaçamento 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【onSelectedItemChanged】 : Evento de seleção 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json new file mode 100644 index 00000000..9cd80dc4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoPicker/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 139, + "name": "CupertinoPicker", + "localName": "iOS селектор", + "info": "Высококлассный цилиндрический слайдер-селектор, очень изысканный, может быть настроен с множеством свойств, принимает события при выборе во время скольжения.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoPicker", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【offAxisFraction】 : Коэффициент смещения оси 【double】", + "【squeeze】 : Коэффициент сжатия 【double】", + "【diameterRatio】 : Соотношение высоты к диаметру цилиндра 【double】", + "【itemExtent】 : Расстояние между элементами 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【onSelectedItemChanged】 : Событие выбора 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json new file mode 100644 index 00000000..2dbe2c6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_de_DE.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Radio-Button im macOS-Stil", + "info": "Ein Radio-Button im macOS-Stil, dessen Auswahlstatus durch value und groupValue bestimmt wird; onChanged ist der Callback für Klickereignisse.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von CupertinoRadio", + "desc": [ + "【value】 : Wert des Radio-Buttons 【T】", + "【groupValue】 : Aktueller übereinstimmender Wert 【T】", + "【onChanged】 : Callback bei Änderung 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Farben von CupertinoRadio", + "desc": [ + "【activeColor】 : Hintergrundfarbe im aktiven Zustand 【Color?】", + "【fillColor】 : Füllfarbe 【Color?】", + "【inactiveColor】 : Hintergrundfarbe im inaktiven Zustand 【Color?】", + "【focusColor】 : Fokusfarbe 【Color?】", + "【mouseCursor】 : Mauszeigerstil 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Umschaltbarkeit", + "desc": [ + "【toggleable】 : Ist Umschaltbarkeit unterstützt 【bool】", + "toggleable ist standardmäßig false. Wenn es true ist, wird bei einem Klick auf den aktiven Radio-Button ein null-Wert zurückgegeben, um die Anforderungen für die Auswahl und Nichtauswahl zu unterstützen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json new file mode 100644 index 00000000..118f8635 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_en_US.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Radio Button·macOS Style", + "info": "A macOS-style radio button, where the value and groupValue together determine whether the radio button is selected; the onChanged callback handles click events.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio Usage", + "desc": [ + "【value】: Radio button value 【T】", + "【groupValue】: Current matching value 【T】", + "【onChanged】: Callback when changed 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio Colors", + "desc": [ + "【activeColor】: Active background color 【Color?】", + "【fillColor】: Fill color 【Color?】", + "【inactiveColor】: Inactive background color 【Color?】", + "【focusColor】: Focus color 【Color?】", + "【mouseCursor】: Mouse cursor style 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Toggle Support", + "desc": [ + "【toggleable】: Whether toggle is supported 【bool】", + "toggleable defaults to false. When set to true, clicking an active radio button will call back null data, supporting the need for toggling between selected and unselected states." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json new file mode 100644 index 00000000..fa288631 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_es_ES.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Botón de opción estilo macOS", + "info": "Un botón de opción con estilo macOS, donde value y groupValue determinan si este botón de opción está seleccionado; onChanged es la devolución de llamada para el evento de clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de CupertinoRadio", + "desc": [ + "【value】: Valor del botón de opción 【T】", + "【groupValue】: Valor actual coincidente 【T】", + "【onChanged】: Devolución de llamada al cambiar 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Colores de CupertinoRadio", + "desc": [ + "【activeColor】: Color de fondo activo 【Color?】", + "【fillColor】: Relleno 【Color?】", + "【inactiveColor】: Color de fondo inactivo 【Color?】", + "【focusColor】: Color de enfoque 【Color?】", + "【mouseCursor】: Estilo del cursor del ratón 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Soporte de alternancia", + "desc": [ + "【toggleable】: Soporta alternancia 【bool】", + "toggleable es false por defecto, cuando es true, al hacer clic en un botón de opción activo, se devuelve un valor null, lo que permite satisfacer la necesidad de alternar entre seleccionado y no seleccionado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json new file mode 100644 index 00000000..f9705e37 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_fr_FR.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Bouton radio·style macOS", + "info": "Un bouton radio de style macOS, la valeur et groupValue déterminent ensemble si ce bouton radio est sélectionné; onChanged rappelle l'événement de clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de CupertinoRadio", + "desc": [ + "【value】 : Valeur du bouton radio 【T】", + "【groupValue】 : Valeur de correspondance actuelle 【T】", + "【onChanged】 : Rappel lors du changement 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Couleur de CupertinoRadio", + "desc": [ + "【activeColor】 : Couleur de fond active 【Color?】", + "【fillColor】 : Remplissage 【Color?】", + "【inactiveColor】 : Couleur de fond inactive 【Color?】", + "【focusColor】 : Couleur de focus 【Color?】", + "【mouseCursor】 : Style du curseur de la souris 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Prise en charge du basculement", + "desc": [ + "【toggleable】 : Prise en charge du basculement 【bool】", + "toggleable est par défaut false, lorsqu'il est true, cliquer sur le bouton radio actif rappellera des données null, répondant ainsi aux besoins de basculement entre sélection et non-sélection." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json new file mode 100644 index 00000000..dcccf7ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_it_IT.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Pulsante di scelta·Stile macOS", + "info": "Un pulsante di scelta in stile macOS, value e groupValue determinano insieme se questo pulsante di scelta è selezionato; onChanged richiama l'evento di clic.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilizzo di CupertinoRadio", + "desc": [ + "【value】 : Valore del pulsante di scelta 【T】", + "【groupValue】 : Valore corrente corrispondente 【T】", + "【onChanged】 : Richiama quando cambia 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Colori di CupertinoRadio", + "desc": [ + "【activeColor】 : Colore di sfondo attivo 【Color?】", + "【fillColor】 : Riempimento 【Color?】", + "【inactiveColor】 : Colore di sfondo inattivo 【Color?】", + "【focusColor】 : Colore di messa a fuoco 【Color?】", + "【mouseCursor】 : Stile del puntatore del mouse 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Supporto per il passaggio", + "desc": [ + "【toggleable】 : Supporto per il passaggio 【bool】", + "toggleable è impostato su false per impostazione predefinita, quando è true, cliccando sul pulsante di scelta attivo, richiamerà i dati null, supportando così la necessità di passare tra selezionato e non selezionato." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json new file mode 100644 index 00000000..42f6cf60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ja_JP.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "ラジオボタン·macOSスタイル", + "info": "macOSスタイルのラジオボタンで、valueとgroupValueによってこのラジオボタンが選択されているかどうかが決まります;onChangedはクリックイベントのコールバックです。", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 使用", + "desc": [ + "【value】 : ラジオボタンの値 【T】", + "【groupValue】 : 現在のマッチ値 【T】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 色", + "desc": [ + "【activeColor】 : アクティブな背景色 【Color?】", + "【fillColor】 : 塗りつぶし 【Color?】", + "【inactiveColor】 : 非アクティブな背景色 【Color?】", + "【focusColor】 : フォーカス色 【Color?】", + "【mouseCursor】 : マウスポインタのスタイル 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "切り替えサポート", + "desc": [ + "【toggleable】 : 切り替えサポート 【bool】", + "toggleableはデフォルトでfalseで、trueの場合、アクティブなラジオボタンをクリックするとnullデータがコールバックされ、選択と非選択の切り替えニーズをサポートします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json new file mode 100644 index 00000000..ce96904d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ko_KR.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "라디오 버튼·macOS 스타일", + "info": "macOS 스타일의 라디오 버튼, value와 groupValue가 함께 이 라디오 버튼이 선택되었는지 여부를 결정합니다; onChanged는 클릭 이벤트를 콜백합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "CupertinoRadio 사용", + "desc": [ + "【value】 : 라디오 버튼 값 【T】", + "【groupValue】 : 현재 매칭 값 【T】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "CupertinoRadio 색상", + "desc": [ + "【activeColor】 : 활성 배경 색상 【Color?】", + "【fillColor】 : 채우기 【Color?】", + "【inactiveColor】 : 비활성 배경 색상 【Color?】", + "【focusColor】 : 포커스 색상 【Color?】", + "【mouseCursor】 : 마우스 커서 스타일 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "토글 지원 여부", + "desc": [ + "【toggleable】 : 토글 지원 여부 【bool】", + "toggleable은 기본적으로 false이며, true일 때 활성화된 라디오 버튼을 클릭하면 null 데이터를 콜백하여 선택 및 비선택 전환 요구를 지원합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json new file mode 100644 index 00000000..1e16f076 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_pt_PT.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Botão de Rádio·Estilo macOS", + "info": "Um botão de rádio no estilo macOS, onde value e groupValue determinam se o botão de rádio está selecionado; onChanged é o callback para o evento de clique.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso do CupertinoRadio", + "desc": [ + "【value】 : Valor do botão de rádio 【T】", + "【groupValue】 : Valor correspondente atual 【T】", + "【onChanged】 : Callback de mudança 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Cores do CupertinoRadio", + "desc": [ + "【activeColor】 : Cor de fundo ativa 【Color?】", + "【fillColor】 : Preenchimento 【Color?】", + "【inactiveColor】 : Cor de fundo inativa 【Color?】", + "【focusColor】 : Cor de foco 【Color?】", + "【mouseCursor】 : Estilo do cursor do mouse 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Suporte a Alternância", + "desc": [ + "【toggleable】 : Suporta alternância 【bool】", + "toggleable é false por padrão, quando true, clicar no botão de rádio ativo retorna dados nulos, suportando a necessidade de alternar entre selecionado e não selecionado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json new file mode 100644 index 00000000..66cab929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoRadio/desc_ru_RU.json @@ -0,0 +1,42 @@ +{ + "id": 240, + "name": "CupertinoRadio", + "localName": "Радиокнопка·macOS стиль", + "info": "Радиокнопка в стиле macOS, value и groupValue вместе определяют, выбрана ли эта радиокнопка; onChanged обратный вызов события клика.", + "lever": 4, + "family": 1, + "linkIds": [ + 19, + 45 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование CupertinoRadio", + "desc": [ + "【value】 : Значение радиокнопки 【T】", + "【groupValue】 : Текущее совпадающее значение 【T】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + }, + { + "file": "node2.dart", + "name": "Цвета CupertinoRadio", + "desc": [ + "【activeColor】 : Цвет активного фона 【Color?】", + "【fillColor】 : Заполнение 【Color?】", + "【inactiveColor】 : Цвет неактивного фона 【Color?】", + "【focusColor】 : Цвет фокуса 【Color?】", + "【mouseCursor】 : Стиль указателя мыши 【MouseCursor?】" + ] + }, + { + "file": "node3.dart", + "name": "Поддержка переключения", + "desc": [ + "【toggleable】 : Поддержка переключения 【bool】", + "toggleable по умолчанию false, если true, при нажатии на активную радиокнопку будет возвращаться null, чтобы поддерживать переключение между выбором и отменой выбора." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json new file mode 100644 index 00000000..db0a648a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS-Scrollbalken", + "info": "Ein iOS-stil Scrollbalken, der einen scrollbaren Bereich umschließen muss. Wenn der Bereich scrollbar ist, wird ein Scrollbalken angezeigt, um die Position anzuzeigen.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoScrollbar", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json new file mode 100644 index 00000000..0ed9921f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS Scroll Indicator", + "info": "An iOS-style scroll indicator that needs to wrap a scrollable area. When scrollable, it displays a scroll bar for indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoScrollbar", + "desc": [ + "【child】 : Child widget 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json new file mode 100644 index 00000000..eca87f9d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra de desplazamiento de iOS", + "info": "Barra de desplazamiento al estilo de iOS, necesita envolver un área desplazable. Cuando es desplazable, muestra una barra de desplazamiento para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoScrollbar", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json new file mode 100644 index 00000000..b608b380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barre de défilement iOS", + "info": "Barre de défilement de style iOS, nécessite d'être enveloppée dans une zone défilable. Lorsque la zone est défilable, une barre de défilement est affichée pour l'indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoScrollbar", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json new file mode 100644 index 00000000..27fca542 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra di scorrimento iOS", + "info": "Barra di scorrimento in stile iOS, deve avvolgere un'area scorrevole. Quando è possibile scorrere, viene visualizzata una barra di scorrimento per indicare.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoScrollbar", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json new file mode 100644 index 00000000..792fad38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOSスクロールバー", + "info": "iOSスタイルのスクロールバーで、スクロール可能な領域をラップする必要があります。スクロール可能な場合、スクロールバーが表示されて指示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbarの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json new file mode 100644 index 00000000..9cef34b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "iOS 스크롤바", + "info": "iOS 스타일의 스크롤바로, 스크롤 가능한 영역을 감싸야 하며, 스크롤이 가능할 때 스크롤을 나타내는 바가 표시됩니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoScrollbar 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json new file mode 100644 index 00000000..47a54f6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Barra de rolagem iOS", + "info": "Barra de rolagem no estilo iOS, precisa envolver uma área rolável. Quando a área é rolável, uma barra de rolagem é exibida para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoScrollbar", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json new file mode 100644 index 00000000..0200f9c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoScrollbar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 195, + "name": "CupertinoScrollbar", + "localName": "Ползунок прокрутки iOS", + "info": "Ползунок прокрутки в стиле iOS, который должен оборачивать прокручиваемую область. Когда прокрутка возможна, отображается ползунок для индикации.", + "lever": 3, + "family": 1, + "linkIds": [ + 194, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoScrollbar", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json new file mode 100644 index 00000000..0aee025e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS-Tab-Umschaltung", + "info": "iOS-Stil mehrerer Schaltflächenleiste, ähnlich wie ToggleButtons, kann Attribute wie Innenabstand, ausgewählte Farbe, Randfarbe usw. angeben.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von iOS-Tabs", + "desc": [ + "【children】 : Widget-Map 【Map】", + "【onValueChanged】 : Rückruf bei Wertänderung 【ValueChanged】", + "【groupValue】 : Ausgewählter Wert 【T】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Farbe von CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Nicht ausgewählte Farbe 【Color】", + "【selectedColor】 : Ausgewählte Farbe 【Color】", + "【pressedColor】 : Gedrückte Farbe 【Color】", + "【borderColor】 : Randfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json new file mode 100644 index 00000000..852b8e80 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS Multi-Tab Switch", + "info": "iOS-style multi-button bar, similar in behavior to ToggleButtons, with customizable properties such as padding, selected color, border color, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of iOS Tabs", + "desc": [ + "【children】: Component Map 【Map】", + "【onValueChanged】: Value Change Callback 【ValueChanged】", + "【groupValue】: Selected Value 【T】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colors of CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】: Unselected Color 【Color】", + "【selectedColor】: Selected Color 【Color】", + "【pressedColor】: Pressed Color 【Color】", + "【borderColor】: Border Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json new file mode 100644 index 00000000..e0d08d20 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Control de segmentos iOS", + "info": "Barra de múltiples botones al estilo iOS, similar a ToggleButtons, se pueden especificar propiedades como el relleno interno, el color seleccionado, el color del borde, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de pestañas iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de cambio de valor 【ValueChanged】", + "【groupValue】 : Valor seleccionado 【T】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colores de CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Color no seleccionado 【Color】", + "【selectedColor】 : Color seleccionado 【Color】", + "【pressedColor】 : Color al presionar 【Color】", + "【borderColor】 : Color del borde 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json new file mode 100644 index 00000000..da8eda6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Commutateur à onglets iOS", + "info": "Barre à boutons multiples de style iOS, similaire à ToggleButtons, avec des propriétés telles que le padding, la couleur sélectionnée, la couleur de la bordure, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base des onglets iOS", + "desc": [ + "【children】 : Map de composants 【Map】", + "【onValueChanged】 : Callback de changement de valeur 【ValueChanged】", + "【groupValue】 : Valeur sélectionnée 【T】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Couleurs de CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Couleur non sélectionnée 【Color】", + "【selectedColor】 : Couleur sélectionnée 【Color】", + "【pressedColor】 : Couleur pressée 【Color】", + "【borderColor】 : Couleur de la bordure 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json new file mode 100644 index 00000000..409ec6e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Interruttore a segmenti iOS", + "info": "Barra a pulsanti multipli in stile iOS, simile a ToggleButtons, con proprietà come padding, colore selezionato, colore del bordo, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base delle schede iOS", + "desc": [ + "【children】 : Mappa dei componenti 【Map】", + "【onValueChanged】 : Callback per il cambio di valore 【ValueChanged】", + "【groupValue】 : Valore selezionato 【T】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Colori di CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Colore non selezionato 【Color】", + "【selectedColor】 : Colore selezionato 【Color】", + "【pressedColor】 : Colore premuto 【Color】", + "【borderColor】 : Colore del bordo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json new file mode 100644 index 00000000..16d59205 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOSタブ切り替え", + "info": "iOSスタイルのマルチボタンバー、ToggleButtonsと同様の動作をします。内側の余白、選択色、枠線色などの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOSタブの基本使用", + "desc": [ + "【children】 : コンポーネントマップ 【Map】", + "【onValueChanged】 : 値変更コールバック 【ValueChanged】", + "【groupValue】 : 選択値 【T】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControlの色", + "desc": [ + "【unselectedColor】 : 未選択色 【Color】", + "【selectedColor】 : 選択色 【Color】", + "【pressedColor】 : 押下色 【Color】", + "【borderColor】 : 枠線色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json new file mode 100644 index 00000000..c3c3a8be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS 다중 탭 전환", + "info": "iOS 스타일의 다중 버튼 바로, ToggleButtons와 유사하게 동작하며 내부 여백, 선택 색상, 테두리 색상 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS 탭 기본 사용", + "desc": [ + "【children】 : 컴포넌트 맵 【Map】", + "【onValueChanged】 : 값 변경 콜백 【ValueChanged】", + "【groupValue】 : 선택된 값 【T】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "CupertinoSegmentedControl의 색상", + "desc": [ + "【unselectedColor】 : 선택되지 않은 색상 【Color】", + "【selectedColor】 : 선택된 색상 【Color】", + "【pressedColor】 : 눌린 색상 【Color】", + "【borderColor】 : 테두리 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json new file mode 100644 index 00000000..d9a5caca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "Alternância de múltiplas abas iOS", + "info": "Barra de múltiplos botões no estilo iOS, semelhante ao ToggleButtons, pode especificar atributos como preenchimento interno, cor selecionada, cor da borda, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de abas iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de mudança de valor 【ValueChanged】", + "【groupValue】 : Valor selecionado 【T】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Cores do CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Cor não selecionada 【Color】", + "【selectedColor】 : Cor selecionada 【Color】", + "【pressedColor】 : Cor pressionada 【Color】", + "【borderColor】 : Cor da borda 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json new file mode 100644 index 00000000..c78e5cab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSegmentedControl/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 262, + "name": "CupertinoSegmentedControl", + "localName": "iOS многоколоночный переключатель", + "info": "iOS-стиль многокнопочной панели, поведение аналогично ToggleButtons, можно указать такие свойства, как внутренние отступы, цвет выделения, цвет границы и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 33, + 256 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование вкладок iOS", + "desc": [ + "【children】 : Карта компонентов 【Map】", + "【onValueChanged】 : Обратный вызов изменения значения 【ValueChanged】", + "【groupValue】 : Выбранное значение 【T】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Цвета CupertinoSegmentedControl", + "desc": [ + "【unselectedColor】 : Цвет невыделенного 【Color】", + "【selectedColor】 : Цвет выделенного 【Color】", + "【pressedColor】 : Цвет нажатия 【Color】", + "【borderColor】 : Цвет границы 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json new file mode 100644 index 00000000..c44512a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS-Schieberegler", + "info": "iOS-stilisiertes Schieberegler-Widget, das zwischen einem festgelegten Minimum und Maximum verschoben werden kann. Ermöglicht die Angabe von Farben und empfängt Rückrufe bei Fortschrittsänderungen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoSlider", + "desc": [ + "【value】 : Wert 【double】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【activeColor】 : Aktive Farbe 【Color】", + "【thumbColor】 : Farbe des Reglers 【Color】", + "【divisions】 : Anzahl der Abschnitte 【int】", + "【onChangeStart】 : Rückruf beim Start des Verschiebens 【Function(double)】", + "【onChangeEnd】 : Rückruf beim Ende des Verschiebens 【Function(double)】", + "【onChanged】 : Rückruf bei Änderung 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json new file mode 100644 index 00000000..d8ca6668 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS Slider", + "info": "An iOS-style slider component that allows dragging to select between a specified maximum and minimum value. You can specify colors and receive callbacks for progress changes.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoSlider", + "desc": [ + "【value】: value 【double】", + "【min】: minimum value 【double】", + "【max】: maximum value 【double】", + "【activeColor】: active color 【Color】", + "【thumbColor】: thumb color 【Color】", + "【divisions】: number of divisions 【int】", + "【onChangeStart】: callback when sliding starts 【Function(double)】", + "【onChangeEnd】: callback when sliding ends 【Function(double)】", + "【onChanged】: callback when value changes 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json new file mode 100644 index 00000000..c14cbf8b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Control deslizante de iOS", + "info": "Componente de control deslizante al estilo de iOS, que permite seleccionar arrastrando entre un valor máximo y mínimo especificados. Se puede especificar el color y recibir una devolución de llamada para los cambios de progreso.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoSlider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : color activo 【Color】", + "【thumbColor】 : color del círculo 【Color】", + "【divisions】 : número de divisiones 【int】", + "【onChangeStart】 : devolución de llamada al comenzar a deslizar 【Function(double)】", + "【onChangeEnd】 : devolución de llamada al finalizar el deslizamiento 【Function(double)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json new file mode 100644 index 00000000..09d1ddd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Curseur iOS", + "info": "Composant curseur de style iOS, permettant de faire glisser et sélectionner entre une valeur minimale et maximale spécifiées. Peut spécifier la couleur et recevoir un rappel de changement de progression.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoSlider", + "desc": [ + "【value】 : valeur 【double】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【activeColor】 : couleur active 【Color】", + "【thumbColor】 : couleur du curseur 【Color】", + "【divisions】 : nombre de divisions 【int】", + "【onChangeStart】 : rappel de début de glissement 【Function(double)】", + "【onChangeEnd】 : rappel de fin de glissement 【Function(double)】", + "【onChanged】 : rappel de changement 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json new file mode 100644 index 00000000..6d3a68f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Cursore iOS", + "info": "Componente cursore in stile iOS, che consente di selezionare trascinando tra un valore massimo e minimo specificato. È possibile specificare il colore e ricevere un callback per le modifiche di avanzamento.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoSlider", + "desc": [ + "【value】 : valore 【double】", + "【min】 : valore minimo 【double】", + "【max】 : valore massimo 【double】", + "【activeColor】 : colore attivo 【Color】", + "【thumbColor】 : colore del cerchio 【Color】", + "【divisions】 : numero di divisioni 【int】", + "【onChangeStart】 : callback di inizio scorrimento 【Function(double)】", + "【onChangeEnd】 : callback di fine scorrimento 【Function(double)】", + "【onChanged】 : callback di modifica 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json new file mode 100644 index 00000000..e0265be8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOSスライダー", + "info": "iOSスタイルのスライダーコンポーネントで、指定された最大値と最小値の間でドラッグして選択できます。色を指定でき、進捗変化のコールバックを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSliderの基本使用", + "desc": [ + "【value】 : 数値 【double】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【activeColor】 : アクティブカラー 【Color】", + "【thumbColor】 : サークルカラー 【Color】", + "【divisions】 : セグメント数 【int】", + "【onChangeStart】 : スライド開始コールバック 【Function(double)】", + "【onChangeEnd】 : スライド終了コールバック 【Function(double)】", + "【onChanged】 : 変更時コールバック 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json new file mode 100644 index 00000000..7ec7d248 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS 슬라이더", + "info": "iOS 스타일의 슬라이더 컴포넌트로, 지정된 최대값과 최소값 사이에서 드래그하여 선택할 수 있습니다. 색상을 지정할 수 있으며, 진행 상황 변화 콜백을 받을 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSlider 기본 사용", + "desc": [ + "【value】 : 값 【double】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【activeColor】 : 활성 색상 【Color】", + "【thumbColor】 : 원형 색상 【Color】", + "【divisions】 : 분할 수 【int】", + "【onChangeStart】 : 슬라이드 시작 콜백 【Function(double)】", + "【onChangeEnd】 : 슬라이드 종료 콜백 【Function(double)】", + "【onChanged】 : 변경 시 콜백 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json new file mode 100644 index 00000000..dc6d97ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "Controlo Deslizante iOS", + "info": "Componente de controlo deslizante no estilo iOS, que permite selecionar arrastando entre um valor máximo e mínimo especificados. Pode-se especificar cores e receber callbacks de mudança de progresso.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoSlider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : cor ativa 【Color】", + "【thumbColor】 : cor do círculo 【Color】", + "【divisions】 : número de divisões 【int】", + "【onChangeStart】 : callback de início de deslize 【Function(double)】", + "【onChangeEnd】 : callback de fim de deslize 【Function(double)】", + "【onChanged】 : callback de mudança 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json new file mode 100644 index 00000000..4c351113 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlider/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 43, + "name": "CupertinoSlider", + "localName": "iOS слайдер", + "info": "Компонент слайдера в стиле iOS, который позволяет выбирать значения путем перетаскивания между указанными минимальным и максимальным значениями. Можно указать цвет и получать обратные вызовы при изменении прогресса.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoSlider", + "desc": [ + "【value】 : значение 【double】", + "【min】 : минимальное значение 【double】", + "【max】 : максимальное значение 【double】", + "【activeColor】 : активный цвет 【Color】", + "【thumbColor】 : цвет круга 【Color】", + "【divisions】 : количество делений 【int】", + "【onChangeStart】 : обратный вызов при начале перетаскивания 【Function(double)】", + "【onChangeEnd】 : обратный вызов при завершении перетаскивания 【Function(double)】", + "【onChanged】 : обратный вызов при изменении 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json new file mode 100644 index 00000000..a6e5aa82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS-Schieberegister", + "info": "iOS-stilisiertes Schieberegister, unterstützt Klicken und Schieben zum Wechseln. Ermöglicht die Angabe von Registerfarben, Hintergrundfarben, Rändern und anderen Eigenschaften.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des iOS-Schieberegisters", + "desc": [ + "【children】 : Komponenten-Map 【Map】", + "【onValueChanged】 : Rückruf bei Wertänderung 【ValueChanged】", + "【groupValue】 : Ausgewählter Wert 【T】", + "【thumbColor】 : Ausgewählte Farbe 【Color】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json new file mode 100644 index 00000000..a00cd8a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS Sliding Tabs", + "info": "iOS-style sliding tabs, supporting click and slide to switch. You can specify tab color, background color, margin and other properties.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of iOS Sliding Tabs", + "desc": [ + "【children】: Component Map 【Map】", + "【onValueChanged】: Value Change Callback 【ValueChanged】", + "【groupValue】: Selected Value 【T】", + "【thumbColor】: Selected Color 【Color】", + "【backgroundColor】: Background Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json new file mode 100644 index 00000000..31cb1f68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Pestañas deslizantes de iOS", + "info": "Pestañas deslizantes al estilo de iOS, que admiten el cambio mediante clics y deslizamientos. Se pueden especificar propiedades como el color de la pestaña, el color de fondo, los márgenes, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de pestañas deslizantes de iOS", + "desc": [ + "【children】: Mapa de componentes 【Map】", + "【onValueChanged】: Callback de cambio de valor 【ValueChanged】", + "【groupValue】: Valor seleccionado 【T】", + "【thumbColor】: Color de selección 【Color】", + "【backgroundColor】: Color de fondo 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json new file mode 100644 index 00000000..3948c259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Onglets coulissants iOS", + "info": "Onglets coulissants de style iOS, prenant en charge le changement par clic ou glissement. Vous pouvez spécifier des propriétés telles que la couleur des onglets, la couleur de fond, les marges, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base des onglets coulissants iOS", + "desc": [ + "【children】 : Map des composants 【Map】", + "【onValueChanged】 : Rappel de changement de valeur 【ValueChanged】", + "【groupValue】 : Valeur sélectionnée 【T】", + "【thumbColor】 : Couleur de sélection 【Color】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json new file mode 100644 index 00000000..f1e82bea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Schede scorrevoli iOS", + "info": "Schede scorrevoli in stile iOS, supportano il passaggio tramite clic e scorrimento. È possibile specificare proprietà come il colore delle schede, il colore di sfondo, i margini, ecc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base delle schede scorrevoli iOS", + "desc": [ + "【children】 : Mappa dei componenti 【Map】", + "【onValueChanged】 : Callback per il cambio di valore 【ValueChanged】", + "【groupValue】 : Valore selezionato 【T】", + "【thumbColor】 : Colore selezionato 【Color】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json new file mode 100644 index 00000000..451a966e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOSスライドタブ", + "info": "iOSスタイルのスライドタブで、クリックやスライドでの切り替えをサポートします。タブの色、背景色、余白などの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOSスライドタブの基本使用", + "desc": [ + "【children】 : コンポーネントMap 【Map】", + "【onValueChanged】 : 値変更コールバック 【ValueChanged】", + "【groupValue】 : 選択値 【T】", + "【thumbColor】 : 選択色 【Color】", + "【backgroundColor】 : 背景色 【Color】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json new file mode 100644 index 00000000..48069794 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS 슬라이딩 탭", + "info": "iOS 스타일의 슬라이딩 탭으로, 클릭 및 슬라이드 전환을 지원합니다. 탭 색상, 배경색, 여백 등 속성을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "iOS 슬라이딩 탭 기본 사용", + "desc": [ + "【children】 : 컴포넌트 맵 【Map】", + "【onValueChanged】 : 값 변경 콜백 【ValueChanged】", + "【groupValue】 : 선택된 값 【T】", + "【thumbColor】 : 선택된 색상 【Color】", + "【backgroundColor】 : 배경색 【Color】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json new file mode 100644 index 00000000..7f6034f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "Separador deslizante iOS", + "info": "Separador deslizante ao estilo iOS, suporta alternância por toque e deslize. Permite especificar propriedades como cor do separador, cor de fundo, margens, etc.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do separador deslizante iOS", + "desc": [ + "【children】 : Mapa de componentes 【Map】", + "【onValueChanged】 : Callback de mudança de valor 【ValueChanged】", + "【groupValue】 : Valor selecionado 【T】", + "【thumbColor】 : Cor de seleção 【Color】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json new file mode 100644 index 00000000..c8696f4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSlidingSegmentedControl/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 256, + "name": "CupertinoSlidingSegmentedControl", + "localName": "iOS слайдер вкладок", + "info": "Слайдер вкладок в стиле iOS, поддерживает переключение по клику и скольжению. Можно указать цвет вкладок, цвет фона, отступы и другие свойства.", + "lever": 3, + "family": 1, + "linkIds": [ + 33, + 262 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование iOS слайдера вкладок", + "desc": [ + "【children】 : Карта компонентов 【Map】", + "【onValueChanged】 : Обратный вызов при изменении значения 【ValueChanged】", + "【groupValue】 : Выбранное значение 【T】", + "【thumbColor】 : Цвет выбранного элемента 【Color】", + "【backgroundColor】 : Цвет фона 【Color】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json new file mode 100644 index 00000000..56853543 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS-Schalter", + "info": "Ein iOS-stilbasierter Umschalter, der häufig für die Konfigurationsumschaltung verwendet wird, kann Farben angeben und empfängt Rückrufe für Zustandsänderungen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoSwitch", + "desc": [ + "【value】 : Ob ausgewählt 【double】", + "【activeColor】 : Farbe im aktivierten Zustand 【Color】", + "【onChanged】 : Umschalt-Rückruf 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json new file mode 100644 index 00000000..c4226620 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS Switch", + "info": "An iOS-style toggle switch, commonly used for configuration toggles, can specify colors, and receives state change callbacks.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoSwitch", + "desc": [ + "【value】: Whether it is selected 【double】", + "【activeColor】: Active state color 【Color】", + "【onChanged】: Toggle callback 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json new file mode 100644 index 00000000..06036299 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruptor iOS", + "info": "Interruptor de estilo iOS, comúnmente utilizado para cambiar configuraciones, se puede especificar el color y recibe una devolución de llamada para cambios de estado.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoSwitch", + "desc": [ + "【value】 : si está seleccionado 【double】", + "【activeColor】 : color del estado activo 【Color】", + "【onChanged】 : devolución de llamada de cambio 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json new file mode 100644 index 00000000..a3f01795 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Bouton de commutation iOS", + "info": "Bouton de commutation de style iOS, souvent utilisé pour la commutation de configuration, peut spécifier la couleur et recevoir un rappel de changement d'état.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoSwitch", + "desc": [ + "【value】 : Est-ce sélectionné 【double】", + "【activeColor】 : Couleur de l'état actif 【Color】", + "【onChanged】 : Rappel de commutation 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json new file mode 100644 index 00000000..18d6fe7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruttore iOS", + "info": "Interruttore in stile iOS, comunemente utilizzato per il cambio di configurazione, può specificare il colore e riceve un callback per i cambiamenti di stato.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoSwitch", + "desc": [ + "【value】 : Se è selezionato 【double】", + "【activeColor】 : Colore dello stato attivo 【Color】", + "【onChanged】 : Callback di cambio 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json new file mode 100644 index 00000000..7d8343e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOSスイッチ", + "info": "iOSスタイルのトグルスイッチ。設定の切り替えに頻繁に使用され、色を指定でき、状態変化のコールバックを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitchの基本使用", + "desc": [ + "【value】 : 選択されているかどうか 【double】", + "【activeColor】 : アクティブ状態の色 【Color】", + "【onChanged】 : 切り替えコールバック 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json new file mode 100644 index 00000000..de3ac158 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS 스위치", + "info": "iOS 스타일의 토글 스위치로, 설정 전환에 자주 사용되며 색상을 지정할 수 있고 상태 변화 콜백을 받습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoSwitch 기본 사용법", + "desc": [ + "【value】 : 선택 여부 【double】", + "【activeColor】 : 활성 상태 색상 【Color】", + "【onChanged】 : 전환 콜백 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json new file mode 100644 index 00000000..cbc0fa54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "Interruptor iOS", + "info": "Interruptor de estilo iOS, frequentemente usado para alternar configurações, pode especificar cores e receber callbacks de mudança de estado.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoSwitch", + "desc": [ + "【value】 : Se está selecionado 【double】", + "【activeColor】 : Cor do estado ativo 【Color】", + "【onChanged】 : Callback de alternância 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json new file mode 100644 index 00000000..f8f139a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoSwitch/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 41, + "name": "CupertinoSwitch", + "localName": "iOS переключатель", + "info": "Переключатель в стиле iOS, часто используется для переключения настроек, может быть указан цвет, получает обратный вызов при изменении состояния.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoSwitch", + "desc": [ + "【value】 : выбрано ли 【double】", + "【activeColor】 : цвет активного состояния 【Color】", + "【onChanged】 : обратный вызов переключения 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json new file mode 100644 index 00000000..43f67a67 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS-Tab", + "info": "Ein iOS-stilvoller TabBar, der normalerweise für CupertinoTabScaffold verwendet wird. Kann Farben, Symbolgrößen, Ränder usw. angeben. Empfängt Klickereignisse für Elemente.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabBar", + "desc": [ + "【currentIndex】 : Aktueller aktivierter Index 【Widget】", + "【items】 : Elementkomponenten 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【activeColor】 : Aktive Farbe 【Color】", + "【iconSize】 : Symbolgröße 【double】", + "【border】 : Rand 【Border】", + "【onTap】 : Klickereignis 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json new file mode 100644 index 00000000..dd8e2771 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS Tab", + "info": "An iOS-style TabBar, typically used in CupertinoTabScaffold. Can specify color, icon size, border, and other data. Receives item click events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabBar", + "desc": [ + "【currentIndex】 : Current active index 【Widget】", + "【items】 : Item components 【Widget】", + "【backgroundColor】 : Background color 【Color】", + "【inactiveColor】 : Inactive color 【Color】", + "【activeColor】 : Active color 【Color】", + "【iconSize】 : Icon size 【double】", + "【border】 : Border 【Border】", + "【onTap】 : Click event 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json new file mode 100644 index 00000000..bb3d7022 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Pestañas iOS", + "info": "Un TabBar de estilo iOS, generalmente utilizado en CupertinoTabScaffold. Se pueden especificar datos como el color, el tamaño del icono, el borde, etc. Recibe eventos de clic en los elementos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabBar", + "desc": [ + "【currentIndex】 : Índice activo actual 【Widget】", + "【items】 : Componentes de elementos 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【inactiveColor】 : Color inactivo 【Color】", + "【activeColor】 : Color activo 【Color】", + "【iconSize】 : Tamaño del icono 【double】", + "【border】 : Borde 【Border】", + "【onTap】 : Evento de clic 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json new file mode 100644 index 00000000..6ff1d38a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Onglets iOS", + "info": "Une barre d'onglets de style iOS, généralement utilisée dans CupertinoTabScaffold. Peut spécifier des données telles que la couleur, la taille des icônes, les bordures, etc. Reçoit les événements de clic sur les éléments.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabBar", + "desc": [ + "【currentIndex】 : Index actif actuel 【Widget】", + "【items】 : Composants des éléments 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【inactiveColor】 : Couleur inactive 【Color】", + "【activeColor】 : Couleur active 【Color】", + "【iconSize】 : Taille de l'icône 【double】", + "【border】 : Bordure 【Border】", + "【onTap】 : Événement de clic 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json new file mode 100644 index 00000000..a84652e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Schede iOS", + "info": "Una TabBar in stile iOS, solitamente utilizzata in CupertinoTabScaffold. È possibile specificare colore, dimensione delle icone, bordi, ecc. Riceve gli eventi di click sugli item.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di CupertinoTabBar", + "desc": [ + "【currentIndex】 : Indice attualmente attivo 【Widget】", + "【items】 : Componenti degli elementi 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【inactiveColor】 : Colore inattivo 【Color】", + "【activeColor】 : Colore attivo 【Color】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【border】 : Bordo 【Border】", + "【onTap】 : Evento di click 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json new file mode 100644 index 00000000..1a014345 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOSタブ", + "info": "iOSスタイルのTabBarで、通常CupertinoTabScaffoldで使用されます。色、アイコンサイズ、ボーダーなどのデータを指定できます。アイテムのクリックイベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBarの基本使い方", + "desc": [ + "【currentIndex】 : 現在のアクティブインデックス 【Widget】", + "【items】 : アイテムコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【inactiveColor】 : 非アクティブ色 【Color】", + "【activeColor】 : アクティブ色 【Color】", + "【iconSize】 : アイコンサイズ 【double】", + "【border】 : ボーダー 【Border】", + "【onTap】 : クリックイベント 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json new file mode 100644 index 00000000..d97ac75a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS 탭", + "info": "iOS 스타일의 TabBar로, 일반적으로 CupertinoTabScaffold에서 사용됩니다. 색상, 아이콘 크기, 테두리 등을 지정할 수 있습니다. 아이템의 클릭 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabBar 기본 사용법", + "desc": [ + "【currentIndex】 : 현재 활성화된 인덱스 【Widget】", + "【items】 : 항목 위젯 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【activeColor】 : 활성화 색상 【Color】", + "【iconSize】 : 아이콘 크기 【double】", + "【border】 : 테두리 【Border】", + "【onTap】 : 클릭 이벤트 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json new file mode 100644 index 00000000..9b9feb28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "Separador de Páginas iOS", + "info": "Um TabBar de estilo iOS, geralmente usado em CupertinoTabScaffold. Pode especificar dados como cor, tamanho do ícone, borda, etc. Recebe eventos de clique nos itens.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoTabBar", + "desc": [ + "【currentIndex】 : Índice ativo atual 【Widget】", + "【items】 : Componentes dos itens 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【inactiveColor】 : Cor inativa 【Color】", + "【activeColor】 : Cor ativa 【Color】", + "【iconSize】 : Tamanho do ícone 【double】", + "【border】 : Borda 【Border】", + "【onTap】 : Evento de clique 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json new file mode 100644 index 00000000..3f1d1832 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabBar/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 63, + "name": "CupertinoTabBar", + "localName": "iOS вкладки", + "info": "TabBar в стиле iOS, обычно используется в CupertinoTabScaffold. Можно указать цвет, размер иконок, границы и другие данные. Получает события кликов по элементам.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabBar", + "desc": [ + "【currentIndex】 : текущий активный индекс 【Widget】", + "【items】 : компоненты элементов 【Widget】", + "【backgroundColor】 : цвет фона 【Color】", + "【inactiveColor】 : цвет неактивного элемента 【Color】", + "【activeColor】 : цвет активного элемента 【Color】", + "【iconSize】 : размер иконки 【double】", + "【border】 : граница 【Border】", + "【onTap】 : событие клика 【Function(int)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json new file mode 100644 index 00000000..b8719704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS-Tab-Scaffold", + "info": "iOS-stilisiertes Seitenlayout-Scaffold, das eine Navigationsleiste am unteren Rand und eine Hauptinhaltseite festlegen kann.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Tab-Leiste 【CupertinoTabBar】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【controller】 : Controller 【CupertinoTabController】", + "【tabBuilder】 : Seitenkonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json new file mode 100644 index 00000000..1ab677a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS Tab Scaffold", + "info": "iOS style page layout scaffold structure, which can specify the bottom navigation bar and the main content page.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabScaffold", + "desc": [ + "【tabBar】: Tab bar 【CupertinoTabBar】", + "【backgroundColor】: Background color 【Color】", + "【controller】: Controller 【CupertinoTabController】", + "【tabBuilder】: Page builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json new file mode 100644 index 00000000..2b2cfcd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Andamio de pestañas iOS", + "info": "Estructura de andamio de diseño de página al estilo iOS, que permite especificar la barra de navegación inferior y la página de contenido principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra de pestañas 【CupertinoTabBar】", + "【backgroundColor】 : Color de fondo 【Color】", + "【controller】 : Controlador 【CupertinoTabController】", + "【tabBuilder】 : Constructor de página 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json new file mode 100644 index 00000000..f0c9844e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Échafaudage d'onglets iOS", + "info": "Structure d'échafaudage de mise en page de style iOS, permettant de spécifier la barre de navigation en bas et la page de contenu principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barre d'onglets 【CupertinoTabBar】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【controller】 : Contrôleur 【CupertinoTabController】", + "【tabBuilder】 : Constructeur de page 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json new file mode 100644 index 00000000..66dcdb49 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Impalcatura a schede iOS", + "info": "Struttura di impalcatura per layout di pagine in stile iOS, con barra di navigazione inferiore e pagina principale specificabili.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra delle schede 【CupertinoTabBar】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【controller】 : Controllore 【CupertinoTabController】", + "【tabBuilder】 : Costruttore di pagine 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json new file mode 100644 index 00000000..5dc3ca23 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOSタブスキャフォールド", + "info": "iOSスタイルのページレイアウトスキャフォールド構造で、最下部のナビゲーションバーとメインコンテンツページを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold基本使用法", + "desc": [ + "【tabBar】 : タブバー 【CupertinoTabBar】", + "【backgroundColor】 : 背景色 【Color】", + "【controller】 : コントローラー 【CupertinoTabController】", + "【tabBuilder】 : ページビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json new file mode 100644 index 00000000..fc87a350 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS 탭 스캐폴드", + "info": "iOS 스타일의 페이지 레이아웃 스캐폴드 구조, 최하단의 네비게이션 전환 바와 주 내용 페이지를 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabScaffold 기본 사용법", + "desc": [ + "【tabBar】 : 탭 바 【CupertinoTabBar】", + "【backgroundColor】 : 배경색 【Color】", + "【controller】 : 컨트롤러 【CupertinoTabController】", + "【tabBuilder】 : 페이지 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json new file mode 100644 index 00000000..e0895619 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "Estrutura de Scaffold de Abas iOS", + "info": "Estrutura de scaffold de layout de página no estilo iOS, que permite especificar a barra de navegação no fundo e a página de conteúdo principal.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Barra de Abas 【CupertinoTabBar】", + "【backgroundColor】 : Cor de Fundo 【Color】", + "【controller】 : Controlador 【CupertinoTabController】", + "【tabBuilder】 : Construtor de Páginas 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json new file mode 100644 index 00000000..448d9d93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabScaffold/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 158, + "name": "CupertinoTabScaffold", + "localName": "iOS каркас вкладок", + "info": "iOS-стиль каркаса макета страницы, который позволяет указать нижнюю панель навигации и основную страницу контента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabScaffold", + "desc": [ + "【tabBar】 : Панель вкладок 【CupertinoTabBar】", + "【backgroundColor】 : Цвет фона 【Color】", + "【controller】 : Контроллер 【CupertinoTabController】", + "【tabBuilder】 : Конструктор страницы 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json new file mode 100644 index 00000000..d3da3a86 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino-Seite", + "info": "Kann wie MaterialApp einen Navigationsstapel verwalten. Routen werden über routes und onGenerateRoute erstellt, und die Navigation kann über navigatorObservers überwacht werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTabView", + "desc": [ + "【builder】: Hauptseitenkonstruktor 【WidgetBuilder】", + "【navigatorObservers】: Routenbeobachter 【List】", + "【routes】: Routenzuordnung 【Map】", + "【onGenerateRoute】: Routenfabrik 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json new file mode 100644 index 00000000..821498eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino Page", + "info": "Can maintain a routing stack like MaterialApp. Build routes through routes and onGenerateRoute, and listen to routes through navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTabView", + "desc": [ + "【builder】 : Homepage builder 【WidgetBuilder】", + "【navigatorObservers】 : Route observers 【List】", + "【routes】 : Route mapping 【Map】", + "【onGenerateRoute】 : Route factory 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json new file mode 100644 index 00000000..21f797ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Página de Cupertino", + "info": "Puede mantener una pila de rutas como MaterialApp. Construye rutas a través de routes y onGenerateRoute, y puede escuchar rutas a través de navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTabView", + "desc": [ + "【builder】 : Constructor de la página principal 【WidgetBuilder】", + "【navigatorObservers】 : Observador de rutas 【List】", + "【routes】 : Mapeo de rutas 【Map】", + "【onGenerateRoute】 : Fábrica de rutas 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json new file mode 100644 index 00000000..e6c22686 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Page Cupertino", + "info": "Peut maintenir une pile de routes comme MaterialApp. Construit les routes via routes et onGenerateRoute, et peut écouter les routes via navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTabView", + "desc": [ + "【builder】 : Constructeur de la page d'accueil 【WidgetBuilder】", + "【navigatorObservers】 : Observateur de routes 【List】", + "【routes】 : Mappage des routes 【Map】", + "【onGenerateRoute】 : Usine de routes 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json new file mode 100644 index 00000000..33b5f232 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Pagina Cupertino", + "info": "Può mantenere uno stack di routing come MaterialApp. Costruisce il routing tramite routes e onGenerateRoute, e può monitorare il routing tramite navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTabView", + "desc": [ + "【builder】: Costruttore della pagina principale 【WidgetBuilder】", + "【navigatorObservers】: Osservatore di routing 【List】", + "【routes】: Mappatura del routing 【Map】", + "【onGenerateRoute】: Fabbrica di routing 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json new file mode 100644 index 00000000..c47c93fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertinoページ", + "info": "MaterialAppのようにルートスタックを維持できます。routes、onGenerateRouteを使用してルートを構築し、navigatorObserversでルートを監視できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabViewの基本使用", + "desc": [ + "【builder】 : ホームページビルダー 【WidgetBuilder】", + "【navigatorObservers】 : ルート監視者 【List】", + "【routes】 : ルートマッピング 【Map】", + "【onGenerateRoute】 : ルートファクトリ 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json new file mode 100644 index 00000000..fd8f866a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino 페이지", + "info": "MaterialApp과 같이 라우팅 스택을 유지할 수 있습니다. routes, onGenerateRoute를 통해 라우팅을 구성하고, navigatorObservers를 통해 라우팅을 모니터링할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTabView 기본 사용법", + "desc": [ + "【builder】 : 홈페이지 빌더 【WidgetBuilder】", + "【navigatorObservers】 : 라우팅 리스너 【List】", + "【routes】 : 라우팅 매핑 【Map】", + "【onGenerateRoute】 : 라우팅 팩토리 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json new file mode 100644 index 00000000..84eab5e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Página Cupertino", + "info": "Pode manter uma pilha de rotas como o MaterialApp. Constrói rotas através de routes e onGenerateRoute, e pode monitorar rotas com navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTabView", + "desc": [ + "【builder】 : Construtor da página inicial 【WidgetBuilder】", + "【navigatorObservers】 : Observador de rotas 【List】", + "【routes】 : Mapeamento de rotas 【Map】", + "【onGenerateRoute】 : Fábrica de rotas 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json new file mode 100644 index 00000000..868182b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTabView/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 229, + "name": "CupertinoTabView", + "localName": "Cupertino страница", + "info": "Может поддерживать стек маршрутов, как MaterialApp. Маршруты строятся через routes и onGenerateRoute, можно отслеживать маршруты через navigatorObservers.", + "lever": 3, + "family": 1, + "linkIds": [ + 65, + 158 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTabView", + "desc": [ + "【builder】 : Конструктор главной страницы 【WidgetBuilder】", + "【navigatorObservers】 : Наблюдатель маршрутов 【List】", + "【routes】 : Карта маршрутов 【Map】", + "【onGenerateRoute】 : Фабрика маршрутов 【RouteFactory】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json new file mode 100644 index 00000000..4a8ec787 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_de_DE.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS-Stil Eingabefeld", + "info": "Cupertino-stilisiertes Eingabefeld, ähnliche Eigenschaften wie TextField, kann Controller, Textstil, Dekorationslinien, Zeilenbegrenzung, Cursor-Stil usw. angeben. Empfängt Ereignisse wie Eingabeänderungen und Eingabeabschluss.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTextField", + "desc": [ + "【placeholder】 : Hinweistext 【String】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【minLines】 : Mindestanzahl von Zeilen 【int】", + "【maxLines】 : Maximale Anzahl von Zeilen 【int】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【onChanged】 : Änderungsüberwachung 【ValueChanged】", + "【onTap】: Klicküberwachung 【GestureTapCallback】", + "【onSubmitted】: Übermittlungsüberwachung 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Häufig verwendete Stileigenschaften von CupertinoTextField", + "desc": [ + "【style】 : Eingabetextstil 【TextStyle】", + "【prefix】: Präfix-Komponente 【Widget】", + "【prefixMode】: Präfix-Modus 【OverlayVisibilityMode】", + "【suffix】: Suffix-Komponente 【Widget】", + "【suffixMode】: Suffix-Modus 【OverlayVisibilityMode】", + "【cursorColor】: Cursor-Farbe 【Color】", + "【cursorWidth】: Cursor-Breite 【double】", + "【cursorRadius】: Cursor-Radius 【Radius】", + "【readOnly】: Nur lesen 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json new file mode 100644 index 00000000..68079c3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_en_US.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS Style Input Box", + "info": "Cupertino style input box, properties are similar to TextField, can specify controller, text style, decoration line, line limit, cursor style, etc. Receives input change, input completion and other events.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTextField", + "desc": [ + "【placeholder】 : Hint text 【String】", + "【showCursor】 : Whether to show cursor 【bool】", + "【minLines】 : Minimum number of lines 【int】", + "【maxLines】 : Maximum number of lines 【int】", + "【padding】 : Padding 【EdgeInsetsGeometry】", + "【onChanged】 : Change listener 【ValueChanged】", + "【onTap】: Tap listener 【GestureTapCallback】", + "【onSubmitted】: Submit listener 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Common Style Properties of CupertinoTextField", + "desc": [ + "【style】 : Input text style 【TextStyle】", + "【prefix】: Prefix component 【Widget】", + "【prefixMode】: Prefix mode 【OverlayVisibilityMode】", + "【suffix】: Suffix component 【Widget】", + "【suffixMode】: Suffix mode 【OverlayVisibilityMode】", + "【cursorColor】: Cursor color 【Color】", + "【cursorWidth】: Cursor width 【double】", + "【cursorRadius】: Cursor radius 【Radius】", + "【readOnly】: Whether read-only 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json new file mode 100644 index 00000000..5e587a02 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_es_ES.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo de texto estilo iOS", + "info": "Campo de texto de estilo Cupertino, con propiedades similares a TextField, se puede especificar controlador, estilo de texto, línea de decoración, límite de líneas, estilo de cursor, etc. Recibe eventos de cambio de entrada, finalización de entrada, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTextField", + "desc": [ + "【placeholder】 : Texto de sugerencia 【String】", + "【showCursor】 : Mostrar cursor 【bool】", + "【minLines】 : Número mínimo de líneas 【int】", + "【maxLines】 : Número máximo de líneas 【int】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【onChanged】 : Escucha de cambios 【ValueChanged】", + "【onTap】: Escucha de clics 【GestureTapCallback】", + "【onSubmitted】: Escucha de envío 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propiedades de estilo comunes de CupertinoTextField", + "desc": [ + "【style】 : Estilo del texto de entrada 【TextStyle】", + "【prefix】: Componente de prefijo 【Widget】", + "【prefixMode】: Modo de prefijo 【OverlayVisibilityMode】", + "【suffix】: Componente de sufijo 【Widget】", + "【suffixMode】: Modo de sufijo 【OverlayVisibilityMode】", + "【cursorColor】: Color del cursor 【Color】", + "【cursorWidth】: Ancho del cursor 【double】", + "【cursorRadius】: Radio del cursor 【Radius】", + "【readOnly】: Solo lectura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json new file mode 100644 index 00000000..69274be1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_fr_FR.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Champ de saisie de style iOS", + "info": "Champ de saisie de style Cupertino, les propriétés sont similaires à TextField, peut spécifier un contrôleur, le style du texte, la décoration, la limite de lignes, le style du curseur, etc. Reçoit des événements tels que les changements d'entrée, la fin de la saisie, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTextField", + "desc": [ + "【placeholder】 : Texte d'indication 【String】", + "【showCursor】 : Afficher le curseur 【bool】", + "【minLines】 : Nombre minimum de lignes 【int】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【onChanged】 : Écouteur de changement 【ValueChanged】", + "【onTap】: Écouteur de clic 【GestureTapCallback】", + "【onSubmitted】: Écouteur de soumission 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propriétés de style courantes de CupertinoTextField", + "desc": [ + "【style】 : Style du texte saisi 【TextStyle】", + "【prefix】: Composant de préfixe 【Widget】", + "【prefixMode】: Mode de préfixe 【OverlayVisibilityMode】", + "【suffix】: Composant de suffixe 【Widget】", + "【suffixMode】: Mode de suffixe 【OverlayVisibilityMode】", + "【cursorColor】: Couleur du curseur 【Color】", + "【cursorWidth】: Largeur du curseur 【double】", + "【cursorRadius】: Rayon du curseur 【Radius】", + "【readOnly】: Lecture seule 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json new file mode 100644 index 00000000..b6ea2672 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_it_IT.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo di testo in stile iOS", + "info": "Campo di testo in stile Cupertino, le proprietà sono simili a TextField, è possibile specificare il controller, lo stile del testo, la decorazione, il limite di righe, lo stile del cursore, ecc. Riceve eventi come cambiamenti di input, completamento dell'input, ecc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTextField", + "desc": [ + "【placeholder】 : Testo suggerito 【String】", + "【showCursor】 : Mostra il cursore 【bool】", + "【minLines】 : Numero minimo di righe 【int】", + "【maxLines】 : Numero massimo di righe 【int】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【onChanged】 : Ascolta i cambiamenti 【ValueChanged】", + "【onTap】: Ascolta i clic 【GestureTapCallback】", + "【onSubmitted】: Ascolta l'invio 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Proprietà di stile comuni di CupertinoTextField", + "desc": [ + "【style】 : Stile del testo di input 【TextStyle】", + "【prefix】: Componente prefisso 【Widget】", + "【prefixMode】: Modalità prefisso 【OverlayVisibilityMode】", + "【suffix】: Componente suffisso 【Widget】", + "【suffixMode】: Modalità suffisso 【OverlayVisibilityMode】", + "【cursorColor】: Colore del cursore 【Color】", + "【cursorWidth】: Larghezza del cursore 【double】", + "【cursorRadius】: Raggio del cursore 【Radius】", + "【readOnly】: Solo lettura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json new file mode 100644 index 00000000..f465bfe9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ja_JP.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOSスタイルの入力ボックス", + "info": "Cupertinoスタイルの入力ボックス。プロパティはTextFieldと類似しており、コントローラー、テキストスタイル、デコレーションライン、行数制限、カーソルスタイルなどを指定できます。入力変更や入力完了などのイベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextFieldの基本使用", + "desc": [ + "【placeholder】 : ヒントテキスト 【String】", + "【showCursor】 : カーソルを表示するかどうか 【bool】", + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【onChanged】 : 変更リスナー 【ValueChanged】", + "【onTap】: クリックリスナー 【GestureTapCallback】", + "【onSubmitted】: 送信リスナー 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextFieldの一般的なスタイルプロパティ", + "desc": [ + "【style】 : 入力テキストスタイル 【TextStyle】", + "【prefix】: プレフィックスコンポーネント 【Widget】", + "【prefixMode】: プレフィックスモード 【OverlayVisibilityMode】", + "【suffix】: サフィックスコンポーネント 【Widget】", + "【suffixMode】: サフィックスモード 【OverlayVisibilityMode】", + "【cursorColor】: カーソルカラー 【Color】", + "【cursorWidth】: カーソル幅 【double】", + "【cursorRadius】: カーソルの角丸 【Radius】", + "【readOnly】: 読み取り専用かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json new file mode 100644 index 00000000..0b2a5e1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ko_KR.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "iOS 스타일 입력 필드", + "info": "Cupertino 스타일의 입력 필드, 속성은 TextField와 유사하며, 컨트롤러, 텍스트 스타일, 장식선, 줄 수 제한, 커서 스타일 등을 지정할 수 있습니다. 입력 변화, 입력 완료 등의 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTextField 기본 사용", + "desc": [ + "【placeholder】 : 힌트 텍스트 【String】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【minLines】 : 최소 줄 수 【int】", + "【maxLines】 : 최대 줄 수 【int】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【onChanged】 : 변경 감지 【ValueChanged】", + "【onTap】: 클릭 감지 【GestureTapCallback】", + "【onSubmitted】: 제출 감지 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "CupertinoTextField 일반 스타일 속성", + "desc": [ + "【style】 : 입력 텍스트 스타일 【TextStyle】", + "【prefix】: 접두사 컴포넌트 【Widget】", + "【prefixMode】: 접두사 모드 【OverlayVisibilityMode】", + "【suffix】: 접미사 컴포넌트 【Widget】", + "【suffixMode】: 접미사 모드 【OverlayVisibilityMode】", + "【cursorColor】: 커서 색상 【Color】", + "【cursorWidth】: 커서 너비 【double】", + "【cursorRadius】: 커서 모서리 반경 【Radius】", + "【readOnly】: 읽기 전용 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json new file mode 100644 index 00000000..aea2caf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_pt_PT.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Campo de entrada estilo iOS", + "info": "Campo de entrada no estilo Cupertino, com propriedades semelhantes ao TextField, pode especificar controlador, estilo de texto, decoração de linha, limite de linhas, estilo do cursor, etc. Recebe eventos de mudança de entrada, conclusão de entrada, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTextField", + "desc": [ + "【placeholder】 : Texto de dica 【String】", + "【showCursor】 : Mostrar cursor 【bool】", + "【minLines】 : Número mínimo de linhas 【int】", + "【maxLines】 : Número máximo de linhas 【int】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【onChanged】 : Monitoramento de mudanças 【ValueChanged】", + "【onTap】: Monitoramento de clique 【GestureTapCallback】", + "【onSubmitted】: Monitoramento de submissão 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Propriedades de estilo comuns do CupertinoTextField", + "desc": [ + "【style】 : Estilo do texto de entrada 【TextStyle】", + "【prefix】: Componente de prefixo 【Widget】", + "【prefixMode】: Modo de prefixo 【OverlayVisibilityMode】", + "【suffix】: Componente de sufixo 【Widget】", + "【suffixMode】: Modo de sufixo 【OverlayVisibilityMode】", + "【cursorColor】: Cor do cursor 【Color】", + "【cursorWidth】: Largura do cursor 【double】", + "【cursorRadius】: Raio do cursor 【Radius】", + "【readOnly】: Somente leitura 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json new file mode 100644 index 00000000..4e593762 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTextField/desc_ru_RU.json @@ -0,0 +1,40 @@ +{ + "id": 245, + "name": "CupertinoTextField", + "localName": "Текстовое поле в стиле iOS", + "info": "Текстовое поле в стиле Cupertino, свойства аналогичны TextField, можно указать контроллер, стиль текста, декоративные линии, ограничение на количество строк, стиль курсора и т.д. Получает события изменения ввода, завершения ввода и другие.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTextField", + "desc": [ + "【placeholder】 : Подсказка 【String】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【minLines】 : Минимальное количество строк 【int】", + "【maxLines】 : Максимальное количество строк 【int】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【onChanged】 : Слушатель изменений 【ValueChanged】", + "【onTap】: Слушатель нажатия 【GestureTapCallback】", + "【onSubmitted】: Слушатель отправки 【ValueChanged】" + ] + }, + { + "file": "node2_style.dart", + "name": "Общие стилевые свойства CupertinoTextField", + "desc": [ + "【style】 : Стиль текста ввода 【TextStyle】", + "【prefix】: Префиксный компонент 【Widget】", + "【prefixMode】: Режим префикса 【OverlayVisibilityMode】", + "【suffix】: Суффиксный компонент 【Widget】", + "【suffixMode】: Режим суффикса 【OverlayVisibilityMode】", + "【cursorColor】: Цвет курсора 【Color】", + "【cursorWidth】: Ширина курсора 【double】", + "【cursorRadius】: Радиус закругления курсора 【Radius】", + "【readOnly】: Только для чтения 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json new file mode 100644 index 00000000..c475d3a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS-Zeitauswahl", + "info": "Hochwertiger Zeitauswahl-Schieberegler, der den ausgewählten Typ, die Anfangszeit, die Hintergrundfarbe usw. angeben kann und Zeitauswahlereignisse empfängt.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Anfangszeit 【Duration】", + "【minuteInterval】 : Minutenintervall 【double】", + "【secondInterval】 : Sekundenintervall 【double】", + "【alignment】 : Ausrichtung 【AlignmentGeometry】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【mode】 : Modus*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json new file mode 100644 index 00000000..820b4f2f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS Time Picker", + "info": "A high-end rolling time picker that allows you to specify the type of selection, initial time, background color, etc., and receives time selection events.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】: Initial time 【Duration】", + "【minuteInterval】: Minute interval 【double】", + "【secondInterval】: Second interval 【double】", + "【alignment】: Alignment 【AlignmentGeometry】", + "【backgroundColor】: Background color 【Color】", + "【mode】: Mode*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json new file mode 100644 index 00000000..7c6a97ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Selector de tiempo de iOS", + "info": "Selector de tiempo de desplazamiento de alta gama, que puede especificar el tipo de selección, la hora inicial, el color de fondo, etc., y recibe eventos de selección de tiempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Hora inicial 【Duration】", + "【minuteInterval】 : Intervalo de minutos 【double】", + "【secondInterval】 : Intervalo de segundos 【double】", + "【alignment】 : Alineación 【AlignmentGeometry】", + "【backgroundColor】 : Color de fondo 【Color】", + "【mode】 : Modo*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json new file mode 100644 index 00000000..368b6894 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Sélecteur de temps iOS", + "info": "Sélecteur de temps haut de gamme avec défilement, permet de spécifier le type de sélection, l'heure initiale, la couleur de fond, etc., et reçoit les événements de sélection de temps.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Durée initiale 【Duration】", + "【minuteInterval】 : Intervalle de minutes 【double】", + "【secondInterval】 : Intervalle de secondes 【double】", + "【alignment】 : Alignement 【AlignmentGeometry】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【mode】 : Mode*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json new file mode 100644 index 00000000..51739025 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Selettore di tempo iOS", + "info": "Un selettore di tempo di scorrimento di alta gamma, che consente di specificare il tipo di selezione, l'ora iniziale, il colore di sfondo, ecc., e riceve l'evento di selezione del tempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Ora iniziale 【Duration】", + "【minuteInterval】 : Intervallo di minuti 【double】", + "【secondInterval】 : Intervallo di secondi 【double】", + "【alignment】 : Allineamento 【AlignmentGeometry】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【mode】 : Modalità*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json new file mode 100644 index 00000000..9ff54547 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOSタイムピッカー", + "info": "高級感のあるスクロールタイムピッカーで、選択するタイプ、初期時間、背景色などを指定でき、時間選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPickerの基本使用", + "desc": [ + "【initialTimerDuration】 : 初期時間 【Duration】", + "【minuteInterval】 : 分間隔数 【double】", + "【secondInterval】 : 秒間隔数 【double】", + "【alignment】 : 配置方法 【AlignmentGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【mode】 : モード*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json new file mode 100644 index 00000000..391b966d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS 시간 선택기", + "info": "고급스러운 스크롤 시간 선택기로, 선택 유형, 초기 시간, 배경색 등을 지정할 수 있으며, 시간 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoTimerPicker 기본 사용법", + "desc": [ + "【initialTimerDuration】 : 초기 시간 【Duration】", + "【minuteInterval】 : 분 간격 수 【double】", + "【secondInterval】 : 초 간격 수 【double】", + "【alignment】 : 정렬 방식 【AlignmentGeometry】", + "【backgroundColor】 : 배경색 【Color】", + "【mode】 : 모드*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json new file mode 100644 index 00000000..cb65335f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "Seletor de Tempo iOS", + "info": "Um seletor de tempo sofisticado com rolagem, que permite especificar o tipo de seleção, hora inicial, cor de fundo, etc., e recebe eventos de seleção de tempo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Hora inicial 【Duration】", + "【minuteInterval】 : Intervalo de minutos 【double】", + "【secondInterval】 : Intervalo de segundos 【double】", + "【alignment】 : Alinhamento 【AlignmentGeometry】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【mode】 : Modo*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json new file mode 100644 index 00000000..9c784f5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/CupertinoTimerPicker/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 138, + "name": "CupertinoTimerPicker", + "localName": "iOS-таймер выбора времени", + "info": "Стильный скроллинг-таймер выбора времени, позволяющий указать тип выбора, начальное время, цвет фона и т.д., а также получать события выбора времени.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoTimerPicker", + "desc": [ + "【initialTimerDuration】 : Начальное время 【Duration】", + "【minuteInterval】 : Интервал минут 【double】", + "【secondInterval】 : Интервал секунд 【double】", + "【alignment】 : Способ выравнивания 【AlignmentGeometry】", + "【backgroundColor】 : Цвет фона 【Color】", + "【mode】 : Режим*3 【CupertinoTimerPickerMode】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json new file mode 100644 index 00000000..316f6047 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Datumsbereich", + "info": "Material-stil Datumsbereichsauswahl, unterstützt Kalenderauswahl und Eingabeauswahl.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog grundlegende Verwendung", + "desc": [ + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【initialDateRange】 : Anfangsbereich 【DateTimeRange?】", + "【saveText】 : Speichern Text 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog anpassen", + "desc": [ + "Ändern Sie den Quellcode von DateRangePickerDialog, sodass Monatseinträge numerische Hintergründe anzeigen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json new file mode 100644 index 00000000..0107b9c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Date Range", + "info": "Material style date range picker, supports calendar selection and input selection.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DateRangePickerDialog", + "desc": [ + "【firstDate】 : Earliest date 【DateTime】", + "【lastDate】 : Latest date 【DateTime】", + "【initialDateRange】 : Initial range 【DateTimeRange?】", + "【saveText】 : Save text 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Customize DateRangePickerDialog", + "desc": [ + "Modify the source code of DateRangePickerDialog to display a numerical background for month entries." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json new file mode 100644 index 00000000..fb92b40b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Selector de rango de fechas", + "info": "Selector de rango de fechas al estilo Material, compatible con selección de calendario y selección de entrada.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DateRangePickerDialog", + "desc": [ + "【firstDate】 : Fecha más temprana 【DateTime】", + "【lastDate】 : Fecha más tardía 【DateTime】", + "【initialDateRange】 : Rango inicial 【DateTimeRange?】", + "【saveText】 : Texto de guardar 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modificación de DateRangePickerDialog", + "desc": [ + "Modifica el código fuente de DateRangePickerDialog para que los elementos del mes muestren un fondo numérico." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json new file mode 100644 index 00000000..0ef41265 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Plage de dates", + "info": "Sélecteur de plage de dates de style Material, prenant en charge la sélection par calendrier et par saisie.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DateRangePickerDialog", + "desc": [ + "【firstDate】 : Date la plus ancienne 【DateTime】", + "【lastDate】 : Date la plus récente 【DateTime】", + "【initialDateRange】 : Plage initiale 【DateTimeRange?】", + "【saveText】 : Texte de sauvegarde 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Personnalisation de DateRangePickerDialog", + "desc": [ + "Modifiez le code source de DateRangePickerDialog pour afficher un arrière-plan numérique sur les entrées de mois." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json new file mode 100644 index 00000000..3aa6595d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Intervallo di date", + "info": "Selettore di intervalli di date in stile Material, supporta la selezione tramite calendario e input.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DateRangePickerDialog", + "desc": [ + "【firstDate】 : Data più antica 【DateTime】", + "【lastDate】 : Data più recente 【DateTime】", + "【initialDateRange】 : Intervallo iniziale 【DateTimeRange?】", + "【saveText】 : Testo di salvataggio 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modifica di DateRangePickerDialog", + "desc": [ + "Modifica il codice sorgente di DateRangePickerDialog per mostrare uno sfondo numerico per le voci dei mesi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json new file mode 100644 index 00000000..caf3a1d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "日付範囲", + "info": "Materialスタイルの日付範囲ピッカーで、カレンダー選択と入力選択をサポートしています。", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 基本使用", + "desc": [ + "【firstDate】 : 最も早い日付 【DateTime】", + "【lastDate】 : 最も遅い日付 【DateTime】", + "【initialDateRange】 : 初期範囲 【DateTimeRange?】", + "【saveText】 : 保存テキスト 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog のカスタマイズ", + "desc": [ + "DateRangePickerDialog のソースコードを変更して、月の項目に数値の背景を表示するようにします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json new file mode 100644 index 00000000..0a6e2d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "날짜 범위", + "info": "Material 스타일의 날짜 범위 선택기로, 캘린더 선택 및 입력 선택을 지원합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DateRangePickerDialog 기본 사용", + "desc": [ + "【firstDate】 : 가장 이른 날짜 【DateTime】", + "【lastDate】 : 가장 늦은 날짜 【DateTime】", + "【initialDateRange】 : 초기 범위 【DateTimeRange?】", + "【saveText】 : 저장 텍스트 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "DateRangePickerDialog 커스터마이징", + "desc": [ + "DateRangePickerDialog 소스 코드를 수정하여 월 항목에 숫자 배경을 표시합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json new file mode 100644 index 00000000..370c61c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Intervalo de Datas", + "info": "Seletor de intervalo de datas no estilo Material, suporta seleção de calendário e seleção de entrada.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DateRangePickerDialog", + "desc": [ + "【firstDate】 : Data mais antiga 【DateTime】", + "【lastDate】 : Data mais recente 【DateTime】", + "【initialDateRange】 : Intervalo inicial 【DateTimeRange?】", + "【saveText】 : Texto de salvamento 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Modificar o DateRangePickerDialog", + "desc": [ + "Modifique o código-fonte do DateRangePickerDialog para exibir o fundo numérico nos itens do mês." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json new file mode 100644 index 00000000..81ddd382 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DateRangePickerDialog/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 339, + "name": "DateRangePickerDialog", + "localName": "Диапазон дат", + "info": "Селектор диапазона дат в стиле Material, поддерживает выбор через календарь и ввод.", + "lever": 4, + "family": 1, + "linkIds": [ + 135, + 136, + 137 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DateRangePickerDialog", + "desc": [ + "【firstDate】 : Самая ранняя дата 【DateTime】", + "【lastDate】 : Самая поздняя дата 【DateTime】", + "【initialDateRange】 : Начальный диапазон 【DateTimeRange?】", + "【saveText】 : Текст сохранения 【String?】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Модификация DateRangePickerDialog", + "desc": [ + "Изменение исходного кода DateRangePickerDialog для отображения числового фона для элементов месяца." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json new file mode 100644 index 00000000..dd521501 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Dekorierte Box-Übergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Decorated verwendet, um eine Übergangsanimation zwischen zwei Decorated-Objekten für die Kindkomponente durchzuführen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DecoratedBoxTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【position】 : Vordergrund-/Hintergrundfarbe 【DecorationPosition】", + "【decoration】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json new file mode 100644 index 00000000..49466d8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Decoration Transition", + "info": "A subclass of AnimatedWidget that uses a Decorated type animator to allow child components to transition between two Decorated objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DecoratedBoxTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【position】: Foreground/Background color 【DecorationPosition】", + "【decoration】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json new file mode 100644 index 00000000..a8cbf440 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transición de caja decorada", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Decorated para permitir que los componentes secundarios realicen una animación de transición entre dos objetos Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DecoratedBoxTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【position】 : Color de primer plano/fondo 【DecorationPosition】", + "【decoration】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json new file mode 100644 index 00000000..20bd975f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transition de boîte décorée", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Decorated pour permettre à un composant enfant de faire une transition animée entre deux objets Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DecoratedBoxTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【position】 : Couleur de premier plan/arrière-plan 【DecorationPosition】", + "【decoration】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json new file mode 100644 index 00000000..bad2bb5e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transizione Decorata", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Decorated per far sì che i componenti figli eseguano un'animazione di transizione tra due oggetti Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di DecoratedBoxTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【position】 : Colore di primo piano/sfondo 【DecorationPosition】", + "【decoration】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json new file mode 100644 index 00000000..7b3d731a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "装飾変換", + "info": "AnimatedWidgetのサブクラスで、Decoratedタイプのアニメーターを使用して、子コンポーネントが2つのDecoratedオブジェクト間で遷移アニメーションを行うようにします。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【position】 : 前景/背景色 【DecorationPosition】", + "【decoration】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json new file mode 100644 index 00000000..85687415 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "장식 변환", + "info": "AnimatedWidget의 하위 클래스, Decorated 타입의 애니메이터를 사용하여 자식 위젯이 두 Decorated 객체 간에 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DecoratedBoxTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【position】 : 전경/배경색 【DecorationPosition】", + "【decoration】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json new file mode 100644 index 00000000..1cd6907f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Transição Decorada", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Decorated para permitir que os componentes filhos realizem uma animação de transição entre dois objetos Decorated.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DecoratedBoxTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【position】 : Cor de frente/fundo 【DecorationPosition】", + "【decoration】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json new file mode 100644 index 00000000..665d61b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DecoratedBoxTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 113, + "name": "DecoratedBoxTransition", + "localName": "Декорированный переход", + "info": "Подкласс AnimatedWidget, использует аниматор типа Decorated для создания переходной анимации между двумя объектами Decorated для дочерних компонентов.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DecoratedBoxTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【position】 : Передний/фоновый цвет 【DecorationPosition】", + "【decoration】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json new file mode 100644 index 00000000..c4196581 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Standard-Tab-Controller", + "info": "Bei der Verwendung von TabBar und TabBarView ist ein gemeinsamer Controller erforderlich, um die Steuerung der Tabs und Seiten zu implementieren. DefaultTabController bietet einen Standard-Controller, wenn kein Controller angegeben ist, und vereinfacht die Verwendung.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DefaultTabController", + "desc": [ + "【length】 : Anzahl der Tabs 【int】", + "【initialIndex】 : Anfänglicher Tab-Index 【int】", + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json new file mode 100644 index 00000000..29fa51ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Default Tab Controller", + "info": "When using TabBar and TabBarView, the same controller is needed to control both the tabs and the pages. DefaultTabController provides a default controller when no controller is specified, simplifying usage.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DefaultTabController", + "desc": [ + "【length】: Number of tabs 【int】", + "【initialIndex】: Initial tab index 【int】", + "【child】: Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json new file mode 100644 index 00000000..b21625e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controlador de pestañas predeterminado", + "info": "Al usar TabBar y TabBarView, se necesita el mismo controlador para controlar las pestañas y las páginas. DefaultTabController proporciona un controlador predeterminado cuando no se especifica uno, simplificando su uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DefaultTabController", + "desc": [ + "【length】 : Número de pestañas 【int】", + "【initialIndex】 : Índice inicial de la pestaña 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json new file mode 100644 index 00000000..6429435c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Contrôleur d'onglets par défaut", + "info": "Lors de l'utilisation de TabBar et TabBarView, il est nécessaire qu'un même contrôleur gère à la fois les onglets et les pages. DefaultTabController fournit un contrôleur par défaut lorsqu'aucun contrôleur n'est spécifié, simplifiant ainsi son utilisation.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DefaultTabController", + "desc": [ + "【length】 : Nombre d'onglets 【int】", + "【initialIndex】 : Index de l'onglet initial 【int】", + "【child】 : Composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json new file mode 100644 index 00000000..53653e08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controllore di schede predefinito", + "info": "Quando si utilizza TabBar e TabBarView, è necessario che lo stesso controllore gestisca sia le schede che le pagine. DefaultTabController fornisce un controllore predefinito quando non ne viene specificato uno, semplificando l'uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DefaultTabController", + "desc": [ + "【length】 : Numero di schede 【int】", + "【initialIndex】 : Indice della scheda iniziale 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json new file mode 100644 index 00000000..a78257ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "デフォルトタブコントローラー", + "info": "TabBarとTabBarViewを使用する場合、同じコントローラーでタブとページの制御を実現する必要があります。DefaultTabControllerは、コントローラーが指定されていない場合にデフォルトのコントローラーを提供し、使用を簡素化します。", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabControllerの基本的な使用法", + "desc": [ + "【length】 : タブの数 【int】", + "【initialIndex】 : 初期タブインデックス 【int】", + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json new file mode 100644 index 00000000..5608a9a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "기본 탭 컨트롤러", + "info": "TabBar와 TabBarView를 사용할 때, 동일한 컨트롤러가 탭과 페이지를 제어해야 합니다. DefaultTabController는 컨트롤러가 지정되지 않았을 때 기본 컨트롤러를 제공하여 사용을 단순화합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTabController 기본 사용", + "desc": [ + "【length】 : 탭 수 【int】", + "【initialIndex】 : 초기 탭 인덱스 【int】", + "【child】 : 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json new file mode 100644 index 00000000..010a806d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Controlador de Abas Padrão", + "info": "Ao usar TabBar e TabBarView, é necessário que o mesmo controlador implemente o controle das abas e das páginas. O DefaultTabController fornece um controlador padrão quando nenhum controlador é especificado, simplificando o uso.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DefaultTabController", + "desc": [ + "【length】 : Número de abas 【int】", + "【initialIndex】 : Índice inicial da aba 【int】", + "【child】 : Componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json new file mode 100644 index 00000000..09e795e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTabController/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 230, + "name": "DefaultTabController", + "localName": "Контроллер вкладок по умолчанию", + "info": "При использовании TabBar и TabBarView требуется один и тот же контроллер для управления вкладками и страницами. DefaultTabController предоставляет контроллер по умолчанию, если он не указан, что упрощает использование.", + "lever": 3, + "family": 1, + "linkIds": [ + 148, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DefaultTabController", + "desc": [ + "【length】 : Количество вкладок 【int】", + "【initialIndex】 : Начальный индекс вкладки 【int】", + "【child】 : Компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json new file mode 100644 index 00000000..34d04c2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Textstilübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ TextStyle verwendet, um Textkomponenten zwischen zwei TextStyle-Objekten zu animieren.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DefaultTextStyleTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【textAlign】 : Textausrichtung 【TextAlign】", + "【softWrap】 : Umbrüche aktivieren 【bool】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【overflow】 : Überlaufmodus 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json new file mode 100644 index 00000000..2225e1be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Text Style Transition", + "info": "A subclass of AnimatedWidget, using a TextStyle type animator to transition text components between two TextStyle objects.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DefaultTextStyleTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【textAlign】 : Text alignment 【TextAlign】", + "【softWrap】 : Whether to wrap 【bool】", + "【maxLines】 : Maximum number of lines 【int】", + "【overflow】 : Overflow mode 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json new file mode 100644 index 00000000..2e865c01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transición de Estilo de Texto", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo TextStyle para permitir que los componentes de texto realicen una transición animada entre dos objetos TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DefaultTextStyleTransition", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【softWrap】 : Si debe envolver 【bool】", + "【maxLines】 : Número máximo de líneas 【int】", + "【overflow】 : Modo de desbordamiento 【TextOverflow】", + "【style】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json new file mode 100644 index 00000000..42a88a16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transition de style de texte", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type TextStyle pour permettre à un composant de texte de faire une transition animée entre deux objets TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DefaultTextStyleTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【softWrap】 : Enveloppement 【bool】", + "【maxLines】 : Nombre maximum de lignes 【int】", + "【overflow】 : Mode de débordement 【TextOverflow】", + "【style】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json new file mode 100644 index 00000000..5e229f8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transizione dello stile del testo", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo TextStyle per far sì che i componenti di testo eseguano un'animazione di transizione tra due oggetti TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DefaultTextStyleTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【softWrap】 : Se avvolgere 【bool】", + "【maxLines】 : Numero massimo di righe 【int】", + "【overflow】 : Modalità di overflow 【TextOverflow】", + "【style】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json new file mode 100644 index 00000000..3eb5d725 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "テキストスタイルの切り替え", + "info": "AnimatedWidgetのサブクラスで、TextStyleタイプのアニメーターを使用して、テキストコンポーネントが2つのTextStyleオブジェクト間でトランジションアニメーションを行います。", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【softWrap】 : ラップするかどうか 【bool】", + "【maxLines】 : 最大行数 【int】", + "【overflow】 : オーバーフローモード 【TextOverflow】", + "【style】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json new file mode 100644 index 00000000..2e3f8d7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "텍스트 스타일 전환", + "info": "AnimatedWidget의 하위 클래스로, TextStyle 타입의 애니메이터를 사용하여 텍스트 컴포넌트가 두 TextStyle 객체 사이에서 전환 애니메이션을 수행합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DefaultTextStyleTransition 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【softWrap】 : 감싸기 여부 【bool】", + "【maxLines】 : 최대 줄 수 【int】", + "【overflow】 : 오버플로우 모드 【TextOverflow】", + "【style】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json new file mode 100644 index 00000000..32515881 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Transição de Estilo de Texto", + "info": "Subclasse de AnimatedWidget, utiliza um animador do tipo TextStyle para permitir que componentes de texto façam uma transição animada entre dois objetos TextStyle.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de DefaultTextStyleTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【softWrap】 : Se deve envolver 【bool】", + "【maxLines】 : Número máximo de linhas 【int】", + "【overflow】 : Modo de overflow 【TextOverflow】", + "【style】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json new file mode 100644 index 00000000..06190b7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DefaultTextStyleTransition/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 114, + "name": "DefaultTextStyleTransition", + "localName": "Анимация стиля текста", + "info": "Подкласс AnimatedWidget, использует аниматор типа TextStyle для создания анимации перехода между двумя объектами TextStyle в текстовых компонентах.", + "lever": 3, + "family": 1, + "linkIds": [ + 124, + 324 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DefaultTextStyleTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【softWrap】 : Обернуть ли текст 【bool】", + "【maxLines】 : Максимальное количество строк 【int】", + "【overflow】 : Режим переполнения 【TextOverflow】", + "【style】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json new file mode 100644 index 00000000..cb6cb1f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Wischbar", + "info": "Beim Wischen kann die untere Komponente angezeigt werden, die Wischrichtung und die seitliche Verschiebung können angegeben werden. Empfängt Rückrufe bei Bestätigung des Verschwindens und beim Verschwinden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Dismissible", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【background】 : Linke Unterseite 【Widget】", + "【secondaryBackground】 : Rechte Unterseite 【Widget】", + "【key】 : Schlüssel 【Key】", + "【confirmDismiss】 : Bestätigungsrückruf 【DismissDirectionCallback】", + "【onDismissed】 : Rückruf beim Verschwinden 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Grundlegende Verwendung von Dismissible", + "desc": [ + "【direction】 : Richtung 【DismissDirection】", + "【crossAxisEndOffset】 : Verschiebung 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json new file mode 100644 index 00000000..647ec0b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Swipe to Dismiss", + "info": "When swiping, the bottom component can be displayed, and the direction of the swipe and the offset of the cross axis can be specified. Receives callbacks for confirming dismissal and when dismissed.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Dismissible", + "desc": [ + "【child】: Child component 【Widget】", + "【background】: Left bottom 【Widget】", + "【secondaryBackground】: Right bottom 【Widget】", + "【key】: Key 【Key】", + "【confirmDismiss】: Confirmation callback 【DismissDirectionCallback】", + "【onDismissed】: Dismissal callback 【DismissDirectionCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Basic Usage of Dismissible", + "desc": [ + "【direction】: Direction 【DismissDirection】", + "【crossAxisEndOffset】: Offset 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json new file mode 100644 index 00000000..d128f79e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Deslizar para desaparecer", + "info": "Al deslizar, se puede mostrar el componente inferior. Se puede especificar la dirección del deslizamiento y el desplazamiento del eje cruzado. Recibe devoluciones de llamada de confirmación de desaparición y desaparición.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Dismissible", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【background】 : Fondo izquierdo 【Widget】", + "【secondaryBackground】 : Fondo derecho 【Widget】", + "【key】 : Clave 【Key】", + "【confirmDismiss】 : Devolución de llamada de confirmación 【DismissDirectionCallback】", + "【onDismissed】 : Devolución de llamada de desaparición 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso básico de Dismissible", + "desc": [ + "【direction】 : Dirección 【DismissDirection】", + "【crossAxisEndOffset】 : Desplazamiento 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json new file mode 100644 index 00000000..03d61cd7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Glissement pour disparaître", + "info": "Lors du glissement, le composant inférieur peut être affiché. Il est possible de spécifier la direction du glissement et le décalage de l'axe croisé. Reçoit des rappels de confirmation de disparition et de disparition.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Dismissible", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【background】 : Fond gauche 【Widget】", + "【secondaryBackground】 : Fond droit 【Widget】", + "【key】 : Clé 【Key】", + "【confirmDismiss】 : Rappel de confirmation 【DismissDirectionCallback】", + "【onDismissed】 : Rappel de disparition 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Utilisation de base de Dismissible", + "desc": [ + "【direction】 : Direction 【DismissDirection】", + "【crossAxisEndOffset】 : Décalage 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json new file mode 100644 index 00000000..96b27475 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Scorrimento per eliminare", + "info": "Durante lo scorrimento è possibile visualizzare il componente sottostante, è possibile specificare la direzione dello scorrimento e l'offset dell'asse trasversale. Riceve callback di conferma eliminazione e di eliminazione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Dismissible", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【background】 : fondo sinistro 【Widget】", + "【secondaryBackground】 : fondo destro 【Widget】", + "【key】 : chiave 【Key】", + "【confirmDismiss】 : callback di conferma 【DismissDirectionCallback】", + "【onDismissed】 : callback di eliminazione 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso di base di Dismissible", + "desc": [ + "【direction】 : direzione 【DismissDirection】", + "【crossAxisEndOffset】 : offset 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json new file mode 100644 index 00000000..4f656b32 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "スワイプで消える", + "info": "スワイプ時に下部コンポーネントを表示でき、スワイプの方向と交差軸のオフセットを指定できます。確認消失と消失時のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissibleの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【background】 : 左底 【Widget】", + "【secondaryBackground】 : 右底 【Widget】", + "【key】 : キー 【Key】", + "【confirmDismiss】 : 確認コールバック 【DismissDirectionCallback】", + "【onDismissed】 : 消失コールバック 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissibleの基本使用", + "desc": [ + "【direction】 : 方向 【DismissDirection】", + "【crossAxisEndOffset】 : オフセット 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json new file mode 100644 index 00000000..9d03c028 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "슬라이드로 사라짐", + "info": "슬라이드 시 하위 컴포넌트를 표시할 수 있으며, 슬라이드 방향과 교차 축의 오프셋을 지정할 수 있습니다. 사라짐 확인 및 사라짐 시 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dismissible 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【background】 : 왼쪽 하단 【Widget】", + "【secondaryBackground】 : 오른쪽 하단 【Widget】", + "【key】 : 키 【Key】", + "【confirmDismiss】 : 확인 콜백 【DismissDirectionCallback】", + "【onDismissed】 : 사라짐 콜백 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Dismissible 기본 사용", + "desc": [ + "【direction】 : 방향 【DismissDirection】", + "【crossAxisEndOffset】 : 오프셋 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json new file mode 100644 index 00000000..0a9c30ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Deslizar para desaparecer", + "info": "Ao deslizar, o componente inferior pode ser exibido, e a direção do deslize e o deslocamento do eixo cruzado podem ser especificados. Recebe retornos de chamada para confirmação de desaparecimento e desaparecimento.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Dismissible", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【background】 : Fundo esquerdo 【Widget】", + "【secondaryBackground】 : Fundo direito 【Widget】", + "【key】 : Chave 【Key】", + "【confirmDismiss】 : Retorno de chamada de confirmação 【DismissDirectionCallback】", + "【onDismissed】 : Retorno de chamada de desaparecimento 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Uso básico do Dismissible", + "desc": [ + "【direction】 : Direção 【DismissDirection】", + "【crossAxisEndOffset】 : Deslocamento 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json new file mode 100644 index 00000000..128c3c9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Dismissible/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 176, + "name": "Dismissible", + "localName": "Скользящее исчезновение", + "info": "При скольжении можно отобразить компонент внизу, можно указать направление скольжения и смещение по поперечной оси. Получает обратные вызовы при подтверждении исчезновения и исчезновении.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Dismissible", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【background】 : Левый низ 【Widget】", + "【secondaryBackground】 : Правый низ 【Widget】", + "【key】 : Ключ 【Key】", + "【confirmDismiss】 : Обратный вызов подтверждения 【DismissDirectionCallback】", + "【onDismissed】 : Обратный вызов исчезновения 【DismissDirectionCallback】," + ] + }, + { + "file": "node2_direction.dart", + "name": "Основное использование Dismissible", + "desc": [ + "【direction】 : Направление 【DismissDirection】", + "【crossAxisEndOffset】 : Смещение 【double】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json new file mode 100644 index 00000000..81b99c4f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Ziel zum Ziehen", + "info": "Ein Zielbereich zum Ziehen, der Informationen von der Draggable-Komponente empfangen kann. Kann Rückrufe beim Ziehen erhalten.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DragTarget", + "desc": [ + "【builder】 : Komponentenkonstruktor 【DragTargetBuilder】", + "【onWillAccept】 : Beim Ziehen 【Function(T)】", + "【onAccept】 : Ziehen erfolgreich 【Function(T)】", + "【onLeave】 : Ziehen und Loslassen 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json new file mode 100644 index 00000000..c7843644 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Drag Target", + "info": "A target area for dragging, which can receive information from the Draggable component. It can get callbacks during dragging.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DragTarget", + "desc": [ + "【builder】: Component builder 【DragTargetBuilder】", + "【onWillAccept】: When dragging in 【Function(T)】", + "【onAccept】: Drag success 【Function(T)】", + "【onLeave】: Drag in and then out 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json new file mode 100644 index 00000000..85904384 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Objetivo de Arrastrar", + "info": "Un área objetivo para arrastrar, que puede recibir información del componente Draggable. Puede obtener devoluciones de llamada durante el arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de DragTarget", + "desc": [ + "【builder】 : Constructor del componente 【DragTargetBuilder】", + "【onWillAccept】 : Al arrastrar hacia adentro 【Function(T)】", + "【onAccept】 : Arrastre exitoso 【Function(T)】", + "【onLeave】 : Arrastrar hacia adentro y luego hacia afuera 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json new file mode 100644 index 00000000..6d06cb8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Cible de glisser-déposer", + "info": "Une zone cible pour le glisser-déposer, capable de recevoir des informations du composant Draggable. Peut obtenir des rappels lors du glisser-déposer.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DragTarget", + "desc": [ + "【builder】 : Constructeur de composant 【DragTargetBuilder】", + "【onWillAccept】 : Lors du glissement 【Function(T)】", + "【onAccept】 : Glisser-déposer réussi 【Function(T)】", + "【onLeave】 : Glisser-déposer puis sortir 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json new file mode 100644 index 00000000..04c0e008 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Obiettivo di trascinamento", + "info": "Un'area di destinazione per il trascinamento, in grado di ricevere informazioni dal componente Draggable. È possibile ottenere callback durante il trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DragTarget", + "desc": [ + "【builder】 : Costruttore del componente 【DragTargetBuilder】", + "【onWillAccept】 : Durante il trascinamento 【Function(T)】", + "【onAccept】 : Trascinamento riuscito 【Function(T)】", + "【onLeave】 : Trascinato e poi rilasciato 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json new file mode 100644 index 00000000..60747d78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "ドラッグターゲット", + "info": "ドラッグ可能なコンポーネントの情報を受け取るためのドラッグターゲットエリアです。ドラッグ時のコールバックを取得できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTargetの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【DragTargetBuilder】", + "【onWillAccept】 : ドラッグイン時 【Function(T)】", + "【onAccept】 : ドラッグ成功時 【Function(T)】", + "【onLeave】 : ドラッグイン後ドラッグアウト時 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json new file mode 100644 index 00000000..c7822b57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "드래그 대상", + "info": "드래그 가능한 영역으로, Draggable 컴포넌트의 정보를 받을 수 있습니다. 드래그 시 콜백을 얻을 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DragTarget 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【DragTargetBuilder】", + "【onWillAccept】 : 드래그 시 【Function(T)】", + "【onAccept】 : 드래그 성공 【Function(T)】", + "【onLeave】 : 드래그 후 떼기 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json new file mode 100644 index 00000000..e8359167 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Alvo de Arrastar", + "info": "Uma área de destino para arrastar, que pode receber informações do componente Draggable. Pode obter retornos de chamada durante o arrasto.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DragTarget", + "desc": [ + "【builder】 : Construtor de componentes 【DragTargetBuilder】", + "【onWillAccept】 : Ao arrastar para dentro 【Function(T)】", + "【onAccept】 : Arrasto bem-sucedido 【Function(T)】", + "【onLeave】 : Arrastar para dentro e depois para fora 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json new file mode 100644 index 00000000..6355c56c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DragTarget/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 104, + "name": "DragTarget", + "localName": "Цель перетаскивания", + "info": "Область цели для перетаскивания, которая может принимать информацию от компонента Draggable. Можно получить обратные вызовы при перетаскивании.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DragTarget", + "desc": [ + "【builder】 : Конструктор компонента 【DragTargetBuilder】", + "【onWillAccept】 : При перетаскивании 【Function(T)】", + "【onAccept】 : Успешное перетаскивание 【Function(T)】", + "【onLeave】 : Перетаскивание и выход 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json new file mode 100644 index 00000000..9d415728 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_de_DE.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Verschiebbare Komponente", + "info": "Ermöglicht das Verschieben der Komponente auf der Benutzeroberfläche und kann Daten eines generischen Typs T speichern. Wird normalerweise in Kombination mit DragTarget verwendet, um den Drag-and-Drop-Effekt zu erzielen.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Draggable", + "desc": [ + "【child】 : Kind 【Widget】", + "【feedback】 : Kind während des Ziehens 【Widget】", + "【axis】 : Achse des Ziehens 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Kombinierte Verwendung von Draggable und DragTarget", + "desc": [ + "【data】 : Daten 【T】", + "【onDragStarted】 : Ziehen gestartet 【Function()】", + "【onDragEnd】 : Ziehen beendet 【Function(DraggableDetails)】", + "【onDragCompleted】 : Ziehen abgeschlossen 【Function()】", + "【onDraggableCanceled】 : Ziehen abgebrochen 【Function(Velocity,Offset)】", + "【onChanged】 : Rückruf bei Änderung 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Andere Verwendungen von Draggable", + "desc": [ + "Kann verwendet werden, um einige Ereignisse basierend auf dem Ziehen zu verarbeiten, wie z.B. Löschen, Abfragen, Pop-up-Fenster usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json new file mode 100644 index 00000000..28afb401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_en_US.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Draggable Component", + "info": "Allows the component to be dragged anywhere on the interface, and can store data of a generic type T. It is usually used in combination with DragTarget to achieve the drag effect.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Draggable", + "desc": [ + "【child】 : child 【Widget】", + "【feedback】 : child during dragging 【Widget】", + "【axis】 : axis of dragging 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Combined Usage of Draggable and DragTarget", + "desc": [ + "【data】 : data 【T】", + "【onDragStarted】 : start dragging 【Function()】", + "【onDragEnd】 : end dragging 【Function(DraggableDetails)】", + "【onDragCompleted】 : drag completed 【Function()】", + "【onDraggableCanceled】 : drag canceled 【Function(Velocity,Offset)】", + "【onChanged】 : callback when changed 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Other Usages of Draggable", + "desc": [ + "Some events can be handled based on dragging, such as deletion, querying, pop-ups, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json new file mode 100644 index 00000000..e36c39ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_es_ES.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Arrastrable", + "info": "Permite arrastrar el componente en la interfaz, puede almacenar datos de un tipo genérico T. Normalmente se usa en combinación con DragTarget para lograr el efecto de arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Draggable", + "desc": [ + "【child】 : hijo 【Widget】", + "【feedback】 : hijo durante el arrastre 【Widget】", + "【axis】 : eje de arrastre 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Uso combinado de Draggable y DragTarget", + "desc": [ + "【data】 : datos 【T】", + "【onDragStarted】 : inicio del arrastre 【Function()】", + "【onDragEnd】 : fin del arrastre 【Function(DraggableDetails)】", + "【onDragCompleted】 : arrastre completado 【Function()】", + "【onDraggableCanceled】 : arrastre cancelado 【Function(Velocity,Offset)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Otros usos de Draggable", + "desc": [ + "Puede manejar algunos eventos según el arrastre. Como eliminar, consultar, mostrar cuadros de diálogo, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json new file mode 100644 index 00000000..9087a370 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_fr_FR.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Composant déplaçable", + "info": "Permet de déplacer un composant librement sur l'interface, peut contenir des données de type générique T. Généralement utilisé en combinaison avec DragTarget pour réaliser des effets de glisser-déposer.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Draggable", + "desc": [ + "【child】 : enfant 【Widget】", + "【feedback】 : enfant pendant le glissement 【Widget】", + "【axis】 : axe de glissement 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Utilisation combinée de Draggable et DragTarget", + "desc": [ + "【data】 : données 【T】", + "【onDragStarted】 : début du glissement 【Function()】", + "【onDragEnd】 : fin du glissement 【Function(DraggableDetails)】", + "【onDragCompleted】 : glissement terminé 【Function()】", + "【onDraggableCanceled】 : glissement annulé 【Function(Velocity,Offset)】", + "【onChanged】 : rappel lors du changement 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Autres utilisations de Draggable", + "desc": [ + "Peut traiter certains événements en fonction du glissement. Comme la suppression, la recherche, les boîtes de dialogue, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json new file mode 100644 index 00000000..6a8e0ecc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_it_IT.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Trascinabile", + "info": "Permette di trascinare il componente sull'interfaccia e può contenere un dato di tipo generico T. Solitamente utilizzato in combinazione con DragTarget per completare l'effetto di trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di Draggable", + "desc": [ + "【child】 : figlio 【Widget】", + "【feedback】 : figlio durante il trascinamento 【Widget】", + "【axis】 : asse di trascinamento 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Utilizzo combinato di Draggable e DragTarget", + "desc": [ + "【data】 : dati 【T】", + "【onDragStarted】 : inizio del trascinamento 【Function()】", + "【onDragEnd】 : fine del trascinamento 【Function(DraggableDetails)】", + "【onDragCompleted】 : trascinamento completato 【Function()】", + "【onDraggableCanceled】 : trascinamento annullato 【Function(Velocity,Offset)】", + "【onChanged】 : callback al cambiamento 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Altri utilizzi di Draggable", + "desc": [ + "È possibile gestire alcuni eventi in base al trascinamento. Ad esempio, eliminazione, ricerca, finestra pop-up, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json new file mode 100644 index 00000000..39b75180 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ja_JP.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "ドラッグ可能なコンポーネント", + "info": "コンポーネントをインターフェース上で自由にドラッグできるようにし、ジェネリック型Tのデータを格納できます。通常、DragTargetと組み合わせて使用し、ドラッグ効果を実現します。", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggableの基本使用", + "desc": [ + "【child】 : 子 【Widget】", + "【feedback】 : ドラッグ時の子 【Widget】", + "【axis】 : ドラッグ軸 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "DraggableとDragTargetの連携使用", + "desc": [ + "【data】 : データ 【T】", + "【onDragStarted】 : ドラッグ開始 【Function()】", + "【onDragEnd】 : ドラッグ終了 【Function(DraggableDetails)】", + "【onDragCompleted】 : ドラッグ完了 【Function()】", + "【onDraggableCanceled】 : ドラッグキャンセル 【Function(Velocity,Offset)】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggableのその他の使用", + "desc": [ + "ドラッグに基づいていくつかのイベントを処理できます。例えば、削除、検索、ポップアップなど" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json new file mode 100644 index 00000000..1d9a29c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ko_KR.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "드래그 가능한 컴포넌트", + "info": "컴포넌트를 인터페이스 상에서 자유롭게 드래그할 수 있으며, 제네릭 T 데이터를 저장할 수 있습니다. 일반적으로 DragTarget과 함께 사용되어 드래그 효과를 완성합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Draggable 기본 사용", + "desc": [ + "【child】 : 자식 【Widget】", + "【feedback】 : 드래그 시의 자식 【Widget】", + "【axis】 : 드래그 축 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Draggable과 DragTarget 연동", + "desc": [ + "【data】 : 데이터 【T】", + "【onDragStarted】 : 드래그 시작 【Function()】", + "【onDragEnd】 : 드래그 종료 【Function(DraggableDetails)】", + "【onDragCompleted】 : 드래그 완료 【Function()】", + "【onDraggableCanceled】 : 드래그 취소 【Function(Velocity,Offset)】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Draggable 기타 사용", + "desc": [ + "드래그를 통해 일부 이벤트를 처리할 수 있습니다. 예를 들어 삭제, 조회, 팝업 등" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json new file mode 100644 index 00000000..b6b3af3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_pt_PT.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Componente Arrastável", + "info": "Permite que o componente seja arrastado livremente na interface, podendo armazenar dados de um tipo genérico T. Normalmente usado em combinação com DragTarget para alcançar o efeito de arrastar e soltar.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Draggable", + "desc": [ + "【child】 : Filho 【Widget】", + "【feedback】 : Filho durante o arrasto 【Widget】", + "【axis】 : Eixo de arrasto 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Uso Conjunto de Draggable e DragTarget", + "desc": [ + "【data】 : Dados 【T】", + "【onDragStarted】 : Início do arrasto 【Function()】", + "【onDragEnd】 : Fim do arrasto 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrasto concluído 【Function()】", + "【onDraggableCanceled】 : Arrasto cancelado 【Function(Velocity,Offset)】", + "【onChanged】 : Callback de mudança 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Outros Usos do Draggable", + "desc": [ + "Pode processar alguns eventos com base no arrasto, como exclusão, consulta, exibição de diálogos, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json new file mode 100644 index 00000000..00ffd0c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Draggable/desc_ru_RU.json @@ -0,0 +1,42 @@ +{ + "id": 103, + "name": "Draggable", + "localName": "Перетаскиваемый компонент", + "info": "Позволяет компоненту перетаскиваться на интерфейсе, может хранить данные типа T. Обычно используется в сочетании с DragTarget для достижения эффекта перетаскивания.", + "lever": 4, + "family": 1, + "linkIds": [ + 104, + 105 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Draggable", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【feedback】 : Дочерний элемент при перетаскивании 【Widget】", + "【axis】 : Ось перетаскивания 【Axis】" + ] + }, + { + "file": "node2_data.dart", + "name": "Использование Draggable с DragTarget", + "desc": [ + "【data】 : Данные 【T】", + "【onDragStarted】 : Начало перетаскивания 【Function()】", + "【onDragEnd】 : Конец перетаскивания 【Function(DraggableDetails)】", + "【onDragCompleted】 : Завершение перетаскивания 【Function()】", + "【onDraggableCanceled】 : Отмена перетаскивания 【Function(Velocity,Offset)】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + }, + { + "file": "node3_use.dart", + "name": "Другое использование Draggable", + "desc": [ + "Можно обрабатывать некоторые события на основе перетаскивания. Например, удаление, поиск, всплывающие окна и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json new file mode 100644 index 00000000..8186a954 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Zieh- und schiebbares Blatt", + "info": "Ein Blatt, das gezogen und geschoben werden kann, mit der Möglichkeit, den maximalen, minimalen und anfänglichen Teilungsbereich festzulegen. Der Konstruktor builder muss eine schiebbare Komponente zurückgeben.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Anfänglicher Teilungsgrad 【double】", + "【minChildSize】 : Minimaler Teilungsgrad 【double】", + "【maxChildSize】 : Maximaler Teilungsgrad 【double】", + "【builder】 : Schiebbare Komponentenkonstruktor 【ScrollableWidgetBuilder】", + "【expand】 : Ob erweitert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json new file mode 100644 index 00000000..3a4f380a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Draggable Sheet", + "info": "A sheet that can be dragged and scrolled, with the ability to specify the maximum, minimum, and initial fractions within the scroll range. The builder constructor needs to return a scrollable component.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DraggableScrollableSheet", + "desc": [ + "【initialChildSize】: Initial fraction 【double】", + "【minChildSize】: Minimum fraction 【double】", + "【maxChildSize】: Maximum fraction 【double】", + "【builder】: Scrollable component builder 【ScrollableWidgetBuilder】", + "【expand】: Whether to expand 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json new file mode 100644 index 00000000..bf72d364 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Hoja deslizante", + "info": "Hoja que se puede arrastrar y deslizar, se puede especificar el tamaño máximo, mínimo e inicial dentro del rango de deslizamiento. El constructor builder debe devolver un componente deslizable.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Tamaño inicial 【double】", + "【minChildSize】 : Tamaño mínimo 【double】", + "【maxChildSize】 : Tamaño máximo 【double】", + "【builder】 : Constructor de componente deslizable 【ScrollableWidgetBuilder】", + "【expand】 : Si se expande 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json new file mode 100644 index 00000000..61897ae3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Feuille glissable et déplaçable", + "info": "Feuille déplaçable et glissable, permettant de spécifier les divisions maximales, minimales et initiales dans la plage de glissement. Le constructeur builder doit retourner un composant glissant.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Division initiale 【double】", + "【minChildSize】 : Division minimale 【double】", + "【maxChildSize】 : Division maximale 【double】", + "【builder】 : Constructeur de composant glissant 【ScrollableWidgetBuilder】", + "【expand】 : S'étend ou non 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json new file mode 100644 index 00000000..e1873bd0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Foglio trascinabile e scorrevole", + "info": "Un foglio trascinabile e scorrevole che può specificare la dimensione massima, minima e iniziale all'interno dell'intervallo di scorrimento. Il costruttore builder deve restituire un componente scorrevole.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Dimensione iniziale 【double】", + "【minChildSize】 : Dimensione minima 【double】", + "【maxChildSize】 : Dimensione massima 【double】", + "【builder】 : Costruttore del componente scorrevole 【ScrollableWidgetBuilder】", + "【expand】 : Se espandere 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json new file mode 100644 index 00000000..9dbe32fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "ドラッグ可能なシート", + "info": "ドラッグおよびスクロール可能なシートで、最大、最小、および初期の分割位置を指定できます。ビルダーはスクロール可能なコンポーネントを返す必要があります。", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheetの基本使用", + "desc": [ + "【initialChildSize】 : 初期分割位置 【double】", + "【minChildSize】 : 最小分割位置 【double】", + "【maxChildSize】 : 最大分割位置 【double】", + "【builder】 : スクロールコンポーネントビルダー 【ScrollableWidgetBuilder】", + "【expand】 : 拡張するかどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json new file mode 100644 index 00000000..be2920e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "드래그 가능한 시트", + "info": "드래그 및 스크롤 가능한 시트로, 최대, 최소, 초기 분할 위치를 지정할 수 있습니다. 생성자 builder는 스크롤 가능한 컴포넌트를 반환해야 합니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DraggableScrollableSheet 기본 사용법", + "desc": [ + "【initialChildSize】 : 초기 분할 위치 【double】", + "【minChildSize】 : 최소 분할 위치 【double】", + "【maxChildSize】 : 최대 분할 위치 【double】", + "【builder】 : 스크롤 컴포넌트 생성자 【ScrollableWidgetBuilder】", + "【expand】 : 확장 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json new file mode 100644 index 00000000..b9b9a40e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Folha Deslizável e Arrastável", + "info": "Uma folha que pode ser arrastada e deslizada, permitindo especificar a divisão máxima, mínima e inicial dentro da faixa de deslizamento. O construtor builder precisa retornar um componente deslizável.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DraggableScrollableSheet", + "desc": [ + "【initialChildSize】: Divisão inicial 【double】", + "【minChildSize】: Divisão mínima 【double】", + "【maxChildSize】: Divisão máxima 【double】", + "【builder】: Construtor do componente deslizável 【ScrollableWidgetBuilder】", + "【expand】: Estender 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json new file mode 100644 index 00000000..6df183a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DraggableScrollableSheet/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 252, + "name": "DraggableScrollableSheet", + "localName": "Перетаскиваемый и прокручиваемый лист", + "info": "Перетаскиваемый и прокручиваемый лист, который может указывать максимальное, минимальное и начальное деление в текущем диапазоне прокрутки. Конструктор builder должен возвращать прокручиваемый компонент.", + "lever": 2, + "family": 1, + "linkIds": [ + 221, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DraggableScrollableSheet", + "desc": [ + "【initialChildSize】 : Начальное деление 【double】", + "【minChildSize】 : Минимальное деление 【double】", + "【maxChildSize】 : Максимальное деление 【double】", + "【builder】 : Конструктор прокручиваемого компонента 【ScrollableWidgetBuilder】", + "【expand】 : Расширять ли 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json new file mode 100644 index 00000000..a2c8d346 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS-Schiebe-Tab", + "info": "Bietet Interaktionsverhalten für die Drawer-Komponente und wird selten verwendet. Es gibt Anwendungsfälle im Quellcode der Scaffold-Komponente.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerController", + "desc": [ + "【drawerCallback】 : Ereignisrückruf 【DrawerCallback】", + "【enableOpenDragGesture】 : Ob seitliches Aufziehen aktiviert ist 【bool】", + "【alignment】 : Ausrichtung 【DrawerAlignment】", + "【scrimColor】 : Hintergrundfarbe 【Color】", + "【child】 : Drawer-Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json new file mode 100644 index 00000000..e49012f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS Sliding Tabs", + "info": "Provides interactive behavior for the Drawer component, which is rarely used. It is used in the source code of the Scaffold component.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerController", + "desc": [ + "【drawerCallback】: Event callback 【DrawerCallback】", + "【enableOpenDragGesture】: Whether to slide open from the side 【bool】", + "【alignment】: Alignment 【DrawerAlignment】", + "【scrimColor】: Background color 【Color】", + "【child】: Drawer component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json new file mode 100644 index 00000000..7afc8a3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Pestañas deslizantes de iOS", + "info": "Proporciona comportamiento interactivo para el componente Drawer, generalmente se usa poco. Tiene un caso de uso en el código fuente del componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerController", + "desc": [ + "【drawerCallback】 : devolución de llamada de evento 【DrawerCallback】", + "【enableOpenDragGesture】 : si se puede deslizar hacia un lado 【bool】", + "【alignment】 : alineación 【DrawerAlignment】", + "【scrimColor】 : color de fondo 【Color】", + "【child】 : componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json new file mode 100644 index 00000000..bbf96da0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Onglets glissants iOS", + "info": "Fournit des comportements interactifs pour le composant Drawer, généralement peu utilisé. Utilisé dans le code source du composant Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerController", + "desc": [ + "【drawerCallback】 : Rappel d'événement 【DrawerCallback】", + "【enableOpenDragGesture】 : Glissement latéral activé 【bool】", + "【alignment】 : Mode d'alignement 【DrawerAlignment】", + "【scrimColor】 : Couleur de fond 【Color】", + "【child】 : Composant Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json new file mode 100644 index 00000000..0a51c96e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Schede scorrevoli iOS", + "info": "Fornisce comportamenti interattivi per il componente Drawer, generalmente usato raramente. Ci sono scenari di utilizzo nel codice sorgente del componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DrawerController", + "desc": [ + "【drawerCallback】 : callback dell'evento 【DrawerCallback】", + "【enableOpenDragGesture】 : se scorrere lateralmente per aprire 【bool】", + "【alignment】 : allineamento 【DrawerAlignment】", + "【scrimColor】 : colore di sfondo 【Color】", + "【child】 : componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json new file mode 100644 index 00000000..07b6f06d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOSスライドタブ", + "info": "Drawerコンポーネントにインタラクションを提供しますが、一般的にはあまり使用されません。Scaffoldコンポーネントのソースコードで使用されることがあります。", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerControllerの基本的な使用法", + "desc": [ + "【drawerCallback】 : イベントコールバック 【DrawerCallback】", + "【enableOpenDragGesture】 : サイドスワイプを有効にするか 【bool】", + "【alignment】 : 配置方法 【DrawerAlignment】", + "【scrimColor】 : 背景色 【Color】", + "【child】 : Drawerコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json new file mode 100644 index 00000000..bc6be0dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS 슬라이드 탭", + "info": "Drawer 컴포넌트에 상호 작용을 제공하며, 일반적으로 잘 사용되지 않습니다. Scaffold 컴포넌트 소스 코드에서 사용 사례가 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerController 기본 사용", + "desc": [ + "【drawerCallback】 : 이벤트 콜백 【DrawerCallback】", + "【enableOpenDragGesture】 : 측면 슬라이드 열기 【bool】", + "【alignment】 : 정렬 방식 【DrawerAlignment】", + "【scrimColor】 : 배경 색상 【Color】", + "【child】 : Drawer 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json new file mode 100644 index 00000000..25c9c0e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "Separador deslizante iOS", + "info": "Fornece comportamento interativo para o componente Drawer, geralmente raramente usado. Há cenários de uso no código-fonte do componente Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DrawerController", + "desc": [ + "【drawerCallback】 : Callback de evento 【DrawerCallback】", + "【enableOpenDragGesture】 : Se o deslizar lateral está ativado 【bool】", + "【alignment】 : Alinhamento 【DrawerAlignment】", + "【scrimColor】 : Cor de fundo 【Color】", + "【child】 : Componente Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json new file mode 100644 index 00000000..e2ae2d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DrawerController/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 257, + "name": "DrawerController", + "localName": "iOS слайдер вкладок", + "info": "Обеспечивает интерактивное поведение для компонента Drawer, обычно используется редко. Используется в исходном коде компонента Scaffold.", + "lever": 3, + "family": 1, + "linkIds": [ + 154, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerController", + "desc": [ + "【drawerCallback】 : Обратный вызов события 【DrawerCallback】", + "【enableOpenDragGesture】 : Возможность открытия смахиванием 【bool】", + "【alignment】 : Способ выравнивания 【DrawerAlignment】", + "【scrimColor】 : Цвет фона 【Color】", + "【child】 : Компонент Drawer 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json new file mode 100644 index 00000000..6bb9d991 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Dropdown-Schaltfläche", + "info": "Eine Schaltfläche für Dropdown-Auswahl, die Eigenschaften wie Symbol, Schattentiefe, Hinweis usw. angeben kann und Ereignisse bei Änderungen der Auswahl empfängt.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DropdownButton", + "desc": [ + "【value】 : Aktueller Wert 【T】", + "【items】 : Dropdown-Auswahlbox 【List>】", + "【icon】 : Symbol 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【onChanged】 : Ereignis bei Auswahl eines Elements 【Function(T)】", + "【backgroundColor】 : Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stilangabe für DropdownButton", + "desc": [ + "【isDense】 : Ob kompakt angeordnet 【bool】", + "【iconSize】 : Symbolgröße 【double】", + "【hint】 : Hinweis-Komponente 【Widget】", + "【iconEnabledColor】 : Symbolfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json new file mode 100644 index 00000000..67516d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Dropdown Button", + "info": "A button for dropdown selection, which can specify attributes such as icon, elevation, hint, etc., and receives events for selection changes.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DropdownButton", + "desc": [ + "【value】 : Current value 【T】", + "【items】 : Dropdown items 【List>】", + "【icon】 : Icon 【Widget】", + "【elevation】 : Elevation 【double】", + "【onChanged】 : Selection change event 【Function(T)】", + "【backgroundColor】 : Background color 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Styling of DropdownButton", + "desc": [ + "【isDense】 : Whether to be dense 【bool】", + "【iconSize】 : Icon size 【double】", + "【hint】 : Hint widget 【Widget】", + "【iconEnabledColor】 : Icon color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json new file mode 100644 index 00000000..72085369 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Botón desplegable", + "info": "Botón para selección desplegable, se pueden especificar propiedades como icono, profundidad de sombra, sugerencias, etc., y recibe eventos de cambio de selección.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DropdownButton", + "desc": [ + "【value】 : Valor actual 【T】", + "【items】 : Opciones desplegables 【List>】", + "【icon】 : Icono 【Widget】", + "【elevation】 : Profundidad de sombra 【double】", + "【onChanged】 : Evento de cambio de selección 【Function(T)】", + "【backgroundColor】 : Color de fondo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Especificación de estilo de DropdownButton", + "desc": [ + "【isDense】 : Si está compacto 【bool】", + "【iconSize】 : Tamaño del icono 【double】", + "【hint】 : Componente de sugerencia 【Widget】", + "【iconEnabledColor】 : Color del icono 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json new file mode 100644 index 00000000..7116ccf5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Bouton déroulant", + "info": "Bouton pour la sélection déroulante, pouvant spécifier des attributs tels que l'icône, la profondeur d'ombre, l'indice, etc., et recevoir des événements de changement de sélection.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DropdownButton", + "desc": [ + "【value】 : Valeur actuelle 【T】", + "【items】 : Liste déroulante 【List>】", + "【icon】 : Icône 【Widget】", + "【elevation】 : Profondeur d'ombre 【double】", + "【onChanged】 : Événement de sélection d'élément 【Function(T)】", + "【backgroundColor】 : Couleur de fond 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Spécification du style de DropdownButton", + "desc": [ + "【isDense】 : Si compact 【bool】", + "【iconSize】 : Taille de l'icône 【double】", + "【hint】 : Composant d'indice 【Widget】", + "【iconEnabledColor】 : Couleur de l'icône 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json new file mode 100644 index 00000000..f6ff0ac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Pulsante a discesa", + "info": "Pulsante per la selezione a discesa, può specificare attributi come icona, profondità dell'ombra, suggerimento, ecc., e riceve eventi di cambiamento di selezione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DropdownButton", + "desc": [ + "【value】 : Valore corrente 【T】", + "【items】 : Casella di selezione a discesa 【List>】", + "【icon】 : Icona 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【onChanged】 : Evento di selezione dell'elemento 【Function(T)】", + "【backgroundColor】 : Colore di sfondo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Specifica dello stile di DropdownButton", + "desc": [ + "【isDense】 : Se è compatto 【bool】", + "【iconSize】 : Dimensione dell'icona 【double】", + "【hint】 : Componente di suggerimento 【Widget】", + "【iconEnabledColor】 : Colore dell'icona 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json new file mode 100644 index 00000000..17cebf26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "ドロップダウンボタン", + "info": "ドロップダウン選択用のボタンで、アイコン、影の深さ、ヒントなどの属性を指定でき、選択変更イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButtonの基本的な使い方", + "desc": [ + "【value】 : 現在の値 【T】", + "【items】 : ドロップダウンリスト 【List>】", + "【icon】 : アイコン 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【onChanged】 : 項目選択イベント 【Function(T)】", + "【backgroundColor】 : 背景色 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButtonのスタイル指定", + "desc": [ + "【isDense】 : コンパクト表示かどうか 【bool】", + "【iconSize】 : アイコンのサイズ 【double】", + "【hint】 : ヒントコンポーネント 【Widget】", + "【iconEnabledColor】 : アイコンの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json new file mode 100644 index 00000000..fcf3fdaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "드롭다운 버튼", + "info": "드롭다운 선택을 위한 버튼으로, 아이콘, 그림자 깊이, 힌트 등의 속성을 지정할 수 있으며, 선택 변경 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DropdownButton 기본 사용법", + "desc": [ + "【value】 : 현재 값 【T】", + "【items】 : 드롭다운 목록 【List>】", + "【icon】 : 아이콘 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【onChanged】 : 항목 선택 이벤트 【Function(T)】", + "【backgroundColor】 : 배경색 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "DropdownButton 스타일 지정", + "desc": [ + "【isDense】 : 간격 축소 여부 【bool】", + "【iconSize】 : 아이콘 크기 【double】", + "【hint】 : 힌트 위젯 【Widget】", + "【iconEnabledColor】 : 아이콘 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json new file mode 100644 index 00000000..dc801566 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Botão de dropdown", + "info": "Botão para seleção de dropdown, pode especificar ícone, profundidade de sombra, dica e outros atributos, recebe eventos de mudança de seleção.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do DropdownButton", + "desc": [ + "【value】 : Valor atual 【T】", + "【items】 : Caixa de seleção de dropdown 【List>】", + "【icon】 : Ícone 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【onChanged】 : Evento de seleção de item 【Function(T)】", + "【backgroundColor】 : Cor de fundo 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Especificação de estilo do DropdownButton", + "desc": [ + "【isDense】 : Se deve ser compacto 【bool】", + "【iconSize】 : Tamanho do ícone 【double】", + "【hint】 : Componente de dica 【Widget】", + "【iconEnabledColor】 : Cor do ícone 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json new file mode 100644 index 00000000..a9a8965b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 55, + "name": "DropdownButton", + "localName": "Выпадающая кнопка", + "info": "Кнопка для выбора из выпадающего списка, может иметь указанные иконки, тени, подсказки и другие свойства, принимает события изменения выбора.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DropdownButton", + "desc": [ + "【value】 : Текущее значение 【T】", + "【items】 : Выпадающий список 【List>】", + "【icon】 : Иконка 【Widget】", + "【elevation】 : Тень 【double】", + "【onChanged】 : Событие выбора элемента 【Function(T)】", + "【backgroundColor】 : Цвет фона 【Color】" + ] + }, + { + "file": "node2_style.dart", + "name": "Указание стиля DropdownButton", + "desc": [ + "【isDense】 : Компактное расположение 【bool】", + "【iconSize】 : Размер иконки 【double】", + "【hint】 : Компонент подсказки 【Widget】", + "【iconEnabledColor】 : Цвет иконки 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json new file mode 100644 index 00000000..4ae73458 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Formular Dropdown", + "info": "Basiert auf der DropdownButton-Implementierung, daher sind die grundlegenden Eigenschaften ähnlich. Verfügt jedoch über die Funktionen von FormField und kann die Methoden onSaved und validator zurückrufen.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung des Formular Dropdowns", + "desc": [ + "【items】 : Liste der Unterkomponenten 【List>】", + "【validator】 : Rückruf für Formularvalidierung 【FormFieldValidator】", + "【onSaved】 : Rückruf für Formularspeicherung 【FormFieldSetter】", + "Weitere Eigenschaften finden Sie unter DropdownButton, Formularvalidierungsfunktionen finden Sie unter FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json new file mode 100644 index 00000000..0ac6e2cf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Form Dropdown", + "info": "It is implemented based on DropdownButton, so it has similar basic properties. However, it has the characteristics of FormField and can call back the onSaved and validator methods.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Simple Usage of Form Dropdown", + "desc": [ + "【items】: List of child components 【List>】", + "【validator】: Form validation callback 【FormFieldValidator】", + "【onSaved】: Form save callback 【FormFieldSetter】", + "For other properties, refer to DropdownButton. For form validation features, refer to FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json new file mode 100644 index 00000000..79188e35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo de selección de formulario", + "info": "Depende de DropdownButton en su implementación subyacente, por lo que las propiedades básicas son similares. Sin embargo, tiene características de FormField, lo que permite devolver los métodos onSaved y validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simple del campo de selección de formulario", + "desc": [ + "【items】: Lista de componentes secundarios 【List>】", + "【validator】: Devolución de llamada de validación de formulario 【FormFieldValidator】", + "【onSaved】: Devolución de llamada de guardado de formulario 【FormFieldSetter】", + "Para otras propiedades, consulte DropdownButton, y para las características de validación de formularios, consulte FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json new file mode 100644 index 00000000..6f9970d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Champ de formulaire déroulant", + "info": "Basé sur DropdownButton, donc les propriétés de base sont similaires. Mais il possède les caractéristiques de FormField, permettant de rappeler les méthodes onSaved et validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple du champ de formulaire déroulant", + "desc": [ + "【items】 : Liste des composants enfants 【List>】", + "【validator】 : Rappel de validation du formulaire 【FormFieldValidator】", + "【onSaved】 : Rappel de sauvegarde du formulaire 【FormFieldSetter】", + "Pour les autres propriétés, voir DropdownButton. Pour les caractéristiques de validation du formulaire, voir FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json new file mode 100644 index 00000000..985a7f29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo a discesa del modulo", + "info": "Si basa sull'implementazione di DropdownButton, quindi le proprietà di base sono simili. Tuttavia, ha le caratteristiche di FormField, può richiamare i metodi onSaved e validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice del campo a discesa del modulo", + "desc": [ + "【items】 : Lista dei componenti figli 【List>】", + "【validator】 : Callback di convalida del modulo 【FormFieldValidator】", + "【onSaved】 : Callback di salvataggio del modulo 【FormFieldSetter】", + "Per altre proprietà, vedere DropdownButton, per le caratteristiche di convalida del modulo, vedere FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json new file mode 100644 index 00000000..a2c48623 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "フォームドロップダウン", + "info": "基盤は DropdownButton に依存して実装されているため、基本的な属性は似ています。ただし、FormField の特性を持っており、onSaved や validator メソッドをコールバックできます。", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "フォームドロップダウンの簡単な使用", + "desc": [ + "【items】 : 子コンポーネントリスト 【List>】", + "【validator】 : フォーム検証コールバック 【FormFieldValidator】", + "【onSaved】 : フォーム保存コールバック 【FormFieldSetter】", + "その他の属性については DropdownButton を参照し、フォーム検証の特性については FormField を参照してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json new file mode 100644 index 00000000..88832c68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "폼 드롭다운", + "info": "기본적으로 DropdownButton에 의존하여 구현되었으므로 기본 속성이 유사합니다. 그러나 FormField의 특성을 가지고 있어 onSaved, validator 메서드를 콜백할 수 있습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "폼 드롭다운 간단 사용", + "desc": [ + "【items】 : 하위 컴포넌트 리스트 【List>】", + "【validator】 : 폼 검증 콜백 【FormFieldValidator】", + "【onSaved】 : 폼 저장 콜백 【FormFieldSetter】", + "기타 속성은 DropdownButton을 참조하고, 폼 검증 특성은 FormField를 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json new file mode 100644 index 00000000..2eff5ad6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Campo de seleção de formulário", + "info": "Implementado com base no DropdownButton, portanto, possui propriedades semelhantes. No entanto, possui características do FormField, podendo chamar os métodos onSaved e validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simples do campo de seleção de formulário", + "desc": [ + "【items】: Lista de componentes filhos 【List>】", + "【validator】: Callback de validação do formulário 【FormFieldValidator】", + "【onSaved】: Callback de salvamento do formulário 【FormFieldSetter】", + "Para outras propriedades, consulte DropdownButton. Para características de validação de formulário, consulte FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json new file mode 100644 index 00000000..f7450f3e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownButtonFormField/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 223, + "name": "DropdownButtonFormField", + "localName": "Выпадающее поле формы", + "info": "Базовая реализация зависит от DropdownButton, поэтому основные свойства схожи. Однако обладает функциями FormField, может вызывать методы onSaved и validator.", + "lever": 2, + "family": 1, + "linkIds": [ + 55, + 222 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование выпадающего поля формы", + "desc": [ + "【items】 : Список дочерних компонентов 【List>】", + "【validator】 : Обратный вызов проверки формы 【FormFieldValidator】", + "【onSaved】 : Обратный вызов сохранения формы 【FormFieldSetter】", + "Другие свойства см. в DropdownButton, функции проверки формы см. в FormField." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json new file mode 100644 index 00000000..73673fe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_de_DE.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Dropdown-Menü", + "info": "Dropdown-Auswahlkomponente, unterstützt Textfilterung und kann Menüelemente anpassen. Basierend auf MenuAnchor und TextFiled.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Einfache Verwendung des Dropdown-Menüs", + "desc": [ + "【dropdownMenuEntries】 : Liste der Menüeinträge 【List>】", + "【initialSelection】 : Rückruf zur Formularvalidierung 【T?】", + "【onSelected】 : Rückruf zur Formularspeicherung 【ValueChanged?】", + "【menuHeight】 : Menühöhe 【double】", + "【width】 : Breite des Eingabefelds 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Stil des Dropdown-Menüs", + "desc": [ + "【controller】 : Text-Eingabe-Controller 【TextEditingController?】", + "【label】 : Label des Eingabefelds 【Widget?】", + "【textStyle】 : Textstil des Eingabefelds 【TextStyle?】", + "【inputDecorationTheme】 : Dekorationsthema des Eingabefelds 【InputDecorationTheme?】", + "【leadingIcon】 : Linkes Symbol 【Widget?】", + "【trailingIcon】 : Rechtes Symbol, wenn das Menü erweitert ist 【Widget?】", + "【selectedTrailingIcon】 : Rechtes Symbol, wenn das Menü erweitert ist 【Widget?】", + "【hintText】 : Hinweistext des Eingabefelds 【String?】", + "【helperText】 : Hilfstext des Eingabefelds 【String?】", + "【errorText】 : Fehlertext des Eingabefelds 【String?】", + "【menuStyle】 : Stil des Popup-Menüs 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Benutzerdefinierte Menüelemente im Dropdown-Menü", + "desc": [ + "Menüelemente können über das labelWidget von DropdownMenuEntry angepasst werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json new file mode 100644 index 00000000..e15e900b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_en_US.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Dropdown Menu", + "info": "Dropdown selection component, supports text input filtering, and allows custom menu items. It mainly relies on MenuAnchor and TextField for implementation.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Simple Usage of Dropdown Menu", + "desc": [ + "【dropdownMenuEntries】 : Menu item list 【List>】", + "【initialSelection】 : Form validation callback 【T?】", + "【onSelected】 : Form save callback 【ValueChanged?】", + "【menuHeight】 : Menu height 【double】", + "【width】 : Input box width 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Dropdown Menu Style Settings", + "desc": [ + "【controller】 : Text input controller 【TextEditingController?】", + "【label】 : Input box label 【Widget?】", + "【textStyle】 : Input box text style 【TextStyle?】", + "【inputDecorationTheme】 : Input box decoration theme 【InputDecorationTheme?】", + "【leadingIcon】 : Left icon 【Widget?】", + "【trailingIcon】 : Right icon when menu is expanded 【Widget?】", + "【selectedTrailingIcon】 : Right icon when menu is expanded 【Widget?】", + "【hintText】 : Input box hint text 【String?】", + "【helperText】 : Input box helper text 【String?】", + "【errorText】 : Input box error text 【String?】", + "【menuStyle】 : Popup menu style 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Custom Menu Items for Dropdown Menu", + "desc": [ + "You can customize the menu items by using the labelWidget of DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json new file mode 100644 index 00000000..aba441ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_es_ES.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menú desplegable", + "info": "Componente de selección desplegable, admite filtrado de entrada de texto y permite personalizar los elementos del menú. Depende principalmente de MenuAnchor y TextFiled para su implementación.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso básico del menú desplegable", + "desc": [ + "【dropdownMenuEntries】 : Lista de entradas del menú 【List>】", + "【initialSelection】 : Callback de validación del formulario 【T?】", + "【onSelected】 : Callback de guardado del formulario 【ValueChanged?】", + "【menuHeight】 : Altura del menú 【double】", + "【width】 : Ancho del campo de entrada 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuración de estilo del menú desplegable", + "desc": [ + "【controller】 : Controlador de entrada de texto 【TextEditingController?】", + "【label】 : Etiqueta del campo de entrada 【Widget?】", + "【textStyle】 : Estilo del texto del campo de entrada 【TextStyle?】", + "【inputDecorationTheme】 : Tema de decoración del campo de entrada 【InputDecorationTheme?】", + "【leadingIcon】 : Icono izquierdo 【Widget?】", + "【trailingIcon】 : Icono derecho cuando el menú está colapsado 【Widget?】", + "【selectedTrailingIcon】 : Icono derecho cuando el menú está expandido 【Widget?】", + "【hintText】 : Texto de sugerencia del campo de entrada 【String?】", + "【helperText】 : Texto auxiliar del campo de entrada 【String?】", + "【errorText】 : Texto de error del campo de entrada 【String?】", + "【menuStyle】 : Estilo del menú emergente 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalización de elementos del menú desplegable", + "desc": [ + "Puede personalizar la construcción de los elementos del menú utilizando labelWidget de DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json new file mode 100644 index 00000000..5af1271f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_fr_FR.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu déroulant", + "info": "Composant de sélection déroulante, prend en charge le filtrage par saisie de texte, et permet de personnaliser les éléments du menu. Il repose principalement sur MenuAnchor et TextFiled pour son implémentation.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation simple du menu déroulant", + "desc": [ + "【dropdownMenuEntries】 : Liste des entrées du menu 【List>】", + "【initialSelection】 : Rappel de validation du formulaire 【T?】", + "【onSelected】 : Rappel de sauvegarde du formulaire 【ValueChanged?】", + "【menuHeight】 : Hauteur du menu 【double】", + "【width】 : Largeur du champ de saisie 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuration du style du menu déroulant", + "desc": [ + "【controller】 : Contrôleur de saisie de texte 【TextEditingController?】", + "【label】 : Étiquette du champ de saisie 【Widget?】", + "【textStyle】 : Style du texte du champ de saisie 【TextStyle?】", + "【inputDecorationTheme】 : Thème de décoration du champ de saisie 【InputDecorationTheme?】", + "【leadingIcon】 : Icône de gauche 【Widget?】", + "【trailingIcon】 : Icône de droite lorsque le menu est déployé 【Widget?】", + "【selectedTrailingIcon】 : Icône de droite lorsque le menu est déployé 【Widget?】", + "【hintText】 : Texte d'indication du champ de saisie 【String?】", + "【helperText】 : Texte d'aide du champ de saisie 【String?】", + "【errorText】 : Texte d'erreur du champ de saisie 【String?】", + "【menuStyle】 : Style du menu contextuel 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personnalisation des éléments du menu déroulant", + "desc": [ + "Il est possible de personnaliser la construction des éléments du menu via le labelWidget de DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json new file mode 100644 index 00000000..074fcd7d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_it_IT.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu a tendina", + "info": "Componente di selezione a tendina, supporta il filtraggio tramite input di testo e consente la personalizzazione delle voci del menu. Si basa principalmente su MenuAnchor e TextFiled per l'implementazione.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso semplice del menu a tendina", + "desc": [ + "【dropdownMenuEntries】 : Lista delle voci del menu 【List>】", + "【initialSelection】 : Callback di convalida del modulo 【T?】", + "【onSelected】 : Callback di salvataggio del modulo 【ValueChanged?】", + "【menuHeight】 : Altezza del menu 【double】", + "【width】 : Larghezza del campo di input 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Impostazione dello stile del menu a tendina", + "desc": [ + "【controller】 : Controller di input del testo 【TextEditingController?】", + "【label】 : Etichetta del campo di input 【Widget?】", + "【textStyle】 : Stile del testo del campo di input 【TextStyle?】", + "【inputDecorationTheme】 : Tema di decorazione del campo di input 【InputDecorationTheme?】", + "【leadingIcon】 : Icona a sinistra 【Widget?】", + "【trailingIcon】 : Icona a destra quando il menu è espanso 【Widget?】", + "【selectedTrailingIcon】 : Icona a destra quando il menu è espanso 【Widget?】", + "【hintText】 : Testo di suggerimento del campo di input 【String?】", + "【helperText】 : Testo di supporto del campo di input 【String?】", + "【errorText】 : Testo di errore del campo di input 【String?】", + "【menuStyle】 : Stile del menu a comparsa 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalizzazione delle voci del menu a tendina", + "desc": [ + "È possibile personalizzare la costruzione delle voci del menu utilizzando il labelWidget di DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json new file mode 100644 index 00000000..cab24c05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ja_JP.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "ドロップダウンメニュー", + "info": "ドロップダウン選択コンポーネント、テキスト入力フィルタリングをサポートし、メニュー項目をカスタマイズ可能。主にMenuAnchorとTextFiledに依存して実装されています。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "ドロップダウンメニューの簡単な使用", + "desc": [ + "【dropdownMenuEntries】 : メニューエントリリスト 【List>】", + "【initialSelection】 : フォーム検証コールバック 【T?】", + "【onSelected】 : フォーム保存コールバック 【ValueChanged?】", + "【menuHeight】 : メニューの高さ 【double】", + "【width】 : 入力ボックスの幅 【double】" + ] + }, + { + "file": "node2.dart", + "name": "ドロップダウンメニューのスタイル設定", + "desc": [ + "【controller】 : テキスト入力コントローラー 【TextEditingController?】", + "【label】 : 入力ボックスのラベル 【Widget?】", + "【textStyle】 : 入力ボックスのテキストスタイル 【TextStyle?】", + "【inputDecorationTheme】 : 入力ボックスの装飾テーマ 【InputDecorationTheme?】", + "【leadingIcon】 : 左側のアイコン 【Widget?】", + "【trailingIcon】 : 右側のメニュー展開時のアイコン 【Widget?】", + "【selectedTrailingIcon】 : 右側のメニュー展開時のアイコン 【Widget?】", + "【hintText】 : 入力ボックスのヒントテキスト 【String?】", + "【helperText】 : 入力ボックスの補助テキスト 【String?】", + "【errorText】 : 入力ボックスのエラーテキスト 【String?】", + "【menuStyle】 : ポップアップメニューのスタイル 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "ドロップダウンメニューのカスタムメニュー項目", + "desc": [ + "DropdownMenuEntryのlabelWidgetを使用してメニュー項目をカスタマイズできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json new file mode 100644 index 00000000..ad696156 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ko_KR.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "드롭다운 메뉴", + "info": "드롭다운 선택 컴포넌트로, 텍스트 입력 필터링을 지원하며 메뉴 항목을 사용자 정의할 수 있습니다. 기본적으로 MenuAnchor와 TextFiled에 의존하여 구현됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "드롭다운 메뉴의 간단한 사용", + "desc": [ + "【dropdownMenuEntries】 : 메뉴 항목 리스트 【List>】", + "【initialSelection】 : 폼 검증 콜백 【T?】", + "【onSelected】 : 폼 저장 콜백 【ValueChanged?】", + "【menuHeight】 : 메뉴 높이 【double】", + "【width】 : 입력 필드 너비 【double】" + ] + }, + { + "file": "node2.dart", + "name": "드롭다운 메뉴 스타일 설정", + "desc": [ + "【controller】 : 텍스트 입력 컨트롤러 【TextEditingController?】", + "【label】 : 입력 필드 라벨 【Widget?】", + "【textStyle】 : 입력 필드 텍스트 스타일 【TextStyle?】", + "【inputDecorationTheme】 : 입력 필드 장식 테마 【InputDecorationTheme?】", + "【leadingIcon】 : 왼쪽 아이콘 【Widget?】", + "【trailingIcon】 : 오른쪽 메뉴 확장 아이콘 【Widget?】", + "【selectedTrailingIcon】 : 오른쪽 메뉴 확장 아이콘 【Widget?】", + "【hintText】 : 입력 필드 힌트 텍스트 【String?】", + "【helperText】 : 입력 필드 보조 텍스트 【String?】", + "【errorText】 : 입력 필드 오류 텍스트 【String?】", + "【menuStyle】 : 팝업 메뉴 스타일 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "드롭다운 메뉴 사용자 정의 메뉴 항목", + "desc": [ + "DropdownMenuEntry의 labelWidget을 통해 메뉴 항목을 사용자 정의할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json new file mode 100644 index 00000000..4442f7fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_pt_PT.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Menu Suspenso", + "info": "Componente de seleção suspensa, suporta filtragem de entrada de texto, e permite personalizar os itens do menu. Depende principalmente de MenuAnchor e TextFiled para implementação.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Simples do Menu Suspenso", + "desc": [ + "【dropdownMenuEntries】 : Lista de entradas do menu 【List>】", + "【initialSelection】 : Callback de validação do formulário 【T?】", + "【onSelected】 : Callback de salvamento do formulário 【ValueChanged?】", + "【menuHeight】 : Altura do menu 【double】", + "【width】 : Largura da caixa de entrada 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Configuração de Estilo do Menu Suspenso", + "desc": [ + "【controller】 : Controlador de entrada de texto 【TextEditingController?】", + "【label】 : Etiqueta da caixa de entrada 【Widget?】", + "【textStyle】 : Estilo do texto da caixa de entrada 【TextStyle?】", + "【inputDecorationTheme】 : Tema de decoração da caixa de entrada 【InputDecorationTheme?】", + "【leadingIcon】 : Ícone à esquerda 【Widget?】", + "【trailingIcon】 : Ícone à direita quando o menu está expandido 【Widget?】", + "【selectedTrailingIcon】 : Ícone à direita quando o menu está expandido 【Widget?】", + "【hintText】 : Texto de dica da caixa de entrada 【String?】", + "【helperText】 : Texto auxiliar da caixa de entrada 【String?】", + "【errorText】 : Texto de erro da caixa de entrada 【String?】", + "【menuStyle】 : Estilo do menu suspenso 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Personalização de Itens do Menu Suspenso", + "desc": [ + "É possível personalizar a construção de itens do menu através do labelWidget do DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json new file mode 100644 index 00000000..e04a851f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/DropdownMenu/desc_ru_RU.json @@ -0,0 +1,46 @@ +{ + "id": 370, + "name": "DropdownMenu", + "localName": "Выпадающее меню", + "info": "Компонент выбора из выпадающего списка, поддерживает фильтрацию по текстовому вводу, позволяет настраивать пункты меню. Основная реализация зависит от MenuAnchor и TextFiled.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1.dart", + "name": "Простое использование выпадающего меню", + "desc": [ + "【dropdownMenuEntries】 : Список пунктов меню 【List>】", + "【initialSelection】 : Обратный вызов проверки формы 【T?】", + "【onSelected】 : Обратный вызов сохранения формы 【ValueChanged?】", + "【menuHeight】 : Высота меню 【double】", + "【width】 : Ширина поля ввода 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Настройка стиля выпадающего меню", + "desc": [ + "【controller】 : Контроллер текстового ввода 【TextEditingController?】", + "【label】 : Метка поля ввода 【Widget?】", + "【textStyle】 : Стиль текста поля ввода 【TextStyle?】", + "【inputDecorationTheme】 : Тема оформления поля ввода 【InputDecorationTheme?】", + "【leadingIcon】 : Иконка слева 【Widget?】", + "【trailingIcon】 : Иконка справа при развернутом меню 【Widget?】", + "【selectedTrailingIcon】 : Иконка справа при развернутом меню 【Widget?】", + "【hintText】 : Подсказка в поле ввода 【String?】", + "【helperText】 : Вспомогательный текст в поле ввода 【String?】", + "【errorText】 : Текст ошибки в поле ввода 【String?】", + "【menuStyle】 : Стиль всплывающего меню 【MenuStyle?】" + ] + }, + { + "file": "node3.dart", + "name": "Настройка пунктов меню выпадающего меню", + "desc": [ + "Можно настроить пункты меню с помощью labelWidget в DropdownMenuEntry." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json new file mode 100644 index 00000000..c74d1d99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Bearbarer Text", + "info": "Bearbarer Text ist die grundlegendste Komponente von TextField und wird in der Regel nicht allein verwendet.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von EditableText", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【focusNode】 : Fokus 【FocusNode】", + "【style】 : Textstil 【TextStyle】", + "【backgroundCursorColor】 : Hintergrundcursorfarbe 【Color】", + "【cursorColor】 : Cursorfarbe 【Color】", + "Die oben genannten fünf Attribute sind für EditableText obligatorisch, andere sind identisch mit TextField und werden hier nicht aufgeführt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json new file mode 100644 index 00000000..54b54a0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Editable Text", + "info": "Editable text is the core component at the bottom layer of TextField and is generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of EditableText", + "desc": [ + "【controller】: Controller 【TextEditingController】", + "【focusNode】: Focus Node 【FocusNode】", + "【style】: Text Style 【TextStyle】", + "【backgroundCursorColor】: Background Cursor Color 【Color】", + "【cursorColor】: Cursor Color 【Color】", + "The above five are the essential properties of EditableText. Others are the same as TextField and will not be listed here." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json new file mode 100644 index 00000000..54869ba9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texto editable", + "info": "Texto que se puede editar, es el componente central subyacente de TextField, generalmente no se usa solo.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de EditableText", + "desc": [ + "【controller】: Controlador 【TextEditingController】", + "【focusNode】: Foco 【FocusNode】", + "【style】: Estilo de texto 【TextStyle】", + "【backgroundCursorColor】: Color del cursor de fondo 【Color】", + "【cursorColor】: Color del cursor 【Color】", + "Los cinco anteriores son atributos obligatorios de EditableText, otros son iguales a TextField, no se enumeran aquí." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json new file mode 100644 index 00000000..8c42e91c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texte modifiable", + "info": "Texte qui peut être édité, c'est le composant central sous-jacent de TextField, généralement non utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de EditableText", + "desc": [ + "【controller】 : Contrôleur 【TextEditingController】", + "【focusNode】 : Nœud de focus 【FocusNode】", + "【style】 : Style de texte 【TextStyle】", + "【backgroundCursorColor】 : Couleur du curseur de fond 【Color】", + "【cursorColor】 : Couleur du curseur 【Color】", + "Les cinq propriétés ci-dessus sont obligatoires pour EditableText, les autres sont similaires à TextField et ne sont pas listées ici." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json new file mode 100644 index 00000000..c3ec0779 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Testo modificabile", + "info": "Testo che può essere modificato, è il componente più fondamentale di TextField, generalmente non utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di EditableText", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【focusNode】 : Focus 【FocusNode】", + "【style】 : Stile del testo 【TextStyle】", + "【backgroundCursorColor】 : Colore del cursore di sfondo 【Color】", + "【cursorColor】 : Colore del cursore 【Color】", + "I cinque attributi sopra sono obbligatori per EditableText, gli altri sono simili a TextField e non verranno elencati qui." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json new file mode 100644 index 00000000..4098e386 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "編集可能なテキスト", + "info": "編集可能なテキストで、TextFieldの最もコアなコンポーネントです。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableTextの基本使用", + "desc": [ + "【controller】 : コントローラー 【TextEditingController】", + "【focusNode】 : フォーカス 【FocusNode】", + "【style】 : テキストスタイル 【TextStyle】", + "【backgroundCursorColor】 : 背景カーソルカラー 【Color】", + "【cursorColor】 : カーソルカラー 【Color】", + "上記の5つはEditableTextの必須属性です。その他はTextFieldと同じで、ここでは列挙しません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json new file mode 100644 index 00000000..b3865d54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "편집 가능한 텍스트", + "info": "편집 가능한 텍스트는 TextField의 가장 핵심적인 구성 요소로, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EditableText 기본 사용법", + "desc": [ + "【controller】 : 컨트롤러 【TextEditingController】", + "【focusNode】 : 포커스 【FocusNode】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【backgroundCursorColor】 : 배경 커서 색상 【Color】", + "【cursorColor】 : 커서 색상 【Color】", + "위 다섯 가지는 EditableText의 필수 속성이며, 나머지는 TextField와 동일하므로 여기서는 더 이상 열거하지 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json new file mode 100644 index 00000000..e558d541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Texto Editável", + "info": "Texto que pode ser editado, é o componente central mais básico do TextField, geralmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do EditableText", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【focusNode】 : Foco 【FocusNode】", + "【style】 : Estilo de Texto 【TextStyle】", + "【backgroundCursorColor】 : Cor do Cursor de Fundo 【Color】", + "【cursorColor】 : Cor do Cursor 【Color】", + "Os cinco acima são atributos obrigatórios do EditableText, outros são semelhantes ao TextField, não serão listados aqui." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json new file mode 100644 index 00000000..b0182f62 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/EditableText/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 244, + "name": "EditableText", + "localName": "Редактируемый текст", + "info": "Редактируемый текст, это основной компонент TextField, обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [ + 2, + 54 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование EditableText", + "desc": [ + "【controller】 : Контроллер 【TextEditingController】", + "【focusNode】 : Фокус 【FocusNode】", + "【style】 : Стиль текста 【TextStyle】", + "【backgroundCursorColor】 : Цвет фонового курсора 【Color】", + "【cursorColor】 : Цвет курсора 【Color】", + "Эти пять свойств являются обязательными для EditableText, остальные аналогичны TextField и здесь не перечисляются." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json new file mode 100644 index 00000000..35e6a1b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Erhobener Button", + "info": "Material-stil erhobener Button, ähnlich wie RaisedButton. Eigenschaften wie Rahmen, Farbe, Schatten können durch Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ElevatedButton", + "desc": [ + "【child】 : Hat es ein scrollendes Hauptelement 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langer Druckereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil von ElevatedButton", + "desc": [ + "【style】 : Button-Stil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json new file mode 100644 index 00000000..ece99fa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Raised Button", + "info": "A Material-styled raised button, similar in behavior to RaisedButton. Properties such as border, color, and shadow can be changed through styling.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ElevatedButton", + "desc": [ + "【child】: Whether it has a scrollable body 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onLongPress】: Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton Style", + "desc": [ + "【style】: Button style 【ButtonStyle】", + "【focusNode】: Focus 【FocusNode】", + "【clipBehavior】: Clip behavior 【Clip】", + "【autofocus】: Auto focus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json new file mode 100644 index 00000000..4381dd4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Botón elevado", + "info": "Botón elevado de estilo Material, similar en comportamiento a RaisedButton. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., mediante estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ElevatedButton", + "desc": [ + "【child】 : Si tiene un cuerpo desplazable 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación prolongada 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de ElevatedButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json new file mode 100644 index 00000000..3768217e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Bouton surélevé", + "info": "Bouton de style Material, similaire à RaisedButton. Les propriétés telles que la bordure, la couleur, l'ombre peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ElevatedButton", + "desc": [ + "【child】 : Si le bouton a un corps défilant 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de pression longue 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style d'ElevatedButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json new file mode 100644 index 00000000..c5887407 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Pulsante sollevato", + "info": "Pulsante in stile Material, simile a RaisedButton. È possibile modificare proprietà come bordo, colore, ombra, ecc. attraverso lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ElevatedButton", + "desc": [ + "【child】 : Se ha un corpo scorrevole 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione lunga 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di ElevatedButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json new file mode 100644 index 00000000..f094a53f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "昇格ボタン", + "info": "Materialスタイルの昇格ボタンで、RaisedButtonと似たような動作をします。スタイルを変更して、ボーダー、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButtonの基本使用", + "desc": [ + "【child】 : スクロール主体を持つかどうか 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json new file mode 100644 index 00000000..af9be933 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "올라간 버튼", + "info": "Material 스타일의 올라간 버튼으로, RaisedButton과 유사하게 동작합니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ElevatedButton 기본 사용법", + "desc": [ + "【child】 : 스크롤 가능한 본체 여부 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "ElevatedButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json new file mode 100644 index 00000000..91c7f259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Botão Elevado", + "info": "Botão elevado no estilo Material, semelhante ao RaisedButton. Pode alterar propriedades como borda, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ElevatedButton", + "desc": [ + "【child】 : Se tem um corpo rolável 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressão longa 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do ElevatedButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json new file mode 100644 index 00000000..91c2bfe1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ElevatedButton/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 354, + "name": "ElevatedButton", + "localName": "Поднятая кнопка", + "info": "Кнопка в стиле Material, похожая на RaisedButton. Можно изменить свойства, такие как граница, цвет, тень и т.д., через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 26, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ElevatedButton", + "desc": [ + "【child】 : Имеет ли прокручиваемое содержимое 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль ElevatedButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json new file mode 100644 index 00000000..adafa04d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Erweitern-Symbol", + "info": "Ein Erweitern-Button, der beim Klicken eine 180-Grad-Drehanimation ausführt. Kann Farbe, Größe, Rand angeben und Klickereignisse empfangen.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpandIcon", + "desc": [ + "【isExpanded】 : Ob erweitert 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【size】 : Symbolgröße 【double】", + "【color】 : Farbe wenn nicht erweitert 【Color】", + "【expandedColor】 : Farbe wenn erweitert 【Color】", + "【onPressed】 : Klickereignis 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json new file mode 100644 index 00000000..09a290c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Expand Icon", + "info": "An expand button that performs a 180-degree rotation animation when clicked. Can specify color, size, margin, and receive click events.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpandIcon", + "desc": [ + "【isExpanded】 : Whether expanded 【bool】", + "【padding】 : Padding 【EdgeInsetsGeometry】,", + "【size】 : Icon size 【double】", + "【color】 : Color when not expanded 【Color】", + "【expandedColor】 : Color when expanded 【Color】", + "【onPressed】 : Click event 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json new file mode 100644 index 00000000..3b1b28a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icono de expansión", + "info": "Un botón de expansión que, al hacer clic, realiza una animación de rotación de 180 grados. Se puede especificar el color, el tamaño, el margen y recibir eventos de clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpandIcon", + "desc": [ + "【isExpanded】 : Si está expandido 【bool】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】,", + "【size】 : Tamaño del icono 【double】", + "【color】 : Color cuando no está expandido 【Color】", + "【expandedColor】 : Color cuando está expandido 【Color】", + "【onPressed】 : Evento de clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json new file mode 100644 index 00000000..31b6694f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icône de déploiement", + "info": "Un bouton de déploiement qui exécute une animation de rotation de 180 degrés lorsqu'il est cliqué. Peut spécifier la couleur, la taille, la marge et recevoir des événements de clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ExpandIcon", + "desc": [ + "【isExpanded】 : Déployé ou non 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】,", + "【size】 : Taille de l'icône 【double】", + "【color】 : Couleur lorsqu'il n'est pas déployé 【Color】", + "【expandedColor】 : Couleur lorsqu'il est déployé 【Color】", + "【onPressed】 : Événement de clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json new file mode 100644 index 00000000..a166b811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Icona Espandi", + "info": "Un pulsante di espansione che esegue un'animazione di rotazione di 180 gradi quando viene cliccato. È possibile specificare colore, dimensione, margine e ricevere eventi di clic.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpandIcon", + "desc": [ + "【isExpanded】 : Se è espanso 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】,", + "【size】 : Dimensione dell'icona 【double】", + "【color】 : Colore quando non è espanso 【Color】", + "【expandedColor】 : Colore quando è espanso 【Color】", + "【onPressed】 : Evento di clic 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json new file mode 100644 index 00000000..561d97c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "展開アイコン", + "info": "展開ボタンで、クリックすると180度回転するアニメーションを自動的に実行します。色、サイズ、マージンを指定でき、クリックイベントを受け取ります。", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIconの基本的な使用", + "desc": [ + "【isExpanded】 : 展開されているかどうか 【bool】", + "【padding】 : パディング 【EdgeInsetsGeometry】,", + "【size】 : アイコンのサイズ 【double】", + "【color】 : 展開されていないときの色 【Color】", + "【expandedColor】 : 展開されているときの色 【Color】", + "【onPressed】 : クリックイベント 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json new file mode 100644 index 00000000..86696afd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "펼치기 아이콘", + "info": "펼치기 버튼으로, 클릭 시 180도 회전 애니메이션을 자동으로 실행합니다. 색상, 크기, 여백을 지정할 수 있으며 클릭 이벤트를 받습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpandIcon 기본 사용", + "desc": [ + "【isExpanded】 : 펼쳐져 있는지 여부 【bool】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】,", + "【size】 : 아이콘 크기 【double】", + "【color】 : 펼쳐지지 않았을 때 색상 【Color】", + "【expandedColor】 : 펼쳐졌을 때 색상 【Color】", + "【onPressed】 : 클릭 이벤트 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json new file mode 100644 index 00000000..61a79288 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Ícone de Expansão", + "info": "Um botão de expansão que executa uma animação de rotação de 180 graus ao ser clicado. Pode especificar cor, tamanho, margem e receber eventos de clique.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ExpandIcon", + "desc": [ + "【isExpanded】 : Se está expandido 【bool】", + "【padding】 : Margem interna 【EdgeInsetsGeometry】,", + "【size】 : Tamanho do ícone 【double】", + "【color】 : Cor quando não expandido 【Color】", + "【expandedColor】 : Cor quando expandido 【Color】", + "【onPressed】 : Evento de clique 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json new file mode 100644 index 00000000..f642cbde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpandIcon/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 51, + "name": "ExpandIcon", + "localName": "Иконка раскрытия", + "info": "Кнопка раскрытия, которая при нажатии выполняет анимацию поворота на 180 градусов. Можно указать цвет, размер, отступы и обрабатывать события нажатия.", + "lever": 1, + "family": 1, + "linkIds": [ + 66, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpandIcon", + "desc": [ + "【isExpanded】 : Раскрыто ли 【bool】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【size】 : Размер иконки 【double】", + "【color】 : Цвет в нераскрытом состоянии 【Color】", + "【expandedColor】 : Цвет в раскрытом состоянии 【Color】", + "【onPressed】 : Событие нажатия 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json new file mode 100644 index 00000000..1fa12fbc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Erweiterungsliste", + "info": "Erweiterbare Listenkomponente, die logisch für einfache oder mehrfache Erweiterungen implementiert werden kann. Kann die Animationsdauer für die Erweiterung festlegen und empfängt einen Rückruf bei der Erweiterung", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpansionPanelList", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【animationDuration】 : Animationsdauer 【Duration】", + "【expansionCallback】 : Rückruf bei Erweiterung 【List】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json new file mode 100644 index 00000000..2c2c9e00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Expandable List", + "info": "A list component that can be expanded, which can implement single or multiple expansions based on logic. You can specify the duration of the expansion animation and receive expansion callbacks.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpansionPanelList", + "desc": [ + "【children】: List of child components 【List】", + "【animationDuration】: Animation duration 【Duration】", + "【expansionCallback】: Expansion callback 【List】", + "【onPressed】: Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json new file mode 100644 index 00000000..7ad00b1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Expandible", + "info": "Componente de lista expandible que puede implementar expansión única o múltiple según la lógica. Puede especificar la duración de la animación de expansión y recibir una devolución de llamada de expansión.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpansionPanelList", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【animationDuration】 : Duración de la animación 【Duration】", + "【expansionCallback】 : Devolución de llamada de expansión 【List】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json new file mode 100644 index 00000000..80df8e54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Liste de déploiement", + "info": "Composant de liste extensible, pouvant être implémenté pour un déploiement unique ou multiple selon la logique. Permet de spécifier la durée de l'animation de déploiement et reçoit un rappel de déploiement.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ExpansionPanelList", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【animationDuration】 : Durée de l'animation 【Duration】", + "【expansionCallback】 : Rappel de déploiement 【List】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json new file mode 100644 index 00000000..eef55654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Espandibile", + "info": "Componente lista espandibile, può essere implementato per espansione singola o multipla in base alla logica. È possibile specificare la durata dell'animazione di espansione e ricevere un callback di espansione", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpansionPanelList", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【animationDuration】 : Durata dell'animazione 【Duration】", + "【expansionCallback】 : Callback di espansione 【List】", + "【onPressed】 : Evento di click 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json new file mode 100644 index 00000000..4d590b2a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "展開リスト", + "info": "展開可能なリストコンポーネントで、ロジックに応じて単一展開または複数展開を実現できます。展開アニメーションの持続時間を指定でき、展開コールバックを受け取ります", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【animationDuration】 : アニメーションの持続時間 【Duration】", + "【expansionCallback】 : 展開コールバック 【List】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json new file mode 100644 index 00000000..21d91c6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "확장 목록", + "info": "확장 가능한 목록 컴포넌트로, 로직에 따라 단일 확장 또는 다중 확장을 구현할 수 있습니다. 확장 애니메이션 지속 시간을 지정할 수 있으며, 확장 콜백을 받습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionPanelList 기본 사용", + "desc": [ + "【children】 : 자식 컴포넌트 목록 【List】", + "【animationDuration】 : 애니메이션 지속 시간 【Duration】", + "【expansionCallback】 : 확장 콜백 【List】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json new file mode 100644 index 00000000..4432a019 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Lista Expansível", + "info": "Componente de lista expansível, pode implementar expansão única ou múltipla de acordo com a lógica. Pode especificar a duração da animação de expansão e receber um callback de expansão.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ExpansionPanelList", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【animationDuration】 : Duração da animação 【Duration】", + "【expansionCallback】 : Callback de expansão 【List】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json new file mode 100644 index 00000000..6ab3ff8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionPanelList/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 178, + "name": "ExpansionPanelList", + "localName": "Раскрывающийся список", + "info": "Раскрывающийся компонент списка, который может быть реализован для одиночного или множественного раскрытия в зависимости от логики. Можно указать продолжительность анимации раскрытия, принимает обратный вызов при раскрытии", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpansionPanelList", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【animationDuration】 : Продолжительность анимации 【Duration】", + "【expansionCallback】 : Обратный вызов при раскрытии 【List】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json new file mode 100644 index 00000000..e0286cec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Erweiterungs-Kachel", + "info": "Ein allgemeines Erweiterungsfeld, das Komponenten an einer bestimmten Stelle platzieren kann. Beim Klicken werden die darunter liegenden Komponenten ein- und ausgeklappt. Empfängt Ereignisse beim Einklappen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ExpansionTile", + "desc": [ + "【children】 : Erweiterungsinhalt 【List】", + "【leading】 : Linke Kopfkomponente 【Widget】", + "【title】 : Mittlere Kopfkomponente 【Widget】", + "【trailing】 : Rechte Kopfkomponente 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【onExpansionChanged】 : Einklapp-Ereignis 【Function(bool)】", + "【initiallyExpanded】 : Beim Start erweitert 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json new file mode 100644 index 00000000..26aadb37 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Expand Tile", + "info": "A general-purpose expansion panel that can place components in specified locations. Clicking it will collapse or expand the components below. Receives events upon collapsing.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ExpansionTile", + "desc": [ + "【children】: Expanded content 【List】", + "【leading】: Leading component 【Widget】", + "【title】: Title component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【onExpansionChanged】: Collapse event 【Function(bool)】", + "【initiallyExpanded】: Whether initially expanded 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json new file mode 100644 index 00000000..bcd41126 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Panel Expandible", + "info": "Un panel expandible genérico que permite colocar componentes en áreas específicas. Al hacer clic, se pliega o despliega para mostrar u ocultar los componentes inferiores. Recibe eventos al plegarse.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ExpansionTile", + "desc": [ + "【children】: Contenido expandido 【List】", + "【leading】: Componente izquierdo del encabezado 【Widget】", + "【title】: Componente central del encabezado 【Widget】", + "【trailing】: Componente derecho del encabezado 【Widget】", + "【backgroundColor】: Color de fondo 【Color】", + "【onExpansionChanged】: Evento de plegado 【Function(bool)】", + "【initiallyExpanded】: Si está inicialmente expandido 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json new file mode 100644 index 00000000..53c7262c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Tuile d'expansion", + "info": "Un panneau d'expansion générique qui peut placer des composants dans une partie spécifiée. Cliquez pour plier ou déplier les composants ci-dessous. Reçoit un événement lors du pliage.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'ExpansionTile", + "desc": [ + "【children】 : Contenu déplié 【List】", + "【leading】 : Composant gauche de la tête 【Widget】", + "【title】 : Composant central de la tête 【Widget】", + "【trailing】 : Composant droit de la tête 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【onExpansionChanged】 : Événement de pliage 【Function(bool)】", + "【initiallyExpanded】 : Déplié initialement 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json new file mode 100644 index 00000000..7c14f9be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Piastrella Espandibile", + "info": "Un pannello espandibile generico, che può posizionare componenti in aree specifiche. Cliccando, si espande o collassa per mostrare o nascondere i componenti sottostanti. Riceve eventi quando viene collassato.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ExpansionTile", + "desc": [ + "【children】 : Contenuto espanso 【List】", + "【leading】 : Componente sinistro dell'intestazione 【Widget】", + "【title】 : Componente centrale dell'intestazione 【Widget】", + "【trailing】 : Componente destro dell'intestazione 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【onExpansionChanged】 : Evento di collassamento 【Function(bool)】", + "【initiallyExpanded】 : Se espanso inizialmente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json new file mode 100644 index 00000000..9dd2b3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "展開タイル", + "info": "一般的な展開バーで、指定された部分にコンポーネントを配置でき、クリックすると下のコンポーネントを折りたたんで表示/非表示にします。折りたたみ時のイベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTileの基本的な使用", + "desc": [ + "【children】 : 展開内容 【List】", + "【leading】 : ヘッダー左コンポーネント 【Widget】", + "【title】 : ヘッダー中央コンポーネント 【Widget】", + "【trailing】 : ヘッダー右コンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【onExpansionChanged】 : 折りたたみイベント 【Function(bool)】", + "【initiallyExpanded】 : 初期状態で展開されているか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json new file mode 100644 index 00000000..ab1bf332 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "확장 타일", + "info": "일반적인 확장 바, 지정된 부분에 컴포넌트를 배치할 수 있으며, 클릭 시 아래 컴포넌트를 접거나 펼칠 수 있습니다. 접힐 때 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ExpansionTile 기본 사용", + "desc": [ + "【children】 : 확장 내용 【List】", + "【leading】 : 헤더 왼쪽 컴포넌트 【Widget】", + "【title】 : 헤더 중앙 컴포넌트 【Widget】", + "【trailing】 : 헤더 오른쪽 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【onExpansionChanged】 : 접힘 이벤트 【Function(bool)】", + "【initiallyExpanded】 : 초기 상태에서 펼쳐져 있는지 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json new file mode 100644 index 00000000..5ad3db3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Azulejo de Expansão", + "info": "Uma barra de expansão genérica que pode ser usada para colocar componentes em uma área especificada. Clicar nela irá expandir ou recolher os componentes abaixo. Recebe eventos quando recolhida.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ExpansionTile", + "desc": [ + "【children】: Conteúdo expandido 【List】", + "【leading】: Componente à esquerda do cabeçalho 【Widget】", + "【title】: Componente no centro do cabeçalho 【Widget】", + "【trailing】: Componente à direita do cabeçalho 【Widget】", + "【backgroundColor】: Cor de fundo 【Color】", + "【onExpansionChanged】: Evento de recolhimento 【Function(bool)】", + "【initiallyExpanded】: Expandido inicialmente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json new file mode 100644 index 00000000..92d07803 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ExpansionTile/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 52, + "name": "ExpansionTile", + "localName": "Раскрывающаяся плитка", + "info": "Универсальная раскрывающаяся панель, в которой можно разместить компоненты в указанной области. При нажатии сворачивает или раскрывает компоненты снизу. Получает события при сворачивании.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ExpansionTile", + "desc": [ + "【children】 : Раскрываемое содержимое 【List】", + "【leading】 : Компонент слева в заголовке 【Widget】", + "【title】 : Компонент в центре заголовка 【Widget】", + "【trailing】 : Компонент справа в заголовке 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【onExpansionChanged】 : Событие сворачивания 【Function(bool)】", + "【initiallyExpanded】 : Раскрыт ли изначально 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json new file mode 100644 index 00000000..54c85111 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Gefüllter Button", + "info": "Ein gefüllter Button, der den Material Design-Richtlinien entspricht, dessen Stil durch FilledButtonTheme festgelegt wird.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Buttoninhalt 【Widget】", + "【onPressed】 : Klick-Ereignis 【VoidCallback】", + "【onHover】 : Hover-Ereignis 【ValueChanged? 】", + "【onLongPress】 : Langdruck-Ereignis 【VoidCallback?】", + "Der gefüllte Button ist visuell nur dem [FloatingActionButton] unterlegen und wird für wichtige, abschließende Aktionen wie Speichern, Sofort beitreten oder Bestätigen verwendet." + ] + }, + { + "file": "node2.dart", + "name": "Farbtonvariante", + "desc": [ + "FilledButton.tonal ist ein tonal gefüllter Button, der visuell zwischen [FilledButton] und [OutlinedButton] liegt und für Szenarien geeignet ist, die eine etwas stärkere Betonung als ein Konturbutton erfordern, aber eine niedrigere Priorität haben. Zum Beispiel der [Weiter] Button." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json new file mode 100644 index 00000000..45d61d7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Filled Button", + "info": "A filled button that conforms to Material Design, with styles set via FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Usage", + "desc": [ + "【child】: Button content 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onHover】: Long press event 【ValueChanged? 】", + "【onLongPress】: Long press event 【VoidCallback?】", + "The filled button is visually second only to [FloatingActionButton] and is used for important, finalizing actions such as save, join now, or confirm." + ] + }, + { + "file": "node2.dart", + "name": "Tonal Variant", + "desc": [ + "FilledButton.tonal is a tonal filled button, visually between [FilledButton] and [OutlinedButton], suitable for scenarios requiring slightly stronger emphasis than an outlined button but with lower priority. For example, a [Next] button." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json new file mode 100644 index 00000000..969b6c36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Botón Relleno", + "info": "Un botón relleno que cumple con Material Design, configurado a través de FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Contenido del botón 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onHover】 : Evento de mantener presionado 【ValueChanged? 】", + "【onLongPress】 : Evento de mantener presionado 【VoidCallback?】", + "El botón relleno es visualmente inferior al [FloatingActionButton], y se utiliza para acciones importantes y finales, como: guardar, unirse ahora o confirmar." + ] + }, + { + "file": "node2.dart", + "name": "Variante Tonal", + "desc": [ + "FilledButton.tonal es un botón relleno tonal, visualmente entre [FilledButton] y [OutlinedButton], adecuado para escenarios que requieren un énfasis ligeramente mayor que el botón de contorno pero con menor prioridad. Por ejemplo, el botón [Siguiente]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json new file mode 100644 index 00000000..e5cf563c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Bouton rempli", + "info": "Un bouton rempli conforme au Material Design, configurable via FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Contenu du bouton 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onHover】 : Événement de survol 【ValueChanged? 】", + "【onLongPress】 : Événement de pression longue 【VoidCallback?】", + "Le bouton rempli est visuellement secondaire au [FloatingActionButton], utilisé pour des actions importantes et finales, comme : sauvegarder, rejoindre immédiatement ou confirmer." + ] + }, + { + "file": "node2.dart", + "name": "Variante tonale", + "desc": [ + "FilledButton.tonal est un bouton rempli tonal, visuellement entre [FilledButton] et [OutlinedButton], adapté pour des scénarios nécessitant une emphase légèrement plus forte que le bouton contour mais avec une priorité moindre. Par exemple, le bouton [Suivant]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json new file mode 100644 index 00000000..065eda6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Pulsante Riempito", + "info": "Un pulsante conforme a Material Design che utilizza FilledButtonTheme per impostare lo stile del pulsante.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso di Base", + "desc": [ + "【child】 : Contenuto del pulsante 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onHover】 : Evento di pressione prolungata 【ValueChanged? 】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback?】", + "Il pulsante riempito è visivamente secondario solo a [FloatingActionButton] e viene utilizzato per operazioni importanti e finali del flusso, come: salvare, unirsi immediatamente o confermare." + ] + }, + { + "file": "node2.dart", + "name": "Variante Tonale", + "desc": [ + "FilledButton.tonal è un pulsante riempito tonale, visivamente intermedio tra [FilledButton] e [OutlinedButton], adatto per scenari che richiedono un'enfasi leggermente maggiore rispetto ai pulsanti contornati ma con priorità inferiore. Ad esempio il pulsante [Avanti]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json new file mode 100644 index 00000000..cc03a205 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "塗りつぶしボタン", + "info": "Material Designに準拠した塗りつぶしボタンで、FilledButtonThemeを使用してボタンのスタイルを設定します。", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "基本使用", + "desc": [ + "【child】 : ボタンの内容 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onHover】 : 長押しイベント 【ValueChanged? 】", + "【onLongPress】 : 長押しイベント 【VoidCallback?】", + "塗りつぶしボタンは視覚的に [FloatingActionButton] に次ぐもので、重要な、最終的なプロセスを完了する操作に使用されます。例えば、保存、即時参加、確認などです。" + ] + }, + { + "file": "node2.dart", + "name": "トーンバリアント", + "desc": [ + "FilledButton.tonal はトーン塗りつぶしボタンで、視覚的に [FilledButton] と [OutlinedButton] の中間に位置し、輪郭ボタンよりもやや強い強調が必要だが優先度が低いシナリオに適しています。例えば [次へ] ボタン" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json new file mode 100644 index 00000000..ac83fa5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "채움 버튼", + "info": "Material Design을 준수하는 채움 버튼으로, FilledButtonTheme을 통해 버튼 스타일을 설정합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "기본 사용", + "desc": [ + "【child】 : 버튼 내용 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onHover】 : 롱프레스 이벤트 【ValueChanged? 】", + "【onLongPress】 : 롱프레스 이벤트 【VoidCallback?】", + "채움 버튼은 시각적으로 [FloatingActionButton] 다음으로 중요하며, 중요한 최종 프로세스 작업에 사용됩니다. 예: 저장, 즉시 가입 또는 확인." + ] + }, + { + "file": "node2.dart", + "name": "톤 변형", + "desc": [ + "FilledButton.tonal은 톤 채움 버튼으로, 시각적으로 [FilledButton]과 [OutlinedButton] 사이에 위치하며, 윤곽 버튼보다 약간 강조가 필요하지만 우선순위가 낮은 시나리오에 적합합니다. 예: [다음] 버튼" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json new file mode 100644 index 00000000..845de819 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Botão Preenchido", + "info": "Um botão preenchido que segue o Material Design, com o estilo definido pelo FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso Básico", + "desc": [ + "【child】 : Conteúdo do botão 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onHover】 : Evento de passar o mouse 【ValueChanged? 】", + "【onLongPress】 : Evento de pressionar e segurar 【VoidCallback?】", + "O botão preenchido é visualmente inferior apenas ao [FloatingActionButton], sendo usado para ações importantes e finais do processo, como: salvar, juntar-se imediatamente ou confirmar." + ] + }, + { + "file": "node2.dart", + "name": "Variante de Tom", + "desc": [ + "FilledButton.tonal é um botão preenchido com tom, visualmente entre [FilledButton] e [OutlinedButton], adequado para cenários que precisam de um pouco mais de ênfase do que um botão de contorno, mas com menor prioridade. Por exemplo, o botão [Próximo]" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json new file mode 100644 index 00000000..ef07de34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FilledButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 359, + "name": "FilledButton", + "localName": "Заполненная кнопка", + "info": "Кнопка, соответствующая Material Design, стиль которой задается через FilledButtonTheme.", + "lever": 4, + "family": 1, + "linkIds": [ + 354, + 355, + 353 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Содержимое кнопки 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onHover】 : Событие наведения 【ValueChanged? 】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback?】", + "Заполненная кнопка визуально уступает только [FloatingActionButton] и используется для важных, завершающих действий, таких как: сохранение, немедленное присоединение или подтверждение." + ] + }, + { + "file": "node2.dart", + "name": "Тональный вариант", + "desc": [ + "FilledButton.tonal - это тональная заполненная кнопка, визуально находящаяся между [FilledButton] и [OutlinedButton], подходит для сценариев, где требуется немного больше акцента, чем у контурной кнопки, но с более низким приоритетом. Например, кнопка [Далее]." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json new file mode 100644 index 00000000..60ccb469 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_de_DE.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Fokus-Komponente", + "info": "Eine Komponente zur Verwaltung von [FocusNode], die es ermöglicht, den Tastaturfokus auf dieses Widget und seine Unterbaumknoten zu setzen.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode Fokussierung und Defokussierung", + "desc": [ + "【focusNode】 : Fokus 【FocusNode?】", + "【onFocusChange】 : Fokusänderungsüberwachung 【ValueChanged?】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Automatische Fokussierung", + "desc": [ + "【autofocus】 : Automatische Fokussierung 【bool】", + "Das Flutter-Framework verfügt über integrierte Tastenkombinationen für den Fokuswechsel, z. B. ← und → für die horizontale Bildlaufleiste, um den Fokus auf das vorherige bzw. nächste Element zu setzen. Die Tab-Taste kann den Fokus auf den nächsten Focus-Knoten setzen." + ] + }, + { + "file": "node3.dart", + "name": "Tastaturereignis-Rückruf", + "desc": [ + "【onKeyEvent】 : Tastaturereignis-Rückruf 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json new file mode 100644 index 00000000..ba989bf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_en_US.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Focus Component", + "info": "A component that manages [FocusNode], used to allow keyboard focus to be assigned to this widget and its subtree nodes.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode Focus and Blur", + "desc": [ + "【focusNode】 : Focus 【FocusNode?】", + "【onFocusChange】 : Focus change listener 【ValueChanged?】", + "【child】 : Child widget 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Auto Focus", + "desc": [ + "【autofocus】 : Whether to auto focus 【bool】", + "The Flutter framework has built-in shortcuts for focus switching, such as ← and → for horizontal sliding lists to focus on the previous and next items respectively. The Tab key can focus on the next Focus node." + ] + }, + { + "file": "node3.dart", + "name": "Keyboard Event Callback", + "desc": [ + "【onKeyEvent】 : Keyboard event callback 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json new file mode 100644 index 00000000..cddd075d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_es_ES.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente de enfoque", + "info": "Un componente que gestiona [FocusNode], utilizado para permitir que el enfoque del teclado se asigne a este widget y a los nodos de su subárbol.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Enfoque y desenfoque de FocusNode", + "desc": [ + "【focusNode】 : enfoque 【FocusNode?】", + "【onFocusChange】 : escucha de cambios de enfoque 【ValueChanged?】", + "【child】 : componente hijo 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Enfoque automático", + "desc": [ + "【autofocus】 : si se enfoca automáticamente 【bool】", + "El marco de Flutter incluye atajos de teclado para cambiar el enfoque, como deslizar horizontalmente la lista ←, → para enfocar el elemento anterior y posterior respectivamente. La tecla Tab puede enfocar el siguiente nodo Focus." + ] + }, + { + "file": "node3.dart", + "name": "Devolución de llamada de eventos de teclado", + "desc": [ + "【onKeyEvent】 : devolución de llamada de eventos de teclado 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json new file mode 100644 index 00000000..4e14496c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_fr_FR.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Composant de mise au point", + "info": "Un composant qui gère [FocusNode], utilisé pour permettre au focus clavier d'être attribué à ce widget et à ses nœuds enfants.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Mise au point et perte de focus de FocusNode", + "desc": [ + "【focusNode】 : focus 【FocusNode?】", + "【onFocusChange】 : écouteur de changement de focus 【ValueChanged?】", + "【child】 : composant enfant 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Mise au point automatique", + "desc": [ + "【autofocus】 : mise au point automatique 【bool】", + "Le framework Flutter intègre des raccourcis clavier pour changer le focus, par exemple, dans une liste défilable horizontalement, ← et → permettent de se concentrer respectivement sur l'élément précédent et suivant. La touche Tab permet de se concentrer sur le nœud Focus suivant" + ] + }, + { + "file": "node3.dart", + "name": "Rappel d'événement clavier", + "desc": [ + "【onKeyEvent】 : rappel d'événement clavier 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json new file mode 100644 index 00000000..f44e45b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_it_IT.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente Focus", + "info": "Un componente che gestisce [FocusNode], utilizzato per consentire che il focus della tastiera venga assegnato a questo widget e ai suoi nodi secondari.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode messa a fuoco e perdita di fuoco", + "desc": [ + "【focusNode】 : focus 【FocusNode?】", + "【onFocusChange】 : listener per il cambio di focus 【ValueChanged?】", + "【child】 : componente figlio 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Autofocus", + "desc": [ + "【autofocus】 : se mettere a fuoco automaticamente 【bool】", + "Il framework Flutter ha scorciatoie integrate per il cambio di focus, ad esempio in una lista scorrevole orizzontalmente ← e → mettono a fuoco rispettivamente l'elemento precedente e successivo. Il tasto Tab può mettere a fuoco il prossimo nodo Focus." + ] + }, + { + "file": "node3.dart", + "name": "Callback per eventi della tastiera", + "desc": [ + "【onKeyEvent】 : callback per eventi della tastiera 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json new file mode 100644 index 00000000..223fd449 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ja_JP.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "フォーカスコンポーネント", + "info": "[FocusNode]を管理するコンポーネントで、キーボードフォーカスをこのウィジェットとそのサブツリーノードに与えることを可能にします。", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode フォーカスとフォーカス解除", + "desc": [ + "【focusNode】 : フォーカス 【FocusNode?】", + "【onFocusChange】 : フォーカス変更リスナー 【ValueChanged?】", + "【child】 : 子コンポーネント 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "自動フォーカス", + "desc": [ + "【autofocus】 : 自動フォーカスするかどうか 【bool】", + "Flutterフレームワークには、フォーカス切り替えのショートカットキーが組み込まれており、例えば横方向にスクロールするリストでは ←、→ で前後の項目にフォーカスが移動します。Tabキーで次のFocusノードにフォーカスを移動できます" + ] + }, + { + "file": "node3.dart", + "name": "キーボードイベントコールバック", + "desc": [ + "【onKeyEvent】 : キーボードイベントコールバック 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json new file mode 100644 index 00000000..e78e6542 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ko_KR.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "포커스 컴포넌트", + "info": "[FocusNode]를 관리하는 컴포넌트로, 키보드 포커스가 해당 위젯 및 하위 트리 노드에 부여될 수 있도록 합니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "FocusNode 포커스와 포커스 해제", + "desc": [ + "【focusNode】 : 포커스 【FocusNode?】", + "【onFocusChange】 : 포커스 변화 리스너 【ValueChanged?】", + "【child】 : 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "자동 포커스", + "desc": [ + "【autofocus】 : 자동 포커스 여부 【bool】", + "Flutter 프레임워크는 포커스 전환을 위한 단축키를 내장하고 있습니다. 예를 들어, 가로 스크롤 목록에서 ←, →는 각각 이전 항목과 다음 항목에 포커스를 줍니다. Tab 키는 다음 Focus 노드에 포커스를 줄 수 있습니다." + ] + }, + { + "file": "node3.dart", + "name": "키보드 이벤트 콜백", + "desc": [ + "【onKeyEvent】 : 키보드 이벤트 콜백 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json new file mode 100644 index 00000000..840780c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_pt_PT.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Componente de Foco", + "info": "Um componente que gerencia [FocusNode], usado para permitir que o foco do teclado seja atribuído a este widget e aos nós da sua subárvore.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Foco e Desfoco do FocusNode", + "desc": [ + "【focusNode】 : Foco 【FocusNode?】", + "【onFocusChange】 : Monitoramento de mudança de foco 【ValueChanged?】", + "【child】 : Componente filho 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Foco Automático", + "desc": [ + "【autofocus】 : Foco automático 【bool】", + "O framework Flutter possui atalhos de teclado embutidos para alternar o foco, como ← e → em listas de deslizamento horizontal para focar o item anterior e o próximo. A tecla Tab pode focar o próximo nó Focus." + ] + }, + { + "file": "node3.dart", + "name": "Callback de Evento de Teclado", + "desc": [ + "【onKeyEvent】 : Callback de evento de teclado 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json new file mode 100644 index 00000000..00506af5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Focus/desc_ru_RU.json @@ -0,0 +1,38 @@ +{ + "id": 282, + "name": "Focus", + "localName": "Компонент фокуса", + "info": "Компонент, управляющий [FocusNode], который позволяет клавиатурному фокусу быть назначенным на этот виджет и его дочерние узлы.", + "lever": 5, + "family": 1, + "linkIds": [ + 283, + 284 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Фокусировка и потер фокуса FocusNode", + "desc": [ + "【focusNode】 : фокус 【FocusNode?】", + "【onFocusChange】 : отслеживание изменений фокуса 【ValueChanged?】", + "【child】 : дочерний компонент 【Widget】" + ] + }, + { + "file": "node2.dart", + "name": "Автоматическая фокусировка", + "desc": [ + "【autofocus】 : автоматическая фокусировка 【bool】", + "Фреймворк Flutter имеет встроенные сочетания клавиш для переключения фокуса, например, ← и → для горизонтального списка позволяют фокусироваться на предыдущем и следующем элементе. Клавиша Tab позволяет фокусироваться на следующем узле Focus." + ] + }, + { + "file": "node3.dart", + "name": "Обратный вызов событий клавиатуры", + "desc": [ + "【onKeyEvent】 : обратный вызов событий клавиатуры 【FocusOnKeyEventCallback?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json new file mode 100644 index 00000000..73eda55c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Formular-Komponente", + "info": "Die Formular-Komponente kann Rückrufe für Änderungen der darunter liegenden FormField-Komponenten empfangen, den Seitenrückruf über onWillPop abfangen und Formularfelder über FormState speichern oder validieren.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Form", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onChanged】 : Rückruf bei Formularänderungen 【VoidCallback】", + "【onWillPop】 : Rückruf bei Rückkehr 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json new file mode 100644 index 00000000..f2e847d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Form Component", + "info": "Form component, which can receive change callbacks from FormField components below it, intercept page returns through onWillPop, and save or validate form fields through FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Form", + "desc": [ + "【child】 : Child component 【Widget】", + "【onChanged】 : Form change callback 【VoidCallback】", + "【onWillPop】 : Return callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json new file mode 100644 index 00000000..dfcab4d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente de formulario", + "info": "Componente de formulario que puede recibir devoluciones de llamada de cambios de los componentes FormField debajo de él, interceptar el retorno de la página a través de onWillPop, y guardar o validar los campos del formulario a través de FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Form", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onChanged】 : Devolución de llamada de cambio de formulario 【VoidCallback】", + "【onWillPop】 : Devolución de llamada de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json new file mode 100644 index 00000000..0ac4e0db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Composant de formulaire", + "info": "Le composant de formulaire peut recevoir les rappels de changement des composants FormField qui lui sont associés, intercepter le retour de la page via onWillPop, et enregistrer ou valider les champs du formulaire via FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Form", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onChanged】 : Rappel de changement de formulaire 【VoidCallback】", + "【onWillPop】 : Rappel de retour 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json new file mode 100644 index 00000000..cdc73cfe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente modulo", + "info": "Il componente modulo può ricevere callback di modifica dai componenti FormField sottostanti, intercetta il ritorno alla pagina tramite onWillPop e consente di salvare o convalidare i campi del modulo tramite FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Form", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onChanged】 : Callback per le modifiche del modulo 【VoidCallback】", + "【onWillPop】 : Callback di ritorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json new file mode 100644 index 00000000..f7190629 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "フォームコンポーネント", + "info": "フォームコンポーネントは、その下のFormFieldコンポーネントの変更コールバックを受け取ることができ、onWillPopでページの戻りをインターセプトし、FormStateでフォームフィールドを保存または検証することができます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Formの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onChanged】 : フォーム変更コールバック 【VoidCallback】", + "【onWillPop】 : 戻りコールバック 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json new file mode 100644 index 00000000..dd14d454 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "폼 컴포넌트", + "info": "폼 컴포넌트는 하위 FormField 컴포넌트의 변경 콜백을 받을 수 있으며, onWillPop을 통해 페이지 반환을 가로채고, FormState를 통해 폼 필드를 저장하거나 검증할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Form 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onChanged】 : 폼 변경 콜백 【VoidCallback】", + "【onWillPop】 : 반환 콜백 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json new file mode 100644 index 00000000..679d3393 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Componente de Formulário", + "info": "Componente de formulário, pode receber retornos de chamada de alterações dos componentes FormField abaixo dele, interceptar o retorno da página através de onWillPop, e salvar ou validar os campos do formulário através de FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Form", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onChanged】 : Retorno de chamada de alteração do formulário 【VoidCallback】", + "【onWillPop】 : Retorno de chamada de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json new file mode 100644 index 00000000..58c176a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Form/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 198, + "name": "Form", + "localName": "Компонент формы", + "info": "Компонент формы, который может получать обратные вызовы изменений от компонентов FormField, перехватывать возврат на страницу через onWillPop, а также сохранять или проверять поля формы через FormState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Form", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onChanged】 : Обратный вызов изменения формы 【VoidCallback】", + "【onWillPop】 : Обратный вызов возврата 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json new file mode 100644 index 00000000..40fa20bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Formularfeld", + "info": "Ein Formularfeld, das in der Form-Komponente verwendet werden muss, enthält ein Feld des generischen Typs T als Zustandsvariable. Aktualisierungen und Validierungen des Felds lösen entsprechende Rückrufe aus.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in FormField", + "desc": [ + "【builder】 : Inhaltsersteller 【FormFieldBuilder】", + "【initialValue】 : Anfangswert 【T】", + "【validator】 : Validierungsfunktion 【FormFieldValidator 】", + "【enabled】 : Ist aktiviert 【bool】", + "【onSaved】 : Rückruf beim Speichern des Formulars 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json new file mode 100644 index 00000000..c4b8578a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Form Field", + "info": "A form field that needs to be used within the Form component, containing a field of generic type T as the state. Updates and validations of the field will trigger corresponding callbacks.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField Introduction", + "desc": [ + "【builder】 : Content builder 【FormFieldBuilder】", + "【initialValue】 : Initial value 【T】", + "【validator】 : Validation function 【FormFieldValidator】", + "【enabled】 : Whether it is enabled 【bool】", + "【onSaved】 : Callback when the form is saved 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json new file mode 100644 index 00000000..b5f3f784 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo de formulario", + "info": "Un campo de formulario que debe usarse en el componente Form, contiene un campo de tipo genérico T como estado, y las actualizaciones y validaciones del campo activarán las devoluciones de llamada correspondientes.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a FormField", + "desc": [ + "【builder】 : Constructor de contenido 【FormFieldBuilder】", + "【initialValue】 : Valor inicial 【T】", + "【validator】 : Función de validación 【FormFieldValidator 】", + "【enabled】 : Si está habilitado 【bool】", + "【onSaved】 : Devolución de llamada al guardar el formulario 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json new file mode 100644 index 00000000..849cbfd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Champ de formulaire", + "info": "Un champ de formulaire, à utiliser dans le composant Form, contenant un champ de type générique T comme état, les mises à jour et les validations du champ déclenchent des rappels correspondants.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à FormField", + "desc": [ + "【builder】 : Constructeur de contenu 【FormFieldBuilder】", + "【initialValue】 : Valeur initiale 【T】", + "【validator】 : Fonction de validation 【FormFieldValidator 】", + "【enabled】 : Est activé 【bool】", + "【onSaved】 : Rappel lors de la sauvegarde du formulaire 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json new file mode 100644 index 00000000..83bb81b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo del modulo", + "info": "Un campo del modulo, deve essere utilizzato nel componente Form, contiene un campo di tipo generico T come stato, gli aggiornamenti e le validazioni del campo attivano i rispettivi callback.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a FormField", + "desc": [ + "【builder】 : Costruttore del contenuto 【FormFieldBuilder】", + "【initialValue】 : Valore iniziale 【T】", + "【validator】 : Funzione di validazione 【FormFieldValidator 】", + "【enabled】 : Se è abilitato 【bool】", + "【onSaved】 : Callback quando il modulo viene salvato 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json new file mode 100644 index 00000000..cf65e35f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "フォームフィールド", + "info": "フォームフィールドは、Formコンポーネント内で使用する必要があり、ジェネリック型Tのフィールドを状態量として含みます。フィールドの更新と検証に応じて、対応するコールバックがトリガーされます。", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 紹介", + "desc": [ + "【builder】 : 内容ビルダー 【FormFieldBuilder】", + "【initialValue】 : 初期値 【T】", + "【validator】 : 検証関数 【FormFieldValidator 】", + "【enabled】 : 有効かどうか 【bool】", + "【onSaved】 : フォーム保存時のコールバック 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json new file mode 100644 index 00000000..28777a15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "폼 필드", + "info": "폼 필드는 Form 컴포넌트 내에서 사용되며, 상태량으로 제네릭 T의 필드를 포함합니다. 필드의 업데이트 및 검증에 따라 해당 콜백이 트리거됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FormField 소개", + "desc": [ + "【builder】 : 콘텐츠 빌더 【FormFieldBuilder】", + "【initialValue】 : 초기값 【T】", + "【validator】 : 검증 함수 【FormFieldValidator 】", + "【enabled】 : 유효 여부 【bool】", + "【onSaved】 : 폼 저장 시 콜백 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json new file mode 100644 index 00000000..cf1bcc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Campo de Formulário", + "info": "Um campo de formulário, que precisa ser usado no componente Form, contém um campo do tipo genérico T como estado, e as atualizações e validações do campo acionam callbacks correspondentes.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao FormField", + "desc": [ + "【builder】 : Construtor de conteúdo 【FormFieldBuilder】", + "【initialValue】 : Valor inicial 【T】", + "【validator】 : Função de validação 【FormFieldValidator 】", + "【enabled】 : Se está ativo 【bool】", + "【onSaved】 : Callback ao salvar o formulário 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json new file mode 100644 index 00000000..95155cf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FormField/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 222, + "name": "FormField", + "localName": "Поле формы", + "info": "Поле формы, которое должно использоваться в компоненте Form, содержит поле типа T в качестве состояния. Обновление и проверка поля вызывают соответствующие обратные вызовы.", + "lever": 2, + "family": 1, + "linkIds": [ + 198, + 199, + 223 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в FormField", + "desc": [ + "【builder】 : Конструктор содержимого 【FormFieldBuilder】", + "【initialValue】 : Начальное значение 【T】", + "【validator】 : Функция проверки 【FormFieldValidator 】", + "【enabled】 : Активно ли поле 【bool】", + "【onSaved】 : Обратный вызов при сохранении формы 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json new file mode 100644 index 00000000..8e76619d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Asynchroner Konstruktor", + "info": "Kann ein Future-Objekt angeben, das den Status der asynchronen Ausführung überwachen kann und im Konstruktor unterschiedliche Schnittstellen basierend auf dem Status erstellt. Beachten Sie, dass das Future-Objekt nicht gleichzeitig mit dem FutureBuilder erstellt werden kann, da dies zu übermäßigen Aktualisierungen führen kann.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von FutureBuilder", + "desc": [ + "【builder】 : Unterkomponente 【AsyncWidgetBuilder】", + "【initialData】 : Initialdaten 【T】", + "【future】 : Asynchrone Aufgabe 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json new file mode 100644 index 00000000..ee2173e0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Asynchronous Constructor", + "info": "You can specify a Future object, which can monitor the status of asynchronous execution and build different interfaces in the constructor based on the status. Note that the Future object cannot be created simultaneously with the FutureBuilder, otherwise it may cause excessive refreshing.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of FutureBuilder", + "desc": [ + "【builder】 : Subcomponent 【AsyncWidgetBuilder】", + "【initialData】 : Initial Data 【T】", + "【future】 : Asynchronous Task 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json new file mode 100644 index 00000000..0d574611 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Constructor Asíncrono", + "info": "Puede especificar un objeto Future, que puede monitorear el estado de la ejecución asíncrona y construir diferentes interfaces en el constructor según el estado. Tenga en cuenta que este objeto Future no se puede crear simultáneamente con FutureBuilder, de lo contrario podría provocar una actualización excesiva.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de FutureBuilder", + "desc": [ + "【builder】 : Componente hijo 【AsyncWidgetBuilder】", + "【initialData】 : Datos iniciales 【T】", + "【future】 : Tarea asíncrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json new file mode 100644 index 00000000..b3e47444 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Constructeur asynchrone", + "info": "Peut spécifier un objet Future, capable d'écouter l'état de l'exécution asynchrone et de construire des interfaces différentes dans le constructeur en fonction de l'état. Notez que cet objet Future ne peut pas être créé en même temps que FutureBuilder, sinon il pourrait y avoir un rafraîchissement excessif.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de FutureBuilder", + "desc": [ + "【builder】 : Composant enfant 【AsyncWidgetBuilder】", + "【initialData】 : Données initiales 【T】", + "【future】 : Tâche asynchrone 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json new file mode 100644 index 00000000..f1f0e453 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Costruttore Asincrono", + "info": "Puoi specificare un oggetto Future, che può monitorare lo stato dell'esecuzione asincrona e costruire interfacce diverse nel costruttore in base allo stato. Nota che l'oggetto Future non può essere creato contemporaneamente al FutureBuilder, altrimenti potrebbe causare un aggiornamento eccessivo.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di FutureBuilder", + "desc": [ + "【builder】 : Componente Figlio 【AsyncWidgetBuilder】", + "【initialData】 : Dati Iniziali 【T】", + "【future】 : Attività Asincrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json new file mode 100644 index 00000000..80034fe8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "非同期ビルダー", + "info": "Futureオブジェクトを指定することができ、非同期実行の状態を監視し、ビルダー内で状態に応じて異なるインターフェースを構築できます。このFutureオブジェクトはFutureBuilderと同時に作成しないでください。そうしないと、過剰なリフレッシュが発生する可能性があります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilderの基本使用", + "desc": [ + "【builder】 : 子コンポーネント 【AsyncWidgetBuilder】", + "【initialData】 : 初期データ 【T】", + "【future】 : 非同期タスク 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json new file mode 100644 index 00000000..0079d897 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "비동기 빌더", + "info": "Future 객체를 지정할 수 있으며, 비동기 실행 상태를 모니터링하고 빌더에서 상태에 따라 다른 인터페이스를 구성할 수 있습니다. 주의할 점은 해당 Future 객체가 FutureBuilder와 동시에 생성되면 과도한 새로고침이 발생할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FutureBuilder 기본 사용", + "desc": [ + "【builder】 : 자식 컴포넌트 【AsyncWidgetBuilder】", + "【initialData】 : 초기 데이터 【T】", + "【future】 : 비동기 작업 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json new file mode 100644 index 00000000..3d3ae963 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Construtor Assíncrono", + "info": "Pode especificar um objeto Future, que pode monitorar o estado da execução assíncrona e construir diferentes interfaces no construtor com base no estado. Observe que o objeto Future não pode ser criado ao mesmo tempo que o FutureBuilder, caso contrário, pode ocorrer uma atualização excessiva.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do FutureBuilder", + "desc": [ + "【builder】 : Componente Filho 【AsyncWidgetBuilder】", + "【initialData】 : Dados Iniciais 【T】", + "【future】 : Tarefa Assíncrona 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json new file mode 100644 index 00000000..b841a64e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/FutureBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 172, + "name": "FutureBuilder", + "localName": "Асинхронный конструктор", + "info": "Можно указать объект Future, который может отслеживать состояние асинхронного выполнения и строить различные интерфейсы в конструкторе в зависимости от состояния. Обратите внимание, что объект Future не может быть создан одновременно с FutureBuilder, иначе может произойти чрезмерное обновление.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование FutureBuilder", + "desc": [ + "【builder】 : Дочерний компонент 【AsyncWidgetBuilder】", + "【initialData】 : Начальные данные 【T】", + "【future】 : Асинхронная задача 【Future】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json new file mode 100644 index 00000000..61cd130d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Überlaufindikator", + "info": "Das Kind ist eine scrollbare Liste, die einen Indikatoreffekt anzeigt, wenn man oben und unten scrollt. Die Farbe kann angegeben werden, hat aber keine große Bedeutung. Es ist der Standard-Scrolleffekt für Android- und Fuchsia-Systeme.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【showLeading】 : Ob der Kopf aktiv ist 【bool】", + "【showTrailing】 : Ob das Ende aktiv ist 【bool】", + "【axisDirection】 : Achsenrichtung 【AxisDirection】", + "【color】 : Farbe 【Color】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json new file mode 100644 index 00000000..f1128401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Scroll Boundary Indicator", + "info": "A child is a scrollable list, with an indicator effect when scrolling to the top and bottom. The color can be specified, but it is not very useful. It is the default scrolling effect for Android and Fuchsia systems.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【showLeading】: Whether the header is active 【bool】", + "【showTrailing】: Whether the footer is active 【bool】", + "【axisDirection】: Axis direction 【AxisDirection】", + "【color】: Color 【Color】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json new file mode 100644 index 00000000..24fa1922 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicador de desplazamiento fuera de límites", + "info": "El niño es una lista deslizable, el efecto indicador cuando se desliza hacia la parte superior e inferior, se puede especificar el color, no es muy útil. Es el efecto de deslizamiento predeterminado del sistema Android y Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【showLeading】 : Si la cabeza es efectiva 【bool】", + "【showTrailing】 : Si la parte inferior es efectiva 【bool】", + "【axisDirection】 : Dirección del eje 【AxisDirection】", + "【color】 : Color 【Color】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json new file mode 100644 index 00000000..3c75e0de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicateur de dépassement de défilement", + "info": "L'enfant est une liste déroulante, l'effet indicateur lorsqu'on fait défiler vers le haut et le bas, la couleur peut être spécifiée, mais ce n'est pas très utile. C'est l'effet de défilement par défaut des systèmes Android et Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【showLeading】 : Si la tête est active 【bool】", + "【showTrailing】 : Si le bas est actif 【bool】", + "【axisDirection】 : Direction de l'axe 【AxisDirection】", + "【color】 : Couleur 【Color】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json new file mode 100644 index 00000000..2a9d76dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicatore di scorrimento oltre i limiti", + "info": "Il bambino è una lista scorrevole, con un effetto indicatore quando si scorre verso l'alto e verso il basso, è possibile specificare il colore, ma non è molto utile. È l'effetto di scorrimento predefinito per i sistemi Android e Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base", + "desc": [ + "【showLeading】 : Se la parte superiore è attiva 【bool】", + "【showTrailing】 : Se la parte inferiore è attiva 【bool】", + "【axisDirection】 : Direzione dell'asse 【AxisDirection】", + "【color】 : Colore 【Color】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json new file mode 100644 index 00000000..1623f5e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "スクロールオーバーインジケーター", + "info": "子要素がスクロール可能なリストで、上部または下部にスクロールした際のインジケーター効果です。色を指定できますが、あまり役に立ちません。AndroidとFuchsiaシステムのデフォルトのスクロール効果です。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本使用", + "desc": [ + "【showLeading】 : ヘッダーが有効かどうか 【bool】", + "【showTrailing】 : フッターが有効かどうか 【bool】", + "【axisDirection】 : 軸方向 【AxisDirection】", + "【color】 : 色 【Color】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json new file mode 100644 index 00000000..66a187c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "스크롤 오버스크롤 표시기", + "info": "자식이 스크롤 가능한 리스트일 때, 상단과 하단으로 스크롤할 때의 표시 효과. 색상을 지정할 수 있지만 큰 의미는 없습니다. Android와 Fuchsia 시스템의 기본 스크롤 효과입니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용", + "desc": [ + "【showLeading】 : 헤더가 활성화되는지 여부 【bool】", + "【showTrailing】 : 하단이 활성화되는지 여부 【bool】", + "【axisDirection】 : 축 방향 【AxisDirection】", + "【color】 : 색상 【Color】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json new file mode 100644 index 00000000..c74b8ea2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Indicador de deslizamento fora dos limites", + "info": "A criança é uma lista deslizante, o efeito indicador quando desliza para o topo e para a base, pode especificar a cor, não tem muita utilidade. É o efeito de deslizamento padrão do sistema Android e Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【showLeading】 : Se o cabeçalho está ativo 【bool】", + "【showTrailing】 : Se a base está ativa 【bool】", + "【axisDirection】 : Direção do eixo 【AxisDirection】", + "【color】 : Cor 【Color】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json new file mode 100644 index 00000000..62a47392 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/GlowingOverscrollIndicator/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 250, + "name": "GlowingOverscrollIndicator", + "localName": "Индикатор прокрутки за пределы", + "info": "Дети - это прокручиваемый список, индикаторный эффект при прокрутке до верха и низа, можно указать цвет, не имеет большого значения. Это эффект прокрутки по умолчанию для систем Android и Fuchsia.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【showLeading】 : Действует ли на голову 【bool】", + "【showTrailing】 : Действует ли на дно 【bool】", + "【axisDirection】 : Направление оси 【AxisDirection】", + "【color】 : Цвет 【Color】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json new file mode 100644 index 00000000..0ab7c519 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Geteilter Animationseffekt", + "info": "Es kann ein Labelname angegeben werden. Wenn zwei Schnittstellen umgeschaltet werden, führen Komponenten mit demselben Label einen gemeinsamen Animationseffekt aus. In einer Schnittstelle können nicht zwei Hero-Labels mit demselben Namen existieren.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Hero", + "desc": [ + "【tag】 : Label 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json new file mode 100644 index 00000000..b6a0e733 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Shared Animation", + "info": "You can specify a tag name, and components with the same tag will perform a shared animation when transitioning between two interfaces. There cannot be two Hero tags with the same name in one interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Hero", + "desc": [ + "【tag】 : tag 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json new file mode 100644 index 00000000..72665027 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animación compartida", + "info": "Se puede especificar un nombre de etiqueta, los componentes con la misma etiqueta realizarán una animación compartida al saltar entre dos interfaces. No pueden existir dos etiquetas Hero con el mismo nombre en una misma interfaz.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Hero", + "desc": [ + "【tag】 : etiqueta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json new file mode 100644 index 00000000..efe22337 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animation partagée", + "info": "Vous pouvez spécifier un nom de tag, les composants avec le même tag effectueront une animation partagée lors du changement d'interface. Il ne peut pas y avoir deux tags Hero avec le même nom dans une même interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Hero", + "desc": [ + "【tag】 : étiquette 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json new file mode 100644 index 00000000..4003710e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animazione condivisa", + "info": "È possibile specificare un nome di tag. Quando si passa da un'interfaccia all'altra, i componenti con lo stesso tag eseguiranno un'animazione condivisa. Non possono esistere due tag Hero con lo stesso nome in un'interfaccia.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Hero", + "desc": [ + "【tag】 : etichetta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json new file mode 100644 index 00000000..da433da6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "共有アニメーション", + "info": "タグ名を指定でき、2つの画面間で同じタグを持つコンポーネントが共有アニメーションを行います。1つの画面に同じ名前のHeroタグを2つ存在させることはできません。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Heroの基本的な使用", + "desc": [ + "【tag】 : タグ 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json new file mode 100644 index 00000000..3a36cd46 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "공유 애니메이션", + "info": "태그 이름을 지정할 수 있으며, 두 인터페이스 간 전환 시 동일한 태그를 가진 구성 요소가 공유 애니메이션을 수행합니다. 하나의 인터페이스에는 동일한 이름의 Hero 태그가 두 개 존재할 수 없습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Hero 기본 사용법", + "desc": [ + "【tag】 : 태그 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json new file mode 100644 index 00000000..d8eb837e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Animação Compartilhada", + "info": "Pode especificar o nome da etiqueta, os componentes com a mesma etiqueta realizarão uma animação compartilhada ao saltar entre duas interfaces. Não pode haver duas etiquetas Hero com o mesmo nome numa interface.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Hero", + "desc": [ + "【tag】 : etiqueta 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json new file mode 100644 index 00000000..b88d92a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Hero/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 171, + "name": "Hero", + "localName": "Общая анимация", + "info": "Можно указать имя тега, при переходе между двумя интерфейсами компоненты с одинаковым тегом будут выполнять общую анимацию. В одном интерфейсе не может быть двух тегов Hero с одинаковым именем.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Hero", + "desc": [ + "【tag】 : тег 【String】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json new file mode 100644 index 00000000..b34fed38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_de_DE.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Bildkomponente", + "info": "Wird verwendet, um ein Bild anzuzeigen, das aus einer Datei, dem Speicher, dem Netzwerk oder Ressourcen geladen werden kann. Kann Anpassungsmodus, Stil, Farbmischmodus, Wiederholungsmodus usw. angeben.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann Bilder aus Ressourcendateien und dem Netzwerk laden", + "desc": [ + "Image.asset lädt Ressourcenbilder." + ] + }, + { + "file": "node2_fit.dart", + "name": "Anpassungsmodus des Bildes", + "desc": [ + "【fit】 : Anpassungsmodus*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Ausrichtungsmodus des Bildes", + "desc": [ + "【alignment】 : Farbe 【AlignmentGeometry】", + " Neun statische Konstanten der Alignment-Klasse werden häufig verwendet, aber die Position kann auch angepasst werden." + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Farbe und Mischmodus des Bildes", + "desc": [ + "【color】 : Farbe 【Color】", + "【colorBlendMode】: Mischmodus*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Wiederholungsmodus des Bildes", + "desc": [ + "【repeat】 : Wiederholungsmodus*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Lokale Vergrößerung des Bildes", + "desc": [ + "【centerSlice】 : Beibehaltener Bereich 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json new file mode 100644 index 00000000..d3d10de9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_en_US.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Image Component", + "info": "Used to display an image, which can be loaded from a file, memory, network, or resources. You can specify the adaptation method, style, color blending mode, repeat mode, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Load images from resource files and the network", + "desc": [ + "Image.asset loads resource images," + ] + }, + { + "file": "node2_fit.dart", + "name": "Image adaptation mode", + "desc": [ + "【fit】 : Adaptation mode*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Image alignment mode", + "desc": [ + "【alignment】 : Color 【AlignmentGeometry】", + " Common nine static constants of the Alignment class, but custom positions are also possible" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Image color and blending mode", + "desc": [ + "【color】 : Color 【Color】", + "【colorBlendMode】: Blending mode*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Image repeat mode", + "desc": [ + "【repeat】 : Repeat mode*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Image partial zoom implementation", + "desc": [ + "【centerSlice】 : Reserved area 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json new file mode 100644 index 00000000..c259bd7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_es_ES.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente de imagen", + "info": "Se utiliza para mostrar una imagen, que se puede cargar desde un archivo, memoria, red o recursos. Se puede especificar el modo de ajuste, estilo, modo de mezcla de colores, modo de repetición, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cargar imágenes desde archivos de recursos y la red", + "desc": [ + "Image.asset carga imágenes de recursos." + ] + }, + { + "file": "node2_fit.dart", + "name": "Modo de ajuste de la imagen", + "desc": [ + "【fit】 : Modo de ajuste*7 【BoxFit】." + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modo de alineación de la imagen", + "desc": [ + "【alignment】 : Color 【AlignmentGeometry】", + " Nueve constantes estáticas comunes de la clase Alignment, pero también se puede personalizar la posición." + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Color y modo de mezcla de la imagen", + "desc": [ + "【color】 : Color 【Color】", + "【colorBlendMode】: Modo de mezcla*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modo de repetición de la imagen", + "desc": [ + "【repeat】 : Modo de repetición*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ampliación local de la imagen", + "desc": [ + "【centerSlice】 : Área conservada 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json new file mode 100644 index 00000000..c618d6d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_fr_FR.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Composant d'image", + "info": "Utilisé pour afficher une image, qui peut être chargée à partir d'un fichier, de la mémoire, du réseau ou des ressources. Vous pouvez spécifier le mode d'adaptation, le style, le mode de mélange des couleurs, le mode de répétition, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut charger des images à partir de fichiers de ressources et du réseau", + "desc": [ + "Image.asset charge les images de ressources." + ] + }, + { + "file": "node2_fit.dart", + "name": "Mode d'adaptation de l'image", + "desc": [ + "【fit】 : Mode d'adaptation*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Mode d'alignement de l'image", + "desc": [ + "【alignment】 : Couleur 【AlignmentGeometry】", + " Neuf constantes statiques couramment utilisées de la classe Alignment, mais il est également possible de personnaliser la position" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Couleur et mode de mélange de l'image", + "desc": [ + "【color】 : Couleur 【Color】", + "【colorBlendMode】: Mode de mélange*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Mode de répétition de l'image", + "desc": [ + "【repeat】 : Mode de répétition*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Agrandissement local de l'image", + "desc": [ + "【centerSlice】 : Zone conservée 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json new file mode 100644 index 00000000..3b43a1fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_it_IT.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente immagine", + "info": "Utilizzato per visualizzare un'immagine, può essere caricata da file, memoria, rete o risorse. È possibile specificare modalità di adattamento, stile, modalità di fusione del colore, modalità di ripetizione, ecc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può caricare immagini da file di risorse e dalla rete", + "desc": [ + "Image.asset carica immagini da risorse," + ] + }, + { + "file": "node2_fit.dart", + "name": "Modalità di adattamento dell'immagine", + "desc": [ + "【fit】 : modalità di adattamento*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modalità di allineamento dell'immagine", + "desc": [ + "【alignment】 : colore 【AlignmentGeometry】", + " Nove costanti statiche della classe Alignment, ma è anche possibile personalizzare la posizione" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Colore e modalità di fusione dell'immagine", + "desc": [ + "【color】 : colore 【Color】", + "【colorBlendMode】: modalità di fusione*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modalità di ripetizione dell'immagine", + "desc": [ + "【repeat】 : modalità di ripetizione*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ingrandimento locale dell'immagine", + "desc": [ + "【centerSlice】 : area conservata 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json new file mode 100644 index 00000000..608ca9ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ja_JP.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "画像コンポーネント", + "info": "画像を表示するために使用され、ファイル、メモリ、ネットワーク、リソースからロードできます。適応モード、スタイル、カラーブレンドモード、リピートモードなどを指定できます", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "リソースファイルとネットワークから画像をロードできます", + "desc": [ + "Image.assetでリソース画像をロードします" + ] + }, + { + "file": "node2_fit.dart", + "name": "画像の適応モード", + "desc": [ + "【fit】 : 適応モード*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "画像の整列モード", + "desc": [ + "【alignment】 : カラー 【AlignmentGeometry】", + " 一般的にAlignmentクラスの9つの静的定数を使用しますが、位置をカスタマイズすることもできます" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "画像のカラー及びブレンドモード", + "desc": [ + "【color】 : カラー 【Color】", + "【colorBlendMode】: ブレンドモード*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "画像のリピートモード", + "desc": [ + "【repeat】 : リピートモード*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "画像の一部を拡大", + "desc": [ + "【centerSlice】 : 保持する領域 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json new file mode 100644 index 00000000..ac7e3d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ko_KR.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "이미지 컴포넌트", + "info": "이미지를 표시하는 데 사용되며, 파일, 메모리, 네트워크, 리소스에서 로드할 수 있습니다. 적응 방식, 스타일, 색상 혼합 모드, 반복 모드 등을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "리소스 파일 및 네트워크에서 이미지 로드", + "desc": [ + "Image.asset로 리소스 이미지 로드" + ] + }, + { + "file": "node2_fit.dart", + "name": "이미지 적응 모드", + "desc": [ + "【fit】 : 적응 모드*7 【BoxFit】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "이미지 정렬 모드", + "desc": [ + "【alignment】 : 색상 【AlignmentGeometry】", + " 일반적으로 Alignment 클래스의 9개 정적 상수를 사용하지만, 위치를 사용자 정의할 수도 있음" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "이미지 색상 및 혼합 모드", + "desc": [ + "【color】 : 색상 【Color】", + "【colorBlendMode】: 혼합 모드*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "이미지 반복 모드", + "desc": [ + "【repeat】 : 반복 모드*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "이미지 부분 확대", + "desc": [ + "【centerSlice】 : 보존 영역 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json new file mode 100644 index 00000000..6b510140 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_pt_PT.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Componente de Imagem", + "info": "Usado para exibir uma imagem, pode ser carregada a partir de arquivos, memória, rede ou recursos. Pode especificar o modo de ajuste, estilo, modo de mistura de cores, modo de repetição, etc.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode carregar imagens de arquivos de recursos e da rede", + "desc": [ + "Image.asset carrega imagens de recursos," + ] + }, + { + "file": "node2_fit.dart", + "name": "Modo de ajuste da imagem", + "desc": [ + "【fit】 : modo de ajuste*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Modo de alinhamento da imagem", + "desc": [ + "【alignment】 : cor 【AlignmentGeometry】", + " Nove constantes estáticas comuns da classe Alignment, mas também pode personalizar a posição" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Cor e modo de mistura da imagem", + "desc": [ + "【color】 : cor 【Color】", + "【colorBlendMode】: modo de mistura*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Modo de repetição da imagem", + "desc": [ + "【repeat】 : modo de repetição*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Ampliação local da imagem", + "desc": [ + "【centerSlice】 : área retida 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json new file mode 100644 index 00000000..5c26b2c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Image/desc_ru_RU.json @@ -0,0 +1,58 @@ +{ + "id": 38, + "name": "Image", + "localName": "Компонент изображения", + "info": "Используется для отображения изображения, которое можно загрузить из файла, памяти, сети или ресурсов. Можно указать режим адаптации, стиль, режим смешивания цветов, режим повторения и т.д.", + "lever": 5, + "family": 1, + "linkIds": [ + 8, + 87 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Загрузка изображений из ресурсов и сети", + "desc": [ + "Image.asset загружает изображения из ресурсов," + ] + }, + { + "file": "node2_fit.dart", + "name": "Режим адаптации изображения", + "desc": [ + "【fit】 : режим адаптации*7 【BoxFit】," + ] + }, + { + "file": "node3_alignment.dart", + "name": "Режим выравнивания изображения", + "desc": [ + "【alignment】 : цвет 【AlignmentGeometry】", + " Девять статических констант класса Alignment, но также можно настроить положение" + ] + }, + { + "file": "node4_colorBlendMode.dart", + "name": "Цвет и режим смешивания изображения", + "desc": [ + "【color】 : цвет 【Color】", + "【colorBlendMode】: режим смешивания*29 【BlendMode】" + ] + }, + { + "file": "node5_repeat.dart", + "name": "Режим повторения изображения", + "desc": [ + "【repeat】 : режим повторения*4 【ImageRepeat】" + ] + }, + { + "file": "node6_centerSlice.dart", + "name": "Локальное увеличение изображения", + "desc": [ + "【centerSlice】 : сохраняемая область 【Rect】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json new file mode 100644 index 00000000..86515655 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Wasserwelle", + "info": "Macht die Wasserwellen von InkWell und InkResponse effektiv, verwendet für das Zeichnen von Bildern oder anderen dekorativen Materialkomponenten.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Ink", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【decoration】 : Dekoration 【Decoration】", + "【width】 : Breite 【double】", + "【height】 : Höhe 【double】", + "【color】 : Farbe 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image Bildwasserwelle", + "desc": [ + "Die Eigenschaften sind identisch mit der Image-Komponente, siehe Image-Komponente für Details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json new file mode 100644 index 00000000..36b89e1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Ripple", + "info": "Enables the ripple effect for InkWell and InkResponse, a Material component used to draw images or other decorations.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Ink", + "desc": [ + "【child】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【decoration】: Decoration 【Decoration】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image Ripple with Image", + "desc": [ + "The properties are consistent with the Image component, see the Image component for details" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json new file mode 100644 index 00000000..9572e4f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda de agua", + "info": "Hace que las ondas de agua de InkWell e InkResponse sean efectivas, utilizadas para dibujar imágenes u otros componentes decorativos de Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Ink", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【decoration】 : Decoración 【Decoration】", + "【width】 : Ancho 【double】", + "【height】 : Alto 【double】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Onda de agua con Ink.image", + "desc": [ + "Los atributos son consistentes con el componente Image, consulte el componente Image para más detalles" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json new file mode 100644 index 00000000..4a7cd29d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onde", + "info": "Active les ondulations d'eau pour InkWell et InkResponse, utilisé pour dessiner des images ou d'autres composants de décoration Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Ink", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【decoration】 : Décoration 【Decoration】", + "【width】 : Largeur 【double】", + "【height】 : Hauteur 【double】", + "【color】 : Couleur 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Onde d'image avec Ink.image", + "desc": [ + "Les propriétés sont identiques à celles du composant Image, voir le composant Image pour plus de détails" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json new file mode 100644 index 00000000..918d13de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda d'acqua", + "info": "Rende efficace l'effetto ondulato dell'acqua di InkWell e InkResponse, utilizzato per disegnare immagini o altri componenti decorativi di Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Ink", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【decoration】 : Decorazione 【Decoration】", + "【width】 : Larghezza 【double】", + "【height】 : Altezza 【double】", + "【color】 : Colore 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image effetto ondulato dell'immagine", + "desc": [ + "Le proprietà sono coerenti con il componente Image, vedi il componente Image per i dettagli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json new file mode 100644 index 00000000..95241704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "水波", + "info": "InkWellとInkResponseの水の波紋を有効にし、画像やその他の装飾を描画するためのMaterialコンポーネントです。", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Inkの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【decoration】 : 装飾 【Decoration】", + "【width】 : 幅 【double】", + "【height】 : 高さ 【double】", + "【color】 : 色 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image画像の水波", + "desc": [ + "その属性はImageコンポーネントと一致し、詳細はImageコンポーネントを参照してください" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json new file mode 100644 index 00000000..c8d9d18f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "물결", + "info": "InkWell 및 InkResponse의 물결 효과를 활성화하고, 이미지 또는 기타 장식을 그리기 위한 Material 컴포넌트입니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ink 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】", + "【decoration】 : 장식 【Decoration】", + "【width】 : 너비 【double】", + "【height】 : 높이 【double】", + "【color】 : 색상 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ink.image 이미지 물결", + "desc": [ + "속성은 Image 컴포넌트와 동일하며, 자세한 내용은 Image 컴포넌트를 참조하세요" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json new file mode 100644 index 00000000..aeb56447 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Onda", + "info": "Torna as ondulações de água do InkWell e InkResponse eficazes, usadas para desenhar imagens ou outros componentes decorativos do Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Ink", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【decoration】 : Decoração 【Decoration】", + "【width】 : Largura 【double】", + "【height】 : Altura 【double】", + "【color】 : Cor 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Ondulação de água do Ink.image", + "desc": [ + "Os atributos são consistentes com o componente Image, consulte o componente Image para mais detalhes" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json new file mode 100644 index 00000000..0f674edc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Ink/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 152, + "name": "Ink", + "localName": "Волна", + "info": "Делает водяные волны InkWell и InkResponse активными, используется для рисования изображений или других декоративных компонентов Material.", + "lever": 3, + "family": 1, + "linkIds": [ + 149, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Ink", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】", + "【decoration】 : Декорация 【Decoration】", + "【width】 : Ширина 【double】", + "【height】 : Высота 【double】", + "【color】 : Цвет 【Color】" + ] + }, + { + "file": "node2_image.dart", + "name": "Водяные волны Ink.image", + "desc": [ + "Свойства совпадают с компонентом Image, подробнее см. компонент Image" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json new file mode 100644 index 00000000..aca10f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Wasserwellen-Reaktion", + "info": "Klickeffekt mit Wasserwellen, empfängt Ereignisse wie Klicken, Doppelklicken, Langdrücken, Abbrechen und Hervorhebungsänderungen. Kann Eigenschaften wie Wasserwellenfarbe, Radius, Hervorhebungsform usw. angeben.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse grundlegende Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onTapCancel】 : Klick abbrechen 【Function()】", + "【onLongPress】 : Langdrückereignis 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse andere Eigenschaften", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onHighlightChanged】 : Hervorhebungsänderungsrückruf 【Function(bool)】", + "【highlightColor】 : Hervorhebungsfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【radius】 : Wasserwellenradius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json new file mode 100644 index 00000000..b550baae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Ripple Response", + "info": "Ripple click effect, receiving click, double-click, long press, cancel, highlight change events, and can specify ripple color, radius, highlight shape and other properties.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of InkResponse", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Click event 【Function()】", + "【onDoubleTap】 : Double-click event 【Function()】", + "【onTapCancel】 : Click cancel 【Function()】", + "【onLongPress】 : Long press event 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Other Properties of InkResponse", + "desc": [ + "【child】 : Child component 【Widget】", + "【onHighlightChanged】 : Highlight change callback 【Function(bool)】", + "【highlightColor】 : Highlight color 【Color】", + "【splashColor】 : Ripple color 【Color】", + "【radius】 : Ripple radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json new file mode 100644 index 00000000..6301b0fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Respuesta de ondas", + "info": "Efecto de clic de ondas, recibe eventos de clic, doble clic, pulsación larga, cancelación y cambio de resaltado. Se pueden especificar propiedades como el color de las ondas, el radio, la forma de resaltado, etc.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de InkResponse", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onTapCancel】 : Cancelación de clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Otras propiedades de InkResponse", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】", + "【highlightColor】 : Color de resaltado 【Color】", + "【splashColor】 : Color de las ondas 【Color】", + "【radius】 : Radio de las ondas 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json new file mode 100644 index 00000000..7da358ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Réponse d'ondulation", + "info": "Effet de clic d'ondulation, reçoit les événements de clic, double-clic, appui long, annulation et changement de surbrillance. Peut spécifier la couleur de l'ondulation, le rayon, la forme de la surbrillance et d'autres propriétés.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base d'InkResponse", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【Function()】", + "【onTapCancel】 : Annulation de clic 【Function()】", + "【onLongPress】 : Événement d'appui long 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Autres propriétés d'InkResponse", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】", + "【highlightColor】 : Couleur de surbrillance 【Color】", + "【splashColor】 : Couleur de l'ondulation 【Color】", + "【radius】 : Rayon de l'ondulation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json new file mode 100644 index 00000000..9b01d305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Effetto Ripple", + "info": "Effetto di clic a ripple, riceve eventi di clic, doppio clic, pressione prolungata, annullamento e cambiamento di evidenziazione. È possibile specificare proprietà come il colore del ripple, il raggio e la forma dell'evidenziazione.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di InkResponse", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onTapCancel】 : Annullamento clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Altre proprietà di InkResponse", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onHighlightChanged】 : Callback di cambiamento di evidenziazione 【Function(bool)】", + "【highlightColor】 : Colore di evidenziazione 【Color】", + "【splashColor】 : Colore del ripple 【Color】", + "【radius】 : Raggio del ripple 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json new file mode 100644 index 00000000..fa333900 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "リップルレスポンス", + "info": "リップルのクリック効果。クリック、ダブルクリック、長押し、キャンセル、ハイライト変更イベントを受け取り、リップルの色、半径、ハイライト形状などの属性を指定できます。", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【Function()】", + "【onTapCancel】 : クリックキャンセル 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponseその他の属性", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】", + "【highlightColor】 : ハイライト色 【Color】", + "【splashColor】 : リップル色 【Color】", + "【radius】 : リップル半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json new file mode 100644 index 00000000..1b4ca2a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "물결 반응", + "info": "물결 클릭 효과, 클릭, 더블 클릭, 길게 누르기, 취소, 하이라이트 변경 이벤트를 수신하며, 물결 색상, 반경, 하이라이트 모양 등의 속성을 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkResponse 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【Function()】", + "【onTapCancel】 : 클릭 취소 【Function()】", + "【onLongPress】 : 길게 누르기 이벤트 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkResponse 기타 속성", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】", + "【highlightColor】 : 하이라이트 색상 【Color】", + "【splashColor】 : 물결 색상 【Color】", + "【radius】 : 물결 반경 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json new file mode 100644 index 00000000..7f36fcd8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Resposta de Ondulação", + "info": "Efeito de clique de ondulação, recebe eventos de clique, duplo clique, pressionamento longo, cancelamento e mudança de destaque, podendo especificar a cor da ondulação, raio, forma de destaque, entre outros atributos.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do InkResponse", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onTapCancel】 : Cancelamento de clique 【Function()】", + "【onLongPress】 : Evento de pressionamento longo 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Outras Propriedades do InkResponse", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】", + "【highlightColor】 : Cor de destaque 【Color】", + "【splashColor】 : Cor da ondulação 【Color】", + "【radius】 : Raio da ondulação 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json new file mode 100644 index 00000000..255ee434 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkResponse/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 149, + "name": "InkResponse", + "localName": "Эффект ряби", + "info": "Эффект нажатия с рябью, принимает события нажатия, двойного нажатия, долгого нажатия, отмены и изменения выделения. Можно указать цвет ряби, радиус, форму выделения и другие свойства.", + "lever": 1, + "family": 1, + "linkIds": [ + 150, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события InkResponse", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onTapCancel】 : Отмена нажатия 【Function()】", + "【onLongPress】 : Событие долгого нажатия 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Другие свойства InkResponse", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onHighlightChanged】 : Обратный вызов изменения выделения 【Function(bool)】", + "【highlightColor】 : Цвет выделения 【Color】", + "【splashColor】 : Цвет ряби 【Color】", + "【radius】 : Радиус ряби 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json new file mode 100644 index 00000000..d68bb899 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_de_DE.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Wasserwelle", + "info": "Unterklasse von InkResponse, grundlegende Eigenschaften wie InkResponse. Eine rechteckige Wasserwelle, die den Radius der abgerundeten Ecken, die Form der Umrandung usw. kennt.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Ereignisse von InkWell", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onTapCancel】 : Klick abbrechen 【Function()】", + "【onLongPress】 : Langdrücken 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Weitere Eigenschaften von InkWell", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onHighlightChanged】 : Rückruf bei Hervorhebungsänderung 【Function(bool)】", + "【highlightColor】 : Hervorhebungsfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【radius】 : Wasserwellenradius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json new file mode 100644 index 00000000..4de7cf5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_en_US.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Ripple", + "info": "A subclass of InkResponse, with basic properties similar to InkResponse. A rectangular area with ripple effects, allowing customization of corner radius, border shape, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell Basic Events", + "desc": [ + "【child】: Child component 【Widget】", + "【onTap】: Tap event 【Function()】", + "【onDoubleTap】: Double tap event 【Function()】", + "【onTapCancel】: Tap cancel 【Function()】", + "【onLongPress】: Long press event 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell Other Properties", + "desc": [ + "【child】: Child component 【Widget】", + "【onHighlightChanged】: Highlight change callback 【Function(bool)】", + "【highlightColor】: Highlight color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【radius】: Ripple radius 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json new file mode 100644 index 00000000..8862b4a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_es_ES.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Ondulación", + "info": "Subclase de InkResponse, con propiedades básicas similares a InkResponse. Una región rectangular de ondulación, que puede conocer el radio de las esquinas redondeadas, la forma del borde, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de InkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onTapCancel】 : Cancelación de clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Otras propiedades de InkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】", + "【highlightColor】 : Color de resaltado 【Color】", + "【splashColor】 : Color de la ondulación 【Color】", + "【radius】 : Radio de la ondulación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json new file mode 100644 index 00000000..8f623f9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_fr_FR.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Effet de vague", + "info": "Sous-classe de InkResponse, les propriétés de base sont les mêmes que InkResponse. Une zone rectangulaire avec un effet de vague, permet de connaître le rayon des coins arrondis, la forme de la bordure, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base d'InkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double clic 【Function()】", + "【onTapCancel】 : Annulation de clic 【Function()】", + "【onLongPress】 : Événement de pression longue 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Autres propriétés d'InkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】", + "【highlightColor】 : Couleur de surbrillance 【Color】", + "【splashColor】 : Couleur de l'effet de vague 【Color】", + "【radius】 : Rayon de l'effet de vague 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json new file mode 100644 index 00000000..19456853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_it_IT.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Onda d'acqua", + "info": "Sottoclasse di InkResponse, le proprietà di base sono le stesse di InkResponse. Un'area rettangolare con un'effetto onda d'acqua, può conoscere il raggio degli angoli, la forma del bordo, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di InkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onTapCancel】 : Annullamento del clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Altre proprietà di InkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onHighlightChanged】 : Callback di cambiamento dell'evidenziazione 【Function(bool)】", + "【highlightColor】 : Colore di evidenziazione 【Color】", + "【splashColor】 : Colore dell'onda d'acqua 【Color】", + "【radius】 : Raggio dell'onda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json new file mode 100644 index 00000000..32ba38c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ja_JP.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "波紋", + "info": "InkResponseのサブクラスで、基本属性はInkResponseと同じです。矩形領域の波紋で、角丸半径や辺の形状などを知ることができます。", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : タップイベント 【Function()】", + "【onDoubleTap】 : ダブルタップイベント 【Function()】", + "【onTapCancel】 : タップキャンセル 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWellその他の属性", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】", + "【highlightColor】 : ハイライト色 【Color】", + "【splashColor】 : 波紋色 【Color】", + "【radius】 : 波紋半径 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json new file mode 100644 index 00000000..7f5b712c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ko_KR.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "물결무늬", + "info": "InkResponse의 하위 클래스로, 기본 속성은 InkResponse와 동일합니다. 둥근 모서리 반경, 테두리 모양 등을 알 수 있는 직사각형 영역의 물결무늬입니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InkWell 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 탭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 탭 이벤트 【Function()】", + "【onTapCancel】 : 탭 취소 【Function()】", + "【onLongPress】 : 롱 프레스 이벤트 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "InkWell 기타 속성", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】", + "【highlightColor】 : 하이라이트 색상 【Color】", + "【splashColor】 : 물결무늬 색상 【Color】", + "【radius】 : 물결 반경 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json new file mode 100644 index 00000000..2bc5f24a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_pt_PT.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Onda de Água", + "info": "Subclasse de InkResponse, com propriedades básicas semelhantes ao InkResponse. Uma área retangular de onda de água, que pode conhecer o raio de curvatura, a forma da borda, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do InkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onTapCancel】 : Cancelamento de clique 【Function()】", + "【onLongPress】 : Evento de pressionar longo 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Outras Propriedades do InkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】", + "【highlightColor】 : Cor de destaque 【Color】", + "【splashColor】 : Cor da onda de água 【Color】", + "【radius】 : Raio da onda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json new file mode 100644 index 00000000..bf0b487d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InkWell/desc_ru_RU.json @@ -0,0 +1,36 @@ +{ + "id": 150, + "name": "InkWell", + "localName": "Водяные волны", + "info": "Подкласс InkResponse, основные свойства такие же, как у InkResponse. Прямоугольная область с водяными волнами, можно узнать радиус скругления, форму границы и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 149, + 152 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события InkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onTapCancel】 : Отмена нажатия 【Function()】", + "【onLongPress】 : Событие длительного нажатия 【Function()】" + ] + }, + { + "file": "node2_color.dart", + "name": "Другие свойства InkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onHighlightChanged】 : Обратный вызов изменения подсветки 【Function(bool)】", + "【highlightColor】 : Цвет подсветки 【Color】", + "【splashColor】 : Цвет водяных волн 【Color】", + "【radius】 : Радиус волны 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json new file mode 100644 index 00000000..37aa2970 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Eingabedekor", + "info": "Eine Dekoration, die die Eingabe umhüllt, ist eine der Kernkomponenten von TextField und wird normalerweise nicht alleine verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von InputDecorator", + "desc": [ + "【decoration】: Dekorationsobjekt 【InputDecoration】", + "【textAlign】: Textausrichtung 【TextAlign】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json new file mode 100644 index 00000000..b627a301 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Input Decorator", + "info": "A decorator that wraps around the input, one of the core components of TextField, generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of InputDecorator", + "desc": [ + "【decoration】: Decoration object 【InputDecoration】", + "【textAlign】: Text alignment 【TextAlign】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json new file mode 100644 index 00000000..e00e64b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decorador de entrada", + "info": "Un decorador que envuelve la entrada, es uno de los componentes centrales subyacentes de TextField, generalmente no se usa por separado.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de InputDecorator", + "desc": [ + "【decoration】 : Objeto de decoración 【InputDecoration】", + "【textAlign】 : Alineación del texto 【TextAlign】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json new file mode 100644 index 00000000..38949684 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Décorateur d'entrée", + "info": "Un décorateur qui enveloppe l'entrée, est l'un des composants de base de TextField, généralement pas utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'InputDecorator", + "desc": [ + "【decoration】 : Objet de décoration 【InputDecoration】", + "【textAlign】 : Alignement du texte 【TextAlign】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json new file mode 100644 index 00000000..34a56a08 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decorazione di Input", + "info": "Una decorazione che avvolge l'input all'esterno, è uno dei componenti principali di TextField, generalmente non utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di Base di InputDecorator", + "desc": [ + "【decoration】 : Oggetto di decorazione 【InputDecoration】", + "【textAlign】 : Allineamento del testo 【TextAlign】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json new file mode 100644 index 00000000..4e26de07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "入力デコレータ", + "info": "入力の外側を包むデコレーションで、TextFieldのコアコンポーネントの一つです。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecoratorの基本使用", + "desc": [ + "【decoration】 : デコレーションオブジェクト 【InputDecoration】", + "【textAlign】 : テキストの配置 【TextAlign】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json new file mode 100644 index 00000000..94d452bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "입력 장식", + "info": "입력을 감싸는 외부 장식으로, TextField의 핵심 구성 요소 중 하나이며 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InputDecorator 기본 사용", + "desc": [ + "【decoration】 : 장식 객체 【InputDecoration】", + "【textAlign】 : 텍스트 정렬 방식 【TextAlign】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json new file mode 100644 index 00000000..f5f0cfcf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Decoração de Entrada", + "info": "Decoração que envolve a entrada, é um dos componentes principais do TextField, geralmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do InputDecorator", + "desc": [ + "【decoration】 : Objeto de decoração 【InputDecoration】", + "【textAlign】 : Alinhamento do texto 【TextAlign】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json new file mode 100644 index 00000000..ce8ef099 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InputDecorator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 231, + "name": "InputDecorator", + "localName": "Декоратор ввода", + "info": "Декоратор, оборачивающий ввод, является одним из основных компонентов TextField и обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование InputDecorator", + "desc": [ + "【decoration】 : Объект декорации 【InputDecoration】", + "【textAlign】 : Выравнивание текста 【TextAlign】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json new file mode 100644 index 00000000..90c0b174 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_de_DE.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Interaktiver Viewer", + "info": "Kapselt hauptsächlich Gesteninteraktionen wie Verschieben und Zoomen, vereinfacht die Verwendung und ermöglicht die Angabe von Verschiebegrenzen, Zoomverhältnissen, Gestenerkennung usw.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Entlang der Achse ziehen 【bool】", + "【boundaryMargin】 : Randabstand 【EdgeInsets】", + "【panEnabled】 : Verschiebung aktiviert 【bool】", + "【scaleEnabled】 : Skalierung aktiviert 【bool】", + "【maxScale】 : Maximale Vergrößerung 【double】", + "【minScale】 : Minimale Verkleinerung 【double】", + "【onInteractionEnd】 : Rückruf bei Interaktionsende 【GestureScaleEndCallback】", + "【onInteractionStart】 : Rückruf bei Interaktionsstart 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Rückruf bei Interaktionsaktualisierung 【GestureScaleUpdateCallback】", + "【child】 : Cursorfarbe 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test der constrained-Eigenschaft", + "desc": [ + "【constrained】 : Eingeschränkt 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Verwendung des Transformationscontrollers", + "desc": [ + "【transformationController】 : Transformationscontroller 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json new file mode 100644 index 00000000..d02fcc09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_en_US.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Interactive Viewer", + "info": "Mainly encapsulates gesture interactions such as moving and zooming, simplifies usage, and allows specifying movement boundaries, zoom ratios, gesture monitoring, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of InteractiveViewer", + "desc": [ + "【alignPanAxis】: Drag along the axis 【bool】", + "【boundaryMargin】: Boundary margin 【EdgeInsets】", + "【panEnabled】: Whether panning is enabled 【bool】", + "【scaleEnabled】: Whether scaling is enabled 【bool】", + "【maxScale】: Maximum zoom scale 【double】", + "【minScale】: Minimum zoom scale 【double】", + "【onInteractionEnd】: Interaction end callback 【GestureScaleEndCallback】", + "【onInteractionStart】: Interaction start callback 【GestureScaleStartCallback】", + "【onInteractionUpdate】: Interaction update callback 【GestureScaleUpdateCallback】", + "【child】: Cursor color 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Constrained Property Test", + "desc": [ + "【constrained】: Constrained 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Usage of Transformation Controller", + "desc": [ + "【transformationController】: Transformation controller 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json new file mode 100644 index 00000000..4c309f36 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_es_ES.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visor Interactivo", + "info": "Principalmente encapsula interacciones gestuales como mover y hacer zoom, simplificando su uso. Puede especificar límites de movimiento, proporciones de zoom, escucha de gestos, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Arrastrar a lo largo del eje 【bool】", + "【boundaryMargin】 : Margen del borde 【EdgeInsets】", + "【panEnabled】 : Si se puede desplazar 【bool】", + "【scaleEnabled】 : Si se puede hacer zoom 【bool】", + "【maxScale】 : Máximo aumento 【double】", + "【minScale】 : Mínima reducción 【double】", + "【onInteractionEnd】 : Callback al finalizar la interacción 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback al iniciar la interacción 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback al actualizar la interacción 【GestureScaleUpdateCallback】", + "【child】 : Color del cursor 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Prueba de la propiedad constrained", + "desc": [ + "【constrained】 : Restringido 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso del controlador de transformación", + "desc": [ + "【transformationController】 : Controlador de transformación 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json new file mode 100644 index 00000000..eb4de305 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_fr_FR.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Vue interactive", + "info": "Principalement pour encapsuler les interactions gestuelles telles que le déplacement et le zoom, simplifier l'utilisation, et permettre de spécifier les limites de déplacement, les ratios de zoom, l'écoute des gestes, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Glisser le long de l'axe 【bool】", + "【boundaryMargin】 : Marge de la limite 【EdgeInsets】", + "【panEnabled】 : Peut être déplacé 【bool】", + "【scaleEnabled】 : Peut être zoomé 【bool】", + "【maxScale】 : Facteur de zoom maximum 【double】", + "【minScale】 : Facteur de zoom minimum 【double】", + "【onInteractionEnd】 : Rappel de fin d'interaction 【GestureScaleEndCallback】", + "【onInteractionStart】 : Rappel de début d'interaction 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Rappel de mise à jour d'interaction 【GestureScaleUpdateCallback】", + "【child】 : Couleur du curseur 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test de la propriété constrained", + "desc": [ + "【constrained】 : Contraint 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Utilisation du contrôleur de transformation", + "desc": [ + "【transformationController】 : Contrôleur de transformation 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json new file mode 100644 index 00000000..b182913e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_it_IT.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visualizzatore Interattivo", + "info": "Principalmente incapsula le interazioni gestuali come lo spostamento e lo zoom, semplificando l'uso, è possibile specificare i limiti di movimento, la scala di zoom, il monitoraggio dei gesti, ecc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Trascina lungo l'asse 【bool】", + "【boundaryMargin】 : Margine del bordo 【EdgeInsets】", + "【panEnabled】 : Se è possibile traslare 【bool】", + "【scaleEnabled】 : Se è possibile ridimensionare 【bool】", + "【maxScale】 : Fattore di ingrandimento massimo 【double】", + "【minScale】 : Fattore di riduzione minimo 【double】", + "【onInteractionEnd】 : Callback di fine interazione 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback di inizio interazione 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback di aggiornamento interazione 【GestureScaleUpdateCallback】", + "【child】 : Colore del cursore 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Test della proprietà constrained", + "desc": [ + "【constrained】 : Vincolato 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso del controller di trasformazione", + "desc": [ + "【transformationController】 : Controller di trasformazione 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json new file mode 100644 index 00000000..3028d848 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ja_JP.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "インタラクティブビュー", + "info": "主に移動、ズームなどのジェスチャー操作をカプセル化し、使用を簡素化します。移動の境界、ズーム比率、ジェスチャーリスナーなどを指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewerの基本使用", + "desc": [ + "【alignPanAxis】 : 軸に沿ってドラッグ 【bool】", + "【boundaryMargin】 : 境界マージン 【EdgeInsets】", + "【panEnabled】 : 平行移動可能かどうか 【bool】", + "【scaleEnabled】 : ズーム可能かどうか 【bool】", + "【maxScale】 : 最大ズーム倍率 【double】", + "【minScale】 : 最小ズーム倍率 【double】", + "【onInteractionEnd】 : インタラクション終了コールバック 【GestureScaleEndCallback】", + "【onInteractionStart】 : インタラクション開始コールバック 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : インタラクション更新コールバック 【GestureScaleUpdateCallback】", + "【child】 : カーソルカラー 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained属性のテスト", + "desc": [ + "【constrained】 : 制約付き 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "変換コントローラーの使用", + "desc": [ + "【transformationController】 : 変換コントローラー 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json new file mode 100644 index 00000000..76bf8581 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ko_KR.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "인터랙티브 뷰어", + "info": "주로 이동, 확대/축소 등의 제스처 인터랙션을 캡슐화하여 사용을 단순화하며, 이동 경계, 확대/축소 비율, 제스처 리스너 등을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "InteractiveViewer 기본 사용", + "desc": [ + "【alignPanAxis】 : 축을 따라 드래그 【bool】", + "【boundaryMargin】 : 경계 여백 【EdgeInsets】", + "【panEnabled】 : 이동 가능 여부 【bool】", + "【scaleEnabled】 : 확대/축소 가능 여부 【bool】", + "【maxScale】 : 최대 확대 배율 【double】", + "【minScale】 : 최소 축소 배율 【double】", + "【onInteractionEnd】 : 인터랙션 종료 콜백 【GestureScaleEndCallback】", + "【onInteractionStart】 : 인터랙션 시작 콜백 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : 인터랙션 업데이트 콜백 【GestureScaleUpdateCallback】", + "【child】 : 커서 색상 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "constrained 속성 테스트", + "desc": [ + "【constrained】 : 제약이 있는 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "변환 컨트롤러 사용", + "desc": [ + "【transformationController】 : 변환 컨트롤러 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json new file mode 100644 index 00000000..be7b44f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_pt_PT.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Visualizador Interativo", + "info": "Principalmente encapsula interações gestuais como movimento e zoom, simplificando o uso. Pode especificar limites de movimento, proporção de zoom, monitorização de gestos, etc.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Arrastar ao longo do eixo 【bool】", + "【boundaryMargin】 : Margem da fronteira 【EdgeInsets】", + "【panEnabled】 : Se pode ser movido 【bool】", + "【scaleEnabled】 : Se pode ser ampliado 【bool】", + "【maxScale】 : Fator de ampliação máximo 【double】", + "【minScale】 : Fator de redução mínimo 【double】", + "【onInteractionEnd】 : Callback de fim de interação 【GestureScaleEndCallback】", + "【onInteractionStart】 : Callback de início de interação 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Callback de atualização de interação 【GestureScaleUpdateCallback】", + "【child】 : Cor do cursor 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Teste da Propriedade Constrained", + "desc": [ + "【constrained】 : Restrito 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso do Controlador de Transformação", + "desc": [ + "【transformationController】 : Controlador de transformação 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json new file mode 100644 index 00000000..cf059b7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/InteractiveViewer/desc_ru_RU.json @@ -0,0 +1,45 @@ +{ + "id": 351, + "name": "InteractiveViewer", + "localName": "Интерактивное представление", + "info": "Основная цель - инкапсуляция жестов, таких как перемещение и масштабирование, упрощение использования, возможность указания границ перемещения, масштабирования, прослушивания жестов и т.д.", + "lever": 4, + "family": 1, + "linkIds": [ + 147, + 146, + 78 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование InteractiveViewer", + "desc": [ + "【alignPanAxis】 : Перетаскивание по оси 【bool】", + "【boundaryMargin】 : Отступ границы 【EdgeInsets】", + "【panEnabled】 : Возможность панорамирования 【bool】", + "【scaleEnabled】 : Возможность масштабирования 【bool】", + "【maxScale】 : Максимальный коэффициент увеличения 【double】", + "【minScale】 : Минимальный коэффициент уменьшения 【double】", + "【onInteractionEnd】 : Обратный вызов завершения взаимодействия 【GestureScaleEndCallback】", + "【onInteractionStart】 : Обратный вызов начала взаимодействия 【GestureScaleStartCallback】", + "【onInteractionUpdate】 : Обратный вызов обновления взаимодействия 【GestureScaleUpdateCallback】", + "【child】 : Цвет курсора 【Widget】" + ] + }, + { + "file": "node2_constrained.dart", + "name": "Тестирование свойства constrained", + "desc": [ + "【constrained】 : Ограниченный 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Использование контроллера преобразования", + "desc": [ + "【transformationController】 : Контроллер преобразования 【TransformationController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json new file mode 100644 index 00000000..dd140ea9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Tastatur-Listener", + "info": "Nachdem der Fokus erhalten wurde, wird über onKeyEvent das Tastaturereignis überwacht.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Tastaturereignisse überwachen", + "desc": [ + "Im Beispiel erhält der Bereich durch Klicken den Fokus, und durch Drücken der Tastatur können die ausgelösten Ereignisse angezeigt werden.", + "【focusNode】 : Fokus 【FocusNode】", + "【autofocus】 : Automatischer Fokus 【bool】", + "【includeSemantics】 : Semantik einschließen 【bool】", + "【onKeyEvent】 : Tastaturrückrufereignis 【ValueChanged?】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json new file mode 100644 index 00000000..7edfce71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Keyboard Listener", + "info": "After gaining focus, listen to keyboard key events through onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Listen to Keyboard Events", + "desc": [ + "In the example, click the area to gain focus, and then press the keyboard to see the event trigger information.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Whether to auto-focus 【bool】", + "【includeSemantics】 : Include semantics 【bool】", + "【onKeyEvent】 : Key callback event 【ValueChanged?】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json new file mode 100644 index 00000000..4a4e9250 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Escuchador de teclado", + "info": "Después de obtener el foco, escucha los eventos de teclado a través de onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Escuchar eventos de teclado", + "desc": [ + "En el ejemplo, al hacer clic en el área se obtiene el foco, y luego al presionar el teclado se pueden ver los mensajes de eventos activados.", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Si se enfoca automáticamente 【bool】", + "【includeSemantics】 : Incluir semántica 【bool】", + "【onKeyEvent】 : Evento de devolución de llamada de tecla 【ValueChanged?】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json new file mode 100644 index 00000000..02089c3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Écouteur de clavier", + "info": "Après avoir obtenu le focus, écoute les événements de touche du clavier via onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Écouter les événements du clavier", + "desc": [ + "Dans l'exemple, cliquez sur la zone pour obtenir le focus, puis tapez sur le clavier pour voir les informations de déclenchement de l'événement.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Mise au point automatique 【bool】", + "【includeSemantics】 : Inclure la sémantique 【bool】", + "【onKeyEvent】 : Événement de rappel de touche 【ValueChanged?】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json new file mode 100644 index 00000000..b8fa6f8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Ascoltatore Tastiera", + "info": "Dopo aver ottenuto il focus, ascolta gli eventi dei tasti della tastiera tramite onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ascolta Eventi Tastiera", + "desc": [ + "Nell'esempio, clicca sull'area per ottenere il focus, quindi premi un tasto per vedere le informazioni sull'evento attivato.", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Autofocus 【bool】", + "【includeSemantics】 : Includi Semantica 【bool】", + "【onKeyEvent】 : Evento di Richiamata Tasto 【ValueChanged?】", + "【child】 : Componente Figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json new file mode 100644 index 00000000..3b3fe543 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "キーボードリスナー", + "info": "フォーカスを取得した後、onKeyEventを通じてキーボードのキーイベントを監視します。", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "キーボードイベントの監視", + "desc": [ + "例では、領域をクリックしてフォーカスを取得し、キーボードを叩くとイベントのトリガー情報が表示されます。", + "【focusNode】 : フォーカス 【FocusNode】", + "【autofocus】 : 自動フォーカス 【bool】", + "【includeSemantics】 : セマンティクスを含む 【bool】", + "【onKeyEvent】 : キーコールバックイベント 【ValueChanged?】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json new file mode 100644 index 00000000..b385c917 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "키보드 리스너", + "info": "포커스를 얻은 후, onKeyEvent를 통해 키보드의 키 이벤트를 감지합니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "키보드 이벤트 감지", + "desc": [ + "예제에서 영역을 클릭하여 포커스를 얻은 후, 키보드를 누르면 이벤트 트리거 정보를 볼 수 있습니다.", + "【focusNode】 : 포커스 【FocusNode】", + "【autofocus】 : 자동 포커스 여부 【bool】", + "【includeSemantics】 : 의미 포함 여부 【bool】", + "【onKeyEvent】 : 키 이벤트 콜백 【ValueChanged?】", + "【child】 : 하위 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json new file mode 100644 index 00000000..b063905c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Ouvinte de Teclado", + "info": "Após obter o foco, monitora os eventos de teclas através de onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Monitorar Eventos de Teclado", + "desc": [ + "No exemplo, clique na área para obter o foco e, em seguida, pressione as teclas para ver as informações de acionamento do evento.", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Foco automático 【bool】", + "【includeSemantics】 : Incluir semântica 【bool】", + "【onKeyEvent】 : Evento de retorno de tecla 【ValueChanged?】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json new file mode 100644 index 00000000..a64b7693 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/KeyboardListener/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 284, + "name": "KeyboardListener", + "localName": "Слушатель клавиатуры", + "info": "После получения фокуса, прослушивает события нажатия клавиш через onKeyEvent.", + "lever": 5, + "family": 1, + "linkIds": [ + 282, + 283 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Прослушивание событий клавиатуры", + "desc": [ + "В примере область получает фокус при нажатии, затем при нажатии клавиш можно увидеть информацию о срабатывании события.", + "【focusNode】 : Фокус 【FocusNode】", + "【autofocus】 : Автоматический фокус 【bool】", + "【includeSemantics】 : Включать семантику 【bool】", + "【onKeyEvent】 : Событие обратного вызова нажатия клавиши 【ValueChanged?】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json new file mode 100644 index 00000000..f002e294 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Lizenzseite", + "info": "Die Lizenzseite der Anwendung, auf der Anwendungssymbol, Anwendungsname, Anwendungsversionsnummer usw. angegeben werden können, der Rest wird automatisch von Flutter generiert.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der LicensePage", + "desc": [ + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Rechtliche Hinweise der Anwendung 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json new file mode 100644 index 00000000..7eb9f3d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "License Page", + "info": "The license page of the application, where you can specify information such as the application icon, application name, application version number, etc. Other details are automatically generated by Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LicensePage", + "desc": [ + "【applicationIcon】: Top-left icon 【Widget】", + "【applicationVersion】: Version number 【String】", + "【applicationName】: Application name 【String】", + "【applicationLegalese】: Application legalese 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json new file mode 100644 index 00000000..eedee8de --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Página de Licencia", + "info": "La página de licencia de la aplicación, donde se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión, etc., el resto es generado automáticamente por Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LicensePage", + "desc": [ + "【applicationIcon】 : Icono en la esquina superior izquierda 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Aspectos legales de la aplicación 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json new file mode 100644 index 00000000..47101fb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Page de licence", + "info": "Page de licence de l'application, permettant de spécifier l'icône de l'application, le nom de l'application, le numéro de version, etc. Le reste est généré automatiquement par Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LicensePage", + "desc": [ + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Législation de l'application 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json new file mode 100644 index 00000000..e0c737bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Pagina della Licenza", + "info": "Pagina della licenza dell'applicazione, dove è possibile specificare l'icona dell'applicazione, il nome dell'applicazione, il numero di versione dell'applicazione, ecc., il resto è generato automaticamente da Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di LicensePage", + "desc": [ + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Legale dell'applicazione 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json new file mode 100644 index 00000000..16e66bc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "ライセンスページ", + "info": "アプリのライセンスページ。アプリのアイコン、アプリ名、アプリのバージョン番号などを指定できます。その他はFlutterによって自動生成されます。", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePageの基本的な使用法", + "desc": [ + "【applicationIcon】 : 左上のアイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリ名 【String】", + "【applicationLegalese】 : アプリの法律文 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json new file mode 100644 index 00000000..1fb4a742 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "라이센스 페이지", + "info": "앱의 라이센스 페이지, 앱 아이콘, 앱 이름, 앱 버전 번호 등을 지정할 수 있으며, 나머지는 Flutter에서 자동으로 생성됩니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LicensePage 기본 사용", + "desc": [ + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 앱 이름 【String】", + "【applicationLegalese】 : 앱 법률 문구 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json new file mode 100644 index 00000000..fcdce6a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Página de Licença", + "info": "Página de licença da aplicação, onde pode especificar o ícone da aplicação, o nome da aplicação, o número da versão da aplicação, entre outras informações, geradas automaticamente pelo Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico da LicensePage", + "desc": [ + "【applicationIcon】 : Ícone no canto superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legalidade da aplicação 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json new file mode 100644 index 00000000..069c22b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LicensePage/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 145, + "name": "LicensePage", + "localName": "Страница лицензии", + "info": "Страница лицензии приложения, где можно указать значок приложения, имя приложения, версию приложения и другую информацию, остальное автоматически генерируется Flutter.", + "lever": 1, + "family": 1, + "linkIds": [ + 130, + 193 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование LicensePage", + "desc": [ + "【applicationIcon】 : Иконка в верхнем левом углу 【Widget】", + "【applicationVersion】 : Версия 【String】", + "【applicationName】 : Имя приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json new file mode 100644 index 00000000..be736cf9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Horizontaler Fortschritt", + "info": "Eine lineare Fortschrittsanzeige, bei der Eigenschaften wie Farbe und Fortschritt angegeben werden können. Wenn der Wert null ist, dreht sie sich ununterbrochen.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von LinearProgressIndicator", + "desc": [ + "【value】 : Fortschritt 【double】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【valueColor】 : Fortschrittsfarbe 【Animation】", + " Wenn der Wert null ist, wird er kontinuierlich wiederholt" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json new file mode 100644 index 00000000..a8b73425 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Horizontal Progress", + "info": "A linear progress display that can specify properties such as color and progress. It will keep spinning when the value is null.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of LinearProgressIndicator", + "desc": [ + "【value】: Progress 【double】", + "【backgroundColor】: Background Color 【Color】", + "【valueColor】: Progress Color 【Animation】", + " It will keep looping when the value is null" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json new file mode 100644 index 00000000..b1dc370c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progreso horizontal", + "info": "Indicador de progreso lineal, se pueden especificar propiedades como el color, el progreso, etc. Si el valor es nulo, girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de LinearProgressIndicator", + "desc": [ + "【value】 : Progreso 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【valueColor】 : Color del progreso 【Animation】", + " Si el valor es nulo, girará continuamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json new file mode 100644 index 00000000..931656ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progression horizontale", + "info": "Affichage de progression linéaire, peut spécifier des propriétés telles que la couleur, la progression, etc. Tourne en continu lorsque la valeur est nulle.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de LinearProgressIndicator", + "desc": [ + "【value】 : Progression 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【valueColor】 : Couleur de progression 【Animation】", + " Tourne en continu lorsque la valeur est nulle" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json new file mode 100644 index 00000000..49eb97e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progresso Orizzontale", + "info": "Visualizzazione del progresso in linea retta, è possibile specificare attributi come colore e progresso. Quando il valore è null, continua a ruotare.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di LinearProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【valueColor】 : Colore del progresso 【Animation】", + " Quando il valore è null, continua a ciclare" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json new file mode 100644 index 00000000..18b7db38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "水平プログレス", + "info": "直線型の進捗表示で、色や進捗などの属性を指定できます。valueがnullの場合は回転し続けます。", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicatorの基本使用", + "desc": [ + "【value】 : 進捗 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【valueColor】 : 進捗色 【Animation】", + " valueがnullの場合はループし続けます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json new file mode 100644 index 00000000..51efe73c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "수평 진행률", + "info": "직선형 진행률 표시, 색상, 진행률 등 속성을 지정할 수 있습니다. value가 null일 경우 계속 회전합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LinearProgressIndicator 기본 사용", + "desc": [ + "【value】 : 진행률 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【valueColor】 : 진행률 색상 【Animation】", + " value가 null일 경우 계속 반복" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json new file mode 100644 index 00000000..bebd5b71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Progresso Horizontal", + "info": "Exibição de progresso em linha reta, pode especificar atributos como cor, progresso, etc. Quando o valor for null, ele girará continuamente.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do LinearProgressIndicator", + "desc": [ + "【value】 : Progresso 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【valueColor】 : Cor do progresso 【Animation】", + " Quando o valor for null, ele girará continuamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json new file mode 100644 index 00000000..8adec3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LinearProgressIndicator/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 47, + "name": "LinearProgressIndicator", + "localName": "Горизонтальный прогресс", + "info": "Линейный индикатор прогресса, можно указать цвет, прогресс и другие свойства. Если значение value равно null, индикатор будет вращаться бесконечно.", + "lever": 3, + "family": 1, + "linkIds": [ + 46, + 48 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Базовое использование LinearProgressIndicator", + "desc": [ + "【value】 : Прогресс 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【valueColor】 : Цвет прогресса 【Animation】", + " Если значение value равно null, индикатор будет вращаться бесконечно" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json new file mode 100644 index 00000000..3f8c2dd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Radliste", + "info": "Hochwertige zylindrische Scroll-Liste, äußerst raffiniert, ermöglicht die Angabe von Eigenschaften wie Höhe, Perspektive, Kompression usw. und empfängt Ereignisse bei der Auswahl während des Scrollens.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListWheelScrollView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【perspective】 : Perspektive 【double】", + "【itemExtent】 : Höhe des Elements 【EdgeInsets】", + "【onSelectedItemChanged】 : Rückruf bei Auswahl 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json new file mode 100644 index 00000000..f9958d8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Wheel List", + "info": "A high-end cylindrical sliding list, exquisitely designed, allowing you to specify properties such as item height, perspective, and extrusion, and receive selection events during scrolling.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListWheelScrollView", + "desc": [ + "【children】: List of child components 【List】", + "【perspective】: Perspective 【double】", + "【itemExtent】: Item height 【EdgeInsets】", + "【onSelectedItemChanged】: Selection callback 【ValueChanged】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json new file mode 100644 index 00000000..740eaf9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista de rueda de desplazamiento", + "info": "Una lista de desplazamiento cilíndrica de alta gama, muy ingeniosa, permite especificar propiedades como la altura del ítem, la perspectiva, la compresión, etc., y recibe eventos de selección al deslizar.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListWheelScrollView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【perspective】 : Grado de perspectiva 【double】", + "【itemExtent】 : Altura del ítem 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback de selección 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json new file mode 100644 index 00000000..db5f6631 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Liste à roulette", + "info": "Une liste de défilement cylindrique haut de gamme, très ingénieuse, permettant de spécifier des propriétés telles que la hauteur des éléments, la perspective, la compression, etc., et recevant des événements de sélection lors du défilement.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListWheelScrollView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【perspective】 : Degré de perspective 【double】", + "【itemExtent】 : Hauteur de l'élément 【EdgeInsets】", + "【onSelectedItemChanged】 : Rappel de sélection 【ValueChanged】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json new file mode 100644 index 00000000..4ba379f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista a rotella", + "info": "Una lista di scorrimento cilindrica di alto livello, molto raffinata, con la possibilità di specificare proprietà come l'altezza degli item, la prospettiva, la compressione, e di ricevere eventi di selezione durante lo scorrimento.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ListWheelScrollView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【perspective】 : Prospettiva 【double】", + "【itemExtent】 : Altezza dell'item 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback di selezione 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json new file mode 100644 index 00000000..225fb042 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "ホイールリスト", + "info": "高級感あふれる円柱状のスライドリストで、精巧な仕様です。アイテムの高さ、パースペクティブ、圧縮などの属性を指定でき、スライド時の選択イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【perspective】 : パースペクティブ 【double】", + "【itemExtent】 : アイテムの高さ 【EdgeInsets】", + "【onSelectedItemChanged】 : 選択コールバック 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json new file mode 100644 index 00000000..48a86a82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "휠 리스트", + "info": "고급스러운 원통형 슬라이드 리스트, 정교함이 가득하며, 아이템 높이, 원근감, 압축 등 속성을 지정할 수 있고, 슬라이드 시 선택 이벤트를 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListWheelScrollView 기본 사용", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【perspective】 : 원근감 【double】", + "【itemExtent】 : 아이템 높이 【EdgeInsets】", + "【onSelectedItemChanged】 : 선택 콜백 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json new file mode 100644 index 00000000..7755454f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Lista de Rolagem de Roda", + "info": "Uma lista de rolagem cilíndrica de alta classe, cheia de sofisticação, permite especificar propriedades como altura do item, perspetiva, esmagamento, e recebe eventos de seleção durante a rolagem.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ListWheelScrollView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【perspective】 : Grau de perspetiva 【double】", + "【itemExtent】 : Altura do item 【EdgeInsets】", + "【onSelectedItemChanged】 : Callback de seleção 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json new file mode 100644 index 00000000..204c580c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ListWheelScrollView/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 179, + "name": "ListWheelScrollView", + "localName": "Колесо списка", + "info": "Высококлассный цилиндрический список с прокруткой, изысканный и утонченный, позволяет задавать такие свойства, как высота элемента, перспектива, сжатие и т.д., принимает события выбора при прокрутке.", + "lever": 4, + "family": 1, + "linkIds": [ + 139, + 291 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListWheelScrollView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【perspective】 : Перспектива 【double】", + "【itemExtent】 : Высота элемента 【EdgeInsets】", + "【onSelectedItemChanged】 : Обратный вызов при выборе 【ValueChanged 】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json new file mode 100644 index 00000000..e76332fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalisierung", + "info": "Stellt internationalisierte Ressourcen für Teilbaumknoten bereit, basierend auf der Implementierung von InheritedWidget. MaterialApp integriert diese Komponente intern, deren locale- und delegates-Parameter letztendlich für diese Komponente verwendet werden.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Aktuelle Sprache abrufen", + "desc": [ + "Mit Localizations.localeOf(context) können die Locale-Dateninformationen der nächstgelegenen übergeordneten Localizations-Komponente basierend auf dem Kontext abgerufen werden." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json new file mode 100644 index 00000000..6836b478 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalization", + "info": "Provides internationalization resources for subtree nodes, implemented with the underlying dependency on InheritedWidget. The MaterialApp internally integrates this component, and its locale and delegates parameters are ultimately used for this component.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Get Current Language", + "desc": [ + "Through Localizations.localeOf(context), you can retrieve the Locale data information stored in the nearest upper-level Localizations component based on the context." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json new file mode 100644 index 00000000..60f1de63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internacionalización", + "info": "Proporciona recursos de internacionalización para los nodos del subárbol, implementado en el fondo con InheritedWidget. MaterialApp ya integra este componente internamente, y sus parámetros locale y delegates se utilizan finalmente en este componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obtener el idioma actual", + "desc": [ + "A través de Localizations.localeOf(context) se puede obtener la información de Locale almacenada en el componente Localizations más cercano en el contexto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json new file mode 100644 index 00000000..ede44826 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internationalisation", + "info": "Fournit des ressources d'internationalisation pour les nœuds de sous-arbre, implémenté en s'appuyant sur InheritedWidget. MaterialApp intègre déjà ce composant en interne, ses paramètres locale et delegates sont finalement utilisés pour ce composant.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obtenir la langue actuelle", + "desc": [ + "Avec Localizations.localeOf(context), vous pouvez obtenir les informations de Locale stockées dans le composant Localizations le plus proche en fonction du contexte." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json new file mode 100644 index 00000000..753b5da4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internazionalizzazione", + "info": "Fornisce risorse di internazionalizzazione per i nodi del sottoalbero, implementato tramite InheritedWidget. Questo componente è già integrato all'interno di MaterialApp, e i parametri locale e delegates vengono utilizzati per questo componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Ottieni la lingua corrente", + "desc": [ + "Utilizzando Localizations.localeOf(context), è possibile ottenere le informazioni di Locale memorizzate nel componente Localizations più vicino in base al contesto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json new file mode 100644 index 00000000..ab2dee74 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "国際化", + "info": "サブツリーノードに国際化リソースを提供し、内部では InheritedWidget に依存して実装されています。MaterialApp 内部ではこのコンポーネントが統合されており、その locale と delegates パラメータは最終的にこのコンポーネントに使用されます。", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "現在の言語を取得", + "desc": [ + "Localizations.localeOf(context) を使用して、コンテキストに基づいて最も近い上位の Localizations コンポーネントに保存されている Locale データ情報を取得できます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json new file mode 100644 index 00000000..046365c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "국제화", + "info": "하위 트리 노드에 국제화 리소스를 제공하며, 내부적으로 InheritedWidget에 의존하여 구현됩니다. MaterialApp 내부에 이 컴포넌트가 통합되어 있으며, locale 및 delegates 매개변수는 최종적으로 이 컴포넌트에 사용됩니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "현재 언어 가져오기", + "desc": [ + "Localizations.localeOf(context)를 통해 컨텍스트에서 가장 가까운 상위 Localizations 컴포넌트에 저장된 Locale 데이터 정보를 가져올 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json new file mode 100644 index 00000000..dc911f17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Internacionalização", + "info": "Fornece recursos de internacionalização para os nós da subárvore, dependendo da implementação do InheritedWidget. O MaterialApp já integra este componente internamente, e os parâmetros locale e delegates são usados ​​finalmente para este componente.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Obter idioma atual", + "desc": [ + "Através de Localizations.localeOf(context), é possível obter as informações de Locale armazenadas no componente Localizations mais próximo com base no contexto." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json new file mode 100644 index 00000000..2f1d22db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Localizations/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 290, + "name": "Localizations", + "localName": "Интернационализация", + "info": "Предоставляет ресурсы интернационализации для поддеревьев, реализовано на основе InheritedWidget. MaterialApp уже интегрирует этот компонент, его параметры locale и delegates в конечном итоге используются этим компонентом.", + "lever": 4, + "family": 1, + "linkIds": [ + 65, + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Получить текущий язык", + "desc": [ + "С помощью Localizations.localeOf(context) можно получить данные Locale, хранящиеся в ближайшем верхнем компоненте Localizations, на основе контекста." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json new file mode 100644 index 00000000..a20e742e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Ziel ziehen", + "info": "Lassen Sie die Komponente bei langem Drücken auf der Oberfläche frei ziehen, und speichern Sie Daten eines generischen Typs T. Wird normalerweise in Kombination mit DragTarget verwendet, um den Zieheffekt zu erzielen.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable mit DragTarget kombinieren", + "desc": [ + "【child】 : Kind 【Widget】", + "【feedback】 : Kind beim Ziehen 【Widget】", + "【axis】 : Achse ziehen 【Axis】", + "【data】 : Daten 【T】", + "【onDragStarted】 : Ziehen beginnen 【Function()】", + "【onDragEnd】 : Ziehen beenden 【Function(DraggableDetails)】", + "【onDragCompleted】 : Ziehen abgeschlossen 【Function()】", + "【onDraggableCanceled】 : Ziehen abbrechen 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json new file mode 100644 index 00000000..7119db04 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Drag Target", + "info": "Allows the component to be dragged anywhere on the interface when long-pressed, and can store data of a generic type T. It is usually used in combination with DragTarget to achieve the drag effect.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable used with DragTarget", + "desc": [ + "【child】 : child 【Widget】", + "【feedback】 : child during drag 【Widget】", + "【axis】 : axis of drag 【Axis】", + "【data】 : data 【T】", + "【onDragStarted】 : start drag 【Function()】", + "【onDragEnd】 : end drag 【Function(DraggableDetails)】", + "【onDragCompleted】 : drag completed 【Function()】", + "【onDraggableCanceled】 : drag canceled 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json new file mode 100644 index 00000000..b1d47365 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Objetivo de arrastre", + "info": "Permite que el componente se arrastre libremente en la interfaz cuando se mantiene presionado, y puede almacenar datos de un tipo genérico T. Generalmente se usa en combinación con DragTarget para completar el efecto de arrastre.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso combinado de LongPressDraggable y DragTarget", + "desc": [ + "【child】 : Hijo 【Widget】", + "【feedback】 : Hijo durante el arrastre 【Widget】", + "【axis】 : Eje de arrastre 【Axis】", + "【data】 : Datos 【T】", + "【onDragStarted】 : Inicio del arrastre 【Function()】", + "【onDragEnd】 : Fin del arrastre 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrastre completado 【Function()】", + "【onDraggableCanceled】 : Arrastre cancelado 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json new file mode 100644 index 00000000..4a4e46ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Cible de glissement", + "info": "Permet à un composant d'être glissé n'importe où sur l'interface lorsqu'il est pressé longuement, peut contenir une donnée de type générique T. Généralement utilisé en combinaison avec DragTarget pour réaliser l'effet de glissement.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation conjointe de LongPressDraggable et DragTarget", + "desc": [ + "【child】 : Enfant 【Widget】", + "【feedback】 : Enfant pendant le glissement 【Widget】", + "【axis】 : Axe de glissement 【Axis】", + "【data】 : Données 【T】", + "【onDragStarted】 : Début du glissement 【Function()】", + "【onDragEnd】 : Fin du glissement 【Function(DraggableDetails)】", + "【onDragCompleted】 : Glissement terminé 【Function()】", + "【onDraggableCanceled】 : Glissement annulé 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json new file mode 100644 index 00000000..a8a08abf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Obiettivo trascinabile", + "info": "Permette di trascinare il componente sull'interfaccia quando viene premuto a lungo, può contenere un dato di tipo generico T. Solitamente utilizzato in combinazione con DragTarget per completare l'effetto di trascinamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso combinato di LongPressDraggable e DragTarget", + "desc": [ + "【child】 : figlio 【Widget】", + "【feedback】 : figlio durante il trascinamento 【Widget】", + "【axis】 : asse di trascinamento 【Axis】", + "【data】 : dati 【T】", + "【onDragStarted】 : inizio trascinamento 【Function()】", + "【onDragEnd】 : fine trascinamento 【Function(DraggableDetails)】", + "【onDragCompleted】 : trascinamento completato 【Function()】", + "【onDraggableCanceled】 : trascinamento annullato 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json new file mode 100644 index 00000000..facd28a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "ドラッグターゲット", + "info": "長押しでコンポーネントをインターフェース上で自由にドラッグできるようにし、ジェネリック型Tのデータを格納できます。通常、DragTargetと組み合わせてドラッグ効果を実現します。", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggableとDragTargetの連携", + "desc": [ + "【child】 : 子 【Widget】", + "【feedback】 : ドラッグ時の子 【Widget】", + "【axis】 : ドラッグ軸 【Axis】", + "【data】 : データ 【T】", + "【onDragStarted】 : ドラッグ開始 【Function()】", + "【onDragEnd】 : ドラッグ終了 【Function(DraggableDetails)】", + "【onDragCompleted】 : ドラッグ完了 【Function()】", + "【onDraggableCanceled】 : ドラッグキャンセル 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json new file mode 100644 index 00000000..4294fc42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "드래그 대상", + "info": "길게 누르면 컴포넌트를 화면에서 자유롭게 드래그할 수 있으며, 제네릭 T 타입의 데이터를 저장할 수 있습니다. 일반적으로 DragTarget과 조합하여 드래그 효과를 완성합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "LongPressDraggable과 DragTarget 함께 사용", + "desc": [ + "【child】 : 자식 【Widget】", + "【feedback】 : 드래그 시 자식 【Widget】", + "【axis】 : 드래그 축 【Axis】", + "【data】 : 데이터 【T】", + "【onDragStarted】 : 드래그 시작 【Function()】", + "【onDragEnd】 : 드래그 종료 【Function(DraggableDetails)】", + "【onDragCompleted】 : 드래그 완료 【Function()】", + "【onDraggableCanceled】 : 드래그 취소 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json new file mode 100644 index 00000000..818aee01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Alvo de Arrastar", + "info": "Permite que um componente seja arrastado livremente na interface quando pressionado por um longo tempo, podendo armazenar um dado do tipo genérico T. Geralmente usado em combinação com DragTarget para completar o efeito de arrastar.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Conjunto de LongPressDraggable e DragTarget", + "desc": [ + "【child】 : Filho 【Widget】", + "【feedback】 : Filho durante o arrasto 【Widget】", + "【axis】 : Eixo de arrasto 【Axis】", + "【data】 : Dados 【T】", + "【onDragStarted】 : Início do arrasto 【Function()】", + "【onDragEnd】 : Fim do arrasto 【Function(DraggableDetails)】", + "【onDragCompleted】 : Arrasto concluído 【Function()】", + "【onDraggableCanceled】 : Arrasto cancelado 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json new file mode 100644 index 00000000..611d49af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/LongPressDraggable/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 105, + "name": "LongPressDraggable", + "localName": "Цель для перетаскивания", + "info": "Позволяет компоненту перетаскиваться по интерфейсу при длительном нажатии, может хранить данные типа T. Обычно используется в сочетании с DragTarget для достижения эффекта перетаскивания.", + "lever": 4, + "family": 1, + "linkIds": [ + 103, + 104 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование LongPressDraggable с DragTarget", + "desc": [ + "【child】 : Дочерний элемент 【Widget】", + "【feedback】 : Дочерний элемент при перетаскивании 【Widget】", + "【axis】 : Ось перетаскивания 【Axis】", + "【data】 : Данные 【T】", + "【onDragStarted】 : Начало перетаскивания 【Function()】", + "【onDragEnd】 : Конец перетаскивания 【Function(DraggableDetails)】", + "【onDragCompleted】 : Перетаскивание завершено 【Function()】", + "【onDraggableCanceled】 : Перетаскивание отменено 【Function(Velocity,Offset)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json new file mode 100644 index 00000000..c6036f68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Materialkomponente", + "info": "Der führende Vertreter von Material-Stil-Komponenten, das Herzstück. Kann Attribute wie Farbe, Schattentiefe, Typ, Schattenfarbe, Form usw. festlegen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Material", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【type】 : Typ 【MaterialType】", + "【elevation】 : Schattentiefe 【double】", + "【shadowColor】 : Schattenfarbe 【Color】", + "【color】 : Farbe 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Shape-Attribut von Material", + "desc": [ + "【shape】 : Form 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json new file mode 100644 index 00000000..13bbe4f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Material Component", + "info": "The leader and core of Material style components. You can specify properties such as color, elevation, type, shadow color, shape, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Material", + "desc": [ + "【child】 : Child Component 【Widget】", + "【type】 : Type 【MaterialType】", + "【elevation】 : Elevation 【double】", + "【shadowColor】 : Shadow Color 【Color】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Shape Property of Material", + "desc": [ + "【shape】 : Shape 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json new file mode 100644 index 00000000..06f9ae7f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente de Material", + "info": "El líder y núcleo espiritual de los componentes de estilo Material. Puede especificar atributos como color, profundidad de sombra, tipo, color de sombra, forma, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Material", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profundidad de sombra 【double】", + "【shadowColor】 : Color de sombra 【Color】", + "【color】 : Color 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Propiedad shape de Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json new file mode 100644 index 00000000..b5694ce2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Composant Matériel", + "info": "Le leader des composants de style Material, l'âme centrale. Peut spécifier des attributs tels que la couleur, la profondeur de l'ombre, le type, la couleur de l'ombre, la forme, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Material", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【type】 : Type 【MaterialType】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shadowColor】 : Couleur de l'ombre 【Color】", + "【color】 : Couleur 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Attribut de forme de Material", + "desc": [ + "【shape】 : Forme 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json new file mode 100644 index 00000000..695b1f79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente Material", + "info": "Leader dei componenti in stile Material, cuore e anima. Puoi specificare attributi come colore, profondità dell'ombra, tipo, colore dell'ombra, forma, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Material", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shadowColor】 : Colore dell'ombra 【Color】", + "【color】 : Colore 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Attributo shape di Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json new file mode 100644 index 00000000..1e988e45 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "材料コンポーネント", + "info": "Materialスタイルコンポーネントのリーダー、コアとなる存在。色、影の深さ、タイプ、影の色、形状などの属性を指定できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Materialの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【type】 : タイプ 【MaterialType】", + "【elevation】 : 影の深さ 【double】", + "【shadowColor】 : 影の色 【Color】", + "【color】 : 色 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Materialのshape属性", + "desc": [ + "【shape】 : 形状 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json new file mode 100644 index 00000000..9b9337d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "재료 컴포넌트", + "info": "Material 스타일 컴포넌트의 선두주자, 핵심 요소. 색상, 그림자 깊이, 유형, 그림자 색상, 모양 등 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Material 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【type】 : 유형 【MaterialType】", + "【elevation】 : 그림자 깊이 【double】", + "【shadowColor】 : 그림자 색상 【Color】", + "【color】 : 색상 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Material의 shape 속성", + "desc": [ + "【shape】 : 모양 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json new file mode 100644 index 00000000..d4379be6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Componente de Material", + "info": "O líder e núcleo espiritual dos componentes de estilo Material. Pode especificar atributos como cor, profundidade de sombra, tipo, cor da sombra, forma, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Material", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【type】 : Tipo 【MaterialType】", + "【elevation】 : Profundidade de sombra 【double】", + "【shadowColor】 : Cor da sombra 【Color】", + "【color】 : Cor 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Propriedade shape do Material", + "desc": [ + "【shape】 : Forma 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json new file mode 100644 index 00000000..c047f3f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Material/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 160, + "name": "Material", + "localName": "Компонент материала", + "info": "Лидер компонентов в стиле Material, ядро и душа. Можно указать такие атрибуты, как цвет, глубина тени, тип, цвет тени, форма и другие.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Material", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【type】 : Тип 【MaterialType】", + "【elevation】 : Глубина тени 【double】", + "【shadowColor】 : Цвет тени 【Color】", + "【color】 : Цвет 【Color】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Атрибут shape Material", + "desc": [ + "【shape】 : Форма 【ShapeBorder】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json new file mode 100644 index 00000000..54c45913 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material-Anwendung", + "info": "Die oberste Komponente der Material-Anwendung, enthält Eigenschaften wie Routengenerator, Thema, Sprache, Startseite usw.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MaterialApp", + "desc": [ + "【theme】 : Thema 【ThemeData】", + "【title】 : Titel in der Taskleiste 【String】", + "【debugShowCheckedModeBanner】 : Badge aktivieren 【bool】", + "【showPerformanceOverlay】 : Leistungsüberlagerung aktivieren 【bool】", + "【debugShowMaterialGrid】 : Raster aktivieren 【bool】", + "【onGenerateRoute】 : Routengenerator 【RouteFactory】", + "【home】 : Startseite 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json new file mode 100644 index 00000000..94a88732 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material Application", + "info": "The top-level component of a Material application, including properties such as route generator, theme, language, home page, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MaterialApp", + "desc": [ + "【theme】 : Theme 【ThemeData】", + "【title】 : Taskbar Title 【String】", + "【debugShowCheckedModeBanner】 : Enable Badge 【bool】", + "【showPerformanceOverlay】 : Enable Performance Overlay 【bool】", + "【debugShowMaterialGrid】 : Enable Grid 【bool】", + "【onGenerateRoute】 : Route Generator 【RouteFactory】", + "【home】 : Home Page 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json new file mode 100644 index 00000000..b994d6c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Aplicación Material", + "info": "Componente de nivel superior de la aplicación Material, que incluye propiedades como el generador de rutas, tema, idioma, página de inicio, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título de la barra de tareas 【String】", + "【debugShowCheckedModeBanner】 : Activar insignia 【bool】", + "【showPerformanceOverlay】 : Activar superposición de rendimiento 【bool】", + "【debugShowMaterialGrid】 : Activar cuadrícula 【bool】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【home】 : Página de inicio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json new file mode 100644 index 00000000..dae6e1a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Application Material", + "info": "Le composant de niveau supérieur de l'application Material, incluant des propriétés telles que le générateur de routes, le thème, la langue, la page d'accueil, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MaterialApp", + "desc": [ + "【theme】 : Thème 【ThemeData】", + "【title】 : Titre de la barre des tâches 【String】", + "【debugShowCheckedModeBanner】 : Activer le badge 【bool】", + "【showPerformanceOverlay】 : Activer la superposition de performance 【bool】", + "【debugShowMaterialGrid】 : Activer la grille 【bool】", + "【onGenerateRoute】 : Générateur de routes 【RouteFactory】", + "【home】 : Page d'accueil 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json new file mode 100644 index 00000000..0c824a8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Applicazione Material", + "info": "Componente di primo livello per applicazioni Material, include proprietà come generatore di route, tema, lingua, homepage, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Titolo della barra delle applicazioni 【String】", + "【debugShowCheckedModeBanner】 : Attiva badge 【bool】", + "【showPerformanceOverlay】 : Attiva overlay delle prestazioni 【bool】", + "【debugShowMaterialGrid】 : Attiva griglia 【bool】", + "【onGenerateRoute】 : Generatore di route 【RouteFactory】", + "【home】 : Homepage 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json new file mode 100644 index 00000000..207e1de5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Materialアプリ", + "info": "Materialアプリのトップレベルのコンポーネントで、ルートジェネレータ、テーマ、言語、ホームページなどの属性を含みます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialAppの基本使い方", + "desc": [ + "【theme】 : テーマ 【ThemeData】", + "【title】 : タスクバーのタイトル 【String】", + "【debugShowCheckedModeBanner】 : バッジを表示する 【bool】", + "【showPerformanceOverlay】 : パフォーマンスオーバーレイを表示する 【bool】", + "【debugShowMaterialGrid】 : グリッドを表示する 【bool】", + "【onGenerateRoute】 : ルートジェネレータ 【RouteFactory】", + "【home】 : ホームページ 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json new file mode 100644 index 00000000..420abe91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material 앱", + "info": "Material 앱의 최상위 컴포넌트로, 라우트 생성기, 테마, 언어, 홈페이지 등의 속성을 포함합니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialApp 기본 사용법", + "desc": [ + "【theme】 : 테마 【ThemeData】", + "【title】 : 작업 표시줄 제목 【String】", + "【debugShowCheckedModeBanner】 : 배지 활성화 【bool】", + "【showPerformanceOverlay】 : 성능 오버레이 활성화 【bool】", + "【debugShowMaterialGrid】 : 그리드 활성화 【bool】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【home】 : 홈페이지 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json new file mode 100644 index 00000000..faa15650 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Aplicação Material", + "info": "Componente de topo da aplicação Material, que inclui gerador de rotas, tema, idioma, página inicial, entre outros atributos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MaterialApp", + "desc": [ + "【theme】 : Tema 【ThemeData】", + "【title】 : Título da barra de tarefas 【String】", + "【debugShowCheckedModeBanner】 : Ativar insígnia 【bool】", + "【showPerformanceOverlay】 : Ativar sobreposição de desempenho 【bool】", + "【debugShowMaterialGrid】 : Ativar grelha 【bool】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【home】 : Página inicial 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json new file mode 100644 index 00000000..43e5975c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MaterialApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 65, + "name": "MaterialApp", + "localName": "Material приложение", + "info": "Верхний компонент Material приложения, включающий генератор маршрутов, тему, язык, домашнюю страницу и другие атрибуты.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MaterialApp", + "desc": [ + "【theme】 : Тема 【ThemeData】", + "【title】 : Заголовок в панели задач 【String】", + "【debugShowCheckedModeBanner】 : Включить значок 【bool】", + "【showPerformanceOverlay】 : Включить наложение производительности 【bool】", + "【debugShowMaterialGrid】 : Включить сетку 【bool】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【home】 : Домашняя страница 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json new file mode 100644 index 00000000..c6265925 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Kombinierbares Material", + "info": "Wird verwendet, um eine Liste von MergeableMaterialItem anzuzeigen, einschließlich MaterialSlice (Hauptteil) und MaterialGap (Trennlinie).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MergeableMaterial", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【hasDividers】 : Gibt es Trennlinien 【bool】", + "【dividerColor】 : Farbe der Trennlinie 【Color】", + "【mainAxis】 : Achse 【Axis】", + "【children】 : Sammlung von Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json new file mode 100644 index 00000000..8c6e9e0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Mergeable Material", + "info": "Used to display a list of MergeableMaterialItem, including MaterialSlice (main body) and MaterialGap (separator).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MergeableMaterial", + "desc": [ + "【elevation】 : Shadow depth 【double】", + "【hasDividers】 : Whether there are dividers 【bool】", + "【dividerColor】 : Divider color 【Color】", + "【mainAxis】 : Axis direction 【Axis】", + "【children】 : Child components collection 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json new file mode 100644 index 00000000..871630a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Material Fusionable", + "info": "Utilizado para mostrar una lista de MergeableMaterialItem, incluyendo MaterialSlice (cuerpo) y MaterialGap (separador).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MergeableMaterial", + "desc": [ + "【elevation】 : Profundidad de la sombra 【double】", + "【hasDividers】 : Si tiene líneas divisorias 【bool】", + "【dividerColor】 : Color de la línea divisoria 【Color】", + "【mainAxis】 : Eje principal 【Axis】", + "【children】 : Conjunto de componentes hijos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json new file mode 100644 index 00000000..005e06ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Matériau Fusionnable", + "info": "Utilisé pour afficher une liste de MergeableMaterialItem, comprenant MaterialSlice (corps principal) et MaterialGap (séparateur).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MergeableMaterial", + "desc": [ + "【elevation】 : Profondeur d'ombre 【double】", + "【hasDividers】 : Présence de lignes de séparation 【bool】", + "【dividerColor】 : Couleur de la ligne de séparation 【Color】", + "【mainAxis】 : Axe principal 【Axis】", + "【children】 : Ensemble de composants enfants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json new file mode 100644 index 00000000..32e9b9d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Materiale Unificabile", + "info": "Utilizzato per visualizzare una lista di MergeableMaterialItem, inclusi MaterialSlice (corpo) e MaterialGap (separazione).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di MergeableMaterial", + "desc": [ + "【elevation】 : Profondità dell'ombra 【double】", + "【hasDividers】 : Presenza di linee divisorie 【bool】", + "【dividerColor】 : Colore della linea divisoria 【Color】", + "【mainAxis】 : Asse principale 【Axis】", + "【children】 : Insieme di componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json new file mode 100644 index 00000000..d62c71e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "マージ可能な材料", + "info": "MergeableMaterialItemのリストを表示するために使用され、MaterialSlice(本体)とMaterialGap(区切り)を含みます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterialの基本使用", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【hasDividers】 : 区切り線があるかどうか 【bool】", + "【dividerColor】 : 区切り線の色 【Color】", + "【mainAxis】 : 軸方向 【Axis】", + "【children】 : 子コンポーネントセット 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json new file mode 100644 index 00000000..3a511350 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "병합 가능한 재료", + "info": "MergeableMaterialItem의 목록을 표시하는 데 사용되며, MaterialSlice(본체)와 MaterialGap(구분자)를 포함합니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MergeableMaterial 기본 사용법", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【hasDividers】 : 구분선 여부 【bool】", + "【dividerColor】 : 구분선 색상 【Color】", + "【mainAxis】 : 축 방향 【Axis】", + "【children】 : 하위 컴포넌트 집합 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json new file mode 100644 index 00000000..a0f50e44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Material Fundível", + "info": "Usado para exibir uma lista de MergeableMaterialItem, incluindo MaterialSlice (corpo) e MaterialGap (separador).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MergeableMaterial", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【hasDividers】 : Se tem linhas divisórias 【bool】", + "【dividerColor】 : Cor da linha divisória 【Color】", + "【mainAxis】 : Eixo 【Axis】", + "【children】 : Conjunto de componentes filhos 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json new file mode 100644 index 00000000..6190e65d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MergeableMaterial/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 261, + "name": "MergeableMaterial", + "localName": "Объединяемый материал", + "info": "Используется для отображения списка MergeableMaterialItem, включая MaterialSlice (основная часть) и MaterialGap (разделитель).", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MergeableMaterial", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【hasDividers】 : Наличие разделителей 【bool】", + "【dividerColor】 : Цвет разделителя 【Color】", + "【mainAxis】 : Ось 【Axis】", + "【children】 : Набор дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json new file mode 100644 index 00000000..a98eb3c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_de_DE.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Monatsauswahl", + "info": "Komponente zur Auswahl eines Monats mit integrierter Überwachung für den Wechsel zwischen den Monaten. Ermöglicht die Angabe des auszuwählenden Datumsbereichs, des ausgewählten Datums usw. und empfängt Ereignisse bei der Datumsauswahl.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MonthPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【onChanged】 : Rückruf bei Klick 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, die Monatsauswahl, wurde mit Flutter 3.0 aus dem Verkehr gezogen. Der Ersatz ist der CalendarDatePicker, der Kalenderauswahl.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json new file mode 100644 index 00000000..ef72e4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_en_US.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Month Picker", + "info": "A component for selecting months, with built-in listeners for switching between previous and next months. Allows specifying the date range, selected date, and receives date selection events.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MonthPicker", + "desc": [ + "【selectedDate】: Selected date 【DateTime】", + "【firstDate】: Earliest date limit 【DateTime】", + "【lastDate】: Latest date limit 【DateTime】", + "【onChanged】: Click callback 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, the month selector, has been phased out in Flutter 3.0. It is replaced by the CalendarDatePicker, the calendar selector.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json new file mode 100644 index 00000000..0c2e6c0e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_es_ES.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Selector de Mes", + "info": "Componente de selección de mes con escucha incorporada para cambiar entre meses. Permite especificar rangos de fechas seleccionables, fechas seleccionadas, y recibe eventos de selección de fecha.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de MonthPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【firstDate】 : Límite de la primera fecha 【DateTime】", + "【lastDate】 : Límite de la última fecha 【DateTime】", + "【onChanged】 : Callback al hacer clic 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, el selector de mes, dejó de usarse en Flutter 3.0. Fue reemplazado por CalendarDatePicker, el selector de calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json new file mode 100644 index 00000000..02ed6122 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_fr_FR.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Sélecteur de mois", + "info": "Composant de sélection de mois avec écouteur intégré pour passer au mois précédent ou suivant. Peut spécifier la plage de dates sélectionnables, la date sélectionnée, etc., et reçoit les événements de sélection de date.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MonthPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【onChanged】 : Rappel au clic 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, le sélecteur de mois, a quitté la scène historique avec Flutter 3.0. Il est remplacé par CalendarDatePicker, le sélecteur de calendrier.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json new file mode 100644 index 00000000..c5d648dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_it_IT.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Selettore del mese", + "info": "Componente di selezione del mese, con monitoraggio integrato per il passaggio al mese precedente o successivo. È possibile specificare l'intervallo di date selezionabile, la data selezionata, ecc., e ricevere eventi di selezione della data.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MonthPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【firstDate】 : Limite della data più recente 【DateTime】", + "【lastDate】 : Limite della data più lontana 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, il selettore del mese, è stato ritirato in Flutter 3.0. Il suo sostituto è il CalendarDatePicker, il selettore del calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json new file mode 100644 index 00000000..46d81212 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ja_JP.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "月選択器", + "info": "月の選択コンポーネントで、前後の月への切り替えを監視します。選択可能な日付範囲や選択された日付を指定でき、日付選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPickerの基本使用", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 月選択器は Flutter3.0 で歴史の舞台から退場しました。代替として CalendarDatePicker カレンダー選択器が登場しました。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json new file mode 100644 index 00000000..9299152b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ko_KR.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "월 선택기", + "info": "월을 선택하는 컴포넌트로, 상하월 전환을 자동으로 감지합니다. 선택 가능한 날짜 범위, 선택된 날짜 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MonthPicker 기본 사용법", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【firstDate】 : 최초 날짜 제한 【DateTime】", + "【lastDate】 : 마지막 날짜 제한 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker 월 선택기는 Flutter3.0에서 역사 속으로 사라졌습니다. 이를 대체하는 것은 CalendarDatePicker 달력 선택기입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json new file mode 100644 index 00000000..0ff589c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_pt_PT.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Seletor de Mês", + "info": "Componente de seleção de mês, com monitoramento integrado para mudança de mês. Pode especificar o intervalo de datas selecionado, a data selecionada, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MonthPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'O MonthPicker, o seletor de mês, foi retirado do palco histórico no Flutter 3.0. O substituto é o CalendarDatePicker, o seletor de calendário.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json new file mode 100644 index 00000000..baa15739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MonthPicker/desc_ru_RU.json @@ -0,0 +1,54 @@ +{ + "id": 135, + "name": "MonthPicker", + "localName": "Выбор месяца", + "info": "Компонент выбора месяца с встроенным прослушиванием переключения на предыдущий и следующий месяц. Можно указать диапазон выбора дат, выбранную дату и т.д., принимает событие выбора даты.", + "lever": 3, + "family": 1, + "deprecated": -1, + "linkIds": [ + 134, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MonthPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【onChanged】 : Обратный вызов при клике 【Function(DateTime)】", + " ", + "class CustomMonthPicker extends StatelessWidget{", + " const CustomMonthPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'MonthPicker, компонент выбора месяца, ушел в историю с выходом Flutter 3.0. Его заменил CalendarDatePicker, компонент выбора даты.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: MonthPicker(", + " selectedDate: _date,", + " onChanged: (date) => setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json new file mode 100644 index 00000000..246a4c82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Mausbereich", + "info": "Eine Komponente zur Überwachung von Mausereignissen, wird normalerweise für Desktop- und Webplattformen verwendet und kann Mausbewegungen, Eintritts- und Austrittsereignisse überwachen.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von MouseRegion", + "desc": [ + "【onEnter】: Eintrittsereignis 【PointerEnterEventListener】", + "【onHover】: Bewegungsereignis 【PointerHoverEventListener】", + "【onExit】: Austrittsereignis 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json new file mode 100644 index 00000000..858d3001 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Mouse Region", + "info": "A component for mouse event listening, typically used on desktop and web platforms, can listen to mouse enter, exit, and move events.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of MouseRegion", + "desc": [ + "【onEnter】: Enter event 【PointerEnterEventListener】", + "【onHover】: Move event 【PointerHoverEventListener】", + "【onExit】: Exit event 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json new file mode 100644 index 00000000..8aaf2d68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Región del Ratón", + "info": "Componente utilizado para la escucha de eventos del ratón, comúnmente utilizado en plataformas de escritorio y web, puede escuchar eventos de entrada, salida y movimiento del ratón.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de MouseRegion", + "desc": [ + "【onEnter】 : Evento de entrada 【PointerEnterEventListener】", + "【onHover】: Evento de movimiento 【PointerHoverEventListener】", + "【onExit】: Evento de salida 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json new file mode 100644 index 00000000..e58a9d8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Région de souris", + "info": "Composant utilisé pour la surveillance des événements de souris, généralement utilisé sur les plateformes de bureau et Web, peut surveiller les événements d'entrée, de sortie et de déplacement de la souris.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de MouseRegion", + "desc": [ + "【onEnter】 : Événement d'entrée 【PointerEnterEventListener】", + "【onHover】: Événement de déplacement 【PointerHoverEventListener】", + "【onExit】: Événement de sortie 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json new file mode 100644 index 00000000..82062799 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Area del Mouse", + "info": "Componente per il monitoraggio degli eventi del mouse, comunemente utilizzato su piattaforme desktop e web, in grado di monitorare eventi di entrata, uscita e movimento del mouse.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di MouseRegion", + "desc": [ + "【onEnter】: Evento di entrata 【PointerEnterEventListener】", + "【onHover】: Evento di movimento 【PointerHoverEventListener】", + "【onExit】: Evento di uscita 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json new file mode 100644 index 00000000..8984d5db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "マウス領域", + "info": "マウスイベントを監視するためのコンポーネントで、通常はデスクトップおよびWebプラットフォームで使用され、マウスの入場、退出、移動イベントを監視できます。", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegionの基本使用", + "desc": [ + "【onEnter】 : 入場イベント 【PointerEnterEventListener】", + "【onHover】: 移動イベント 【PointerHoverEventListener】", + "【onExit】: 退出イベント 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json new file mode 100644 index 00000000..56709993 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "마우스 영역", + "info": "마우스 이벤트를 감지하는 컴포넌트로, 주로 데스크톱 및 웹 플랫폼에서 사용되며, 마우스 진입, 이동, 이탈 이벤트를 감지할 수 있습니다.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MouseRegion 기본 사용", + "desc": [ + "【onEnter】 : 진입 이벤트 【PointerEnterEventListener】", + "【onHover】: 이동 이벤트 【PointerHoverEventListener】", + "【onExit】: 이탈 이벤트 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json new file mode 100644 index 00000000..cf3097e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Região do Rato", + "info": "Componente para monitorização de eventos do rato, geralmente utilizado em plataformas de desktop e web, pode monitorizar eventos de entrada, saída e movimento do rato.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do MouseRegion", + "desc": [ + "【onEnter】 : Evento de entrada 【PointerEnterEventListener】", + "【onHover】: Evento de movimento 【PointerHoverEventListener】", + "【onExit】: Evento de saída 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json new file mode 100644 index 00000000..fbde4efe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/MouseRegion/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 293, + "name": "MouseRegion", + "localName": "Область мыши", + "info": "Компонент для отслеживания событий мыши, обычно используется на платформах для настольных компьютеров и веб-платформах, может отслеживать события входа, выхода и перемещения мыши.", + "lever": 3, + "family": 2, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование MouseRegion", + "desc": [ + "【onEnter】: Событие входа 【PointerEnterEventListener】", + "【onHover】: Событие перемещения 【PointerHoverEventListener】", + "【onExit】: Событие выхода 【PointerExitEventListener】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json new file mode 100644 index 00000000..74f4b8e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_de_DE.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Seitennavigation", + "info": "Seitennavigationsleiste, wird im Allgemeinen für Desktop-Navigationsmenüs verwendet. Unterstützt erweiterbare und reduzierbare Bereiche, kann Komponenten für die Anfangsposition und Endposition angeben.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail Grundlegende Verwendung", + "desc": [ + "【destinations】 : Menüdatenliste 【List】", + "【selectedIndex】: Aktivierter Index 【int】", + "【labelType】: Label-Stil 【NavigationRailLabelType?】", + "【onDestinationSelected】: Menü-Klick-Ereignis 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail Falt-Effekt", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【leading】: Startkomponente 【Widget?】", + "【trailing】: Endkomponente 【Widget?】", + "【extended】: Ob erweitert 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail Stil", + "desc": [ + "【useIndicator】 : Ob Indikator angezeigt wird 【bool】", + "【indicatorColor】: Indikatorfarbe 【Color?】", + "【backgroundColor】: Hintergrundfarbe 【Color?】", + "【labelType】: Label-Stil 【NavigationRailLabelType?】", + "【selectedIconTheme】: Ausgewähltes Icon-Thema 【IconThemeData?】", + "【unselectedIconTheme】: Nicht ausgewähltes Icon-Thema 【IconThemeData?】", + "【selectedLabelTextStyle】: Ausgewählter Textstil 【TextStyle?】", + "【unselectedLabelTextStyle】: Nicht ausgewählter Textstil 【TextStyle?】", + "【minExtendedWidth】: Erweiterte Breite 【double?】", + "【minWidth】: Nicht erweiterte Breite 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json new file mode 100644 index 00000000..e9853927 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_en_US.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Side Navigation Bar", + "info": "Side navigation bar, generally used for desktop navigation menus. Supports expanding and collapsing areas, and can specify components at the beginning and end positions.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NavigationRail", + "desc": [ + "【destinations】 : Menu data list 【List】", + "【selectedIndex】: Active index 【int】", + "【labelType】: Label style 【NavigationRailLabelType?】", + "【onDestinationSelected】: Menu click event 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Collapse Effect of NavigationRail", + "desc": [ + "【elevation】 : Shadow depth 【double】", + "【leading】: Leading component 【Widget?】", + "【trailing】: Trailing component 【Widget?】", + "【extended】: Whether to expand 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail Style", + "desc": [ + "【useIndicator】 : Whether to show the indicator 【bool】", + "【indicatorColor】: Indicator color 【Color?】", + "【backgroundColor】: Background color 【Color?】", + "【labelType】: Label style 【NavigationRailLabelType?】", + "【selectedIconTheme】: Selected icon style 【IconThemeData?】", + "【unselectedIconTheme】: Unselected icon style 【IconThemeData?】", + "【selectedLabelTextStyle】: Selected text style 【TextStyle?】", + "【unselectedLabelTextStyle】: Unselected text style 【TextStyle?】", + "【minExtendedWidth】: Expanded width 【double?】", + "【minWidth】: Unexpanded width 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json new file mode 100644 index 00000000..ed04f669 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_es_ES.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Navegación lateral", + "info": "Barra de navegación lateral, generalmente utilizada para menús de navegación de escritorio. Admite áreas expandibles y contraíbles, y permite especificar componentes en la posición inicial y final.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NavigationRail", + "desc": [ + "【destinations】 : Lista de datos del menú 【List】", + "【selectedIndex】: Índice activo 【int】", + "【labelType】: Estilo de la etiqueta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento de clic en el menú 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Efecto de plegado de NavigationRail", + "desc": [ + "【elevation】 : Profundidad de la sombra 【double】", + "【leading】: Componente inicial 【Widget?】", + "【trailing】: Componente final 【Widget?】", + "【extended】: Si está expandido 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Estilo de NavigationRail", + "desc": [ + "【useIndicator】 : Si se muestra el indicador 【bool】", + "【indicatorColor】: Color del indicador 【Color?】", + "【backgroundColor】: Color de fondo 【Color?】", + "【labelType】: Estilo de la etiqueta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Estilo del icono seleccionado 【IconThemeData?】", + "【unselectedIconTheme】: Estilo del icono no seleccionado 【IconThemeData?】", + "【selectedLabelTextStyle】: Estilo del texto seleccionado 【TextStyle?】", + "【unselectedLabelTextStyle】: Estilo del texto no seleccionado 【TextStyle?】", + "【minExtendedWidth】: Ancho expandido 【double?】", + "【minWidth】: Ancho no expandido 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json new file mode 100644 index 00000000..8203bb85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_fr_FR.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Barre de navigation latérale", + "info": "Barre de navigation latérale, généralement utilisée pour les menus de navigation sur ordinateur. Prend en charge l'expansion et la contraction des zones, et permet de spécifier les composants en position de début et de fin.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NavigationRail", + "desc": [ + "【destinations】 : Liste des données du menu 【List】", + "【selectedIndex】: Index actif 【int】", + "【labelType】: Style de l'étiquette 【NavigationRailLabelType?】", + "【onDestinationSelected】: Événement de clic sur le menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Effet de pliage de NavigationRail", + "desc": [ + "【elevation】 : Profondeur de l'ombre 【double】", + "【leading】: Composant de début 【Widget?】", + "【trailing】: Composant de fin 【Widget?】", + "【extended】: Est-ce étendu 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Style de NavigationRail", + "desc": [ + "【useIndicator】 : Afficher l'indicateur 【bool】", + "【indicatorColor】: Couleur de l'indicateur 【Color?】", + "【backgroundColor】: Couleur de fond 【Color?】", + "【labelType】: Style de l'étiquette 【NavigationRailLabelType?】", + "【selectedIconTheme】: Style de l'icône sélectionnée 【IconThemeData?】", + "【unselectedIconTheme】: Style de l'icône non sélectionnée 【IconThemeData?】", + "【selectedLabelTextStyle】: Style du texte sélectionné 【TextStyle?】", + "【unselectedLabelTextStyle】: Style du texte non sélectionné 【TextStyle?】", + "【minExtendedWidth】: Largeur étendue 【double?】", + "【minWidth】: Largeur non étendue 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json new file mode 100644 index 00000000..6e44bddf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_it_IT.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Navigazione laterale", + "info": "Barra di navigazione laterale, generalmente utilizzata per il menu di navigazione desktop. Supporta l'espansione e la contrazione delle aree, e consente di specificare i componenti nelle posizioni iniziali e finali.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di NavigationRail", + "desc": [ + "【destinations】 : Lista dei dati del menu 【List】", + "【selectedIndex】: Indice attivo 【int】", + "【labelType】: Stile dell'etichetta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento di clic sul menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Effetto di collasso di NavigationRail", + "desc": [ + "【elevation】 : Profondità dell'ombra 【double】", + "【leading】: Componente iniziale 【Widget?】", + "【trailing】: Componente finale 【Widget?】", + "【extended】: Se espanso 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Stile di NavigationRail", + "desc": [ + "【useIndicator】 : Se mostrare l'indicatore 【bool】", + "【indicatorColor】: Colore dell'indicatore 【Color?】", + "【backgroundColor】: Colore di sfondo 【Color?】", + "【labelType】: Stile dell'etichetta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Stile dell'icona selezionata 【IconThemeData?】", + "【unselectedIconTheme】: Stile dell'icona non selezionata 【IconThemeData?】", + "【selectedLabelTextStyle】: Stile del testo selezionato 【TextStyle?】", + "【unselectedLabelTextStyle】: Stile del testo non selezionato 【TextStyle?】", + "【minExtendedWidth】: Larghezza espansa 【double?】", + "【minWidth】: Larghezza non espansa 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json new file mode 100644 index 00000000..81addefb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ja_JP.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "サイドバーナビゲーション", + "info": "サイドナビゲーションバーは、通常デスクトップのナビゲーションメニューに使用されます。展開と収縮の領域をサポートし、最初と最後の位置のコンポーネントを指定できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 基本使用", + "desc": [ + "【destinations】 : メニューデータリスト 【List】", + "【selectedIndex】: アクティブインデックス 【int】", + "【labelType】: ラベルスタイル 【NavigationRailLabelType?】", + "【onDestinationSelected】: メニュークリックイベント 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 折りたたみ効果", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【leading】: 最初のコンポーネント 【Widget?】", + "【trailing】: 最後のコンポーネント 【Widget?】", + "【extended】: 展開するかどうか 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail スタイル", + "desc": [ + "【useIndicator】 : インジケーターを表示するかどうか 【bool】", + "【indicatorColor】: インジケーターの色 【Color?】", + "【backgroundColor】: 背景色 【Color?】", + "【labelType】: ラベルスタイル 【NavigationRailLabelType?】", + "【selectedIconTheme】: 選択されたアイコンのスタイル 【IconThemeData?】", + "【unselectedIconTheme】: 選択されていないアイコンのスタイル 【IconThemeData?】", + "【selectedLabelTextStyle】: 選択されたテキストのスタイル 【TextStyle?】", + "【unselectedLabelTextStyle】: 選択されていないテキストのスタイル 【TextStyle?】", + "【minExtendedWidth】: 展開幅 【double?】", + "【minWidth】: 未展開幅 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json new file mode 100644 index 00000000..351ea2c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ko_KR.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "사이드바 내비게이션", + "info": "사이드 내비게이션 바, 일반적으로 데스크톱 내비게이션 메뉴에 사용됩니다. 확장 및 축소 영역을 지원하며, 처음과 끝 위치 컴포넌트를 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationRail 기본 사용법", + "desc": [ + "【destinations】 : 메뉴 데이터 리스트 【List】", + "【selectedIndex】: 활성화 인덱스 【int】", + "【labelType】: 라벨 스타일 【NavigationRailLabelType?】", + "【onDestinationSelected】: 메뉴 클릭 이벤트 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "NavigationRail 접힘 효과", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【leading】: 처음 컴포넌트 【Widget?】", + "【trailing】: 끝 컴포넌트 【Widget?】", + "【extended】: 확장 여부 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "NavigationRail 스타일", + "desc": [ + "【useIndicator】 : 인디케이터 표시 여부 【bool】", + "【indicatorColor】: 인디케이터 색상 【Color?】", + "【backgroundColor】: 배경색 【Color?】", + "【labelType】: 라벨 스타일 【NavigationRailLabelType?】", + "【selectedIconTheme】: 선택된 아이콘 스타일 【IconThemeData?】", + "【unselectedIconTheme】: 선택되지 않은 아이콘 스타일 【IconThemeData?】", + "【selectedLabelTextStyle】: 선택된 텍스트 스타일 【TextStyle?】", + "【unselectedLabelTextStyle】: 선택되지 않은 텍스트 스타일 【TextStyle?】", + "【minExtendedWidth】: 확장된 너비 【double?】", + "【minWidth】: 확장되지 않은 너비 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json new file mode 100644 index 00000000..ae772d91 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_pt_PT.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Barra de Navegação Lateral", + "info": "Barra de navegação lateral, geralmente usada para menus de navegação em desktop. Suporta áreas expansíveis e retráteis, com componentes especificáveis nas posições inicial e final.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NavigationRail", + "desc": [ + "【destinations】 : Lista de dados do menu 【List】", + "【selectedIndex】: Índice ativo 【int】", + "【labelType】: Estilo da etiqueta 【NavigationRailLabelType?】", + "【onDestinationSelected】: Evento de clique no menu 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Efeito de Recolhimento do NavigationRail", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【leading】: Componente inicial 【Widget?】", + "【trailing】: Componente final 【Widget?】", + "【extended】: Expandido 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Estilo do NavigationRail", + "desc": [ + "【useIndicator】 : Mostrar indicador 【bool】", + "【indicatorColor】: Cor do indicador 【Color?】", + "【backgroundColor】: Cor de fundo 【Color?】", + "【labelType】: Estilo da etiqueta 【NavigationRailLabelType?】", + "【selectedIconTheme】: Estilo do ícone selecionado 【IconThemeData?】", + "【unselectedIconTheme】: Estilo do ícone não selecionado 【IconThemeData?】", + "【selectedLabelTextStyle】: Estilo do texto selecionado 【TextStyle?】", + "【unselectedLabelTextStyle】: Estilo do texto não selecionado 【TextStyle?】", + "【minExtendedWidth】: Largura expandida 【double?】", + "【minWidth】: Largura não expandida 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json new file mode 100644 index 00000000..e9889ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NavigationRail/desc_ru_RU.json @@ -0,0 +1,50 @@ +{ + "id": 358, + "name": "NavigationRail", + "localName": "Боковая навигация", + "info": "Боковая панель навигации, обычно используется для навигационного меню на рабочем столе. Поддерживает расширение и сворачивание области, можно указать компоненты в начале и конце.", + "lever": 4, + "family": 1, + "linkIds": [ + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NavigationRail", + "desc": [ + "【destinations】 : Список данных меню 【List】", + "【selectedIndex】: Активный индекс 【int】", + "【labelType】: Стиль метки 【NavigationRailLabelType?】", + "【onDestinationSelected】: Событие клика по меню 【ValueChanged?】" + ] + }, + { + "file": "node2_extend.dart", + "name": "Эффект сворачивания NavigationRail", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【leading】: Начальный компонент 【Widget?】", + "【trailing】: Конечный компонент 【Widget?】", + "【extended】: Развернуто ли 【bool】" + ] + }, + { + "file": "node3_dark.dart", + "name": "Стиль NavigationRail", + "desc": [ + "【useIndicator】 : Показывать ли индикатор 【bool】", + "【indicatorColor】: Цвет индикатора 【Color?】", + "【backgroundColor】: Цвет фона 【Color?】", + "【labelType】: Стиль метки 【NavigationRailLabelType?】", + "【selectedIconTheme】: Стиль выбранной иконки 【IconThemeData?】", + "【unselectedIconTheme】: Стиль невыбранной иконки 【IconThemeData?】", + "【selectedLabelTextStyle】: Стиль выбранного текста 【TextStyle?】", + "【unselectedLabelTextStyle】: Стиль невыбранного текста 【TextStyle?】", + "【minExtendedWidth】: Ширина в развернутом состоянии 【double?】", + "【minWidth】: Ширина в свернутом состоянии 【double?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json new file mode 100644 index 00000000..3f97142a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigator", + "info": "Der Navigator verwaltet eine Gruppe von Unterkomponenten nach Stack-Regeln, kann Unterkomponenten ein- und ausblenden und Ereignisse beim Ein- und Ausstapeln überwachen. Die Routenverwaltung von MaterialApp basiert auf dem Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Navigators", + "desc": [ + "【initialRoute】: Anfangsroute 【String】", + "【onGenerateRoute】: Routengenerator 【RouteFactory】", + "【observers】: Routenbeobachter 【List】", + "【onPopPage】: Rückruf beim Entfernen aus dem Stack 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json new file mode 100644 index 00000000..b36e3220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigator", + "info": "The Navigator manages a group of child components using stack rules, allowing child components to be pushed and popped, and listening to stack events. The origin of MaterialApp's route management is the use of Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Navigator", + "desc": [ + "【initialRoute】: Initial display route 【String】", + "【onGenerateRoute】: Route generator 【RouteFactory】", + "【observers】: Route observers 【List】", + "【onPopPage】: Pop page callback 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json new file mode 100644 index 00000000..d3006b1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navegador", + "info": "Navigator gestiona un grupo de componentes secundarios utilizando reglas de pila, permitiendo empujar y sacar componentes secundarios, así como escuchar eventos de entrada y salida de la pila. La gestión de rutas de MaterialApp se basa en el uso de Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Navigator", + "desc": [ + "【initialRoute】 : Ruta inicial 【String】", + "【onGenerateRoute】 : Generador de rutas 【RouteFactory】", + "【observers】 : Observador de rutas 【List】", + "【onPopPage】 : Callback de salida de pila 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json new file mode 100644 index 00000000..86704356 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigateur", + "info": "Navigator gère un ensemble de composants enfants en utilisant des règles de pile, permettant de pousser et de retirer des composants enfants ainsi que d'écouter les événements d'entrée et de sortie de la pile. La gestion des routes de MaterialApp est fondamentalement basée sur l'utilisation de Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Navigator", + "desc": [ + "【initialRoute】 : Route initiale 【String】", + "【onGenerateRoute】 : Générateur de route 【RouteFactory】", + "【observers】 : Observateur de route 【List】", + "【onPopPage】 : Rappel de sortie de pile 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json new file mode 100644 index 00000000..713fe080 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navigatore", + "info": "Navigator gestisce un gruppo di componenti figli utilizzando regole di stack, può spingere e rimuovere componenti figli e monitorare gli eventi di entrata e uscita dallo stack. La gestione delle route di MaterialApp si basa sull'uso di Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Navigator", + "desc": [ + "【initialRoute】 : Route iniziale 【String】", + "【onGenerateRoute】 : Generatore di route 【RouteFactory】", + "【observers】 : Osservatori di route 【List】", + "【onPopPage】 : Callback di rimozione dallo stack 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json new file mode 100644 index 00000000..8d9747e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "ナビゲーター", + "info": "Navigatorはスタックルールを使用して一連の子コンポーネントを管理し、子コンポーネントを切り替えたり、スタックの出入りイベントを監視したりすることができます。MaterialAppのルート管理の根源はNavigatorを使用しています。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigatorの基本使用方法", + "desc": [ + "【initialRoute】 : 最初に表示されるルート 【String】", + "【onGenerateRoute】 : ルートジェネレーター 【RouteFactory】", + "【observers】 : ルートオブザーバー 【List】", + "【onPopPage】 : スタックから出るコールバック 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json new file mode 100644 index 00000000..b84707be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "네비게이터", + "info": "Navigator는 스택 규칙을 사용하여 자식 위젯 그룹을 관리하며, 자식 위젯을 푸시하고 팝하며 스택 이벤트를 수신할 수 있습니다. MaterialApp의 라우팅 관리의 근원은 Navigator를 사용한 것입니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Navigator 기본 사용법", + "desc": [ + "【initialRoute】 : 초기 표시 라우트 【String】", + "【onGenerateRoute】 : 라우트 생성기 【RouteFactory】", + "【observers】 : 라우트 리스너 【List】", + "【onPopPage】 : 팝 콜백 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json new file mode 100644 index 00000000..16934999 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Navegador", + "info": "O Navigator gere um grupo de componentes filhos usando regras de pilha, podendo empurrar e retirar componentes filhos, bem como monitorar eventos de entrada e saída da pilha. A gestão de rotas do MaterialApp baseia-se no uso do Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Navigator", + "desc": [ + "【initialRoute】 : Rota inicial 【String】", + "【onGenerateRoute】 : Gerador de rotas 【RouteFactory】", + "【observers】 : Observador de rotas 【List】", + "【onPopPage】 : Callback de saída da pilha 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json new file mode 100644 index 00000000..fcf4be64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Navigator/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 232, + "name": "Navigator", + "localName": "Навигатор", + "info": "Navigator управляет группой дочерних компонентов по правилам стека, может добавлять и удалять дочерние компоненты, а также отслеживать события входа и выхода из стека. Источник управления маршрутами MaterialApp использует Navigator.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Navigator", + "desc": [ + "【initialRoute】 : Первоначальный маршрут отображения 【String】", + "【onGenerateRoute】 : Генератор маршрутов 【RouteFactory】", + "【observers】 : Наблюдатели маршрутов 【List】", + "【onPopPage】 : Обратный вызов выхода из стека 【PopPageCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json new file mode 100644 index 00000000..d0a10392 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Verschachtelte Scrollansicht", + "info": "Wird zur Behandlung des verschachtelten Scrollens mehrerer Ansichten verwendet. Es können Kopf, Scroll-Controller, Scrollrichtung usw. angegeben werden. Dabei muss der Körper eine scrollbare Komponente sein.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von NestedScrollView", + "desc": [ + "【controller】 : Scroll-Controller 【ScrollController】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Umgekehrt 【bool】", + "【physics】 : Scrollstil 【ScrollPhysics】", + "【dragStartBehavior】 : Startverhalten beim Ziehen 【DragStartBehavior】", + "【headerSliverBuilder】 : *Kopfkonstruktor 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Inhalt 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json new file mode 100644 index 00000000..e2f92a4b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Nested Scroll View", + "info": "Used for handling nested scrolling of multiple views, can specify the header, scroll controller, scroll direction, etc., where the body must be a scrollable type of component.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NestedScrollView", + "desc": [ + "【controller】 : Scroll Controller 【ScrollController】", + "【scrollDirection】 : Scroll Direction 【Axis】", + "【reverse】 : Whether to Reverse 【bool】", + "【physics】 : Scroll Physics 【ScrollPhysics】", + "【dragStartBehavior】 : Drag Start Behavior 【DragStartBehavior】", + "【headerSliverBuilder】 : *Header Builder 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Content 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json new file mode 100644 index 00000000..3650d963 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vista de desplazamiento anidada", + "info": "Utilizado para manejar el desplazamiento anidado de múltiples vistas, se puede especificar la cabecera, el controlador de desplazamiento, la dirección de desplazamiento, etc., donde el cuerpo debe ser un componente de tipo desplazable.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NestedScrollView", + "desc": [ + "【controller】 : Controlador de desplazamiento 【ScrollController】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Invertir 【bool】", + "【physics】 : Estilo de desplazamiento 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamiento de inicio de arrastre 【DragStartBehavior】", + "【headerSliverBuilder】 : *Constructor de cabecera 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenido 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json new file mode 100644 index 00000000..b2956b13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vue de défilement imbriquée", + "info": "Utilisé pour gérer le défilement imbriqué de plusieurs vues, peut spécifier l'en-tête, le contrôleur de défilement, la direction de défilement, etc., où le corps doit être un composant de type défilable.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NestedScrollView", + "desc": [ + "【controller】 : Contrôleur de défilement 【ScrollController】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inverser 【bool】", + "【physics】 : Style de défilement 【ScrollPhysics】", + "【dragStartBehavior】 : Comportement de début de glissement 【DragStartBehavior】", + "【headerSliverBuilder】 : *Constructeur d'en-tête 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenu 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json new file mode 100644 index 00000000..ad1bc771 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Vista di scorrimento annidata", + "info": "Utilizzato per gestire lo scorrimento annidato di più viste, è possibile specificare l'intestazione, il controller di scorrimento, la direzione di scorrimento, ecc., dove il corpo deve essere un componente di tipo scorrevole.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di NestedScrollView", + "desc": [ + "【controller】 : Controller di scorrimento 【ScrollController】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】", + "【physics】 : Stile di scorrimento 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamento di inizio trascinamento 【DragStartBehavior】", + "【headerSliverBuilder】 : *Costruttore di intestazione 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Contenuto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json new file mode 100644 index 00000000..73f25d98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "ネストされたスクロールビュー", + "info": "複数のビューのスクロールネスト処理に使用されます。ヘッダー、スクロールコントローラー、スクロール方向などを指定できます。bodyはスクロール可能なタイプのコンポーネントでなければなりません。", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollViewの基本使い方", + "desc": [ + "【controller】 : スクロールコントローラー 【ScrollController】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向かどうか 【bool】", + "【physics】 : スクロールスタイル 【ScrollPhysics】", + "【dragStartBehavior】 : ドラッグ開始動作 【DragStartBehavior】", + "【headerSliverBuilder】 : *ヘッダービルダー 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *コンテンツ 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json new file mode 100644 index 00000000..de4bdc44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "중첩 스크롤 뷰", + "info": "여러 뷰의 스크롤 중첩 처리를 위해 사용되며, 헤더, 스크롤 컨트롤러, 스크롤 방향 등을 지정할 수 있습니다. 이때 body는 반드시 스크롤 가능한 타입의 컴포넌트여야 합니다.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NestedScrollView 기본 사용법", + "desc": [ + "【controller】 : 스크롤 컨트롤러 【ScrollController】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 역방향 여부 【bool】", + "【physics】 : 스크롤 스타일 【ScrollPhysics】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【headerSliverBuilder】 : *헤더 빌더 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *내용 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json new file mode 100644 index 00000000..183b3307 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Visão de Rolagem Aninhada", + "info": "Usado para o tratamento de rolagem aninhada de várias visualizações, pode especificar o cabeçalho, controlador de rolagem, direção de rolagem, etc., onde o corpo deve ser um componente do tipo rolável.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NestedScrollView", + "desc": [ + "【controller】 : Controlador de Rolagem 【ScrollController】", + "【scrollDirection】 : Direção de Rolagem 【Axis】", + "【reverse】 : Inverter 【bool】", + "【physics】 : Estilo de Rolagem 【ScrollPhysics】", + "【dragStartBehavior】 : Comportamento de Início de Arrasto 【DragStartBehavior】", + "【headerSliverBuilder】 : *Construtor de Cabeçalho 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Conteúdo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json new file mode 100644 index 00000000..10f3aa2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/NestedScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 251, + "name": "NestedScrollView", + "localName": "Вложенное прокручиваемое представление", + "info": "Используется для обработки вложенной прокрутки нескольких представлений, можно указать заголовок, контроллер прокрутки, направление прокрутки и т.д., где тело должно быть компонентом с возможностью прокрутки.", + "lever": 4, + "family": 4, + "linkIds": [ + 183, + 344 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NestedScrollView", + "desc": [ + "【controller】 : Контроллер прокрутки 【ScrollController】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【bool】", + "【physics】 : Стиль прокрутки 【ScrollPhysics】", + "【dragStartBehavior】 : Поведение начала перетаскивания 【DragStartBehavior】", + "【headerSliverBuilder】 : *Конструктор заголовка 【NestedScrollViewHeaderSliversBuilder】", + "【body】 : *Содержимое 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json new file mode 100644 index 00000000..26c0e4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Umrandeter Button", + "info": "Material-stilisiertes Schaltflächenelement mit Rahmen, ähnlich wie OutlineButton. Attribute wie Rahmen, Farbe, Schatten usw. können über Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OutlinedButton", + "desc": [ + "【child】 : Schaltflächeninhalt 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langdrückereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil von OutlinedButton", + "desc": [ + "【style】 : Schaltflächenstil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Zuschneideverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json new file mode 100644 index 00000000..01a2b1ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Outlined Button", + "info": "A Material-style outlined button, similar in behavior to OutlineButton. Properties such as border, color, and shadow can be changed through styling.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OutlinedButton", + "desc": [ + "【child】: Button content 【Widget】", + "【onPressed】: Click event 【VoidCallback】", + "【onLongPress】: Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton Style", + "desc": [ + "【style】: Button style 【ButtonStyle】", + "【focusNode】: Focus 【FocusNode】", + "【clipBehavior】: Clip behavior 【Clip】", + "【autofocus】: Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json new file mode 100644 index 00000000..567b7f31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Botón con borde", + "info": "Botón de estilo Material con borde, similar a OutlineButton. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., mediante estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OutlinedButton", + "desc": [ + "【child】 : Contenido del botón 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación prolongada 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de OutlinedButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json new file mode 100644 index 00000000..143ee767 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Bouton bordé", + "info": "Bouton de style Material avec bordure, similaire à OutlineButton. Les propriétés telles que la bordure, la couleur, l'ombre, etc., peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de OutlinedButton", + "desc": [ + "【child】 : Contenu du bouton 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de pression longue 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style de OutlinedButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json new file mode 100644 index 00000000..e0e9e975 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Pulsante con bordo", + "info": "Pulsante in stile Material con bordo, simile a OutlineButton. È possibile modificare proprietà come il bordo, il colore, l'ombra, ecc. tramite lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di OutlinedButton", + "desc": [ + "【child】 : Contenuto del pulsante 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di OutlinedButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json new file mode 100644 index 00000000..04a4e01d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "枠線ボタン", + "info": "Materialスタイルの枠線ボタンで、OutlineButtonと同様の動作をします。スタイルを変更して、枠線、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButtonの基本使用", + "desc": [ + "【child】 : ボタンの内容 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json new file mode 100644 index 00000000..08ef6379 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "테두리 버튼", + "info": "Material 스타일의 테두리 버튼으로, OutlineButton과 유사하게 동작합니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlinedButton 기본 사용법", + "desc": [ + "【child】 : 버튼 내용 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "OutlinedButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json new file mode 100644 index 00000000..c744c26f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Botão com Contorno", + "info": "Botão com contorno no estilo Material, semelhante ao OutlineButton. Pode alterar propriedades como contorno, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do OutlinedButton", + "desc": [ + "【child】 : Conteúdo do botão 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressionar longo 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do OutlinedButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json new file mode 100644 index 00000000..c6dbfa19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/OutlinedButton/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 355, + "name": "OutlinedButton", + "localName": "Кнопка с контуром", + "info": "Кнопка в стиле Material с контуром, аналогичная OutlineButton. Свойства, такие как контур, цвет, тень, могут быть изменены через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 353, + 27, + 354 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OutlinedButton", + "desc": [ + "【child】 : Содержимое кнопки 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие длительного нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль OutlinedButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json new file mode 100644 index 00000000..4a34c1f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Schwebende Komponente", + "info": "Ermöglicht die schwebende Anzeige von Komponenten in der gesamten Anwendung, Komponenten können hinzugefügt oder entfernt werden, sie haben einen unabhängig verwalteten Stack.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Overlay", + "desc": [ + "Overlay.of(context).insert fügt eine globale Komponente ein" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json new file mode 100644 index 00000000..57430ba3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Floating Component", + "info": "Can display components in a floating manner across the entire application, allowing components to be added or removed, with an independently managed stack.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Overlay", + "desc": [ + "Overlay.of(context).insert inserts a global component" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json new file mode 100644 index 00000000..61645ccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Flotante", + "info": "Permite mostrar componentes de forma flotante en toda la aplicación, se pueden agregar o eliminar componentes, tienen una pila gestionada de forma independiente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de Overlay", + "desc": [ + "Overlay.of(context).insert inserta un componente global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json new file mode 100644 index 00000000..811e9797 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Composant flottant", + "info": "Permet d'afficher un composant en mode flottant dans toute l'application, peut ajouter ou supprimer des composants, ils ont une pile gérée indépendamment.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Overlay", + "desc": [ + "Overlay.of(context).insert insère un composant global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json new file mode 100644 index 00000000..8cd793ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Sovrapposto", + "info": "Consente di visualizzare i componenti in sovrapposizione su tutta l'applicazione, aggiungere o rimuovere componenti, che hanno una pila gestita in modo indipendente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Overlay", + "desc": [ + "Overlay.of(context).insert inserisce un componente globale" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json new file mode 100644 index 00000000..8aa728b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "フローティングコンポーネント", + "info": "コンポーネントをアプリ全体でフローティング表示することができ、コンポーネントを追加または削除することができます。これらは独立して管理されるスタックを持っています。", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlayの基本使用", + "desc": [ + "Overlay.of(context).insertでグローバルコンポーネントを挿入" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json new file mode 100644 index 00000000..9fd065af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "플로팅 컴포넌트", + "info": "컴포넌트를 전체 애플리케이션에서 플로팅으로 표시할 수 있으며, 컴포넌트를 추가하거나 제거할 수 있고, 독립적으로 관리되는 스택을 가집니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Overlay 기본 사용법", + "desc": [ + "Overlay.of(context).insert로 전역 컴포넌트 삽입" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json new file mode 100644 index 00000000..0c59436b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Componente Flutuante", + "info": "Permite exibir componentes de forma flutuante em toda a aplicação, podendo adicionar ou remover componentes, eles têm uma pilha de gerenciamento independente.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Overlay", + "desc": [ + "Overlay.of(context).insert insere um componente global" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json new file mode 100644 index 00000000..6e3895e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Overlay/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 182, + "name": "Overlay", + "localName": "Плавающий компонент", + "info": "Позволяет отображать компоненты поверх всего приложения, добавлять или удалять компоненты, они имеют независимо управляемый стек.", + "lever": 5, + "family": 1, + "linkIds": [ + 265, + 266 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Overlay", + "desc": [ + "Overlay.of(context).insert вставляет глобальный компонент" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json new file mode 100644 index 00000000..3199650a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Swipe-Seite", + "info": "Enthält mehrere Komponentenseiten, zwischen denen durch Wischen gewechselt werden kann. Es können Attribute wie Wischrichtung, ob umgekehrt, Wischcontroller usw. angegeben werden.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PageView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【onPageChanged】 : Klickereignis 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Wischrichtung von PageView", + "desc": [ + "【scrollDirection】 : Wischrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Einfache Verwendung des PageView-Controllers", + "desc": [ + "【controller】 : Seitencontroller 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json new file mode 100644 index 00000000..f886e9db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Swipe Page", + "info": "It can accommodate multiple component pages, and you can swipe to switch between them. You can specify properties such as the direction of the swipe, whether it is reversed, and the swipe controller.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PageView", + "desc": [ + "【children】 : List of child components 【List】", + "【onPageChanged】 : Click event 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Swipe Direction of PageView", + "desc": [ + "【scrollDirection】 : Swipe direction 【Axis】", + "【reverse】 : Whether to reverse 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Simple Use of PageView Controller", + "desc": [ + "【controller】 : Page controller 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json new file mode 100644 index 00000000..a1c21840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Deslizar página", + "info": "Contiene múltiples páginas de componentes, permite cambiar entre ellas deslizando, y se pueden especificar propiedades como la dirección del deslizamiento, si es inverso, el controlador de deslizamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PageView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【onPageChanged】 : Evento de clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de deslizamiento de PageView", + "desc": [ + "【scrollDirection】 : Dirección de deslizamiento 【Axis】", + "【reverse】 : Si es inverso 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso simple del controlador de PageView", + "desc": [ + "【controller】 : Controlador de página 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json new file mode 100644 index 00000000..3463d157 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Glissement de page", + "info": "Contient plusieurs pages de composants, permet de les faire glisser pour les changer, et permet de spécifier la direction du glissement, l'inversion, le contrôleur de glissement, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PageView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【onPageChanged】 : Événement de clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de glissement de PageView", + "desc": [ + "【scrollDirection】 : Direction de glissement 【Axis】", + "【reverse】 : Inversion 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Utilisation simple du contrôleur de PageView", + "desc": [ + "【controller】 : Contrôleur de page 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json new file mode 100644 index 00000000..385a3183 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Scorrimento Pagina", + "info": "Contiene più componenti di pagina, consente di scorrere tra di essi, è possibile specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PageView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【onPageChanged】 : Evento di clic 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di PageView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso semplice del controller di PageView", + "desc": [ + "【controller】 : Controller della pagina 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json new file mode 100644 index 00000000..7741210a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "スワイプページ", + "info": "複数のコンポーネントページを収容し、それらをスワイプして切り替えることができます。スワイプの方向、逆方向にするかどうか、スワイプコントローラーなどの属性を指定できます。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【onPageChanged】 : クリックイベント 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageViewのスワイプ方向", + "desc": [ + "【scrollDirection】 : スワイプ方向 【Axis】", + "【reverse】 : 逆方向にするかどうか 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageViewコントローラーの簡単な使用", + "desc": [ + "【controller】 : ページコントローラー 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json new file mode 100644 index 00000000..345c08ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "스와이프 페이지", + "info": "여러 컴포넌트 페이지를 수용하며, 슬라이딩 전환을 할 수 있습니다. 슬라이딩 방향, 역방향 여부, 슬라이딩 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageView 기본 사용법", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【List】", + "【onPageChanged】 : 클릭 이벤트 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "PageView 슬라이딩 방향", + "desc": [ + "【scrollDirection】 : 슬라이딩 방향 【Axis】", + "【reverse】 : 역방향 여부 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "PageView 컨트롤러 간단 사용법", + "desc": [ + "【controller】 : 페이지 컨트롤러 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json new file mode 100644 index 00000000..e9da0fde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Deslizar Página", + "info": "Acomoda várias páginas de componentes, permite alternar entre elas deslizando, pode especificar a direção do deslize, se é reverso, controlador de deslize e outras propriedades.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do PageView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【onPageChanged】 : Evento de clique 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de deslize do PageView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se é reverso 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Uso simples do controlador do PageView", + "desc": [ + "【controller】 : Controlador de página 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json new file mode 100644 index 00000000..521e3d14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PageView/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 165, + "name": "PageView", + "localName": "Скользящая страница", + "info": "Содержит несколько компонентов страниц, позволяет переключаться между ними с помощью скольжения, можно указать направление скольжения, обратное направление, контроллер скольжения и другие свойства.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PageView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【onPageChanged】 : Событие клика 【ValueChanged】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление скольжения PageView", + "desc": [ + "【scrollDirection】 : Направление скольжения 【Axis】", + "【reverse】 : Обратное направление 【bool】" + ] + }, + { + "file": "node3_controller.dart", + "name": "Простое использование контроллера PageView", + "desc": [ + "【controller】 : Контроллер страницы 【PageController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json new file mode 100644 index 00000000..9f7f1ee8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Seitenweise Tabelle", + "info": "Eine funktionsreiche, seitenweise Tabellenkomponente, die die Seitenzahl, Sortierung und das Wechseln zwischen den Seiten ermöglicht.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von PaginatedDataTable", + "desc": [ + "【header】 : Tabellenname 【Widget】", + "【rowsPerPage】 : Anzahl der Datensätze pro Seite 【int】", + "【actions】 : Aktionskomponenten 【List】", + "【columns】 : Datenspalten 【List】", + "【sortColumnIndex】 : Index der Sortierspalte 【int】", + "【sortAscending】 : Aufsteigend sortieren 【bool】", + "【onSelectAll】 : Rückruf für Alle auswählen 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener für Seitenänderungen 【ValueChanged】", + "【availableRowsPerPage】 : Verfügbare Seitenlisten 【List】", + "【source】 : Datenquelle 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json new file mode 100644 index 00000000..add38363 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Paginated Table", + "info": "A feature-rich paginated table component that allows specifying the number of pages, sorting, and switching between pages.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable Usage", + "desc": [ + "【header】 : Table Name 【Widget】", + "【rowsPerPage】 : Number of records per page 【int】", + "【actions】 : Action components 【List】", + "【columns】 : Data columns 【List】", + "【sortColumnIndex】 : Sort column index 【int】", + "【sortAscending】 : Whether ascending 【bool】", + "【onSelectAll】 : Select all callback 【ValueSetter】", + "【onRowsPerPageChanged】 : Page change listener 【ValueChanged】", + "【availableRowsPerPage】 : Available page list 【List】", + "【source】 : Data source 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json new file mode 100644 index 00000000..96607e25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabla Paginada", + "info": "Un componente de tabla paginada rico en funciones, que permite especificar el número de páginas, el orden, y la navegación entre páginas.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de PaginatedDataTable", + "desc": [ + "【header】 : Nombre de la tabla 【Widget】", + "【rowsPerPage】 : Número de registros por página 【int】", + "【actions】 : Componentes de acción 【List】", + "【columns】 : Columnas de datos 【List】", + "【sortColumnIndex】 : Índice de la columna de ordenación 【int】", + "【sortAscending】 : Orden ascendente 【bool】", + "【onSelectAll】 : Callback de selección total 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener de cambio de paginación 【ValueChanged】", + "【availableRowsPerPage】 : Lista de paginación disponible 【List】", + "【source】 : Fuente de datos 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json new file mode 100644 index 00000000..43e77c18 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tableau paginé", + "info": "Un composant de tableau paginé riche en fonctionnalités, permettant de spécifier le nombre de pages, le tri, et la navigation entre les pages.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de PaginatedDataTable", + "desc": [ + "【header】 : Nom du tableau 【Widget】", + "【rowsPerPage】 : Nombre d'enregistrements par page 【int】", + "【actions】 : Composants d'action 【List】", + "【columns】 : Colonnes de données 【List】", + "【sortColumnIndex】 : Index de la colonne de tri 【int】", + "【sortAscending】 : Ordre croissant 【bool】", + "【onSelectAll】 : Rappel de sélection totale 【ValueSetter】", + "【onRowsPerPageChanged】 : Écouteur de changement de pagination 【ValueChanged】", + "【availableRowsPerPage】 : Liste des paginations disponibles 【List】", + "【source】 : Source de données 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json new file mode 100644 index 00000000..47a368e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabella Paginabile", + "info": "Un componente di tabella ricco di funzionalità, con paginazione, ordinamento e navigazione tra le pagine.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di PaginatedDataTable", + "desc": [ + "【header】 : Nome della tabella 【Widget】", + "【rowsPerPage】 : Numero di record per pagina 【int】", + "【actions】 : Componenti di azione 【List】", + "【columns】 : Colonne dei dati 【List】", + "【sortColumnIndex】 : Indice della colonna di ordinamento 【int】", + "【sortAscending】 : Ordinamento crescente 【bool】", + "【onSelectAll】 : Callback per la selezione di tutti 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener per il cambio della paginazione 【ValueChanged】", + "【availableRowsPerPage】 : Lista delle paginazioni disponibili 【List】", + "【source】 : Fonte dei dati 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json new file mode 100644 index 00000000..4485ba4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "ページネーション可能なテーブル", + "info": "ページネーション数、並び替え、ページの前後切り替えを指定できる機能豊富なページネーション可能なテーブルコンポーネント。", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable の使用", + "desc": [ + "【header】 : テーブル名 【Widget】", + "【rowsPerPage】 : 1ページあたりのレコード数 【int】", + "【actions】 : 操作コンポーネント 【List】", + "【columns】 : データ列 【List】", + "【sortColumnIndex】 : 並び替え列のインデックス 【int】", + "【sortAscending】 : 昇順かどうか 【bool】", + "【onSelectAll】 : 全選択コールバック 【ValueSetter】", + "【onRowsPerPageChanged】 : ページネーション変更リスナー 【ValueChanged】", + "【availableRowsPerPage】 : 利用可能なページネーションリスト 【List】", + "【source】 : データソース 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json new file mode 100644 index 00000000..ce3edafc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "페이지네이션 테이블", + "info": "기능이 풍부한 페이지네이션 테이블 컴포넌트로, 페이지 수, 정렬, 페이지 전환 등을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PaginatedDataTable 사용", + "desc": [ + "【header】 : 테이블 이름 【Widget】", + "【rowsPerPage】 : 페이지당 레코드 수 【int】", + "【actions】 : 액션 컴포넌트 【List】", + "【columns】 : 데이터 열 【List】", + "【sortColumnIndex】 : 정렬 열 인덱스 【int】", + "【sortAscending】 : 오름차순 여부 【bool】", + "【onSelectAll】 : 전체 선택 콜백 【ValueSetter】", + "【onRowsPerPageChanged】 : 페이지 변경 리스너 【ValueChanged】", + "【availableRowsPerPage】 : 사용 가능한 페이지 목록 【List】", + "【source】 : 데이터 소스 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json new file mode 100644 index 00000000..a3d105d8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Tabela Paginada", + "info": "Um componente de tabela paginada rico em funcionalidades, que permite especificar o número de páginas, ordenação, e navegação entre páginas.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do PaginatedDataTable", + "desc": [ + "【header】 : Nome da tabela 【Widget】", + "【rowsPerPage】 : Número de registros por página 【int】", + "【actions】 : Componentes de ação 【List】", + "【columns】 : Colunas de dados 【List】", + "【sortColumnIndex】 : Índice da coluna de ordenação 【int】", + "【sortAscending】 : Ordenação ascendente 【bool】", + "【onSelectAll】 : Callback de seleção total 【ValueSetter】", + "【onRowsPerPageChanged】 : Listener de mudança de paginação 【ValueChanged】", + "【availableRowsPerPage】 : Lista de paginação disponível 【List】", + "【source】 : Fonte de dados 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json new file mode 100644 index 00000000..c64937f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PaginatedDataTable/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 235, + "name": "PaginatedDataTable", + "localName": "Таблица с постраничной навигацией", + "info": "Многофункциональный компонент таблицы с постраничной навигацией, позволяющий указать количество страниц, сортировку и переключение между страницами.", + "lever": 4, + "family": 1, + "linkIds": [ + 110, + 102 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование PaginatedDataTable", + "desc": [ + "【header】 : Название таблицы 【Widget】", + "【rowsPerPage】 : Количество записей на странице 【int】", + "【actions】 : Компоненты действий 【List】", + "【columns】 : Столбцы данных 【List】", + "【sortColumnIndex】 : Индекс столбца сортировки 【int】", + "【sortAscending】 : Сортировка по возрастанию 【bool】", + "【onSelectAll】 : Обратный вызов для выбора всех 【ValueSetter】", + "【onRowsPerPageChanged】 : Слушатель изменения страницы 【ValueChanged】", + "【availableRowsPerPage】 : Список доступных страниц 【List】", + "【source】 : Источник данных 【DataTableSource】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json new file mode 100644 index 00000000..27b13dcc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Menüschaltfläche", + "info": "Zeigt ein Popup-Menü an, kann Attribute wie Versatz, Farbe, Schattentiefe, Form usw. angeben. Empfängt Ereignisse für die Auswahl von Elementen und die Abwahl.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuButton", + "desc": [ + "【itemBuilder】 : Builder 【PopupMenuItemBuilder】", + "【offset】 : Versatz 【Offset】", + "【color】 : Hintergrundfarbe 【Color】", + "【shape】 : Form 【ShapeBorder】", + "【elevation】 : Schattentiefe 【double】", + "【onCanceled】 : Abwahlereignis 【Function()】", + "【onSelected】 : Auswahlereignis 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json new file mode 100644 index 00000000..9946a4c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Menu Button", + "info": "A pop-up menu bar that can specify attributes such as offset, color, elevation, and shape. Receives item selection and deselection events.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuButton", + "desc": [ + "【itemBuilder】: Constructor 【PopupMenuItemBuilder】", + "【offset】: Offset 【Offset】", + "【color】: Background Color 【Color】", + "【shape】: Shape 【ShapeBorder】", + "【elevation】: Elevation 【double】", + "【onCanceled】: Cancel Event 【Function()】", + "【onSelected】: Selection Event 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json new file mode 100644 index 00000000..4ea4d72d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Botón de menú", + "info": "Menú emergente, se pueden especificar propiedades como desplazamiento, color, profundidad de sombra, forma, etc. Recibe eventos de selección de ítem y eventos de cancelación.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuButton", + "desc": [ + "【itemBuilder】 : Constructor 【PopupMenuItemBuilder】", + "【offset】 : Desplazamiento 【Offset】", + "【color】 : Color de fondo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profundidad de sombra 【double】", + "【onCanceled】 : Evento de cancelación 【Function()】", + "【onSelected】 : Evento de selección 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json new file mode 100644 index 00000000..b7aac68c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Bouton de menu", + "info": "Affiche un menu contextuel, permettant de spécifier des propriétés telles que le décalage, la couleur, la profondeur d'ombre, la forme, etc. Reçoit les événements de sélection et de désélection des éléments.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuButton", + "desc": [ + "【itemBuilder】 : Constructeur 【PopupMenuItemBuilder】", + "【offset】 : Décalage 【Offset】", + "【color】 : Couleur de fond 【Color】", + "【shape】 : Forme 【ShapeBorder】", + "【elevation】 : Profondeur d'ombre 【double】", + "【onCanceled】 : Événement d'annulation 【Function()】", + "【onSelected】 : Événement de sélection 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json new file mode 100644 index 00000000..3f7896f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Pulsante del menu", + "info": "Apre un menu a comparsa, con la possibilità di specificare proprietà come offset, colore, profondità dell'ombra, forma, ecc. Riceve eventi di selezione e annullamento degli elementi.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuButton", + "desc": [ + "【itemBuilder】 : Costruttore 【PopupMenuItemBuilder】", + "【offset】 : Offset 【Offset】", + "【color】 : Colore di sfondo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profondità dell'ombra 【double】", + "【onCanceled】 : Evento di annullamento 【Function()】", + "【onSelected】 : Evento di selezione 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json new file mode 100644 index 00000000..66ccb830 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "メニューボタン", + "info": "ポップアップメニューバーを表示し、オフセット、色、影の深さ、形状などの属性を指定できます。アイテムの選択イベントと選択解除イベントを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButtonの基本使用", + "desc": [ + "【itemBuilder】 : ビルダー 【PopupMenuItemBuilder】", + "【offset】 : オフセット 【Offset】", + "【color】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】", + "【elevation】 : 影の深さ 【double】", + "【onCanceled】 : キャンセルイベント 【Function()】", + "【onSelected】 : 選択イベント 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json new file mode 100644 index 00000000..77a05c34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "메뉴 버튼", + "info": "팝업 메뉴 바를 표시하며, 오프셋, 색상, 그림자 깊이, 모양 등의 속성을 지정할 수 있습니다. 아이템 선택 이벤트와 선택 취소 이벤트를 수신합니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuButton 기본 사용", + "desc": [ + "【itemBuilder】 : 생성자 【PopupMenuItemBuilder】", + "【offset】 : 오프셋 【Offset】", + "【color】 : 배경색 【Color】", + "【shape】 : 모양 【ShapeBorder】", + "【elevation】 : 그림자 깊이 【double】", + "【onCanceled】 : 취소 이벤트 【Function()】", + "【onSelected】 : 선택 이벤트 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json new file mode 100644 index 00000000..946e108f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Botão de Menu", + "info": "Exibe um menu pop-up, podendo especificar atributos como deslocamento, cor, profundidade de sombra, forma, etc. Recebe eventos de seleção e cancelamento de itens.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuButton", + "desc": [ + "【itemBuilder】 : Construtor 【PopupMenuItemBuilder】", + "【offset】 : Deslocamento 【Offset】", + "【color】 : Cor de fundo 【Color】", + "【shape】 : Forma 【ShapeBorder】", + "【elevation】 : Profundidade de sombra 【double】", + "【onCanceled】 : Evento de cancelamento 【Function()】", + "【onSelected】 : Evento de seleção 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json new file mode 100644 index 00000000..58a6e396 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuButton/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 56, + "name": "PopupMenuButton", + "localName": "Кнопка меню", + "info": "Всплывающее меню, можно указать смещение, цвет, глубину тени, форму и другие атрибуты. Принимает события выбора элемента и отмены выбора.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuButton", + "desc": [ + "【itemBuilder】 : Конструктор 【PopupMenuItemBuilder】", + "【offset】 : Смещение 【Offset】", + "【color】 : Цвет фона 【Color】", + "【shape】 : Форма 【ShapeBorder】", + "【elevation】 : Глубина тени 【double】", + "【onCanceled】 : Событие отмены 【Function()】", + "【onSelected】 : Событие выбора 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json new file mode 100644 index 00000000..7a5dba89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Popup-Menü-Trennlinie", + "info": "Die Trennlinie des PopupMenuButton, wird normalerweise nicht allein verwendet und kann in der Höhe angegeben werden.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PopupMenuDivider", + "desc": [ + "【height】 : Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json new file mode 100644 index 00000000..728542b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Popup Menu Divider", + "info": "The divider of PopupMenuButton, generally not used alone, the height can be specified.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PopupMenuDivider", + "desc": [ + "【height】 : height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json new file mode 100644 index 00000000..9c126922 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Divisor de menú emergente", + "info": "Divisor de PopupMenuButton, generalmente no se usa por separado, se puede especificar la altura.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PopupMenuDivider", + "desc": [ + "【height】 : altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json new file mode 100644 index 00000000..f928156a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Ligne de séparation du menu contextuel", + "info": "Ligne de séparation pour PopupMenuButton, généralement pas utilisée seule, peut spécifier la hauteur.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PopupMenuDivider", + "desc": [ + "【height】 : hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json new file mode 100644 index 00000000..925e2b30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Linea di divisione del menu a comparsa", + "info": "Linea di divisione per PopupMenuButton, generalmente non utilizzata da sola, può essere specificata l'altezza.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PopupMenuDivider", + "desc": [ + "【height】 : Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json new file mode 100644 index 00000000..1de2e6ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "ポップアップメニュー区切り線", + "info": "PopupMenuButtonの区切り線で、通常は単独で使用されず、高さを指定できます。", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDividerの基本使用", + "desc": [ + "【height】 : 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json new file mode 100644 index 00000000..831ee380 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "팝업 메뉴 구분선", + "info": "PopupMenuButton의 구분선, 일반적으로 단독으로 사용되지 않으며, 높이를 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PopupMenuDivider 기본 사용", + "desc": [ + "【height】 : 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json new file mode 100644 index 00000000..2b66764a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Divisor de Menu Pop-up", + "info": "Divisor do PopupMenuButton, geralmente não é usado sozinho, pode ser especificada a altura.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PopupMenuDivider", + "desc": [ + "【height】 : altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json new file mode 100644 index 00000000..3a81af8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PopupMenuDivider/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 174, + "name": "PopupMenuDivider", + "localName": "Разделитель всплывающего меню", + "info": "Разделитель для PopupMenuButton, обычно не используется отдельно, можно указать высоту.", + "lever": 1, + "family": 1, + "linkIds": [ + 56, + 34 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PopupMenuDivider", + "desc": [ + "【height】 : Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json new file mode 100644 index 00000000..190ea222 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Positionsübergang", + "info": "Kann nur in einem Stack verwendet werden, kann ein Kindelement enthalten und lässt es eine Positionsanimation zwischen zwei Rechtecken durchführen, erfordert einen Animator rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PositionedTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【rect】 : Animation 【Animation】", + " PositionedTransition-Komponente kann nur innerhalb eines Stacks funktionieren" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json new file mode 100644 index 00000000..c9b298bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Position Transition", + "info": "Can only be used in a Stack, can contain one child component, allowing it to animate between two rectangles, requires an animator rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PositionedTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【rect】 : Animation 【Animation】", + " The PositionedTransition component only works within a Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json new file mode 100644 index 00000000..af3c0d42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transición de Posición", + "info": "Solo se puede usar en Stack, puede contener un componente hijo y permite que realice una animación de posición entre dos rectángulos, se requiere proporcionar un animador rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PositionedTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【rect】 : Animación 【Animation】", + " El componente PositionedTransition solo funciona dentro de Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json new file mode 100644 index 00000000..aa494ce6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transition de position", + "info": "Ne peut être utilisé que dans une Stack, peut contenir un seul composant enfant, permettant une animation de position entre deux rectangles, nécessite un animateur rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PositionedTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【rect】 : Animation 【Animation】", + " Le composant PositionedTransition ne fonctionne que dans une Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json new file mode 100644 index 00000000..d503ee47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transizione di posizione", + "info": "Può essere utilizzato solo in uno Stack, può contenere un componente figlio e permette di animare la posizione tra due rettangoli, è necessario fornire un animatore rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PositionedTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【rect】 : Animazione 【Animation】", + " Il componente PositionedTransition funziona solo all'interno di uno Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json new file mode 100644 index 00000000..a7eb3d4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "位置変換", + "info": "Stack内でのみ使用可能で、1つの子コンポーネントを収容し、2つの矩形間で位置アニメーションを行わせることができます。アニメーターrectを提供する必要があります。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransitionの基本的な使用法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【rect】 : アニメーション 【Animation】", + " PositionedTransitionコンポーネントはStack内でのみ機能します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json new file mode 100644 index 00000000..1b7674db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "위치 변환", + "info": "Stack에서만 사용 가능하며, 하나의 자식 위젯을 포함할 수 있고, 두 사각형 사이에서 위치 애니메이션을 수행할 수 있습니다. 애니메이션 rect를 제공해야 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【rect】 : 애니메이션 【Animation】", + " PositionedTransition 위젯은 Stack 내에서만 작동합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json new file mode 100644 index 00000000..9c65910d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Transição de Posição", + "info": "Só pode ser usado em uma Stack, pode conter um componente filho, permitindo que ele faça uma animação de posição entre dois retângulos, é necessário fornecer um animador rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do PositionedTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【rect】 : Animação 【Animation】", + " O componente PositionedTransition só funciona dentro de uma Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json new file mode 100644 index 00000000..bd5e2aa9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/PositionedTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 93, + "name": "PositionedTransition", + "localName": "Позиционный переход", + "info": "Может использоваться только в Stack, может содержать один дочерний компонент, позволяющий ему выполнять анимацию между двумя прямоугольниками, требуется предоставить аниматор rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PositionedTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【rect】 : Анимация 【Animation】", + " Компонент PositionedTransition может работать только внутри Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json new file mode 100644 index 00000000..d7c3a2b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Auswahlknopf", + "info": "Aufgrund der runden Knöpfe für ausgewählte und nicht ausgewählte Zustände können mehrere Radios je nach Logik Einzel- oder Mehrfachauswahl ermöglichen. Farbe kann angegeben werden, und Statusänderungsrückrufe werden empfangen.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Radio", + "desc": [ + "【value】 : Auswahlknopfwert 【T】", + "【groupValue】 : Aktueller Übereinstimmungswert 【T】", + "【activeColor】 : Aktivierungsfarbe 【Color】", + "【onChanged】 : Rückruf bei Änderung 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json new file mode 100644 index 00000000..9cba63c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Radio Button", + "info": "Due to the selected and unselected states of the circular button, multiple Radios can implement single or multiple selection requirements based on logic. The color can be specified, and a callback for state changes is supported.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Radio", + "desc": [ + "【value】: Radio button value 【T】", + "【groupValue】: Current matching value 【T】", + "【activeColor】: Active color 【Color】", + "【onChanged】: Callback on change 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json new file mode 100644 index 00000000..1b0024bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Botón de selección", + "info": "Debido a los botones circulares en estados seleccionados y no seleccionados, múltiples Radio pueden satisfacer necesidades de selección única o múltiple según la lógica. Se puede especificar el color y recibir una devolución de llamada para cambios de estado.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Radio", + "desc": [ + "【value】 : Valor del botón de selección 【T】", + "【groupValue】 : Valor de coincidencia actual 【T】", + "【activeColor】 : Color activo 【Color】", + "【onChanged】 : Devolución de llamada al cambiar 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json new file mode 100644 index 00000000..c4853c7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Bouton de sélection", + "info": "En raison des boutons ronds pour les états sélectionnés et non sélectionnés, plusieurs Radio peuvent répondre aux besoins de sélection unique ou multiple selon la logique. La couleur peut être spécifiée et un rappel de changement d'état peut être reçu.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Radio", + "desc": [ + "【value】 : Valeur du bouton de sélection 【T】", + "【groupValue】 : Valeur de correspondance actuelle 【T】", + "【activeColor】 : Couleur active 【Color】", + "【onChanged】 : Rappel lors du changement 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json new file mode 100644 index 00000000..f1786d8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Pulsante di selezione", + "info": "A causa dei pulsanti rotondi per lo stato selezionato e non selezionato, più Radio possono realizzare la necessità di selezione singola o multipla secondo la logica. È possibile specificare il colore e ricevere un callback per i cambiamenti di stato.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Radio", + "desc": [ + "【value】 : Valore del pulsante di selezione 【T】", + "【groupValue】 : Valore di corrispondenza corrente 【T】", + "【activeColor】 : Colore attivo 【Color】", + "【onChanged】 : Callback al cambiamento 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json new file mode 100644 index 00000000..587b5767 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "ラジオボタン", + "info": "選択状態と未選択状態の円形ボタンであり、複数のRadioを論理的に使用することで、単一選択または複数選択の要件を実現できます。色を指定でき、状態変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Radioの基本的な使用法", + "desc": [ + "【value】 : ラジオボタンの値 【T】", + "【groupValue】 : 現在のマッチ値 【T】", + "【activeColor】 : アクティブな色 【Color】", + "【onChanged】 : 変更時のコールバック 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json new file mode 100644 index 00000000..f28f41ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "라디오 버튼", + "info": "선택 및 미선택 상태의 원형 버튼으로, 여러 개의 라디오 버튼을 통해 논리에 따라 단일 선택 또는 다중 선택이 가능합니다. 색상을 지정할 수 있으며, 상태 변화 콜백을 받을 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "라디오 버튼 기본 사용법", + "desc": [ + "【value】 : 라디오 버튼 값 【T】", + "【groupValue】 : 현재 일치 값 【T】", + "【activeColor】 : 활성화 색상 【Color】", + "【onChanged】 : 변경 시 콜백 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json new file mode 100644 index 00000000..03a9593d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Botão de seleção", + "info": "Devido aos botões circulares para estados selecionados e não selecionados, vários Radios podem atender às necessidades de seleção única ou múltipla com base na lógica. Pode-se especificar a cor e receber um retorno de chamada para mudanças de estado.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Radio", + "desc": [ + "【value】 : Valor do botão de seleção 【T】", + "【groupValue】 : Valor correspondente atual 【T】", + "【activeColor】 : Cor ativa 【Color】", + "【onChanged】 : Retorno de chamada ao mudar 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json new file mode 100644 index 00000000..1859bd1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Radio/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 45, + "name": "Radio", + "localName": "Кнопка выбора", + "info": "Из-за круглых кнопок в выбранном и невыбранном состоянии, несколько Radio могут реализовать потребности в выборе одного или нескольких вариантов в зависимости от логики. Можно указать цвет, получать обратные вызовы при изменении состояния.", + "lever": 4, + "family": 1, + "linkIds": [19,240], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Radio", + "desc": [ + "【value】 : Значение кнопки выбора 【T】", + "【groupValue】 : Текущее совпадающее значение 【T】", + "【activeColor】 : Активный цвет 【Color】", + "【onChanged】 : Обратный вызов при изменении 【Function(T)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json new file mode 100644 index 00000000..b6476564 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Bereichs-Schieberegler", + "info": "Bereichs-Schieberegler-Komponente, unterstützt das Ziehen von zwei Punkten, um den Bereich dazwischen zu erhalten. Ermöglicht die Angabe von Farbe, Anzahl der Abschnitte und angezeigte Labels, empfängt Rückrufe bei Fortschrittsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RangeSlider", + "desc": [ + "【values】 : Werte 【RangeValues】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【divisions】 : Anzahl der Abschnitte 【int】", + "【label】 : Text der Hinweisblase 【String】", + "【activeColor】 : Aktive Farbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【onChangeStart】 : Listener beim Start des Ziehens 【Function(RangeValues)】", + "【onChangeEnd】 : Listener beim Ende des Ziehens 【Function(RangeValues)】", + "【onChanged】 : Rückruf bei Änderung 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json new file mode 100644 index 00000000..ac404002 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Range Slider", + "info": "The Range Slider component supports two-point dragging to get the range between them. You can specify the color, number of segments, and displayed labels, and receive progress change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RangeSlider", + "desc": [ + "【values】 : Values 【RangeValues】", + "【min】 : Minimum value 【double】", + "【max】 : Maximum value 【double】", + "【divisions】 : Number of divisions 【int】", + "【label】 : Tooltip text 【String】", + "【activeColor】 : Active color 【Color】", + "【inactiveColor】 : Inactive color 【Color】", + "【onChangeStart】 : Listener when sliding starts 【Function(RangeValues)】", + "【onChangeEnd】 : Listener when sliding ends 【Function(RangeValues)】", + "【onChanged】 : Callback when changed 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json new file mode 100644 index 00000000..60d9003b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Control deslizante de rango", + "info": "Componente de control deslizante de rango, compatible con arrastre de dos puntos para obtener el rango entre ellos. Permite especificar colores, número de segmentos y etiquetas mostradas, y recibe una devolución de llamada para cambios de progreso.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RangeSlider", + "desc": [ + "【values】 : valores 【RangeValues】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【divisions】 : número de divisiones 【int】", + "【label】 : texto de la burbuja de sugerencia 【String】", + "【activeColor】 : color activo 【Color】", + "【inactiveColor】 : color inactivo 【Color】", + "【onChangeStart】 : escucha al comenzar a deslizar 【Function(RangeValues)】", + "【onChangeEnd】 : escucha al finalizar el deslizamiento 【Function(RangeValues)】", + "【onChanged】 : devolución de llamada al cambiar 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json new file mode 100644 index 00000000..ee1de5b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Curseur de plage", + "info": "Composant de curseur de plage, prend en charge le glissement à deux points pour obtenir la plage entre eux. Peut spécifier la couleur, le nombre de segments et les étiquettes affichées, reçoit un rappel de changement de progression.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RangeSlider", + "desc": [ + "【values】 : valeurs 【RangeValues】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【divisions】 : nombre de segments 【int】", + "【label】 : texte de la bulle d'information 【String】", + "【activeColor】 : couleur active 【Color】", + "【inactiveColor】 : couleur inactive 【Color】", + "【onChangeStart】 : écouteur au début du glissement 【Function(RangeValues)】", + "【onChangeEnd】 : écouteur à la fin du glissement 【Function(RangeValues)】", + "【onChanged】 : rappel lors du changement 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json new file mode 100644 index 00000000..fdf08352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Cursore di intervallo", + "info": "Componente cursore di intervallo, supporta il trascinamento di due punti per ottenere l'intervallo tra di essi. Può specificare il colore, il numero di segmenti e le etichette visualizzate, riceve un callback per le modifiche di avanzamento.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RangeSlider", + "desc": [ + "【values】 : Valori 【RangeValues】", + "【min】 : Valore minimo 【double】", + "【max】 : Valore massimo 【double】", + "【divisions】 : Numero di segmenti 【int】", + "【label】 : Testo del tooltip 【String】", + "【activeColor】 : Colore attivo 【Color】", + "【inactiveColor】 : Colore inattivo 【Color】", + "【onChangeStart】 : Ascolta quando inizia lo scorrimento 【Function(RangeValues)】", + "【onChangeEnd】 : Ascolta quando finisce lo scorrimento 【Function(RangeValues)】", + "【onChanged】 : Callback al cambiamento 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json new file mode 100644 index 00000000..d62e6d3f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "範囲スライダー", + "info": "範囲スライダーコンポーネントは、2点のドラッグをサポートし、その間の範囲を取得します。色、セグメント数、表示されるラベルを指定でき、進捗変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider基本使用", + "desc": [ + "【values】 : 数値 【RangeValues】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【divisions】 : セグメント数 【int】", + "【label】 : ヒントバブルテキスト 【String】", + "【activeColor】 : アクティブカラー 【Color】", + "【inactiveColor】 : 非アクティブカラー 【Color】", + "【onChangeStart】 : スライド開始時のリスナー 【Function(RangeValues)】", + "【onChangeEnd】 : スライド終了時のリスナー 【Function(RangeValues)】", + "【onChanged】 : 変更時のコールバック 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json new file mode 100644 index 00000000..c95744b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "범위 슬라이더", + "info": "범위 슬라이더 컴포넌트, 두 점 드래그를 지원하여 그 사이의 범위를 얻을 수 있습니다. 색상, 분할 수 및 표시된 라벨을 지정할 수 있으며, 진행 변화 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RangeSlider 기본 사용", + "desc": [ + "【values】 : 값 【RangeValues】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【divisions】 : 분할 수 【int】", + "【label】 : 툴팁 텍스트 【String】", + "【activeColor】 : 활성화 색상 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【onChangeStart】 : 슬라이드 시작 시 리스너 【Function(RangeValues)】", + "【onChangeEnd】 : 슬라이드 종료 시 리스너 【Function(RangeValues)】", + "【onChanged】 : 변경 시 콜백 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json new file mode 100644 index 00000000..6158ffed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Controlo deslizante de intervalo", + "info": "Componente de controlo deslizante de intervalo, suporta arrasto de dois pontos para obter o intervalo entre eles. Pode especificar a cor, o número de segmentos e as etiquetas exibidas, e recebe uma chamada de retorno para alterações no progresso.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do RangeSlider", + "desc": [ + "【values】 : valores 【RangeValues】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【divisions】 : número de segmentos 【int】", + "【label】 : texto da bolha de dica 【String】", + "【activeColor】 : cor ativa 【Color】", + "【inactiveColor】 : cor inativa 【Color】", + "【onChangeStart】 : ouvinte ao iniciar o deslize 【Function(RangeValues)】", + "【onChangeEnd】 : ouvinte ao terminar o deslize 【Function(RangeValues)】", + "【onChanged】 : chamada de retorno ao alterar 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json new file mode 100644 index 00000000..7475fa48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RangeSlider/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 44, + "name": "RangeSlider", + "localName": "Ползунок диапазона", + "info": "Компонент ползунка диапазона, поддерживает перетаскивание двух точек для получения диапазона между ними. Можно указать цвет, количество сегментов и отображаемые метки, а также получать обратные вызовы при изменении прогресса.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RangeSlider", + "desc": [ + "【values】 : Значения 【RangeValues】", + "【min】 : Минимальное значение 【double】", + "【max】 : Максимальное значение 【double】", + "【divisions】 : Количество сегментов 【int】", + "【label】 : Текст подсказки 【String】", + "【activeColor】 : Активный цвет 【Color】", + "【inactiveColor】 : Неактивный цвет 【Color】", + "【onChangeStart】 : Слушатель начала перетаскивания 【Function(RangeValues)】", + "【onChangeEnd】 : Слушатель окончания перетаскивания 【Function(RangeValues)】", + "【onChanged】 : Обратный вызов при изменении 【Function(RangeValues)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json new file mode 100644 index 00000000..36e4d9cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Native Chip", + "info": "Der Vorfahr aller Chip-Komponenten, der die Fähigkeit besitzt, das Verhalten jedes Chips zu zeigen, unterstützt Ereignisse wie Auswählen, Klicken und Löschen. Weitere Informationen finden Sie unter Chip, FilterChip, ActionChip, InputChip und ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip Klickeffekt", + "desc": [ + "【label】: Mittlere Komponente 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【labelPadding】: Label-Abstand 【EdgeInsetsGeometry】", + "【shadowColor】: Schattenfarbe 【Color】", + "【avatar】: Linke Komponente 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【pressElevation】: Schattentiefe beim Klicken 【double】", + "【onPressed】: Klickereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip Auswahl- und Lösch-Effekt", + "desc": [ + "【selected】: Ist ausgewählt 【bool】", + "【deleteIconColor】: Farbe des Endsymbols 【Color】", + "【selectedColor】: Auswahlfarbe 【Color】", + "【deleteIcon】: Endkomponente 【Widget】", + "【onSelected】: Auswahlereignis 【Function(bool)】", + "【onDeleted】: Endereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json new file mode 100644 index 00000000..cc299aa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "RawChip", + "info": "The ancestor of each Chip component, possessing the ability to exhibit each Chip's behavior, supporting events such as selection, click, and deletion. For details, see Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip Click Effect", + "desc": [ + "【label】: Middle component 【Widget】", + "【padding】 : Padding 【EdgeInsetsGeometry】", + "【labelPadding】 : Label padding 【EdgeInsetsGeometry】", + "【shadowColor】: Shadow color 【Color】", + "【avatar】: Left component 【Widget】", + "【elevation】: Elevation 【double】", + "【pressElevation】: Elevation when pressed 【double】", + "【onPressed】 : Click event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip Selection and Deletion Effect", + "desc": [ + "【selected】: Whether selected 【bool】", + "【deleteIconColor】: Trailing icon color 【Color】", + "【selectedColor】: Selected color 【Color】", + "【deleteIcon】: Trailing component 【Widget】", + "【onSelected】: Selection event 【Function(bool)】", + "【onDeleted】 : Trailing event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json new file mode 100644 index 00000000..48e0eb6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "El antepasado de cada componente Chip, con la capacidad de representar cada comportamiento de Chip, soporta eventos como selección, clic, eliminación, etc. Para más detalles, consulta Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Efecto de clic en RawChip", + "desc": [ + "【label】: Componente central 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【labelPadding】 : Relleno de la etiqueta 【EdgeInsetsGeometry】", + "【shadowColor】: Color de la sombra 【Color】", + "【avatar】: Componente izquierdo 【Widget】", + "【elevation】: Profundidad de la sombra 【double】", + "【pressElevation】: Profundidad de la sombra al hacer clic 【double】", + "【onPressed】 : Evento de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección y eliminación en RawChip", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【deleteIconColor】: Color del icono de eliminación 【Color】", + "【selectedColor】: Color de selección 【Color】", + "【deleteIcon】: Componente de eliminación 【Widget】", + "【onSelected】: Evento de selección 【Function(bool)】", + "【onDeleted】 : Evento de eliminación 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json new file mode 100644 index 00000000..7c9461bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Petite barre native", + "info": "L'ancêtre de chaque composant Chip, possédant la capacité de représenter chaque Chip, prend en charge des événements tels que la sélection, le clic, la suppression, etc. Voir Chip, FilterChip, ActionChip, InputChip, ChoiceChip pour plus de détails.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Effet de clic de RawChip", + "desc": [ + "【label】: Composant central 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【labelPadding】 : Marge du label 【EdgeInsetsGeometry】", + "【shadowColor】: Couleur de l'ombre 【Color】", + "【avatar】: Composant gauche 【Widget】", + "【elevation】: Profondeur de l'ombre 【double】", + "【pressElevation】: Profondeur de l'ombre lors du clic 【double】", + "【onPressed】 : Événement de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection et de suppression de RawChip", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【deleteIconColor】: Couleur de l'icône de fin 【Color】", + "【selectedColor】: Couleur de sélection 【Color】", + "【deleteIcon】: Composant de fin 【Widget】", + "【onSelected】: Événement de sélection 【Function(bool)】", + "【onDeleted】 : Événement de fin 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json new file mode 100644 index 00000000..9469f54d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "L'antenato di tutti i componenti Chip, con la capacità di rappresentare ogni Chip, supporta eventi come selezione, clic, eliminazione, ecc. Vedi Chip, FilterChip, ActionChip, InputChip, ChoiceChip per maggiori dettagli.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Effetto Clic di RawChip", + "desc": [ + "【label】: Componente centrale 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【labelPadding】 : Spaziatura del label 【EdgeInsetsGeometry】", + "【shadowColor】: Colore dell'ombra 【Color】", + "【avatar】: Componente sinistro 【Widget】", + "【elevation】: Profondità dell'ombra 【double】", + "【pressElevation】: Profondità dell'ombra al clic 【double】", + "【onPressed】 : Evento di clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto Selezione ed Eliminazione di RawChip", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【deleteIconColor】: Colore dell'icona di coda 【Color】", + "【selectedColor】: Colore selezionato 【Color】", + "【deleteIcon】: Componente di coda 【Widget】", + "【onSelected】: Evento di selezione 【Function(bool)】", + "【onDeleted】 : Evento di coda 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json new file mode 100644 index 00000000..7c53a5b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "ネイティブチップ", + "info": "各Chipコンポーネントの始祖であり、各Chipの表現能力を持ち、選択、クリック、削除などのイベントをサポートします。詳細はChip、FilterChip、ActionChip、InputChip、ChoiceChipを参照してください。", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChipクリック効果", + "desc": [ + "【label】: 中間コンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【labelPadding】 : ラベルパディング 【EdgeInsetsGeometry】", + "【shadowColor】: シャドウカラー 【Color】", + "【avatar】: 左側コンポーネント 【Widget】", + "【elevation】: 影の深さ 【double】", + "【pressElevation】: クリック時の影の深さ 【double】", + "【onPressed】 : クリックイベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip選択と削除効果", + "desc": [ + "【selected】: 選択されているか 【bool】", + "【deleteIconColor】: 末尾アイコンカラー 【Color】", + "【selectedColor】: 選択色 【Color】", + "【deleteIcon】: 末尾コンポーネント 【Widget】", + "【onSelected】: 選択イベント 【Function(bool)】", + "【onDeleted】 : 末尾イベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json new file mode 100644 index 00000000..5ee7e501 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "원본 칩", + "info": "각 Chip 컴포넌트의 조상으로, 각 Chip의 표현 능력을 가지고 있으며, 선택, 클릭, 삭제 등의 이벤트를 지원합니다. 자세한 내용은 Chip, FilterChip, ActionChip, InputChip, ChoiceChip을 참조하세요.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "RawChip 클릭 효과", + "desc": [ + "【label】: 중간 컴포넌트 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【labelPadding】 : 라벨 여백 【EdgeInsetsGeometry】", + "【shadowColor】: 그림자 색상 【Color】", + "【avatar】: 왼쪽 컴포넌트 【Widget】", + "【elevation】: 그림자 깊이 【double】", + "【pressElevation】: 클릭 시 그림자 깊이 【double】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "RawChip 선택 및 삭제 효과", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【deleteIconColor】: 끝 아이콘 색상 【Color】", + "【selectedColor】: 선택 색상 【Color】", + "【deleteIcon】: 끝 컴포넌트 【Widget】", + "【onSelected】: 선택 이벤트 【Function(bool)】", + "【onDeleted】 : 끝 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json new file mode 100644 index 00000000..972d20a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Chip Nativo", + "info": "O ancestral de cada componente Chip, possui a capacidade de exibir cada comportamento de Chip, suportando eventos como seleção, clique, exclusão, etc. Consulte Chip, FilterChip, ActionChip, InputChip, ChoiceChip para mais detalhes.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Efeito de Clique do RawChip", + "desc": [ + "【label】: Componente central 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【labelPadding】 : Preenchimento do label 【EdgeInsetsGeometry】", + "【shadowColor】: Cor da sombra 【Color】", + "【avatar】: Componente esquerdo 【Widget】", + "【elevation】: Profundidade da sombra 【double】", + "【pressElevation】: Profundidade da sombra ao clicar 【double】", + "【onPressed】 : Evento de clique 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de Seleção e Exclusão do RawChip", + "desc": [ + "【selected】: Selecionado ou não 【bool】", + "【deleteIconColor】: Cor do ícone de exclusão 【Color】", + "【selectedColor】: Cor de seleção 【Color】", + "【deleteIcon】: Componente de ícone de exclusão 【Widget】", + "【onSelected】: Evento de seleção 【Function(bool)】", + "【onDeleted】 : Evento de exclusão 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json new file mode 100644 index 00000000..852e4ae3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawChip/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 153, + "name": "RawChip", + "localName": "Нативный чип", + "info": "Прародитель всех компонентов Chip, обладает способностью отображать различные чипы, поддерживает события выбора, клика, удаления и другие. Подробнее см. Chip, FilterChip, ActionChip, InputChip, ChoiceChip.", + "lever": 5, + "family": 1, + "linkIds": [ + 11, + 12, + 13, + 14, + 15 + ], + "nodes": [ + { + "file": "node1_press.dart", + "name": "Эффект нажатия RawChip", + "desc": [ + "【label】: Центральный компонент 【Widget】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【labelPadding】 : Отступы для label 【EdgeInsetsGeometry】", + "【shadowColor】: Цвет тени 【Color】", + "【avatar】: Левый компонент 【Widget】", + "【elevation】: Глубина тени 【double】", + "【pressElevation】: Глубина тени при нажатии 【double】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора и удаления RawChip", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【deleteIconColor】: Цвет иконки удаления 【Color】", + "【selectedColor】: Цвет выбора 【Color】", + "【deleteIcon】: Компонент в конце 【Widget】", + "【onSelected】: Событие выбора 【Function(bool)】", + "【onDeleted】 : Событие в конце 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json new file mode 100644 index 00000000..a9931825 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Rohgestenerkennung", + "info": "Kann verwendet werden, um die durch eine gegebene Gestenfabrik beschriebenen Gesten zu erkennen, was bei der Entwicklung eigener Gestenerkenner sehr nützlich ist. Für gängige Gesten verwenden Sie GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawGestureDetector", + "desc": [ + "【behavior】 : Erkennungsverhalten 【HitTestBehavior】", + "【gestures】 : Gestenzuordnung 【Map】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json new file mode 100644 index 00000000..68828d2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Raw Gesture Detector", + "info": "Can be used to detect gestures described by a given gesture factory, which is very useful when developing your own gesture recognizer. For common gestures, use GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawGestureDetector", + "desc": [ + "【behavior】: Detection behavior 【HitTestBehavior】", + "【gestures】: Gesture mapping 【Map】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json new file mode 100644 index 00000000..ac69bfca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Detector de gestos en bruto", + "info": "Se puede utilizar para detectar gestos descritos por una fábrica de gestos dada, es muy útil al desarrollar su propio reconocedor de gestos. Para gestos comunes, use GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawGestureDetector", + "desc": [ + "【behavior】 : Comportamiento de detección 【HitTestBehavior】", + "【gestures】 : Mapeo de gestos 【Map】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json new file mode 100644 index 00000000..109a3ad2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Détecteur de gestes bruts", + "info": "Peut être utilisé pour détecter les gestes décrits par une usine de gestes donnée, très utile lors du développement de son propre détecteur de gestes. Pour les gestes courants, utilisez GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawGestureDetector", + "desc": [ + "【behavior】 : Comportement de détection 【HitTestBehavior】", + "【gestures】 : Mappage des gestes 【Map】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json new file mode 100644 index 00000000..5607345e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Rilevatore di gesti grezzi", + "info": "Può essere utilizzato per rilevare i gesti descritti da una determinata fabbrica di gesti, molto utile nello sviluppo del proprio riconoscitore di gesti. Per i gesti comuni, utilizzare GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di RawGestureDetector", + "desc": [ + "【behavior】 : Comportamento di rilevamento 【HitTestBehavior】", + "【gestures】 : Mappatura dei gesti 【Map】", + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json new file mode 100644 index 00000000..11076bb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "生のジェスチャー検出器", + "info": "指定されたジェスチャーファクトリの記述に基づいてジェスチャーを検出するために使用できます。独自のジェスチャー認識器を開発する際に非常に便利です。一般的なジェスチャーには、GestureRecognizerを使用してください。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetectorの基本的な使用法", + "desc": [ + "【behavior】 : 検出動作 【HitTestBehavior】", + "【gestures】 : ジェスチャーマッピング 【Map】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json new file mode 100644 index 00000000..35c0c4e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "원 제스처 감지기", + "info": "주어진 제스처 팩토리 설명에 따라 제스처를 감지하는 데 사용할 수 있으며, 자신만의 제스처 인식기를 개발할 때 매우 유용합니다. 일반적인 제스처의 경우 GestureRecognizer를 사용하세요.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector 기본 사용법", + "desc": [ + "【behavior】 : 감지 행동 【HitTestBehavior】", + "【gestures】 : 제스처 매핑 【Map】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json new file mode 100644 index 00000000..cc83464e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Detetor de Gestos Bruto", + "info": "Pode ser usado para detetar gestos descritos por uma fábrica de gestos fornecida, sendo muito útil ao desenvolver o seu próprio reconhecedor de gestos. Para gestos comuns, use o GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawGestureDetector", + "desc": [ + "【behavior】 : Comportamento de deteção 【HitTestBehavior】", + "【gestures】 : Mapeamento de gestos 【Map】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json new file mode 100644 index 00000000..1b1570ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawGestureDetector/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 248, + "name": "RawGestureDetector", + "localName": "Детектор жестов", + "info": "Может использоваться для обнаружения жестов, описанных заданной фабрикой жестов. Очень полезен при разработке собственного распознавателя жестов. Для распространенных жестов используйте GestureRecognizer.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawGestureDetector", + "desc": [ + "【behavior】 : Поведение обнаружения 【HitTestBehavior】", + "【gestures】 : Сопоставление жестов 【Map】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json new file mode 100644 index 00000000..b8923e6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Roh-Tastatur-Listener", + "info": "Kann verwendet werden, um Tastendruck- und Tastenloslass-Ereignisse zu erkennen. Derzeit können nur physische Tastaturen erkannt werden und kann auf Desktop-Plattformen verwendet werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawGestureDetector", + "desc": [ + "【onKey】 : Tastaturereignis 【ValueChanged】", + "【focusNode】 : Fokus 【FocusNode】", + "【autofocus】 : Automatischer Fokus 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json new file mode 100644 index 00000000..d1dc2129 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Raw Keyboard Listener", + "info": "Can be used to detect keyboard key press and release events, currently only physical keyboards can be detected, and can be used on desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawGestureDetector", + "desc": [ + "【onKey】 : Keyboard event 【ValueChanged】", + "【focusNode】 : Focus 【FocusNode】", + "【autofocus】 : Whether to auto focus 【bool】", + "【child】 : Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json new file mode 100644 index 00000000..a759ad93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Escuchador de teclado en bruto", + "info": "Se puede utilizar para detectar eventos de pulsación y liberación de teclas del teclado. Actualmente solo puede detectar teclados físicos y se puede utilizar en aplicaciones de escritorio.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawGestureDetector", + "desc": [ + "【onKey】 : Evento de teclado 【ValueChanged】", + "【focusNode】 : Nodo de enfoque 【FocusNode】", + "【autofocus】 : Enfoque automático 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json new file mode 100644 index 00000000..6b46447f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Écouteur de clavier brut", + "info": "Peut être utilisé pour détecter les événements de pression et de relâchement des touches du clavier. Actuellement, il ne peut détecter que les claviers physiques et peut être utilisé sur les plateformes de bureau.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawGestureDetector", + "desc": [ + "【onKey】 : Événement de clavier 【ValueChanged】", + "【focusNode】 : Point focal 【FocusNode】", + "【autofocus】 : Mise au point automatique 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json new file mode 100644 index 00000000..114bda06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Ascoltatore Tastiera Originale", + "info": "Può essere utilizzato per rilevare eventi di pressione e rilascio dei tasti della tastiera, attualmente può rilevare solo tastiere fisiche, può essere utilizzato su desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RawGestureDetector", + "desc": [ + "【onKey】 : Evento Tastiera 【ValueChanged】", + "【focusNode】 : Nodo Focus 【FocusNode】", + "【autofocus】 : Autofocus 【bool】", + "【child】 : Componente Figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json new file mode 100644 index 00000000..0811d9ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "生キーボードリスナー", + "info": "キーボードのキー押下とキーリリースのイベントを検出するために使用できます。現在は物理キーボードのみ検出可能で、デスクトップで使用できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetectorの基本使用", + "desc": [ + "【onKey】 : キーボードイベント 【ValueChanged】", + "【focusNode】 : フォーカス 【FocusNode】", + "【autofocus】 : 自動フォーカス 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json new file mode 100644 index 00000000..ff8c7f9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "원시 키보드 리스너", + "info": "키보드 키 누름 및 해제 이벤트를 감지하는 데 사용할 수 있으며, 현재는 물리적 키보드만 감지할 수 있으며 데스크톱에서 사용할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawGestureDetector 기본 사용", + "desc": [ + "【onKey】 : 키보드 이벤트 【ValueChanged】", + "【focusNode】 : 포커스 【FocusNode】", + "【autofocus】 : 자동 포커스 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json new file mode 100644 index 00000000..2bdb176e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Ouvinte de Teclado Bruto", + "info": "Pode ser usado para detectar eventos de pressionamento e liberação de teclas do teclado, atualmente só pode detectar teclados físicos e pode ser usado em desktop.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawGestureDetector", + "desc": [ + "【onKey】 : Evento de teclado 【ValueChanged】", + "【focusNode】 : Foco 【FocusNode】", + "【autofocus】 : Foco automático 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json new file mode 100644 index 00000000..8e4770dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawKeyboardListener/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 254, + "name": "RawKeyboardListener", + "localName": "Слушатель клавиатуры", + "info": "Может использоваться для обнаружения событий нажатия и отпускания клавиш на клавиатуре. В настоящее время может обнаруживать только физические клавиатуры и может использоваться на настольных устройствах.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawGestureDetector", + "desc": [ + "【onKey】 : Событие клавиатуры 【ValueChanged】", + "【focusNode】 : Фокус 【FocusNode】", + "【autofocus】 : Автоматическая фокусировка 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json new file mode 100644 index 00000000..c3e73fef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Rohmaterialknopf", + "info": "Der ursprüngliche Material-Knopf, der große Meister hinter den Kulissen der Knopfwelt, kann Klick-, Langdruck-, Hervorhebungsänderungsereignisse akzeptieren und Farbe, Form, Schattentiefe, Innenabstand usw. angeben.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RawMaterialButton", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【elevation】 : Schattentiefe 【double】", + "【fillColor】 : Füllfarbe 【Color】", + "【splashColor】 : Wasserwellenfarbe 【Color】", + "【textStyle】 : Textstil 【TextStyle】", + "【onLongPress】 : Langdruckereignis 【Function()】", + "【onPressed】 : Klickereignis 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Hervorhebung und Form von RawMaterialButton", + "desc": [ + "【highlightElevation】 : Hervorhebungs-Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json new file mode 100644 index 00000000..fd8cfeae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Raw Button", + "info": "The original Material button, the behind-the-scenes boss of the button world, can accept click, long press, and highlight change events, and can specify color, shape, shadow depth, padding, and other properties.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RawMaterialButton", + "desc": [ + "【child】: Child component 【Widget】", + "【elevation】: Shadow depth 【double】", + "【fillColor】: Fill color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【textStyle】: Text style 【TextStyle】", + "【onLongPress】: Long press event 【Function()】", + "【onPressed】: Click event 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Highlight and Shape of RawMaterialButton", + "desc": [ + "【highlightElevation】: Highlight shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json new file mode 100644 index 00000000..738ddebc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Botón Original", + "info": "El botón original de Material, el gran jefe detrás de los botones, puede aceptar eventos de clic, pulsación larga, cambios de resaltado, y puede especificar color, forma, profundidad de sombra, relleno interno y otros atributos.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawMaterialButton", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【elevation】 : Profundidad de sombra 【double】", + "【fillColor】 : Color de relleno 【Color】", + "【splashColor】 : Color de efecto de ondas 【Color】", + "【textStyle】 : Estilo de texto 【TextStyle】", + "【onLongPress】 : Evento de pulsación larga 【Function()】", + "【onPressed】 : Evento de clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Resaltado y forma de RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profundidad de sombra resaltada 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json new file mode 100644 index 00000000..ec2bbbca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Bouton Brut", + "info": "Le bouton Material original, le grand maître derrière les boutons, peut accepter des événements de clic, de pression longue et de changement de surbrillance, et peut spécifier la couleur, la forme, l'ombre, la marge intérieure et d'autres attributs.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RawMaterialButton", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【fillColor】 : Couleur de remplissage 【Color】", + "【splashColor】 : Couleur de l'effet de vague 【Color】", + "【textStyle】 : Style du texte 【TextStyle】", + "【onLongPress】 : Événement de pression longue 【Function()】", + "【onPressed】 : Événement de clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Surbrillance et forme de RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profondeur de l'ombre en surbrillance 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json new file mode 100644 index 00000000..5a618dcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Pulsante Originale", + "info": "Il pulsante Material originale, il grande capo dietro le quinte dei pulsanti, può accettare eventi di clic, pressione prolungata, cambiamenti di evidenziazione, e può specificare colore, forma, profondità dell'ombra, spaziatura interna e altre proprietà.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RawMaterialButton", + "desc": [ + "【child】 : Componente Figlio 【Widget】", + "【elevation】 : Profondità dell'Ombra 【double】", + "【fillColor】 : Colore di Riempimento 【Color】", + "【splashColor】 : Colore dell'Onda 【Color】", + "【textStyle】 : Stile del Testo 【TextStyle】", + "【onLongPress】 : Evento di Pressione Prolungata 【Function()】", + "【onPressed】 : Evento di Clic 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Evidenziazione e Forma di RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profondità dell'Ombra in Evidenza 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json new file mode 100644 index 00000000..3dae08ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "オリジナルボタン", + "info": "オリジナルのMaterialボタン、ボタン界の裏の大物、クリック、長押し、ハイライト変更イベントを受け入れ、色、形状、影の深さ、内側の余白などの属性を指定できます。", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButtonの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【fillColor】 : 塗りつぶし色 【Color】", + "【splashColor】 : 波紋色 【Color】", + "【textStyle】 : テキストスタイル 【TextStyle】", + "【onLongPress】 : 長押しイベント 【Function()】", + "【onPressed】 : クリックイベント 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButtonのハイライトと形状", + "desc": [ + "【highlightElevation】 : ハイライトの影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json new file mode 100644 index 00000000..3836fa29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "원시 버튼", + "info": "원시 Material 버튼, 버튼계의 숨은 거물, 클릭, 길게 누르기, 강조 변화 이벤트를 받아들일 수 있으며, 색상, 모양, 그림자 깊이, 안쪽 여백 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMaterialButton 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【fillColor】 : 채우기 색상 【Color】", + "【splashColor】 : 물결 색상 【Color】", + "【textStyle】 : 텍스트 스타일 【TextStyle】", + "【onLongPress】 : 길게 누르기 이벤트 【Function()】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMaterialButton 강조 및 모양", + "desc": [ + "【highlightElevation】 : 강조 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json new file mode 100644 index 00000000..1cf0df63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Botão Original", + "info": "O botão Material original, o grande mestre nos bastidores dos botões, pode aceitar eventos de clique, pressão longa e mudanças de destaque, e pode especificar cor, forma, profundidade de sombra, preenchimento interno e outros atributos.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RawMaterialButton", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【fillColor】 : Cor de preenchimento 【Color】", + "【splashColor】 : Cor do efeito de ondulação 【Color】", + "【textStyle】 : Estilo de texto 【TextStyle】", + "【onLongPress】 : Evento de pressão longa 【Function()】", + "【onPressed】 : Evento de clique 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Destaque e Forma do RawMaterialButton", + "desc": [ + "【highlightElevation】 : Profundidade de sombra em destaque 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json new file mode 100644 index 00000000..728b9baa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RawMaterialButton/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 175, + "name": "RawMaterialButton", + "localName": "Исходная кнопка", + "info": "Исходная кнопка Material, скрытый лидер среди кнопок, поддерживает события нажатия, долгого нажатия, изменения выделения. Можно указать цвет, форму, тень, внутренние отступы и другие атрибуты.", + "lever": 5, + "family": 1, + "linkIds": [ + 23, + 25, + 26, + 27 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RawMaterialButton", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【fillColor】 : Цвет заливки 【Color】", + "【splashColor】 : Цвол эффекта ряби 【Color】", + "【textStyle】 : Стиль текста 【TextStyle】", + "【onLongPress】 : Событие долгого нажатия 【Function()】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Выделение и форма RawMaterialButton", + "desc": [ + "【highlightElevation】 : Глубина тени при выделении 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json new file mode 100644 index 00000000..c415b0c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Aktualisierungsanzeige", + "info": "Enthält einen verschachtelten, scrollbaren Bereich, der beim Herunterziehen ein Aktualisierungssymbol anzeigt und beim Loslassen eine spezifizierte asynchrone Methode ausführt. Eigenschaften wie Farbe und Abstand zur Oberseite können angegeben werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RefreshIndicator", + "desc": [ + "【child】 : Kind (scrollbar) 【Widget】", + "【displacement】 : Höhe des schwebenden Indikators 【double】", + "【color】 : Farbe des Indikators 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json new file mode 100644 index 00000000..614a4571 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Refresh Indicator", + "info": "Internally nested scrollable area, displaying a refresh icon when pulled down, and executing a specified asynchronous method upon release. Properties such as color and distance to the top can be specified.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RefreshIndicator", + "desc": [ + "【child】 : Child (scrollable) 【Widget】", + "【displacement】 : Indicator floating height 【double】", + "【color】 : Indicator color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json new file mode 100644 index 00000000..7c6b9090 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicador de actualización", + "info": "Área deslizante anidada internamente, muestra un ícono de actualización al deslizar hacia abajo y ejecuta un método asíncrono especificado al soltar. Se pueden especificar propiedades como el color y la distancia desde la parte superior.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RefreshIndicator", + "desc": [ + "【child】 : Hijo (deslizable) 【Widget】", + "【displacement】 : Altura flotante del indicador 【double】", + "【color】 : Color del indicador 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json new file mode 100644 index 00000000..0259f3b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicateur de rafraîchissement", + "info": "Zone coulissante interne, l'icône de rafraîchissement s'affiche lors du glissement vers le bas, et une méthode asynchrone spécifiée peut être exécutée après le relâchement. Vous pouvez spécifier des propriétés telles que la couleur, la distance par rapport au sommet, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RefreshIndicator", + "desc": [ + "【child】 : Enfant (coulissant) 【Widget】", + "【displacement】 : Hauteur de flottement de l'indicateur 【double】", + "【color】 : Couleur de l'indicateur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json new file mode 100644 index 00000000..9107a0d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicatore di Aggiornamento", + "info": "Area scorrevole interna nidificata, che mostra un'icona di aggiornamento quando si scorre verso il basso e può eseguire un metodo asincrono specificato dopo il rilascio. È possibile specificare attributi come il colore e la distanza dalla parte superiore.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RefreshIndicator", + "desc": [ + "【child】 : Figlio (scorrevole) 【Widget】", + "【displacement】 : Altezza di sospensione dell'indicatore 【double】", + "【color】 : Colore dell'indicatore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json new file mode 100644 index 00000000..1f504c15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "リフレッシュインジケーター", + "info": "内部にスライド可能な領域をネストし、下にスライドするとリフレッシュアイコンが表示され、手を離すと指定された非同期メソッドを実行できます。色やトップまでの距離などの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicatorの基本使用", + "desc": [ + "【child】 : 子(スライド可能) 【Widget】", + "【displacement】 : インジケーターの浮遊高さ 【double】", + "【color】 : インジケーターの色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json new file mode 100644 index 00000000..eb369bcc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "새로고침 표시기", + "info": "내부에 스크롤 가능한 영역을 포함하고 있으며, 아래로 스크롤할 때 새로고침 아이콘이 표시되고, 손을 떼면 지정된 비동기 메서드를 실행할 수 있습니다. 색상, 상단까지의 거리 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RefreshIndicator 기본 사용법", + "desc": [ + "【child】 : 자식(스크롤 가능) 【Widget】", + "【displacement】 : 표시기 부유 높이 【double】", + "【color】 : 표시기 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json new file mode 100644 index 00000000..4853223d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Indicador de Atualização", + "info": "Área deslizante aninhada internamente, que exibe um ícone de atualização ao deslizar para baixo e executa um método assíncrono especificado ao soltar. Pode especificar atributos como cor, distância até o topo, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RefreshIndicator", + "desc": [ + "【child】 : Filho (deslizante) 【Widget】", + "【displacement】 : Altura de suspensão do indicador 【double】", + "【color】 : Cor do indicador 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json new file mode 100644 index 00000000..c6c4707b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RefreshIndicator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 49, + "name": "RefreshIndicator", + "localName": "Индикатор обновления", + "info": "Внутренняя вложенная область с возможностью прокрутки, при прокрутке вниз отображается значок обновления, после отпускания можно выполнить указанный асинхронный метод. Можно указать такие свойства, как цвет, расстояние до верхнего края и т.д.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RefreshIndicator", + "desc": [ + "【child】 : Дочерний элемент (с возможностью прокрутки) 【Widget】", + "【displacement】 : Высота индикатора 【double】", + "【color】 : Цвет индикатора 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json new file mode 100644 index 00000000..dca63683 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Rechteckpositionsübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Rect verwendet, um Übergangsanimationen zwischen zwei Rect-Objekten für die Kindkomponente zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RelativePositionedTransition", + "desc": [ + "【child】 : Kindkomponente 【Widget】", + "【size】 : Versatz von links und oben 【Size】", + "【rect】 : Animation 【Animation】", + " Die PositionedTransition-Komponente funktioniert nur innerhalb eines Stacks" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json new file mode 100644 index 00000000..abb6f78e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Rectangle Position Transition", + "info": "A subclass of AnimatedWidget, using a Rect type animator to allow child components to transition between two Rect objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RelativePositionedTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【size】: Left and top offset 【Size】", + "【rect】: Animation 【Animation】", + " PositionedTransition component only works within a Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json new file mode 100644 index 00000000..a9cee088 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transición de posición rectangular", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Rect para realizar una animación de transición entre dos objetos Rect en los componentes hijos.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RelativePositionedTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【size】 : Desplazamiento izquierdo y superior 【Size】", + "【rect】 : Animación 【Animation】", + " El componente PositionedTransition solo funciona dentro de un Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json new file mode 100644 index 00000000..f9cadaae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transition de position rectangulaire", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Rect pour permettre à un composant enfant de faire une transition animée entre deux objets Rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RelativePositionedTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【size】 : Décalage gauche et haut 【Size】", + "【rect】 : Animation 【Animation】", + " Le composant PositionedTransition ne fonctionne que dans une Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json new file mode 100644 index 00000000..930bfdc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transizione Posizione Rettangolo", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Rect per far eseguire un'animazione di transizione tra due oggetti Rect ai componenti figli.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di RelativePositionedTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【size】 : Offset sinistro e superiore 【Size】", + "【rect】 : Animazione 【Animation】", + " Il componente PositionedTransition funziona solo all'interno di uno Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json new file mode 100644 index 00000000..87051af5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "矩形位置変換", + "info": "AnimatedWidgetのサブクラスで、Rectタイプのアニメーターを使用して子コンポーネントを2つのRectオブジェクト間でトランジションアニメーションさせます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【size】 : 左と上のオフセット 【Size】", + "【rect】 : アニメーション 【Animation】", + " PositionedTransitionコンポーネントはStack内でのみ機能します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json new file mode 100644 index 00000000..94672c44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "사각형 위치 변환", + "info": "AnimatedWidget의 하위 클래스, Rect 타입의 애니메이터를 사용하여 자식 위젯이 두 Rect 객체 간에 전환 애니메이션을 수행하도록 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RelativePositionedTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【size】 : 왼쪽과 위쪽의 오프셋 【Size】", + "【rect】 : 애니메이션 【Animation】", + " PositionedTransition 위젯은 Stack 내에서만 작동합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json new file mode 100644 index 00000000..da3db99f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Transição de Posição Retangular", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Rect para permitir que os componentes filhos façam uma animação de transição entre dois objetos Rect.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de RelativePositionedTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【size】 : Deslocamento esquerdo e superior 【Size】", + "【rect】 : Animação 【Animation】", + " O componente PositionedTransition só funciona dentro de uma Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json new file mode 100644 index 00000000..ead4f390 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RelativePositionedTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 115, + "name": "RelativePositionedTransition", + "localName": "Прямоугольное позиционное преобразование", + "info": "Подкласс AnimatedWidget, использующий аниматор типа Rect для создания переходной анимации между двумя объектами Rect для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RelativePositionedTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【size】 : Смещение по левому и верхнему краю 【Size】", + "【rect】 : Анимация 【Animation】", + " Компонент PositionedTransition может работать только внутри Stack" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json new file mode 100644 index 00000000..50fda898 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Sortierbare Liste", + "info": "Eine ListView, die durch langes Drücken sortiert werden kann. Es können Eigenschaften wie die Scrollrichtung, ob umgekehrt, Scroll-Controller usw. angegeben werden.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ReorderableListView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【header】 : Kopfkomponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsets】", + "【onReorder】 : Rückruf beim Austauschen 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scrollrichtung von ReorderableListView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json new file mode 100644 index 00000000..a1b043f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Reorderable List", + "info": "A ListView that can be reordered by long-pressing, with properties such as scroll direction, reverse, and scroll controller.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ReorderableListView", + "desc": [ + "【children】 : List of child components 【List】", + "【header】 : Header component 【Widget】", + "【padding】 : Padding 【EdgeInsets】", + "【onReorder】 : Callback when reordering 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scroll Direction of ReorderableListView", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to reverse 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json new file mode 100644 index 00000000..6a3fb814 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista reordenable", + "info": "ListView que permite reordenar mediante pulsación larga, se pueden especificar propiedades como la dirección de deslizamiento, si es inversa, el controlador de deslizamiento, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ReorderableListView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【header】 : Componente de cabecera 【Widget】", + "【padding】 : Relleno interno 【EdgeInsets】", + "【onReorder】 : Callback al reordenar 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de deslizamiento de ReorderableListView", + "desc": [ + "【scrollDirection】 : Dirección de deslizamiento 【Axis】", + "【reverse】 : Si es inverso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json new file mode 100644 index 00000000..0f1b257b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Liste réorganisable", + "info": "ListView qui permet de réorganiser les éléments par un appui long. Peut spécifier la direction de défilement, l'inversion, le contrôleur de défilement, etc.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ReorderableListView", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【header】 : Composant d'en-tête 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsets】", + "【onReorder】 : Rappel lors de la réorganisation 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de ReorderableListView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inversion 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json new file mode 100644 index 00000000..49a293d6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista riordinabile", + "info": "Una ListView che può essere riordinata con un lungo tocco, con la possibilità di specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ReorderableListView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【header】 : Componente di intestazione 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsets】", + "【onReorder】 : Callback per lo scambio 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di ReorderableListView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Se invertire 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json new file mode 100644 index 00000000..bc86df7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "並べ替え可能なリスト", + "info": "長押しで並べ替え可能なListViewで、スワイプ方向、逆方向かどうか、スワイプコントローラーなどの属性を指定できます。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【header】 : ヘッダーコンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsets】", + "【onReorder】 : 並べ替え時のコールバック 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListViewのスワイプ方向", + "desc": [ + "【scrollDirection】 : スワイプ方向 【Axis】", + "【reverse】 : 逆方向かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json new file mode 100644 index 00000000..526d329b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "재정렬 가능한 리스트", + "info": "길게 눌러 정렬할 수 있는 ListView, 스크롤 방향, 반대 방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ReorderableListView 기본 사용법", + "desc": [ + "【children】 : 자식 위젯 리스트 【List】", + "【header】 : 헤더 위젯 【Widget】", + "【padding】 : 내부 여백 【EdgeInsets】", + "【onReorder】 : 재정렬 시 콜백 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ReorderableListView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json new file mode 100644 index 00000000..098c7486 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Lista Reordenável", + "info": "Uma ListView que permite reordenar com um toque longo, podendo especificar a direção de deslize, se é reverso, controlador de deslize, entre outros atributos.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ReorderableListView", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【header】 : Componente de cabeçalho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsets】", + "【onReorder】 : Callback ao reordenar 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslize do ReorderableListView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se é reverso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json new file mode 100644 index 00000000..09d81f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ReorderableListView/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 177, + "name": "ReorderableListView", + "localName": "Переупорядочиваемый список", + "info": "ListView, который можно упорядочивать с помощью длительного нажатия, можно указать направление прокрутки, обратное направление, контроллер прокрутки и другие свойства.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ReorderableListView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【header】 : Верхний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsets】", + "【onReorder】 : Обратный вызов при переупорядочивании 【ReorderCallback】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки ReorderableListView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json new file mode 100644 index 00000000..5d4f0f0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Drehübergang", + "info": "Kann ein Kind-Widget aufnehmen und es mit einer Drehanimation versehen, erfordert einen Animator turns und verfügt über die Eigenschaft alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von RotationTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【turns】 : Ob verschwinden 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json new file mode 100644 index 00000000..42eaf2aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Rotation Transition", + "info": "Can accommodate a child component and make it perform a rotation animation. Requires an animator turns and has an alignment property.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of RotationTransition", + "desc": [ + "【child】 : Child component 【Widget】", + "【turns】 : Whether to disappear 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json new file mode 100644 index 00000000..2e2b439c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transición de Rotación", + "info": "Puede contener un componente hijo y hacer que realice una animación de rotación. Requiere un animador turns y tiene la propiedad alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RotationTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【turns】 : ¿Desaparece? 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json new file mode 100644 index 00000000..83817b99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transition de rotation", + "info": "Peut contenir un composant enfant et lui faire effectuer une animation de rotation, nécessite un animateur turns, possède une propriété alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de RotationTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【turns】 : Disparaît ou non 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json new file mode 100644 index 00000000..4eb81129 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transizione di rotazione", + "info": "Può contenere un componente figlio e farlo ruotare con un'animazione, richiede un animatore turns, possiede l'attributo alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di RotationTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【turns】 : Scompare 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json new file mode 100644 index 00000000..6c2f878f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "回転変換", + "info": "子コンポーネントを収容し、回転アニメーションを行わせることができます。アニメーターturnsを提供する必要があり、alignment属性を持っています。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【turns】 : 消えるかどうか 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json new file mode 100644 index 00000000..fcacc7f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "회전 변환", + "info": "하나의 자식 위젯을 포함하고 회전 애니메이션을 적용할 수 있습니다. 애니메이터 turns를 제공해야 하며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RotationTransition 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【turns】 : 사라짐 여부 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json new file mode 100644 index 00000000..a19b0f63 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Transição de Rotação", + "info": "Pode conter um componente filho e fazê-lo realizar uma animação de rotação, requer um animador turns e possui a propriedade alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do RotationTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【turns】 : Desaparece ou não 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json new file mode 100644 index 00000000..7fcc8161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/RotationTransition/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 90, + "name": "RotationTransition", + "localName": "Вращательный переход", + "info": "Может содержать один дочерний компонент и анимировать его вращение. Требуется предоставить аниматор turns, имеет свойство alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование RotationTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【turns】 : Исчезнет ли 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json new file mode 100644 index 00000000..96eec136 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Gerüst", + "info": "Eine allgemeine App-Struktur, die obere, untere, linke, rechte, mittlere und schwebende Button-Bereiche umfasst, in denen Komponenten platziert werden können.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scaffold", + "desc": [ + "【appBar】 : Kopfkomponente 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Fußkomponente 【Widget】", + "【drawer】 : Linke Schiebekomponente 【Widget】", + "【endDrawer】 : Rechte Schiebekomponente 【Widget】", + "【body】 : Inhaltkomponente 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【floatingActionButton】 : Schwebender Button 【Widget】", + "【floatingActionButtonLocation】 : Position des schwebenden Buttons 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json new file mode 100644 index 00000000..2964c381 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Scaffold", + "info": "A general app structure, including top, bottom, left, right, middle, and floating button parts, where components can be placed in corresponding positions.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scaffold", + "desc": [ + "【appBar】: Header component 【PreferredSizeWidget】", + "【bottomNavigationBar】: Bottom component 【Widget】", + "【drawer】: Left sliding component 【Widget】", + "【endDrawer】: Right sliding component 【Widget】", + "【body】: Content component 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【floatingActionButton】: Floating button 【Widget】", + "【floatingActionButtonLocation】: Floating button position 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json new file mode 100644 index 00000000..3fbddd85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Andamio", + "info": "Una estructura de aplicación genérica que incluye partes superior, inferior, izquierda, derecha, central y botón flotante, donde se pueden colocar componentes en las posiciones correspondientes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scaffold", + "desc": [ + "【appBar】 : Componente de la cabecera 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferior 【Widget】", + "【drawer】 : Componente deslizante izquierdo 【Widget】", + "【endDrawer】 : Componente deslizante derecho 【Widget】", + "【body】 : Componente de contenido 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【floatingActionButton】 : Botón flotante 【Widget】", + "【floatingActionButtonLocation】 : Ubicación del botón flotante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json new file mode 100644 index 00000000..156168ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Échafaudage", + "info": "Une structure d'application générique comprenant des parties supérieure, inférieure, gauche, droite, centrale et un bouton flottant, où des composants peuvent être placés aux positions correspondantes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scaffold", + "desc": [ + "【appBar】 : Composant de tête 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Composant de bas 【Widget】", + "【drawer】 : Composant de glissement gauche 【Widget】", + "【endDrawer】 : Composant de glissement droit 【Widget】", + "【body】 : Composant de contenu 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【floatingActionButton】 : Bouton flottant 【Widget】", + "【floatingActionButtonLocation】 : Position du bouton flottant 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json new file mode 100644 index 00000000..3d6852f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Impalcatura", + "info": "Una struttura generica per app, che include parti superiore, inferiore, sinistra, destra, centrale e un pulsante fluttuante, dove è possibile posizionare componenti nelle posizioni corrispondenti.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Scaffold", + "desc": [ + "【appBar】 : Componente superiore 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferiore 【Widget】", + "【drawer】 : Componente scorrevole a sinistra 【Widget】", + "【endDrawer】 : Componente scorrevole a destra 【Widget】", + "【body】 : Componente principale 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【floatingActionButton】 : Pulsante fluttuante 【Widget】", + "【floatingActionButtonLocation】 : Posizione del pulsante fluttuante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json new file mode 100644 index 00000000..966ee658 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "足場", + "info": "一般的なアプリの構造で、上部、下部、左側、右側、中央、フローティングボタンの部分を含み、対応する位置にコンポーネントを配置できます。", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffoldの基本的な使い方", + "desc": [ + "【appBar】 : ヘッダーコンポーネント 【PreferredSizeWidget】", + "【bottomNavigationBar】 : フッターコンポーネント 【Widget】", + "【drawer】 : 左スライドコンポーネント 【Widget】", + "【endDrawer】 : 右スライドコンポーネント 【Widget】", + "【body】 : コンテンツコンポーネント 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【floatingActionButton】 : フローティングボタン 【Widget】", + "【floatingActionButtonLocation】 : フローティングボタンの位置 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json new file mode 100644 index 00000000..a5ac3c4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "스캐폴드", + "info": "일반적인 앱 구조로, 상단, 하단, 좌측, 우측, 중앙, 플로팅 버튼 부분을 포함하며, 해당 위치에 컴포넌트를 배치할 수 있습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scaffold 기본 사용법", + "desc": [ + "【appBar】 : 헤더 컴포넌트 【PreferredSizeWidget】", + "【bottomNavigationBar】 : 하단 컴포넌트 【Widget】", + "【drawer】 : 좌측 슬라이드 컴포넌트 【Widget】", + "【endDrawer】 : 우측 슬라이드 컴포넌트 【Widget】", + "【body】 : 내용 컴포넌트 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【floatingActionButton】 : 플로팅 버튼 【Widget】", + "【floatingActionButtonLocation】 : 플로팅 버튼 위치 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json new file mode 100644 index 00000000..9dd00eea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Andaime", + "info": "Uma estrutura de aplicativo genérica, incluindo partes superior, inferior, esquerda, direita, central e botão flutuante, onde os componentes podem ser colocados nas posições correspondentes.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Scaffold", + "desc": [ + "【appBar】 : Componente do cabeçalho 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Componente inferior 【Widget】", + "【drawer】 : Componente deslizante esquerdo 【Widget】", + "【endDrawer】 : Componente deslizante direito 【Widget】", + "【body】 : Componente de conteúdo 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【floatingActionButton】 : Botão flutuante 【Widget】", + "【floatingActionButtonLocation】 : Localização do botão flutuante 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json new file mode 100644 index 00000000..8d59eb99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scaffold/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 64, + "name": "Scaffold", + "localName": "Леса", + "info": "Универсальная структура приложения, включающая верхнюю, нижнюю, левую, правую, центральную части и плавающую кнопку, в соответствующих местах могут размещаться компоненты.", + "lever": 4, + "family": 1, + "linkIds": [ + 57, + 60, + 61 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scaffold", + "desc": [ + "【appBar】 : Верхний компонент 【PreferredSizeWidget】", + "【bottomNavigationBar】 : Нижний компонент 【Widget】", + "【drawer】 : Левый выдвижной компонент 【Widget】", + "【endDrawer】 : Правый выдвижной компонент 【Widget】", + "【body】 : Основной компонент 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【floatingActionButton】 : Плавающая кнопка 【Widget】", + "【floatingActionButtonLocation】 : Расположение плавающей кнопки 【FloatingActionButtonLocation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json new file mode 100644 index 00000000..6153ce83 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Skalierungstransformation", + "info": "Kann ein Kindelement aufnehmen und es mit einer Skalierungsanimation versehen. Erfordert einen Animator 'scale' und besitzt das Attribut 'alignment'.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ScaleTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【scale】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json new file mode 100644 index 00000000..1486f242 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Scale Transition", + "info": "Can contain a child component and make it perform a scaling animation. Requires providing an animator scale and has the alignment property.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ScaleTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【scale】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json new file mode 100644 index 00000000..6bb870ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transición de Escala", + "info": "Puede contener un componente hijo y realizar una animación de escala, requiere un animador scale, tiene la propiedad alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ScaleTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【scale】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json new file mode 100644 index 00000000..9a59a791 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transition de mise à l'échelle", + "info": "Peut contenir un composant enfant et lui appliquer une animation de mise à l'échelle. Nécessite un animateur scale et possède l'attribut alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ScaleTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【scale】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json new file mode 100644 index 00000000..2614f287 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transizione di Scala", + "info": "Può contenere un componente figlio e farlo animare con una transizione di scala, richiede un animatore scale, ha la proprietà alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di ScaleTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【scale】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json new file mode 100644 index 00000000..1d61966a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "スケールトランジション", + "info": "子コンポーネントを収容し、スケールアニメーションを行わせることができます。アニメーターscaleを提供する必要があり、alignment属性を持っています。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransitionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【scale】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json new file mode 100644 index 00000000..a902e389 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "스케일 변환", + "info": "하나의 자식 위젯을 포함하고, 스케일 애니메이션을 수행할 수 있습니다. 애니메이션 스케일을 제공해야 하며, alignment 속성을 가지고 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScaleTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【scale】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json new file mode 100644 index 00000000..67ce554d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Transição de Escala", + "info": "Pode conter um componente filho e fazer com que ele realize uma animação de escala, requer um animador scale, possui o atributo alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ScaleTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【scale】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json new file mode 100644 index 00000000..a3d00838 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ScaleTransition/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 91, + "name": "ScaleTransition", + "localName": "Масштабирование", + "info": "Может содержать один дочерний компонент и выполнять анимацию масштабирования. Требуется предоставить аниматор scale, имеет свойство alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ScaleTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【scale】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json new file mode 100644 index 00000000..ec33e744 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Scrollbare Komponente", + "info": "Implementiert ein Interaktionsmodell für eine scrollbare Komponente, das die Konstruktion des Viewports durch den viewportBuilder erfordert. Es ist eine der Kernkomponenten der ScrollView-Implementierung und wird in der Regel nicht direkt verwendet.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scrollable", + "desc": [ + "【viewportBuilder】: Viewport-Konstruktor 【ViewportBuilder】", + "【axisDirection】: Scrollrichtung 【AxisDirection】", + "【controller】: Scroll-Controller 【ScrollController】", + "【dragStartBehavior】: Drag-Verhalten 【DragStartBehavior】", + "【physics】: Scroll-Physik 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json new file mode 100644 index 00000000..eb851f1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Scrollable Component", + "info": "Implements an interactive model for a scrollable component, requiring the construction of a viewport via viewportBuilder. It is one of the core implementation components of ScrollView and is generally not used directly.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scrollable", + "desc": [ + "【viewportBuilder】: Viewport Constructor 【ViewportBuilder】", + "【axisDirection】: Scroll Direction 【AxisDirection】", + "【controller】: Scroll Controller 【ScrollController】", + "【dragStartBehavior】: Drag Behavior 【DragStartBehavior】", + "【physics】: Scroll Physics 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json new file mode 100644 index 00000000..04ba09ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Deslizable", + "info": "Implementa un modelo de interacción para un componente desplazable, requiere la construcción del viewport a través del viewportBuilder. Es uno de los componentes centrales de ScrollView, generalmente no se usa directamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scrollable", + "desc": [ + "【viewportBuilder】: Constructor del viewport 【ViewportBuilder】", + "【axisDirection】: Dirección de desplazamiento 【AxisDirection】", + "【controller】: Controlador de desplazamiento 【ScrollController】", + "【dragStartBehavior】: Comportamiento de arrastre 【DragStartBehavior】", + "【physics】: Fenómeno de desplazamiento 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json new file mode 100644 index 00000000..5ead6127 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Composant défilable", + "info": "Implémente un modèle d'interaction pour un composant défilable, nécessitant la construction d'une fenêtre d'affichage via viewportBuilder. C'est l'un des composants de base de ScrollView, généralement pas utilisé directement.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scrollable", + "desc": [ + "【viewportBuilder】 : Constructeur de fenêtre d'affichage 【ViewportBuilder】", + "【axisDirection】: Direction de défilement 【AxisDirection】", + "【controller】: Contrôleur de défilement 【ScrollController】", + "【dragStartBehavior】: Comportement de glissement 【DragStartBehavior】", + "【physics】: Physique de défilement 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json new file mode 100644 index 00000000..d2c6a6e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Scorrevole", + "info": "Implementa un modello di interazione per un componente scorrevole, richiede la costruzione di un viewport tramite viewportBuilder. È uno dei componenti principali di ScrollView e generalmente non viene utilizzato direttamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Scrollable", + "desc": [ + "【viewportBuilder】 : Costruttore del viewport 【ViewportBuilder】", + "【axisDirection】: Direzione di scorrimento 【AxisDirection】", + "【controller】: Controller di scorrimento 【ScrollController】", + "【dragStartBehavior】: Comportamento di trascinamento 【DragStartBehavior】", + "【physics】: Fisica dello scorrimento 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json new file mode 100644 index 00000000..f653f3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "スクロール可能コンポーネント", + "info": "スクロール可能なコンポーネントのインタラクションモデルを実装し、viewportBuilderを使用してビューポートを構築する必要があります。ScrollViewのコア実装コンポーネントの一つで、通常直接使用されません。", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollableの基本的な使用法", + "desc": [ + "【viewportBuilder】 : ビューポートビルダー 【ViewportBuilder】", + "【axisDirection】: スクロール方向 【AxisDirection】", + "【controller】: スクロールコントローラー 【ScrollController】", + "【dragStartBehavior】: ドラッグ開始動作 【DragStartBehavior】", + "【physics】: スクロール物理現象 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json new file mode 100644 index 00000000..cd737531 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "스크롤 가능한 컴포넌트", + "info": "스크롤 가능한 컴포넌트의 상호작용 모델을 구현하며, viewportBuilder를 통해 viewport를 구성해야 합니다. ScrollView의 핵심 구현 컴포넌트 중 하나로, 일반적으로 직접 사용되지 않습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollable 기본 사용법", + "desc": [ + "【viewportBuilder】 : 뷰포트 빌더 【ViewportBuilder】", + "【axisDirection】: 스크롤 방향 【AxisDirection】", + "【controller】: 스크롤 컨트롤러 【ScrollController】", + "【dragStartBehavior】: 드래그 시작 동작 【DragStartBehavior】", + "【physics】: 스크롤 물리 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json new file mode 100644 index 00000000..dfded888 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Componente Deslizável", + "info": "Implementa um modelo de interação para um componente deslizável, necessitando da construção de um viewport através do viewportBuilder. É um dos componentes principais da implementação do ScrollView, geralmente não utilizado diretamente.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Scrollable", + "desc": [ + "【viewportBuilder】 : Construtor do viewport 【ViewportBuilder】", + "【axisDirection】: Direção do deslize 【AxisDirection】", + "【controller】: Controlador de deslize 【ScrollController】", + "【dragStartBehavior】: Comportamento de arrasto 【DragStartBehavior】", + "【physics】: Fenómeno de rolagem 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json new file mode 100644 index 00000000..7bc209fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollable/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 253, + "name": "Scrollable", + "localName": "Прокручиваемый компонент", + "info": "Реализует модель взаимодействия прокручиваемого компонента, требуется viewportBuilder для построения viewport. Это один из основных компонентов реализации ScrollView, обычно не используется напрямую.", + "lever": 4, + "family": 1, + "linkIds": [ + 340, + 349 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scrollable", + "desc": [ + "【viewportBuilder】 : Конструктор viewport 【ViewportBuilder】", + "【axisDirection】: Направление прокрутки 【AxisDirection】", + "【controller】: Контроллер прокрутки 【ScrollController】", + "【dragStartBehavior】: Поведение при перетаскивании 【DragStartBehavior】", + "【physics】: Физика прокрутки 【ScrollPhysics】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json new file mode 100644 index 00000000..d452345b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Scrollleiste", + "info": "Muss einen scrollbaren Bereich umschließen. Wenn scrollbar, wird eine Scrollleiste zur Anzeige angezeigt.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Scrollbar", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json new file mode 100644 index 00000000..875f30bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Scrollbar", + "info": "It needs to wrap a scrollable area. When it is scrollable, a scroll bar will be displayed for indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Scrollbar", + "desc": [ + "【child】: Child widget 【Widget】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json new file mode 100644 index 00000000..cbaf503a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra de desplazamiento", + "info": "Debe envolver un área desplazable. Cuando es desplazable, se mostrará una barra de desplazamiento para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Scrollbar", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json new file mode 100644 index 00000000..c94a78d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barre de défilement", + "info": "Doit envelopper une zone défilable. Lorsqu'elle est défilable, une barre de défilement est affichée pour l'indication.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Scrollbar", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json new file mode 100644 index 00000000..d06c80c1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra di scorrimento", + "info": "Deve avvolgere un'area scorrevole. Quando è scorrevole, verrà visualizzata una barra di scorrimento per indicare.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Scrollbar", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【controller】 : Controllore 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json new file mode 100644 index 00000000..c2831c33 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "スクロールバー", + "info": "スクロール可能な領域をラップする必要があります。スクロール可能な場合、スクロールのバーが表示されて指示します。", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbarの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json new file mode 100644 index 00000000..c4a018f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "스크롤바", + "info": "스크롤 가능한 영역을 감싸야 하며, 스크롤이 가능할 때 스크롤 바가 표시되어 위치를 표시합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Scrollbar 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json new file mode 100644 index 00000000..4724067d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Barra de Rolagem", + "info": "Precisa envolver uma área rolável. Quando rolável, exibirá uma barra de rolagem para indicar.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Scrollbar", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json new file mode 100644 index 00000000..3f8d4a3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Scrollbar/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 194, + "name": "Scrollbar", + "localName": "Ползунок прокрутки", + "info": "Необходимо обернуть прокручиваемую область, при прокрутке будет отображаться ползунок для индикации.", + "lever": 3, + "family": 1, + "linkIds": [ + 195, + 164, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Scrollbar", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json new file mode 100644 index 00000000..9d384d43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Auswählbarer Text", + "info": "Auswählbarer Text, der ausgewählt und kopiert werden kann. Die Farbe, Größe, Textstil, Ausrichtung usw. des Cursors können angegeben werden.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SelectableText", + "desc": [ + "【Parameter】 : Angezeigter Text 【String】", + "【style】 : Textstil 【TextStyle】", + "【cursorRadius】 : Cursorradius 【Radius】", + "【cursorColor】 : Cursorfarbe 【Color】", + "【cursorWidth】 : Cursorbreite 【double】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【autofocus】 : Autofokus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Ausrichtungseigenschaften von SelectableText", + "desc": [ + "【textAlign】 : Ausrichtung*6 【textAlign】", + "【textDirection】 : Textrichtung*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json new file mode 100644 index 00000000..ac2e706d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Selectable Text", + "info": "Selectable text that can be selected and copied. You can specify the color, size, text style, alignment, etc. of the cursor.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SelectableText", + "desc": [ + "【Parameter】 : Display text 【String】", + "【style】 : Text style 【TextStyle】", + "【cursorRadius】 : Cursor radius 【Radius】", + "【cursorColor】 : Cursor color 【Color】", + "【cursorWidth】 : Cursor width 【double】", + "【showCursor】 : Whether to show the cursor 【bool】", + "【autofocus】 : Auto focus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Alignment Properties of SelectableText", + "desc": [ + "【textAlign】 : Alignment method*6 【textAlign】", + "【textDirection】 : Text direction*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json new file mode 100644 index 00000000..ef1aee65 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texto Seleccionable", + "info": "Texto seleccionable que se puede seleccionar y copiar. Se puede especificar el color, tamaño, estilo de texto, alineación, etc., del cursor.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SelectableText", + "desc": [ + "【Parámetro】 : Texto mostrado 【String】", + "【style】 : Estilo de texto 【TextStyle】", + "【cursorRadius】 : Radio del cursor 【Radius】", + "【cursorColor】 : Color del cursor 【Color】", + "【cursorWidth】 : Ancho del cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Enfoque automático 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propiedades de alineación de SelectableText", + "desc": [ + "【textAlign】 : Alineación*6 【textAlign】", + "【textDirection】 : Dirección del texto*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json new file mode 100644 index 00000000..99181eb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texte sélectionnable", + "info": "Texte sélectionnable, peut être sélectionné et copié. Permet de spécifier la couleur du curseur, la taille, le style du texte, l'alignement, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SelectableText", + "desc": [ + "【Paramètre】 : Texte affiché 【String】", + "【style】 : Style du texte 【TextStyle】", + "【cursorRadius】 : Rayon du curseur 【Radius】", + "【cursorColor】 : Couleur du curseur 【Color】", + "【cursorWidth】 : Largeur du curseur 【double】", + "【showCursor】 : Afficher le curseur 【bool】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propriétés d'alignement de SelectableText", + "desc": [ + "【textAlign】 : Mode d'alignement*6 【textAlign】", + "【textDirection】 : Direction du texte*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json new file mode 100644 index 00000000..10e6cc53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Testo selezionabile", + "info": "Testo selezionabile che può essere selezionato e copiato. È possibile specificare il colore, la dimensione, lo stile del testo, l'allineamento, ecc. del cursore.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SelectableText", + "desc": [ + "【Parametro】 : Testo da visualizzare 【String】", + "【style】 : Stile del testo 【TextStyle】", + "【cursorRadius】 : Raggio del cursore 【Radius】", + "【cursorColor】 : Colore del cursore 【Color】", + "【cursorWidth】 : Larghezza del cursore 【double】", + "【showCursor】 : Mostra il cursore 【bool】", + "【autofocus】 : Autofocus 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Proprietà di allineamento di SelectableText", + "desc": [ + "【textAlign】 : Allineamento*6 【textAlign】", + "【textDirection】 : Direzione del testo*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json new file mode 100644 index 00000000..b669bbea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "選択可能なテキスト", + "info": "選択可能なテキストで、選択やコピーが可能です。カーソルの色、サイズ、テキストスタイル、配置などを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableTextの基本使用", + "desc": [ + "【入参】 : 表示テキスト 【String】", + "【style】 : テキストスタイル 【TextStyle】", + "【cursorRadius】 : カーソル半径 【Radius】", + "【cursorColor】 : カーソル色 【Color】", + "【cursorWidth】 : カーソル幅 【double】", + "【showCursor】 : カーソル表示の有無 【bool】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableTextの配置属性", + "desc": [ + "【textAlign】 : 配置方法*6 【textAlign】", + "【textDirection】 : テキスト方向*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json new file mode 100644 index 00000000..75baa2b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "선택 가능한 텍스트", + "info": "선택 가능한 텍스트로, 선택 및 복사가 가능합니다. 커서의 색상, 크기, 텍스트 스타일, 정렬 방식 등을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SelectableText 기본 사용법", + "desc": [ + "【입력 매개변수】 : 표시할 텍스트 【String】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【cursorRadius】 : 커서 반지름 【Radius】", + "【cursorColor】 : 커서 색상 【Color】", + "【cursorWidth】 : 커서 너비 【double】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【autofocus】 : 자동 포커스 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "SelectableText 정렬 속성", + "desc": [ + "【textAlign】 : 정렬 방식*6 【textAlign】", + "【textDirection】 : 텍스트 방향*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json new file mode 100644 index 00000000..571375f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Texto Selecionável", + "info": "Texto que pode ser selecionado e copiado. Pode especificar a cor do cursor, tamanho, estilo de texto, alinhamento, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SelectableText", + "desc": [ + "【Parâmetro】 : Texto a ser exibido 【String】", + "【style】 : Estilo do texto 【TextStyle】", + "【cursorRadius】 : Raio do cursor 【Radius】", + "【cursorColor】 : Cor do cursor 【Color】", + "【cursorWidth】 : Largura do cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Foco automático 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Propriedades de Alinhamento do SelectableText", + "desc": [ + "【textAlign】 : Método de alinhamento*6 【textAlign】", + "【textDirection】 : Direção do texto*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json new file mode 100644 index 00000000..6b26264f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SelectableText/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 53, + "name": "SelectableText", + "localName": "Выбираемый текст", + "info": "Текст, который можно выбирать и копировать. Можно указать цвет курсора, размер, стиль текста, выравнивание и т.д.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SelectableText", + "desc": [ + "【Параметр】 : Отображаемый текст 【String】", + "【style】 : Стиль текста 【TextStyle】", + "【cursorRadius】 : Радиус курсора 【Radius】", + "【cursorColor】 : Цвет курсора 【Color】", + "【cursorWidth】 : Ширина курсора 【double】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【autofocus】 : Автофокус 【bool】" + ] + }, + { + "file": "node2_align.dart", + "name": "Свойства выравнивания SelectableText", + "desc": [ + "【textAlign】 : Способ выравнивания*6 【textAlign】", + "【textDirection】 : Направление текста*2 【TextDirection】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json new file mode 100644 index 00000000..d6ac3b94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Größenübergang", + "info": "Kann ein Kindelement aufnehmen und eine Größenanimation durchführen. Es erfordert einen Animator sizeFactor und kann die Achse und die Achsenausrichtung der Größenänderung angeben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SizeTransition", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【axis】 : Achse*2 【Axis】", + "【sizeFactor】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json new file mode 100644 index 00000000..35fe02fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Size Transition", + "info": "Can accommodate a child component and animate its size. Requires an animator sizeFactor, and can specify the axis of size change and the axis alignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SizeTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【axis】: Axis*2 【Axis】", + "【sizeFactor】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json new file mode 100644 index 00000000..7c346567 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transición de Tamaño", + "info": "Puede contener un componente hijo y realizar una animación de tamaño, requiere un animador sizeFactor, y se puede especificar el eje de cambio de tamaño y la alineación del eje.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SizeTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【axis】 : Eje*2 【Axis】", + "【sizeFactor】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json new file mode 100644 index 00000000..cc72ace5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transition de taille", + "info": "Peut contenir un composant enfant et lui faire subir une animation de taille. Nécessite un animateur sizeFactor, peut spécifier l'axe de changement de taille et l'alignement axial axisAlignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SizeTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【axis】 : Axe*2 【Axis】", + "【sizeFactor】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json new file mode 100644 index 00000000..f4cd2291 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transizione Dimensionale", + "info": "Può contenere un componente figlio e fargli eseguire un'animazione di dimensione, richiede un animatore sizeFactor, è possibile specificare l'asse di cambiamento delle dimensioni e l'allineamento assiale.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di SizeTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【axis】 : Asse*2 【Axis】", + "【sizeFactor】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json new file mode 100644 index 00000000..9e63d914 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "サイズ変更", + "info": "子コンポーネントを収容し、そのサイズアニメーションを実行します。アニメーターsizeFactorを提供する必要があり、サイズ変化の軸と軸方向のaxisAlignmentを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransitionの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【axis】 : 軸方向*2 【Axis】", + "【sizeFactor】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json new file mode 100644 index 00000000..4ea1cccb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "크기 변환", + "info": "하위 컴포넌트를 수용하고 크기 애니메이션을 수행할 수 있습니다. 애니메이션 sizeFactor를 제공해야 하며, 크기 변화 축 및 축 정렬을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SizeTransition 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【axis】 : 축*2 【Axis】", + "【sizeFactor】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json new file mode 100644 index 00000000..84922215 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Transição de Tamanho", + "info": "Pode conter um componente filho e fazê-lo realizar uma animação de tamanho, requer um animador sizeFactor, pode especificar o eixo de mudança de tamanho e o alinhamento axial do eixo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SizeTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【axis】 : Eixo*2 【Axis】", + "【sizeFactor】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json new file mode 100644 index 00000000..7b4cef6d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SizeTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 92, + "name": "SizeTransition", + "localName": "Изменение размера", + "info": "Может содержать один дочерний компонент и анимировать его размер. Требуется предоставить аниматор sizeFactor, можно указать ось изменения размера и выравнивание оси axisAlignment.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SizeTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【axis】 : Ось*2 【Axis】", + "【sizeFactor】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json new file mode 100644 index 00000000..a3835b8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Schiebeübergang", + "info": "Eine Unterklasse von AnimatedWidget, die einen Animator vom Typ Offset verwendet, um eine Übergangsanimation zwischen zwei Offset-Objekten für das Kind-Widget zu ermöglichen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SlideTransition", + "desc": [ + "【child】 : Kind-Widget 【Widget】", + "【textDirection】 : X-Achsenrichtung 【TextDirection】", + "【position】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json new file mode 100644 index 00000000..b808bde8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Slide Transition", + "info": "A subclass of AnimatedWidget, using an animator of type Offset to allow child components to transition between two Offset objects.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SlideTransition", + "desc": [ + "【child】: Child component 【Widget】", + "【textDirection】: X-axis direction 【TextDirection】", + "【position】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json new file mode 100644 index 00000000..da6678e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transición de deslizamiento", + "info": "Subclase de AnimatedWidget, utiliza un animador de tipo Offset para realizar una animación de transición entre dos objetos Offset en el componente hijo.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SlideTransition", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【textDirection】 : Dirección del eje x 【TextDirection】", + "【position】 : Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json new file mode 100644 index 00000000..3e24c65a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transition par glissement", + "info": "Sous-classe de AnimatedWidget, utilise un animateur de type Offset pour permettre à un composant enfant de faire une animation de transition entre deux objets Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SlideTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【textDirection】 : Direction de l'axe x 【TextDirection】", + "【position】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json new file mode 100644 index 00000000..067c3325 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transizione scorrevole", + "info": "Sottoclasse di AnimatedWidget, utilizza un animatore di tipo Offset per far sì che i componenti figli eseguano un'animazione di transizione tra due oggetti Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di SlideTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【textDirection】 : Direzione dell'asse x 【TextDirection】", + "【position】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json new file mode 100644 index 00000000..06eef3ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "スライド遷移", + "info": "AnimatedWidgetのサブクラスで、Offsetタイプのアニメーターを使用して子コンポーネントを2つのOffsetオブジェクト間で遷移させるアニメーションを行います。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【textDirection】 : x軸方向 【TextDirection】", + "【position】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json new file mode 100644 index 00000000..fece4f89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "슬라이드 전환", + "info": "AnimatedWidget의 하위 클래스로, Offset 타입의 애니메이터를 사용하여 자식 위젯이 두 Offset 객체 간의 전환 애니메이션을 수행하도록 합니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SlideTransition 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【textDirection】 : x축 방향 【TextDirection】", + "【position】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json new file mode 100644 index 00000000..62082d06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Transição de Deslizamento", + "info": "Subclasse de AnimatedWidget, usa um animador do tipo Offset para fazer com que os componentes filhos realizem uma animação de transição entre dois objetos Offset.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SlideTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【textDirection】 : Direção do eixo x 【TextDirection】", + "【position】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json new file mode 100644 index 00000000..70208440 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/SlideTransition/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 112, + "name": "SlideTransition", + "localName": "Скользящий переход", + "info": "Подкласс AnimatedWidget, использует аниматор типа Offset для создания анимации перехода между двумя объектами Offset для дочернего компонента.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SlideTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【textDirection】 : Направление оси x 【TextDirection】", + "【position】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json new file mode 100644 index 00000000..96f03fab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Schieberegler", + "info": "Schieberegler-Komponente, die es ermöglicht, zwischen einem festgelegten Minimum und Maximum zu wählen. Kann Farbe, Anzahl der Segmente und angezeigte Labels angeben und erhält einen Rückruf bei Fortschrittsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Sliders", + "desc": [ + "【value】 : Wert 【double】", + "【min】 : Mindestwert 【double】", + "【max】 : Höchstwert 【double】", + "【activeColor】 : Aktive Farbe 【Color】", + "【inactiveColor】 : Inaktive Farbe 【Color】", + "【onChanged】 : Rückruf bei Änderung 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmente und Labels des Sliders", + "desc": [ + "【divisions】 : Anzahl der Segmente 【int】", + "【label】 : Text des Hinweisblasens 【String】", + "【onChangeStart】 : Überwachung beim Start des Schiebens 【Function(double)】", + "【onChangeEnd】 : Überwachung beim Ende des Schiebens 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json new file mode 100644 index 00000000..91e1a8e2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Slider", + "info": "Slider component, allows dragging to select between a specified maximum and minimum value. Can specify color, number of segments, and displayed labels, and receives progress change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Slider", + "desc": [ + "【value】 : value 【double】", + "【min】 : minimum value 【double】", + "【max】 : maximum value 【double】", + "【activeColor】 : active color 【Color】", + "【inactiveColor】 : inactive color 【Color】", + "【onChanged】 : callback when changed 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider Segments and Labels", + "desc": [ + "【divisions】 : number of segments 【int】", + "【label】 : tooltip text 【String】", + "【onChangeStart】 : listener when sliding starts 【Function(double)】", + "【onChangeEnd】 : listener when sliding ends 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json new file mode 100644 index 00000000..3f914044 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Control deslizante", + "info": "Componente de control deslizante que permite seleccionar arrastrando entre un valor máximo y mínimo especificados. Se puede especificar el color, el número de segmentos y las etiquetas mostradas, y recibe una devolución de llamada para los cambios de progreso.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del Slider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : color activo 【Color】", + "【inactiveColor】 : color inactivo 【Color】", + "【onChanged】 : devolución de llamada al cambiar 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentos y etiquetas del Slider", + "desc": [ + "【divisions】 : número de segmentos 【int】", + "【label】 : texto de la burbuja de información 【String】", + "【onChangeStart】 : escucha al comenzar a deslizar 【Function(double)】", + "【onChangeEnd】 : escucha al finalizar el deslizamiento 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json new file mode 100644 index 00000000..73779261 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Curseur", + "info": "Composant curseur, permet de faire glisser pour sélectionner entre une valeur maximale et minimale spécifiées. Peut spécifier la couleur, le nombre de segments et les étiquettes affichées, reçoit un rappel de changement de progression.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du Slider", + "desc": [ + "【value】 : valeur 【double】", + "【min】 : valeur minimale 【double】", + "【max】 : valeur maximale 【double】", + "【activeColor】 : couleur active 【Color】", + "【inactiveColor】 : couleur inactive 【Color】", + "【onChanged】 : rappel lors du changement 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentation et étiquettes du Slider", + "desc": [ + "【divisions】 : nombre de segments 【int】", + "【label】 : texte de la bulle d'info 【String】", + "【onChangeStart】 : écoute au début du glissement 【Function(double)】", + "【onChangeEnd】 : écoute à la fin du glissement 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json new file mode 100644 index 00000000..35fb8034 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Cursore", + "info": "Componente cursore, consente di selezionare trascinando tra un valore massimo e minimo specificato. È possibile specificare il colore, il numero di segmenti e le etichette visualizzate, e ricevere un callback per le variazioni di avanzamento.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base del cursore", + "desc": [ + "【value】 : valore 【double】", + "【min】 : valore minimo 【double】", + "【max】 : valore massimo 【double】", + "【activeColor】 : colore attivo 【Color】", + "【inactiveColor】 : colore inattivo 【Color】", + "【onChanged】 : callback al cambiamento 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentazione ed etichette del cursore", + "desc": [ + "【divisions】 : numero di segmenti 【int】", + "【label】 : testo della bolla di suggerimento 【String】", + "【onChangeStart】 : ascolto all'inizio dello scorrimento 【Function(double)】", + "【onChangeEnd】 : ascolto alla fine dello scorrimento 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json new file mode 100644 index 00000000..626b3924 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "スライダー", + "info": "スライダーコンポーネントは、指定された最大値と最小値の間でドラッグして選択することができます。色、分割数、表示されるラベルを指定でき、進捗変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "スライダーの基本使用", + "desc": [ + "【value】 : 数値 【double】", + "【min】 : 最小値 【double】", + "【max】 : 最大値 【double】", + "【activeColor】 : アクティブカラー 【Color】", + "【inactiveColor】 : 非アクティブカラー 【Color】", + "【onChanged】 : 変更時のコールバック 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "スライダーの分割とラベル", + "desc": [ + "【divisions】 : 分割数 【int】", + "【label】 : ヒントバブルテキスト 【String】", + "【onChangeStart】 : スライド開始時のリスナー 【Function(double)】", + "【onChangeEnd】 : スライド終了時のリスナー 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json new file mode 100644 index 00000000..4a82878c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "슬라이더", + "info": "슬라이더 컴포넌트는 지정된 최대값과 최소값 사이에서 드래그하여 선택할 수 있습니다. 색상, 분할 수 및 표시된 라벨을 지정할 수 있으며, 진행률 변경 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Slider 기본 사용", + "desc": [ + "【value】 : 값 【double】", + "【min】 : 최소값 【double】", + "【max】 : 최대값 【double】", + "【activeColor】 : 활성화 색상 【Color】", + "【inactiveColor】 : 비활성화 색상 【Color】", + "【onChanged】 : 변경 시 콜백 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Slider의 분할과 라벨", + "desc": [ + "【divisions】 : 분할 수 【int】", + "【label】 : 툴팁 텍스트 【String】", + "【onChangeStart】 : 슬라이드 시작 시 리스너 【Function(double)】", + "【onChangeEnd】 : 슬라이드 종료 시 리스너 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json new file mode 100644 index 00000000..e4a68925 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Deslizador", + "info": "Componente deslizante que permite selecionar arrastando entre um valor máximo e mínimo especificados. Pode especificar a cor, o número de segmentos e as etiquetas exibidas, e recebe uma chamada de retorno para alterações de progresso.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Slider", + "desc": [ + "【value】 : valor 【double】", + "【min】 : valor mínimo 【double】", + "【max】 : valor máximo 【double】", + "【activeColor】 : cor ativa 【Color】", + "【inactiveColor】 : cor inativa 【Color】", + "【onChanged】 : chamada de retorno ao alterar 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Segmentação e etiquetas do Slider", + "desc": [ + "【divisions】 : número de segmentos 【int】", + "【label】 : texto da bolha de dica 【String】", + "【onChangeStart】 : ouvinte ao iniciar o deslize 【Function(double)】", + "【onChangeEnd】 : ouvinte ao terminar o deslize 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json new file mode 100644 index 00000000..64bbb857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Slider/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 42, + "name": "Slider", + "localName": "Ползунок", + "info": "Компонент ползунка, который позволяет выбирать значение, перетаскивая между указанными минимальным и максимальным значениями. Можно указать цвет, количество сегментов и отображаемые метки, а также получить обратный вызов при изменении прогресса.", + "lever": 4, + "family": 1, + "linkIds": [ + 43, + 44, + 331 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Slider", + "desc": [ + "【value】 : значение 【double】", + "【min】 : минимальное значение 【double】", + "【max】 : максимальное значение 【double】", + "【activeColor】 : активный цвет 【Color】", + "【inactiveColor】 : неактивный цвет 【Color】", + "【onChanged】 : обратный вызов при изменении 【Function(double)】" + ] + }, + { + "file": "node2_lable.dart", + "name": "Сегменты и метки Slider", + "desc": [ + "【divisions】 : количество сегментов 【int】", + "【label】 : текст подсказки 【String】", + "【onChangeStart】 : слушатель начала перетаскивания 【Function(double)】", + "【onChangeEnd】 : слушатель окончания перетаскивания 【Function(double)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json new file mode 100644 index 00000000..d4526d87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Statuskonstruktor", + "info": "Es muss das builder-Attribut übergeben werden, um die Komponente zu konstruieren. Im builder kann StateSetter verwendet werden, um den Zustand der Unterkomponenten zu ändern, d.h. es ist möglich, eine lokal aktualisierte Komponente zu erstellen, ohne eine Klasse zu erstellen.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von StatefulBuilder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json new file mode 100644 index 00000000..7b339f1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "State Constructor", + "info": "The builder property needs to be passed to construct the component. In the builder, StateSetter can be used to change the state of the child component, which means a locally refreshed component can be implemented without creating a class.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of StatefulBuilder", + "desc": [ + "【builder】 : Component Constructor 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json new file mode 100644 index 00000000..f4ab980b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Constructor de Estado", + "info": "Requiere que se pase la propiedad builder para construir el componente. En el builder, se puede usar StateSetter para cambiar el estado del subcomponente, lo que permite implementar un componente con actualización local sin necesidad de crear una clase.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de StatefulBuilder", + "desc": [ + "【builder】 : Constructor del componente 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json new file mode 100644 index 00000000..56c80e8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Constructeur d'état", + "info": "Nécessite de passer la propriété builder pour construire le composant. Dans le builder, vous pouvez utiliser StateSetter pour modifier l'état du sous-composant, ce qui permet de créer un composant à rafraîchissement local sans avoir à créer une classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de StatefulBuilder", + "desc": [ + "【builder】 : Constructeur de composant 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json new file mode 100644 index 00000000..656f0161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Costruttore di Stato", + "info": "È necessario passare la proprietà builder per costruire il componente. Nel builder, è possibile utilizzare StateSetter per cambiare lo stato del componente figlio, il che consente di implementare un componente con aggiornamento locale senza dover creare una classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di StatefulBuilder", + "desc": [ + "【builder】: Costruttore del componente 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json new file mode 100644 index 00000000..8a72f81a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "ステートフルビルダー", + "info": "builderプロパティを渡してコンポーネントを構築する必要があります。builder内でStateSetterを使用して子コンポーネントの状態を変更できます。つまり、クラスを作成せずに局所的な更新を行うコンポーネントを実現できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilderの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json new file mode 100644 index 00000000..12ea565a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "상태 생성기", + "info": "builder 속성을 전달하여 컴포넌트를 구성해야 합니다. builder 내에서 StateSetter를 사용하여 하위 컴포넌트의 상태를 변경할 수 있습니다. 즉, 클래스를 생성하지 않고도 부분적으로 새로 고치는 컴포넌트를 구현할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatefulBuilder 기본 사용법", + "desc": [ + "【builder】 : 컴포넌트 생성기 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json new file mode 100644 index 00000000..c09e9ade --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Construtor de Estado", + "info": "É necessário passar a propriedade builder para construir o componente. No builder, pode-se usar o StateSetter para alterar o estado do subcomponente, o que permite implementar um componente com atualização local sem a necessidade de criar uma classe.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do StatefulBuilder", + "desc": [ + "【builder】: Construtor de Componentes 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f6dd4db8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatefulBuilder/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 242, + "name": "StatefulBuilder", + "localName": "Конструктор состояния", + "info": "Необходимо передать свойство builder для создания компонента. В builder можно использовать StateSetter для изменения состояния дочернего компонента, что позволяет реализовать локальное обновление компонента без создания класса.", + "lever": 3, + "family": 1, + "linkIds": [ + 202, + 203, + 280, + 255 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование StatefulBuilder", + "desc": [ + "【builder】 : Конструктор компонента 【StatefulWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json new file mode 100644 index 00000000..d00db645 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Statusübergangskomponente", + "info": "Abstrakte Klasse, die Aktualisierungen basierend auf den bereitgestellten Animatorstatusänderungen auslösen kann. Es gibt keine implementierten Unterklassen auf der Flutter-Framework-Ebene und keine Anwendungsfälle, daher scheint sie nicht sehr nützlich zu sein.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in StatusTransitionWidget", + "desc": [ + "【animation】 : Unterkomponente 【Animation】", + "Hier wird ein benutzerdefiniertes ColorStatusTransitionWidget verwendet, das beim Zustandswechsel des Animators verschiedene Farben erstellt." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json new file mode 100644 index 00000000..de7e4f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Status Transition Widget", + "info": "Abstract class that can trigger refresh based on the state changes of the provided animator. There are no implemented subclasses in the Flutter framework layer, nor any usage scenarios, so it doesn't seem very useful.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to StatusTransitionWidget", + "desc": [ + "【animation】 : Child component 【Animation】", + "Here, a custom ColorStatusTransitionWidget is used to build different colors when the state of the animator changes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json new file mode 100644 index 00000000..26137220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Componente de Transición de Estado", + "info": "Clase abstracta que puede desencadenar una actualización basada en los cambios de estado del animador proporcionado. No hay subclases implementadas en el nivel del framework Flutter, ni escenarios de uso, parece no ser muy útil.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a StatusTransitionWidget", + "desc": [ + "【animation】 : Componente hijo 【Animation】", + "Aquí se personaliza ColorStatusTransitionWidget para su uso, construyendo diferentes colores cuando cambia el estado del animador." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json new file mode 100644 index 00000000..837becf1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Widget de transition d'état", + "info": "Classe abstraite qui peut déclencher un rafraîchissement en fonction des changements d'état de l'animateur fourni. Il n'y a pas de sous-classes implémentées au niveau du framework Flutter, ni de scénarios d'utilisation, ce qui semble peu utile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction de StatusTransitionWidget", + "desc": [ + "【animation】 : Sous-composant 【Animation】", + "Ici, ColorStatusTransitionWidget est personnalisé pour être utilisé, construisant différentes couleurs lorsque l'état de l'animateur change." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json new file mode 100644 index 00000000..33ca6c76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Widget di transizione di stato", + "info": "Classe astratta che può attivare un aggiornamento in base ai cambiamenti di stato dell'animatore fornito. Non ci sono sottoclassi implementate a livello di framework Flutter, né scenari di utilizzo, sembra non essere molto utile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a StatusTransitionWidget", + "desc": [ + "【animation】 : componente figlio 【Animation】", + "Qui viene utilizzato il ColorStatusTransitionWidget personalizzato, che costruisce colori diversi quando lo stato dell'animatore cambia." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json new file mode 100644 index 00000000..ecf6183b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "ステータス遷移コンポーネント", + "info": "抽象クラスで、提供されたアニメーターの状態変化に基づいて更新をトリガーできます。Flutterフレームワーク層には実装されたサブクラスも使用シナリオもなく、あまり役に立たないと感じます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 紹介", + "desc": [ + "【animation】 : サブコンポーネント 【Animation】", + "ここでカスタムColorStatusTransitionWidgetを使用し、アニメーターの状態が変化したときに異なる色を構築します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json new file mode 100644 index 00000000..d8141178 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "상태 전환 위젯", + "info": "추상 클래스로, 제공된 애니메이터 상태 변화에 따라 새로고침을 트리거할 수 있습니다. Flutter 프레임워크 레벨에서 구현된 하위 클래스도 없고, 사용 사례도 없어서 유용성이 크지 않아 보입니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StatusTransitionWidget 소개", + "desc": [ + "【animation】 : 자식 위젯 【Animation】", + "여기서 사용자 정의 ColorStatusTransitionWidget을 사용하여 애니메이터의 상태가 변경될 때 다른 색상을 구성합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json new file mode 100644 index 00000000..ee2ef811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Componente de Transição de Estado", + "info": "Classe abstrata que pode acionar atualizações com base nas mudanças de estado do animador fornecido. Não há subclasses implementadas na camada do framework Flutter, nem cenários de uso, parece não ser muito útil.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao StatusTransitionWidget", + "desc": [ + "【animation】 : Subcomponente 【Animation】", + "Aqui, o ColorStatusTransitionWidget é personalizado para uso, construindo cores diferentes quando o estado do animador muda." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json new file mode 100644 index 00000000..441f8cd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StatusTransitionWidget/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 233, + "name": "StatusTransitionWidget", + "localName": "Виджет перехода состояний", + "info": "Абстрактный класс, который может вызывать обновление при изменении состояния предоставленного аниматора. На уровне фреймворка Flutter нет реализованных подклассов, а также сценариев использования, что делает его не очень полезным.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в StatusTransitionWidget", + "desc": [ + "【animation】 : Дочерний компонент 【Animation】", + "Здесь используется пользовательский ColorStatusTransitionWidget, который строит различные цвета при изменении состояния аниматора." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json new file mode 100644 index 00000000..78dd51b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Schrittkomponente", + "info": "Schrittkomponente, die schrittweise Operationen festlegen kann, kann den Inhalt der Schritte, die Bestätigungs- und Rückgängig-Buttons sowie die Ausrichtung der Schritte anpassen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Stepper", + "desc": [ + "【steps】 : Schrittliste 【List】", + "【currentStep】 : Aktueller Schritt 【double】", + "【onStepTapped】 : Klick-Rückruf 【ValueChanged】", + "【onStepCancel】 : Rückgängig-Rückruf 【VoidCallback】", + "【controlsBuilder】 : Controller-Konstruktion 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Ausrichtung des Steppers", + "desc": [ + "【type】 : Ausrichtung 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json new file mode 100644 index 00000000..a769d901 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Step Component", + "info": "Step component, which can specify step-by-step operations, customize the content of the steps, the buttons for confirmation and return, and the direction of the step arrangement.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Stepper", + "desc": [ + "【steps】: Step list 【List】", + "【currentStep】: Current step 【double】", + "【onStepTapped】: Click callback 【ValueChanged】", + "【onStepCancel】: Previous step callback 【VoidCallback】", + "【controlsBuilder】: Controller construction 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direction of Stepper", + "desc": [ + "【type】: Direction 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json new file mode 100644 index 00000000..9e71ee58 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente de pasos", + "info": "Componente de pasos, permite especificar operaciones paso a paso, se puede personalizar el contenido de los pasos, los botones de confirmación y retroceso, así como la dirección de la secuencia de pasos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Stepper", + "desc": [ + "【steps】 : Lista de pasos 【List】", + "【currentStep】 : Paso actual 【double】", + "【onStepTapped】 : Callback de clic 【ValueChanged】", + "【onStepCancel】 : Callback de retroceso 【VoidCallback】", + "【controlsBuilder】 : Constructor del controlador 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Dirección de Stepper", + "desc": [ + "【type】 : Dirección 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json new file mode 100644 index 00000000..88f48010 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Composant d'étapes", + "info": "Composant d'étapes, permet de spécifier des opérations étape par étape, peut personnaliser le contenu des étapes, les boutons de confirmation et de retour ainsi que la direction de l'arrangement des étapes.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Stepper", + "desc": [ + "【steps】 : Liste des étapes 【List】", + "【currentStep】 : Étape actuelle 【double】", + "【onStepTapped】 : Rappel de clic 【ValueChanged】", + "【onStepCancel】 : Rappel de l'étape précédente 【VoidCallback】", + "【controlsBuilder】 : Constructeur de contrôleur 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direction de Stepper", + "desc": [ + "【type】 : Direction 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json new file mode 100644 index 00000000..064e5653 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente Passaggi", + "info": "Componente passaggi, consente di specificare operazioni passo-passo, personalizzare il contenuto dei passaggi, i pulsanti di conferma e ritorno, e la direzione dell'ordinamento dei passaggi.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di Stepper", + "desc": [ + "【steps】 : Lista dei passaggi 【List】", + "【currentStep】 : Passaggio corrente 【double】", + "【onStepTapped】 : Callback al click 【ValueChanged】", + "【onStepCancel】 : Callback del passaggio precedente 【VoidCallback】", + "【controlsBuilder】 : Costruttore del controller 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direzione di Stepper", + "desc": [ + "【type】 : Direzione 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json new file mode 100644 index 00000000..9e768794 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "ステップコンポーネント", + "info": "ステップコンポーネントは、ステップごとの操作を指定でき、ステップの内容、確認と戻るボタン、およびステップの並び方向をカスタマイズできます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepperの基本使用", + "desc": [ + "【steps】 : ステップリスト 【List】", + "【currentStep】 : 現在のステップ 【double】", + "【onStepTapped】 : クリックコールバック 【ValueChanged】", + "【onStepCancel】 : 前のステップコールバック 【VoidCallback】", + "【controlsBuilder】 : コントローラー構築 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepperの方向", + "desc": [ + "【type】 : 方向 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json new file mode 100644 index 00000000..ea94ac5b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "스텝 컴포넌트", + "info": "스텝 컴포넌트는 단계별 작업을 지정할 수 있으며, 스텝의 내용, 확인 및 뒤로 가기 버튼, 스텝 배열 방향을 사용자 정의할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stepper 기본 사용", + "desc": [ + "【steps】 : 스텝 리스트 【List】", + "【currentStep】 : 현재 스텝 【double】", + "【onStepTapped】 : 클릭 콜백 【ValueChanged】", + "【onStepCancel】 : 이전 스텝 콜백 【VoidCallback】", + "【controlsBuilder】 : 컨트롤러 생성 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Stepper의 방향", + "desc": [ + "【type】 : 방향 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json new file mode 100644 index 00000000..9b918a77 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Componente de Passos", + "info": "Componente de passos, que permite especificar operações passo a passo, pode personalizar o conteúdo dos passos, os botões de confirmação e retorno, bem como a direção do arranjo dos passos.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Stepper", + "desc": [ + "【steps】 : Lista de passos 【List】", + "【currentStep】 : Passo atual 【double】", + "【onStepTapped】 : Callback de clique 【ValueChanged】", + "【onStepCancel】 : Callback de passo anterior 【VoidCallback】", + "【controlsBuilder】 : Construtor de controlador 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Direção do Stepper", + "desc": [ + "【type】 : Direção 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json new file mode 100644 index 00000000..ec410f0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Stepper/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 200, + "name": "Stepper", + "localName": "Компонент шагов", + "info": "Компонент шагов, который позволяет указать шаги выполнения операций, можно настроить содержимое шагов, кнопки подтверждения и возврата, а также направление расположения шагов.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Stepper", + "desc": [ + "【steps】 : Список шагов 【List】", + "【currentStep】 : Текущий шаг 【double】", + "【onStepTapped】 : Обратный вызов при нажатии 【ValueChanged】", + "【onStepCancel】 : Обратный вызов для предыдущего шага 【VoidCallback】", + "【controlsBuilder】 : Конструктор контроллера 【ControlsWidgetBuilder】" + ] + }, + { + "file": "node2_type.dart", + "name": "Направление Stepper", + "desc": [ + "【type】 : Направление 【StepperType】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json new file mode 100644 index 00000000..b344ba78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Stream-Builder", + "info": "Kann ein Stream-Objekt angeben, kann den Status der asynchronen Ausführung überwachen und im Builder verschiedene Benutzeroberflächen basierend auf dem Status erstellen.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von StreamBuilder", + "desc": [ + "【stream】 : Unterkomponente 【Stream】", + "【initialData】 : Initiale Daten 【T】", + "【builder】 : Klickereignis 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json new file mode 100644 index 00000000..7a9c86d2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Stream Builder", + "info": "Can specify a stream object, able to listen to the state of asynchronous execution, and build different interfaces in the constructor based on the state.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of StreamBuilder", + "desc": [ + "【stream】 : Child component 【Stream】", + "【initialData】 : Initial data 【T】", + "【builder】 : Click event 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json new file mode 100644 index 00000000..6720b0f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Constructor de Flujo", + "info": "Puede especificar un objeto stream, capaz de escuchar el estado de ejecución asíncrona y construir diferentes interfaces en el constructor según el estado.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de StreamBuilder", + "desc": [ + "【stream】 : componente hijo 【Stream】", + "【initialData】 : datos iniciales 【T】", + "【builder】 : evento de clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json new file mode 100644 index 00000000..f61d970b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Constructeur de flux", + "info": "Peut spécifier un objet stream, capable de surveiller l'état d'exécution asynchrone et de construire différentes interfaces dans le constructeur en fonction de l'état.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de StreamBuilder", + "desc": [ + "【stream】 : composant enfant 【Stream】", + "【initialData】 : données initiales 【T】", + "【builder】 : événement de clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json new file mode 100644 index 00000000..3d550c1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Costruttore di Flusso", + "info": "Può specificare un oggetto stream, in grado di monitorare lo stato dell'esecuzione asincrona e costruire diverse interfacce nel costruttore in base allo stato.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di StreamBuilder", + "desc": [ + "【stream】 : Componente figlio 【Stream】", + "【initialData】 : Dati iniziali 【T】", + "【builder】 : Evento di clic 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json new file mode 100644 index 00000000..bc75ba75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "ストリームビルダー", + "info": "ストリームオブジェクトを指定でき、非同期実行の状態を監視し、ビルダー内で状態に応じて異なるインターフェースを構築できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilderの基本使用", + "desc": [ + "【stream】 : 子コンポーネント 【Stream】", + "【initialData】 : 初期データ 【T】", + "【builder】 : クリックイベント 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json new file mode 100644 index 00000000..9731100a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "스트림 빌더", + "info": "스트림 객체를 지정할 수 있으며, 비동기 실행 상태를 감시하고, 빌더에서 상태에 따라 다른 인터페이스를 구성할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "StreamBuilder 기본 사용", + "desc": [ + "【stream】 : 자식 컴포넌트 【Stream】", + "【initialData】 : 초기 데이터 【T】", + "【builder】 : 클릭 이벤트 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json new file mode 100644 index 00000000..e56a75c6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Construtor de Fluxo", + "info": "Pode especificar um objeto stream, capaz de monitorar o estado da execução assíncrona e construir diferentes interfaces no construtor com base no estado.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do StreamBuilder", + "desc": [ + "【stream】 : Componente Filho 【Stream】", + "【initialData】 : Dados Iniciais 【T】", + "【builder】 : Evento de Clique 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json new file mode 100644 index 00000000..03020df1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/StreamBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 173, + "name": "StreamBuilder", + "localName": "Потоковый конструктор", + "info": "Можно указать объект stream, который может отслеживать состояние асинхронного выполнения и строить различные интерфейсы в конструкторе в зависимости от состояния.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование StreamBuilder", + "desc": [ + "【stream】 : Дочерний компонент 【Stream】", + "【initialData】 : Начальные данные 【T】", + "【builder】 : Событие клика 【AsyncWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json new file mode 100644 index 00000000..a11d67fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_de_DE.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Schalter", + "info": "Umschaltknopf, häufig für Konfigurationswechsel verwendet, kann die Farbe des kleinen Kreises, Bilder, Farbe der Gleitschiene usw. angeben, empfängt Rückrufe bei Zustandsänderungen.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Switch", + "desc": [ + "【inactiveThumbColor】 : Farbe des nicht ausgewählten kleinen Kreises 【Color】", + "【inactiveTrackColor】 : Farbe der nicht ausgewählten Gleitschiene 【Color】", + "【activeColor】 : Farbe des ausgewählten kleinen Kreises 【Color】", + "【activeTrackColor】 : Farbe der ausgewählten Gleitschiene 【Color】", + "【onChanged】 : Umschalt-Rückruf 【Function(double)】", + "Bei onChanged werden drei Zustände zurückgerufen: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch Bild", + "desc": [ + "【inactiveThumbImage】 : Bild des nicht ausgewählten kleinen Kreises 【ImageProvider】", + "【activeThumbImage】 : Bild des ausgewählten kleinen Kreises 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json new file mode 100644 index 00000000..224367a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_en_US.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Toggle Button", + "info": "Toggle button, commonly used for configuration switching, can specify small circle color, image, track color, etc., and receives state change callbacks.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Switch", + "desc": [ + "【inactiveThumbColor】 : Unselected small circle color 【Color】", + "【inactiveTrackColor】 : Unselected track color 【Color】", + "【activeColor】 : Selected small circle color 【Color】", + "【activeTrackColor】 : Selected track color 【Color】", + "【onChanged】 : Toggle callback 【Function(double)】", + "When onChanged, callbacks for true, null, and false states" + ] + }, + { + "file": "node2_image.dart", + "name": "Switch Image", + "desc": [ + "【inactiveThumbImage】 : Unselected small circle image 【ImageProvider】", + "【activeThumbImage】 : Selected small circle image 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json new file mode 100644 index 00000000..f05a37f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_es_ES.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Interruptor", + "info": "Interruptor de selección, comúnmente utilizado para cambiar configuraciones, puede especificar el color del círculo pequeño, la imagen, el color de la ranura, etc., y recibe una devolución de llamada para cambios de estado.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Switch", + "desc": [ + "【inactiveThumbColor】 : Color del círculo pequeño no seleccionado 【Color】", + "【inactiveTrackColor】 : Color de la ranura no seleccionada 【Color】", + "【activeColor】 : Color del círculo pequeño seleccionado 【Color】", + "【activeTrackColor】 : Color de la ranura seleccionada 【Color】", + "【onChanged】 : Devolución de llamada de cambio 【Function(double)】", + " En onChanged, devuelve tres estados: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Imagen de Switch", + "desc": [ + "【inactiveThumbImage】 : Imagen del círculo pequeño no seleccionado 【ImageProvider】", + "【activeThumbImage】 : Imagen del círculo pequeño seleccionado 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json new file mode 100644 index 00000000..dd1fa7bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_fr_FR.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Bouton de commutation", + "info": "Bouton de commutation, souvent utilisé pour changer les configurations, peut spécifier la couleur du petit cercle, l'image, la couleur de la glissière, etc., et reçoit un rappel de changement d'état.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Switch", + "desc": [ + "【inactiveThumbColor】 : Couleur du petit cercle non sélectionné 【Color】", + "【inactiveTrackColor】 : Couleur de la glissière non sélectionnée 【Color】", + "【activeColor】 : Couleur du petit cercle sélectionné 【Color】", + "【activeTrackColor】 : Couleur de la glissière sélectionnée 【Color】", + "【onChanged】 : Rappel de commutation 【Function(double)】", + " Lors de onChanged, rappelle trois états : true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Image de Switch", + "desc": [ + "【inactiveThumbImage】 : Image du petit cercle non sélectionné 【ImageProvider】", + "【activeThumbImage】 : Image du petit cercle sélectionné 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json new file mode 100644 index 00000000..70dedac9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_it_IT.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Interruttore", + "info": "Interruttore per la commutazione, spesso utilizzato per il cambio di configurazione, può specificare il colore del cerchio, l'immagine, il colore della scanalatura, ecc., riceve un callback per i cambiamenti di stato.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Switch", + "desc": [ + "【inactiveThumbColor】 : Colore del cerchio non selezionato 【Color】", + "【inactiveTrackColor】 : Colore della scanalatura non selezionata 【Color】", + "【activeColor】 : Colore del cerchio selezionato 【Color】", + "【activeTrackColor】 : Colore della scanalatura selezionata 【Color】", + "【onChanged】 : Callback di commutazione 【Function(double)】\"", + " Durante onChanged, il callback restituisce tre stati: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Immagine di Switch", + "desc": [ + "【inactiveThumbImage】 : Immagine del cerchio non selezionato 【ImageProvider】", + "【activeThumbImage】 : Immagine del cerchio selezionato 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json new file mode 100644 index 00000000..0955a1a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ja_JP.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "スイッチ", + "info": "トグルボタンを切り替えます。設定の切り替えによく使用され、小さな円の色や画像、スライドトラックの色などを指定できます。状態変化のコールバックを受け取ります。", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switchの基本的な使い方", + "desc": [ + "【inactiveThumbColor】 : 未選択時の小さな円の色 【Color】", + "【inactiveTrackColor】 : 未選択時のスライドトラックの色 【Color】", + "【activeColor】 : 選択時の小さな円の色 【Color】", + "【activeTrackColor】 : 選択時のスライドトラックの色 【Color】", + "【onChanged】 : 切り替えコールバック 【Function(double)】", + " onChanged時、true、null、falseの3つの状態をコールバックします" + ] + }, + { + "file": "node2_image.dart", + "name": "Switchの画像", + "desc": [ + "【inactiveThumbImage】 : 未選択時の小さな円の画像 【ImageProvider】", + "【activeThumbImage】 : 選択時の小さな円の画像 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json new file mode 100644 index 00000000..ebaf48ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ko_KR.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "스위치", + "info": "선택 버튼 전환, 주로 설정 전환에 사용되며, 작은 원의 색상, 이미지, 슬롯 색상 등을 지정할 수 있으며, 상태 변화 콜백을 받습니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Switch 기본 사용법", + "desc": [ + "【inactiveThumbColor】 : 선택되지 않은 작은 원 색상 【Color】", + "【inactiveTrackColor】 : 선택되지 않은 슬롯 색상 【Color】", + "【activeColor】 : 선택된 작은 원 색상 【Color】", + "【activeTrackColor】 : 선택된 슬롯 색상 【Color】", + "【onChanged】 : 전환 콜백 【Function(double)】\"", + " onChanged 시, true, null, false 세 가지 상태를 콜백합니다." + ] + }, + { + "file": "node2_image.dart", + "name": "Switch 이미지", + "desc": [ + "【inactiveThumbImage】 : 선택되지 않은 작은 원 이미지 【ImageProvider】", + "【activeThumbImage】 : 선택된 작은 원 이미지 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json new file mode 100644 index 00000000..922b3f17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_pt_PT.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Botão de Alternar", + "info": "Botão de alternar, frequentemente usado para alternar configurações, pode especificar a cor do círculo pequeno, imagem, cor da faixa deslizante, etc., e recebe uma chamada de retorno para mudanças de estado.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Switch", + "desc": [ + "【inactiveThumbColor】 : Cor do círculo pequeno quando não selecionado 【Color】", + "【inactiveTrackColor】 : Cor da faixa deslizante quando não selecionada 【Color】", + "【activeColor】 : Cor do círculo pequeno quando selecionado 【Color】", + "【activeTrackColor】 : Cor da faixa deslizante quando selecionada 【Color】", + "【onChanged】 : Chamada de retorno para alternar 【Function(double)】\"", + " Quando onChanged, retorna três estados: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Imagem do Switch", + "desc": [ + "【inactiveThumbImage】 : Imagem do círculo pequeno quando não selecionado 【ImageProvider】", + "【activeThumbImage】 : Imagem do círculo pequeno quando selecionado 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json new file mode 100644 index 00000000..b4c01d16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Switch/desc_ru_RU.json @@ -0,0 +1,34 @@ +{ + "id": 40, + "name": "Switch", + "localName": "Переключатель", + "info": "Переключатель, часто используется для изменения настроек, можно указать цвет маленького круга, изображение, цвет дорожки и т.д., принимает обратный вызов при изменении состояния.", + "lever": 4, + "family": 1, + "linkIds": [ + 41, + 18 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Базовое использование Switch", + "desc": [ + "【inactiveThumbColor】 : Цвет маленького круга в неактивном состоянии 【Color】", + "【inactiveTrackColor】 : Цвет дорожки в неактивном состоянии 【Color】", + "【activeColor】 : Цвет маленького круга в активном состоянии 【Color】", + "【activeTrackColor】 : Цвет дорожки в активном состоянии 【Color】", + "【onChanged】 : Обратный вызов при переключении 【Function(double)】", + " При onChanged, обратный вызов возвращает три состояния: true, null, false" + ] + }, + { + "file": "node2_image.dart", + "name": "Изображение Switch", + "desc": [ + "【inactiveThumbImage】 : Изображение маленького круга в неактивном состоянии 【ImageProvider】", + "【activeThumbImage】 : Изображение маленького круга в активном состоянии 【ImageProvider】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json new file mode 100644 index 00000000..d3a0a2e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Tab", + "info": "Wird normalerweise mit TabBar verwendet, um den Slide-Effekt zu erzielen. Wird normalerweise nicht allein verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView muss mit TabBar verwendet werden", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Kinder 【Indikatorfarbe】", + "【physics】 : Verhalten 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json new file mode 100644 index 00000000..3d8755bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Tab Page", + "info": "Usually used in conjunction with TabBar to achieve the effect of sliding pages. It is generally not used alone.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView needs to be used in conjunction with TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Children 【Indicator Color】", + "【physics】 : Behavior 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json new file mode 100644 index 00000000..4038a99d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Pestañas", + "info": "Normalmente se usa junto con TabBar para lograr un efecto de deslizamiento de páginas. Generalmente no se usa por separado.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView debe usarse junto con TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【children】 : Hijos 【Color del indicador】", + "【physics】 : Comportamiento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json new file mode 100644 index 00000000..5749b458 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Onglets", + "info": "Généralement utilisé avec TabBar pour réaliser un effet de glissement de pages. Il n'est généralement pas utilisé seul.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView doit être utilisé avec TabBar", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【children】 : Enfants 【Couleur de l'indicateur】", + "【physics】 : Comportement 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json new file mode 100644 index 00000000..d9855ddb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Schede", + "info": "Generalmente utilizzato insieme a TabBar per ottenere un effetto di scorrimento delle pagine. Di solito non viene utilizzato da solo.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView deve essere utilizzato insieme a TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【children】 : Figli 【Colore dell'indicatore】", + "【physics】 : Comportamento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json new file mode 100644 index 00000000..747d2d1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "タブビュー", + "info": "通常はTabBarと一緒に使用し、スライドページの効果を実現します。通常は単独で使用しません。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarViewはTabBarと一緒に使用する必要があります", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【children】 : 子供たち 【インジケーターカラー】", + "【physics】 : パフォーマンス 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json new file mode 100644 index 00000000..1202916c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "탭 뷰", + "info": "일반적으로 TabBar와 함께 사용되어 페이지 슬라이딩 효과를 구현합니다. 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView는 TabBar와 함께 사용해야 합니다", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【children】 : 자식들 【인디케이터 색상】", + "【physics】 : 동작 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json new file mode 100644 index 00000000..53848ce7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Separador de Páginas", + "info": "Geralmente usado em conjunto com o TabBar para alcançar o efeito de deslizar páginas. Normalmente não é usado sozinho.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView precisa ser usado em conjunto com o TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【children】 : Crianças 【Cor do indicador】", + "【physics】 : Comportamento 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json new file mode 100644 index 00000000..542c10f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TabBarView/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 59, + "name": "TabBarView", + "localName": "Вкладки", + "info": "Обычно используется вместе с TabBar для реализации эффекта скольжения страниц. Обычно не используется отдельно.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarView должен использоваться вместе с TabBar", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【children】 : Дети 【Цвет индикатора】", + "【physics】 : Поведение 【ScrollPhysics】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json new file mode 100644 index 00000000..7391d0cc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Tabellen-Wasserwellen", + "info": "Kann nur für Tabellen-Wasserwellen verwendet werden, empfängt Klick-, Doppelklick-, Langklick- und Hervorhebungsänderungsereignisse. Die Wasserwellen wirken auf eine Tabellenzeile.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell grundlegende Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klickereignis 【Function()】", + "【onDoubleTap】 : Doppelklickereignis 【Function()】", + "【onLongPress】 : Langklickereignis 【Function()】", + "【onHighlightChanged】 : Hervorhebungsänderungsrückruf 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json new file mode 100644 index 00000000..e2d8c29c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Table Ripple", + "info": "Can only be used for Table's ripple, receives click, double-click, long-press, and highlight change events, the ripple will be applied to a row of the table.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell Basic Events", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Click event 【Function()】", + "【onDoubleTap】 : Double-click event 【Function()】", + "【onLongPress】 : Long-press event 【Function()】", + "【onHighlightChanged】 : Highlight change callback 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json new file mode 100644 index 00000000..cbdd77c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Onda de tabla", + "info": "Solo se puede usar para la onda de la tabla, recibe eventos de clic, doble clic, pulsación larga y cambios de resaltado, la onda actuará en una fila de la tabla.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de TableRowInkWell", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【Function()】", + "【onLongPress】 : Evento de pulsación larga 【Function()】", + "【onHighlightChanged】 : Callback de cambio de resaltado 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json new file mode 100644 index 00000000..184c2508 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Ondulation de Tableau", + "info": "Utilisé uniquement pour les ondulations dans un Tableau, reçoit les événements de clic, double-clic, appui long et changement de surbrillance, l'ondulation s'applique à une ligne du tableau.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de TableRowInkWell", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【Function()】", + "【onLongPress】 : Événement d'appui long 【Function()】", + "【onHighlightChanged】 : Rappel de changement de surbrillance 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json new file mode 100644 index 00000000..63bc0fda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Effetto Riga Tabella", + "info": "Può essere utilizzato solo per l'effetto ondulato nelle tabelle, riceve eventi di clic, doppio clic, pressione prolungata e cambiamenti di evidenziazione, l'effetto ondulato agirà su una riga della tabella.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi Base di TableRowInkWell", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【Function()】", + "【onLongPress】 : Evento di pressione prolungata 【Function()】", + "【onHighlightChanged】 : Callback di cambiamento di evidenziazione 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json new file mode 100644 index 00000000..0c36282f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "テーブル波紋", + "info": "Table専用の波紋で、クリック、ダブルクリック、長押し、ハイライト変更イベントを受け取り、波紋はテーブルの一行に作用します。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【Function()】", + "【onLongPress】 : 長押しイベント 【Function()】", + "【onHighlightChanged】 : ハイライト変更コールバック 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json new file mode 100644 index 00000000..236a4c40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "테이블 물결 효과", + "info": "Table에서만 사용 가능한 물결 효과로, 클릭, 더블 클릭, 롱 프레스, 하이라이트 변경 이벤트를 받습니다. 물결 효과는 테이블의 한 행에 적용됩니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TableRowInkWell 기본 이벤트", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【Function()】", + "【onLongPress】 : 롱 프레스 이벤트 【Function()】", + "【onHighlightChanged】 : 하이라이트 변경 콜백 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json new file mode 100644 index 00000000..d107384f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Onda de tinta da tabela", + "info": "Só pode ser usado para a onda de tinta da tabela, recebe eventos de clique, duplo clique, pressão longa e mudança de destaque, a onda de tinta será aplicada a uma linha da tabela.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos do TableRowInkWell", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【Function()】", + "【onLongPress】 : Evento de pressão longa 【Function()】", + "【onHighlightChanged】 : Callback de mudança de destaque 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json new file mode 100644 index 00000000..0cd39d75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TableRowInkWell/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 151, + "name": "TableRowInkWell", + "localName": "Табличная волна", + "info": "Может использоваться только для волны в таблице, принимает события нажатия, двойного нажатия, длительного нажатия и изменения подсветки, волна будет применяться к строке таблицы.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события TableRowInkWell", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【Function()】", + "【onLongPress】 : Событие длительного нажатия 【Function()】", + "【onHighlightChanged】 : Обратный вызов изменения подсветки 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json new file mode 100644 index 00000000..b7714bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Textschaltfläche", + "info": "Materialstil-Textschaltfläche, standardmäßig nur mit Text, bei Klick mit Wasserwelleneffekt. Eigenschaften wie Rahmen, Farbe, Schatten können durch Stile geändert werden.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextButton", + "desc": [ + "【child】 : Hat es ein scrollbares Hauptelement 【Widget】", + "【onPressed】 : Klickereignis 【VoidCallback】", + "【onLongPress】 : Langklickereignis 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton-Stil", + "desc": [ + "【style】 : Schaltflächenstil 【ButtonStyle】", + "【focusNode】 : Fokus 【FocusNode】", + "【clipBehavior】 : Beschneidungsverhalten 【Clip】", + "【autofocus】 : Autofokus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json new file mode 100644 index 00000000..779529c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Text Button", + "info": "A Material-style text button, which only has text by default, and has a ripple effect when clicked. The border, color, shadow and other properties can be changed through styles.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextButton", + "desc": [ + "【child】 : Whether it has a scrollable body 【Widget】", + "【onPressed】 : Click event 【VoidCallback】", + "【onLongPress】 : Long press event 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton Style", + "desc": [ + "【style】 : Button style 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Clip behavior 【Clip】", + "【autofocus】 : Auto focus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json new file mode 100644 index 00000000..b78784bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Botón de texto", + "info": "Botón de texto con estilo Material, por defecto solo tiene texto y tiene un efecto de onda al hacer clic. Se pueden cambiar propiedades como el borde, el color, la sombra, etc., a través del estilo.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextButton", + "desc": [ + "【child】 : ¿Tiene un cuerpo de desplazamiento? 【Widget】", + "【onPressed】 : Evento de clic 【VoidCallback】", + "【onLongPress】 : Evento de pulsación larga 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo de TextButton", + "desc": [ + "【style】 : Estilo del botón 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamiento de recorte 【Clip】", + "【autofocus】 : Enfoque automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json new file mode 100644 index 00000000..7d96e6a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Bouton texte", + "info": "Bouton texte de style Material, par défaut uniquement du texte, avec un effet de vague lors du clic. Les propriétés telles que la bordure, la couleur, l'ombre, etc., peuvent être modifiées via le style.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextButton", + "desc": [ + "【child】 : Si le corps peut défiler 【Widget】", + "【onPressed】 : Événement de clic 【VoidCallback】", + "【onLongPress】 : Événement de maintien 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style de TextButton", + "desc": [ + "【style】 : Style du bouton 【ButtonStyle】", + "【focusNode】 : Focus 【FocusNode】", + "【clipBehavior】 : Comportement de découpage 【Clip】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json new file mode 100644 index 00000000..241b16dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Pulsante di testo", + "info": "Pulsante di testo in stile Material, di default ha solo testo e un effetto onda al clic. È possibile modificare bordi, colori, ombre e altre proprietà attraverso lo stile.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TextButton", + "desc": [ + "【child】 : Se ha un corpo scorrevole 【Widget】", + "【onPressed】 : Evento di clic 【VoidCallback】", + "【onLongPress】 : Evento di pressione prolungata 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile di TextButton", + "desc": [ + "【style】 : Stile del pulsante 【ButtonStyle】", + "【focusNode】 : Fuoco 【FocusNode】", + "【clipBehavior】 : Comportamento di ritaglio 【Clip】", + "【autofocus】 : Autofocus 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json new file mode 100644 index 00000000..70633f0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "テキストボタン", + "info": "Materialスタイルのテキストボタンで、デフォルトではテキストのみが表示され、クリック時に波紋効果があります。スタイルを変更することで、枠線、色、影などのプロパティを変更できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButtonの基本的な使用", + "desc": [ + "【child】 : スクロール主体を持つかどうか 【Widget】", + "【onPressed】 : クリックイベント 【VoidCallback】", + "【onLongPress】 : 長押しイベント 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButtonのスタイル", + "desc": [ + "【style】 : ボタンのスタイル 【ButtonStyle】", + "【focusNode】 : フォーカス 【FocusNode】", + "【clipBehavior】 : クリップ動作 【Clip】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json new file mode 100644 index 00000000..ccb14497 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "텍스트 버튼", + "info": "Material 스타일의 텍스트 버튼으로, 기본적으로 텍스트만 있으며 클릭 시 물결 효과가 있습니다. 스타일을 통해 테두리, 색상, 그림자 등의 속성을 변경할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextButton 기본 사용법", + "desc": [ + "【child】 : 스크롤 가능한 주체 여부 【Widget】", + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "TextButton 스타일", + "desc": [ + "【style】 : 버튼 스타일 【ButtonStyle】", + "【focusNode】 : 포커스 【FocusNode】", + "【clipBehavior】 : 클리핑 동작 【Clip】", + "【autofocus】 : 자동 포커스 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json new file mode 100644 index 00000000..17a48bce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Botão de texto", + "info": "Botão de texto no estilo Material, por padrão só tem texto, com efeito de ondulação ao clicar. Pode alterar propriedades como borda, cor, sombra, etc., através de estilos.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do TextButton", + "desc": [ + "【child】 : Se tem um corpo de rolagem 【Widget】", + "【onPressed】 : Evento de clique 【VoidCallback】", + "【onLongPress】 : Evento de pressionar longo 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo do TextButton", + "desc": [ + "【style】 : Estilo do botão 【ButtonStyle】", + "【focusNode】 : Foco 【FocusNode】", + "【clipBehavior】 : Comportamento de corte 【Clip】", + "【autofocus】 : Foco automático 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json new file mode 100644 index 00000000..b2ae2d6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextButton/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 353, + "name": "TextButton", + "localName": "Текстовая кнопка", + "info": "Текстовая кнопка в стиле Material, по умолчанию имеет только текст, при нажатии появляется эффект волны. Можно изменить свойства границы, цвета, тени и другие через стили.", + "lever": 3, + "family": 1, + "linkIds": [ + 354, + 355 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextButton", + "desc": [ + "【child】 : Имеет ли прокручиваемое содержимое 【Widget】", + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【onLongPress】 : Событие долгого нажатия 【VoidCallback】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль TextButton", + "desc": [ + "【style】 : Стиль кнопки 【ButtonStyle】", + "【focusNode】 : Фокус 【FocusNode】", + "【clipBehavior】 : Поведение обрезки 【Clip】", + "【autofocus】 : Автофокус 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json new file mode 100644 index 00000000..a5be0cb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_de_DE.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Eingabefeld", + "info": "Eine Komponente zur Eingabe mit komplexen Eigenschaften. Kann Controller, Textstil, Dekorationslinien, Zeilenbeschränkungen, Cursor-Stil usw. angeben. Empfängt Ereignisse wie Eingabeänderungen und Eingabeabschluss.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Textstil 【TextStyle】", + "【decoration】 : Dekorationslinie 【InputDecoration】", + "【onEditingComplete】 : Ereignis bei Eingabeabschluss 【Function()】", + "【onSubmitted】 : Ereignis bei Übermittlung 【Function(String)】", + "【onChanged】 : Ereignis bei Eingabe 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Zeilenanzahl und Cursor von TextField", + "desc": [ + "【minLines】 : Minimale Zeilenanzahl 【int】", + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【cursorRadius】 : Cursor-Radius 【Radius】", + "【cursorColor】 : Cursor-Farbe 【Color】", + "【cursorWidth】 : Cursor-Breite 【double】", + "【showCursor】 : Cursor anzeigen 【bool】", + "【autofocus】 : Automatischer Fokus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Komplexe Dekoration von InputDecoration", + "desc": [ + "InputDecoration hat viele Dekorationspunkte, siehe Code für Details:", + "border: Bezogen auf den Rand", + "helper: Bezogen auf die Hinweise unten links", + "counter: Bezogen auf die Hinweise unten rechts", + "prefix: Ganz links innerhalb des Eingabefelds", + "suffix: Ganz rechts innerhalb des Eingabefelds", + "label: Text ohne Fokus", + "label: Text ohne Fokus", + "hint: Bezogen auf Hinweistext", + "border: Bezogen auf den Rand" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json new file mode 100644 index 00000000..f84e35c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_en_US.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Input Box", + "info": "A component for input, with complex properties. Can specify controller, text style, decoration, line limit, cursor style, etc. Receives input change, input completion, and other events.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Text Style 【TextStyle】", + "【decoration】 : Decoration 【InputDecoration】", + "【onEditingComplete】 : Input Completion Event 【Function()】", + "【onSubmitted】 : Submission Event 【Function(String)】", + "【onChanged】 : Input Event 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Line Number and Cursor of TextField", + "desc": [ + "【minLines】 : Minimum Lines 【int】", + "【maxLines】 : Maximum Lines 【int】", + "【cursorRadius】 : Cursor Radius 【Radius】", + "【cursorColor】 : Cursor Color 【Color】", + "【cursorWidth】 : Cursor Width 【double】", + "【showCursor】 : Whether to Show Cursor 【bool】", + "【autofocus】 : Auto Focus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Complex Decoration of Decoration", + "desc": [ + "InputDecoration has many decoration points, corresponding to the code:", + "border: Border related", + "helper: Bottom left corner related hints", + "counter: Bottom right corner related hints", + "prefix: Innermost left side of the input box", + "suffix: Innermost right side of the input box", + "label: Text when no focus", + "label: Text when no focus", + "hint: Hint text related", + "border: Border related" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json new file mode 100644 index 00000000..90168ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_es_ES.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo de texto", + "info": "Componente de entrada con propiedades complejas. Puede especificar controladores, estilos de texto, decoraciones de línea, límites de líneas, estilos de cursor, etc. Recibe eventos de cambio de entrada, finalización de entrada, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextField", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【style】 : Estilo de texto 【TextStyle】", + "【decoration】 : Decoración de línea 【InputDecoration】", + "【onEditingComplete】 : Evento de finalización de entrada 【Function()】", + "【onSubmitted】 : Evento de envío 【Function(String)】", + "【onChanged】 : Evento de entrada 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Número de líneas y cursor de TextField", + "desc": [ + "【minLines】 : Número mínimo de líneas 【int】", + "【maxLines】 : Número máximo de líneas 【int】", + "【cursorRadius】 : Radio del cursor 【Radius】", + "【cursorColor】 : Color del cursor 【Color】", + "【cursorWidth】 : Ancho del cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Enfoque automático 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decoración compleja de decoration", + "desc": [ + "InputDecoration tiene muchos puntos de decoración, consulte el código para los detalles:", + "border: Relacionado con el borde", + "helper: Sugerencia en la esquina inferior izquierda", + "counter: Sugerencia en la esquina inferior derecha", + "prefix: Interior del campo de texto, extremo izquierdo", + "suffix: Interior del campo de texto, extremo derecho", + "label: Texto sin foco", + "label: Texto sin foco", + "hint: Relacionado con el texto de sugerencia", + "border: Relacionado con el borde" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json new file mode 100644 index 00000000..f612657e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_fr_FR.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Champ de saisie", + "info": "Composant pour la saisie, possédant des propriétés complexes. Peut spécifier un contrôleur, un style de texte, une décoration de ligne, une limite de lignes, un style de curseur, etc. Reçoit des événements de changement de saisie, de saisie terminée, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextField", + "desc": [ + "【controller】 : Contrôleur 【TextEditingController】", + "【style】 : Style de texte 【TextStyle】", + "【decoration】 : Décoration de ligne 【InputDecoration】", + "【onEditingComplete】 : Événement de saisie terminée 【Function()】", + "【onSubmitted】 : Événement de soumission 【Function(String)】", + "【onChanged】 : Événement de saisie 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Nombre de lignes et curseur de TextField", + "desc": [ + "【minLines】 : Nombre minimal de lignes 【int】", + "【maxLines】 : Nombre maximal de lignes 【int】", + "【cursorRadius】 : Rayon du curseur 【Radius】", + "【cursorColor】 : Couleur du curseur 【Color】", + "【cursorWidth】 : Largeur du curseur 【double】", + "【showCursor】 : Afficher le curseur 【bool】", + "【autofocus】 : Mise au point automatique 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Décoration complexe de InputDecoration", + "desc": [ + "InputDecoration a de nombreux points de décoration, voir le code pour les détails:", + "border: Relatif à la bordure", + "helper: Indication en bas à gauche", + "counter: Indication en bas à droite", + "prefix: Partie la plus à gauche à l'intérieur du champ de saisie", + "suffix: Partie la plus à droite à l'intérieur du champ de saisie", + "label: Texte sans focus", + "label: Texte sans focus", + "hint: Relatif au texte d'indication", + "border: Relatif à la bordure" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json new file mode 100644 index 00000000..87050f76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_it_IT.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo di testo", + "info": "Componente per l'input, con proprietà complesse. Puoi specificare il controller, lo stile del testo, la decorazione della linea, il limite di righe, lo stile del cursore, ecc. Riceve eventi di cambiamento dell'input, completamento dell'input, ecc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di TextField", + "desc": [ + "【controller】 : Controller 【TextEditingController】", + "【style】 : Stile del testo 【TextStyle】", + "【decoration】 : Decorazione della linea 【InputDecoration】", + "【onEditingComplete】 : Evento di completamento dell'input 【Function()】", + "【onSubmitted】 : Evento di invio 【Function(String)】", + "【onChanged】 : Evento di input 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Numero di righe e cursore di TextField", + "desc": [ + "【minLines】 : Numero minimo di righe 【int】", + "【maxLines】 : Numero massimo di righe 【int】", + "【cursorRadius】 : Raggio del cursore 【Radius】", + "【cursorColor】 : Colore del cursore 【Color】", + "【cursorWidth】 : Larghezza del cursore 【double】", + "【showCursor】 : Mostrare il cursore 【bool】", + "【autofocus】 : Autofocus 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decorazione complessa di decoration", + "desc": [ + "InputDecoration ha molti punti di decorazione, i dettagli sono nel codice:", + "border: Relativo al bordo", + "helper: Suggerimento nell'angolo inferiore sinistro", + "counter: Suggerimento nell'angolo inferiore destro", + "prefix: Parte più interna a sinistra del campo di input", + "suffix: Parte più interna a destra del campo di input", + "label: Testo senza focus", + "label: Testo senza focus", + "hint: Relativo al testo di suggerimento", + "border: Relativo al bordo" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json new file mode 100644 index 00000000..a77554df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ja_JP.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "入力欄", + "info": "入力用のコンポーネントで、複雑な属性を持っています。コントローラー、テキストスタイル、装飾線、行数制限、カーソルスタイルなどを指定できます。入力の変化、入力完了などのイベントを受け取ります。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFieldの基本使用法", + "desc": [ + "【controller】 : コントローラー 【TextEditingController】", + "【style】 : テキストスタイル 【TextStyle】", + "【decoration】 : 装飾線 【InputDecoration】", + "【onEditingComplete】 : 入力完了イベント 【Function()】", + "【onSubmitted】 : 送信イベント 【Function(String)】", + "【onChanged】 : 入力イベント 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextFieldの行数とカーソル", + "desc": [ + "【minLines】 : 最小行数 【int】", + "【maxLines】 : 最大行数 【int】", + "【cursorRadius】 : カーソルの半径 【Radius】", + "【cursorColor】 : カーソルの色 【Color】", + "【cursorWidth】 : カーソルの幅 【double】", + "【showCursor】 : カーソルを表示するかどうか 【bool】", + "【autofocus】 : 自動フォーカス 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decorationの複雑な装飾", + "desc": [ + "InputDecorationには非常に多くの装飾ポイントがあり、コードに対応する装飾があります:", + "border: ボーダー関連", + "helper: 左下のヒント関連", + "counter: 右下のヒント関連", + "prefix: 入力欄の内部最左側", + "suffix: 入力欄の内部最右側", + "label: フォーカスがない時のテキスト", + "label: フォーカスがない時のテキスト", + "hint: ヒントテキスト関連", + "border: ボーダー関連" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json new file mode 100644 index 00000000..0f27e08e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ko_KR.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "입력 필드", + "info": "입력을 위한 컴포넌트로, 복잡한 속성을 가지고 있습니다. 컨트롤러, 텍스트 스타일, 장식선, 줄 수 제한, 커서 스타일 등을 지정할 수 있습니다. 입력 변경, 입력 완료 등의 이벤트를 받습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextField 기본 사용법", + "desc": [ + "【controller】 : 컨트롤러 【TextEditingController】", + "【style】 : 텍스트 스타일 【TextStyle】", + "【decoration】 : 장식선 【InputDecoration】", + "【onEditingComplete】 : 입력 완료 이벤트 【Function()】", + "【onSubmitted】 : 제출 이벤트 【Function(String)】", + "【onChanged】 : 입력 이벤트 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "TextField 줄 수와 커서", + "desc": [ + "【minLines】 : 최소 줄 수 【int】", + "【maxLines】 : 최대 줄 수 【int】", + "【cursorRadius】 : 커서 반지름 【Radius】", + "【cursorColor】 : 커서 색상 【Color】", + "【cursorWidth】 : 커서 너비 【double】", + "【showCursor】 : 커서 표시 여부 【bool】", + "【autofocus】 : 자동 포커스 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "decoration의 복잡한 장식", + "desc": [ + "InputDecoration에는 매우 많은 장식점이 있으며, 해당 장식점은 코드를 참조하세요:", + "border: 테두리 관련", + "helper: 왼쪽 하단 관련 힌트", + "counter: 오른쪽 하단 관련 힌트", + "prefix: 입력 필드 내부 가장 왼쪽", + "suffix: 입력 필드 내부 가장 오른쪽", + "label: 포커스 없을 때의 텍스트", + "label: 포커스 없을 때의 텍스트", + "hint: 힌트 텍스트 관련", + "border: 테두리 관련" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json new file mode 100644 index 00000000..76c04b01 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_pt_PT.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Campo de entrada", + "info": "Componente para entrada de dados, possui propriedades complexas. Pode especificar controlador, estilo de texto, decoração de linha, limite de linhas, estilo do cursor, etc. Recebe eventos de mudança de entrada, conclusão de entrada, etc.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do TextField", + "desc": [ + "【controller】 : Controlador 【TextEditingController】", + "【style】 : Estilo de texto 【TextStyle】", + "【decoration】 : Decoração de linha 【InputDecoration】", + "【onEditingComplete】 : Evento de conclusão de entrada 【Function()】", + "【onSubmitted】 : Evento de submissão 【Function(String)】", + "【onChanged】 : Evento de entrada 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Número de linhas e cursor do TextField", + "desc": [ + "【minLines】 : Número mínimo de linhas 【int】", + "【maxLines】 : Número máximo de linhas 【int】", + "【cursorRadius】 : Raio do cursor 【Radius】", + "【cursorColor】 : Cor do cursor 【Color】", + "【cursorWidth】 : Largura do cursor 【double】", + "【showCursor】 : Mostrar cursor 【bool】", + "【autofocus】 : Foco automático 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Decoração complexa do decoration", + "desc": [ + "InputDecoration tem muitos pontos de decoração, correspondentes ao código:", + "border: Relacionado à borda", + "helper: Dica relacionada ao canto inferior esquerdo", + "counter: Dica relacionada ao canto inferior direito", + "prefix: Extremidade esquerda interna do campo de entrada", + "suffix: Extremidade direita interna do campo de entrada", + "label: Texto sem foco", + "label: Texto sem foco", + "hint: Texto de dica relacionado", + "border: Relacionado à borda" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json new file mode 100644 index 00000000..fc395008 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextField/desc_ru_RU.json @@ -0,0 +1,52 @@ +{ + "id": 54, + "name": "TextField", + "localName": "Поле ввода", + "info": "Компонент для ввода, обладающий сложными свойствами. Можно указать контроллер, стиль текста, декоративные линии, ограничение на количество строк, стиль курсора и т.д. Получает события изменения ввода, завершения ввода и т.д.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextField", + "desc": [ + "【controller】 : Контроллер 【TextEditingController】", + "【style】 : Стиль текста 【TextStyle】", + "【decoration】 : Декоративные линии 【InputDecoration】", + "【onEditingComplete】 : Событие завершения ввода 【Function()】", + "【onSubmitted】 : Событие отправки 【Function(String)】", + "【onChanged】 : Событие ввода 【Function(String)】" + ] + }, + { + "file": "node2_cursor.dart", + "name": "Количество строк и курсор в TextField", + "desc": [ + "【minLines】 : Минимальное количество строк 【int】", + "【maxLines】 : Максимальное количество строк 【int】", + "【cursorRadius】 : Радиус курсора 【Radius】", + "【cursorColor】 : Цвет курсора 【Color】", + "【cursorWidth】 : Ширина курсора 【double】", + "【showCursor】 : Показывать ли курсор 【bool】", + "【autofocus】 : Автоматическая фокусировка 【bool】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Сложные декорации в decoration", + "desc": [ + "InputDecoration имеет множество точек декорации, соответствующие элементы см. в коде:", + "border: Связано с границами", + "helper: Подсказка в нижнем левом углу", + "counter: Подсказка в нижнем правом углу", + "prefix: Самая левая часть внутри поля ввода", + "suffix: Самая правая часть внутри поля ввода", + "label: Текст без фокуса", + "label: Текст без фокуса", + "hint: Связано с подсказкой", + "border: Связано с границами" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json new file mode 100644 index 00000000..a44d1a43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Textformularfeld", + "info": "Die Eigenschaften sind im Wesentlichen dieselben wie bei TextField, zusätzlich gibt es Validierungs- und Rückruffunktionen für die Felder. Der FormState-save löst den onSaved-Rückruf aus.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TextFormField", + "desc": [ + "Die grundlegenden Eigenschaften sind identisch mit TextField, siehe dort für Details", + "【validator】: Validierungsfunktion 【FormFieldValidator】", + "【onFieldSubmitted】: Einreichungsrückruf 【ValueChanged】", + "【onSaved】: Rückruf beim Speichern des Formulars 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json new file mode 100644 index 00000000..caa91b5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Text Form Input", + "info": "The properties are basically the same as TextField, with the addition of field validation and submission callbacks. The save of FormState will trigger the onSaved callback.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TextFormField", + "desc": [ + "The basic properties are the same as TextField, see details there", + "【validator】: Validation function 【FormFieldValidator】", + "【onFieldSubmitted】: Submission callback 【ValueChanged】", + "【onSaved】: Callback when the form is saved 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json new file mode 100644 index 00000000..d7d1c29d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo de entrada de texto", + "info": "Básicamente es igual a las propiedades de TextField, con la adición de validación de campo y devolución de llamada de envío. El save de FormState activará la devolución de llamada onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TextFormField", + "desc": [ + "Las propiedades básicas son las mismas que las de TextField, consulte los detalles", + "【validator】 : Función de validación 【FormFieldValidator 】", + "【onFieldSubmitted】 : Devolución de llamada de envío 【ValueChanged】", + "【onSaved】 : Devolución de llamada cuando se guarda el formulario 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json new file mode 100644 index 00000000..100a2351 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Champ de formulaire de texte", + "info": "Les propriétés sont fondamentalement les mêmes que celles de TextField, avec en plus des validations de champ et des rappels de soumission. Le save de FormState déclenche le rappel onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TextFormField", + "desc": [ + "Les propriétés de base sont les mêmes que celles de TextField, voir les détails", + "【validator】 : Fonction de validation 【FormFieldValidator 】", + "【onFieldSubmitted】 : Rappel de soumission 【ValueChanged】", + "【onSaved】 : Rappel lors de la sauvegarde du formulaire 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json new file mode 100644 index 00000000..3c20c0b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo di input di testo", + "info": "Le proprietà sono fondamentalmente le stesse di TextField, con l'aggiunta di callback per la validazione e l'invio dei campi. Il save di FormState attiverà la callback onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TextFormField", + "desc": [ + "Le proprietà di base sono le stesse di TextField, vedi dettagli", + "【validator】 : funzione di validazione 【FormFieldValidator 】", + "【onFieldSubmitted】 : callback di invio 【ValueChanged】", + "【onSaved】 : callback quando il modulo viene salvato 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json new file mode 100644 index 00000000..d1909f13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "テキストフォーム入力", + "info": "TextFieldの属性と基本的に同じで、それに基づいてフィールドの検証と送信のコールバックが追加されています。FormStateのsaveはonSavedコールバックをトリガーします。", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormFieldの基本使用", + "desc": [ + "基本属性はTextFieldと一致します。詳細はそちらをご覧ください", + "【validator】 : 検証関数 【FormFieldValidator 】", + "【onFieldSubmitted】 : 送信コールバック 【ValueChanged】", + "【onSaved】 : フォームsave時のコールバック 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json new file mode 100644 index 00000000..01894f41 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "텍스트 폼 입력", + "info": "TextField 속성과 기본적으로 동일하며, 여기에 필드 검증 및 제출 콜백이 추가되었습니다. FormState의 save는 onSaved 콜백을 트리거합니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TextFormField 기본 사용", + "desc": [ + "기본 속성은 TextField와 동일하며, 자세한 내용은 해당 항목을 참조하세요", + "【validator】 : 검증 함수 【FormFieldValidator 】", + "【onFieldSubmitted】 : 제출 콜백 【ValueChanged】", + "【onSaved】 : 폼 save 시 콜백 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json new file mode 100644 index 00000000..b70a87a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Campo de Entrada de Texto", + "info": "As propriedades são basicamente as mesmas que o TextField, com a adição de validação de campo e callbacks de envio. O save do FormState irá acionar o callback onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TextFormField", + "desc": [ + "As propriedades básicas são as mesmas que o TextField, consulte-o para mais detalhes", + "【validator】: Função de validação 【FormFieldValidator】", + "【onFieldSubmitted】: Callback de envio 【ValueChanged】", + "【onSaved】: Callback quando o formulário é salvo 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json new file mode 100644 index 00000000..47b202b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TextFormField/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 199, + "name": "TextFormField", + "localName": "Текстовое поле формы", + "info": "Свойства аналогичны TextField, с добавлением проверки поля и обратного вызова отправки. Сохранение FormState вызовет обратный вызов onSaved.", + "lever": 4, + "family": 1, + "linkIds": [ + 54, + 198 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TextFormField", + "desc": [ + "Основные свойства аналогичны TextField, подробнее см. там", + "【validator】 : Функция проверки 【FormFieldValidator 】", + "【onFieldSubmitted】 : Обратный вызов отправки 【ValueChanged】", + "【onSaved】 : Обратный вызов при сохранении формы 【FormFieldSetter】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json new file mode 100644 index 00000000..36f681f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Timer-Modus", + "info": "Deaktiviert/Aktiviert den Timer (Ticker) des Unterbaums, der Animationscontroller basiert auf Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Animation einheitlich deaktivieren/aktivieren", + "desc": [ + "Das enabled von TickerMode kann die Animationseffekte des Unterbaums einheitlich aktivieren/deaktivieren." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json new file mode 100644 index 00000000..a1a0961e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Timer Mode", + "info": "Enable/disable the timer (Ticker) for the subtree, the animation controller is implemented based on Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Unified Enable/Disable Animation", + "desc": [ + "The enabled property of TickerMode can uniformly enable/disable the animation effects of the subtree." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json new file mode 100644 index 00000000..d5b3baf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modo Ticker", + "info": "Deshabilitar/habilitar el Ticker del subárbol, el controlador de animación se basa en Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Deshabilitar/Habilitar Animación Unificada", + "desc": [ + "El enabled de TickerMode puede habilitar/deshabilitar uniformemente los efectos de animación del subárbol." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json new file mode 100644 index 00000000..04167417 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Mode Ticker", + "info": "Activer/Désactiver le Ticker du sous-arbre, le contrôleur d'animation est basé sur Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Activer/Désactiver l'animation de manière uniforme", + "desc": [ + "Le paramètre enabled de TickerMode peut activer/désactiver de manière uniforme les effets d'animation du sous-arbre." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json new file mode 100644 index 00000000..1c5b2323 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modalità Timer", + "info": "Disabilita/abilita il timer (Ticker) del sottoalbero, il controller di animazione è basato su Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Disabilita/Abilita Animazione Unificata", + "desc": [ + "L'attributo enabled di TickerMode può abilitare/disabilitare in modo unificato gli effetti di animazione del sottoalbero." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json new file mode 100644 index 00000000..2cd5ca73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "タイカーモード", + "info": "サブツリーのタイマー(Ticker)を無効/有効にします。アニメーションコントローラーは Ticker に基づいて実装されています。", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "アニメーションの一括無効/有効", + "desc": [ + "TickerMode の enabled は、サブツリーのアニメーション効果を一括して有効/無効にすることができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json new file mode 100644 index 00000000..f6520841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "타이머 모드", + "info": "서브트리의 타이머(Ticker)를 비활성화/활성화합니다. 애니메이션 컨트롤러는 Ticker를 기반으로 구현됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "통합 비활성화/활성화 애니메이션", + "desc": [ + "TickerMode의 enabled는 서브트리의 애니메이션 효과를 통합적으로 활성화/비활성화할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json new file mode 100644 index 00000000..4eae5689 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Modo de Temporizador", + "info": "Desativar/ativar o temporizador (Ticker) da subárvore, o controlador de animação é implementado com base no Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Desativar/Ativar Animação Uniformemente", + "desc": [ + "O enabled do TickerMode pode ativar/desativar uniformemente os efeitos de animação da subárvore." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json new file mode 100644 index 00000000..25a8a650 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TickerMode/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 246, + "name": "TickerMode", + "localName": "Режим таймера", + "info": "Отключить/включить таймер (Ticker) для поддерева, контроллер анимации реализован на основе Ticker.", + "lever": 2, + "family": 1, + "linkIds": [ + 346 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Единое отключение/включение анимации", + "desc": [ + "Свойство enabled TickerMode позволяет единообразно включить/отключить анимацию для поддерева." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json new file mode 100644 index 00000000..47c9c3c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Hinweiswerkzeug", + "info": "Eine Komponente zur Anzeige von Hinweistexten, die bei längerem Drücken Informationen anzeigt. Kann Rand, Anzeigedauer, Textstil und Dekorationseigenschaften festlegen.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Tooltip", + "desc": [ + "【preferBelow】 : Bevorzugt unten 【bool】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【message】 : Nachrichteninhalt 【String】", + "【showDuration】 : Anzeigedauer 【Duration】", + "【waitDuration】 : Schwebeerscheinungszeit 【Duration】", + "【child】 : Kind 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Dekoration von Tooltip", + "desc": [ + "【decoration】 : Dekorationsobjekt 【Decoration】", + "【textStyle】 : Textstil 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json new file mode 100644 index 00000000..1d33e3c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Tooltip", + "info": "A component that displays tooltip information, showing the information when long-pressed. You can specify margins, display duration, text style, and decoration properties.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Tooltip", + "desc": [ + "【preferBelow】: Whether to prefer below 【bool】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【margin】: Margin 【EdgeInsetsGeometry】", + "【message】: Message content 【String】", + "【showDuration】: Display duration 【Duration】", + "【waitDuration】: Hover appearance time 【Duration】", + "【child】: Child 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoration of Tooltip", + "desc": [ + "【decoration】: Decoration object 【Decoration】", + "【textStyle】: Text style 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json new file mode 100644 index 00000000..c631b386 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Herramienta de sugerencia", + "info": "Componente para mostrar información de sugerencia, muestra información al mantener presionado. Se pueden especificar márgenes, duración de visualización, estilo de texto, propiedades de decoración.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Tooltip", + "desc": [ + "【preferBelow】 : ¿Prefiere abajo? 【bool】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【margin】 : Margen externo 【EdgeInsetsGeometry】", + "【message】 : Contenido del mensaje 【String】", + "【showDuration】 : Duración de la visualización 【Duration】", + "【waitDuration】 : Tiempo de aparición al flotar 【Duration】", + "【child】 : Hijo 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoración de Tooltip", + "desc": [ + "【decoration】 : Objeto de decoración 【Decoration】", + "【textStyle】 : Estilo de texto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json new file mode 100644 index 00000000..6eb37d21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Info-bulle", + "info": "Composant pour afficher des informations d'aide, affiche les informations lors d'un appui long. Peut spécifier les marges, la durée d'affichage, le style du texte, les propriétés de décoration, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Tooltip", + "desc": [ + "【preferBelow】 : Préfère en dessous 【bool】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【message】 : Contenu du message 【String】", + "【showDuration】 : Durée d'affichage 【Duration】", + "【waitDuration】 : Temps d'apparition au survol 【Duration】", + "【child】 : Enfant 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Décoration de Tooltip", + "desc": [ + "【decoration】 : Objet de décoration 【Decoration】", + "【textStyle】 : Style du texte 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json new file mode 100644 index 00000000..6467bfe4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Strumento di suggerimento", + "info": "Componente per visualizzare informazioni di suggerimento, mostra le informazioni quando viene premuto a lungo. È possibile specificare margini, durata di visualizzazione, stile del testo, proprietà delle luci decorative.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Tooltip", + "desc": [ + "【preferBelow】 : Preferenza per la posizione inferiore 【bool】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【margin】 : Spaziatura esterna 【EdgeInsetsGeometry】", + "【message】 : Contenuto del messaggio 【String】", + "【showDuration】 : Durata della visualizzazione 【Duration】", + "【waitDuration】 : Tempo di comparsa al passaggio del mouse 【Duration】", + "【child】 : Figlio 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decorazione di Tooltip", + "desc": [ + "【decoration】 : Oggetto di decorazione 【Decoration】", + "【textStyle】 : Stile del testo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json new file mode 100644 index 00000000..4e0713fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "ツールチップ", + "info": "ヒント情報を表示するためのコンポーネントで、長押しすると情報が表示されます。余白、表示時間、テキストスタイル、装飾などの属性を指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltipの基本使用", + "desc": [ + "【preferBelow】 : 下方を優先するか 【bool】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【message】 : メッセージ内容 【String】", + "【showDuration】 : 表示時間 【Duration】", + "【waitDuration】 : ホバーして表示されるまでの時間 【Duration】", + "【child】 : 子 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltipの装飾", + "desc": [ + "【decoration】 : 装飾オブジェクト 【Decoration】", + "【textStyle】 : テキストスタイル 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json new file mode 100644 index 00000000..8b98ca5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "툴팁", + "info": "툴팁 정보를 표시하는 컴포넌트로, 길게 누를 때 정보를 표시합니다. 여백, 표시 시간, 텍스트 스타일, 장식 속성 등을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tooltip 기본 사용", + "desc": [ + "【preferBelow】 : 아래쪽을 우선할지 여부 【bool】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【message】 : 메시지 내용 【String】", + "【showDuration】 : 표시 시간 【Duration】", + "【waitDuration】 : 나타나는 시간 【Duration】", + "【child】 : 자식 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Tooltip의 장식", + "desc": [ + "【decoration】 : 장식 객체 【Decoration】", + "【textStyle】 : 텍스트 스타일 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json new file mode 100644 index 00000000..f2239a7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Ferramenta de Dica", + "info": "Componente que exibe informações de dica, exibindo informações ao pressionar e segurar. Pode especificar margens, duração de exibição, estilo de texto, propriedades de decoração, etc.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Tooltip", + "desc": [ + "【preferBelow】 : Preferir abaixo 【bool】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】", + "【margin】 : Margem externa 【EdgeInsetsGeometry】", + "【message】 : Conteúdo da mensagem 【String】", + "【showDuration】 : Duração da exibição 【Duration】", + "【waitDuration】 : Tempo de aparecimento ao pairar 【Duration】", + "【child】 : Filho 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Decoração do Tooltip", + "desc": [ + "【decoration】 : Objeto de decoração 【Decoration】", + "【textStyle】 : Estilo de texto 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json new file mode 100644 index 00000000..e535f7ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/Tooltip/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 50, + "name": "Tooltip", + "localName": "Всплывающая подсказка", + "info": "Компонент для отображения всплывающих подсказок, информация отображается при длительном нажатии. Можно указать отступы, время отображения, стиль текста, свойства декорации.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Tooltip", + "desc": [ + "【preferBelow】 : Предпочтительно снизу 【bool】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【margin】 : Внешние отступы 【EdgeInsetsGeometry】", + "【message】 : Содержание сообщения 【String】", + "【showDuration】 : Время отображения 【Duration】", + "【waitDuration】 : Время появления при наведении 【Duration】", + "【child】 : Дочерний элемент 【Widget】" + ] + }, + { + "file": "node2_decoration.dart", + "name": "Декорация Tooltip", + "desc": [ + "【decoration】 : Объект декорации 【Decoration】", + "【textStyle】 : Стиль текста 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json new file mode 100644 index 00000000..8e819173 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Tween-Animation Builder", + "info": "Verwendet den Tween-Interpolator, um Animationen für verwandte Eigenschaften zu erstellen, und führt über den Builder lokale Builds durch, um den Aktualisierungsbereich zu reduzieren. Benötigt keinen benutzerdefinierten Animator, kann Animationsdauer, Kurve und Endrückruf angeben.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder Anwendungsbeispiel", + "desc": [ + "【tween】 : *Interpolator 【Tween】", + "【duration】 : *Dauer 【Duration】", + "【builder】 : *Builder 【ValueWidgetBuilder】", + "【curve】 : Animationskurve 【Curve】", + "【onEnd】 : Endrückruf 【VoidCallback】", + "【child】 : Kindkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json new file mode 100644 index 00000000..0a142ac1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Tween Animation Builder", + "info": "Animates related properties through the Tween, and performs partial builds through the builder to reduce the refresh scope. No need for custom animators, you can specify animation duration, curve, and end callback.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder Usage Example", + "desc": [ + "【tween】 : *Tween 【Tween】", + "【duration】 : *Duration 【Duration】", + "【builder】 : *Builder 【ValueWidgetBuilder】", + "【curve】 : Animation Curve 【Curve】", + "【onEnd】 : End Callback 【VoidCallback】", + "【child】 : Child Widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json new file mode 100644 index 00000000..ea4cb852 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Constructor de animación de interpolación", + "info": "Realiza una animación de interpolación en las propiedades relacionadas a través del interpolador Tween, y construye parcialmente a través del builder para reducir el alcance de la actualización. No es necesario un animador personalizado, se puede especificar la duración de la animación, la curva y la devolución de llamada al finalizar.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ejemplo de uso de TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolador 【Tween】", + "【duration】 : *duración 【Duration】", + "【builder】 : *constructor 【ValueWidgetBuilder】", + "【curve】 : curva de animación 【Curve】", + "【onEnd】 : devolución de llamada al finalizar 【VoidCallback】", + "【child】 : componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json new file mode 100644 index 00000000..4fb05263 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Constructeur d'animation par interpolation", + "info": "Utilise un interpolateur Tween pour animer les propriétés associées, et utilise un builder pour une construction partielle, réduisant ainsi la portée du rafraîchissement. Ne nécessite pas de personnalisation de l'animateur, permet de spécifier la durée de l'animation, la courbe, et le rappel de fin.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemple d'utilisation de TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolateur 【Tween】", + "【duration】 : *durée 【Duration】", + "【builder】 : *constructeur 【ValueWidgetBuilder】", + "【curve】 : courbe d'animation 【Curve】", + "【onEnd】 : rappel de fin 【VoidCallback】", + "【child】 : composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json new file mode 100644 index 00000000..cefd525a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Costruttore di animazione a interpolazione", + "info": "Esegue un'animazione a interpolazione sulle proprietà correlate tramite l'interpolatore Tween, costruendo localmente tramite il builder per ridurre l'ambito di aggiornamento. Non è necessario un animatore personalizzato, è possibile specificare la durata dell'animazione, la curva e il callback di fine.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Esempio di utilizzo di TweenAnimationBuilder", + "desc": [ + "【tween】 : *interpolatore 【Tween】", + "【duration】 : *durata 【Duration】", + "【builder】 : *costruttore 【ValueWidgetBuilder】", + "【curve】 : curva di animazione 【Curve】", + "【onEnd】 : callback di fine 【VoidCallback】", + "【child】 : componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json new file mode 100644 index 00000000..487e035d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "トゥイーンアニメーションビルダー", + "info": "トゥイーンを使用して関連するプロパティのアニメーションを行い、ビルダーを使用して部分的な構築を行い、更新範囲を減らします。カスタムアニメーターは不要で、アニメーションの時間、曲線、終了コールバックを指定できます。", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 使用例", + "desc": [ + "【tween】 : *トゥイーン 【Tween】", + "【duration】 : *時間 【Duration】", + "【builder】 : *ビルダー 【ValueWidgetBuilder】", + "【curve】 : アニメーション曲線 【Curve】", + "【onEnd】 : 終了コールバック 【VoidCallback】", + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json new file mode 100644 index 00000000..29440f4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "트윈 애니메이션 빌더", + "info": "트윈을 사용하여 관련 속성에 대한 애니메이션을 생성하고, 빌더를 통해 부분적으로 빌드하여 새로고침 범위를 줄입니다. 사용자 정의 애니메이터가 필요 없으며, 애니메이션 지속 시간, 곡선, 종료 콜백을 지정할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TweenAnimationBuilder 사용 예제", + "desc": [ + "【tween】 : *트윈 【Tween】", + "【duration】 : *지속 시간 【Duration】", + "【builder】 : *빌더 【ValueWidgetBuilder】", + "【curve】 : 애니메이션 곡선 【Curve】", + "【onEnd】 : 종료 콜백 【VoidCallback】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json new file mode 100644 index 00000000..a459fbfd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Construtor de Animação de Interpolação", + "info": "Realiza animações de interpolação nas propriedades relacionadas através do interpolador Tween, utilizando o builder para construir localmente e reduzir o escopo de atualização. Não é necessário personalizar o animador, podendo especificar a duração da animação, a curva e o callback de término.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Exemplo de uso do TweenAnimationBuilder", + "desc": [ + "【tween】 : *Interpolador 【Tween】", + "【duration】 : *Duração 【Duration】", + "【builder】 : *Construtor 【ValueWidgetBuilder】", + "【curve】 : Curva de animação 【Curve】", + "【onEnd】 : Callback de término 【VoidCallback】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f9fac07e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/TweenAnimationBuilder/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 226, + "name": "TweenAnimationBuilder", + "localName": "Построитель анимации с интерполяцией", + "info": "Анимация свойств через интерполятор Tween, локальное построение через builder для уменьшения области обновления. Не требует пользовательского аниматора, позволяет указать длительность анимации, кривую и обратный вызов по завершению.", + "lever": 3, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Пример использования TweenAnimationBuilder", + "desc": [ + "【tween】 : *интерполятор 【Tween】", + "【duration】 : *длительность 【Duration】", + "【builder】 : *построитель 【ValueWidgetBuilder】", + "【curve】 : кривая анимации 【Curve】", + "【onEnd】 : обратный вызов по завершению 【VoidCallback】", + "【child】 : дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json new file mode 100644 index 00000000..545a7973 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Verlauf rückgängig machen", + "info": "Empfängt einen ValueNotifier, um den Wert zu überwachen und bietet die Funktionen Rückgängig/Wiederholen für diesen Wert; wird in der Quellcode der TextField-Komponente verwendet.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Verwendung von UndoHistory in TextField", + "desc": [ + "In diesem Beispiel wird die Rückgängig/Wiederholen-Funktion von TextField über eine externe Schaltfläche gesteuert. Der Parameter undoController kann ein UndoHistoryController-Objekt übernehmen, um den eingegebenen Textinhalt zu steuern und zu beeinflussen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json new file mode 100644 index 00000000..c50f8921 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Undo History", + "info": "Receives ValueNotifier to listen to the value, providing undo/redo functionality for that value; used in the source code of the TextField component.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Using UndoHistory in TextField", + "desc": [ + "In this example, the undo/redo functionality of the TextField is controlled via an external button. The undoController parameter can be passed an UndoHistoryController object to control and influence the input text content." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json new file mode 100644 index 00000000..f3138ef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Historial de Deshacer", + "info": "Recibe un ValueNotifier para escuchar valores, proporcionando funcionalidad de deshacer/rehacer para ese valor; utilizado en el código fuente del componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Uso de UndoHistory en TextField", + "desc": [ + "En este caso, se controla la funcionalidad de deshacer/rehacer del TextField mediante un botón externo. El parámetro undoController puede recibir un objeto UndoHistoryController, utilizado para controlar y afectar el contenido del texto ingresado." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json new file mode 100644 index 00000000..a20fcbca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Historique d'annulation", + "info": "Reçoit une valeur observable ValueNotifier et fournit des fonctionnalités d'annulation/réexécution pour cette valeur ; utilisé dans le code source du composant TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilisation d'UndoHistory dans TextField", + "desc": [ + "Dans cet exemple, un bouton externe est utilisé pour contrôler les fonctionnalités d'annulation/réexécution de TextField. Le paramètre undoController peut recevoir un objet UndoHistoryController pour contrôler et influencer le contenu du texte saisi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json new file mode 100644 index 00000000..563747f8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Cronologia Annulla", + "info": "Riceve un ValueNotifier per valori osservabili, fornendo funzionalità di annullamento/ripetizione per tale valore; utilizzato nel codice sorgente del componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Utilizzo di UndoHistory in TextField", + "desc": [ + "In questo caso, attraverso un pulsante esterno, si controlla la funzione di annullamento/ripetizione di TextField. Il parametro undoController può essere passato come oggetto UndoHistoryController, utilizzato per controllare e influenzare il contenuto del testo inserito." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json new file mode 100644 index 00000000..628a2393 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "取り消し履歴", + "info": "ValueNotifierの監視可能な値を受け取り、その値に取り消し/やり直し機能を提供します;TextFieldコンポーネントのソースコードで使用されています。", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextFieldでのUndoHistoryの使用", + "desc": [ + "このケースでは、外部ボタンを使用してTextFieldの取り消し/やり直し機能を制御します。undoControllerパラメータにUndoHistoryControllerオブジェクトを渡すことができ、入力テキストの内容を制御および影響を与えるために使用されます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json new file mode 100644 index 00000000..f8524478 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "실행 취소 기록", + "info": "ValueNotifier를 통해 값을 감지하고, 해당 값에 대해 실행 취소/다시 실행 기능을 제공합니다; TextField 컴포넌트 소스 코드에서 사용됩니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "TextField에서 UndoHistory 사용", + "desc": [ + "이 예제에서는 외부 버튼을 통해 TextField의 실행 취소/다시 실행 기능을 제어합니다. undoController 매개변수에 UndoHistoryController 객체를 전달하여 입력 텍스트 내용을 제어하고 영향을 줄 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json new file mode 100644 index 00000000..c1ee62f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "Histórico de Desfazer", + "info": "Recebe um ValueNotifier para monitorar valores, fornecendo funcionalidades de desfazer/refazer para esse valor; utilizado no código-fonte do componente TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Usando UndoHistory no TextField", + "desc": [ + "Neste exemplo, um botão externo é usado para controlar as funcionalidades de desfazer/refazer do TextField. O parâmetro undoController pode receber um objeto UndoHistoryController, que é usado para controlar e influenciar o conteúdo do texto inserido." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json new file mode 100644 index 00000000..e1aeecc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UndoHistory/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 241, + "name": "UndoHistory", + "localName": "История отмены", + "info": "Принимает ValueNotifier для отслеживания значений и предоставляет функциональность отмены/повтора для этого значения; используется в исходном коде компонента TextField.", + "lever": 2, + "family": 1, + "linkIds": [ + 54 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Использование UndoHistory в TextField", + "desc": [ + "В этом примере с помощью внешней кнопки управляется функциональность отмены/повтора в TextField. Параметр undoController может принимать объект UndoHistoryController для управления и влияния на вводимый текст." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json new file mode 100644 index 00000000..fd18752f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Einzigartige Komponente", + "info": "Abstrakte Klasse, muss einen GlobalKey zur Identifikation bereitstellen. Diese Art von Komponente wird nur als eine Instanz inflated und hat zu jedem Zeitpunkt nur einen Zustand, der über die currentState-Eigenschaft abgerufen werden kann.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in UniqueWidget", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json new file mode 100644 index 00000000..4e81b96f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Unique Component", + "info": "Abstract class, must provide a GlobalKey for identification. This type of component will only inflate one instance and will only have one state at any given time. The state can be obtained through the currentState property.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to UniqueWidget", + "desc": [ + "【child】 : Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json new file mode 100644 index 00000000..9a4178f9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Único", + "info": "Clase abstracta, debe proporcionar una GlobalKey para la identificación. Este tipo de componente solo se inflará en una instancia y solo tendrá un estado en un momento dado. El estado se puede obtener a través de la propiedad currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a UniqueWidget", + "desc": [ + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json new file mode 100644 index 00000000..276b12f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Widget Unique", + "info": "Classe abstraite, doit fournir une GlobalKey pour l'identification. Ce type de widget ne sera instancié qu'une seule fois et aura un seul état à la fois. L'état peut être obtenu via la propriété currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à UniqueWidget", + "desc": [ + "【child】 : Widget enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json new file mode 100644 index 00000000..705120b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Unico", + "info": "Classe astratta, deve fornire una GlobalKey per l'identificazione. Questo tipo di componente verrà inflato solo una volta e avrà solo uno stato alla volta. Lo stato può essere ottenuto tramite la proprietà currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a UniqueWidget", + "desc": [ + "【child】 : Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json new file mode 100644 index 00000000..956984b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "ユニークウィジェット", + "info": "抽象クラス、GlobalKeyを提供して識別する必要があります。このタイプのウィジェットは1つのインスタンスのみがinflatedされ、同時に1つの状態のみを持ちます。currentStateプロパティを通じて状態を取得できます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 紹介", + "desc": [ + "【child】 : 子ウィジェット 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json new file mode 100644 index 00000000..5b57d463 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "유니크 위젯", + "info": "추상 클래스, GlobalKey를 제공하여 식별해야 합니다. 이 유형의 위젯은 하나의 인스턴스만 inflated되며, 동시에 하나의 상태만 가질 수 있습니다. currentState 속성을 통해 상태를 가져올 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "UniqueWidget 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json new file mode 100644 index 00000000..1e73e8cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Componente Único", + "info": "Classe abstrata, deve fornecer uma GlobalKey para identificação, este tipo de componente só será inflated uma instância, e terá apenas um estado de cada vez, o estado pode ser obtido através da propriedade currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao UniqueWidget", + "desc": [ + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json new file mode 100644 index 00000000..77b6eb84 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/UniqueWidget/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 243, + "name": "UniqueWidget", + "localName": "Уникальный компонент", + "info": "Абстрактный класс, должен предоставлять GlobalKey для идентификации. Этот тип компонента будет inflated только один экземпляр, и в любой момент времени будет только одно состояние, которое можно получить через свойство currentState.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в UniqueWidget", + "desc": [ + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json new file mode 100644 index 00000000..98e60698 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Wertüberwachungs-Builder", + "info": "Kann einen Wert überwachen und bei Änderungen die Benutzeroberfläche über den Builder-Callback neu aufbauen, wodurch die Verwendung von setState zur Aktualisierung vermieden wird.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ValueListenableBuilder", + "desc": [ + "【builder】: Komponenten-Builder 【ValueWidgetBuilder】", + "【valueListenable】: Überwachungswert 【ValueListenable】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json new file mode 100644 index 00000000..8230410d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Value Listener Builder", + "info": "Can listen to a value, and when it changes, the interface can be rebuilt through the builder callback, avoiding the use of setState for refreshing.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ValueListenableBuilder", + "desc": [ + "【builder】: Component builder 【ValueWidgetBuilder】", + "【valueListenable】: Listened value 【ValueListenable】", + "【child】: Child component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json new file mode 100644 index 00000000..6597d7f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Constructor de Escucha de Valor", + "info": "Puede escuchar un valor y, cuando cambia, reconstruir la interfaz a través de la devolución de llamada del constructor, evitando el uso de setState para actualizar.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de ValueListenableBuilder", + "desc": [ + "【builder】: Constructor de componentes 【ValueWidgetBuilder】", + "【valueListenable】: Valor de escucha 【ValueListenable】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json new file mode 100644 index 00000000..44726e9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Constructeur de valeur écoutable", + "info": "Peut écouter une valeur, et lorsque celle-ci change, il peut reconstruire l'interface via un rappel builder, évitant ainsi l'utilisation de setState pour rafraîchir.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ValueListenableBuilder", + "desc": [ + "【builder】: Constructeur de composant 【ValueWidgetBuilder】", + "【valueListenable】: Valeur écoutée 【ValueListenable】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json new file mode 100644 index 00000000..4a4785b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Costruttore di ascolto del valore", + "info": "Può ascoltare un valore e, quando cambia, ricostruire l'interfaccia attraverso il callback del builder, evitando l'uso di setState per aggiornare.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di ValueListenableBuilder", + "desc": [ + "【builder】: Costruttore del componente 【ValueWidgetBuilder】", + "【valueListenable】: Valore di ascolto 【ValueListenable】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json new file mode 100644 index 00000000..21e7ccf6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "値リスナービルダー", + "info": "値を監視し、その値が変化したときにbuilderコールバックを通じてUIを再構築し、setStateを使用せずに更新を避けることができます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilderの基本使用", + "desc": [ + "【builder】: コンポーネントビルダー 【ValueWidgetBuilder】", + "【valueListenable】: 監視値 【ValueListenable】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json new file mode 100644 index 00000000..b8e33579 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "값 리스너 빌더", + "info": "값을 리스닝하고, 값이 변경될 때 builder 콜백을 통해 UI를 재구성할 수 있으며, setState를 사용하지 않고도 화면을 갱신할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ValueListenableBuilder 기본 사용법", + "desc": [ + "【builder】: 컴포넌트 빌더 【ValueWidgetBuilder】", + "【valueListenable】: 리스닝 값 【ValueListenable】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json new file mode 100644 index 00000000..2dfd9ab6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Construtor de Valor Escutável", + "info": "Pode escutar um valor e, quando ele muda, reconstruir a interface através do callback do builder, evitando o uso de setState para atualizar.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do ValueListenableBuilder", + "desc": [ + "【builder】: Construtor de Componentes 【ValueWidgetBuilder】", + "【valueListenable】: Valor Escutável 【ValueListenable】", + "【child】: Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json new file mode 100644 index 00000000..f014ac90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/ValueListenableBuilder/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 255, + "name": "ValueListenableBuilder", + "localName": "Слушатель значений", + "info": "Может отслеживать значение и перестраивать интерфейс через обратный вызов builder при его изменении, избегая использования setState для обновления.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ValueListenableBuilder", + "desc": [ + "【builder】: Конструктор компонента 【ValueWidgetBuilder】", + "【valueListenable】: Отслеживаемое значение 【ValueListenable】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json new file mode 100644 index 00000000..a428050a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Widget-Inspektor", + "info": "Diese Komponente ermöglicht es Ihnen, die Hierarchie der Unterkomponenten bequem anzuzeigen und ist eine der Funktionen des Flutter Inspector-Plugins.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des WidgetInspectors", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "【selectButtonBuilder】: *Auswahlschalter-Builder 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json new file mode 100644 index 00000000..d060acd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Widget Inspector", + "info": "This component allows you to easily view the hierarchy of child components and is one of the features of the Flutter Inspector plugin.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of WidgetInspector", + "desc": [ + "【child】 : Child component 【Widget】", + "【selectButtonBuilder】: *Select button builder 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json new file mode 100644 index 00000000..9995d77f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspector de Componentes", + "info": "Este componente te permite ver fácilmente la jerarquía de los componentes hijos, es una de las funciones del plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de WidgetInspector", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【selectButtonBuilder】: *Constructor del botón de selección 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json new file mode 100644 index 00000000..16bdc06f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspecteur de widgets", + "info": "Ce composant vous permet de visualiser facilement la structure hiérarchique des composants enfants, c'est l'une des fonctionnalités de l'extension Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de WidgetInspector", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【selectButtonBuilder】: *Constructeur de bouton de sélection 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json new file mode 100644 index 00000000..267ae04e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Ispezione dei componenti", + "info": "Questo componente ti permette di visualizzare facilmente la struttura gerarchica dei componenti figli, è una delle funzionalità del plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di WidgetInspector", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【selectButtonBuilder】: *Costruttore del pulsante di selezione 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json new file mode 100644 index 00000000..90ee326d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "ウィジェットインスペクター", + "info": "このコンポーネントは、子コンポーネントの階層構造を簡単に確認できるようにするもので、Flutter Inspectorプラグインの機能の一つです。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspectorの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【selectButtonBuilder】: *選択ボタンビルダー 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json new file mode 100644 index 00000000..d11114b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "위젯 인스펙터", + "info": "이 컴포넌트는 하위 컴포넌트 계층 구조를 쉽게 확인할 수 있게 해주며, Flutter Inspector 플러그인의 기능 중 하나입니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetInspector 기본 사용법", + "desc": [ + "【child】 : 하위 컴포넌트 【Widget】", + "【selectButtonBuilder】: *선택 버튼 생성기 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json new file mode 100644 index 00000000..ec01c1fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Inspetor de Componentes", + "info": "Este componente permite visualizar facilmente a estrutura hierárquica dos componentes filhos, sendo uma das funcionalidades do plugin Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do WidgetInspector", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【selectButtonBuilder】: *Construtor do botão de seleção 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json new file mode 100644 index 00000000..e4fce636 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetInspector/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 234, + "name": "WidgetInspector", + "localName": "Инспектор виджетов", + "info": "Этот компонент позволяет вам легко просматривать иерархию дочерних компонентов, что является одной из функций плагина Flutter Inspector.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование WidgetInspector", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【selectButtonBuilder】: *Конструктор кнопки выбора 【InspectorSelectButtonBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json new file mode 100644 index 00000000..0386443e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Widget-Anwendung", + "info": "Sammelt die Komponenten, die eine Anwendung benötigt, wie Routing, Sprache, einige Debug-Schalter usw. Es ist auch die Kernkomponente zur Implementierung von MaterialApp und CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Routing-Konstruktor 【PageRouteFactory】", + "【color】: *Farbe 【Color】", + "【debugShowWidgetInspector】: Ob der Widget-Inspektor angezeigt werden soll 【bool】", + "Andere Eigenschaften sind im Wesentlichen dieselben wie bei MaterialApp, siehe dort für weitere Details." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json new file mode 100644 index 00000000..66c99748 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Widget Application", + "info": "Collects the components needed for an application, such as routing, language, some debugging switches, etc. It is also the core component for implementing MaterialApp and CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Route Builder 【PageRouteFactory】", + "【color】: *Color 【Color】", + "【debugShowWidgetInspector】: Whether to display the widget inspector 【bool】", + "Other properties are basically the same as MaterialApp, see details there." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json new file mode 100644 index 00000000..cd9836e8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Aplicación de Componentes", + "info": "Agrupa los componentes necesarios para una aplicación, como el enrutamiento, el idioma, algunos interruptores de depuración, etc. También es el componente central para implementar MaterialApp y CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Constructor de rutas 【PageRouteFactory】", + "【color】: *Color 【Color】", + "【debugShowWidgetInspector】: Mostrar el inspector de componentes z 【bool】", + "Otras propiedades son básicamente las mismas que MaterialApp, consulte allí para más detalles." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json new file mode 100644 index 00000000..408c1220 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Application de widgets", + "info": "Rassemble les composants nécessaires pour une application, tels que le routage, la langue, certains commutateurs de débogage, etc. C'est également le composant central pour la mise en œuvre de MaterialApp et CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *constructeur de route 【PageRouteFactory】", + "【color】: *couleur 【Color】", + "【debugShowWidgetInspector】: afficher l'inspecteur de widgets 【bool】", + "Les autres propriétés sont essentiellement les mêmes que MaterialApp, voir cela pour plus de détails." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json new file mode 100644 index 00000000..f5bc7c8f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Applicazione Componenti", + "info": "Raccoglie i componenti necessari per un'applicazione, come il routing, la lingua, alcuni interruttori di debug, ecc. È anche il componente centrale per implementare MaterialApp e CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Costruttore di routing 【PageRouteFactory】", + "【color】: *Colore 【Color】", + "【debugShowWidgetInspector】: Mostra l'ispettore dei componenti 【bool】", + "Le altre proprietà sono fondamentalmente le stesse di MaterialApp, vedi dettagli." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json new file mode 100644 index 00000000..dca35af4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "ウィジェットアプリ", + "info": "アプリケーションに必要な部品、例えばルーティング、言語、いくつかのデバッグスイッチなどを集めたものです。また、MaterialAppとCupertinoAppを実現するためのコアコンポーネントでもあります。", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp基本使用", + "desc": [ + "【pageRouteBuilder】 : *ルーティングビルダー 【PageRouteFactory】", + "【color】: *色 【Color】", + "【debugShowWidgetInspector】: ウィジェットインスペクターを表示するかどうか 【bool】", + "その他の属性は基本的にMaterialAppと同じです。詳細はそちらをご覧ください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json new file mode 100644 index 00000000..709d0d73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "위젯 앱", + "info": "앱에 필요한 구성 요소, 예를 들어 라우팅, 언어, 일부 디버그 스위치 등을 모아놓은 것입니다. 또한 MaterialApp과 CupertinoApp을 구현하는 핵심 구성 요소입니다.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WidgetsApp 기본 사용법", + "desc": [ + "【pageRouteBuilder】 : *라우트 빌더 【PageRouteFactory】", + "【color】: *색상 【Color】", + "【debugShowWidgetInspector】: 위젯 인스펙터 표시 여부 【bool】", + "기타 속성은 기본적으로 MaterialApp과 동일하므로 자세한 내용은 해당 문서를 참조하세요." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json new file mode 100644 index 00000000..0d9c1031 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Aplicação de Componentes", + "info": "Agrega os componentes necessários para uma aplicação, como roteamento, idioma, alguns interruptores de depuração, etc. Também é o componente central para implementar MaterialApp e CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Construtor de Rota 【PageRouteFactory】", + "【color】: *Cor 【Color】", + "【debugShowWidgetInspector】: Mostrar o inspetor de componentes 【bool】", + "Outras propriedades são basicamente as mesmas que MaterialApp, consulte para mais detalhes." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json new file mode 100644 index 00000000..b72df5d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WidgetsApp/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 236, + "name": "WidgetsApp", + "localName": "Приложение виджетов", + "info": "Собирает компоненты, необходимые для приложения, такие как маршрутизация, язык, некоторые отладочные переключатели и т.д. Также является основным компонентом для реализации MaterialApp и CupertinoApp.", + "lever": 2, + "family": 1, + "linkIds": [ + 65, + 156 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование WidgetsApp", + "desc": [ + "【pageRouteBuilder】 : *Конструктор маршрутов 【PageRouteFactory】", + "【color】: *Цвет 【Color】", + "【debugShowWidgetInspector】: Показывать ли инспектор виджетов 【bool】", + "Другие свойства в основном совпадают с MaterialApp, подробнее см. там." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json new file mode 100644 index 00000000..90b0bf14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Rückkehrblockierung", + "info": "Wenn eine Oberfläche eine WillPopScope-Komponente enthält, wird beim Zurückkehren der Seite ein Callback ausgelöst, um zu entscheiden, ob zurückgekehrt werden soll. Kann für Szenarien verwendet werden, in denen ein erneutes Bestätigen des Verlassens erforderlich ist.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onWillPop】 : Rückkehr-Callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json new file mode 100644 index 00000000..f1db277e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Return Intercept", + "info": "When a WillPopScope component is present in an interface, a callback is triggered when the page returns, determining whether to return. It can be used for scenarios requiring secondary confirmation before exiting.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope Usage", + "desc": [ + "【child】: Child component 【Widget】", + "【onWillPop】: Return callback 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json new file mode 100644 index 00000000..64fbbb6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Intercepción de retorno", + "info": "Cuando hay un componente WillPopScope en una interfaz, se activará una devolución de llamada al regresar de la página para decidir si se debe regresar. Se puede utilizar en escenarios de confirmación secundaria para salir.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de WillPopScope", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onWillPop】 : Devolución de llamada 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json new file mode 100644 index 00000000..539be6bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Interception de retour", + "info": "Lorsqu'un composant WillPopScope est présent dans une interface, un rappel est déclenché lors du retour à la page pour décider si le retour doit être effectué. Peut être utilisé pour des scénarios de confirmation de sortie.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de WillPopScope", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onWillPop】 : Rappel de retour 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json new file mode 100644 index 00000000..2ab9a79c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Intercettazione di ritorno", + "info": "Quando un'interfaccia contiene il componente WillPopScope, viene attivato un callback al momento del ritorno alla pagina, decidendo se tornare indietro. Può essere utilizzato per scenari di conferma di uscita secondaria.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di WillPopScope", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onWillPop】 : Callback di ritorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json new file mode 100644 index 00000000..9044470a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "戻り防止", + "info": "インターフェースにWillPopScopeコンポーネントがある場合、ページが戻るときにコールバックがトリガーされ、戻るかどうかを決定します。二次確認して退出するシナリオに使用できます。", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScopeの使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onWillPop】 : 戻りコールバック 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json new file mode 100644 index 00000000..66971d92 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "뒤로 가기 차단", + "info": "인터페이스에 WillPopScope 컴포넌트가 있을 때, 페이지에서 뒤로 가기를 시도하면 콜백이 트리거되어 뒤로 갈지 여부를 결정합니다. 이는 두 번째로 종료를 확인하는 시나리오에 사용할 수 있습니다.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "WillPopScope 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onWillPop】 : 뒤로 가기 콜백 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json new file mode 100644 index 00000000..e99f8965 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Interceptar Retorno", + "info": "Quando há um componente WillPopScope numa interface, o callback é acionado ao retornar à página, decidindo se deve retornar. Pode ser usado em cenários de confirmação secundária de saída.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do WillPopScope", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onWillPop】 : Callback de retorno 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json new file mode 100644 index 00000000..cf2110df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/WillPopScope/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 170, + "name": "WillPopScope", + "localName": "Перехват возврата", + "info": "Когда на интерфейсе присутствует компонент WillPopScope, при возврате на страницу срабатывает обратный вызов, который определяет, следует ли возвращаться. Может использоваться для сценариев повторного подтверждения выхода.", + "lever": 5, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование WillPopScope", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onWillPop】 : Обратный вызов возврата 【WillPopCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json new file mode 100644 index 00000000..6503e5cb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Jahresauswahl", + "info": "Komponente zur Auswahl des Jahres, sieht etwas bescheiden aus. Kann den auszuwählenden Datumsbereich, das ausgewählte Datum usw. festlegen und empfängt jedes Auswahlereignis", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von YearPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【onChanged】 : Klick-Rückruf 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json new file mode 100644 index 00000000..429a2828 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Year Picker", + "info": "A component for selecting years, with a rather modest appearance. It allows specifying the date range for selection, selected dates, etc., and receives each selection event.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of YearPicker", + "desc": [ + "【selectedDate】: Selected date 【DateTime】", + "【firstDate】: First date limit 【DateTime】", + "【lastDate】: Last date limit 【DateTime】", + "【onChanged】: Click callback 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json new file mode 100644 index 00000000..119ce942 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Selector de año", + "info": "Componente de selección de año, de apariencia modesta. Permite especificar el rango de fechas seleccionables, la fecha seleccionada, etc., y recibe cada evento de selección.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de YearPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【firstDate】 : Límite de la primera fecha 【DateTime】", + "【lastDate】 : Límite de la última fecha 【DateTime】", + "【onChanged】 : Callback al hacer clic 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json new file mode 100644 index 00000000..a4c3fa06 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Sélecteur d'année", + "info": "Composant de sélection d'année, d'apparence modeste. Permet de spécifier la plage de dates sélectionnables, la date sélectionnée, etc., et reçoit chaque événement de sélection.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de YearPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【onChanged】 : Rappel au clic 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json new file mode 100644 index 00000000..40602596 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Selettore Anno", + "info": "Componente per la selezione dell'anno, dall'aspetto modesto. Consente di specificare l'intervallo di date selezionabili, la data selezionata, ecc., e riceve ogni evento di selezione.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo Base di YearPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【firstDate】 : Limite data iniziale 【DateTime】", + "【lastDate】 : Limite data finale 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json new file mode 100644 index 00000000..e7ea91c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "年ピッカー", + "info": "年の選択コンポーネントで、見た目はやや地味です。選択可能な日付範囲や選択された日付などを指定でき、選択イベントを受け取ります。", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPickerの基本使用", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json new file mode 100644 index 00000000..5c0dadd5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "연도 선택기", + "info": "연도를 선택하는 컴포넌트로, 외관이 다소 허술합니다. 선택 가능한 날짜 범위, 선택된 날짜 등을 지정할 수 있으며, 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "YearPicker 기본 사용법", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【firstDate】 : 최초 날짜 제한 【DateTime】", + "【lastDate】 : 최종 날짜 제한 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json new file mode 100644 index 00000000..93948873 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Seletor de Ano", + "info": "Componente de seleção de ano, com uma aparência bastante simples. Permite especificar o intervalo de datas, a data selecionada, entre outros, e recebe eventos de seleção.", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do YearPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json new file mode 100644 index 00000000..3b713079 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatefulWidget/YearPicker/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 136, + "name": "YearPicker", + "localName": "Выбор года", + "info": "Компонент для выбора года, выглядит довольно скромно. Можно указать диапазон дат, выбранную дату и т.д., принимает каждое событие выбора", + "lever": 3, + "family": 1, + "linkIds": [ + 134, + 135 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование YearPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【onChanged】 : Обратный вызов при нажатии 【Function(DateTime)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json new file mode 100644 index 00000000..9bd458ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Über Dialog", + "info": "Ein Dialogfeld zur Anwendungsbeschreibung, in dem das Anwendungssymbol, der Anwendungsname, die Anwendungsversionsnummer und andere Informationen sowie eine Liste von internen Unterkomponenten angegeben werden können. Durch Klicken auf die Schaltfläche auf der linken Seite gelangen Sie zur Zertifikatsseite.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AboutDialog", + "desc": [ + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Anwendungsrecht 【String】", + "【children】 : Liste der Unterkomponenten 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json new file mode 100644 index 00000000..f21a172c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "About Dialog", + "info": "The application's introduction dialog, which can specify the application icon, application name, application version number, and other information, as well as the internal sub-component list. Clicking the button on the left can navigate to the certificate page.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AboutDialog", + "desc": [ + "【applicationIcon】: Top-left icon 【Widget】", + "【applicationVersion】: Version number 【String】", + "【applicationName】: Application name 【String】", + "【applicationLegalese】: Application legal terms 【String】", + "【children】: Sub-component list 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json new file mode 100644 index 00000000..ba17fb88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Diálogo Acerca de", + "info": "Diálogo de introducción de la aplicación, donde se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión de la aplicación y otra información, así como una lista de subcomponentes internos. Al hacer clic en el botón de la izquierda, se puede acceder a la página de certificados.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AboutDialog", + "desc": [ + "【applicationIcon】 : Icono superior izquierdo 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Legalidad de la aplicación 【String】", + "【children】 : Lista de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json new file mode 100644 index 00000000..d249dda3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Dialogue À Propos", + "info": "La boîte de dialogue de présentation de l'application, qui peut spécifier l'icône de l'application, le nom de l'application, le numéro de version de l'application et d'autres informations ainsi que la liste des sous-composants internes. Cliquer sur le bouton de gauche permet de naviguer vers la page des licences.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AboutDialog", + "desc": [ + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Mentions légales de l'application 【String】", + "【children】 : Liste des sous-composants 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json new file mode 100644 index 00000000..cbae88ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Finestra Informazioni", + "info": "La finestra di dialogo delle informazioni sull'applicazione, che consente di specificare l'icona dell'applicazione, il nome dell'applicazione, il numero di versione dell'applicazione e altre informazioni, nonché l'elenco dei componenti interni. Cliccando sul pulsante a sinistra è possibile accedere alla pagina delle licenze.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AboutDialog", + "desc": [ + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Informazioni legali dell'applicazione 【String】", + "【children】 : Lista dei componenti figli 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json new file mode 100644 index 00000000..b0ca3505 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "ダイアログについて", + "info": "アプリケーションの概要ダイアログで、アプリケーションのアイコン、アプリケーション名、アプリケーションのバージョン番号などの情報と内部のサブコンポーネントリストを指定できます。左側のボタンをクリックすると、証明書ページにジャンプします。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialogの基本使用", + "desc": [ + "【applicationIcon】 : 左上アイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリケーション名 【String】", + "【applicationLegalese】 : アプリケーションの法律 【String】", + "【children】 : サブコンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json new file mode 100644 index 00000000..453ec339 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "정보 대화 상자", + "info": "애플리케이션의 정보 대화 상자로, 애플리케이션 아이콘, 애플리케이션 이름, 애플리케이션 버전 번호 등의 정보와 내부의 하위 구성 요소 목록을 지정할 수 있습니다. 왼쪽 버튼을 클릭하면 인증서 페이지로 이동할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutDialog 기본 사용", + "desc": [ + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 애플리케이션 이름 【String】", + "【applicationLegalese】 : 애플리케이션 법률 정보 【String】", + "【children】 : 하위 구성 요소 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json new file mode 100644 index 00000000..996e65a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "Diálogo Sobre", + "info": "Diálogo de introdução da aplicação, que pode especificar o ícone da aplicação, nome da aplicação, número da versão da aplicação e outras informações, bem como a lista de subcomponentes internos. Clicar no botão esquerdo pode saltar para a página de licenças.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AboutDialog", + "desc": [ + "【applicationIcon】 : Ícone superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legislação da aplicação 【String】", + "【children】 : Lista de subcomponentes 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json new file mode 100644 index 00000000..d1fda7b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutDialog/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 130, + "name": "AboutDialog", + "localName": "О диалоговом окне", + "info": "Диалоговое окно с описанием приложения, в котором можно указать значок приложения, название приложения, версию приложения и другие данные, а также список внутренних дочерних компонентов. Нажатие на кнопку слева позволяет перейти на страницу лицензии.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AboutDialog", + "desc": [ + "【applicationIcon】 : Иконка в верхнем левом углу 【Widget】", + "【applicationVersion】 : Номер версии 【String】", + "【applicationName】 : Название приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】", + "【children】 : Список дочерних компонентов 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json new file mode 100644 index 00000000..2b309c55 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Über App-Eintrag", + "info": "Ein Klickelement, das beim Klicken Anwendungsinformationen anzeigen kann. Es können Anwendungssymbole, Anwendungsname, Anwendungsversionsnummer und andere Informationen sowie die interne Liste der Unterkomponenten angegeben werden.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AboutListTile", + "desc": [ + "【icon】 : Linkes Symbol 【Widget】", + "【applicationIcon】 : Symbol oben links 【Widget】", + "【applicationVersion】 : Versionsnummer 【String】", + "【applicationName】 : Anwendungsname 【String】", + "【applicationLegalese】 : Anwendungsrecht 【String】", + "【aboutBoxChildren】 : Inhaltskomponenten des Popup-Fensters 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json new file mode 100644 index 00000000..2897d009 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "About App Entry", + "info": "A clickable entry that can pop up application-related information when clicked. It can specify the application icon, application name, application version number, and other information, as well as a list of internal child components.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AboutListTile", + "desc": [ + "【icon】 : Left icon 【Widget】", + "【applicationIcon】 : Top-left icon 【Widget】", + "【applicationVersion】 : Version number 【String】", + "【applicationName】 : Application name 【String】", + "【applicationLegalese】 : Application legalese 【String】", + "【aboutBoxChildren】 : Dialog content components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json new file mode 100644 index 00000000..7a964f25 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Entrada sobre la aplicación", + "info": "Una entrada en la que se puede hacer clic para mostrar información relacionada con la aplicación. Se pueden especificar el icono de la aplicación, el nombre de la aplicación, el número de versión y otros detalles, así como una lista de componentes internos.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AboutListTile", + "desc": [ + "【icon】 : Icono izquierdo 【Widget】", + "【applicationIcon】 : Icono superior izquierdo 【Widget】", + "【applicationVersion】 : Número de versión 【String】", + "【applicationName】 : Nombre de la aplicación 【String】", + "【applicationLegalese】 : Legal de la aplicación 【String】", + "【aboutBoxChildren】 : Componentes del contenido del cuadro emergente 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json new file mode 100644 index 00000000..579c45e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Élément À Propos de l'Application", + "info": "Un élément cliquable qui peut afficher des informations sur l'application lorsqu'il est cliqué. Peut spécifier l'icône de l'application, le nom de l'application, le numéro de version de l'application et d'autres informations ainsi qu'une liste de composants internes.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de AboutListTile", + "desc": [ + "【icon】 : Icône gauche 【Widget】", + "【applicationIcon】 : Icône en haut à gauche 【Widget】", + "【applicationVersion】 : Numéro de version 【String】", + "【applicationName】 : Nom de l'application 【String】", + "【applicationLegalese】 : Législation de l'application 【String】", + "【aboutBoxChildren】 : Composants du contenu de la boîte de dialogue 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json new file mode 100644 index 00000000..79a4be64 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Voce di menu Informazioni", + "info": "Una voce cliccabile che, quando viene cliccata, può visualizzare informazioni relative all'applicazione, specificando icone dell'applicazione, nome dell'applicazione, numero di versione e un elenco di componenti interni.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AboutListTile", + "desc": [ + "【icon】 : Icona a sinistra 【Widget】", + "【applicationIcon】 : Icona in alto a sinistra 【Widget】", + "【applicationVersion】 : Numero di versione 【String】", + "【applicationName】 : Nome dell'applicazione 【String】", + "【applicationLegalese】 : Legale dell'applicazione 【String】", + "【aboutBoxChildren】 : Componenti del contenuto della finestra 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json new file mode 100644 index 00000000..f1a37846 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "アプリについてのリストアイテム", + "info": "クリックするとアプリの関連情報をポップアップ表示するアイテムで、アプリアイコン、アプリ名、アプリバージョン番号などの情報と内部のサブコンポーネントリストを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTileの基本的な使用", + "desc": [ + "【icon】 : 左アイコン 【Widget】", + "【applicationIcon】 : 左上アイコン 【Widget】", + "【applicationVersion】 : バージョン番号 【String】", + "【applicationName】 : アプリ名 【String】", + "【applicationLegalese】 : アプリの法律情報 【String】", + "【aboutBoxChildren】 : ポップアップボックスの内容コンポーネント 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json new file mode 100644 index 00000000..1d3800ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "앱 정보 항목", + "info": "클릭 시 앱 관련 정보를 팝업할 수 있는 클릭 항목으로, 앱 아이콘, 앱 이름, 앱 버전 번호 등의 정보와 내부 하위 컴포넌트 목록을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AboutListTile 기본 사용법", + "desc": [ + "【icon】 : 왼쪽 아이콘 【Widget】", + "【applicationIcon】 : 왼쪽 상단 아이콘 【Widget】", + "【applicationVersion】 : 버전 번호 【String】", + "【applicationName】 : 앱 이름 【String】", + "【applicationLegalese】 : 앱 법률 정보 【String】", + "【aboutBoxChildren】 : 팝업 내용 컴포넌트 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json new file mode 100644 index 00000000..28794038 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "Item sobre a aplicação", + "info": "Um item clicável que, ao ser clicado, exibe informações sobre a aplicação, podendo especificar ícone da aplicação, nome da aplicação, número da versão e uma lista de componentes internos.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do AboutListTile", + "desc": [ + "【icon】 : Ícone esquerdo 【Widget】", + "【applicationIcon】 : Ícone superior esquerdo 【Widget】", + "【applicationVersion】 : Número da versão 【String】", + "【applicationName】 : Nome da aplicação 【String】", + "【applicationLegalese】 : Legislação da aplicação 【String】", + "【aboutBoxChildren】 : Componentes do conteúdo da caixa de diálogo 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json new file mode 100644 index 00000000..ad830b43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AboutListTile/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 193, + "name": "AboutListTile", + "localName": "О приложении", + "info": "Элемент, при нажатии на который отображается информация о приложении, можно указать значок приложения, имя приложения, версию приложения и другие данные, а также список внутренних компонентов.", + "lever": 3, + "family": 0, + "linkIds": [ + 130, + 145 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AboutListTile", + "desc": [ + "【icon】 : Левый значок 【Widget】", + "【applicationIcon】 : Левый верхний значок 【Widget】", + "【applicationVersion】 : Номер версии 【String】", + "【applicationName】 : Имя приложения 【String】", + "【applicationLegalese】 : Юридическая информация приложения 【String】", + "【aboutBoxChildren】 : Компоненты содержимого всплывающего окна 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json new file mode 100644 index 00000000..69685553 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_de_DE.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Ereignis-Chip", + "info": "Ähnlich wie die Chip-Komponente, aber mit einigen Klick-Eigenschaften. Kann die Schattentiefe beim Klicken und das Klick-Ereignis festlegen.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Normale Darstellung des ActionChip", + "desc": [ + "【onPressed】: Klick-Ereignis 【Function】", + "【pressElevation】: Schattentiefe beim Drücken 【double】", + "Andere Eigenschaften sind identisch mit der Chip-Komponente, keine rechte Komponente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json new file mode 100644 index 00000000..245828d9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_en_US.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Action Chip", + "info": "Similar style to the Chip component, with some clickable properties. You can specify the shadow depth and click event when pressed.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal performance of ActionChip is as follows", + "desc": [ + "【onPressed】: Click event 【Function】", + "【pressElevation】: Shadow depth when pressed 【double】", + "Other properties are the same as the Chip component, no right component." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json new file mode 100644 index 00000000..c7865162 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_es_ES.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip de Acción", + "info": "Estilo similar al componente Chip, con algunas propiedades de clic. Puede especificar la profundidad de la sombra al hacer clic y el evento de clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de ActionChip es el siguiente", + "desc": [ + "【onPressed】: Evento de clic 【Function】", + "【pressElevation】: Profundidad de la sombra al presionar 【double】", + "Otras propiedades son iguales al componente Chip, sin componente derecho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json new file mode 100644 index 00000000..6dc10d3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_fr_FR.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip d'action", + "info": "Un style similaire au composant Chip, avec des propriétés de clic. Vous pouvez spécifier la profondeur de l'ombre lors du clic et l'événement de clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La représentation normale de l'ActionChip est la suivante", + "desc": [ + "【onPressed】: Événement de clic 【Function】", + "【pressElevation】: Profondeur de l'ombre lors de la pression 【double】", + "Les autres propriétés sont identiques au composant Chip, sans composant à droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json new file mode 100644 index 00000000..02508a48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_it_IT.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip di Azione", + "info": "Uno stile simile al componente Chip, con alcune proprietà di clic. È possibile specificare la profondità dell'ombra al clic e l'evento di clic.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione normale di ActionChip è la seguente", + "desc": [ + "【onPressed】: Evento di clic 【Function】", + "【pressElevation】: Profondità dell'ombra al clic 【double】", + "Altre proprietà sono simili al componente Chip, senza componente a destra." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json new file mode 100644 index 00000000..cd38faba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ja_JP.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "アクションチップ", + "info": "Chipコンポーネントに似たスタイルで、いくつかのクリック属性があります。クリック時の影の深さやクリックイベントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChipの通常の表現は以下の通りです", + "desc": [ + "【onPressed】: クリックイベント 【Function】", + "【pressElevation】: 押下時の影の深さ 【double】", + "その他の属性はChipコンポーネントと同じで、右側のコンポーネントはありません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json new file mode 100644 index 00000000..de66f073 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ko_KR.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "이벤트 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 클릭 속성이 있습니다. 클릭 시 그림자 깊이와 클릭 이벤트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ActionChip의 일반적인 표현은 다음과 같습니다", + "desc": [ + "【onPressed】: 클릭 이벤트 【Function】", + "【pressElevation】: 눌렀을 때 그림자 깊이 【double】", + "기타 속성은 Chip 컴포넌트와 동일하며, 오른쪽 컴포넌트가 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json new file mode 100644 index 00000000..b11af7dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_pt_PT.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Chip de Ação", + "info": "Estilo semelhante ao componente Chip, com algumas propriedades de clique. Pode especificar a profundidade da sombra ao clicar e o evento de clique.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A aparência normal do ActionChip é a seguinte", + "desc": [ + "【onPressed】: Evento de clique 【Function】", + "【pressElevation】: Profundidade da sombra ao pressionar 【double】", + "Outras propriedades são iguais ao componente Chip, sem componente à direita." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json new file mode 100644 index 00000000..5c34b9fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ActionChip/desc_ru_RU.json @@ -0,0 +1,26 @@ +{ + "id": 13, + "name": "ActionChip", + "localName": "Чип действия", + "info": "Стиль, похожий на компонент Chip, с некоторыми свойствами для нажатия. Можно указать глубину тени при нажатии и событие нажатия.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 12, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное поведение ActionChip выглядит следующим образом", + "desc": [ + "【onPressed】: Событие нажатия 【Function】", + "【pressElevation】: Глубина тени при нажатии 【double】", + "Другие свойства такие же, как у компонента Chip, без правого компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json new file mode 100644 index 00000000..2cf8152a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Dialogfeld", + "info": "Eine allgemeine Dialogstruktur, die Komponenten im Kopf-, Mittel- und Fußbereich angeben kann. Verfügt über Textstile und Ränder für Titel und Inhalt, Schattentiefe, Form und andere Attribute.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AlertDialog", + "desc": [ + "【title】 : Oberste Komponente 【Widget】", + "【content】 : Inhaltskomponente 【Widget】", + "【titleTextStyle】 : Textstil für den Titel 【TextStyle】", + "【contentTextStyle】 : Textstil für den Inhalt 【TextStyle】", + "【titlePadding】 : Innenabstand für den Titel 【EdgeInsetsGeometry】", + "【contentPadding】 : Innenabstand für den Inhalt 【EdgeInsetsGeometry】", + "【actions】 : Liste der Komponenten in der unteren rechten Ecke 【List】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json new file mode 100644 index 00000000..fbfa30c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Popup Dialog", + "info": "A general dialog structure that can specify components at the head, middle, and tail. It has text styles and margins for the title and content, as well as properties such as elevation and shape.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AlertDialog", + "desc": [ + "【title】 : Top component 【Widget】", + "【content】 : Content component 【Widget】", + "【titleTextStyle】 : Top text style 【TextStyle】", + "【contentTextStyle】 : Content text style 【TextStyle】", + "【titlePadding】 : Top padding 【EdgeInsetsGeometry】", + "【contentPadding】 : Content padding 【EdgeInsetsGeometry】", + "【actions】 : Bottom right component list 【List】", + "【backgroundColor】 : Background color 【Color】", + "【elevation】 : Elevation 【double】", + "【shape】 : Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json new file mode 100644 index 00000000..b41ad91d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Cuadro de diálogo emergente", + "info": "Una estructura de diálogo genérica que permite especificar componentes en la parte superior, media e inferior. Tiene propiedades como el estilo de texto y los márgenes del título y el contenido, la profundidad de la sombra, la forma, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AlertDialog", + "desc": [ + "【title】 : Componente superior 【Widget】", + "【content】 : Componente de contenido 【Widget】", + "【titleTextStyle】 : Estilo de texto del título 【TextStyle】", + "【contentTextStyle】 : Estilo de texto del contenido 【TextStyle】", + "【titlePadding】 : Relleno superior 【EdgeInsetsGeometry】", + "【contentPadding】 : Relleno del contenido 【EdgeInsetsGeometry】", + "【actions】 : Lista de componentes en la esquina inferior derecha 【List】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de la sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json new file mode 100644 index 00000000..fa306c88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Boîte de dialogue contextuelle", + "info": "Une structure de dialogue générique qui permet de spécifier des composants en haut, au milieu et en bas. Possède des styles de texte et des marges pour le titre et le contenu, ainsi que des propriétés telles que la profondeur d'ombre, la forme, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AlertDialog", + "desc": [ + "【title】 : Composant du haut 【Widget】", + "【content】 : Composant du contenu 【Widget】", + "【titleTextStyle】 : Style de texte du titre 【TextStyle】", + "【contentTextStyle】 : Style de texte du contenu 【TextStyle】", + "【titlePadding】 : Marge intérieure du titre 【EdgeInsetsGeometry】", + "【contentPadding】 : Marge intérieure du contenu 【EdgeInsetsGeometry】", + "【actions】 : Liste des composants en bas à droite 【List】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur d'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json new file mode 100644 index 00000000..8566bdcd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Finestra di dialogo pop-up", + "info": "Una struttura di dialogo generica che consente di specificare componenti nella parte superiore, centrale e inferiore. Possiede stili di testo e margini per il titolo e il contenuto, oltre a proprietà come profondità dell'ombra, forma, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di AlertDialog", + "desc": [ + "【title】 : Componente superiore 【Widget】", + "【content】 : Componente del contenuto 【Widget】", + "【titleTextStyle】 : Stile del testo superiore 【TextStyle】", + "【contentTextStyle】 : Stile del testo del contenuto 【TextStyle】", + "【titlePadding】 : Spaziatura interna superiore 【EdgeInsetsGeometry】", + "【contentPadding】 : Spaziatura interna del contenuto 【EdgeInsetsGeometry】", + "【actions】 : Lista dei componenti nell'angolo inferiore destro 【List】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json new file mode 100644 index 00000000..188f972f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "ポップアップダイアログ", + "info": "一般的なダイアログ構造で、上部、中央、下部にコンポーネントを指定できます。タイトル、内容のテキストスタイルと余白、影の深さ、形状などの属性を持っています。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialogの基本使用", + "desc": [ + "【title】 : 上部コンポーネント 【Widget】", + "【content】 : 内容コンポーネント 【Widget】", + "【titleTextStyle】 : 上部テキストスタイル 【TextStyle】", + "【contentTextStyle】 : 内容テキストスタイル 【TextStyle】", + "【titlePadding】 : 上部内側余白 【EdgeInsetsGeometry】", + "【contentPadding】 : 内容内側余白 【EdgeInsetsGeometry】", + "【actions】 : 右下コンポーネントリスト 【List】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json new file mode 100644 index 00000000..0d50477a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "팝업 대화 상자", + "info": "일반적인 대화 상자 구조로, 상단, 중간, 하단의 구성 요소를 지정할 수 있습니다. 제목, 내용의 텍스트 스타일과 여백, 그림자 깊이, 모양 등의 속성을 가지고 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AlertDialog 기본 사용", + "desc": [ + "【title】 : 상단 구성 요소 【Widget】", + "【content】 : 내용 구성 요소 【Widget】", + "【titleTextStyle】 : 상단 텍스트 스타일 【TextStyle】", + "【contentTextStyle】 : 내용 텍스트 스타일 【TextStyle】", + "【titlePadding】 : 상단 내부 여백 【EdgeInsetsGeometry】", + "【contentPadding】 : 내용 내부 여백 【EdgeInsetsGeometry】", + "【actions】 : 오른쪽 하단 구성 요소 목록 【List】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json new file mode 100644 index 00000000..b8a726c0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Diálogo de Alerta", + "info": "Uma estrutura de diálogo genérica que permite especificar componentes no topo, meio e fim. Possui estilos de texto e margens para o título e conteúdo, além de propriedades como profundidade de sombra, forma, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do AlertDialog", + "desc": [ + "【title】 : Componente do topo 【Widget】", + "【content】 : Componente de conteúdo 【Widget】", + "【titleTextStyle】 : Estilo de texto do topo 【TextStyle】", + "【contentTextStyle】 : Estilo de texto do conteúdo 【TextStyle】", + "【titlePadding】 : Margem interna do topo 【EdgeInsetsGeometry】", + "【contentPadding】 : Margem interna do conteúdo 【EdgeInsetsGeometry】", + "【actions】 : Lista de componentes no canto inferior direito 【List】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json new file mode 100644 index 00000000..f9cbc251 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AlertDialog/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 127, + "name": "AlertDialog", + "localName": "Всплывающее диалоговое окно", + "info": "Универсальная структура диалогового окна, позволяющая указать компоненты в верхней, средней и нижней частях. Имеет стили текста и отступы для заголовка и содержимого, а также свойства, такие как тень, форма и другие.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AlertDialog", + "desc": [ + "【title】 : Верхний компонент 【Widget】", + "【content】 : Компонент содержимого 【Widget】", + "【titleTextStyle】 : Стиль текста заголовка 【TextStyle】", + "【contentTextStyle】 : Стиль текста содержимого 【TextStyle】", + "【titlePadding】 : Внутренний отступ заголовка 【EdgeInsetsGeometry】", + "【contentPadding】 : Внутренний отступ содержимого 【EdgeInsetsGeometry】", + "【actions】 : Список компонентов в правом нижнем углу 【List】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Тень 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json new file mode 100644 index 00000000..bd93fd19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Animiertes Symbol", + "info": "Verwenden Sie die Symboldaten von AnimatedIcons, um Symbole mit einem Animationscontroller zu animieren. Größe, Farbe usw. können angegeben werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von AnimatedIcon", + "desc": [ + "【icon】 : Animationssymboldaten 【AnimatedIcons】", + "【size】 : Größe 【double】", + "【color】 : Farbe 【Color】", + "【progress】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json new file mode 100644 index 00000000..beed3414 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icon Animation", + "info": "Using the icon data of AnimatedIcons, you can animate the icon based on an animation controller. The icon size, color, etc., can be specified.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of AnimatedIcon", + "desc": [ + "【icon】: Animation icon data 【AnimatedIcons】", + "【size】: Size 【double】", + "【color】: Color 【Color】", + "【progress】: Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json new file mode 100644 index 00000000..d9cada14 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icono animado", + "info": "Utiliza los datos de iconos de AnimatedIcons para crear efectos de animación en los iconos basados en un controlador de animación. Se puede especificar el tamaño del icono, el color, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedIcon", + "desc": [ + "【icon】: Datos del icono animado 【AnimatedIcons】", + "【size】: Tamaño 【double】", + "【color】: Color 【Color】", + "【progress】: Animación 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json new file mode 100644 index 00000000..583ef6c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icône animée", + "info": "Utilisez les données d'icône d'AnimatedIcons pour animer une icône en fonction d'un contrôleur d'animation. Vous pouvez spécifier la taille, la couleur, etc. de l'icône.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'AnimatedIcon", + "desc": [ + "【icon】 : Données de l'icône animée 【AnimatedIcons】", + "【size】 : Taille 【double】", + "【color】 : Couleur 【Color】", + "【progress】 : Animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json new file mode 100644 index 00000000..60a5bc1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Icona Animata", + "info": "Utilizza i dati delle icone di AnimatedIcons per creare effetti di animazione delle icone basati su un controller di animazione. È possibile specificare dimensioni, colore, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di AnimatedIcon", + "desc": [ + "【icon】 : Dati dell'icona animata 【AnimatedIcons】", + "【size】 : Dimensione 【double】", + "【color】 : Colore 【Color】", + "【progress】 : Animazione 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json new file mode 100644 index 00000000..49b64808 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "アイコンアニメーション", + "info": "AnimatedIconsのアイコンデータを使用して、アニメーションコントローラーに基づいてアイコンにアニメーション効果を与えることができます。アイコンのサイズや色などを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIconの基本使用", + "desc": [ + "【icon】 : アニメーションアイコンデータ 【AnimatedIcons】", + "【size】 : サイズ 【double】", + "【color】 : 色 【Color】", + "【progress】 : アニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json new file mode 100644 index 00000000..25b5ed60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "아이콘 애니메이션", + "info": "AnimatedIcons의 아이콘 데이터를 사용하여 애니메이션 컨트롤러에 따라 아이콘에 애니메이션 효과를 적용할 수 있습니다. 아이콘 크기, 색상 등을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "AnimatedIcon 기본 사용", + "desc": [ + "【icon】 : 애니메이션 아이콘 데이터 【AnimatedIcons】", + "【size】 : 크기 【double】", + "【color】 : 색상 【Color】", + "【progress】 : 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json new file mode 100644 index 00000000..fad0bab6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Ícone Animado", + "info": "Utiliza os dados de ícones de AnimatedIcons para criar efeitos de animação com base em um controlador de animação. Permite especificar o tamanho, cor e outros atributos do ícone.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de AnimatedIcon", + "desc": [ + "【icon】 : Dados do ícone animado 【AnimatedIcons】", + "【size】 : Tamanho 【double】", + "【color】 : Cor 【Color】", + "【progress】 : Animação 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json new file mode 100644 index 00000000..414e42a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/AnimatedIcon/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 125, + "name": "AnimatedIcon", + "localName": "Анимированная иконка", + "info": "Используйте данные иконки AnimatedIcons для создания анимации иконки с помощью контроллера анимации. Можно указать размер и цвет иконки.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование AnimatedIcon", + "desc": [ + "【icon】 : Данные анимированной иконки 【AnimatedIcons】", + "【size】 : Размер 【double】", + "【color】 : Цвет 【Color】", + "【progress】 : Анимация 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json new file mode 100644 index 00000000..aa565405 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Automatische Vervollständigung", + "info": "Bietet während der Eingabe eine Überlagerung mit Vorschlägen an, damit Benutzer auswählen können, und bietet ein hohes Maß an Anpassbarkeit.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Autocomplete", + "desc": [ + "【optionsBuilder】: Optionen-Builder 【AutocompleteOptionsBuilder】", + "【onSelected】: Rückruf bei Auswahl 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generika von Autocomplete", + "desc": [ + "【optionsViewBuilder】: Panel-Builder 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Eingabe-Builder 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Textanzeige 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json new file mode 100644 index 00000000..221f824b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Autocomplete", + "info": "During input, provides a suggestion overlay for users to select from, with a high degree of customization.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Autocomplete", + "desc": [ + "【optionsBuilder】: Option builder 【AutocompleteOptionsBuilder】", + "【onSelected】: Callback when selected 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generics of Autocomplete", + "desc": [ + "【optionsViewBuilder】: Panel builder 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Input builder 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Text display 【AutocompleteOptionToString】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json new file mode 100644 index 00000000..8e9cdf04 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Autocompletado", + "info": "Proporciona una capa de sugerencias durante la entrada para que el usuario pueda seleccionar, con un alto grado de personalización.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Autocomplete", + "desc": [ + "【optionsBuilder】: Constructor de opciones 【AutocompleteOptionsBuilder】", + "【onSelected】: Devolución de llamada al seleccionar 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Genéricos de Autocomplete", + "desc": [ + "【optionsViewBuilder】: Constructor del panel 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Constructor de entrada 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Visualización de texto 【AutocompleteOptionToString】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json new file mode 100644 index 00000000..1c2b6d1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Remplissage automatique", + "info": "Pendant la saisie, fournit une superposition de suggestions pour que l'utilisateur puisse choisir, avec un haut degré de personnalisation.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'Autocomplete", + "desc": [ + "【optionsBuilder】 : Constructeur d'options 【AutocompleteOptionsBuilder】", + "【onSelected】 : Rappel lors de la sélection 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Génériques d'Autocomplete", + "desc": [ + "【optionsViewBuilder】 : Constructeur de panneau 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : Constructeur de saisie 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : Affichage de texte 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json new file mode 100644 index 00000000..921cc9f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Completamento automatico", + "info": "Durante l'immissione, fornisce un overlay di suggerimenti per la selezione dell'utente, con un alto grado di personalizzazione.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Autocomplete", + "desc": [ + "【optionsBuilder】 : Costruttore di opzioni 【AutocompleteOptionsBuilder】", + "【onSelected】 : Callback alla selezione 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Generics di Autocomplete", + "desc": [ + "【optionsViewBuilder】 : Costruttore del pannello 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : Costruttore di input 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : Visualizzazione del testo 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json new file mode 100644 index 00000000..74cbbfed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "オートコンプリート", + "info": "入力中に、ユーザーが選択できるように連想語をフローティングレイヤーで表示し、高いカスタマイズ性を持っています。", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocompleteの基本使用", + "desc": [ + "【optionsBuilder】 : オプション構築器 【AutocompleteOptionsBuilder】", + "【onSelected】 : 選択時のコールバック 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocompleteのジェネリック", + "desc": [ + "【optionsViewBuilder】 : パネル構築器 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 入力構築器 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : テキスト表示 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json new file mode 100644 index 00000000..b86cad62 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "자동 완성", + "info": "입력 중에, 사용자가 선택할 수 있도록 연관어를 보여주는 레이어를 제공하며, 높은 수준의 커스터마이징이 가능합니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Autocomplete 기본 사용", + "desc": [ + "【optionsBuilder】 : 옵션 빌더 【AutocompleteOptionsBuilder】", + "【onSelected】 : 선택 시 콜백 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Autocomplete의 제네릭", + "desc": [ + "【optionsViewBuilder】 : 패널 빌더 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : 입력 빌더 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : 텍스트 표시 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json new file mode 100644 index 00000000..cf85c697 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Preenchimento automático", + "info": "Durante a entrada, fornece uma sobreposição de sugestões para o usuário escolher, com alto grau de personalização.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Autocomplete", + "desc": [ + "【optionsBuilder】: Construtor de opções 【AutocompleteOptionsBuilder】", + "【onSelected】: Callback de seleção 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Genéricos do Autocomplete", + "desc": [ + "【optionsViewBuilder】: Construtor de painel 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】: Construtor de entrada 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】: Exibição de texto 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json new file mode 100644 index 00000000..7d6e3425 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Autocomplete/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 356, + "name": "Autocomplete", + "localName": "Автозаполнение", + "info": "Во время ввода предоставляет всплывающий слой с подсказками для выбора пользователем, обладает высокой степенью настройки.", + "lever": 4, + "family": 0, + "linkIds": [ + 54, + 199 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Autocomplete", + "desc": [ + "【optionsBuilder】 : конструктор опций 【AutocompleteOptionsBuilder】", + "【onSelected】 : обратный вызов при выборе 【AutocompleteOnSelected】" + ] + }, + { + "file": "node2_type.dart", + "name": "Обобщение Autocomplete", + "desc": [ + "【optionsViewBuilder】 : конструктор панели 【AutocompleteOptionsViewBuilder】", + "【fieldViewBuilder】 : конструктор ввода 【AutocompleteFieldViewBuilder】", + "【displayStringForOption】 : отображение текста 【AutocompleteOptionToString】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json new file mode 100644 index 00000000..2110748f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Zurück-Button", + "info": "Ein IconButton mit Rückkehrfunktion, das Rückkehrsymbol kann nicht geändert werden. Verhält sich in iOS und Android unterschiedlich.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton Attribute", + "desc": [ + "【color】: Farbe 【Color】", + "【style】: Button-Stil 【ButtonStyle?】", + "【onPressed】: Klick-Ereignis 【Function】", + " Wenn onPressed leer ist, wird der aktuelle Stack verlassen" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json new file mode 100644 index 00000000..5827f1c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Back Button", + "info": "An IconButton with a back function, the back icon cannot be changed. It behaves differently in iOS and Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton Properties", + "desc": [ + "【color】: Color 【Color】", + "【style】: Button Style 【ButtonStyle?】", + "【onPressed】: Click Event 【Function】", + " If onPressed is empty, it will exit the current stack." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json new file mode 100644 index 00000000..d776911e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Botón de retroceso", + "info": "Un IconButton con función de retroceso, el icono de retroceso no se puede cambiar. Se comporta de manera diferente en iOS y Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades de BackButton", + "desc": [ + "【color】: Color 【Color】", + "【style】: Estilo del botón 【ButtonStyle?】", + "【onPressed】: Evento de clic 【Function】", + "Si onPressed está vacío, saldrá de la pila actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json new file mode 100644 index 00000000..67ab49af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Bouton Retour", + "info": "Un IconButton avec une fonction de retour, l'icône de retour ne peut pas être modifiée. Se comporte différemment sur iOS et Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés du BackButton", + "desc": [ + "【color】: Couleur 【Color】", + "【style】: Style du bouton 【ButtonStyle?】", + "【onPressed】: Événement de clic 【Function】", + " Si onPressed est vide, la pile actuelle sera quittée" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json new file mode 100644 index 00000000..15d82d52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Pulsante Indietro", + "info": "Un IconButton con funzionalità di ritorno, l'icona di ritorno non può essere modificata. Si comporta diversamente in iOS e Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà del BackButton", + "desc": [ + "【color】: Colore 【Color】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "【onPressed】: Evento di clic 【Function】", + " Se onPressed è vuoto, uscirà dallo stack corrente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json new file mode 100644 index 00000000..12bbc9f5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "戻るボタン", + "info": "戻る機能を持つIconButtonで、戻るアイコンは変更できません。iOSとAndroidでは異なる動作をします。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton属性", + "desc": [ + "【color】: 色 【Color】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "【onPressed】: クリックイベント 【Function】", + " onPressedが空の場合、現在のスタックを終了します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json new file mode 100644 index 00000000..52da8131 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "뒤로 가기 버튼", + "info": "뒤로 가기 기능을 가진 IconButton, 뒤로 가기 아이콘은 변경할 수 없습니다. iOS와 Android에서 다르게 동작합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButton 속성", + "desc": [ + "【color】: 색상 【Color】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "【onPressed】: 클릭 이벤트 【Function】", + "onPressed가 비어 있으면 현재 스택에서 빠져나옵니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json new file mode 100644 index 00000000..17115929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Botão de Voltar", + "info": "Um IconButton com função de voltar, o ícone de voltar não pode ser alterado. Comporta-se de forma diferente no iOS e no Android.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades do BackButton", + "desc": [ + "【color】: Cor 【Color】", + "【style】: Estilo do botão 【ButtonStyle?】", + "【onPressed】: Evento de clique 【Function】", + "Se onPressed estiver vazio, a pilha atual será encerrada" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json new file mode 100644 index 00000000..310f813d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButton/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 31, + "name": "BackButton", + "localName": "Кнопка возврата", + "info": "IconButton с функцией возврата, значок возврата нельзя изменить. По-разному ведет себя в iOS и Android", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Свойства BackButton", + "desc": [ + "【color】: Цвет 【Color】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "【onPressed】: Событие нажатия 【Function】", + "Если onPressed пуст, текущий стек будет завершен" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..cfce90a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Zurück-Button-Icon", + "info": "Ein Rück-Icon, das je nach Plattform das entsprechende Icon anzeigt. Das Thema kann über ActionIconTheme angepasst werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon-Effekt", + "desc": [ + "Das _ActionIcon-Widget passt das Rück-Button-Icon basierend auf dem ActionIconTheme an die jeweilige Plattform an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json new file mode 100644 index 00000000..013efdd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Back Button Icon", + "info": "A return Icon icon, displaying the corresponding icon according to the platform, and the theme can be customized through ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the back button icon for different platforms according to the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..b4dcc7b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icono de botón de retroceso", + "info": "Un icono de retroceso, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de BackButtonIcon", + "desc": [ + "El componente _ActionIcon adapta el icono del botón de retroceso para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..2448d289 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icône de bouton de retour", + "info": "Une icône de retour, affichant l'icône correspondante selon la plateforme, qui peut être personnalisée via ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de BackButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône de bouton de retour à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..9754d610 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Icona del pulsante Indietro", + "info": "Un'icona di ritorno, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto BackButtonIcon", + "desc": [ + "Attraverso il componente _ActionIcon, adatta l'icona del pulsante Indietro per diverse piattaforme in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..71e0b52a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "戻るボタンアイコン", + "info": "戻るアイコンで、プラットフォームに応じたアイコンを表示し、ActionIconThemeでテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 効果", + "desc": [ + "_ActionIconコンポーネントを使用して、ActionIconThemeテーマに基づいて、異なるプラットフォームの戻るボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..64ea426a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "뒤로 가기 버튼 아이콘", + "info": "플랫폼에 따라 해당 아이콘을 표시하는 뒤로 가기 Icon 아이콘입니다. ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BackButtonIcon 효과", + "desc": [ + "ActionIconTheme 테마에 따라 _ActionIcon 컴포넌트를 사용하여 다른 플랫폼의 뒤로 가기 버튼 아이콘을 적응시킵니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..598f57cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Ícone do botão de voltar", + "info": "Um ícone de retorno, que exibe o ícone correspondente de acordo com a plataforma, pode ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do BackButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão de voltar para diferentes plataformas com base no tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..2d572f03 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BackButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 272, + "name": "BackButtonIcon", + "localName": "Иконка кнопки возврата", + "info": "Иконка возврата, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект BackButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки возврата для разных платформ в соответствии с темой ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json new file mode 100644 index 00000000..a3f26622 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_de_DE.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Kennzeichnungskomponente", + "info": "Badge ist eine Komponente im Material-Stil, die eine Markierung über einem Kindelement hinzufügen kann. Beim Aufbau wird die Stack-Komponente für die Überlagerung verwendet.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Verwendung von Badge-Punktmarkierungen", + "desc": [ + "【backgroundColor】 : Hintergrundfarbe 【Color?】", + "【isLabelVisible】 : Sichtbarkeit der Markierung 【bool】", + "【smallSize】 : Durchmesser ohne Label 【double?】", + "【child】 : Kindelement 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge-Label-Markierung", + "desc": [ + "【label】 : Titelkomponente 【Widget?】", + "【textStyle】 : Titeltextstil 【TextStyle?】", + "【textColor】 : Titeltextfarbe 【Color?】", + "【padding】 : Titelabstand 【EdgeInsetsGeometry?】", + "【largeSize】 : Höhe mit Label 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Versatz von Badge", + "desc": [ + "【offset】 : Versatz der Markierung 【Offset?】", + "【alignment】 : Titelversatz 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json new file mode 100644 index 00000000..662c3bc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_en_US.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Badge Component", + "info": "Badge is a Material-style component that can add markers on top of the child. It relies on the Stack component for layering during construction.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Usage of Badge Dot Marker", + "desc": [ + "【backgroundColor】: Background color 【Color?】", + "【isLabelVisible】: Whether to display the marker 【bool】", + "【smallSize】: Diameter when there is no label 【double?】", + "【child】: Child component 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge Label Marker", + "desc": [ + "【label】: Title component 【Widget?】", + "【textStyle】: Title color 【TextStyle?】", + "【textColor】: Title style 【Color?】", + "【padding】: Title margin 【EdgeInsetsGeometry?】", + "【largeSize】: Height when there is a label 【double?】" + ] + }, + { + "file": "node_3.dart", + "name": "Badge Offset", + "desc": [ + "【offset】: Marker offset 【Offset?】", + "【alignment】: Title offset 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json new file mode 100644 index 00000000..54ab567e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_es_ES.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente de marcador", + "info": "Badge es un componente de estilo Material que puede agregar un marcador sobre el child, dependiendo del componente Stack para la superposición durante la construcción.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso del marcador de punto Badge", + "desc": [ + "【backgroundColor】 : Color de fondo 【Color?】", + "【isLabelVisible】 : Si se muestra el marcador 【bool】", + "【smallSize】 : Diámetro sin etiqueta 【double?】", + "【child】 : Componente hijo 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Marcador de etiqueta Badge", + "desc": [ + "【label】 : Componente de título 【Widget?】", + "【textStyle】 : Color del título 【TextStyle?】", + "【textColor】 : Estilo del título 【Color?】", + "【padding】 : Márgenes del título 【EdgeInsetsGeometry?】", + "【largeSize】 : Altura con etiqueta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Desplazamiento del Badge", + "desc": [ + "【offset】 : Desplazamiento del marcador 【Offset?】", + "【alignment】 : Desplazamiento del título 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json new file mode 100644 index 00000000..081f1981 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_fr_FR.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Composant de marquage", + "info": "Badge est un composant de style Material qui peut ajouter des marqueurs au-dessus d'un enfant, dépendant du composant Stack pour l'empilement lors de la construction.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Utilisation du badge en point", + "desc": [ + "【backgroundColor】 : Couleur de fond 【Color?】", + "【isLabelVisible】 : Afficher le marqueur 【bool】", + "【smallSize】 : Diamètre sans étiquette 【double?】", + "【child】 : Composant enfant 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge avec étiquette", + "desc": [ + "【label】 : Composant de titre 【Widget?】", + "【textStyle】 : Couleur du titre 【TextStyle?】", + "【textColor】 : Style du titre 【Color?】", + "【padding】 : Marge du titre 【EdgeInsetsGeometry?】", + "【largeSize】 : Hauteur avec étiquette 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Décalage du badge", + "desc": [ + "【offset】 : Décalage du marqueur 【Offset?】", + "【alignment】 : Décalage du titre 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json new file mode 100644 index 00000000..ad52a654 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_it_IT.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente Badge", + "info": "Badge è un componente in stile Material che aggiunge un segnalino sopra il child, dipendendo dal componente Stack per la sovrapposizione durante la costruzione.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso del Badge con punto", + "desc": [ + "【backgroundColor】 : Colore di sfondo 【Color?】", + "【isLabelVisible】 : Visibilità del segnalino 【bool】", + "【smallSize】 : Diametro senza etichetta 【double?】", + "【child】 : Componente figlio 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge con etichetta", + "desc": [ + "【label】 : Componente del titolo 【Widget?】", + "【textStyle】 : Colore del titolo 【TextStyle?】", + "【textColor】 : Stile del titolo 【Color?】", + "【padding】 : Margine del titolo 【EdgeInsetsGeometry?】", + "【largeSize】 : Altezza con etichetta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Offset del Badge", + "desc": [ + "【offset】 : Offset del segnalino 【Offset?】", + "【alignment】 : Offset del titolo 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json new file mode 100644 index 00000000..5a80853c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ja_JP.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "バッジコンポーネント", + "info": "Badge は Material スタイルのコンポーネントで、child の上にマーカーを追加できます。構築時には Stack コンポーネントに依存して重ねられます。", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge ドットマーカーの使用", + "desc": [ + "【backgroundColor】 : 背景色 【Color?】", + "【isLabelVisible】 : マーカーを表示するかどうか 【bool】", + "【smallSize】 : ラベルがない場合の直径 【double?】", + "【child】 : 子コンポーネント 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge ラベルマーカー", + "desc": [ + "【label】 : タイトルコンポーネント 【Widget?】", + "【textStyle】 : タイトルの色 【TextStyle?】", + "【textColor】 : タイトルのスタイル 【Color?】", + "【padding】 : タイトルの余白 【EdgeInsetsGeometry?】", + "【largeSize】 : ラベルがある場合の高さ 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge のオフセット", + "desc": [ + "【offset】 : マーカーのオフセット 【Offset?】", + "【alignment】 : タイトルのオフセット 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json new file mode 100644 index 00000000..56527a31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ko_KR.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "배지 컴포넌트", + "info": "Badge는 Material 스타일의 컴포넌트로, child 위에 배지를 추가할 수 있으며, Stack 컴포넌트를 사용하여 겹쳐서 구성됩니다.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Badge 점 표시 사용", + "desc": [ + "【backgroundColor】 : 배경색 【Color?】", + "【isLabelVisible】 : 표시 여부 【bool】", + "【smallSize】 : 라벨 없을 때 직경 【double?】", + "【child】 : 하위 컴포넌트 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge 라벨 표시", + "desc": [ + "【label】 : 제목 컴포넌트 【Widget?】", + "【textStyle】 : 제목 색상 【TextStyle?】", + "【textColor】 : 제목 스타일 【Color?】", + "【padding】 : 제목 여백 【EdgeInsetsGeometry?】", + "【largeSize】 : 라벨 있을 때 높이 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Badge의 오프셋", + "desc": [ + "【offset】 : 배지 오프셋 【Offset?】", + "【alignment】 : 제목 오프셋 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json new file mode 100644 index 00000000..e53be402 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_pt_PT.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Componente de Marcação", + "info": "O Badge é um componente de estilo Material que pode adicionar uma marcação sobreposta a um filho, dependendo do componente Stack para sobreposição durante a construção.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Uso do Badge com Marcação de Ponto", + "desc": [ + "【backgroundColor】 : Cor de fundo 【Color?】", + "【isLabelVisible】 : Se a marcação é visível 【bool】", + "【smallSize】 : Diâmetro sem etiqueta 【double?】", + "【child】 : Componente filho 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Badge com Marcação de Etiqueta", + "desc": [ + "【label】 : Componente de título 【Widget?】", + "【textStyle】 : Cor do título 【TextStyle?】", + "【textColor】 : Estilo do título 【Color?】", + "【padding】 : Margem do título 【EdgeInsetsGeometry?】", + "【largeSize】 : Altura com etiqueta 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Deslocamento do Badge", + "desc": [ + "【offset】 : Deslocamento da marcação 【Offset?】", + "【alignment】 : Deslocamento do título 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json new file mode 100644 index 00000000..8e577d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Badge/desc_ru_RU.json @@ -0,0 +1,40 @@ +{ + "id": 258, + "name": "Badge", + "localName": "Компонент метки", + "info": "Badge — это компонент в стиле Material, который может добавлять маркеры поверх дочернего элемента, при построении он зависит от компонента Stack для наложения.", + "lever": 2, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node_1.dart", + "name": "Использование круглой метки Badge", + "desc": [ + "【backgroundColor】 : Цвет фона 【Color?】", + "【isLabelVisible】 : Видимость метки 【bool】", + "【smallSize】 : Диаметр без метки 【double?】", + "【child】 : Дочерний компонент 【Widget?】" + ] + }, + { + "file": "node_2.dart", + "name": "Метка Badge с текстом", + "desc": [ + "【label】 : Компонент заголовка 【Widget?】", + "【textStyle】 : Цвет заголовка 【TextStyle?】", + "【textColor】 : Стиль заголовка 【Color?】", + "【padding】 : Отступы заголовка 【EdgeInsetsGeometry?】", + "【largeSize】 : Высота с меткой 【double?】," + ] + }, + { + "file": "node_3.dart", + "name": "Смещение Badge", + "desc": [ + "【offset】 : Смещение метки 【Offset?】", + "【alignment】 : Смещение заголовка 【AlignmentDirectional?】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json new file mode 100644 index 00000000..dac9cc9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Banner-Komponente", + "info": "Komponente zur Anzeige von Bannern. Kann eine Unterkomponente aufnehmen, ermöglicht die Auswahl der Position für das Banner und den Text sowie die Einstellung der Farbe.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Zur Anzeige eines Banners", + "desc": [ + "【message】 : Angezeigte Textnachricht 【String】", + "【location】 : Position*4 【BannerLocation】", + "【color】: Bannerfarbe 【Color】", + "【child】: Kind 【Widget】", + "【textStyle】: Textstil 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json new file mode 100644 index 00000000..a5111306 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Badge Component", + "info": "A component for displaying badges. It can accommodate one child component, allows for the selection of orientation to add badges and informational text, and can set colors.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a badge", + "desc": [ + "【message】: The text message to display 【String】", + "【location】: Position*4 【BannerLocation】", + "【color】: Badge color 【Color】", + "【child】: Child 【Widget】", + "【textStyle】: Text style 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json new file mode 100644 index 00000000..237d2e60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente de insignia", + "info": "Componente para mostrar insignias. Puede contener un subcomponente, permite elegir la ubicación para agregar la insignia y el texto informativo, y permite configurar el color.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Para mostrar una insignia", + "desc": [ + "【message】 : Información de texto a mostrar 【String】", + "【location】 : Ubicación*4 【BannerLocation】", + "【color】: Color de la insignia 【Color】", + "【child】: Hijo 【Widget】", + "【textStyle】: Estilo del texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json new file mode 100644 index 00000000..90aa4a5c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Composant de badge", + "info": "Composant pour l'affichage de badges. Peut contenir un composant enfant, permet de choisir l'emplacement pour ajouter un badge et du texte d'information, et de définir la couleur.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher un badge", + "desc": [ + "【message】 : Informations textuelles affichées 【String】", + "【location】 : Position*4 【BannerLocation】", + "【color】: Couleur du badge 【Color】", + "【child】: Enfant 【Widget】", + "【textStyle】: Style de texte 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json new file mode 100644 index 00000000..c3155408 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente Banner", + "info": "Componente per la visualizzazione di banner. Può contenere un componente figlio, permette di scegliere la posizione del banner e il testo informativo, e di impostare il colore.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un banner", + "desc": [ + "【message】 : Informazioni di testo visualizzate 【String】", + "【location】 : Posizione*4 【BannerLocation】", + "【color】: Colore del banner 【Color】", + "【child】: Figlio 【Widget】", + "【textStyle】: Stile del testo 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json new file mode 100644 index 00000000..c36e9bd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "バナーコンポーネント", + "info": "バナー表示用のコンポーネントです。1つの子コンポーネントを収容でき、バナーと情報テキストを追加する位置を選択し、色を設定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "バナーを表示するために使用されます", + "desc": [ + "【message】 : 表示するテキスト情報 【String】", + "【location】 : 位置*4 【BannerLocation】", + "【color】: バナー色 【Color】", + "【child】: 子 【Widget】", + "【textStyle】: テキストスタイル 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json new file mode 100644 index 00000000..e264df6f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "배너 컴포넌트", + "info": "배너 표시를 위한 컴포넌트입니다. 하나의 자식 컴포넌트를 포함할 수 있으며, 배너 및 정보 텍스트를 추가할 위치를 선택할 수 있고, 색상을 설정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "배너를 표시하는 데 사용", + "desc": [ + "【message】 : 표시할 텍스트 정보 【String】", + "【location】 : 위치*4 【BannerLocation】", + "【color】: 배너 색상 【Color】", + "【child】: 자식 【Widget】", + "【textStyle】: 텍스트 스타일 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json new file mode 100644 index 00000000..ed640258 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Componente de Banner", + "info": "Componente para exibição de banner. Pode conter um componente filho, permite escolher a posição para adicionar o banner e o texto informativo, e permite definir a cor.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um banner", + "desc": [ + "【message】 : Informação de texto exibida 【String】", + "【location】 : Posição*4 【BannerLocation】", + "【color】: Cor do banner 【Color】", + "【child】: Filho 【Widget】", + "【textStyle】: Estilo de texto 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json new file mode 100644 index 00000000..cbdc7915 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Banner/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 5, + "name": "Banner", + "localName": "Компонент для отображения уголка", + "info": "Компонент для отображения уголка. Может содержать один дочерний компонент, позволяет выбрать место для добавления уголка и текстовой информации, можно настроить цвет.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Для отображения уголка", + "desc": [ + "【message】 : Отображаемое текстовое сообщение 【String】", + "【location】 : Позиция*4 【BannerLocation】", + "【color】: Цвет уголка 【Color】", + "【child】: Дочерний элемент 【Widget】", + "【textStyle】: Стиль текста 【TextStyle】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json new file mode 100644 index 00000000..24a1898b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Unterer Schublade", + "info": "Als Komponente ist es eine einfache Strukturkomponente, die Form, Schattentiefe, Hintergrundfarbe und interne Komponentenkonstruktoren angeben kann. Es wird normalerweise durch die showBottomSheet-Methode von ScaffoldState von unten eingeblendet.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von BottomSheet", + "desc": [ + "【builder】 : Komponentenkonstruktor 【WidgetBuilder】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【onClosing】 : Schließrückruf 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json new file mode 100644 index 00000000..6c7e7bb9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Bottom Drawer", + "info": "As a component, it is a simple structural component that can specify shape, shadow depth, background color, and internal component constructors. It generally pops up from the bottom through the showBottomSheet method of ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of BottomSheet", + "desc": [ + "【builder】: Component constructor 【WidgetBuilder】", + "【backgroundColor】: Background color 【Color】", + "【elevation】: Shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】", + "【onClosing】: Closing callback 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json new file mode 100644 index 00000000..d919c811 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Cajón Inferior", + "info": "Como componente, es una estructura simple que puede especificar forma, profundidad de sombra, color de fondo y constructor de componentes internos. Generalmente se despliega desde la parte inferior mediante el método showBottomSheet de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de BottomSheet", + "desc": [ + "【builder】 : Constructor de componentes 【WidgetBuilder】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onClosing】 : Callback de cierre 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json new file mode 100644 index 00000000..05e874ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Tiroir inférieur", + "info": "En tant que composant, il s'agit d'un composant structurel simple qui peut spécifier la forme, la profondeur de l'ombre, la couleur de fond, le constructeur de composants internes, etc. Il est généralement affiché à partir du bas via la méthode showBottomSheet de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de BottomSheet", + "desc": [ + "【builder】 : Constructeur de composant 【WidgetBuilder】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【onClosing】 : Rappel de fermeture 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json new file mode 100644 index 00000000..9bf4f91d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Cassetto inferiore", + "info": "Come componente, è una struttura semplice che può specificare forma, profondità dell'ombra, colore di sfondo, costruttore di componenti interni. Di solito viene visualizzato dal basso tramite il metodo showBottomSheet di ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di BottomSheet", + "desc": [ + "【builder】 : Costruttore del componente 【WidgetBuilder】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onClosing】 : Callback di chiusura 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json new file mode 100644 index 00000000..1bf8340a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "ボトムシート", + "info": "コンポーネントとして、シンプルな構造コンポーネントであり、形状、影の深さ、背景色、内部コンポーネントのビルダーなどを指定できます。一般的にはScaffoldStateのshowBottomSheetメソッドを使用して下部からポップアップします。", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheetの基本使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【WidgetBuilder】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onClosing】 : 閉じるコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json new file mode 100644 index 00000000..d6ea73ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "하단 서랍", + "info": "컴포넌트로서는 간단한 구조 컴포넌트이며, 모양, 그림자 깊이, 배경색, 내부 컴포넌트 빌더 등을 지정할 수 있습니다. 일반적으로 ScaffoldState의 showBottomSheet 메소드를 통해 하단에서 팝업됩니다.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BottomSheet 기본 사용", + "desc": [ + "【builder】 : 컴포넌트 빌더 【WidgetBuilder】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【onClosing】 : 닫기 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json new file mode 100644 index 00000000..252fc7b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Gaveta Inferior", + "info": "Como componente, é uma estrutura simples que pode especificar forma, profundidade de sombra, cor de fundo, construtor de componentes internos, etc. Geralmente é exibido a partir da parte inferior através do método showBottomSheet do ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do BottomSheet", + "desc": [ + "【builder】: Construtor de Componentes 【WidgetBuilder】", + "【backgroundColor】: Cor de Fundo 【Color】", + "【elevation】: Profundidade de Sombra 【double】", + "【shape】: Forma 【ShapeBorder】", + "【onClosing】: Callback de Fechamento 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json new file mode 100644 index 00000000..777a625a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BottomSheet/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 142, + "name": "BottomSheet", + "localName": "Нижний ящик", + "info": "Как компонент, это простая структурная компонента, которая может быть настроена по форме, глубине тени, цвету фона и конструктору внутренних компонентов. Обычно появляется снизу с помощью метода showBottomSheet ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование BottomSheet", + "desc": [ + "【builder】 : Конструктор компонентов 【WidgetBuilder】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【onClosing】 : Обратный вызов при закрытии 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json new file mode 100644 index 00000000..5d5b14ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "BoxScrollView", + "info": "BoxScrollView ist eine abstrakte Klasse, die von ScrollView erbt und daher nicht direkt verwendet werden kann. Seine Unterklassen sind ListView und GridView. Normalerweise wird keine eigene Unterklasse implementiert, um es zu verwenden.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView Einführung", + "desc": [ + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【cacheExtent】 : Cache-Länge 【double】", + "【dragStartBehavior】 : Ziehverhalten 【DragStartBehavior】", + "【clipBehavior】 : Beschneidungsverhalten 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json new file mode 100644 index 00000000..b1f43857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Box Scroll View", + "info": "BoxScrollView is an abstract class that inherits from ScrollView, so it cannot be used directly. Its subclasses include ListView and GridView. Generally, you do not implement subclasses to use it.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to BoxScrollView", + "desc": [ + "【reverse】 : Whether to reverse 【bool】", + "【scrollDirection】 : Scroll direction 【Axis】", + "【cacheExtent】 : Cache length 【double】", + "【dragStartBehavior】 : Drag start behavior 【DragStartBehavior】", + "【clipBehavior】 : Clip behavior 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json new file mode 100644 index 00000000..a121e0ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vista de desplazamiento de caja", + "info": "BoxScrollView es una clase abstracta que hereda de ScrollView, por lo que no se puede usar directamente. Sus subclases son ListView y GridView. Generalmente no se implementa una subclase para usarla", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a BoxScrollView", + "desc": [ + "【reverse】 : ¿Invertido? 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【cacheExtent】 : Longitud de caché 【double】", + "【dragStartBehavior】 : Comportamiento de arrastre 【DragStartBehavior】", + "【clipBehavior】 : Comportamiento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json new file mode 100644 index 00000000..3e555427 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vue de défilement de boîte", + "info": "BoxScrollView est une classe abstraite héritée de ScrollView, donc elle ne peut pas être utilisée directement. Ses sous-classes incluent ListView et GridView. Généralement, on ne l'utilise pas en implémentant une sous-classe soi-même.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à BoxScrollView", + "desc": [ + "【reverse】 : Inverser ou non 【bool】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【cacheExtent】 : Longueur du cache 【double】", + "【dragStartBehavior】 : Comportement de glissement 【DragStartBehavior】", + "【clipBehavior】 : Comportement de découpage 【ClipBehavior】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json new file mode 100644 index 00000000..72c02fbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Vista a scorrimento a scatola", + "info": "BoxScrollView è una classe astratta che eredita da ScrollView, quindi non può essere utilizzata direttamente. Le sue sottoclassi includono ListView e GridView. Generalmente non si implementa una sottoclasse per utilizzarla", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a BoxScrollView", + "desc": [ + "【reverse】 : Se invertire 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【cacheExtent】 : Estensione della cache 【double】", + "【dragStartBehavior】 : Comportamento di trascinamento 【DragStartBehavior】", + "【clipBehavior】 : Comportamento di ritaglio 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json new file mode 100644 index 00000000..7c974d57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "ボックススクロールビュー", + "info": "BoxScrollView は ScrollView を継承した抽象クラスであるため、直接使用することはできません。そのサブクラスには ListView や GridView があります。通常、自分でサブクラスを実装して使用することはありません。", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 紹介", + "desc": [ + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【cacheExtent】 : キャッシュの長さ 【double】", + "【dragStartBehavior】 : ドラッグ開始の動作 【DragStartBehavior】", + "【clipBehavior】 : クリップ動作 【ClipBehavior】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json new file mode 100644 index 00000000..116839dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "박스 스크롤 뷰", + "info": "BoxScrollView는 ScrollView에서 상속된 추상 클래스이므로 직접 사용할 수 없습니다. 그 하위 클래스로는 ListView, GridView가 있습니다. 일반적으로 직접 하위 클래스를 구현하여 사용하지 않습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "BoxScrollView 소개", + "desc": [ + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【cacheExtent】 : 캐시 길이 【double】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【clipBehavior】 : 클리핑 동작 【ClipBehavior】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json new file mode 100644 index 00000000..7f91210a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Visualização de Rolagem de Caixa", + "info": "BoxScrollView é uma classe abstrata que herda de ScrollView, portanto, não pode ser usada diretamente. Suas subclasses incluem ListView e GridView. Geralmente, não se implementa subclasses para usá-la.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao BoxScrollView", + "desc": [ + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【cacheExtent】 : Extensão do cache 【double】", + "【dragStartBehavior】 : Comportamento de arrasto 【DragStartBehavior】", + "【clipBehavior】 : Comportamento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json new file mode 100644 index 00000000..e0fd153b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/BoxScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 350, + "name": "BoxScrollView", + "localName": "Прокручиваемое представление коробки", + "info": "BoxScrollView — это абстрактный класс, который наследуется от ScrollView, поэтому его нельзя использовать напрямую. Его подклассы включают ListView и GridView. Обычно не рекомендуется самостоятельно реализовывать подклассы для его использования.", + "lever": 1, + "family": 0, + "linkIds": [ + 183, + 162, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в BoxScrollView", + "desc": [ + "【reverse】 : Обратный порядок 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【cacheExtent】 : Размер кэша 【double】", + "【dragStartBehavior】 : Поведение при перетаскивании 【DragStartBehavior】", + "【clipBehavior】 : Поведение обрезки 【ClipBehavior】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json new file mode 100644 index 00000000..19ad0ac4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Konstruktor", + "info": "Eine Komponente, die den Platzbedarf von Unterkomponenten nicht beeinflusst und keine Anzeigeeigenschaften hat. Ihr einziger Wert besteht darin, den Kontext für das entsprechende Element der aktuellen Komponente bereitzustellen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Verwendung von Builder", + "desc": [ + "【builder】 : Komponentenkonstruktor 【WidgetBuilder】", + "Die Verwendung der Methode `XXX.of(context)` in derselben Klasse, um ein Zustandsobjekt einer bestimmten Klasse zu erhalten, kann zu einem `Kontextverzögerungsfehler` führen. Verwenden Sie Builder, um dies zu beheben." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json new file mode 100644 index 00000000..71fff413 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructor", + "info": "A component that does not affect the space occupied by child components and has no display properties. Its sole value is to provide the context for the corresponding element of the current component.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usage of Builder", + "desc": [ + "【builder】: Component Constructor 【WidgetBuilder】", + "Using `XXX.of(context)` to obtain a state object of a certain class within the same class may result in a 'context lag' error, which can be resolved using Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json new file mode 100644 index 00000000..899c3ee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructor", + "info": "Un componente que no afecta el espacio ocupado por los componentes secundarios y no tiene visibilidad, cuyo único valor es proporcionar el contexto del elemento correspondiente al componente actual.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de Builder", + "desc": [ + "【builder】: Constructor de componentes 【WidgetBuilder】", + "El uso del método `XXX.of(context)` para obtener un objeto de estado de una clase en la misma clase puede resultar en un error de `contexto desfasado`, que se resuelve utilizando Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json new file mode 100644 index 00000000..8db8b920 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Constructeur", + "info": "Un composant qui n'affecte pas l'espace occupé par les composants enfants et n'a pas de visibilité, dont la seule valeur est de fournir le contexte de l'élément correspondant au composant actuel.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de Builder", + "desc": [ + "【builder】 : Constructeur de composant 【WidgetBuilder】", + "L'utilisation de la méthode `XXX.of(context)` pour obtenir un objet d'état dans la même classe peut entraîner une erreur de `contexte en retard`, résolue en utilisant Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json new file mode 100644 index 00000000..dd8f1a8b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Costruttore", + "info": "Un componente che non influisce sullo spazio occupato dai componenti figli e non ha una visualizzazione, il cui unico scopo è fornire il contesto per l'elemento corrispondente del componente corrente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso del Builder", + "desc": [ + "【builder】 : Costruttore del componente 【WidgetBuilder】", + "L'uso del metodo `XXX.of(context)` per ottenere un oggetto di stato di un certo tipo nella stessa classe può causare un errore di `contesto in ritardo`, che viene risolto utilizzando Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json new file mode 100644 index 00000000..5483ea42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "ビルダー", + "info": "子コンポーネントのスペースに影響を与えず、表示性を持たないコンポーネントで、唯一の価値は現在のコンポーネントに対応する要素のコンテキストを提供することです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builderの使用", + "desc": [ + "【builder】 : コンポーネントビルダー 【WidgetBuilder】", + "同じクラス内で`XXX.of(context)`を使用して特定の状態オブジェクトを取得する方法には`コンテキストの遅延`というエラーが存在し、Builderを使用して解決します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json new file mode 100644 index 00000000..4a7d1878 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "빌더", + "info": "하위 컴포넌트의 공간을 차지하지 않고, 시각적으로 표시되지 않는 컴포넌트로, 현재 컴포넌트에 해당하는 요소의 컨텍스트를 제공하는 유일한 가치가 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Builder 사용법", + "desc": [ + "【builder】 : 컴포넌트 빌더 【WidgetBuilder】", + "동일한 클래스에서 `XXX.of(context)`를 사용하여 특정 상태 객체를 가져오는 방법은 `컨텍스트 지연` 오류가 발생할 수 있으며, 이를 해결하기 위해 Builder를 사용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json new file mode 100644 index 00000000..90fa2ca1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Construtor", + "info": "Um componente que não afeta o espaço ocupado pelos componentes filhos e não tem visibilidade, cujo único valor é fornecer o contexto do elemento correspondente ao componente atual.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do Builder", + "desc": [ + "【builder】 : Construtor de componentes 【WidgetBuilder】", + "O uso do método `XXX.of(context)` para obter o objeto de estado de uma classe dentro da mesma classe pode resultar em um erro de `contexto atrasado`, que é resolvido usando o Builder." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json new file mode 100644 index 00000000..e08118e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Builder/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 202, + "name": "Builder", + "localName": "Конструктор", + "info": "Компонент, который не влияет на занимаемое пространство дочерних компонентов и не имеет визуального отображения. Его единственная цель - предоставить контекст для соответствующего элемента текущего компонента.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование Builder", + "desc": [ + "【builder】 : Конструктор компонента 【WidgetBuilder】", + "Использование метода `XXX.of(context)` для получения объекта состояния определенного класса в одном и том же классе может привести к ошибке `задержки контекста`. Используйте Builder для решения этой проблемы." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json new file mode 100644 index 00000000..a4ab2fa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Schaltflächenleiste", + "info": "Empfängt eine Liste von Komponenten, die häufig verwendet wird, um mehrere Schaltflächen zu enthalten. Kann Ausrichtung, Ränder usw. angeben.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar-Ausrichtung", + "desc": [ + "【alignment】: Ausrichtung 【MainAxisAlignment】", + "【children】: Untergeordnete Komponenten 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar-Ränder und Höhe", + "desc": [ + "【buttonPadding】: Innenabstand 【EdgeInsetsGeometry】", + "【buttonHeight】: Höhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json new file mode 100644 index 00000000..5a3eddd8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Button Bar", + "info": "Receives a list of components, often used to hold several buttons. You can specify alignment, margins, and other information.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar Alignment", + "desc": [ + "【alignment】: Alignment 【MainAxisAlignment】", + "【children】: Child components 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar Margin and Height", + "desc": [ + "【buttonPadding】: Padding 【EdgeInsetsGeometry】", + "【buttonHeight】: Height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json new file mode 100644 index 00000000..c2ddb366 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra de botones", + "info": "Recibe una lista de componentes, comúnmente utilizada para contener varios botones. Se pueden especificar la alineación, los márgenes, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alineación de la Barra de botones", + "desc": [ + "【alignment】: Alineación 【MainAxisAlignment】", + "【children】: Conjunto de componentes hijos 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Márgenes y altura de la Barra de botones", + "desc": [ + "【buttonPadding】: Relleno interno 【EdgeInsetsGeometry】", + "【buttonHeight】: Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json new file mode 100644 index 00000000..329762a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barre de boutons", + "info": "Reçoit une liste de composants, souvent utilisée pour contenir plusieurs boutons. Peut spécifier l'alignement, les marges, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alignement de la barre de boutons", + "desc": [ + "【alignment】: Alignement 【MainAxisAlignment】", + "【children】: Ensemble de composants enfants 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Marge et hauteur de la barre de boutons", + "desc": [ + "【buttonPadding】: Marge intérieure 【EdgeInsetsGeometry】", + "【buttonHeight】: Hauteur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json new file mode 100644 index 00000000..f976469f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra dei pulsanti", + "info": "Riceve un elenco di componenti, spesso utilizzato per contenere diversi pulsanti. È possibile specificare l'allineamento, i margini, ecc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Allineamento della ButtonBar", + "desc": [ + "【alignment】: Allineamento 【MainAxisAlignment】", + "【children】: Insieme di componenti figli 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Margini e altezza della ButtonBar", + "desc": [ + "【buttonPadding】: Margine interno 【EdgeInsetsGeometry】", + "【buttonHeight】: Altezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json new file mode 100644 index 00000000..e2a5b021 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "ボタンバー", + "info": "コンポーネントリストを受け取り、通常はいくつかのボタンを配置するために使用されます。配置方法や余白などを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBarの配置方法", + "desc": [ + "【alignment】: 配置方法 【MainAxisAlignment】", + "【children】: 子コンポーネントセット 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBarの余白と高さ", + "desc": [ + "【buttonPadding】: 内側の余白 【EdgeInsetsGeometry】", + "【buttonHeight】: 高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json new file mode 100644 index 00000000..cc7d57b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "버튼 바", + "info": "컴포넌트 리스트를 받아들이며, 주로 여러 버튼을 담는 데 사용됩니다. 정렬 방식, 여백 등을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ButtonBar 정렬 방식", + "desc": [ + "【alignment】: 정렬 방식 【MainAxisAlignment】", + "【children】: 자식 컴포넌트 집합 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "ButtonBar 여백과 높이", + "desc": [ + "【buttonPadding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【buttonHeight】: 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json new file mode 100644 index 00000000..31ef2efc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Barra de Botões", + "info": "Recebe uma lista de componentes, frequentemente usada para conter vários botões. Pode especificar alinhamento, margens, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Alinhamento da Barra de Botões", + "desc": [ + "【alignment】: Alinhamento 【MainAxisAlignment】", + "【children】: Conjunto de componentes filhos 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Margens e Altura da Barra de Botões", + "desc": [ + "【buttonPadding】: Margem interna 【EdgeInsetsGeometry】", + "【buttonHeight】: Altura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json new file mode 100644 index 00000000..7a57b239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ButtonBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 29, + "name": "ButtonBar", + "localName": "Панель кнопок", + "info": "Принимает список компонентов, часто используется для размещения нескольких кнопок. Можно указать выравнивание, отступы и другую информацию.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Выравнивание ButtonBar", + "desc": [ + "【alignment】: Выравнивание 【MainAxisAlignment】", + "【children】: Набор дочерних компонентов 【List】" + ] + }, + { + "file": "node2_padding.dart", + "name": "Отступы и высота ButtonBar", + "desc": [ + "【buttonPadding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【buttonHeight】: Высота 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json new file mode 100644 index 00000000..350077f3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Kartenkomponente", + "info": " Basierend auf Material-Komponenten implementiert, wird verwendet, um eine einzelne Komponente zu karten. Es verleiht ihr einen Schatteneffekt, kann Außenabstände hinzufügen und die Form der Karte anpassen.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card kann eine Komponente karten", + "desc": [ + "【elevation】 : Schattentiefe 【double】", + "【margin】: Außenabstand 【double】", + "【color】: Farbe 【Color】", + "【child】: Kind 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Kann durch die shape-Eigenschaft einen Zuschneideeffekt erzielen", + "desc": [ + "【shape】 : Form 【ShapeBorder】", + "【margin】: Außenabstand 【double】", + "【color】: Farbe 【Color】", + "【child】: Kind 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json new file mode 100644 index 00000000..0e2687aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Card Component", + "info": "Implemented based on Material components, used to cardify a single component. It has a shadow effect, can add margin, and can customize the shape of the card.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card can cardify a component", + "desc": [ + "【elevation】: Shadow depth 【double】", + "【margin】: Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Can achieve clipping effect through the shape property", + "desc": [ + "【shape】: Shape 【ShapeBorder】", + "【margin】: Margin 【double】", + "【color】: Color 【Color】", + "【child】: Child 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json new file mode 100644 index 00000000..1306be48 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente de tarjeta", + "info": "Implementado basado en componentes Material, utilizado para convertir un solo componente en una tarjeta. Y hacer que tenga un efecto de sombra, se puede agregar margen exterior y también se puede personalizar la forma de la tarjeta.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card puede convertir un componente en una tarjeta", + "desc": [ + "【elevation】 : profundidad de la sombra 【double】", + "【margin】: margen exterior 【double】", + "【color】: color 【Color】", + "【child】: hijo 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Se puede lograr un efecto de recorte a través de la propiedad shape", + "desc": [ + "【shape】 : forma 【ShapeBorder】", + "【margin】: margen exterior 【double】", + "【color】: color 【Color】", + "【child】: hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json new file mode 100644 index 00000000..4430a0d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Composant Carte", + "info": " Basé sur les composants Material, utilisé pour transformer un composant unique en carte. Il peut avoir un effet d'ombre, peut ajouter des marges extérieures, et peut également personnaliser la forme de la carte.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card peut transformer un composant en carte", + "desc": [ + "【elevation】 : profondeur de l'ombre 【double】", + "【margin】: marge extérieure 【double】", + "【color】: couleur 【Color】", + "【child】: enfant 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Peut réaliser un effet de découpe via la propriété shape", + "desc": [ + "【shape】 : forme 【ShapeBorder】", + "【margin】: marge extérieure 【double】", + "【color】: couleur 【Color】", + "【child】: enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json new file mode 100644 index 00000000..d1c82e19 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente Carta", + "info": "Implementato basandosi sui componenti Material, utilizzato per trasformare un singolo componente in una carta. Con effetti di ombreggiatura, può includere margini esterni e consente la personalizzazione della forma della carta.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card può trasformare un componente in una carta", + "desc": [ + "【elevation】 : profondità dell'ombra 【double】", + "【margin】: margine esterno 【double】", + "【color】: colore 【Color】", + "【child】: figlio 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "È possibile ottenere effetti di ritaglio attraverso la proprietà shape", + "desc": [ + "【shape】 : forma 【ShapeBorder】", + "【margin】: margine esterno 【double】", + "【color】: colore 【Color】", + "【child】: figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json new file mode 100644 index 00000000..f3c87b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "カードコンポーネント", + "info": "Materialコンポーネントに基づいて実装され、単一のコンポーネントをカード化するために使用されます。また、投影効果を持たせることができ、外側の余白を追加したり、カードの形状をカスタマイズすることもできます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cardはコンポーネントをカード化することができます", + "desc": [ + "【elevation】 : 影の深さ 【double】", + "【margin】: 外側の余満 【double】", + "【color】: 色 【Color】", + "【child】: 子 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "shapeプロパティを使用して切り取り効果を実現できます", + "desc": [ + "【shape】 : 形状 【ShapeBorder】", + "【margin】: 外側の余満 【double】", + "【color】: 色 【Color】", + "【child】: 子 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json new file mode 100644 index 00000000..3bd5e796 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "카드 컴포넌트", + "info": "Material 컴포넌트를 기반으로 구현되었으며, 단일 컴포넌트를 카드화하는 데 사용됩니다. 그림자 효과를 가지며, 외부 여백을 추가할 수 있고, 카드 모양을 사용자 정의할 수도 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card는 컴포넌트를 카드화할 수 있습니다", + "desc": [ + "【elevation】 : 그림자 깊이 【double】", + "【margin】: 외부 여백 【double】", + "【color】: 색상 【Color】", + "【child】: 자식 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "shape 속성을 통해 잘라내기 효과를 구현할 수 있습니다", + "desc": [ + "【shape】 : 모양 【ShapeBorder】", + "【margin】: 외부 여백 【double】", + "【color】: 색상 【Color】", + "【child】: 자식 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json new file mode 100644 index 00000000..5dd17b24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Componente de Cartão", + "info": "Implementado com base em componentes Material, usado para transformar um único componente em um cartão. E fazê-lo ter um efeito de sombra, pode adicionar margem externa e também pode personalizar a forma do cartão.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O Card pode transformar um componente em um cartão", + "desc": [ + "【elevation】 : Profundidade da sombra 【double】", + "【margin】: Margem externa 【double】", + "【color】: Cor 【Color】", + "【child】: Filho 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Pode-se alcançar o efeito de corte através da propriedade shape", + "desc": [ + "【shape】 : Forma 【ShapeBorder】", + "【margin】: Margem externa 【double】", + "【color】: Cor 【Color】", + "【child】: Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json new file mode 100644 index 00000000..7b304d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Card/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 3, + "name": "Card", + "localName": "Карточка", + "info": "Реализовано на основе компонентов Material, используется для карточного оформления отдельного компонента. Имеет эффект тени, можно добавить внешние отступы, также можно настроить форму карточки.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Card может сделать компонент карточным", + "desc": [ + "【elevation】 : Глубина тени 【double】", + "【margin】: Внешний отступ 【double】", + "【color】: Цвет 【Color】", + "【child】: Дочерний элемент 【Widget】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Можно реализовать эффект обрезки с помощью свойства shape", + "desc": [ + "【shape】 : Форма 【ShapeBorder】", + "【margin】: Внешний отступ 【double】", + "【color】: Цвет 【Color】", + "【child】: Дочерний элемент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json new file mode 100644 index 00000000..327dfa24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Kachel mit Kontrollkästchen", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, hat eine linke und mittlere Struktur, wobei sich am Ende ein CheckBox befindet. An den entsprechenden Positionen können Komponenten eingefügt werden, was eine einfache Anpassung an spezifische Einträge ermöglicht.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung der CheckBoxListTile", + "desc": [ + "【secondary】: Linke Komponente 【Widget】", + "【checkColor】: Farbe des Häkchens 【Color】", + "【activeColor】: Farbe des Rahmens bei Auswahl 【Color】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【onChanged】: Auswahlereignis 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahleffekt der CheckBoxListTile", + "desc": [ + "【selected】: Ob ausgewählt 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft der CheckBoxListTile", + "desc": [ + "【dense】: Ob dicht angeordnet 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json new file mode 100644 index 00000000..0c257dc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Checkbox Tile", + "info": "A common list item structure provided by Flutter, featuring a left-middle structure with a CheckBox at the end. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic representation of CheckBoxListTile", + "desc": [ + "【secondary】: Left component 【Widget】", + "【checkColor】: ✔️ color 【Color】", + "【activeColor】: Frame color when selected 【Color】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【onChanged】: Selection event 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Selection effect of CheckBoxListTile", + "desc": [ + "【selected】: Whether selected 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of CheckBoxListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json new file mode 100644 index 00000000..076a7263 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Casilla de verificación", + "info": "Una estructura de lista genérica proporcionada por Flutter, con una estructura de izquierda a centro, y un CheckBox al final. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar fácilmente elementos específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento básico de CheckBoxListTile es el siguiente", + "desc": [ + "【secondary】: Componente izquierdo 【Widget】", + "【checkColor】: Color del ✔️ 【Color】", + "【activeColor】: Color del borde cuando está seleccionado 【Color】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de selección 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección de CheckBoxListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de densidad de CheckBoxListTile", + "desc": [ + "【dense】: Si está en modo denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json new file mode 100644 index 00000000..616d472e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Tuile de case à cocher", + "info": "Une structure de liste générique fournie par Flutter, de structure gauche-centre, avec une case à cocher à la fin. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de CheckBoxListTile est la suivante", + "desc": [ + "【secondary】: Composant gauche 【Widget】", + "【checkColor】: Couleur de la coche 【Color】", + "【activeColor】: Couleur de la bordure lors de la sélection 【Color】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【onChanged】: Événement de sélection 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection de CheckBoxListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de CheckBoxListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json new file mode 100644 index 00000000..c3891f1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Piastrella di selezione", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura sinistra-centro, e una casella di controllo alla fine. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile affrontare voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di CheckBoxListTile è la seguente", + "desc": [ + "【secondary】: Componente sinistro 【Widget】", + "【checkColor】: Colore del segno di spunta 【Color】", + "【activeColor】: Colore del bordo quando selezionato 【Color】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【onChanged】: Evento di selezione 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione di CheckBoxListTile", + "desc": [ + "【selected】: Se selezionato 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di disposizione compatta di CheckBoxListTile", + "desc": [ + "【dense】: Se disposto in modo compatto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json new file mode 100644 index 00000000..969448a1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "チェックボックスリストタイル", + "info": "Flutterが提供する汎用リストアイテム構造で、左中構造で、末尾にCheckBoxがあります。適切な位置にコンポーネントを挿入でき、特定のアイテムに簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTileの基本表現は以下の通りです", + "desc": [ + "【secondary】: 左側コンポーネント 【Widget】", + "【checkColor】: ✔️色 【Color】", + "【activeColor】: 選択時の外枠色 【Color】", + "【title】: 中央上部コンポーネント 【Widget】", + "【subtitle】: 中央下部コンポーネント 【Widget】", + "【onChanged】: 選択イベント 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTileの選択効果", + "desc": [ + "【selected】: 選択されているかどうか 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json new file mode 100644 index 00000000..06ab1886 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "체크박스 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 왼쪽과 중앙 구조이며, 끝에는 CheckBox가 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckBoxListTile의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【secondary】: 왼쪽 컴포넌트 【Widget】", + "【checkColor】: ✔️ 색상 【Color】", + "【activeColor】: 선택 시 외곽선 색상 【Color】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【onChanged】: 선택 이벤트 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "CheckBoxListTile의 선택 효과", + "desc": [ + "【selected】: 선택 여부 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "CheckBoxListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json new file mode 100644 index 00000000..fe70e862 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Azulejo de Seleção", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura esquerda-central, e uma CheckBox na extremidade. Componentes podem ser inseridos nas posições correspondentes, permitindo uma fácil adaptação a itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do CheckBoxListTile é a seguinte", + "desc": [ + "【secondary】: Componente do lado esquerdo 【Widget】", + "【checkColor】: Cor do ✔️ 【Color】", + "【activeColor】: Cor da moldura quando selecionado 【Color】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de seleção 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção do CheckBoxListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do CheckBoxListTile", + "desc": [ + "【dense】: Se está em alta densidade 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json new file mode 100644 index 00000000..e21dca7e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckboxListTile/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 17, + "name": "CheckboxListTile", + "localName": "Флажок плитки", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет лево-центральную структуру, а в конце находится CheckBox. Компоненты могут быть вставлены в соответствующие позиции, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление CheckBoxListTile выглядит следующим образом", + "desc": [ + "【secondary】: Левый компонент 【Widget】", + "【checkColor】: Цвет ✔️ 【Color】", + "【activeColor】: Цвет рамки при выборе 【Color】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【onChanged】: Событие выбора 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора CheckBoxListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения CheckBoxListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json new file mode 100644 index 00000000..16eb1fdd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "Debug-Label", + "info": "Wird nur im Debug-Modus in der oberen rechten Ecke angezeigt und hat keine große Bedeutung. Wird im MaterialApp-Komponenten-Quellcode verwendet.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CheckedModeBanner", + "desc": [ + "【child】 : Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json new file mode 100644 index 00000000..bcff1cf4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "debug label", + "info": "Only shows the corner mark in the upper right corner in debug mode, which is not very useful. There are usage scenarios in the MaterialApp component source code.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic usage of CheckedModeBanner", + "desc": [ + "【child】 : Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json new file mode 100644 index 00000000..69cdea9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etiqueta de depuración", + "info": "Solo muestra la esquina superior derecha en el modo de ejecución debug, no tiene mucha utilidad. Tiene un caso de uso en el código fuente del componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json new file mode 100644 index 00000000..cdce1d8c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "étiquette de débogage", + "info": "Affiche uniquement le badge en haut à droite en mode de débogage, ce qui n'est pas très utile. Utilisé dans le code source du composant MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CheckedModeBanner", + "desc": [ + "【child】 : composant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json new file mode 100644 index 00000000..970ea5b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etichetta di debug", + "info": "Mostra l'etichetta nell'angolo superiore destro solo in modalità debug, non ha molto uso. È utilizzato nel codice sorgente del componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json new file mode 100644 index 00000000..ef3ea16d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "デバッグタグ", + "info": "デバッグ実行モードでのみ右上の角に表示されるバッジで、あまり役に立ちません。MaterialAppコンポーネントのソースコードで使用例があります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBannerの基本的な使用", + "desc": [ + "【child】 : コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json new file mode 100644 index 00000000..7b034ecf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "디버그 라벨", + "info": "디버그 실행 모드에서만 오른쪽 상단 코너에 표시되며, 특별히 큰 의미는 없습니다. MaterialApp 컴포넌트 소스 코드에서 사용 사례가 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CheckedModeBanner 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json new file mode 100644 index 00000000..6f44c107 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "etiqueta de depuração", + "info": "Exibe o ícone no canto superior direito apenas no modo de execução de depuração, não tem muita utilidade. Há cenários de uso no código-fonte do componente MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CheckedModeBanner", + "desc": [ + "【child】 : componente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json new file mode 100644 index 00000000..b11b1401 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CheckedModeBanner/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 215, + "name": "CheckedModeBanner", + "localName": "отладочная метка", + "info": "Отображает значок в правом верхнем углу только в режиме отладки, не имеет особого значения. Используется в исходном коде компонента MaterialApp.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CheckedModeBanner", + "desc": [ + "【child】 : компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json new file mode 100644 index 00000000..222ba57f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_de_DE.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Kleine Leiste Komponente", + "info": "Eine horizontale, abgerundete kleine Leiste, die links, mittig und rechts Komponenten enthalten kann. Kann Farbe, Schattenfarbe und Klick-Ereignisse angeben.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Normale Darstellung des Chips wie folgt", + "desc": [ + "【avatar】: Linke Komponente 【Widget】", + "【label】: Mittlere Komponente 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【labelPadding】: Label-Abstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Farbe und Schatten können eingestellt werden", + "desc": [ + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【shadowColor】: Schattenfarbe 【Color】", + "【elevation】: Schattentiefe 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Rechte Klick-Schaltfläche kann eingestellt werden", + "desc": [ + "【deleteIcon】: Rechte Komponente (normalerweise ein Icon) 【Widget】", + "【deleteIconColor】: Farbe der rechten Komponente 【Color】", + "【onDeleted】: Klick-Ereignis der rechten Komponente 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json new file mode 100644 index 00000000..6318c42a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_en_US.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Chip Component", + "info": "A horizontal rounded bar that can contain left, middle, and right components. You can specify colors, shadow colors, and click events.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal appearance of Chip is as follows", + "desc": [ + "【avatar】: Left component 【Widget】", + "【label】: Middle component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【labelPadding】: Label padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "You can set colors and shadows", + "desc": [ + "【backgroundColor】: Background color 【Color】", + "【shadowColor】: Shadow color 【Color】", + "【elevation】: Shadow depth 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "You can set the right click button", + "desc": [ + "【deleteIcon】: Right component (usually an Icon) 【Widget】", + "【deleteIconColor】: Right component color 【Color】", + "【onDeleted】: Right component click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json new file mode 100644 index 00000000..0b116b3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_es_ES.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente de barra pequeña", + "info": "Una barra pequeña con bordes redondeados en horizontal, puede contener tres componentes: izquierdo, central y derecho. Se puede especificar el color, el color de la sombra y el evento de clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de Chip es el siguiente", + "desc": [ + "【avatar】: Componente izquierdo 【Widget】", + "【label】: Componente central 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【labelPadding】: Relleno del label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Se puede configurar el color y la sombra", + "desc": [ + "【backgroundColor】: Color de fondo 【Color】", + "【shadowColor】: Color de la sombra 【Color】", + "【elevation】: Profundidad de la sombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Se puede configurar el botón de clic derecho", + "desc": [ + "【deleteIcon】: Componente derecho (normalmente un Icono) 【Widget】", + "【deleteIconColor】: Color del componente derecho 【Color】", + "【onDeleted】: Evento de clic del componente derecho 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json new file mode 100644 index 00000000..dd86d847 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_fr_FR.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Composant Petite Barre", + "info": "Une petite barre horizontale aux bords arrondis, pouvant contenir trois composants à gauche, au centre et à droite. Peut spécifier la couleur, la couleur de l'ombre et l'événement de clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale de Chip est la suivante", + "desc": [ + "【avatar】: Composant gauche 【Widget】", + "【label】: Composant central 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【labelPadding】: Marge du label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Peut définir la couleur et l'ombre", + "desc": [ + "【backgroundColor】: Couleur de fond 【Color】", + "【shadowColor】: Couleur de l'ombre 【Color】", + "【elevation】: Profondeur de l'ombre 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Peut définir un bouton de clic à droite", + "desc": [ + "【deleteIcon】: Composant droit (généralement une icône) 【Widget】", + "【deleteIconColor】: Couleur du composant droit 【Color】", + "【onDeleted】: Événement de clic du composant droit 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json new file mode 100644 index 00000000..e8f38658 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_it_IT.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente Piccolo", + "info": "Una piccola barra orizzontale con bordi arrotondati, può contenere tre componenti: sinistro, centrale e destro. È possibile specificare il colore, il colore dell'ombra e l'evento di clic.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Il comportamento normale di Chip è il seguente", + "desc": [ + "【avatar】: Componente sinistro 【Widget】", + "【label】: Componente centrale 【Widget】", + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【labelPadding】: Spaziatura del label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "È possibile impostare il colore e l'ombra", + "desc": [ + "【backgroundColor】: Colore di sfondo 【Color】", + "【shadowColor】: Colore dell'ombra 【Color】", + "【elevation】: Profondità dell'ombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "È possibile impostare il pulsante di clic destro", + "desc": [ + "【deleteIcon】: Componente destro (solitamente Icon) 【Widget】", + "【deleteIconColor】: Colore del componente destro 【Color】", + "【onDeleted】: Evento di clic del componente destro 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json new file mode 100644 index 00000000..1da3165e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ja_JP.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "チップコンポーネント", + "info": "横方向の丸いエッジを持つ小さなバーで、左、中央、右の3つのコンポーネントを含むことができます。色、影の色、クリックイベントを指定できます。", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chipの通常の表現は以下の通りです", + "desc": [ + "【avatar】: 左側のコンポーネント 【Widget】", + "【label】: 中央のコンポーネント 【Widget】", + "【padding】 : パディング 【EdgeInsetsGeometry】", + "【labelPadding】: ラベルのパディング 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "色と影を設定できます", + "desc": [ + "【backgroundColor】: 背景色 【Color】", + "【shadowColor】: 影の色 【Color】", + "【elevation】: 影の深さ 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "右側のクリックボタンを設定できます", + "desc": [ + "【deleteIcon】: 右側のコンポーネント(通常はアイコン) 【Widget】", + "【deleteIconColor】: 右側のコンポーネントの色 【Color】", + "【onDeleted】: 右側のコンポーネントのクリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json new file mode 100644 index 00000000..01ab4fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ko_KR.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "작은 막대 컴포넌트", + "info": "가로로 된 둥근 모서리의 작은 막대로, 왼쪽, 중앙, 오른쪽 세 개의 컴포넌트를 포함할 수 있습니다. 색상, 그림자 색상 및 클릭 이벤트를 지정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Chip의 일반적인 모습은 다음과 같습니다", + "desc": [ + "【avatar】: 왼쪽 컴포넌트 【Widget】", + "【label】: 중앙 컴포넌트 【Widget】", + "【padding】 : 안쪽 여백 【EdgeInsetsGeometry】", + "【labelPadding】: label 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "색상과 그림자를 설정할 수 있습니다", + "desc": [ + "【backgroundColor】: 배경색 【Color】", + "【shadowColor】: 그림자 색상 【Color】", + "【elevation】: 그림자 깊이 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "오른쪽 클릭 버튼을 설정할 수 있습니다", + "desc": [ + "【deleteIcon】: 오른쪽 컴포넌트(일반적으로 Icon) 【Widget】", + "【deleteIconColor】: 오른쪽 컴포넌트 색상 【Color】", + "【onDeleted】: 오른쪽 컴포넌트 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json new file mode 100644 index 00000000..eddf2b10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_pt_PT.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Componente de Barra Pequena", + "info": "Uma pequena barra horizontal com bordas arredondadas que pode conter três componentes: esquerdo, central e direito. Pode especificar a cor, a cor da sombra e o evento de clique.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O comportamento normal do Chip é o seguinte", + "desc": [ + "【avatar】: Componente esquerdo 【Widget】", + "【label】: Componente central 【Widget】", + "【padding】 : Espaçamento interno 【EdgeInsetsGeometry】", + "【labelPadding】: Espaçamento do label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Pode definir cor e sombra", + "desc": [ + "【backgroundColor】: Cor de fundo 【Color】", + "【shadowColor】: Cor da sombra 【Color】", + "【elevation】: Profundidade da sombra 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Pode definir um botão de clique à direita", + "desc": [ + "【deleteIcon】: Componente direito (normalmente um ícone) 【Widget】", + "【deleteIconColor】: Cor do componente direito 【Color】", + "【onDeleted】: Evento de clique do componente direito 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json new file mode 100644 index 00000000..b540b89c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Chip/desc_ru_RU.json @@ -0,0 +1,45 @@ +{ + "id": 11, + "name": "Chip", + "localName": "Маленький компонент", + "info": "Горизонтальная полоска с закругленными краями, которая может содержать три компонента: левый, центральный и правый. Можно указать цвет, цвет тени и событие клика.", + "lever": 4, + "family": 0, + "linkIds": [ + 12, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное отображение Chip", + "desc": [ + "【avatar】: Левый компонент 【Widget】", + "【label】: Центральный компонент 【Widget】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【labelPadding】: Отступы для label 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_color.dart", + "name": "Можно задать цвет и тень", + "desc": [ + "【backgroundColor】: Цвет фона 【Color】", + "【shadowColor】: Цвет тени 【Color】", + "【elevation】: Глубина тени 【double】" + ] + }, + { + "file": "node3_delete.dart", + "name": "Можно задать кнопку клика справа", + "desc": [ + "【deleteIcon】: Правый компонент (обычно Icon) 【Widget】", + "【deleteIconColor】: Цвет правого компонента 【Color】", + "【onDeleted】: Событие клика правого компонента 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json new file mode 100644 index 00000000..4d334bfc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Auswahl-Chip", + "info": "Ähnlich wie die Chip-Komponente, aber mit einigen Auswahlattributen. Sie können die Farbe, die Schattenfarbe und das Auswahlereignis angeben, wenn sie ausgewählt ist.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die normale Darstellung des ChoiceChip ist wie folgt", + "desc": [ + "【selectedColor】: Farbe bei Auswahl 【Color】", + "【selectedShadowColor】: Schattenfarbe bei Auswahl 【Color】", + "【onSelected】: Auswahlereignis 【Fuction(bool)】", + " Andere Attribute sind identisch mit der Chip-Komponente, ohne rechte Komponente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json new file mode 100644 index 00000000..ff345510 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Choice Strip", + "info": "Similar in style to the Chip component, with some selectable properties. You can specify the color when selected, the shadow color, and the selection event.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The normal performance of ChoiceChip is as follows", + "desc": [ + "【selectedColor】: Color when selected 【Color】", + "【selectedShadowColor】: Shadow color when selected 【Color】", + "【onSelected】: Selection event 【Fuction(bool)】", + " Other properties are the same as the Chip component, with no right component." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json new file mode 100644 index 00000000..09e2d306 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Pestaña de selección", + "info": "Estilo similar al componente Chip, con algunas propiedades de selección. Puede especificar el color cuando está seleccionado, el color de la sombra y el evento de selección.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento normal de ChoiceChip es el siguiente", + "desc": [ + "【selectedColor】: Color cuando está seleccionado 【Color】", + "【selectedShadowColor】: Color de la sombra cuando está seleccionado 【Color】", + "【onSelected】: Evento de selección 【Fuction(bool)】", + " Otras propiedades son las mismas que el componente Chip, sin componente a la derecha." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json new file mode 100644 index 00000000..5b7a40db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Petite barre de sélection", + "info": "Un style similaire au composant Chip, avec quelques propriétés de sélection. Vous pouvez spécifier la couleur lorsqu'il est sélectionné, la couleur de l'ombre et l'événement de sélection.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale de ChoiceChip est la suivante", + "desc": [ + "【selectedColor】: Couleur lorsqu'il est sélectionné 【Color】", + "【selectedShadowColor】: Couleur de l'ombre lorsqu'il est sélectionné 【Color】", + "【onSelected】: Événement de sélection 【Fuction(bool)】", + " Les autres propriétés sont les mêmes que le composant Chip, sans composant à droite." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json new file mode 100644 index 00000000..281199d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Selezione Piccola Barra", + "info": "Uno stile simile al componente Chip, con alcune proprietà di selezione. È possibile specificare il colore selezionato, il colore dell'ombra e l'evento di selezione.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance normale di ChoiceChip è la seguente", + "desc": [ + "【selectedColor】: Colore selezionato 【Color】", + "【selectedShadowColor】: Colore dell'ombra selezionato 【Color】", + "【onSelected】: Evento di selezione 【Fuction(bool)】", + " Altre proprietà sono le stesse del componente Chip, senza componente a destra." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json new file mode 100644 index 00000000..5276900a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "選択チップ", + "info": "Chipコンポーネントと似たスタイルで、いくつかの選択属性があります。選択時の色、影の色、および選択イベントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChipの通常の表現は以下の通りです", + "desc": [ + "【selectedColor】: 選択時の色 【Color】", + "【selectedShadowColor】: 選択時の影の色 【Color】", + "【onSelected】: 選択イベント 【Fuction(bool)】", + " 他の属性はChipコンポーネントと同じで、右側のコンポーネントはありません。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json new file mode 100644 index 00000000..492a2aef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "선택 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 몇 가지 선택 속성이 있습니다. 선택 시 색상, 그림자 색상 및 선택 이벤트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ChoiceChip의 일반적인 표현은 다음과 같습니다", + "desc": [ + "【selectedColor】: 선택 시 색상 【Color】", + "【selectedShadowColor】: 선택 시 그림자 색상 【Color】", + "【onSelected】: 선택 이벤트 【Fuction(bool)】", + " 다른 속성은 Chip 컴포넌트와 동일하며, 오른쪽 컴포넌트는 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json new file mode 100644 index 00000000..3098e281 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Barra de Seleção", + "info": "Estilo semelhante ao componente Chip, com algumas propriedades de seleção. Pode especificar a cor quando selecionado, a cor da sombra e o evento de seleção.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "O comportamento normal do ChoiceChip é o seguinte", + "desc": [ + "【selectedColor】: Cor quando selecionado 【Color】", + "【selectedShadowColor】: Cor da sombra quando selecionado 【Color】", + "【onSelected】: Evento de seleção 【Fuction(bool)】", + " Outras propriedades são iguais ao componente Chip, sem componente à direita." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json new file mode 100644 index 00000000..8078651a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ChoiceChip/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 12, + "name": "ChoiceChip", + "localName": "Выбор полоски", + "info": "Стиль, похожий на компонент Chip, с некоторыми свойствами выбора. Можно указать цвет при выборе, цвет тени и событие выбора.", + "lever": 3, + "family": 0, + "linkIds": [ + 11, + 13, + 14, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Обычное поведение ChoiceChip следующее", + "desc": [ + "【selectedColor】: Цвет при выборе 【Color】", + "【selectedShadowColor】: Цвет тени при выборе 【Color】", + "【onSelected】: Событие выбора 【Fuction(bool)】", + " Остальные свойства такие же, как у компонента Chip, без правого компонента." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json new file mode 100644 index 00000000..ce5e95ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Rundes Widget", + "info": "Kann ein Bild in einen Kreis verwandeln und in der Mitte ein Widget platzieren. Es können Radius, Vordergrundfarbe, Hintergrundfarbe usw. angegeben werden.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Darstellung von CircleAvatar", + "desc": [ + "【radius】 : Radius 【double】", + "【backgroundImage】 : Bildressource 【ImageProvider】", + "【foregroundColor】: Vordergrundfarbe 【Color】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【minRadius】: Minimaler Radius 【double】", + "【maxRadius】: Maximaler Radius 【double】", + "【child】: Kind-Widget 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json new file mode 100644 index 00000000..d121b938 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Circular Component", + "info": "Can turn an image into a circle, and a component can be placed in the center. You can specify the radius, foreground color, background color, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar Performance", + "desc": [ + "【radius】: radius 【double】", + "【backgroundImage】: image resource 【ImageProvider】", + "【foregroundColor】: foreground color 【Color】", + "【backgroundColor】: background color 【Color】", + "【minRadius】: minimum radius 【double】", + "【maxRadius】: maximum radius 【double】", + "【child】: child component 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json new file mode 100644 index 00000000..d1bfae5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente Circular", + "info": "Puede convertir una imagen en un círculo y colocar un componente en el centro. Puede especificar el radio, el color de primer plano, el color de fondo, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamiento de CircleAvatar", + "desc": [ + "【radius】 : radio 【double】", + "【backgroundImage】 : recurso de imagen 【ImageProvider】", + "【foregroundColor】: color de primer plano 【Color】", + "【backgroundColor】: color de fondo 【Color】", + "【minRadius】: radio mínimo 【double】", + "【maxRadius】: radio máximo 【double】", + "【child】: componente hijo 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json new file mode 100644 index 00000000..bdbef6fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Composant Circulaire", + "info": "Permet de transformer une image en cercle et de placer un composant au centre. Peut spécifier le rayon, la couleur de premier plan, la couleur d'arrière-plan, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportement de CircleAvatar", + "desc": [ + "【radius】 : rayon 【double】", + "【backgroundImage】 : ressource d'image 【ImageProvider】", + "【foregroundColor】: couleur de premier plan 【Color】", + "【backgroundColor】: couleur d'arrière-plan 【Color】", + "【minRadius】: rayon minimum 【double】", + "【maxRadius】: rayon maximum 【double】", + "【child】: composant enfant 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json new file mode 100644 index 00000000..a225eb75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente circolare", + "info": "Trasforma un'immagine in un cerchio e può posizionare un componente al centro. È possibile specificare il raggio, il colore di primo piano, il colore di sfondo, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamento di CircleAvatar", + "desc": [ + "【radius】 : raggio 【double】", + "【backgroundImage】 : risorsa immagine 【ImageProvider】", + "【foregroundColor】: colore di primo piano 【Color】", + "【backgroundColor】: colore di sfondo 【Color】", + "【minRadius】: raggio minimo 【double】", + "【maxRadius】: raggio massimo 【double】", + "【child】: componente figlio 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json new file mode 100644 index 00000000..4b8adfce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "円形コンポーネント", + "info": "画像を円形にし、中央にコンポーネントを配置できます。半径、前景色、背景色などを指定できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatarの表現", + "desc": [ + "【radius】 : 半径 【double】", + "【backgroundImage】 : 画像リソース 【ImageProvider】", + "【foregroundColor】: 前景色 【Color】", + "【backgroundColor】: 背景色 【Color】", + "【minRadius】: 最小半径 【double】", + "【maxRadius】: 最大半径 【double】", + "【child】: 子コンポーネント 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json new file mode 100644 index 00000000..91fabafc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "원형 컴포넌트", + "info": "이미지를 원형으로 만들고 중앙에 컴포넌트를 배치할 수 있습니다. 반지름, 전경색, 배경색 등을 지정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CircleAvatar의 표현", + "desc": [ + "【radius】 : 반지름 【double】", + "【backgroundImage】 : 이미지 리소스 【ImageProvider】", + "【foregroundColor】: 전경색 【Color】", + "【backgroundColor】: 배경색 【Color】", + "【minRadius】: 최소 반지름 【double】", + "【maxRadius】: 최대 반지름 【double】", + "【child】: 자식 컴포넌트 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json new file mode 100644 index 00000000..7ac327c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Componente Circular", + "info": "Pode transformar uma imagem em um círculo e colocar um componente no meio. Pode especificar raio, cor de primeiro plano, cor de fundo, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Comportamento do CircleAvatar", + "desc": [ + "【radius】 : raio 【double】", + "【backgroundImage】 : recurso de imagem 【ImageProvider】", + "【foregroundColor】: cor de primeiro plano 【Color】", + "【backgroundColor】: cor de fundo 【Color】", + "【minRadius】: raio mínimo 【double】", + "【maxRadius】: raio máximo 【double】", + "【child】: componente filho 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json new file mode 100644 index 00000000..c76175ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CircleAvatar/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 9, + "name": "CircleAvatar", + "localName": "Круглый компонент", + "info": "Может превратить изображение в круг и разместить компонент в центре. Можно указать радиус, цвет переднего плана, цвет фона и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Поведение CircleAvatar", + "desc": [ + "【radius】 : радиус 【double】", + "【backgroundImage】 : ресурс изображения 【ImageProvider】", + "【foregroundColor】: цвет переднего плана 【Color】", + "【backgroundColor】: цвет фона 【Color】", + "【minRadius】: минимальный радиус 【double】", + "【maxRadius】: максимальный радиус 【double】", + "【child】: дочерний компонент 【Child】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json new file mode 100644 index 00000000..eabc3b82 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Schließen-Button", + "info": "Ein IconButton mit Schließfunktion, das Schließsymbol kann nicht geändert werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton-Klickereignis", + "desc": [ + "【onPressed】 : Klickereignis 【VoidCallback?】", + "【style】: Button-Stil 【ButtonStyle?】", + "【color】: Farbe 【Color】", + "Wenn onPressed leer ist, wird beim Klicken die aktuelle Oberfläche verlassen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json new file mode 100644 index 00000000..14e86541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Close Button", + "info": "An IconButton with close functionality, the close icon cannot be changed.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton Click Event", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "【color】: Color 【Color】", + "When onPressed is null, clicking will exit the current interface." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json new file mode 100644 index 00000000..9384aac0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Botón de cerrar", + "info": "Un IconButton con función de cerrar, el ícono de cerrar no se puede cambiar.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de CloseButton", + "desc": [ + "【onPressed】: Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "【color】: Color 【Color】", + "Cuando onPressed es nulo, al hacer clic se cerrará la interfaz actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json new file mode 100644 index 00000000..d05f99e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Bouton de fermeture", + "info": "Un IconButton avec une fonction de fermeture, l'icône de fermeture ne peut pas être modifiée.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic du CloseButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "【color】: Couleur 【Color】", + "Lorsque onPressed est vide, un clic quitte l'interface actuelle." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json new file mode 100644 index 00000000..8282b27e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Pulsante di chiusura", + "info": "Un IconButton con funzionalità di chiusura, l'icona di chiusura non può essere modificata.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic del Pulsante di chiusura", + "desc": [ + "【onPressed】: Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "【color】: Colore 【Color】", + "Quando onPressed è vuoto, il clic chiude l'interfaccia corrente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json new file mode 100644 index 00000000..452d7464 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "閉じるボタン", + "info": "閉じる機能を持つIconButtonで、閉じるアイコンは変更できません。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonクリックイベント", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "【color】: 色 【Color】", + "onPressedが空の場合、クリックすると現在の画面が閉じます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json new file mode 100644 index 00000000..dde13e43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "닫기 버튼", + "info": "닫기 기능이 있는 IconButton, 닫기 아이콘은 변경할 수 없습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButton 클릭 이벤트", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "【color】: 색상 【Color】", + "onPressed가 비어 있을 때, 클릭하면 현재 화면을 종료합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json new file mode 100644 index 00000000..1b9c9168 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Botão de Fechar", + "info": "Um IconButton com função de fechar, o ícone de fechar não pode ser alterado.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do CloseButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "【color】: Cor 【Color】", + "Quando onPressed estiver vazio, ao clicar, a interface atual será fechada." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json new file mode 100644 index 00000000..ce22d866 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButton/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 32, + "name": "CloseButton", + "localName": "Кнопка закрытия", + "info": "IconButton с функцией закрытия, значок закрытия нельзя изменить.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия кнопки CloseButton", + "desc": [ + "【onPressed】 : Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "【color】: Цвет 【Color】", + "Когда onPressed пуст, нажатие закрывает текущий интерфейс." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..89f22fb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Schaltfläche zum Schließen Symbol", + "info": "Ein Close Icon-Symbol, das je nach Plattform das entsprechende Symbol anzeigt und über ActionIconTheme angepasst werden kann.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon Effekt", + "desc": [ + "Passt das Symbol der Schaltfläche zum Schließen für verschiedene Plattformen über die _ActionIcon-Komponente gemäß dem ActionIconTheme an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json new file mode 100644 index 00000000..f2a5aaa0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Close Button Icon", + "info": "A close Icon that displays the corresponding icon based on the platform, and can be customized with ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the close button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..9df7ee0a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icono de botón de cierre", + "info": "Un icono de cierre, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de CloseButtonIcon", + "desc": [ + "A través del componente _ActionIcon, se adapta el icono del botón de cierre a diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..4237a4ea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icône de bouton de fermeture", + "info": "Une icône de fermeture, affichant l'icône correspondante selon la plateforme, peut être personnalisée via ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de CloseButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône de bouton de fermeture à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..4a687a0b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Icona del pulsante di chiusura", + "info": "Un'icona di chiusura, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata con il tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto CloseButtonIcon", + "desc": [ + "Attraverso il componente _ActionIcon, adatta l'icona del pulsante di chiusura a diverse piattaforme in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..5993f278 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "閉じるボタンアイコン", + "info": "閉じるアイコンで、プラットフォームに応じて対応するアイコンを表示します。ActionIconThemeでテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 効果", + "desc": [ + "_ActionIconコンポーネントを使用して、ActionIconThemeテーマに基づいて、異なるプラットフォームの閉じるボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..1e02127e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "닫기 버튼 아이콘", + "info": "닫기 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CloseButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 닫기 버튼 아이콘을 적용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..26d0adbb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Ícone do Botão de Fechar", + "info": "Um ícone de fechar que exibe o ícone correspondente de acordo com a plataforma, podendo ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do CloseButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão de fechar de acordo com o tema ActionIconTheme para diferentes plataformas." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..95657f89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CloseButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 274, + "name": "CloseButtonIcon", + "localName": "Иконка кнопки закрытия", + "info": "Иконка закрытия, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект CloseButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки закрытия для разных платформ в зависимости от темы ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json new file mode 100644 index 00000000..aac7c4db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_de_DE.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Container-Komponente", + "info": "Eine Container-Komponente, die ein einzelnes Unterelement aufnehmen kann. Integriert mehrere Funktionen von Unterelementen wie Innen- und Außenabstände, Transformationen, Dekorationen, Einschränkungen usw...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann verwendet werden, um einen Bereich mit einer bestimmten Breite und Höhe anzuzeigen", + "desc": [ + "【width】 : Breite 【int】", + "【height】: Höhe 【int】", + "【color】: Farbe 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Kann ein Unterelement in den Bereich einfügen", + "desc": [ + "【padding】 : Innenabstand 【EdgeInsetsGeometry】", + "【margin】: Außenabstand 【EdgeInsetsGeometry】", + "【child】: Unterelement 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Kann das Unterelement ausrichten und positionieren", + "desc": [ + "【alignment】 : Ausrichtung und Positionierung 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Kann das Unterelement dekorieren", + "desc": [ + "【decoration】 : Dekoration 【Decoration】", + "Kann dekorieren: Rahmen, abgerundete Ecken, Farbe, Verlauf, Schatten, Bilder usw." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container hat auch Transformationsfähigkeiten", + "desc": [ + "【transform】 : Transformationsmatrix 【Matrix4】", + "Matrix-Transformation basierend auf Matrix4, Details siehe lineare Algebra" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Einschränkungen des Containers", + "desc": [ + "【constraints】 : Einschränkungen 【BoxConstraints】", + "Schränkt die Größe des Bereichs ein, nicht kleiner als die angegebene minimale Breite und Höhe, und nicht größer als die angegebene maximale Breite und Höhe." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json new file mode 100644 index 00000000..3e1ce07f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_en_US.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Container Component", + "info": "A container component used to hold a single child component. It integrates several functionalities of single child components, such as padding, margin, transformation, decoration, constraints, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Can be used to display an area with specified width and height", + "desc": [ + "【width】 : width 【int】", + "【height】: height 【int】", + "【color】: color 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Can place a child component within the area", + "desc": [ + "【padding】 : padding 【EdgeInsetsGeometry】", + "【margin】: margin 【EdgeInsetsGeometry】", + "【child】: child component 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Can align and position the child component", + "desc": [ + "【alignment】 : alignment 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Can decorate the child component", + "desc": [ + "【decoration】 : decoration 【Decoration】", + "Can decorate: borders, rounded corners, colors, gradients, shadows, images, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container also has transformation capabilities", + "desc": [ + "【transform】 : transformation matrix 【Matrix4】", + "Matrix transformation based on Matrix4, see linear algebra for details" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Constraints of the Container", + "desc": [ + "【constraints】 : constraints 【BoxConstraints】", + "Will constrain the size of the area, it will not be smaller than the specified minimum width and height, nor larger than the specified maximum width and height." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json new file mode 100644 index 00000000..2fe57f96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_es_ES.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente Contenedor", + "info": "Componente contenedor utilizado para albergar un único componente hijo. Integra varias funciones de componentes hijos únicos, como márgenes internos y externos, transformaciones, decoraciones, restricciones, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Puede usarse para mostrar un área con un ancho y alto especificados", + "desc": [ + "【width】 : Ancho 【int】", + "【height】: Alto 【int】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Puede colocar un componente hijo dentro del área", + "desc": [ + "【padding】 : Relleno interno 【EdgeInsetsGeometry】", + "【margin】: Margen externo 【EdgeInsetsGeometry】", + "【child】: Componente hijo 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Puede alinear y posicionar el componente hijo", + "desc": [ + "【alignment】 : Alineación y posicionamiento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Puede decorar el componente hijo", + "desc": [ + "【decoration】 : Decoración 【Decoration】", + "Se puede decorar: bordes, esquinas redondeadas, colores, degradados, sombras, imágenes, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container también tiene capacidad de transformación", + "desc": [ + "【transform】 : Matriz de transformación 【Matrix4】", + "Transformación basada en la matriz Matrix4, los detalles de la transformación se pueden ver en álgebra lineal" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Restricciones de Container", + "desc": [ + "【constraints】 : Restricciones 【BoxConstraints】", + "Restringirá el tamaño del área, no será menor que el ancho y alto mínimo especificados, ni mayor que el ancho y alto máximo especificados." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json new file mode 100644 index 00000000..50c57bbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_fr_FR.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Composant conteneur", + "info": "Composant conteneur utilisé pour contenir un seul composant enfant. Intègre plusieurs fonctionnalités de composants enfants uniques, telles que les marges intérieures et extérieures, la transformation, la décoration, les contraintes, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut être utilisé pour afficher une zone de largeur et de hauteur spécifiées", + "desc": [ + "【width】 : Largeur 【int】", + "【height】: Hauteur 【int】", + "【color】: Couleur 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Peut contenir un composant enfant dans la zone", + "desc": [ + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】", + "【margin】: Marge extérieure 【EdgeInsetsGeometry】", + "【child】: Composant enfant 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Peut aligner et positionner le composant enfant", + "desc": [ + "【alignment】 : Alignement et positionnement 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Peut décorer le composant enfant", + "desc": [ + "【decoration】 : Décoration 【Decoration】", + "Peut décorer : bordures, coins arrondis, couleurs, dégradés, ombres, images, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Le Container a également des propriétés de transformation", + "desc": [ + "【transform】 : Matrice de transformation 【Matrix4】", + "Transformation matricielle basée sur Matrix4, voir l'algèbre linéaire pour plus de détails sur les transformations" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Les contraintes du Container", + "desc": [ + "【constraints】 : Contraintes 【BoxConstraints】", + "Contraint la taille de la zone, ne sera pas plus petite que la largeur et la hauteur minimales spécifiées, ni plus grande que la largeur et la hauteur maximales spécifiées." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json new file mode 100644 index 00000000..1ffcac6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_it_IT.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente contenitore", + "info": "Un componente contenitore utilizzato per contenere un singolo componente figlio. Integra diverse funzionalità per i componenti figli singoli, come margini interni ed esterni, trasformazioni, decorazioni, vincoli, ecc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può essere utilizzato per visualizzare un'area con larghezza e altezza specificate", + "desc": [ + "【width】 : Larghezza 【int】", + "【height】: Altezza 【int】", + "【color】: Colore 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Può contenere un componente figlio all'interno dell'area", + "desc": [ + "【padding】 : Spaziatura interna 【EdgeInsetsGeometry】", + "【margin】: Spaziatura esterna 【EdgeInsetsGeometry】", + "【child】: Componente figlio 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Può allineare e posizionare il componente figlio", + "desc": [ + "【alignment】 : Allineamento e posizionamento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Può decorare il componente figlio", + "desc": [ + "【decoration】 : Decorazione 【Decoration】", + "Può decorare: bordi, angoli arrotondati, colori, gradienti, ombre, immagini, ecc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container ha anche capacità di trasformazione", + "desc": [ + "【transform】 : Matrice di trasformazione 【Matrix4】", + "Trasformazione basata sulla matrice Matrix4, per i dettagli vedere l'algebra lineare" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Vincoli del Container", + "desc": [ + "【constraints】 : Vincoli 【BoxConstraints】", + "Vincolerà le dimensioni dell'area, non sarà inferiore alla larghezza e altezza minima specificata, né superiore alla larghezza e altezza massima specificata." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json new file mode 100644 index 00000000..1dfc93af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ja_JP.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "コンテナコンポーネント", + "info": "単一の子コンポーネントを収容するためのコンテナコンポーネントです。内部および外部の余白、変形、装飾、制約など、複数の単一子コンポーネントの機能を統合しています...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "指定された幅と高さの領域を表示するために使用できます", + "desc": [ + "【width】 : 幅 【int】", + "【height】: 高さ 【int】", + "【color】: 色 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "領域内に子コンポーネントを配置できます", + "desc": [ + "【padding】 : 内側の余白 【EdgeInsetsGeometry】", + "【margin】: 外側の余白 【EdgeInsetsGeometry】", + "【child】: 子コンポーネント 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "子コンポーネントを整列および配置できます", + "desc": [ + "【alignment】 : 整列および配置 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "子コンポーネントを装飾できます", + "desc": [ + "【decoration】 : 装飾 【Decoration】", + "装飾可能: ボーダー、角丸、色、グラデーション、シャドウ、画像など" + ] + }, + { + "file": "node5_transform.dart", + "name": "Containerは変形性も持っています", + "desc": [ + "【transform】 : 変換行列 【Matrix4】", + "Matrix4に基づく行列変換、変換の詳細は線形代数を参照してください" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Containerの制約性", + "desc": [ + "【constraints】 : 制約 【BoxConstraints】", + "この領域のサイズを制約し、指定された最小幅と高さより小さくならないようにし、指定された最大幅と高さより大きくならないようにします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json new file mode 100644 index 00000000..183d8026 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ko_KR.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "컨테이너 컴포넌트", + "info": "단일 자식 컴포넌트를 수용하는 컨테이너 컴포넌트입니다. 내부 및 외부 여백, 변형, 장식, 제약 등 여러 단일 자식 컴포넌트의 기능을 통합했습니다...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "지정된 너비와 높이의 영역을 표시할 수 있습니다", + "desc": [ + "【width】 : 너비 【int】", + "【height】: 높이 【int】", + "【color】: 색상 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "영역에 자식 컴포넌트를 넣을 수 있습니다", + "desc": [ + "【padding】 : 내부 여백 【EdgeInsetsGeometry】", + "【margin】: 외부 여백 【EdgeInsetsGeometry】", + "【child】: 자식 컴포넌트 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "자식 컴포넌트를 정렬 및 위치 지정할 수 있습니다", + "desc": [ + "【alignment】 : 정렬 및 위치 지정 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "자식 컴포넌트를 장식할 수 있습니다", + "desc": [ + "【decoration】 : 장식 【Decoration】", + "장식 가능: 테두리, 둥근 모서리, 색상, 그라데이션, 그림자, 이미지 등" + ] + }, + { + "file": "node5_transform.dart", + "name": "Container는 변환 기능도 가지고 있습니다", + "desc": [ + "【transform】 : 변환 행렬 【Matrix4】", + "Matrix4 기반의 행렬 변환, 변환 상세는 선형 대수 참조" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Container의 제약성", + "desc": [ + "【constraints】 : 제약 【BoxConstraints】", + "이 영역의 크기를 제한하며, 지정된 최소 너비와 높이보다 작지 않고, 지정된 최대 너비와 높이보다 크지 않습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json new file mode 100644 index 00000000..a4a4af6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_pt_PT.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Componente de Contêiner", + "info": "Componente de contêiner usado para acomodar um único componente filho. Integra várias funcionalidades de componentes filhos únicos, como margens internas e externas, transformações, decorações, restrições, etc...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode ser usado para exibir uma área com largura e altura especificadas", + "desc": [ + "【width】 : Largura 【int】", + "【height】: Altura 【int】", + "【color】: Cor 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Pode colocar um componente filho na área", + "desc": [ + "【padding】 : Margem interna 【EdgeInsetsGeometry】", + "【margin】: Margem externa 【EdgeInsetsGeometry】", + "【child】: Componente filho 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Pode alinhar e posicionar o componente filho", + "desc": [ + "【alignment】 : Alinhamento e posicionamento 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Pode decorar o componente filho", + "desc": [ + "【decoration】 : Decoração 【Decoration】", + "Pode decorar: bordas, arcos, cores, gradientes, sombras, imagens, etc." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container também possui transformações", + "desc": [ + "【transform】 : Matriz de transformação 【Matrix4】", + "Transformação de matriz baseada em Matrix4, detalhes da transformação veja álgebra linear" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Restrições do Container", + "desc": [ + "【constraints】 : Restrições 【BoxConstraints】", + "Irá restringir o tamanho da área, não será menor que a largura e altura mínima especificada, nem maior que a largura e altura máxima especificada." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json new file mode 100644 index 00000000..5ee7cd29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Container/desc_ru_RU.json @@ -0,0 +1,67 @@ +{ + "id": 1, + "name": "Container", + "localName": "Контейнерный компонент", + "info": "Контейнерный компонент для размещения одного дочернего компонента. Интегрирует несколько функций для одного дочернего компонента, таких как внутренние и внешние отступы, трансформации, декорации, ограничения и т.д...", + "lever": 5, + "family": 0, + "linkIds": [ + 74, + 85, + 80, + 78, + 70, + 123 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Может использоваться для отображения области с заданной шириной и высотой", + "desc": [ + "【width】 : Ширина 【int】", + "【height】: Высота 【int】", + "【color】: Цвет 【Color】" + ] + }, + { + "file": "node2_child.dart", + "name": "Можно поместить один дочерний компонент в область", + "desc": [ + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】", + "【margin】: Внешние отступы 【EdgeInsetsGeometry】", + "【child】: Дочерний компонент 【Widget】" + ] + }, + { + "file": "node3_alignment.dart", + "name": "Можно выровнять и позиционировать дочерний компонент", + "desc": [ + "【alignment】 : Выравнивание и позиционирование 【AlignmentGeometry】" + ] + }, + { + "file": "node4_decoration.dart", + "name": "Можно украсить дочерний компонент", + "desc": [ + "【decoration】 : Декорация 【Decoration】", + "Можно украсить: границы, скругления, цвет, градиент, тени, изображения и т.д." + ] + }, + { + "file": "node5_transform.dart", + "name": "Container также обладает трансформационными свойствами", + "desc": [ + "【transform】 : Матрица трансформации 【Matrix4】", + "Матричные преобразования на основе Matrix4, подробности см. в линейной алгебре" + ] + }, + { + "file": "node6_constraints.dart", + "name": "Ограничения Container", + "desc": [ + "【constraints】 : Ограничения 【BoxConstraints】", + "Ограничивает размер области, не позволяя ей быть меньше указанной минимальной ширины и высоты, а также больше указанной максимальной ширины и высоты." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json new file mode 100644 index 00000000..65402c8d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS-Aktionsblatt", + "info": "Ein iOS-stiliges Popup-Auswahlmenü, das mehrere Schaltflächen enthalten kann und normalerweise mit CupertinoActionSheetAction verwendet wird.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheet", + "desc": [ + "【title】 : Erstes Zeilenelement 【Widget】", + "【message】 : Zweites Zeilenelement 【Widget】", + "【cancelButton】 : Abbrechen-Schaltflächenelement 【Widget】", + "【actions】 : Liste der mittleren Elemente 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json new file mode 100644 index 00000000..26edfc6c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS Action Sheet", + "info": "A pop-up selection structure in iOS style that can hold multiple buttons, generally used in conjunction with CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheet", + "desc": [ + "【title】: First row component 【Widget】", + "【message】: Second row component 【Widget】", + "【cancelButton】: Component at the cancel button 【Widget】", + "【actions】: List of middle components 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json new file mode 100644 index 00000000..58157eac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Hoja de acciones de iOS", + "info": "Estructura de selección emergente al estilo de iOS, que puede contener múltiples botones, generalmente se usa junto con CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheet", + "desc": [ + "【title】 : Componente de la primera línea 【Widget】", + "【message】 : Componente de la segunda línea 【Widget】", + "【cancelButton】 : Componente del botón de cancelar 【Widget】", + "【actions】 : Lista de componentes intermedios 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json new file mode 100644 index 00000000..049a82aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Feuille d'action iOS", + "info": "Une structure de sélection contextuelle de style iOS, pouvant contenir plusieurs boutons, généralement utilisée avec CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheet", + "desc": [ + "【title】 : Composant de la première ligne 【Widget】", + "【message】 : Composant de la deuxième ligne 【Widget】", + "【cancelButton】 : Composant du bouton d'annulation 【Widget】", + "【actions】 : Liste des composants du milieu 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json new file mode 100644 index 00000000..80b95860 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Foglio di azione iOS", + "info": "Struttura di selezione pop-up in stile iOS, può contenere molti pulsanti, generalmente utilizzato insieme a CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheet", + "desc": [ + "【title】 : Componente della prima riga 【Widget】", + "【message】 : Componente della seconda riga 【Widget】", + "【cancelButton】 : Componente del pulsante di annullamento 【Widget】", + "【actions】 : Lista dei componenti centrali 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json new file mode 100644 index 00000000..79b13d24 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOSアクションシート", + "info": "iOSスタイルのポップアップ選択構造で、多くのボタンを配置でき、通常はCupertinoActionSheetActionと併用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetの基本的な使用", + "desc": [ + "【title】 : 最初の行のコンポーネント 【Widget】", + "【message】 : 2行目のコンポーネント 【Widget】", + "【cancelButton】 : キャンセルボタンのコンポーネント 【Widget】", + "【actions】 : 中間のコンポーネントリスト 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json new file mode 100644 index 00000000..ee43433d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS 행동 시트", + "info": "iOS 스타일의 팝업 선택 구조로, 여러 버튼을 넣을 수 있으며 일반적으로 CupertinoActionSheetAction과 함께 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheet 기본 사용", + "desc": [ + "【title】 : 첫 번째 줄 컴포넌트 【Widget】", + "【message】 : 두 번째 줄 컴포넌트 【Widget】", + "【cancelButton】 : 취소 버튼 컴포넌트 【Widget】", + "【actions】 : 중간 컴포넌트 목록 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json new file mode 100644 index 00000000..8b648e9c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "Folha de Ação iOS", + "info": "Estrutura de seleção pop-up no estilo iOS, que pode conter vários botões, geralmente usada em conjunto com CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActionSheet", + "desc": [ + "【title】 : Componente da primeira linha 【Widget】", + "【message】 : Componente da segunda linha 【Widget】", + "【cancelButton】 : Componente do botão de cancelamento 【Widget】", + "【actions】 : Lista de componentes do meio 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json new file mode 100644 index 00000000..9c74cbe5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheet/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 131, + "name": "CupertinoActionSheet", + "localName": "iOS лист действий", + "info": "Всплывающая структура выбора в стиле iOS, которая может содержать несколько кнопок, обычно используется вместе с CupertinoActionSheetAction.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheet", + "desc": [ + "【title】 : Компонент первой строки 【Widget】", + "【message】 : Компонент второй строки 【Widget】", + "【cancelButton】 : Компонент кнопки отмены 【Widget】", + "【actions】 : Список компонентов в середине 【List】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json new file mode 100644 index 00000000..804e501d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS-Aktionsblatt-Schaltfläche", + "info": "Eine Schaltfläche, die selten verwendet wird und normalerweise in CupertinoActionSheet verwendet wird, um Klickereignisse zu empfangen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheetAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json new file mode 100644 index 00000000..022777a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS Action Sheet Button", + "info": "A button with limited use cases, typically used in CupertinoActionSheet to receive click events.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheetAction", + "desc": [ + "【child】: Child widget 【Widget】", + "【isDefaultAction】: Whether it is the default action 【bool】", + "【onPressed】: Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json new file mode 100644 index 00000000..d5cef1aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Botón de hoja de acción de iOS", + "info": "Un botón con pocos escenarios de aplicación, generalmente utilizado en CupertinoActionSheet, que recibe eventos de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json new file mode 100644 index 00000000..a0f631bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Bouton iOS Action Sheet", + "info": "Un bouton, rarement utilisé, généralement utilisé dans CupertinoActionSheet, qui reçoit les événements de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheetAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce l'action par défaut 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json new file mode 100644 index 00000000..521cf337 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Pulsante iOS Action Sheet", + "info": "Un pulsante, utilizzato raramente, solitamente all'interno di CupertinoActionSheet, che riceve eventi di clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Selezionato per impostazione predefinita 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json new file mode 100644 index 00000000..1637d285 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOSアクションシートボタン", + "info": "ボタンで、使用シーンが少なく、通常はCupertinoActionSheetで使用され、クリックイベントを受け取ります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetActionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json new file mode 100644 index 00000000..07806fb6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "iOS 액션 시트 버튼", + "info": "버튼으로, 사용되는 경우가 드물며 주로 CupertinoActionSheet에서 사용되며 클릭 이벤트를 수신합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction 기본 사용법", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json new file mode 100644 index 00000000..14acf26b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Botão de ação iOS", + "info": "Um botão, usado raramente, normalmente usado em CupertinoActionSheet, que recebe eventos de clique.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Se selecionado por padrão 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json new file mode 100644 index 00000000..67f4b00b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoActionSheetAction/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 132, + "name": "CupertinoActionSheetAction", + "localName": "Кнопка iOS Action Sheet", + "info": "Кнопка, которая редко используется, обычно применяется в CupertinoActionSheet, принимает события нажатия.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheetAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано по умолчанию 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json new file mode 100644 index 00000000..c1f1085a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS-Dialog", + "info": "Ein universelles Dialogfeld im iOS-Stil, das Komponenten für Kopf, Mitte und Ende angeben kann.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoActionSheetAction", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【isDefaultAction】 : Standardmäßig ausgewählt 【bool】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json new file mode 100644 index 00000000..69536a55 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS Dialog", + "info": "A general dialog structure in iOS style, which can specify components at the head, middle, and tail.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoActionSheetAction", + "desc": [ + "【child】 : Child component 【Widget】", + "【isDefaultAction】 : Whether it is selected by default 【bool】", + "【onPressed】 : Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json new file mode 100644 index 00000000..5c240104 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Cuadro de diálogo de iOS", + "info": "Estructura de cuadro de diálogo genérico al estilo de iOS, que permite especificar componentes en la parte superior, media e inferior.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【isDefaultAction】 : Si está seleccionado por defecto 【bool】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json new file mode 100644 index 00000000..db43bdf7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Boîte de dialogue iOS", + "info": "Structure de boîte de dialogue générique de style iOS, permettant de spécifier des composants dans les sections d'en-tête, de corps et de pied.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoActionSheetAction", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【isDefaultAction】 : Est-ce que c'est l'action par défaut 【bool】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json new file mode 100644 index 00000000..989b952c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Finestra di dialogo iOS", + "info": "Struttura di dialogo generica in stile iOS, che consente di specificare i componenti nella parte superiore, centrale e inferiore.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【isDefaultAction】 : Selezionato per impostazione predefinita 【bool】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json new file mode 100644 index 00000000..d9c5d2d7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOSダイアログ", + "info": "iOSスタイルの汎用ダイアログ構造で、ヘッダー、中央、フッターのコンポーネントを指定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetActionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【isDefaultAction】 : デフォルトで選択されているかどうか 【bool】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json new file mode 100644 index 00000000..0b82317c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "iOS 대화 상자", + "info": "iOS 스타일의 일반적인 대화 상자 구조로, 머리, 중간, 꼬리 부분의 컴포넌트를 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoActionSheetAction 기본 사용", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【isDefaultAction】 : 기본 선택 여부 【bool】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json new file mode 100644 index 00000000..72870d68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Diálogo iOS", + "info": "Estrutura de diálogo genérica no estilo iOS, que permite especificar componentes no cabeçalho, corpo e rodapé.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoActionSheetAction", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【isDefaultAction】 : Selecionado por padrão 【bool】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json new file mode 100644 index 00000000..83a1cb23 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoAlertDialog/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 129, + "name": "CupertinoAlertDialog", + "localName": "Диалоговое окно iOS", + "info": "Универсальная структура диалогового окна в стиле iOS, позволяющая указать компоненты в верхней, средней и нижней частях.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoActionSheetAction", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【isDefaultAction】 : Выбрано ли по умолчанию 【bool】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json new file mode 100644 index 00000000..ec6a6739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Interaktive Ansicht", + "info": "Ein einfacher Button, der normalerweise in CupertinoAlertDialog verwendet wird und im Allgemeinen nicht allein verwendet wird.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Ist es die Standardaktion? 【bool】", + "【isDestructiveAction】 : Ist es eine zerstörerische Aktion? 【bool】", + "【textStyle】: Textstil 【TextStyle】", + "【onPressed】: Klickereignis 【VoidCallback】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json new file mode 100644 index 00000000..9f7bad2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Interactive View", + "info": "A simple button, usually used in CupertinoAlertDialog, and generally not used alone.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: Whether it is a default action 【bool】", + "【isDestructiveAction】: Whether it is a destructive action 【bool】", + "【textStyle】: Text style 【TextStyle】", + "【onPressed】: Click event 【VoidCallback】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json new file mode 100644 index 00000000..26e29ae5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista de interacción", + "info": "Un botón simple, generalmente utilizado en CupertinoAlertDialog, generalmente no se usa solo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: ¿Es una acción predeterminada? 【bool】", + "【isDestructiveAction】: ¿Es una acción destructiva? 【bool】", + "【textStyle】: Estilo de texto 【TextStyle】", + "【onPressed】: Evento de clic 【VoidCallback】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json new file mode 100644 index 00000000..d053bb52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vue d'interaction", + "info": "Un bouton simple, généralement utilisé dans CupertinoAlertDialog, généralement pas utilisé seul.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Est-ce une action par défaut 【bool】", + "【isDestructiveAction】 : Est-ce une action destructive 【bool】", + "【textStyle】: Style de texte 【TextStyle】", + "【onPressed】: Événement de clic 【VoidCallback】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json new file mode 100644 index 00000000..aeb2063c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista interattiva", + "info": "Un semplice pulsante, solitamente utilizzato in CupertinoAlertDialog, generalmente non utilizzato da solo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Se è un'operazione predefinita 【bool】", + "【isDestructiveAction】 : Se è un'operazione distruttiva 【bool】", + "【textStyle】: Stile del testo 【TextStyle】", + "【onPressed】: Evento di clic 【VoidCallback】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json new file mode 100644 index 00000000..fe4126ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "インタラクティブビュー", + "info": "シンプルなボタンで、通常はCupertinoAlertDialogで使用され、単独で使用されることはあまりありません。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogActionの基本的な使用", + "desc": [ + "【isDefaultAction】 : デフォルトの操作かどうか 【bool】", + "【isDestructiveAction】 : 破壊的な操作かどうか 【bool】", + "【textStyle】: テキストスタイル 【TextStyle】", + "【onPressed】: クリックイベント 【VoidCallback】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json new file mode 100644 index 00000000..103cd001 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "상호 작용 뷰", + "info": " 간단한 버튼으로, 일반적으로 CupertinoAlertDialog에서 사용되며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoDialogAction 기본 사용", + "desc": [ + "【isDefaultAction】 : 기본 작업인지 여부 【bool】", + "【isDestructiveAction】 : 파괴적인 작업인지 여부 【bool】", + "【textStyle】: 텍스트 스타일 【TextStyle】", + "【onPressed】: 클릭 이벤트 【VoidCallback】", + "【child】: 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json new file mode 100644 index 00000000..51d9d161 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Vista Interativa", + "info": "Um botão simples, geralmente usado em CupertinoAlertDialog, geralmente não é usado sozinho.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do CupertinoDialogAction", + "desc": [ + "【isDefaultAction】 : Se é uma ação padrão 【bool】", + "【isDestructiveAction】 : Se é uma ação destrutiva 【bool】", + "【textStyle】: Estilo de texto 【TextStyle】", + "【onPressed】: Evento de clique 【VoidCallback】", + "【child】: Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json new file mode 100644 index 00000000..920dca0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoDialogAction/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 352, + "name": "CupertinoDialogAction", + "localName": "Интерактивное представление", + "info": "Простая кнопка, обычно используется в CupertinoAlertDialog, как правило, не используется отдельно.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование CupertinoDialogAction", + "desc": [ + "【isDefaultAction】: Является ли действие по умолчанию 【bool】", + "【isDestructiveAction】: Является ли действие разрушительным 【bool】", + "【textStyle】: Стиль текста 【TextStyle】", + "【onPressed】: Событие нажатия 【VoidCallback】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json new file mode 100644 index 00000000..3dcd6104 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Vollbild-Dialog-Übergang", + "info": "Erstellt einen iOS-stilisierten Übergang für das Aufrufen eines Vollbild-Dialogs.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Komponenteneinführung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【linearTransition】 : Lineare Übergang 【bool】", + "【primaryRouteAnimation】 : Anfängliche Routenanimation 【Animation】", + "【secondaryRouteAnimation】 : Zweite Routenanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json new file mode 100644 index 00000000..fd77e830 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Full Page Transition", + "info": "Create an iOS-style transition for invoking a full-screen dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Component Introduction", + "desc": [ + "【child】 : Child component 【Widget】", + "【linearTransition】 : Whether to use linear transition 【bool】", + "【primaryRouteAnimation】 : Initial route animation 【Animation】", + "【secondaryRouteAnimation】 : Secondary route animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json new file mode 100644 index 00000000..9683edf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transición de diálogo de pantalla completa", + "info": "Crea una transición al estilo de iOS para invocar un diálogo de pantalla completa.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción del componente", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【linearTransition】 : ¿Transición lineal? 【bool】", + "【primaryRouteAnimation】 : Animación de ruta inicial 【Animation】", + "【secondaryRouteAnimation】 : Animación de ruta secundaria 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json new file mode 100644 index 00000000..1cb27210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transition de dialogue plein écran", + "info": "Crée une transition de style iOS pour afficher une boîte de dialogue en plein écran.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction du composant", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【linearTransition】 : Transition linéaire 【bool】", + "【primaryRouteAnimation】 : Animation de route initiale 【Animation】", + "【secondaryRouteAnimation】 : Animation de route secondaire 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json new file mode 100644 index 00000000..a0040840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transizione a schermo intero", + "info": "Crea una transizione in stile iOS per richiamare una finestra di dialogo a schermo intero.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione al componente", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【linearTransition】 : Transizione lineare 【bool】", + "【primaryRouteAnimation】 : Animazione della rotta iniziale 【Animation】", + "【secondaryRouteAnimation】 : Animazione della seconda rotta 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json new file mode 100644 index 00000000..e74986fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "全ページ遷移変換", + "info": "iOSスタイルの全画面ダイアログを呼び出すための遷移を作成します。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "コンポーネント紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【linearTransition】 : 線形変換かどうか 【bool】", + "【primaryRouteAnimation】 : 初期ルートアニメーション 【Animation】", + "【secondaryRouteAnimation】 : 第二ルートアニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json new file mode 100644 index 00000000..becc2777 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "전체 페이지 전환", + "info": "전체 화면 대화 상자를 불러오기 위한 iOS 스타일의 전환을 생성합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "컴포넌트 소개", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【linearTransition】 : 선형 전환 여부 【bool】", + "【primaryRouteAnimation】 : 초기 라우트 애니메이션 【Animation】", + "【secondaryRouteAnimation】 : 두 번째 라우트 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json new file mode 100644 index 00000000..9d275362 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Transição de Diálogo em Tela Cheia", + "info": "Cria uma transição no estilo iOS para exibir um diálogo em tela cheia.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao Componente", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【linearTransition】 : Transição linear 【bool】", + "【primaryRouteAnimation】 : Animação de rota inicial 【Animation】", + "【secondaryRouteAnimation】 : Animação de rota secundária 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json new file mode 100644 index 00000000..3d0cd07e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoFullscreenDialogTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 219, + "name": "CupertinoFullscreenDialogTransition", + "localName": "Переход на полный экран", + "info": "Создает переход в стиле iOS для вызова диалогового окна на весь экран.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в компонент", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【linearTransition】 : Линейный переход 【bool】", + "【primaryRouteAnimation】 : Анимация начального маршрута 【Animation】", + "【secondaryRouteAnimation】 : Анимация второго маршрута 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json new file mode 100644 index 00000000..341bea2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS-Stil Zurück-Button", + "info": "Cupertino-Stil Navigationsleiste Zurück-Button, kann Farbe und Klick-Ereignis angeben, wird normalerweise nicht allein verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Zurück-Buttons", + "desc": [ + "【onPressed】 : Klick-Ereignis 【VoidCallback】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json new file mode 100644 index 00000000..2c195438 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS Style Back Button", + "info": "A Cupertino-style navigation bar back button, which can specify color and click events, and is generally not used alone.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Back Button", + "desc": [ + "【onPressed】: Click event 【VoidCallback】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json new file mode 100644 index 00000000..4c7ecd85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Botón de retroceso de estilo iOS", + "info": "Botón de retroceso de la barra de navegación de estilo Cupertino, se puede especificar el color y el evento de clic, generalmente no se usa solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico del botón de retroceso", + "desc": [ + "【onPressed】 : Evento de clic 【VoidCallback】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json new file mode 100644 index 00000000..e43bfcc9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Bouton de retour de style iOS", + "info": "Bouton de retour de barre de navigation de style Cupertino, peut spécifier la couleur et l'événement de clic, généralement pas utilisé seul.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base du bouton de retour", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json new file mode 100644 index 00000000..5e70e8c3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Pulsante Indietro in stile iOS", + "info": "Pulsante Indietro per barra di navigazione in stile Cupertino, può specificare colore ed evento di clic, generalmente non utilizzato da solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base del pulsante Indietro", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json new file mode 100644 index 00000000..490051d1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOSスタイルの戻るボタン", + "info": "Cupertinoスタイルのナビゲーションバーの戻るボタンで、色とクリックイベントを指定できます。通常は単独で使用されません。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "戻るボタンの基本的な使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json new file mode 100644 index 00000000..b96301a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "iOS 스타일 뒤로 가기 버튼", + "info": "Cupertino 스타일의 네비게이션 바 뒤로 가기 버튼, 색상과 클릭 이벤트를 지정할 수 있으며, 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "뒤로 가기 버튼 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json new file mode 100644 index 00000000..4b820f15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Botão de Voltar no Estilo iOS", + "info": "Botão de voltar da barra de navegação no estilo Cupertino, pode especificar a cor e o evento de clique, geralmente não é usado sozinho.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Botão de Voltar", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json new file mode 100644 index 00000000..fbf25410 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoNavigationBarBackButton/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 218, + "name": "CupertinoNavigationBarBackButton", + "localName": "Кнопка возврата в стиле iOS", + "info": "Кнопка возврата в стиле Cupertino для навигационной панели, можно указать цвет и событие нажатия, обычно не используется отдельно.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование кнопки возврата", + "desc": [ + "【onPressed】 : Событие нажатия 【VoidCallback】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json new file mode 100644 index 00000000..e4153eef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Seitenübergangsanimation", + "info": "Bietet eine iOS-ähnliche Seitenübergangsanimation.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in CupertinoPageTransition", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【linearTransition】 : Lineare Transformation 【bool】", + "【primaryRouteAnimation】 : Anfängliche Routenanimation 【Animation】", + "【secondaryRouteAnimation】 : Zweite Routenanimation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json new file mode 100644 index 00000000..fc18cdc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Page Transition Animation", + "info": "Provides an iOS-style page transition animation.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to CupertinoPageTransition", + "desc": [ + "【child】 : Child widget 【Widget】", + "【linearTransition】 : Whether to use linear transition 【bool】", + "【primaryRouteAnimation】 : Primary route animation 【Animation】", + "【secondaryRouteAnimation】 : Secondary route animation 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json new file mode 100644 index 00000000..f1709460 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transición de página", + "info": "Proporciona una animación de transición de página al estilo de iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a CupertinoPageTransition", + "desc": [ + "【child】 : Widget hijo 【Widget】", + "【linearTransition】 : ¿Transición lineal? 【bool】", + "【primaryRouteAnimation】 : Animación de ruta inicial 【Animation】", + "【secondaryRouteAnimation】 : Animación de ruta secundaria 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json new file mode 100644 index 00000000..fb75a3d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transition de page", + "info": "Fournit une animation de transition de page de style iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à CupertinoPageTransition", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【linearTransition】 : Transition linéaire 【bool】", + "【primaryRouteAnimation】 : Animation de route initiale 【Animation】", + "【secondaryRouteAnimation】 : Animation de route secondaire 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json new file mode 100644 index 00000000..fb35028b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transizione di pagina", + "info": "Fornisce un'animazione di transizione di pagina in stile iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a CupertinoPageTransition", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【linearTransition】 : Transizione lineare 【bool】", + "【primaryRouteAnimation】 : Animazione della rotta iniziale 【Animation】", + "【secondaryRouteAnimation】 : Animazione della seconda rotta 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json new file mode 100644 index 00000000..0c5ec262 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "ページ遷移変換", + "info": "iOSスタイルのページ遷移アニメーション変換を提供します。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 紹介", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【linearTransition】 : 線形変換かどうか 【bool】", + "【primaryRouteAnimation】 : 初期ルートアニメーション 【Animation】", + "【secondaryRouteAnimation】 : 第二ルートアニメーション 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json new file mode 100644 index 00000000..fd8ae1e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "페이지 전환 효과", + "info": "iOS 스타일의 페이지 전환 애니메이션 효과를 제공합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPageTransition 소개", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【linearTransition】 : 선형 변환 여부 【bool】", + "【primaryRouteAnimation】 : 초기 라우트 애니메이션 【Animation】", + "【secondaryRouteAnimation】 : 두 번째 라우트 애니메이션 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json new file mode 100644 index 00000000..bcd91b93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Transição de Página", + "info": "Fornece uma animação de transição de página no estilo iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução à CupertinoPageTransition", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【linearTransition】 : Transição linear 【bool】", + "【primaryRouteAnimation】 : Animação de rota inicial 【Animation】", + "【secondaryRouteAnimation】 : Animação de segunda rota 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json new file mode 100644 index 00000000..f4ec7454 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPageTransition/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 216, + "name": "CupertinoPageTransition", + "localName": "Переход страницы", + "info": "Предоставляет анимацию перехода страницы в стиле iOS.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в CupertinoPageTransition", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【linearTransition】 : Линейное преобразование 【bool】", + "【primaryRouteAnimation】 : Начальная анимация маршрута 【Animation】", + "【secondaryRouteAnimation】 : Вторичная анимация маршрута 【Animation】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json new file mode 100644 index 00000000..46dd442c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Verschwommene Popup-Ebene", + "info": "Runde, rechteckige, verschwommene Hintergründe für iOS-Popups, die in Cupertino-stilisierten Dialogen verwendet werden.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface Verwendung", + "desc": [ + "【isSurfacePainted】 : Ob Weiß gemalt wird 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】", + "Testeffekt links isSurfacePainted = false, rechts isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json new file mode 100644 index 00000000..44cc5017 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Blur Popup Layer", + "info": "The rounded rectangle blur background of the ios popup box, applied in the source code to the dialog box of the Cupertino style.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface Usage", + "desc": [ + "【isSurfacePainted】: Whether to paint white 【bool】", + "【child】: Child component 【Widget】", + "Test effect: left isSurfacePainted = false, right isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json new file mode 100644 index 00000000..ca8be8bf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Capa emergente difuminada", + "info": "Fondo difuminado rectangular con bordes redondeados para cuadros emergentes de iOS, utilizado en diálogos de estilo Cupertino en el código fuente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso de CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Si se pinta en blanco 【bool】", + "【child】 : Componente hijo 【Widget】", + "Efecto de prueba: izquierda isSurfacePainted = false, derecha isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json new file mode 100644 index 00000000..8b78d066 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Fond flou de la fenêtre contextuelle", + "info": "Fond flou rectangulaire avec coins arrondis pour les boîtes de dialogue de style Cupertino, utilisé dans les dialogues de style Cupertino dans le code source.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Si le blanc est dessiné 【bool】", + "【child】 : Composant enfant 【Widget】", + "Effet de test : isSurfacePainted = false à gauche, isSurfacePainted = true à droite" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json new file mode 100644 index 00000000..11108416 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Livello popup sfocato", + "info": "Sfondo sfocato rettangolare con angoli arrotondati per le finestre popup iOS, utilizzato nei dialoghi in stile Cupertino nel codice sorgente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Se disegnare in bianco 【bool】", + "【child】 : Componente figlio 【Widget】", + "Testare l'effetto: a sinistra isSurfacePainted = false, a destra isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json new file mode 100644 index 00000000..8119b53f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "ぼかしポップアップレイヤー", + "info": "iOSポップアップボックスの角丸長方形のぼかし背景で、ソースコードではCupertinoスタイルのダイアログに適用されています。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface の使用", + "desc": [ + "【isSurfacePainted】 : 白を描画するかどうか 【bool】", + "【child】 : 子コンポーネント 【Widget】", + "テスト効果の左側は isSurfacePainted = false、右側は isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json new file mode 100644 index 00000000..33c52196 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "블러 팝업 레이어", + "info": "ios 팝업 상자의 둥근 모서리 사각형 블러 배경, 소스 코드에서 Cupertino 스타일의 대화 상자에 적용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "CupertinoPopupSurface 사용", + "desc": [ + "【isSurfacePainted】 : 흰색으로 그릴지 여부 【bool】", + "【child】 : 하위 위젯 【Widget】", + "테스트 효과 왼쪽 isSurfacePainted = false, 오른쪽 isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json new file mode 100644 index 00000000..c1856d16 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Camada de Pop-up Desfocada", + "info": "Fundo desfocado retangular com cantos arredondados para caixas de diálogo no estilo iOS, usado em caixas de diálogo de estilo Cupertino no código-fonte.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso do CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Se a superfície é pintada de branco 【bool】", + "【child】 : Componente filho 【Widget】", + "Efeito de teste: à esquerda isSurfacePainted = false, à direita isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json new file mode 100644 index 00000000..c9279fbb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoPopupSurface/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 217, + "name": "CupertinoPopupSurface", + "localName": "Размытый всплывающий слой", + "info": "Фон с закругленными углами и размытием для всплывающего окна iOS, используется в диалогах в стиле Cupertino в исходном коде.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Использование CupertinoPopupSurface", + "desc": [ + "【isSurfacePainted】 : Рисовать ли белый цвет 【bool】", + "【child】 : Дочерний компонент 【Widget】", + "Тестовый эффект: слева isSurfacePainted = false, справа isSurfacePainted = true" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json new file mode 100644 index 00000000..89d27cd1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS-Thema", + "info": "Das CupertinoThemeData-Objekt kann über CupertinoTheme.of abgerufen werden. Es kann auch ein Thema angegeben werden, das auf die Nachkommenkomponenten von CupertinoTheme angewendet wird.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Textstil-TextTheme", + "desc": [ + "Nachkommenkomponenten können die Daten des Themas über CupertinoTheme.of abrufen und verwenden." + ] + }, + { + "file": "node2_use.dart", + "name": "Verwendung von CupertinoThemeData", + "desc": [ + "Wie bei Theme können bestimmte Attribute angegeben werden, damit sie in den Nachkommen gemeinsam genutzt werden, allerdings gibt es weniger Attribute. Beachten Sie, dass Sie das Thema nicht im aktuellen Kontext abrufen können, wenn Sie es verwenden möchten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json new file mode 100644 index 00000000..4cff035c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS Theme", + "info": "You can obtain the CupertinoThemeData object through CupertinoTheme.of. You can also specify the theme to be applied to the descendant components of CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Text Style-TextTheme", + "desc": [ + "Descendant components can obtain and use the theme data through CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Usage of CupertinoThemeData", + "desc": [ + "Like Theme, you can share specified properties among descendants, but there are fewer properties. Note that if you need to use the theme, you cannot obtain it in the current context." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json new file mode 100644 index 00000000..59b37c1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema de iOS", + "info": "Puedes obtener el objeto CupertinoThemeData a través de CupertinoTheme.of. También puedes especificar que el tema se aplique a los componentes descendientes de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-TextTheme", + "desc": [ + "Los componentes descendientes pueden obtener y utilizar los datos del tema a través de CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de CupertinoThemeData", + "desc": [ + "Al igual que con Theme, puedes compartir ciertos atributos en los descendientes, aunque hay menos atributos. Ten en cuenta que si necesitas usar el tema, no puedes obtenerlo en el contexto actual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json new file mode 100644 index 00000000..db0b5859 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Thème iOS", + "info": "Vous pouvez obtenir l'objet CupertinoThemeData via CupertinoTheme.of. Vous pouvez également spécifier un thème à appliquer aux composants descendants de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Style de texte-TextTheme", + "desc": [ + "Les composants descendants peuvent utiliser les données du thème obtenues via CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Utilisation de CupertinoThemeData", + "desc": [ + "Comme avec Theme, vous pouvez partager des attributs spécifiés avec les descendants, bien qu'il y ait moins d'attributs. Notez que si vous avez besoin d'utiliser le thème, vous ne pouvez pas l'obtenir dans le contexte actuel." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json new file mode 100644 index 00000000..34539eaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema iOS", + "info": "È possibile ottenere l'oggetto CupertinoThemeData tramite CupertinoTheme.of. È anche possibile specificare un tema da applicare ai componenti discendenti di CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stile di testo-TextTheme", + "desc": [ + "I componenti discendenti possono ottenere e utilizzare i dati del tema tramite CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso di CupertinoThemeData", + "desc": [ + "Come con Theme, è possibile condividere attributi specifici tra i discendenti, anche se gli attributi sono meno numerosi. Nota: se è necessario utilizzare un tema, non è possibile ottenerlo nel contesto corrente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json new file mode 100644 index 00000000..2529887f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOSテーマ", + "info": "CupertinoTheme.ofを使用してCupertinoThemeDataオブジェクトを取得できます。また、テーマを指定してCupertinoThemeの子孫コンポーネントに適用することもできます。", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テキストスタイル-TextTheme", + "desc": [ + "子孫コンポーネントはCupertinoTheme.ofを使用してテーマのデータを取得して使用できます。" + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeDataの使用", + "desc": [ + "Themeと同様に、指定されたプロパティを使用して子孫で共有できますが、プロパティは少ないです。テーマを使用する必要がある場合、現在のcontextで取得できないことに注意してください。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json new file mode 100644 index 00000000..3e11e840 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS 테마", + "info": "CupertinoTheme.of를 통해 CupertinoThemeData 객체를 가져올 수 있습니다. 또한 테마를 지정하여 CupertinoTheme의 하위 구성 요소에 적용할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "텍스트 스타일-TextTheme", + "desc": [ + "하위 구성 요소는 CupertinoTheme.of를 통해 테마 데이터를 가져와 사용할 수 있습니다." + ] + }, + { + "file": "node2_use.dart", + "name": "CupertinoThemeData 사용", + "desc": [ + "Theme와 마찬가지로 지정된 속성을 통해 하위 구성 요소에서 공유할 수 있지만 속성이 적습니다. 테마를 사용해야 하는 경우 현재 context에서 가져올 수 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json new file mode 100644 index 00000000..e8078335 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "Tema iOS", + "info": "Pode obter o objeto CupertinoThemeData através de CupertinoTheme.of. Também pode especificar o tema para ser aplicado aos componentes descendentes de CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-TextTheme", + "desc": [ + "Os componentes descendentes podem obter os dados do tema através de CupertinoTheme.of para uso." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de CupertinoThemeData", + "desc": [ + "Assim como o Theme, pode compartilhar atributos especificados entre os descendentes, embora os atributos sejam menos. Note que, se precisar usar o tema, não pode obtê-lo no contexto atual." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json new file mode 100644 index 00000000..4cd4e908 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/CupertinoTheme/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 169, + "name": "CupertinoTheme", + "localName": "iOS тема", + "info": "Можно получить объект CupertinoThemeData через CupertinoTheme.of. Также можно указать тему для применения к дочерним компонентам CupertinoTheme.", + "lever": 3, + "family": 0, + "linkIds": [ + 156, + 168 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Стиль текста-TextTheme", + "desc": [ + "Дочерние компоненты могут использовать данные темы, полученные через CupertinoTheme.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Использование CupertinoThemeData", + "desc": [ + "Как и в случае с Theme, можно указать свойства, чтобы они были общими для дочерних элементов, но их меньше. Обратите внимание, что если нужно использовать тему, её нельзя получить в текущем контексте." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json new file mode 100644 index 00000000..436313dd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Datentabelle", + "info": "Eine Tabellenkomponente, die Logik für Klicken, Ändern, Sortieren usw. festlegen kann.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DataTable", + "desc": [ + "【columns】 : Spalten 【List】", + "【rows】 : Zeilen 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Sortierung von DataTable", + "desc": [ + "【sortColumnIndex】 : Spaltennummer 【int】", + "【columnSpacing】 : Spaltenabstand 【double】", + "【sortAscending】 : Aufsteigend sortieren 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json new file mode 100644 index 00000000..9178f352 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Data Table", + "info": "A table component that can be customized with logic for clicking, editing, sorting, etc.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DataTable", + "desc": [ + "【columns】 : columns 【List】", + "【rows】 : rows 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Sorting in DataTable", + "desc": [ + "【sortColumnIndex】 : column index 【int】", + "【columnSpacing】 : column spacing 【double】", + "【sortAscending】 : ascending order 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json new file mode 100644 index 00000000..16ed9cd6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabla de datos", + "info": "Un componente de tabla que permite realizar operaciones como hacer clic, modificar, ordenar, etc., con lógica personalizada.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DataTable", + "desc": [ + "【columns】 : columnas 【List】", + "【rows】 : filas 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordenación de DataTable", + "desc": [ + "【sortColumnIndex】 : índice de columna 【int】", + "【columnSpacing】 : espaciado de columnas 【double】", + "【sortAscending】 : orden ascendente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json new file mode 100644 index 00000000..76f390ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tableau de données", + "info": "Un composant de tableau qui permet de cliquer, modifier, trier, etc. en fonction de la logique définie.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DataTable", + "desc": [ + "【columns】 : colonnes 【List】", + "【rows】 : lignes 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Tri de DataTable", + "desc": [ + "【sortColumnIndex】 : numéro de colonne 【int】", + "【columnSpacing】 : espacement des colonnes 【double】", + "【sortAscending】 : ordre ascendant 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json new file mode 100644 index 00000000..b8cf7229 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabella dati", + "info": "Un componente tabella che può essere personalizzato con logiche per clic, modifiche, ordinamento e altre operazioni.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DataTable", + "desc": [ + "【columns】 : colonne 【List】", + "【rows】 : righe 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordinamento di DataTable", + "desc": [ + "【sortColumnIndex】 : indice della colonna 【int】", + "【columnSpacing】 : spaziatura tra le colonne 【double】", + "【sortAscending】 : ordine crescente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json new file mode 100644 index 00000000..4b3a32dc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "データテーブル", + "info": "テーブルコンポーネントで、クリック、編集、ソートなどの操作を論理的に設定できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTableの基本使用", + "desc": [ + "【columns】 : 列 【List】", + "【rows】 : 行 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTableのsort", + "desc": [ + "【sortColumnIndex】 : 列番号 【int】", + "【columnSpacing】 : 列間隔 【double】", + "【sortAscending】 : 順序かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json new file mode 100644 index 00000000..dfd1ec90 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "데이터 테이블", + "info": "테이블 컴포넌트로, 클릭, 수정, 정렬 등의 작업을 위한 로직을 지정할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DataTable 기본 사용", + "desc": [ + "【columns】 : 열 【List】", + "【rows】 : 행 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "DataTable의 정렬", + "desc": [ + "【sortColumnIndex】 : 열 번호 【int】", + "【columnSpacing】 : 열 간격 【double】", + "【sortAscending】 : 순서 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json new file mode 100644 index 00000000..3ab4fccc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Tabela de Dados", + "info": "Um componente de tabela que pode definir lógicas para cliques, modificações, ordenação e outras operações.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DataTable", + "desc": [ + "【columns】 : Colunas 【List】", + "【rows】 : Linhas 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Ordenação do DataTable", + "desc": [ + "【sortColumnIndex】 : Índice da Coluna 【int】", + "【columnSpacing】 : Espaçamento entre Colunas 【double】", + "【sortAscending】 : Ordem Ascendente 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json new file mode 100644 index 00000000..49b4af78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DataTable/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 102, + "name": "DataTable", + "localName": "Таблица данных", + "info": "Компонент таблицы, который позволяет настраивать логику для кликов, редактирования, сортировки и других операций.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DataTable", + "desc": [ + "【columns】 : Столбцы 【List】", + "【rows】 : Строки 【List】" + ] + }, + { + "file": "node2_operation.dart", + "name": "Сортировка DataTable", + "desc": [ + "【sortColumnIndex】 : Номер столбца 【int】", + "【columnSpacing】 : Расстояние между столбцами 【double】", + "【sortAscending】 : По возрастанию 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json new file mode 100644 index 00000000..8c78b48c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_de_DE.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Datumsauswahl", + "info": "Komponente zur Auswahl von Datumsangaben, die das aktuelle Datum, das ausgewählte Datum, den angezeigten Monat usw. festlegen kann und Datumsauswahlereignisse empfängt.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DayPicker", + "desc": [ + "【selectedDate】 : Ausgewähltes Datum 【DateTime】", + "【currentDate】 : Aktuelles Datum 【DateTime】", + "【firstDate】 : Frühestes Datum 【DateTime】", + "【lastDate】 : Spätestes Datum 【DateTime】", + "【displayedMonth】 : Aktuell angezeigter Monat 【DateTime】", + "【onChanged】 : Klick-Rückruf 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker Datumsauswahl ist mit Flutter3.0 ausgelaufen. Der Ersatz ist der CalendarDatePicker Kalenderauswahl.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json new file mode 100644 index 00000000..3e27118a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_en_US.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Date Picker", + "info": "A component for selecting dates, which can specify the current date, selected date, displayed month, etc., and receives date selection events.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DayPicker", + "desc": [ + "【selectedDate】 : Selected date 【DateTime】", + "【currentDate】 : Current date 【DateTime】", + "【firstDate】 : Earliest date limit 【DateTime】", + "【lastDate】 : Latest date limit 【DateTime】", + "【displayedMonth】 : Currently displayed month 【DateTime】", + "【onChanged】 : Click callback 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker date picker has exited the stage of history in Flutter 3.0. It is replaced by the CalendarDatePicker calendar picker.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json new file mode 100644 index 00000000..5ff44e94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_es_ES.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Selector de Fecha", + "info": "Componente de selección de fecha, puede especificar la fecha actual, la fecha seleccionada, el mes mostrado, etc., y recibe eventos de selección de fecha.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DayPicker", + "desc": [ + "【selectedDate】 : Fecha seleccionada 【DateTime】", + "【currentDate】 : Fecha actual 【DateTime】", + "【firstDate】 : Límite de la fecha más temprana 【DateTime】", + "【lastDate】 : Límite de la fecha más tardía 【DateTime】", + "【displayedMonth】 : Mes actualmente mostrado 【DateTime】", + "【onChanged】 : Retroalimentación al hacer clic 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, el selector de fecha, dejó de usarse en Flutter 3.0. Su reemplazo es CalendarDatePicker, el selector de calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json new file mode 100644 index 00000000..83f9d199 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_fr_FR.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Sélecteur de date", + "info": "Composant de sélection de date, permet de spécifier la date actuelle, la date sélectionnée, le mois affiché, etc., et reçoit les événements de sélection de date.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DayPicker", + "desc": [ + "【selectedDate】 : Date sélectionnée 【DateTime】", + "【currentDate】 : Date actuelle 【DateTime】", + "【firstDate】 : Limite de la première date 【DateTime】", + "【lastDate】 : Limite de la dernière date 【DateTime】", + "【displayedMonth】 : Mois actuellement affiché 【DateTime】", + "【onChanged】 : Rappel de clic 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le sélecteur de date DayPicker a quitté la scène historique avec Flutter 3.0. Il est remplacé par le sélecteur de calendrier CalendarDatePicker.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json new file mode 100644 index 00000000..f757f8ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_it_IT.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Selettore di data", + "info": "Componente per la selezione della data, consente di specificare la data corrente, la data selezionata, il mese visualizzato, ecc., e riceve l'evento di selezione della data.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzo di base di DayPicker", + "desc": [ + "【selectedDate】 : Data selezionata 【DateTime】", + "【currentDate】 : Data corrente 【DateTime】", + "【firstDate】 : Limite della data più antica 【DateTime】", + "【lastDate】 : Limite della data più recente 【DateTime】", + "【displayedMonth】 : Mese attualmente visualizzato 【DateTime】", + "【onChanged】 : Callback al click 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, il selettore di date, è stato ritirato da Flutter 3.0. Il suo sostituto è CalendarDatePicker, il selettore di calendario.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json new file mode 100644 index 00000000..d6b67801 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ja_JP.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "日付ピッカー", + "info": "日付を選択するコンポーネントで、現在の日付、選択された日付、表示する月などを指定できます。日付が選択されたイベントを受け取ります。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPickerの基本的な使用法", + "desc": [ + "【selectedDate】 : 選択された日付 【DateTime】", + "【currentDate】 : 現在の日付 【DateTime】", + "【firstDate】 : 最初の日付制限 【DateTime】", + "【lastDate】 : 最後の日付制限 【DateTime】", + "【displayedMonth】 : 現在表示されている月 【DateTime】", + "【onChanged】 : クリックコールバック 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 日付ピッカーは Flutter3.0 で歴史の舞台から退場しました。代替として CalendarDatePicker カレンダーピッカーがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json new file mode 100644 index 00000000..addf834e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ko_KR.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "날짜 선택기", + "info": "날짜 선택 컴포넌트로, 현재 날짜, 선택된 날짜, 표시할 월 등을 지정할 수 있으며, 날짜 선택 이벤트를 수신합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DayPicker 기본 사용", + "desc": [ + "【selectedDate】 : 선택된 날짜 【DateTime】", + "【currentDate】 : 현재 날짜 【DateTime】", + "【firstDate】 : 가장 이른 날짜 제한 【DateTime】", + "【lastDate】 : 가장 늦은 날짜 제한 【DateTime】", + "【displayedMonth】 : 현재 표시되는 월 【DateTime】", + "【onChanged】 : 클릭 콜백 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker 날짜 선택기는 Flutter3.0에서 역사의 뒤안길로 사라졌습니다. 이를 대체하는 것은 CalendarDatePicker 캘린더 선택기입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json new file mode 100644 index 00000000..26c93566 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_pt_PT.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Seletor de Data", + "info": "Componente de seleção de data, pode especificar a data atual, a data selecionada, o mês exibido, etc., e recebe eventos de seleção de data.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DayPicker", + "desc": [ + "【selectedDate】 : Data selecionada 【DateTime】", + "【currentDate】 : Data atual 【DateTime】", + "【firstDate】 : Limite da data mais antiga 【DateTime】", + "【lastDate】 : Limite da data mais recente 【DateTime】", + "【displayedMonth】 : Mês atualmente exibido 【DateTime】", + "【onChanged】 : Callback de clique 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'O DayPicker, o seletor de data, saiu de cena no Flutter 3.0. O substituto é o CalendarDatePicker, o seletor de calendário.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json new file mode 100644 index 00000000..d0b916f1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DayPicker/desc_ru_RU.json @@ -0,0 +1,61 @@ +{ + "id": 134, + "name": "DayPicker", + "localName": "Выбор даты", + "info": "Компонент для выбора даты, который позволяет указать текущую дату, выбранную дату, отображаемый месяц и т.д., а также получать события выбора даты.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 135, + 136 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DayPicker", + "desc": [ + "【selectedDate】 : Выбранная дата 【DateTime】", + "【currentDate】 : Текущая дата 【DateTime】", + "【firstDate】 : Ограничение на самую раннюю дату 【DateTime】", + "【lastDate】 : Ограничение на самую позднюю дату 【DateTime】", + "【displayedMonth】 : Отображаемый месяц 【DateTime】", + "【onChanged】 : Обратный вызов при клике 【Function(DateTime)】", + " ", + "import 'package:flutter/material.dart';", + "", + "class CustomDayPicker extends StatelessWidget{", + "", + " const CustomDayPicker({Key? key) : super(key: key);", + "", + " final String info =", + " 'DayPicker, компонент выбора даты, ушел в историю с выходом Flutter 3.0. Его заменил CalendarDatePicker, компонент выбора даты из календаря.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " final DateTime _date = DateTime.now();", + " ", + " @override", + " Widget build(BuildContext context) {", + " return SizedBox(", + " height: 350,", + " child: DayPicker(", + " selectedDate: _date,", + " currentDate: DateTime.now(),", + " onChanged: (date)=> setState(() => _date = date),", + " firstDate: DateTime(2018),", + " lastDate: DateTime(2030),", + " displayedMonth: DateTime.now()", + " )," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json new file mode 100644 index 00000000..b27282e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Dialogfeld", + "info": "Das einfachste Dialogfeld-Panel, das eine Inhaltskomponente enthält und Eigenschaften wie Schattentiefe, Hintergrundfarbe, Form usw. angeben kann.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung des Dialogs", + "desc": [ + "【child】: Animationssymboldaten 【Widget】", + "【elevation】: Schattentiefe 【double】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json new file mode 100644 index 00000000..97d42177 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Dialog Box", + "info": "The simplest dialog panel, containing a content component, with properties such as shadow depth, background color, shape, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Dialog", + "desc": [ + "【child】: Animation icon data 【Widget】", + "【elevation】: Shadow depth 【double】", + "【backgroundColor】: Background color 【Color】", + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json new file mode 100644 index 00000000..f3ca155d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Cuadro de diálogo", + "info": "El panel de cuadro de diálogo más simple, que incluye un componente de contenido, puede especificar propiedades como la profundidad de la sombra, el color de fondo, la forma, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Dialog", + "desc": [ + "【child】 : Datos del ícono de animación 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】", + "【backgroundColor】 : Color de fondo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json new file mode 100644 index 00000000..89e47cc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Boîte de dialogue", + "info": "Le panneau de boîte de dialogue le plus simple, contenant un composant de contenu, peut spécifier des propriétés telles que la profondeur d'ombre, la couleur de fond, la forme, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de la boîte de dialogue", + "desc": [ + "【child】 : Données de l'icône animée 【Widget】", + "【elevation】 : Profondeur d'ombre 【double】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json new file mode 100644 index 00000000..45c1c186 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Finestra di dialogo", + "info": "Il pannello di dialogo più semplice, contiene un componente di contenuto, può specificare proprietà come profondità dell'ombra, colore di sfondo, forma, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Dialog", + "desc": [ + "【child】 : Dati dell'icona animata 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json new file mode 100644 index 00000000..509250c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "ダイアログ", + "info": "最もシンプルなダイアログパネルで、コンテンツコンポーネントを含み、影の深さ、背景色、形状などの属性を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog基本使用", + "desc": [ + "【child】 : アニメーションアイコンデータ 【Widget】", + "【elevation】 : 影の深さ 【double】", + "【backgroundColor】 : 背景色 【Color】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json new file mode 100644 index 00000000..bbbda132 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "대화 상자", + "info": "가장 간단한 대화 상자 패널로, 내용 컴포넌트를 포함하며, 그림자 깊이, 배경색, 모양 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dialog 기본 사용", + "desc": [ + "【child】 : 애니메이션 아이콘 데이터 【Widget】", + "【elevation】 : 그림자 깊이 【double】", + "【backgroundColor】 : 배경색 【Color】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json new file mode 100644 index 00000000..d2f524b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Caixa de Diálogo", + "info": "O painel de diálogo mais simples, contendo um componente de conteúdo, pode especificar propriedades como profundidade de sombra, cor de fundo, forma, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Dialog", + "desc": [ + "【child】 : Dados do ícone de animação 【Widget】", + "【elevation】 : Profundidade de sombra 【double】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json new file mode 100644 index 00000000..560ec3a9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Dialog/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 126, + "name": "Dialog", + "localName": "Диалоговое окно", + "info": "Самая простая панель диалогового окна, содержащая компонент содержимого, можно указать такие свойства, как глубина тени, цвет фона, форма и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Dialog", + "desc": [ + "【child】 : Данные анимационного иконка 【Widget】", + "【elevation】 : Глубина тени 【double】", + "【backgroundColor】 : Цвет фона 【Color】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json new file mode 100644 index 00000000..0ec5efd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Horizontale Trennlinie", + "info": "Horizontale Trennlinie, bei der Farbe, Höhe, Dicke und seitliche Abstände angegeben werden können. Wird häufig als Trennlinie für Listenelemente verwendet.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider Farbe und Dicke", + "desc": [ + "【color】: Farbe 【Color】", + "【thickness】: Linienstärke 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider Höhe und Lücke", + "desc": [ + "【indent】: Länge der vorderen Lücke 【double】", + "【endIndent】: Länge der hinteren Lücke 【double】", + "【height】: Platzhalterhöhe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json new file mode 100644 index 00000000..71ed3d1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Horizontal Divider", + "info": "A horizontal divider that can specify color, height, thickness, and left and right margin information, commonly used as a divider for list items.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider Color and Thickness", + "desc": [ + "【color】: Color 【Color】", + "【thickness】: Line thickness 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider Height and Indent", + "desc": [ + "【indent】: Front indent length 【double】", + "【endIndent】: Rear indent length 【double】", + "【height】: Placeholder height 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json new file mode 100644 index 00000000..2b91b1be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Línea divisoria horizontal", + "info": "Línea divisoria horizontal, se puede especificar el color, la altura, el grosor, la información de los márgenes izquierdo y derecho, comúnmente utilizada como línea divisoria de elementos de la lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Color y grosor de Divider", + "desc": [ + "【color】: color 【Color】", + "【thickness】: grosor de la línea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altura y espacio de Divider", + "desc": [ + "【indent】: longitud del espacio frontal 【double】", + "【endIndent】: longitud del espacio posterior 【double】", + "【height】: altura del espacio ocupado 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json new file mode 100644 index 00000000..d6d3201c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Ligne de séparation horizontale", + "info": "Ligne de séparation horizontale, peut spécifier la couleur, la hauteur, l'épaisseur et les marges gauche et droite, couramment utilisée pour les lignes de séparation des éléments de liste.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Couleur et épaisseur du Divider", + "desc": [ + "【color】: Couleur 【Color】", + "【thickness】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Hauteur et espacement du Divider", + "desc": [ + "【indent】: Longueur de l'espacement avant 【double】", + "【endIndent】: Longueur de l'espacement arrière 【double】", + "【height】: Hauteur de l'élément 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json new file mode 100644 index 00000000..c69a2bca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Linea di divisione orizzontale", + "info": "Linea di divisione orizzontale, è possibile specificare colore, altezza, spessore, margini sinistro e destro, comunemente utilizzata come linea di divisione tra gli elementi di una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Colore e spessore del Divider", + "desc": [ + "【color】: Colore 【Color】", + "【thickness】: Spessore della linea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altezza e spazio vuoto del Divider", + "desc": [ + "【indent】: Lunghezza dello spazio vuoto anteriore 【double】", + "【endIndent】: Lunghezza dello spazio vuoto posteriore 【double】", + "【height】: Altezza occupata 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json new file mode 100644 index 00000000..6319c382 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "水平分割線", + "info": "水平分割線、色、高さ、太さ、左右の余白情報を指定できます。リストのアイテム分割線としてよく使用されます。", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Dividerの色と太さ", + "desc": [ + "【color】: 色 【Color】", + "【thickness】: 線の太さ 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Dividerの高さと空白", + "desc": [ + "【indent】: 前の空白の長さ 【double】", + "【endIndent】: 後の空白の長さ 【double】", + "【height】: 占める高さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json new file mode 100644 index 00000000..819480d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "수평 구분선", + "info": "수평 구분선으로, 색상, 높이, 두께, 좌우 여백 정보를 지정할 수 있으며, 주로 리스트의 항목 구분선으로 사용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Divider 색상과 두께", + "desc": [ + "【color】: 색상 【Color】", + "【thickness】: 선 두께 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Divider 높이와 여백", + "desc": [ + "【indent】: 앞쪽 여백 길이 【double】", + "【endIndent】: 뒤쪽 여백 길이 【double】", + "【height】: 높이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json new file mode 100644 index 00000000..c2f0d239 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Linha divisória horizontal", + "info": "Linha divisória horizontal, pode especificar cor, altura, espessura, margens esquerda e direita, comumente usada como linha divisória de itens de lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cor e espessura do Divider", + "desc": [ + "【color】: Cor 【Color】", + "【thickness】: Espessura da linha 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Altura e lacuna do Divider", + "desc": [ + "【indent】: Comprimento da lacuna frontal 【double】", + "【endIndent】: Comprimento da lacuna traseira 【double】", + "【height】: Altura do espaço ocupado 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json new file mode 100644 index 00000000..fa945ba4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Divider/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 34, + "name": "Divider", + "localName": "Горизонтальная разделительная линия", + "info": "Горизонтальная разделительная линия, можно указать цвет, высоту, толщину, отступы слева и справа. Обычно используется как разделитель элементов списка.", + "lever": 2, + "family": 0, + "linkIds": [ + 35, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Цвет и толщина Divider", + "desc": [ + "【color】: Цвет 【Color】", + "【thickness】: Толщина линии 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Высота и отступы Divider", + "desc": [ + "【indent】: Длина отступа спереди 【double】", + "【endIndent】: Длина отступа сзади 【double】", + "【height】: Высота занимаемого места 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json new file mode 100644 index 00000000..ec56bf29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Zieh- und Schieb-Rücksetzer", + "info": "Es kann die nachfolgenden DraggableScrollableSheet benachrichtigen, um ihre Position auf den Ausgangszustand zurückzusetzen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "Verwenden Sie DraggableScrollableActuator.reset(context), um die Position der nachfolgenden DraggableScrollableSheet auf die Ausgangsposition zurückzusetzen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json new file mode 100644 index 00000000..5c9afd68 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Drag and Slide Resetter", + "info": "It can notify the descendant DraggableScrollableSheet to reset its position to the initial state.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage", + "desc": [ + "【child】: Child component 【Widget】", + "Use DraggableScrollableActuator.reset(context) to reset the position of the descendant DraggableScrollableSheet to the initial position." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json new file mode 100644 index 00000000..c6229f57 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Restablecedor de arrastre y desplazamiento", + "info": "Puede notificar a la hoja DraggableScrollableSheet descendiente para restablecer su posición al estado inicial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "Usa DraggableScrollableActuator.reset(context) para restablecer la posición inicial de la hoja DraggableScrollableSheet descendiente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json new file mode 100644 index 00000000..928a6385 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Réinitialisateur de glissement", + "info": "Il peut informer les descendants DraggableScrollableSheet de réinitialiser leur position à l'état initial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "Utilisez DraggableScrollableActuator.reset(context) pour réinitialiser la position initiale du descendant DraggableScrollableSheet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json new file mode 100644 index 00000000..a13ffb46 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Trascinabile scorrevole reset", + "info": "Può notificare ai discendenti DraggableScrollableSheet di ripristinare la loro posizione allo stato iniziale.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Metodo di utilizzo di base", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "Utilizza DraggableScrollableActuator.reset(context) per ripristinare la posizione iniziale del discendente DraggableScrollableSheet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json new file mode 100644 index 00000000..4935f4bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "ドラッグスクロールリセッター", + "info": "これは子孫の DraggableScrollableSheet に通知して、その位置を初期状態にリセットすることができます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "基本的な使用方法", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "DraggableScrollableActuator.reset(context) を使用して、子孫の DraggableScrollableSheet を初期位置にリセットします。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json new file mode 100644 index 00000000..57c5481d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "드래그 스크롤 재설정기", + "info": "이것은 후손 DraggableScrollableSheet에게 초기 상태로 위치를 재설정하도록 알릴 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "기본 사용 방법", + "desc": [ + "【child】 : 자식 구성 요소 【Widget】", + "DraggableScrollableActuator.reset(context)를 사용하여 후손 DraggableScrollableSheet를 초기 위치로 재설정합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json new file mode 100644 index 00000000..06f3310b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Reposicionador de Arrasto e Deslize", + "info": "Ele pode notificar o DraggableScrollableSheet descendente para redefinir sua posição para o estado inicial.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Método de Uso Básico", + "desc": [ + "【child】 : Componente filho 【Widget】", + "Use DraggableScrollableActuator.reset(context) para redefinir a posição inicial do DraggableScrollableSheet descendente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json new file mode 100644 index 00000000..912c5634 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DraggableScrollableActuator/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 221, + "name": "DraggableScrollableActuator", + "localName": "Перетаскиваемый сбрасыватель", + "info": "Он может уведомить дочерние DraggableScrollableSheet о необходимости сбросить их положение в исходное состояние.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "Используйте DraggableScrollableActuator.reset(context) для сброса положения дочернего DraggableScrollableSheet в исходное положение." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json new file mode 100644 index 00000000..2a2df0ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Seitenleiste", + "info": "Wird im Allgemeinen für die draw- und endDraw-Eigenschaften in Scaffold als linke und rechte Seitenleiste verwendet. Kann ein Kindelement aufnehmen und die Schattentiefe angeben.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Drawer", + "desc": [ + "【child】 : Kindelement 【Widget】", + "【elevation】 : Schattentiefe 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json new file mode 100644 index 00000000..7f1cbcd2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Drawer", + "info": "Generally used as the left and right sliding panels in the Scaffold's draw and endDraw properties. It can contain a child component and can specify the elevation.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Drawer", + "desc": [ + "【child】 : Child component 【Widget】", + "【elevation】 : Elevation 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json new file mode 100644 index 00000000..12dc49f4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra deslizante", + "info": "Generalmente se utiliza en los atributos draw y endDraw de Scaffold como barras deslizantes izquierda y derecha, puede contener un componente hijo y permite especificar la profundidad de la sombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Drawer", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【elevation】 : Profundidad de la sombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json new file mode 100644 index 00000000..c85c7ed5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barre de glissement", + "info": "Généralement utilisé pour les propriétés draw et endDraw dans Scaffold comme barres de glissement gauche et droite, peut contenir un composant enfant, peut spécifier la profondeur de l'ombre.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Drawer", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【elevation】 : Profondeur de l'ombre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json new file mode 100644 index 00000000..b28e89eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra di scorrimento", + "info": "Generalmente utilizzato per gli attributi draw e endDraw in Scaffold come barre di scorrimento laterali, può contenere un componente figlio e specificare la profondità dell'ombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Drawer", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【elevation】 : Profondità dell'ombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json new file mode 100644 index 00000000..e1366ece --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "スライドバー", + "info": "一般的にScaffoldのdrawおよびendDrawプロパティで左右のスライドバーとして使用され、1つの子コンポーネントを収容でき、影の深さを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawerの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【elevation】 : 影の深さ 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json new file mode 100644 index 00000000..b7eb4ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "슬라이드 바", + "info": "일반적으로 Scaffold의 draw 및 endDraw 속성으로 좌우 슬라이드 바로 사용되며, 하나의 자식 위젯을 수용할 수 있고, 그림자 깊이를 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Drawer 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【elevation】 : 그림자 깊이 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json new file mode 100644 index 00000000..7dfd72b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Barra de deslizamento", + "info": "Geralmente usado para os atributos draw e endDraw no Scaffold como barras de deslizamento esquerda e direita, pode conter um componente filho e especificar a profundidade da sombra.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Drawer", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【elevation】 : Profundidade da sombra 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json new file mode 100644 index 00000000..09836344 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Drawer/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 154, + "name": "Drawer", + "localName": "Скользящая панель", + "info": "Обычно используется в свойствах draw и endDraw Scaffold в качестве левой и правой скользящей панели, может содержать один дочерний компонент, можно указать глубину тени.", + "lever": 2, + "family": 0, + "linkIds": [ + 64, + 155 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Drawer", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【elevation】 : Глубина тени 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json new file mode 100644 index 00000000..4ee3ddcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Schubladenknopf", + "info": "Ein linker Schubladensymbolknopf, der das Symbol mit DrawerButtonIcon anzeigt. Das Standardklickereignis kann die linke Schublade öffnen.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerButton", + "desc": [ + "【onPressed】: Klickereignis 【VoidCallback?】", + "【style】: Schaltflächenstil 【ButtonStyle?】", + "Wenn onPressed leer ist, wird beim Klicken die linke Schublade geöffnet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json new file mode 100644 index 00000000..efd56389 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Drawer Button", + "info": "A left drawer icon button, using DrawerButtonIcon to display the icon. The default click event can open the left drawer.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerButton", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "When onPressed is empty, clicking will open the left drawer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json new file mode 100644 index 00000000..d8466e59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Botón de cajón", + "info": "Un botón de icono de cajón izquierdo, utiliza DrawerButtonIcon para mostrar el icono, el evento de clic predeterminado puede abrir el cajón izquierdo.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerButton", + "desc": [ + "【onPressed】: Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "Cuando onPressed está vacío, al hacer clic se abrirá el cajón izquierdo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json new file mode 100644 index 00000000..12c175fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Bouton de tiroir", + "info": "Un bouton d'icône de tiroir gauche, utilise DrawerButtonIcon pour afficher l'icône. L'événement de clic par défaut peut ouvrir le tiroir gauche.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "Lorsque onPressed est vide, un clic ouvrira le tiroir gauche." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json new file mode 100644 index 00000000..8a7da810 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Pulsante Cassetto", + "info": "Un pulsante con icona del cassetto sinistro, utilizza DrawerButtonIcon per mostrare l'icona, l'evento di clic predefinito può aprire il cassetto sinistro.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di DrawerButton", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "Quando onPressed è vuoto, il clic aprirà il cassetto sinistro." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json new file mode 100644 index 00000000..8710f35d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "ドロワーボタン", + "info": "左ドロワーアイコンボタンで、DrawerButtonIconを使用してアイコンを表示します。デフォルトのクリックイベントで左ドロワーを開きます。", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 基本使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "onPressedが空の場合、クリックすると左ドロワーが開きます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json new file mode 100644 index 00000000..2065716b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "서랍 버튼", + "info": "왼쪽 서랍 아이콘 버튼, DrawerButtonIcon을 사용하여 아이콘을 표시하며, 기본 클릭 이벤트는 왼쪽 서랍을 엽니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButton 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "onPressed가 비어 있을 때, 클릭하면 왼쪽 서랍이 열립니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json new file mode 100644 index 00000000..3ea74e2b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Botão de Gaveta", + "info": "Um botão de ícone de gaveta esquerda, usando DrawerButtonIcon para exibir o ícone, o evento de clique padrão pode abrir a gaveta esquerda.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DrawerButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "Quando onPressed estiver vazio, ao clicar, a gaveta esquerda será aberta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json new file mode 100644 index 00000000..8a62d7b9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 276, + "name": "DrawerButton", + "localName": "Кнопка ящика", + "info": "Кнопка с иконкой левого ящика, использует DrawerButtonIcon для отображения иконки, по умолчанию при нажатии открывает левый ящик.", + "lever": 1, + "family": 0, + "linkIds": [ + 273, + 361 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerButton", + "desc": [ + "【onPressed】: Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "Если onPressed пуст, при нажатии открывается левый ящик." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..6d7a5fde --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Schubladen-Schaltflächensymbol", + "info": "Ein Schubladen-Icon-Symbol, das je nach Plattform das entsprechende Symbol anzeigt und über ActionIconTheme angepasst werden kann.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon-Effekt", + "desc": [ + "Passt das Symbol der Schubladenschaltfläche für verschiedene Plattformen über die _ActionIcon-Komponente gemäß dem ActionIconTheme an." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json new file mode 100644 index 00000000..3b9628df --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Drawer Button Icon", + "info": "A drawer Icon, which displays the corresponding icon according to the platform, and can be customized with ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the drawer button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..1be7aee1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icono del botón del cajón", + "info": "Un icono de cajón, muestra el icono correspondiente según la plataforma, se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de DrawerButtonIcon", + "desc": [ + "A través del componente _ActionIcon, se adapta el icono del botón del cajón para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..9143ef42 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icône de bouton de tiroir", + "info": "Une icône de tiroir, affichant l'icône correspondante selon la plateforme, peut être personnalisée avec ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de DrawerButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône du bouton de tiroir à différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..6da1a0b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Icona del pulsante del cassetto", + "info": "Un'icona del cassetto, che mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto DrawerButtonIcon", + "desc": [ + "Utilizzando il componente _ActionIcon in base al tema ActionIconTheme, per adattare l'icona del pulsante del cassetto a diverse piattaforme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..7c10cefc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "ドロワーボタンアイコン", + "info": "ドロワー Icon アイコンで、プラットフォームに応じたアイコンを表示し、ActionIconTheme でテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 効果", + "desc": [ + "_ActionIcon コンポーネントを使用して、ActionIconTheme テーマに基づいて、異なるプラットフォームのドロワーボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..00312080 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "서랍 버튼 아이콘", + "info": "서랍 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 사용자 정의할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 서랍 버튼 아이콘을 조정합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..5daebcdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Ícone do botão da gaveta", + "info": "Um ícone de gaveta, exibe o ícone correspondente de acordo com a plataforma, pode ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do DrawerButtonIcon", + "desc": [ + "Através do componente _ActionIcon, adapta o ícone do botão da gaveta para diferentes plataformas de acordo com o tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..5d97ec8a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 273, + "name": "DrawerButtonIcon", + "localName": "Иконка кнопки ящика", + "info": "Иконка ящика, которая отображает соответствующую иконку в зависимости от платформы. Можно настроить тему через ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект DrawerButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки ящика для разных платформ в соответствии с темой ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json new file mode 100644 index 00000000..309a6624 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Drawer-Header", + "info": "Wird normalerweise in Drawer verwendet, als Kopf des Drawers. Kann Attribute wie Innen- und Außenabstand, Dekoration, Unterkomponenten usw. festlegen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von DrawerHeader", + "desc": [ + "【child】 : Unterkomponente 【Widget】", + "【decoration】 : Dekoration 【Decoration】", + "【margin】 : Außenabstand 【EdgeInsetsGeometry】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json new file mode 100644 index 00000000..1c719c26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Drawer Header", + "info": "Generally used in Drawer, as the header of the drawer. You can specify properties such as padding, decoration, child components, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of DrawerHeader", + "desc": [ + "【child】 : Child Component 【Widget】", + "【decoration】 : Decoration 【Decoration】", + "【margin】 : Margin 【EdgeInsetsGeometry】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json new file mode 100644 index 00000000..3deee37b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Encabezado del cajón", + "info": "Generalmente se utiliza en Drawer, como encabezado del cajón. Se pueden especificar propiedades como márgenes internos y externos, decoración, componentes secundarios, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de DrawerHeader", + "desc": [ + "【child】 : Componente secundario 【Widget】", + "【decoration】 : Decoración 【Decoration】", + "【margin】 : Margen externo 【EdgeInsetsGeometry】", + "【padding】 : Margen interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json new file mode 100644 index 00000000..95784358 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "En-tête de tiroir", + "info": "Généralement utilisé dans Drawer, comme en-tête du tiroir. Peut spécifier des propriétés telles que les marges intérieures et extérieures, la décoration, les composants enfants, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de DrawerHeader", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【decoration】 : Décoration 【Decoration】", + "【margin】 : Marge extérieure 【EdgeInsetsGeometry】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json new file mode 100644 index 00000000..54fc9e88 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Intestazione del cassetto", + "info": "Generalmente utilizzato in Drawer, come intestazione del cassetto. È possibile specificare proprietà come margini interni ed esterni, decorazioni, componenti figli, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di DrawerHeader", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【decoration】 : Decorazione 【Decoration】", + "【margin】 : Margine esterno 【EdgeInsetsGeometry】", + "【padding】 : Margine interno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json new file mode 100644 index 00000000..c917a060 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "ドロワーヘッダー", + "info": "一般的にDrawer内で使用され、ドロワーのヘッダーとして機能します。内外の余白、装飾、子コンポーネントなどのプロパティを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeaderの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【decoration】 : 装飾 【Decoration】", + "【margin】 : 外側の余白 【EdgeInsetsGeometry】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json new file mode 100644 index 00000000..b796014d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "슬라이드 페이지 헤더", + "info": "일반적으로 Drawer에서 사용되며, 슬라이드 페이지의 헤더로 사용됩니다. 내부 및 외부 여백, 장식, 하위 구성 요소 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "DrawerHeader 기본 사용", + "desc": [ + "【child】 : 하위 구성 요소 【Widget】", + "【decoration】 : 장식 【Decoration】", + "【margin】 : 외부 여백 【EdgeInsetsGeometry】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json new file mode 100644 index 00000000..209efa1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Cabeçalho do Painel Deslizante", + "info": "Geralmente utilizado no Drawer, como cabeçalho do painel deslizante. Pode especificar atributos como margens internas e externas, decoração, componentes filhos, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do DrawerHeader", + "desc": [ + "【child】 : Componente Filho 【Widget】", + "【decoration】 : Decoração 【Decoration】", + "【margin】 : Margem Externa 【EdgeInsetsGeometry】", + "【padding】 : Margem Interna 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json new file mode 100644 index 00000000..77940ee3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/DrawerHeader/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 155, + "name": "DrawerHeader", + "localName": "Заголовок выдвижной панели", + "info": "Обычно используется в Drawer в качестве заголовка выдвижной панели. Можно указать свойства, такие как отступы, декор, дочерние компоненты и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование DrawerHeader", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【decoration】 : Декор 【Decoration】", + "【margin】 : Внешний отступ 【EdgeInsetsGeometry】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json new file mode 100644 index 00000000..9b37050e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Rechte Schubladen-Schaltfläche", + "info": "Eine rechte Schubladen-Icon-Schaltfläche, die das EndDrawerButtonIcon verwendet, um das Icon anzuzeigen. Standardmäßig öffnet ein Klick die rechte Schublade.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von EndDrawerButton", + "desc": [ + "【onPressed】 : Klick-Ereignis 【VoidCallback?】", + "【style】: Schaltflächenstil 【ButtonStyle?】", + "Wenn onPressed leer ist, wird beim Klicken die rechte Schublade geöffnet." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json new file mode 100644 index 00000000..807315a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Right Drawer Button", + "info": "A right drawer icon button, using EndDrawerButtonIcon to display the icon, the default click event can open the right drawer.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of EndDrawerButton", + "desc": [ + "【onPressed】: Click event 【VoidCallback?】", + "【style】: Button style 【ButtonStyle?】", + "When onPressed is empty, clicking will open the right drawer." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json new file mode 100644 index 00000000..9166032a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Botón de cajón derecho", + "info": "Un botón de icono de cajón derecho, que utiliza EndDrawerButtonIcon para mostrar el icono. El evento de clic predeterminado puede abrir el cajón derecho.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de EndDrawerButton", + "desc": [ + "【onPressed】 : Evento de clic 【VoidCallback?】", + "【style】: Estilo del botón 【ButtonStyle?】", + "Cuando onPressed está vacío, al hacer clic se abrirá el cajón derecho." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json new file mode 100644 index 00000000..8e80d828 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Bouton de tiroir droit", + "info": "Un bouton d'icône de tiroir droit, utilisant EndDrawerButtonIcon pour afficher l'icône, l'événement de clic par défaut peut ouvrir le tiroir droit.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de EndDrawerButton", + "desc": [ + "【onPressed】 : Événement de clic 【VoidCallback?】", + "【style】: Style du bouton 【ButtonStyle?】", + "Lorsque onPressed est vide, un clic ouvrira le tiroir droit." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json new file mode 100644 index 00000000..bc4fca22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Pulsante cassetto destro", + "info": "Un pulsante icona per il cassetto destro, utilizza EndDrawerButtonIcon per visualizzare l'icona. L'evento di clic predefinito apre il cassetto destro.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di EndDrawerButton", + "desc": [ + "【onPressed】 : Evento di clic 【VoidCallback?】", + "【style】: Stile del pulsante 【ButtonStyle?】", + "Quando onPressed è vuoto, cliccando si apre il cassetto destro." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json new file mode 100644 index 00000000..23fcf703 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "右ドロワーボタン", + "info": "右ドロワーアイコンボタンで、EndDrawerButtonIconを使用してアイコンを表示し、デフォルトのクリックイベントで右ドロワーを開くことができます。", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 基本使用", + "desc": [ + "【onPressed】 : クリックイベント 【VoidCallback?】", + "【style】: ボタンスタイル 【ButtonStyle?】", + "onPressedが空の場合、クリックすると右ドロワーが開きます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json new file mode 100644 index 00000000..74f43710 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "오른쪽 서랍 버튼", + "info": "오른쪽 서랍 아이콘 버튼, EndDrawerButtonIcon을 사용하여 아이콘을 표시하며, 기본 클릭 이벤트는 오른쪽 서랍을 열 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButton 기본 사용", + "desc": [ + "【onPressed】 : 클릭 이벤트 【VoidCallback?】", + "【style】: 버튼 스타일 【ButtonStyle?】", + "onPressed가 비어 있을 때, 클릭하면 오른쪽 서랍이 열립니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json new file mode 100644 index 00000000..77bcd210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Botão de gaveta direita", + "info": "Um botão de ícone de gaveta direita, usando EndDrawerButtonIcon para exibir o ícone, o evento de clique padrão pode abrir a gaveta direita.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do EndDrawerButton", + "desc": [ + "【onPressed】 : Evento de clique 【VoidCallback?】", + "【style】: Estilo do botão 【ButtonStyle?】", + "Quando onPressed estiver vazio, ao clicar, a gaveta direita será aberta." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json new file mode 100644 index 00000000..9ee1ce2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButton/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 361, + "name": "EndDrawerButton", + "localName": "Кнопка правого ящика", + "info": "Кнопка с иконкой правого ящика, использующая EndDrawerButtonIcon для отображения иконки. По умолчанию при нажатии открывает правый ящик.", + "lever": 1, + "family": 0, + "linkIds": [ + 275, + 276 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование EndDrawerButton", + "desc": [ + "【onPressed】: Событие нажатия 【VoidCallback?】", + "【style】: Стиль кнопки 【ButtonStyle?】", + "Если onPressed пуст, при нажатии открывается правый ящик." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json new file mode 100644 index 00000000..3e564d5f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Rechte Schubladen-Schaltfläche Symbol", + "info": "Ein Symbol für die rechte Schubladen-Schaltfläche, das je nach Plattform das entsprechende Symbol anzeigt. Das Thema kann über ActionIconTheme angepasst werden.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon Effekt", + "desc": [ + "Durch die _ActionIcon-Komponente wird das Symbol für die rechte Schubladen-Schaltfläche entsprechend dem ActionIconTheme-Theme an verschiedene Plattformen angepasst." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json new file mode 100644 index 00000000..3afb8573 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Right Drawer Button Icon", + "info": "A right drawer Icon that displays the corresponding icon based on the platform. It can be customized with the ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon Effect", + "desc": [ + "The _ActionIcon component adapts the right drawer button icon for different platforms based on the ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json new file mode 100644 index 00000000..47c9524b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icono del botón del cajón derecho", + "info": "Un icono de cajón derecho que muestra el icono correspondiente según la plataforma, y se puede personalizar el tema a través de ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efecto de EndDrawerButtonIcon", + "desc": [ + "El componente _ActionIcon adapta el icono del botón del cajón derecho para diferentes plataformas según el tema de ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json new file mode 100644 index 00000000..c1be227c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icône de bouton de tiroir droit", + "info": "Une icône de tiroir droit, affichant l'icône correspondante selon la plateforme, peut être personnalisée avec ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effet de l'icône EndDrawerButtonIcon", + "desc": [ + "Le composant _ActionIcon adapte l'icône du bouton de tiroir droit pour différentes plateformes selon le thème ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json new file mode 100644 index 00000000..679a5469 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Icona del pulsante del cassetto destro", + "info": "Un'icona del cassetto destro, mostra l'icona corrispondente in base alla piattaforma, può essere personalizzata tramite ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Effetto di EndDrawerButtonIcon", + "desc": [ + "Adatta l'icona del pulsante del cassetto destro per diverse piattaforme tramite il componente _ActionIcon in base al tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json new file mode 100644 index 00000000..0bdd2df7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "右ドロワーボタンアイコン", + "info": "右ドロワーのアイコンで、プラットフォームに応じて対応するアイコンを表示します。ActionIconTheme を使用してテーマをカスタマイズできます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 効果", + "desc": [ + "_ActionIcon コンポーネントを使用して、ActionIconTheme テーマに基づいて、異なるプラットフォームの右ドロワーボタンアイコンを適応させます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json new file mode 100644 index 00000000..feb4b652 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "오른쪽 서랍 버튼 아이콘", + "info": "오른쪽 서랍 Icon 아이콘, 플랫폼에 따라 해당 아이콘을 표시하며, ActionIconTheme을 통해 테마를 커스터마이징할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "EndDrawerButtonIcon 효과", + "desc": [ + "_ActionIcon 컴포넌트를 통해 ActionIconTheme 테마에 따라 다른 플랫폼의 오른쪽 서랍 버튼 아이콘을 적용합니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json new file mode 100644 index 00000000..769b4167 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Ícone do botão da gaveta direita", + "info": "Um ícone de gaveta direita, que exibe o ícone correspondente de acordo com a plataforma, podendo ser personalizado com o tema ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Efeito do EndDrawerButtonIcon", + "desc": [ + "O componente _ActionIcon adapta o ícone do botão da gaveta direita para diferentes plataformas de acordo com o tema ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json new file mode 100644 index 00000000..7e3fa078 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/EndDrawerButtonIcon/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 275, + "name": "EndDrawerButtonIcon", + "localName": "Иконка кнопки правого выдвижного ящика", + "info": "Иконка правого выдвижного ящика, отображающая соответствующую иконку в зависимости от платформы, может быть настроена с помощью ActionIconTheme.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Эффект EndDrawerButtonIcon", + "desc": [ + "Компонент _ActionIcon адаптирует иконку кнопки правого выдвижного ящика для разных платформ в зависимости от темы ActionIconTheme." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json new file mode 100644 index 00000000..f508855f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Einblendendes Bild", + "info": "Lädt ein Bild mit transparentem Übergang. Kann Platzhalterbild, Animationskurven für Ein- und Ausblenden, Zeit, Breite, Höhe, Fit-Typ, Ausrichtung, Wiederholungsmodus usw. angeben.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork lädt Netzwerkbild", + "desc": [ + "【placeholder】 : Platzhalterbild-Adresse 【String】", + "【image】 : Anzeigebild-Adresse 【String】", + "【width】: Breite 【double】", + "【height】: Höhe 【double】", + "【fadeInDuration】: Einblenddauer 【Duration】", + "【fadeOutDuration】: Ausblenddauer 【Duration】", + "【fadeInCurve】: Einblendkurve 【Cubic】", + "【fadeOutCurve】: Ausblendkurve 【Cubic】", + "【fit】: Anpassungsmodus 【BoxFit】", + "【alignment】: Ausrichtungsmodus 【Alignment】", + "【repeat】: Wiederholungsmodus 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json new file mode 100644 index 00000000..6d20fb52 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Fade-in Image", + "info": "Load an image with a transparent gradient. You can specify a placeholder image, animation curves for fade in and out, duration, width, height, fit type, alignment, repeat mode, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork Load Network Image", + "desc": [ + "【placeholder】 : Placeholder image address 【String】", + "【image】 : Display image address 【String】", + "【width】: Width 【double】", + "【height】: Height 【double】", + "【fadeInDuration】: Fade-in duration 【Duration】", + "【fadeOutDuration】: Fade-out duration 【Duration】", + "【fadeInCurve】: Fade-in curve 【Cubic】", + "【fadeOutCurve】: Fade-out curve 【Cubic】", + "【fit】: Fit mode 【BoxFit】", + "【alignment】: Alignment mode 【Alignment】", + "【repeat】: Repeat mode 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json new file mode 100644 index 00000000..fbb31cee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Imagen de fundido", + "info": "Carga una imagen con un gradiente transparente. Se puede especificar una imagen de marcador de posición, curvas de animación de entrada y salida, tiempo, ancho y alto, tipo de ajuste, alineación, modo de repetición, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork cargar imagen de red", + "desc": [ + "【placeholder】 : dirección de la imagen de marcador de posición 【String】", + "【image】 : dirección de la imagen a mostrar 【String】", + "【width】: ancho 【double】", + "【height】: alto 【double】", + "【fadeInDuration】: duración del fundido de entrada 【Duration】", + "【fadeOutDuration】: duración del fundido de salida 【Duration】", + "【fadeInCurve】: curva de fundido de entrada 【Cubic】", + "【fadeOutCurve】: curva de fundido de salida 【Cubic】", + "【fit】: modo de ajuste 【BoxFit】", + "【alignment】: modo de alineación 【Alignment】", + "【repeat】: modo de repetición 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json new file mode 100644 index 00000000..9433dd84 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Image en fondu", + "info": "Charge une image avec un dégradé transparent. Vous pouvez spécifier une image de remplacement, les courbes d'animation d'entrée et de sortie, la durée, la largeur, la hauteur, le type de fit, l'alignement, le mode de répétition, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork charger une image réseau", + "desc": [ + "【placeholder】 : adresse de l'image de remplacement 【String】", + "【image】 : adresse de l'image à afficher 【String】", + "【width】: largeur 【double】", + "【height】: hauteur 【double】", + "【fadeInDuration】: durée du fondu entrant 【Duration】", + "【fadeOutDuration】: durée du fondu sortant 【Duration】", + "【fadeInCurve】: courbe du fondu entrant 【Cubic】", + "【fadeOutCurve】: courbe du fondu sortant 【Cubic】", + "【fit】: mode d'ajustement 【BoxFit】", + "【alignment】: mode d'alignement 【Alignment】", + "【repeat】: mode de répétition 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json new file mode 100644 index 00000000..3b135d11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Immagine dissolvenza", + "info": "Carica un'immagine con una dissolvenza trasparente. È possibile specificare un'immagine segnaposto, curve di animazione per l'entrata e l'uscita, durata, larghezza, altezza, tipo di adattamento, allineamento, modalità di ripetizione, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork carica immagini dalla rete", + "desc": [ + "【placeholder】 : Indirizzo dell'immagine segnaposto 【String】", + "【image】 : Indirizzo dell'immagine da visualizzare 【String】", + "【width】: Larghezza 【double】", + "【height】: Altezza 【double】", + "【fadeInDuration】: Durata della dissolvenza in entrata 【Duration】", + "【fadeOutDuration】: Durata della dissolvenza in uscita 【Duration】", + "【fadeInCurve】: Curva della dissolvenza in entrata 【Cubic】", + "【fadeOutCurve】: Curva della dissolvenza in uscita 【Cubic】", + "【fit】: Modalità di adattamento 【BoxFit】", + "【alignment】: Modalità di allineamento 【Alignment】", + "【repeat】: Modalità di ripetizione 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json new file mode 100644 index 00000000..ff0eb9c4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "フェードイン画像", + "info": "画像を透明にグラデーションしてロードします。プレースホルダー画像、進退のアニメーションカーブ、時間、幅と高さ、fitタイプ、配置方法、繰り返し方法などを指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetworkでネットワーク画像をロード", + "desc": [ + "【placeholder】 : プレースホルダー画像のアドレス 【String】", + "【image】 : 表示画像のアドレス 【String】", + "【width】: 幅 【double】", + "【height】: 高さ 【double】", + "【fadeInDuration】: フェードイン時間 【Duration】", + "【fadeOutDuration】: フェードアウト時間 【Duration】", + "【fadeInCurve】: フェードインカーブ 【Cubic】", + "【fadeOutCurve】: フェードアウトカーブ 【Cubic】", + "【fit】: フィットモード 【BoxFit】", + "【alignment】: 配置モード 【Alignment】", + "【repeat】: 繰り返しモード 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json new file mode 100644 index 00000000..268d935c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "페이드 인 이미지", + "info": "이미지를 투명하게 페이드 인하여 로드합니다. 플레이스홀더 이미지, 애니메이션 곡선, 시간, 너비, 높이, fit 유형, 정렬 방식, 반복 방식 등을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork 네트워크 이미지 로드", + "desc": [ + "【placeholder】 : 플레이스홀더 이미지 주소 【String】", + "【image】 : 표시할 이미지 주소 【String】", + "【width】: 너비 【double】", + "【height】: 높이 【double】", + "【fadeInDuration】: 페이드 인 시간 【Duration】", + "【fadeOutDuration】: 페이드 아웃 시간 【Duration】", + "【fadeInCurve】: 페이드 인 곡선 【Cubic】", + "【fadeOutCurve】: 페이드 아웃 곡선 【Cubic】", + "【fit】: 적합 모드 【BoxFit】", + "【alignment】: 정렬 모드 【Alignment】", + "【repeat】: 반복 모드 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json new file mode 100644 index 00000000..734af47d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Imagem de Desvanecimento", + "info": "Carrega uma imagem com um gradiente transparente. Pode especificar uma imagem de placeholder, curvas de animação de entrada e saída, duração, largura, altura, tipo de ajuste, alinhamento, modo de repetição, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork carregar imagem da rede", + "desc": [ + "【placeholder】 : endereço da imagem de placeholder 【String】", + "【image】 : endereço da imagem a ser exibida 【String】", + "【width】: largura 【double】", + "【height】: altura 【double】", + "【fadeInDuration】: duração do desvanecimento de entrada 【Duration】", + "【fadeOutDuration】: duração do desvanecimento de saída 【Duration】", + "【fadeInCurve】: curva de desvanecimento de entrada 【Cubic】", + "【fadeOutCurve】: curva de desvanecimento de saída 【Cubic】", + "【fit】: modo de ajuste 【BoxFit】", + "【alignment】: modo de alinhamento 【Alignment】", + "【repeat】: modo de repetição 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json new file mode 100644 index 00000000..f2ed4160 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FadeInImage/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 8, + "name": "FadeInImage", + "localName": "Изображение с плавным появлением", + "info": "Загрузка изображения с плавным появлением. Можно указать изображение-заполнитель, кривые анимации появления и исчезновения, время, ширину, высоту, тип подгонки, выравнивание, режим повторения и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FadeInImage.assetNetwork загрузка изображения из сети", + "desc": [ + "【placeholder】 : Адрес изображения-заполнителя 【String】", + "【image】 : Адрес отображаемого изображения 【String】", + "【width】: Ширина 【double】", + "【height】: Высота 【double】", + "【fadeInDuration】: Длительность появления 【Duration】", + "【fadeOutDuration】: Длительность исчезновения 【Duration】", + "【fadeInCurve】: Кривая появления 【Cubic】", + "【fadeOutCurve】: Кривая исчезновения 【Cubic】", + "【fit】: Режим подгонки 【BoxFit】", + "【alignment】: Режим выравнивания 【Alignment】", + "【repeat】: Режим повторения 【ImageRepeat】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json new file mode 100644 index 00000000..52632833 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filterstreifen", + "info": "Ähnlich wie die Chip-Komponente, hat Eigenschaften für ausgewählt oder nicht und ein Auswahlereignis. Wenn ausgewählt, wird die obere Ebene der linken Komponente mit einem ✔️ überlagert.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip kann Auswahlereignisse akzeptieren", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【onSelected】: Auswahlereignis 【Function(bool)】", + "【selectedColor】: Farbe nach der Auswahl 【Color】", + "【selectedShadowColor】: Schattenfarbe nach der Auswahl 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json new file mode 100644 index 00000000..b5d60b4e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filter Chip", + "info": "Similar in style to the Chip component, with properties for selection and selection events. When selected, the upper layer of the left component will be masked by a ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip can accept selection events", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onSelected】: Selection event 【Function(bool)】", + "【selectedColor】: Color after selection 【Color】", + "【selectedShadowColor】: Shadow color after selection 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json new file mode 100644 index 00000000..4380e5b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Chip de Filtro", + "info": "Estilo similar al componente Chip, con propiedades de selección y eventos de selección. Cuando está seleccionado, la capa superior del componente izquierdo estará cubierta por ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip puede aceptar eventos de selección", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onSelected】: Evento de selección 【Function(bool)】", + "【selectedColor】: Color después de la selección 【Color】", + "【selectedShadowColor】: Color de sombra después de la selección 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json new file mode 100644 index 00000000..bca9e2e6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtre puce", + "info": "Un style similaire au composant Chip, avec des propriétés de sélection et des événements de sélection. Lorsqu'il est sélectionné, une superposition de ✔️ apparaît sur le composant de gauche.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip peut accepter des événements de sélection", + "desc": [ + "【selected】: Sélectionné ou non 【bool】", + "【onSelected】: Événement de sélection 【Function(bool)】", + "【selectedColor】: Couleur après sélection 【Color】", + "【selectedShadowColor】: Couleur de l'ombre après sélection 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json new file mode 100644 index 00000000..7d643b69 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtro Chip", + "info": "Stile simile al componente Chip, con proprietà di selezione e evento di selezione. Quando selezionato, il livello superiore del componente a sinistra sarà coperto da ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip accetta eventi di selezione", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【onSelected】: Evento di selezione 【Function(bool)】", + "【selectedColor】: Colore dopo la selezione 【Color】", + "【selectedShadowColor】: Colore dell'ombra dopo la selezione 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json new file mode 100644 index 00000000..5bfbfd28 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "フィルターチップ", + "info": "Chipコンポーネントと似たスタイルで、選択状態の属性と選択イベントを持ちます。選択時には左側のコンポーネントの上層に✔️が表示されます。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChipが選択イベントを受け入れる", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onSelected】: 選択イベント 【Function(bool)】", + "【selectedColor】: 選択後の色 【Color】", + "【selectedShadowColor】: 選択後の影の色 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json new file mode 100644 index 00000000..54b96de4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "필터 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 선택 여부 속성과 선택 이벤트를 가지고 있습니다. 선택 시 왼쪽 컴포넌트 상단에 ✔️ 마스크가 적용됩니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip 선택 이벤트 수신 가능", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onSelected】: 선택 이벤트 【Function(bool)】", + "【selectedColor】: 선택 후 색상 【Color】", + "【selectedShadowColor】: 선택 후 그림자 색상 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json new file mode 100644 index 00000000..99a05f15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Filtro de Chip", + "info": "Estilo semelhante ao componente Chip, com propriedades de seleção e eventos de seleção. Quando selecionado, a camada superior do componente à esquerda será coberta por um ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip pode aceitar eventos de seleção", + "desc": [ + "【selected】: Se selecionado 【bool】", + "【onSelected】: Evento de seleção 【Function(bool)】", + "【selectedColor】: Cor após seleção 【Color】", + "【selectedShadowColor】: Cor da sombra após seleção 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json new file mode 100644 index 00000000..e6904c93 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FilterChip/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 15, + "name": "FilterChip", + "localName": "Фильтр-чип", + "info": "Стиль, аналогичный компоненту Chip, с атрибутом выбора и событием выбора. При выборе верхний слой левого компонента будет затенен ✔️.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 14, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FilterChip может принимать события выбора", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onSelected】: Событие выбора 【Function(bool)】", + "【selectedColor】: Цвет после выбора 【Color】", + "【selectedShadowColor】: Цвет тени после выбора 【Color】," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json new file mode 100644 index 00000000..5d8b7685 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_de_DE.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Flacher Button", + "info": "Ein flacher Button ohne Schatten, basierend auf MaterialButton. Alle Eigenschaften ähneln denen von MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton-Klickereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【child】: Untergeordnete Komponente 【Widget】", + "【textColor】: Textfarbe der untergeordneten Komponente 【Color】", + "【highlightColor】: Hervorhebungsfarbe beim Langdrücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klickereignis 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton wurde in Flutter 3.3 ausgemustert. Der Ersatz ist der ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json new file mode 100644 index 00000000..b342c431 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_en_US.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Flat Button", + "info": "A flat button without shadows, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Splash Color 【Color】", + "【child】: Child Widget 【Widget】", + "【textColor】: Text Color of Child Widget 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton was phased out in Flutter 3.3. Its successor is the ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json new file mode 100644 index 00000000..94f2a9da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_es_ES.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Botón Plano", + "info": "Botón plano sin sombra, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de FlatButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【child】: Widget hijo 【Widget】", + "【textColor】: Color del texto del widget hijo 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón FlatButton dejó de estar disponible en Flutter 3.3. Su reemplazo es el botón ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json new file mode 100644 index 00000000..b185806c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_fr_FR.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Bouton plat", + "info": "Bouton plat sans ombre, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic de FlatButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton FlatButton a quitté la scène historique avec Flutter 3.3. Il est remplacé par le bouton ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json new file mode 100644 index 00000000..5b0b62b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_it_IT.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Pulsante piatto", + "info": "Pulsante piatto senza ombre, implementato basandosi su MaterialButton, tutte le proprietà sono simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic FlatButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore effetto ondulazione 【Color】", + "【child】: Componente figlio 【Widget】", + "【textColor】: Colore testo componente figlio 【Color】", + "【highlightColor】: Colore evidenziazione pressione prolungata 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento clic 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante FlatButton è uscito di scena con Flutter 3.3. Il suo sostituto è il pulsante ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json new file mode 100644 index 00000000..438bf3a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ja_JP.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "フラットボタン", + "info": "影のないフラットボタンで、MaterialButtonを基に実装されており、すべてのプロパティはMaterialButtonと類似しています。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【child】: 子コンポーネント 【Widget】", + "【textColor】: 子コンポーネントの文字色 【Color】", + "【highlightColor】: 長押しハイライト色 【Color】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton ボタンは Flutter3.3 で歴史の舞台から退きました。代替は ElevatedButton ボタンです。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json new file mode 100644 index 00000000..b862cd0d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ko_KR.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "평평한 버튼", + "info": "그림자가 없는 평평한 버튼으로, MaterialButton을 기반으로 구현되었으며 모든 속성이 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlatButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 내부 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'FlatButton 버튼은 Flutter3.3에서 더 이상 사용되지 않습니다. 대체 버튼은 ElevatedButton입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json new file mode 100644 index 00000000..2177fd12 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_pt_PT.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Botão Plano", + "info": "Botão plano sem sombra, implementado com base no MaterialButton, todas as propriedades são semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do FlatButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【child】: Componente filho 【Widget】", + "【textColor】: Cor do texto do componente filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão FlatButton foi descontinuado no Flutter 3.3. O substituto é o botão ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json new file mode 100644 index 00000000..1fd459f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlatButton/desc_ru_RU.json @@ -0,0 +1,58 @@ +{ + "id": 25, + "name": "FlatButton", + "localName": "Плоская кнопка", + "info": "Плоская кнопка без тени, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 26, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия FlatButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвол водной ряби 【Color】", + "【child】: Дочерний компонент 【Widget】", + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomFlatButton extends StatelessWidget {", + " const CustomFlatButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка FlatButton ушла с исторической сцены в Flutter3.3. Ее заменила кнопка ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return FlatButton(", + " onPressed: ()=>{,", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " child: const Text(\"FlatButton\"),", + " textColor: const Color(0xffFfffff),", + " color: Colors.blue,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json new file mode 100644 index 00000000..c88bf31e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Schwebende Schaltfläche", + "info": "Schwebende Schaltfläche, die normalerweise in Scaffold verwendet wird und an einer bestimmten Position platziert werden kann. Kann ein Unterelement enthalten, empfängt Klicks, und kann Farbe, Form usw. definieren.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton Klickereignis", + "desc": [ + "【child】: Unterelement 【Widget】", + "【tooltip】: Tooltip-Text bei langem Drücken 【String】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【foregroundColor】: Vordergrundfarbe 【Color】", + "【elevation】: Schattentiefe 【double】", + "【onPressed】: Klickereignis 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini Eigenschaft", + "desc": [ + "【mini】: Ist es mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape Eigenschaft", + "desc": [ + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json new file mode 100644 index 00000000..2da1d546 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Floating Button", + "info": "Floating button, generally used in Scaffold, can be placed in a specific position. It can contain a child widget, receive clicks, and define colors, shapes, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton Click Event", + "desc": [ + "【child】: Child widget 【Widget】", + "【tooltip】: Tooltip text when long pressed 【String】", + "【backgroundColor】: Background color 【Color】", + "【foregroundColor】: Foreground color 【Color】", + "【elevation】: Elevation 【double】", + "【onPressed】: Click event 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini Property", + "desc": [ + "【mini】: Whether it is mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape Property", + "desc": [ + "【shape】: Shape 【ShapeBorder】" + ] +} + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json new file mode 100644 index 00000000..4b951eab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Botón flotante", + "info": "Botón flotante, generalmente utilizado en Scaffold, se puede colocar en una posición específica. Puede contener un componente secundario, recibir clics, definir colores, formas, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de FloatingActionButton", + "desc": [ + "【child】: Componente secundario 【Widget】", + "【tooltip】: Texto de sugerencia al mantener presionado 【String】", + "【backgroundColor】: Color de fondo 【Color】", + "【foregroundColor】: Color de primer plano 【Color】", + "【elevation】: Profundidad de sombra 【double】", + "【onPressed】: Evento de clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propiedad mini", + "desc": [ + "【mini】: Si es mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propiedad shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json new file mode 100644 index 00000000..b24c5798 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Bouton flottant", + "info": "Le bouton flottant, généralement utilisé dans Scaffold, peut être placé à un endroit spécifique. Il peut contenir un composant enfant, recevoir des clics, et définir des couleurs, des formes, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic du FloatingActionButton", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【tooltip】: Texte d'aide lors d'un appui long 【String】", + "【backgroundColor】: Couleur de fond 【Color】", + "【foregroundColor】: Couleur de premier plan 【Color】", + "【elevation】: Profondeur de l'ombre 【double】", + "【onPressed】: Événement de clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propriété mini", + "desc": [ + "【mini】: Est-ce un mini bouton 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propriété de forme", + "desc": [ + "【shape】: Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json new file mode 100644 index 00000000..8df3b178 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Pulsante galleggiante", + "info": "Il pulsante galleggiante, generalmente utilizzato in Scaffold, può essere posizionato in una posizione specifica. Può contenere un componente figlio, ricevere clic, definire colori, forme, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di FloatingActionButton", + "desc": [ + "【child】: Componente figlio 【Widget】", + "【tooltip】: Testo di suggerimento durante la pressione prolungata 【String】", + "【backgroundColor】: Colore di sfondo 【Color】", + "【foregroundColor】: Colore di primo piano 【Color】", + "【elevation】: Profondità dell'ombra 【double】", + "【onPressed】: Evento di clic 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Proprietà mini", + "desc": [ + "【mini】: Se è mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Proprietà shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json new file mode 100644 index 00000000..8155c565 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "フローティングボタン", + "info": "フローティングボタンは、一般にScaffold内で使用され、特定の位置に配置できます。子コンポーネントを収容し、クリックを受け取り、色や形状などを定義できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButtonクリックイベント", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【tooltip】: 長押し時のヒントテキスト 【String】", + "【backgroundColor】: 背景色 【Color】", + "【foregroundColor】: 前景色 【Color】", + "【elevation】: 影の深さ 【double】", + "【onPressed】: クリックイベント 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "miniプロパティ", + "desc": [ + "【mini】: ミニかどうか 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shapeプロパティ", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json new file mode 100644 index 00000000..4626b1fd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "플로팅 버튼", + "info": "플로팅 버튼은 일반적으로 Scaffold에서 사용되며 특정 위치에 배치할 수 있습니다. 하나의 자식 위젯을 포함할 수 있으며, 클릭 이벤트를 받고 색상, 모양 등을 정의할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FloatingActionButton 클릭 이벤트", + "desc": [ + "【child】: 자식 위젯 【Widget】", + "【tooltip】: 길게 누를 때 표시되는 텍스트 【String】", + "【backgroundColor】: 배경색 【Color】", + "【foregroundColor】: 전경색 【Color】", + "【elevation】: 그림자 깊이 【double】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "mini 속성", + "desc": [ + "【mini】: 미니 여부 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "shape 속성", + "desc": [ + "【shape】: 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json new file mode 100644 index 00000000..c49411f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Botão Flutuante", + "info": "Botão flutuante, geralmente usado em Scaffold, pode ser colocado em uma posição específica. Pode conter um componente filho, receber cliques, e definir cor, forma, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do FloatingActionButton", + "desc": [ + "【child】: Componente filho 【Widget】", + "【tooltip】: Texto de dica ao pressionar 【String】", + "【backgroundColor】: Cor de fundo 【Color】", + "【foregroundColor】: Cor de frente 【Color】", + "【elevation】: Profundidade da sombra 【double】", + "【onPressed】: Evento de clique 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Propriedade mini", + "desc": [ + "【mini】: É mini 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Propriedade shape", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json new file mode 100644 index 00000000..e60f0cb2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FloatingActionButton/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 28, + "name": "FloatingActionButton", + "localName": "Плавающая кнопка", + "info": "Плавающая кнопка, обычно используется в Scaffold, может быть размещена в определенном месте. Может содержать один дочерний компонент, принимает клики, может определять цвет, форму и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия FloatingActionButton", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【tooltip】: Текст подсказки при долгом нажатии 【String】", + "【backgroundColor】: Цвет фона 【Color】", + "【foregroundColor】: Цвет переднего плана 【Color】", + "【elevation】: Глубина тени 【double】", + "【onPressed】: Событие нажатия 【Function】" + ] + }, + { + "file": "node2_mini.dart", + "name": "Свойство mini", + "desc": [ + "【mini】: Является ли мини 【bool】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Свойство shape", + "desc": [ + "【shape】: Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json new file mode 100644 index 00000000..b16aa1cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter-Logo", + "info": "Wird verwendet, um die Flutter-Logo-Komponente anzuzeigen. Kann Farbe, Größe, Anzeigemodus usw. definieren. Es ist eine sehr einfache Komponente.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wird verwendet, um ein FlutterLogo anzuzeigen", + "desc": [ + "【size】 : Größe 【double】", + "【colors】: Farbe 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stil wird verwendet, um Text anzuzeigen", + "desc": [ + "【style】 : Stil-3 Arten von Aufzählungen 【FlutterLogoStyle】", + "【textColor】: Textfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json new file mode 100644 index 00000000..df16eb50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter Icon", + "info": "Used to display the Flutter icon component. You can define color, size, display mode, and other information. It is a very simple component.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a FlutterLogo", + "desc": [ + "【size】 : Size 【double】", + "【colors】: Color 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style used to display text", + "desc": [ + "【style】 : Style - 3 types of enumeration 【FlutterLogoStyle】", + "【textColor】: Text color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json new file mode 100644 index 00000000..eeb38b9f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Logotipo de Flutter", + "info": "Se utiliza para mostrar el componente del logotipo de Flutter. Puede definir información como el color, el tamaño, el modo de visualización, etc. Es un componente muy simple.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Se utiliza para mostrar un logotipo de Flutter", + "desc": [ + "【size】 : Tamaño 【double】", + "【colors】: Color 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo utilizado para mostrar texto", + "desc": [ + "【style】 : Estilo - 3 tipos de enumeración 【FlutterLogoStyle】", + "【textColor】: Color del texto 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json new file mode 100644 index 00000000..2f5331ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Icône Flutter", + "info": "Utilisé pour afficher le composant d'icône Flutter. Permet de définir des informations telles que la couleur, la taille, le mode d'affichage, etc. C'est un composant très simple.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher un FlutterLogo", + "desc": [ + "【size】 : Taille 【double】", + "【colors】: Couleur 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Style utilisé pour afficher du texte", + "desc": [ + "【style】 : Style - 3 types d'énumération 【FlutterLogoStyle】", + "【textColor】: Couleur du texte 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json new file mode 100644 index 00000000..808ae853 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Icona Flutter", + "info": "Utilizzato per mostrare il componente dell'icona Flutter. È possibile definire colore, dimensioni, modalità di visualizzazione, ecc. È un componente molto semplice.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un FlutterLogo", + "desc": [ + "【size】 : Dimensione 【double】", + "【colors】: Colore 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Stile utilizzato per visualizzare il testo", + "desc": [ + "【style】 : Stile - 3 tipi di enumerazione 【FlutterLogoStyle】", + "【textColor】: Colore del testo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json new file mode 100644 index 00000000..74293541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutterアイコン", + "info": "Flutterアイコンコンポーネントを表示するために使用されます。色、サイズ、表示モードなどの情報を定義でき、非常にシンプルなコンポーネントです。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlutterLogoを表示するために使用", + "desc": [ + "【size】 : サイズ 【double】", + "【colors】: 色 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "テキストを表示するためのスタイル", + "desc": [ + "【style】 : スタイル-3種類の列挙 【FlutterLogoStyle】", + "【textColor】: テキストの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json new file mode 100644 index 00000000..b9b2f8db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Flutter 로고", + "info": "Flutter 로고 컴포넌트를 표시하는 데 사용됩니다. 색상, 크기, 표시 모드 등을 정의할 수 있는 매우 간단한 컴포넌트입니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "FlutterLogo를 표시하는 데 사용", + "desc": [ + "【size】 : 크기 【double】", + "【colors】: 색상 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "텍스트 표시를 위한 스타일", + "desc": [ + "【style】 : 스타일-3가지 열거 【FlutterLogoStyle】", + "【textColor】: 텍스트 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json new file mode 100644 index 00000000..74bd56ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Ícone do Flutter", + "info": "Usado para exibir o componente de ícone do Flutter. Pode definir cor, tamanho, modo de exibição e outras informações, é um componente muito simples.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um FlutterLogo", + "desc": [ + "【size】 : Tamanho 【double】", + "【colors】: Cor 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Estilo usado para exibir texto", + "desc": [ + "【style】 : Estilo - 3 tipos de enumeração 【FlutterLogoStyle】", + "【textColor】: Cor do texto 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json new file mode 100644 index 00000000..d40a8818 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/FlutterLogo/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 4, + "name": "FlutterLogo", + "localName": "Логотип Flutter", + "info": "Используется для отображения компонента логотипа Flutter. Можно определить цвет, размер, режим отображения и другую информацию. Это очень простой компонент.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Используется для отображения логотипа Flutter", + "desc": [ + "【size】 : Размер 【double】", + "【colors】: Цвет 【MaterialColor】" + ] + }, + { + "file": "node2_style.dart", + "name": "Стиль для отображения текста", + "desc": [ + "【style】 : Стиль-3 типа перечисления 【FlutterLogoStyle】", + "【textColor】: Цвет текста 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json new file mode 100644 index 00000000..40f67dd9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_de_DE.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Gesten-Erkenner", + "info": "Komponente zur Erkennung von Gestenereignissen, kann Klicks, lange Drücke, Doppelklicks, Drücken, Loslassen, Bewegen usw. erkennen und kann Informationen über die Berührungspunkte abrufen. Ein unverzichtbares Werkzeug für zu Hause und unterwegs.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Ereignisse von GestureDetector", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onTap】 : Klick-Ereignis 【Function()】", + "【onDoubleTap】 : Doppelklick-Ereignis 【GestureTapCallback】", + "【onLongPress】 : Langer Druck-Ereignis 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Details von GestureDetector", + "desc": [ + "【onTapDown】 : Rückruf beim Drücken 【GestureTapDownCallback】", + "【onTapUp】 : Rückruf beim Loslassen 【GestureTapUpCallback】", + "【onTapCancel】 : Klick abbrechen 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Pan-Ereignisse von GestureDetector", + "desc": [ + "【onPanDown】 : Rückruf beim Drücken 【GestureDragDownCallback】", + "【onPanEnd】 : Ende des Ziehens 【GestureDragEndCallback】", + "【onPanStart】 : Beginn des Ziehens 【GestureDragStartCallback】", + "【onPanUpdate】 : Aktualisierung des Ziehens 【GestureDragUpdateCallback】", + "【onPanCancel】 : Ziehen abbrechen 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json new file mode 100644 index 00000000..33b508da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_en_US.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Gesture Detector", + "info": "A detector for component gesture events, capable of accepting events such as tap, long press, double tap, press, release, move, etc., and can obtain touch information. An essential component for home and travel.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of GestureDetector", + "desc": [ + "【child】 : Child component 【Widget】", + "【onTap】 : Tap event 【Function()】", + "【onDoubleTap】 : Double tap event 【GestureTapCallback】", + "【onLongPress】 : Long press event 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Details of GestureDetector", + "desc": [ + "【onTapDown】 : Press down callback 【GestureTapDownCallback】", + "【onTapUp】 : Tap release callback 【GestureTapUpCallback】", + "【onTapCancel】 : Tap cancel 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Pan Events of GestureDetector", + "desc": [ + "【onPanDown】 : Press down callback 【GestureDragDownCallback】", + "【onPanEnd】 : Drag end 【GestureDragEndCallback】", + "【onPanStart】 : Drag start 【GestureDragStartCallback】", + "【onPanUpdate】 : Drag update 【GestureDragUpdateCallback】", + "【onPanCancel】 : Drag cancel 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json new file mode 100644 index 00000000..25e66c3a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_es_ES.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Detector de gestos", + "info": "Detector de eventos de gestos del componente, puede aceptar eventos como clics, pulsaciones largas, doble clic, presionar, soltar, mover, etc., y puede obtener información de los puntos de contacto, un componente esencial para viajes y hogar.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de GestureDetector", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onTap】 : Evento de clic 【Function()】", + "【onDoubleTap】 : Evento de doble clic 【GestureTapCallback】", + "【onLongPress】 : Evento de pulsación larga 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Información detallada de GestureDetector", + "desc": [ + "【onTapDown】 : Callback de presionar 【GestureTapDownCallback】", + "【onTapUp】 : Callback de levantar el clic 【GestureTapUpCallback】", + "【onTapCancel】 : Cancelar clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventos Pan de GestureDetector", + "desc": [ + "【onPanDown】 : Callback de presionar 【GestureDragDownCallback】", + "【onPanEnd】 : Fin de arrastre 【GestureDragEndCallback】", + "【onPanStart】 : Inicio de arrastre 【GestureDragStartCallback】", + "【onPanUpdate】 : Actualización de arrastre 【GestureDragUpdateCallback】", + "【onPanCancel】 : Cancelar arrastre 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json new file mode 100644 index 00000000..1d3b40ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_fr_FR.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Détecteur de gestes", + "info": "Détecteur d'événements gestuels pour les composants, peut accepter des événements tels que le clic, le maintien, le double-clic, l'appui, le relâchement, le déplacement, et peut obtenir des informations sur les points de contact, un composant essentiel pour les voyages à domicile.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de GestureDetector", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onTap】 : Événement de clic 【Function()】", + "【onDoubleTap】 : Événement de double-clic 【GestureTapCallback】", + "【onLongPress】 : Événement de maintien 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Informations détaillées de GestureDetector", + "desc": [ + "【onTapDown】 : Rappel d'appui 【GestureTapDownCallback】", + "【onTapUp】 : Rappel de relâchement 【GestureTapUpCallback】", + "【onTapCancel】 : Annulation de clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Événements Pan de GestureDetector", + "desc": [ + "【onPanDown】 : Rappel d'appui 【GestureDragDownCallback】", + "【onPanEnd】 : Fin de glissement 【GestureDragEndCallback】", + "【onPanStart】 : Début de glissement 【GestureDragStartCallback】", + "【onPanUpdate】 : Mise à jour de glissement 【GestureDragUpdateCallback】", + "【onPanCancel】 : Annulation de glissement 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json new file mode 100644 index 00000000..2b481e78 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_it_IT.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Rilevatore di gesti", + "info": "Rilevatore di eventi gestuali del componente, può accettare eventi come clic, pressione lunga, doppio clic, premuto, rilasciato, spostamento, ecc., e può ottenere informazioni sui punti di contatto, un componente essenziale per viaggi e casa.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di GestureDetector", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onTap】 : Evento di clic 【Function()】", + "【onDoubleTap】 : Evento di doppio clic 【GestureTapCallback】", + "【onLongPress】 : Evento di pressione lunga 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Dettagli di GestureDetector", + "desc": [ + "【onTapDown】 : Callback di pressione 【GestureTapDownCallback】", + "【onTapUp】 : Callback di rilascio del clic 【GestureTapUpCallback】", + "【onTapCancel】 : Annullamento del clic 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventi Pan di GestureDetector", + "desc": [ + "【onPanDown】 : Callback di pressione 【GestureDragDownCallback】", + "【onPanEnd】 : Fine del trascinamento 【GestureDragEndCallback】", + "【onPanStart】 : Inizio del trascinamento 【GestureDragStartCallback】", + "【onPanUpdate】 : Aggiornamento del trascinamento 【GestureDragUpdateCallback】", + "【onPanCancel】 : Annullamento del trascinamento 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json new file mode 100644 index 00000000..4f3f9f40 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ja_JP.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "ジェスチャー検出器", + "info": "コンポーネントのジェスチャーイベントを検出するデテクターで、クリック、長押し、ダブルクリック、押下、解放、移動などのイベントを受け取り、タッチポイントの情報を取得できます。家庭や旅行に必須のコンポーネントです。", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onTap】 : クリックイベント 【Function()】", + "【onDoubleTap】 : ダブルクリックイベント 【GestureTapCallback】", + "【onLongPress】 : 長押しイベント 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector詳細情報", + "desc": [ + "【onTapDown】 : 押下コールバック 【GestureTapDownCallback】", + "【onTapUp】 : クリック解放コールバック 【GestureTapUpCallback】", + "【onTapCancel】 : クリックキャンセル 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetectorのPanイベント", + "desc": [ + "【onPanDown】 : 押下コールバック 【GestureDragDownCallback】", + "【onPanEnd】 : ドラッグ終了 【GestureDragEndCallback】", + "【onPanStart】 : ドラッグ開始 【GestureDragStartCallback】", + "【onPanUpdate】 : ドラッグ更新 【GestureDragUpdateCallback】", + "【onPanCancel】 : ドラッグキャンセル 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json new file mode 100644 index 00000000..520768ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ko_KR.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "제스처 감지기", + "info": "컴포넌트 제스처 이벤트를 감지하는 장치로, 클릭, 길게 누르기, 더블 클릭, 누르기, 떼기, 이동 등의 이벤트를 받아들일 수 있으며, 접촉점 정보를 얻을 수 있습니다. 집에서 여행할 때 필수 컴포넌트입니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GestureDetector 기본 이벤트", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onTap】 : 클릭 이벤트 【Function()】", + "【onDoubleTap】 : 더블 클릭 이벤트 【GestureTapCallback】", + "【onLongPress】 : 길게 누르기 이벤트 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "GestureDetector 상세 정보", + "desc": [ + "【onTapDown】 : 누르기 콜백 【GestureTapDownCallback】", + "【onTapUp】 : 클릭 떼기 콜백 【GestureTapUpCallback】", + "【onTapCancel】 : 클릭 취소 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "GestureDetector의 Pan 이벤트", + "desc": [ + "【onPanDown】 : 누르기 콜백 【GestureDragDownCallback】", + "【onPanEnd】 : 드래그 종료 【GestureDragEndCallback】", + "【onPanStart】 : 드래그 시작 【GestureDragStartCallback】", + "【onPanUpdate】 : 드래그 업데이트 【GestureDragUpdateCallback】", + "【onPanCancel】 : 드래그 취소 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json new file mode 100644 index 00000000..f53b6704 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_pt_PT.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Detector de Gestos", + "info": "Detector de eventos de gestos do componente, pode aceitar eventos como clique, pressionamento longo, duplo clique, pressionar, soltar, mover, etc., e pode obter informações de toque, um componente essencial para viagens e uso doméstico.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do GestureDetector", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onTap】 : Evento de clique 【Function()】", + "【onDoubleTap】 : Evento de duplo clique 【GestureTapCallback】", + "【onLongPress】 : Evento de pressionamento longo 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Detalhes do GestureDetector", + "desc": [ + "【onTapDown】 : Callback de pressionar 【GestureTapDownCallback】", + "【onTapUp】 : Callback de soltar o clique 【GestureTapUpCallback】", + "【onTapCancel】 : Cancelamento do clique 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "Eventos de Pan do GestureDetector", + "desc": [ + "【onPanDown】 : Callback de pressionar 【GestureDragDownCallback】", + "【onPanEnd】 : Fim do arrasto 【GestureDragEndCallback】", + "【onPanStart】 : Início do arrasto 【GestureDragStartCallback】", + "【onPanUpdate】 : Atualização do arrasto 【GestureDragUpdateCallback】", + "【onPanCancel】 : Cancelamento do arrasto 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json new file mode 100644 index 00000000..0ee8016d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GestureDetector/desc_ru_RU.json @@ -0,0 +1,44 @@ +{ + "id": 146, + "name": "GestureDetector", + "localName": "Детектор жестов", + "info": "Детектор событий жестов компонента, который может принимать события, такие как нажатие, долгое нажатие, двойное нажатие, нажатие, отпускание, перемещение и т.д., а также может получать информацию о точках касания. Незаменимый компонент для домашнего использования и путешествий.", + "lever": 5, + "family": 0, + "linkIds": [ + 147, + 150 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события GestureDetector", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onTap】 : Событие нажатия 【Function()】", + "【onDoubleTap】 : Событие двойного нажатия 【GestureTapCallback】", + "【onLongPress】 : Событие долгого нажатия 【GestureLongPressCallback】" + ] + }, + { + "file": "node2_tap.dart", + "name": "Детальная информация GestureDetector", + "desc": [ + "【onTapDown】 : Обратный вызов нажатия 【GestureTapDownCallback】", + "【onTapUp】 : Обратный вызов отпускания нажатия 【GestureTapUpCallback】", + "【onTapCancel】 : Отмена нажатия 【GestureTapCancelCallback】" + ] + }, + { + "file": "node3_pan.dart", + "name": "События Pan GestureDetector", + "desc": [ + "【onPanDown】 : Обратный вызов нажатия 【GestureDragDownCallback】", + "【onPanEnd】 : Завершение перетаскивания 【GestureDragEndCallback】", + "【onPanStart】 : Начало перетаскивания 【GestureDragStartCallback】", + "【onPanUpdate】 : Обновление перетаскивания 【GestureDragUpdateCallback】", + "【onPanCancel】 : Отмена перетаскивания 【GestureDragCancelCallback】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json new file mode 100644 index 00000000..5bc18b0f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_de_DE.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Rasterlinien-Komponente", + "info": "Kann eine Komponente aufnehmen und ein Raster darauf zeichnen. Eigenschaften wie Farbe, Linienstärke, Abstand usw. können angegeben werden.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager Grundlegende Eigenschaften", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【color】: Farbe 【Color】", + "【interval】: Seitenlänge des kleinen Blocks 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager Unterteilung", + "desc": [ + "【child】: Untergeordnete Komponente 【Widget】", + "【color】: Farbe 【Color】", + "【subdivisions】: Anzahl der Unterblöcke im kleinen Block 【int】", + "【divisions】: Anzahl der Unterteilungen der Unterblöcke im kleinen Block 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json new file mode 100644 index 00000000..6b1cffee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_en_US.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Grid Line Component", + "info": "Can contain a component and draw a grid on it. Properties such as color, line width, spacing, etc., can be specified.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager Basic Properties", + "desc": [ + "【child】: Child component 【Widget】", + "【color】: Color 【Color】", + "【interval】: Small block side length 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager Subdivision", + "desc": [ + "【child】: Child component 【Widget】", + "【color】: Color 【Color】", + "【subdivisions】: Number of sub-blocks in a small block 【int】", + "【divisions】: Number of subdivisions of sub-blocks in a small block 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json new file mode 100644 index 00000000..82a72db5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_es_ES.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente de líneas de cuadrícula", + "info": "Puede contener un componente y dibujar una cuadrícula en él. Se pueden especificar propiedades como el color, el ancho de la línea, el espaciado, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades básicas de GridPager", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【color】: Color 【Color】", + "【interval】: Longitud del lado del bloque pequeño 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivisión de GridPager", + "desc": [ + "【child】: Componente hijo 【Widget】", + "【color】: Color 【Color】", + "【subdivisions】: Número de subbloques en el bloque pequeño 【int】", + "【divisions】: Número de divisiones de los subbloques en el bloque pequeño 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json new file mode 100644 index 00000000..04f0e9f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_fr_FR.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Composant de grille", + "info": "Peut contenir un composant et dessiner une grille dessus. Peut spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, l'espacement, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés de base de GridPager", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【color】: Couleur 【Color】", + "【interval】: Longueur du côté d'un petit bloc 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivision de GridPager", + "desc": [ + "【child】: Composant enfant 【Widget】", + "【color】: Couleur 【Color】", + "【subdivisions】: Nombre de sous-blocs dans un petit bloc 【int】", + "【divisions】: Nombre de subdivisions des sous-blocs dans un petit bloc 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json new file mode 100644 index 00000000..34edfbc1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_it_IT.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente Griglia", + "info": "Può contenere un componente e disegnare una griglia su di esso. È possibile specificare proprietà come colore, spessore della linea, spaziatura, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà Base di GridPager", + "desc": [ + "【child】: Componente Figlio 【Widget】", + "【color】: Colore 【Color】", + "【interval】: Lunghezza del lato del blocco 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Suddivisione di GridPager", + "desc": [ + "【child】: Componente Figlio 【Widget】", + "【color】: Colore 【Color】", + "【subdivisions】: Numero di sotto-blocchi in un blocco 【int】", + "【divisions】: Numero di suddivisioni dei sotto-blocchi in un blocco 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json new file mode 100644 index 00000000..24f5b37d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ja_JP.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "グリッド線コンポーネント", + "info": "1つのコンポーネントを収容し、その上にグリッドを描画します。色、線幅、間隔などの属性を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 基本属性", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【color】: 色 【Color】", + "【interval】: 小片の辺の長さ 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 再分割", + "desc": [ + "【child】: 子コンポーネント 【Widget】", + "【color】: 色 【Color】", + "【subdivisions】: 小片中の中片の数 【int】", + "【divisions】: 小片中の中片の分割数 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json new file mode 100644 index 00000000..a961488c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ko_KR.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "그리드 라인 컴포넌트", + "info": "하나의 컴포넌트를 수용할 수 있으며, 그 위에 그리드를 그립니다. 색상, 선 두께, 간격 등의 속성을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridPager 기본 속성", + "desc": [ + "【child】: 자식 컴포넌트 【Widget】", + "【color】: 색상 【Color】", + "【interval】: 작은 블록의 변 길이 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "GridPager 재분할", + "desc": [ + "【child】: 자식 컴포넌트 【Widget】", + "【color】: 색상 【Color】", + "【subdivisions】: 작은 블록 내의 하위 블록 개수 【int】", + "【divisions】: 작은 블록 내의 하위 블록 분할 수 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json new file mode 100644 index 00000000..dfdbfcf8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_pt_PT.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Componente de Linhas de Grelha", + "info": "Pode conter um componente, desenhando uma grelha sobre ele. Pode especificar propriedades como cor, largura da linha, espaçamento, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades Básicas do GridPager", + "desc": [ + "【child】: Componente filho 【Widget】", + "【color】: Cor 【Color】", + "【interval】: Comprimento do lado do pequeno bloco 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Subdivisão do GridPager", + "desc": [ + "【child】: Componente filho 【Widget】", + "【color】: Cor 【Color】", + "【subdivisions】: Número de sub-blocos no pequeno bloco 【int】", + "【divisions】: Número de divisões dos sub-blocos no pequeno bloco 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json new file mode 100644 index 00000000..39087b7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridPaper/desc_ru_RU.json @@ -0,0 +1,30 @@ +{ + "id": 37, + "name": "GridPaper", + "localName": "Компонент с сеткой", + "info": "Может содержать один компонент, на котором рисуется сетка. Можно указать такие свойства, как цвет, толщина линий, расстояние и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные свойства GridPager", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【color】: Цвет 【Color】", + "【interval】: Длина стороны квадрата 【double】" + ] + }, + { + "file": "node2_divisions.dart", + "name": "Разделение GridPager", + "desc": [ + "【child】: Дочерний компонент 【Widget】", + "【color】: Цвет 【Color】", + "【subdivisions】: Количество подблоков в квадрате 【int】", + "【divisions】: Количество разделений подблоков в квадрате 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json new file mode 100644 index 00000000..08ad2e81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Rasterkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, kann Kopf-, Fuß- und Unterkomponenten angeben und wird häufig in Rasterlisten verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung von GridTile ist wie folgt", + "desc": [ + "【header】: Kopfkomponente 【Widget】", + "【child】: Unterkomponente 【Widget】", + "【footer】: Fußkomponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json new file mode 100644 index 00000000..a2693582 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Grid Tile", + "info": "A general list item structure provided by Flutter, which can specify header, footer, and child components, commonly used in grid lists.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of GridTile is as follows", + "desc": [ + "【header】: Header component 【Widget】", + "【child】: Child component 【Widget】", + "【footer】: Footer component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json new file mode 100644 index 00000000..80ba2b89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Mosaico de cuadrícula", + "info": "Una estructura de lista genérica proporcionada por Flutter que permite especificar componentes de cabecera, pie y secundarios, comúnmente utilizada en listas de cuadrícula.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de GridTile es la siguiente", + "desc": [ + "【header】: Componente de cabecera 【Widget】", + "【child】: Componente secundario 【Widget】", + "【footer】: Componente de pie 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json new file mode 100644 index 00000000..1cc76759 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Tuile de grille", + "info": "Une structure d'élément de liste générique fournie par Flutter, permettant de spécifier des composants de tête, de queue et enfants, souvent utilisée dans les listes en grille.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La représentation de base de GridTile est la suivante", + "desc": [ + "【header】: Composant de tête 【Widget】", + "【child】: Composant enfant 【Widget】", + "【footer】: Composant de pied 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json new file mode 100644 index 00000000..5d5022af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Piastrella a griglia", + "info": "Una struttura di voci di lista generica fornita da Flutter, che consente di specificare componenti di testa, coda e figlio, comunemente utilizzata nelle liste a griglia.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di GridTile è la seguente", + "desc": [ + "【header】: componente di testa 【Widget】", + "【child】: componente figlio 【Widget】", + "【footer】: componente di coda 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json new file mode 100644 index 00000000..9124ce39 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "グリッドタイル", + "info": "Flutterが提供する汎用リストエントリ構造で、ヘッダー、フッター、子コンポーネントを指定でき、グリッドリストでよく使用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileの基本的な表現は以下の通りです", + "desc": [ + "【header】: ヘッダーコンポーネント 【Widget】", + "【child】: 子コンポーネント 【Widget】", + "【footer】: フッターコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json new file mode 100644 index 00000000..9cf8a790 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "그리드 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 헤더, 푸터, 자식 컴포넌트를 지정할 수 있으며, 주로 그리드 목록에 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTile의 기본 표현은 다음과 같습니다", + "desc": [ + "【header】: 헤더 컴포넌트 【Widget】", + "【child】: 자식 컴포넌트 【Widget】", + "【footer】: 푸터 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json new file mode 100644 index 00000000..06300e45 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Azulejo de Grade", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, que permite especificar componentes de cabeçalho, rodapé e filhos, comumente usada em listas de grade.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do GridTile é a seguinte", + "desc": [ + "【header】: Componente de cabeçalho 【Widget】", + "【child】: Componente filho 【Widget】", + "【footer】: Componente de rodapé 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json new file mode 100644 index 00000000..6355dbdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTile/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 21, + "name": "GridTile", + "localName": "Сетка плитки", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, которая позволяет указать компоненты заголовка, нижнего колонтитула и дочерние компоненты, часто используется в списках сеток.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление GridTile выглядит следующим образом", + "desc": [ + "【header】: Компонент заголовка 【Widget】", + "【child】: Дочерний компонент 【Widget】", + "【footer】: Компонент нижнего колонтитула 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json new file mode 100644 index 00000000..5948a854 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Gitterfliesenkopf", + "info": "Eine allgemeine Kopfstruktur, die von Flutter bereitgestellt wird, mit einer Struktur von links, Mitte und rechts. Komponenten können an den entsprechenden Positionen eingefügt werden, was eine einfache Handhabung spezifischer Einträge ermöglicht. Im Vergleich zu ListTile gibt es weniger Attribute.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung von GridTileBar ist wie folgt", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json new file mode 100644 index 00000000..e9db776e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Grid Tile Header", + "info": "A common header structure provided by Flutter, with a left-center-right layout. Components can be inserted into the corresponding positions, making it easy to handle specific items. Compared to ListTile, it has fewer properties.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of GridTileBar is as follows", + "desc": [ + "【leading】: Left component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【backgroundColor】: Background color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json new file mode 100644 index 00000000..28d06cce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra de mosaico de cuadrícula", + "info": "Flutter proporciona una estructura de encabezado común, con una estructura de izquierda, centro y derecha. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente. En comparación con ListTile, tiene menos atributos.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de GridTileBar es la siguiente", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【trailing】: Componente derecho 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【backgroundColor】: Color de fondo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json new file mode 100644 index 00000000..0cd45719 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barre de tuile de grille", + "info": "Une structure de tête générique fournie par Flutter, avec une structure gauche-centre-droite. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques, avec moins d'attributs que ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de GridTileBar est la suivante", + "desc": [ + "【leading】: Composant gauche 【Widget】", + "【trailing】: Composant de queue 【Widget】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json new file mode 100644 index 00000000..c43d5fb5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra della piastrella della griglia", + "info": "Una struttura di intestazione generica fornita da Flutter, con una struttura sinistra-centro-destra. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendolo molto conveniente per gestire voci specifiche, con meno attributi rispetto a ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di GridTileBar è la seguente", + "desc": [ + "【leading】: Componente sinistro 【Widget】", + "【trailing】: Componente destro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json new file mode 100644 index 00000000..334e2d47 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "グリッドタイルバー", + "info": "Flutterが提供する一般的なヘッダー構造で、左中右の構造です。対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。ListTileと比較して、属性が少ないです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBarの基本的な表現は以下の通りです", + "desc": [ + "【leading】: 左側のコンポーネント 【Widget】", + "【trailing】: 右側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【backgroundColor】: 背景色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json new file mode 100644 index 00000000..239ae928 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "그리드 타일 헤더", + "info": "Flutter에서 제공하는 일반적인 헤더 구조로, 왼쪽, 중앙, 오른쪽 구조를 가지고 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있으며, ListTile에 비해 속성이 적습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridTileBar의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【backgroundColor】: 배경색 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json new file mode 100644 index 00000000..c130ca60 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Barra de Azulejo de Grade", + "info": "Uma estrutura de cabeçalho genérica fornecida pelo Flutter, com uma estrutura de esquerda, centro e direita. Componentes podem ser inseridos nas posições correspondentes, o que facilita a adaptação a itens específicos, com menos atributos em comparação com o ListTile.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A representação básica do GridTileBar é a seguinte", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【trailing】: Componente direito 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【backgroundColor】: Cor de fundo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json new file mode 100644 index 00000000..39586e3b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridTileBar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 20, + "name": "GridTileBar", + "localName": "Сетка плитки", + "info": "Flutter предоставляет универсальную структуру заголовка, которая имеет структуру слева, по центру и справа. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к конкретным элементам, по сравнению с ListTile, атрибутов меньше.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление GridTileBar выглядит следующим образом", + "desc": [ + "【leading】: Левый компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【backgroundColor】: Цвет фона 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json new file mode 100644 index 00000000..26249c9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_de_DE.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Rasterkomponente", + "info": "Enthält mehrere Komponenten und organisiert sie in einem Raster. Kann über count, extent, custom, builder usw. konstruiert werden. Hat Eigenschaften wie Innenabstand, ob umgekehrt, Scroll-Controller usw.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count Konstruktion", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【crossAxisCount】 : Anzahl der Boxen pro Zeile in der Hauptachse 【int】", + "【mainAxisSpacing】 : Abstand zwischen den Zeilen in der Hauptachse 【double】", + "【crossAxisSpacing】 : Abstand zwischen den Zeilen in der Querachse 【double】", + "【childAspectRatio】 : Verhältnis von Hauptlänge zu Querlänge der Box 【double】", + "【crossAxisCount】 : Anzahl der Boxen pro Zeile in der Hauptachse 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView Scrollrichtung", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt gescrollt wird 【bool】", + "【shrinkWrap】 : Ob bei fehlenden Grenzen umwickelt wird 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView Scrollrichtung", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt gescrollt wird 【bool】", + "【shrinkWrap】 : Ob bei fehlenden Grenzen umwickelt wird 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder Konstruktion", + "desc": [ + "【itemCount】 : Anzahl der Einträge 【int】", + "【gridDelegate】 : Rasterdelegat 【SliverGridDelegate】", + "【itemBuilder】 : Eintragskonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json new file mode 100644 index 00000000..a99d2fdc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_en_US.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Grid Component", + "info": "Accommodates multiple components in a grid manner. Can be constructed via count, extent, custom, builder, etc. Has properties such as padding, whether to reverse, scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count Construction", + "desc": [ + "【children】 : List of child components 【List】", + "【crossAxisCount】 : Number of boxes per row on the main axis 【int】", + "【mainAxisSpacing】 : Spacing between rows on the main axis 【double】", + "【crossAxisSpacing】 : Spacing between rows on the cross axis 【double】", + "【childAspectRatio】 : Main length/cross length of the box 【double】", + "【crossAxisCount】 : Number of boxes per row on the main axis 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView Scroll Direction", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when there is no boundary 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView Scroll Direction", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when there is no boundary 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder Construction", + "desc": [ + "【itemCount】 : Number of items 【int】", + "【gridDelegate】 : Grid delegate 【SliverGridDelegate】", + "【itemBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json new file mode 100644 index 00000000..62b7abda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_es_ES.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente de cuadrícula", + "info": "Contiene múltiples componentes y los organiza en forma de cuadrícula. Se puede construir mediante count, extent, custom, builder, etc. Tiene propiedades como el relleno interno, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construcción de GridView.count", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【crossAxisCount】 : Número de cajas por fila en el eje principal 【int】", + "【mainAxisSpacing】 : Espaciado entre filas en el eje principal 【double】", + "【crossAxisSpacing】 : Espaciado entre filas en el eje transversal 【double】", + "【childAspectRatio】 : Relación entre la longitud principal y la longitud transversal de la caja 【double】", + "【crossAxisCount】 : Número de cajas por fila en el eje principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de desplazamiento de GridView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Dirección de desplazamiento de GridView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construcción de GridView.builder", + "desc": [ + "【itemCount】 : Número de elementos 【int】", + "【gridDelegate】 : Delegado de cuadrícula 【SliverGridDelegate】", + "【itemBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json new file mode 100644 index 00000000..56ed3d5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_fr_FR.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Composant de grille", + "info": "Contient plusieurs composants et les organise en grille. Peut être construit via count, extent, custom, builder, etc. Possède des propriétés telles que la marge intérieure, la direction inverse, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construction de GridView.count", + "desc": [ + "【children】 : Liste des composants enfants 【List】", + "【crossAxisCount】 : Nombre de boîtes par ligne sur l'axe principal 【int】", + "【mainAxisSpacing】 : Espacement entre les lignes sur l'axe principal 【double】", + "【crossAxisSpacing】 : Espacement entre les lignes sur l'axe transversal 【double】", + "【childAspectRatio】 : Rapport longueur principale/longueur transversale de la boîte 【double】", + "【crossAxisCount】 : Nombre de boîtes par ligne sur l'axe principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de GridView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inversé 【bool】", + "【shrinkWrap】 : Encapsulation lorsque sans limites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direction de défilement de GridView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inversé 【bool】", + "【shrinkWrap】 : Encapsulation lorsque sans limites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construction de GridView.builder", + "desc": [ + "【itemCount】 : Nombre d'éléments 【int】", + "【gridDelegate】 : Délégué de grille 【SliverGridDelegate】", + "【itemBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json new file mode 100644 index 00000000..c3b9b94f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_it_IT.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente griglia", + "info": "Contiene più componenti e li organizza in una griglia. Può essere costruito utilizzando count, extent, custom, builder, ecc. Ha proprietà come padding, reverse, controller di scorrimento, ecc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Costruzione GridView.count", + "desc": [ + "【children】 : Lista di componenti figli 【List】", + "【crossAxisCount】 : Numero di box per riga nell'asse principale 【int】", + "【mainAxisSpacing】 : Spaziatura tra le righe nell'asse principale 【double】", + "【crossAxisSpacing】 : Spaziatura tra le righe nell'asse trasversale 【double】", + "【childAspectRatio】 : Rapporto lunghezza principale/lunghezza trasversale del box 【double】", + "【crossAxisCount】 : Numero di elementi per riga nell'asse principale 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento GridView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direzione di scorrimento GridView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Costruzione GridView.builder", + "desc": [ + "【itemCount】 : Numero di elementi 【int】", + "【gridDelegate】 : Delegato della griglia 【SliverGridDelegate】", + "【itemBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json new file mode 100644 index 00000000..c3a5a7a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ja_JP.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "グリッドコンポーネント", + "info": "複数のコンポーネントを収容し、グリッド方式で表示します。count、extent、custom、builderなどを使用して構築できます。内側の余白、逆方向かどうか、スクロールコントローラーなどの属性があります。", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count構築", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【crossAxisCount】 : 主軸一行のボックス数 【int】", + "【mainAxisSpacing】 : 主軸各行の間隔 【double】", + "【crossAxisSpacing】 : 交差軸各行の間隔 【double】", + "【childAspectRatio】 : ボックスの主軸長/交差軸長 【double】", + "【crossAxisCount】 : 主軸一行の数 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridViewスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridViewスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 逆方向にスクロールするかどうか 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder構築", + "desc": [ + "【itemCount】 : 項目数 【int】", + "【gridDelegate】 : グリッドデリゲート 【SliverGridDelegate】", + "【itemBuilder】 : 項目ビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json new file mode 100644 index 00000000..68a10541 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ko_KR.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "그리드 컴포넌트", + "info": "여러 컴포넌트를 포함하고 그리드 방식으로 배치합니다. count, extent, custom, builder 등을 통해 구성할 수 있습니다. 내부 여백, 반대 방향 여부, 스크롤 컨트롤러 등의 속성이 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "GridView.count 구성", + "desc": [ + "【children】 : 자식 컴포넌트 리스트 【List】", + "【crossAxisCount】 : 주축 한 줄의 box 수 【int】", + "【mainAxisSpacing】 : 주축 각 줄 간격 【double】", + "【crossAxisSpacing】 : 교차축 각 줄 간격 【double】", + "【childAspectRatio】 : box 주 길이/교차축 길이 【double】", + "【crossAxisCount】 : 주축 한 줄 수 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "GridView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "GridView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "GridView.builder 구성", + "desc": [ + "【itemCount】 : 항목 수 【int】", + "【gridDelegate】 : 그리드 대리자 【SliverGridDelegate】", + "【itemBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json new file mode 100644 index 00000000..21b7bcc5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_pt_PT.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Componente de Grade", + "info": "Acomoda vários componentes em formato de grade. Pode ser construído através de count, extent, custom, builder, etc. Possui propriedades como padding, reversão, controlador de deslize, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Construção de GridView.count", + "desc": [ + "【children】 : Lista de componentes filhos 【List】", + "【crossAxisCount】 : Número de caixas por linha no eixo principal 【int】", + "【mainAxisSpacing】 : Espaçamento entre linhas no eixo principal 【double】", + "【crossAxisSpacing】 : Espaçamento entre linhas no eixo cruzado 【double】", + "【childAspectRatio】 : Proporção do comprimento principal/comprimento do eixo cruzado da caixa 【double】", + "【crossAxisCount】 : Número de caixas por linha no eixo principal 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslize do GridView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se desliza na direção inversa 【bool】", + "【shrinkWrap】 : Se envolve quando não há limites 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Direção de Deslize do GridView", + "desc": [ + "【scrollDirection】 : Direção de deslize 【Axis】", + "【reverse】 : Se desliza na direção inversa 【bool】", + "【shrinkWrap】 : Se envolve quando não há limites 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Construção de GridView.builder", + "desc": [ + "【itemCount】 : Número de itens 【int】", + "【gridDelegate】 : Delegado de grade 【SliverGridDelegate】", + "【itemBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json new file mode 100644 index 00000000..4dc330ef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/GridView/desc_ru_RU.json @@ -0,0 +1,53 @@ +{ + "id": 163, + "name": "GridView", + "localName": "Сетка", + "info": "Содержит несколько компонентов и отображает их в виде сетки. Может быть создан с использованием count, extent, custom, builder и других методов. Имеет свойства, такие как внутренние отступы, обратное направление, контроллер прокрутки и другие.", + "lever": 5, + "family": 0, + "linkIds": [ + 21, + 162 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Конструктор GridView.count", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【crossAxisCount】 : Количество элементов в строке по главной оси 【int】", + "【mainAxisSpacing】 : Расстояние между строками по главной оси 【double】", + "【crossAxisSpacing】 : Расстояние между строками по поперечной оси 【double】", + "【childAspectRatio】 : Соотношение длины по главной оси к длине по поперечной оси 【double】", + "【crossAxisCount】 : Количество элементов в строке по главной оси 【int】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки GridView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обертывание при отсутствии границ 【bool】" + ] + }, + { + "file": "node3_extend.dart", + "name": "Направление прокрутки GridView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обертывание при отсутствии границ 【bool】" + ] + }, + { + "file": "node4_builder.dart", + "name": "Конструктор GridView.builder", + "desc": [ + "【itemCount】 : Количество элементов 【int】", + "【gridDelegate】 : Делегат сетки 【SliverGridDelegate】", + "【itemBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json new file mode 100644 index 00000000..a7e5179a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html-Elementansicht", + "info": "Einbetten eines HTML-Elements in die Widget-Hierarchie von Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einführung in HtmlElementView", + "desc": [ + "【child】 : Untergeordnete Komponente 【child】", + "【viewType】 : Eindeutige Kennung des HTML-Elements 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json new file mode 100644 index 00000000..5c1a76ba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html element view", + "info": "Embeds an HTML element within the Widget hierarchy of Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to HtmlElementView", + "desc": [ + "【child】 : Child widget 【child】", + "【viewType】 : Unique identifier for the HTML element 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json new file mode 100644 index 00000000..7411690d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista de elemento html", + "info": "Incrusta un elemento HTML en la jerarquía de Widgets de Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a HtmlElementView", + "desc": [ + "【child】 : componente hijo 【child】", + "【viewType】 : identificador único del elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json new file mode 100644 index 00000000..a597b30a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vue d'élément html", + "info": "Intégrer un élément HTML dans la hiérarchie des Widgets de Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à HtmlElementView", + "desc": [ + "【child】 : composant enfant 【child】", + "【viewType】 : identifiant unique de l'élément html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json new file mode 100644 index 00000000..03d1b146 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista elemento html", + "info": "Incorpora un elemento HTML nella gerarchia dei widget di Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a HtmlElementView", + "desc": [ + "【child】 : componente figlio 【child】", + "【viewType】 : identificatore unico dell'elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json new file mode 100644 index 00000000..ee3c57da --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html エレメントビュー", + "info": "Flutter Web の Widget 階層に HTML エレメントを埋め込みます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 紹介", + "desc": [ + "【child】 : 子コンポーネント 【child】", + "【viewType】 : htmlエレメントのユニーク識別子 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json new file mode 100644 index 00000000..16031534 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html 요소 뷰", + "info": "Flutter Web의 위젯 계층 구조에 HTML 요소를 삽입합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "HtmlElementView 소개", + "desc": [ + "【child】 : 자식 위젯 【child】", + "【viewType】 : html 요소 고유 식별자 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json new file mode 100644 index 00000000..5b0863d0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "vista de elemento html", + "info": "Incorpora um elemento HTML na hierarquia de Widgets do Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao HtmlElementView", + "desc": [ + "【child】 : componente filho 【child】", + "【viewType】 : identificador único do elemento html 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json new file mode 100644 index 00000000..3a7aea92 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/HtmlElementView/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 213, + "name": "HtmlElementView", + "localName": "html элемент представления", + "info": "Встраивает HTML-элемент в иерархию виджетов Flutter Web.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в HtmlElementView", + "desc": [ + "【child】 : дочерний компонент 【child】", + "【viewType】 : уникальный идентификатор HTML-элемента 【String】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json new file mode 100644 index 00000000..a4370c7c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Symbolkomponente", + "info": "Komponente zur Anzeige von Symbolen. Ermöglicht die Angabe von Symbolressourcen, Größe und Farbe. Sehr einfach, aber sehr nützlich", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Zum Anzeigen eines Symbols", + "desc": [ + "【Eingabeparameter】 : Symboldaten 【IconData】", + "【size】 : Größe 【double】", + "【color】: Farbe 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Verwendung von benutzerdefinierten Symbolen", + "desc": [ + "Symbolschriftarten können von der iconfont-Website heruntergeladen und verwendet werden" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json new file mode 100644 index 00000000..8952d62b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Icon Component", + "info": "Component for displaying icons. Can specify icon resources, size, and color. Very simple, but very useful", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display an icon", + "desc": [ + "【Input】 : Icon data 【IconData】", + "【size】 : Size 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Use custom icons", + "desc": [ + "You can download icon fonts from the iconfont website for use" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json new file mode 100644 index 00000000..5fe3cb43 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente de icono", + "info": "Componente para mostrar iconos. Puede especificar el recurso del icono, el tamaño y el color. Muy simple, pero muy útil", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Para mostrar un icono", + "desc": [ + "【Parámetro de entrada】: Datos del icono 【IconData】", + "【size】: Tamaño 【double】", + "【color】: Color 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usar iconos personalizados", + "desc": [ + "Puede descargar fuentes de iconos desde el sitio web de iconfont para su uso" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json new file mode 100644 index 00000000..280fb11f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Composant d'icône", + "info": "Composant pour l'affichage d'icônes. Permet de spécifier la ressource d'icône, la taille, la couleur. Très simple, mais très utile", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pour afficher une icône", + "desc": [ + "【Paramètre】 : Données de l'icône 【IconData】", + "【size】 : Taille 【double】", + "【color】: Couleur 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Utiliser des icônes personnalisées", + "desc": [ + "Vous pouvez télécharger des polices d'icônes sur le site iconfont pour les utiliser" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json new file mode 100644 index 00000000..ede363f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente Icona", + "info": "Componente per la visualizzazione delle icone. Puoi specificare la risorsa dell'icona, la dimensione e il colore. Molto semplice, ma molto utile", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Per visualizzare un'icona", + "desc": [ + "【Parametro】 : Dati dell'icona 【IconData】", + "【size】 : Dimensione 【double】", + "【color】: Colore 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usa icone personalizzate", + "desc": [ + "Puoi scaricare i caratteri delle icone dal sito iconfont per usarli" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json new file mode 100644 index 00000000..74877e3d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "アイコンコンポーネント", + "info": "アイコン表示用のコンポーネントです。アイコンリソース、サイズ、色を指定できます。非常にシンプルですが、非常に便利です。", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "アイコンを表示するために使用", + "desc": [ + "【引数】: アイコンデータ 【IconData】", + "【size】: サイズ 【double】", + "【color】: 色 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "カスタムアイコンを使用", + "desc": [ + "iconfontウェブサイトからアイコンフォントをダウンロードして使用できます" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json new file mode 100644 index 00000000..f7e049a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "아이콘 컴포넌트", + "info": "아이콘 표시를 위한 컴포넌트입니다. 아이콘 리소스, 크기, 색상을 지정할 수 있습니다. 매우 간단하지만 매우 유용합니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "아이콘을 표시하기 위해 사용", + "desc": [ + "【입력 매개변수】 : 아이콘 데이터 【IconData】", + "【size】 : 크기 【double】", + "【color】: 색상 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "사용자 정의 아이콘 사용", + "desc": [ + "iconfont 웹사이트에서 아이콘 폰트를 다운로드하여 사용할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json new file mode 100644 index 00000000..fb473652 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Componente de Ícone", + "info": "Componente para exibição de ícones. Pode especificar o recurso do ícone, tamanho e cor. Muito simples, mas muito útil", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir um ícone", + "desc": [ + "【Parâmetro de entrada】: Dados do ícone 【IconData】", + "【size】: Tamanho 【double】", + "【color】: Cor 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Usar ícone personalizado", + "desc": [ + "Pode baixar fontes de ícones no site iconfont para uso" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json new file mode 100644 index 00000000..9cda5c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Icon/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 6, + "name": "Icon", + "localName": "Компонент иконки", + "info": "Компонент для отображения иконок. Можно указать ресурс иконки, размер, цвет. Очень просто, но очень полезно", + "lever": 2, + "family": 0, + "linkIds": [ + 7, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Для отображения иконки", + "desc": [ + "【Входные параметры】 : данные иконки 【IconData】", + "【size】 : размер 【double】", + "【color】: цвет 【Color】" + ] + }, + { + "file": "node2_diy.dart", + "name": "Использование пользовательской иконки", + "desc": [ + "Можно скачать шрифт иконки с сайта iconfont для использования" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json new file mode 100644 index 00000000..095206db --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Symbolschaltfläche", + "info": "Klickbare Symbolschaltfläche, die Symbolinformationen, Innenabstand, Größe, Farbe usw. angeben kann und Klickereignisse empfängt.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton-Eigenschaften", + "desc": [ + "【icon】: Symbolkomponente 【Widget】", + "【tooltip】: Langzeitdruck-Hinweistext 【String】", + "【highlightColor】: Langzeitdruck-Highlight-Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【onPressed】: Klickereignis 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json new file mode 100644 index 00000000..8284e78a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Icon Button", + "info": "A clickable icon button that can specify icon information, padding, size, color, etc., and receives click events.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton Properties", + "desc": [ + "【icon】: Icon component 【Widget】", + "【tooltip】: Long press tooltip text 【String】", + "【highlightColor】: Long press highlight color 【Color】", + "【splashColor】: Ripple color 【Color】", + "【onPressed】: Click event 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json new file mode 100644 index 00000000..7432a0b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Botón de icono", + "info": "Botón de icono clickeable, puede especificar información del icono, padding, tamaño, color, etc., y recibe eventos de clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades de IconButton", + "desc": [ + "【icon】: Componente de icono 【Widget】", + "【tooltip】: Texto de sugerencia al mantener presionado 【String】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【onPressed】: Evento de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json new file mode 100644 index 00000000..1cbaf9eb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Bouton d'icône", + "info": "Bouton d'icône cliquable, peut spécifier des informations d'icône, un remplissage, une taille, une couleur, etc., et reçoit des événements de clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés d'IconButton", + "desc": [ + "【icon】: Composant d'icône 【Widget】", + "【tooltip】: Texte d'info-bulle lors d'un appui long 【String】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【onPressed】: Événement de clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json new file mode 100644 index 00000000..31729448 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Pulsante Icona", + "info": "Pulsante icona cliccabile, può specificare informazioni sull'icona, spaziatura interna, dimensione, colore, ecc., riceve eventi di clic.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà IconButton", + "desc": [ + "【icon】: Componente icona 【Widget】", + "【tooltip】: Testo di suggerimento per pressione prolungata 【String】", + "【highlightColor】: Colore evidenziato per pressione prolungata 【Color】", + "【splashColor】: Colore effetto ondulazione 【Color】", + "【onPressed】: Evento di clic 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json new file mode 100644 index 00000000..39425031 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "アイコンボタン", + "info": "クリック可能なアイコンボタンで、アイコン情報、パディング、サイズ、色などを指定でき、クリックイベントを受け取ります。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButtonプロパティ", + "desc": [ + "【icon】: アイコンコンポーネント 【Widget】", + "【tooltip】: 長押し時のヒントテキスト 【String】", + "【highlightColor】: 長押し時のハイライト色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【onPressed】: クリックイベント 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json new file mode 100644 index 00000000..69529b1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "아이콘 버튼", + "info": "클릭 가능한 아이콘 버튼으로, 아이콘 정보, 패딩, 크기, 색상 등을 지정할 수 있으며 클릭 이벤트를 수신합니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "IconButton 속성", + "desc": [ + "【icon】: 아이콘 컴포넌트 【Widget】", + "【tooltip】: 길게 누를 때 표시되는 텍스트 【String】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json new file mode 100644 index 00000000..06ef0ae6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Botão de Ícone", + "info": "Botão de ícone clicável, pode especificar informações de ícone, preenchimento interno, tamanho, cor, etc., e recebe eventos de clique.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades do IconButton", + "desc": [ + "【icon】: Componente de ícone 【Widget】", + "【tooltip】: Texto de dica ao pressionar 【String】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【onPressed】: Evento de clique 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json new file mode 100644 index 00000000..cc27ab35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/IconButton/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 30, + "name": "IconButton", + "localName": "Кнопка с иконкой", + "info": "Кликабельная кнопка с иконкой, можно указать информацию об иконке, внутренние отступы, размер, цвет и т.д., принимает событие клика.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Свойства IconButton", + "desc": [ + "【icon】: Компонент иконки 【Widget】", + "【tooltip】: Текст подсказки при долгом нажатии 【String】", + "【highlightColor】: Цвет подсветки при долгом нажатии 【Color】", + "【splashColor】: Цвет эффекта волны 【Color】", + "【onPressed】: Событие клика 【Function】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json new file mode 100644 index 00000000..c9c0f95a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Container", + "info": "Eine Komponente, die ein Bild in eine einfarbige Farbe umwandelt. Größe und Farbe können angegeben werden.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Wird verwendet, um ein einfarbiges Bild anzuzeigen", + "desc": [ + "【Parameter】: Bildressource 【ImageProvider】", + "【size】: Größe 【double】", + "【color】: Farbe der Markierung 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json new file mode 100644 index 00000000..90f16806 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Container", + "info": "A component used to turn an image into a solid color. You can specify the size and color.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Used to display a solid color image", + "desc": [ + "【Parameter】: Image resource 【ImageProvider】", + "【size】: Size 【double】", + "【color】: Badge color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json new file mode 100644 index 00000000..09e681c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Contenedor", + "info": "Componente utilizado para convertir una imagen en un color sólido. Puede especificar el tamaño y el color.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Se utiliza para mostrar una imagen de color sólido", + "desc": [ + "【Parámetro de entrada】: Recurso de imagen 【ImageProvider】", + "【size】: Tamaño 【double】", + "【color】: Color de la etiqueta 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json new file mode 100644 index 00000000..36b48738 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Conteneur", + "info": "Un composant pour transformer une image en une couleur unie. Peut spécifier la taille et la couleur.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisé pour afficher une image en couleur unie", + "desc": [ + "【Paramètre】 : Ressource d'image 【ImageProvider】", + "【size】 : Taille 【double】", + "【color】: Couleur de l'étiquette 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json new file mode 100644 index 00000000..f32ca86a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Contenitore", + "info": "Componente utilizzato per trasformare un'immagine in un colore solido. È possibile specificare dimensioni e colore.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilizzato per visualizzare un'immagine a tinta unita", + "desc": [ + "【Parametro】 : Risorsa immagine 【ImageProvider】", + "【size】 : Dimensione 【double】", + "【color】: Colore del badge 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json new file mode 100644 index 00000000..f14e7c89 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "コンテナ", + "info": "画像を単色に変えるためのコンポーネントです。サイズや色を指定できます。", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "単色の画像を表示するために使用", + "desc": [ + "【入参】 : 画像リソース 【ImageProvider】", + "【size】 : サイズ 【double】", + "【color】: バッジの色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json new file mode 100644 index 00000000..11ec8ae0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "컨테이너", + "info": "이미지를 단색으로 변경하는 컴포넌트입니다. 크기와 색상을 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "단색 이미지를 표시하는 데 사용", + "desc": [ + "【입력 매개변수】 : 이미지 리소스 【ImageProvider】", + "【size】 : 크기 【double】", + "【color】: 배지 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json new file mode 100644 index 00000000..7cf446f0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Recipiente", + "info": "Componente usado para transformar uma imagem em uma cor sólida. Pode especificar o tamanho e a cor.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Usado para exibir uma imagem de cor sólida", + "desc": [ + "【Parâmetro de entrada】: Recurso de imagem 【ImageProvider】", + "【size】: Tamanho 【double】", + "【color】: Cor do ícone 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json new file mode 100644 index 00000000..f560ccf0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ImageIcon/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 7, + "name": "ImageIcon", + "localName": "Контейнер", + "info": "Компонент для преобразования изображения в однотонный цвет. Можно указать размер и цвет.", + "lever": 1, + "family": 0, + "linkIds": [ + 6, + 30, + 125 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Используется для отображения однотонного изображения", + "desc": [ + "【Параметр】 : Ресурс изображения 【ImageProvider】", + "【size】 : Размер 【double】", + "【color】: Цвет индикатора 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json new file mode 100644 index 00000000..b6e32c70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_de_DE.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Kombinierter Chip", + "info": "Ähnlich wie die Chip-Komponente, integriert Klick-, Lösch- und Auswahlereignisse. Hinweis: Klick- und Auswahlereignisse können nicht gleichzeitig vorhanden sein.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Kann Klick- und Lösch-Ereignisse akzeptieren", + "desc": [ + "【onPressed】: Klick-Ereignis 【Function()】", + "【onDeleted】: Lösch-Ereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Kann Auswahl-Ereignisse akzeptieren", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【onSelected】: Auswahl-Ereignis 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json new file mode 100644 index 00000000..6c0ac259 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_en_US.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Comprehensive Chip", + "info": "Similar in style to the Chip component, it integrates click, delete, and select events into one. Note: Click event and select event cannot coexist.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Can accept click and delete events", + "desc": [ + "【onPressed】: Click event 【Function()】", + "【onDeleted】: Delete event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Can accept select event", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onSelected】: Select event 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json new file mode 100644 index 00000000..bf5a73a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_es_ES.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrado", + "info": "Estilo similar al componente Chip, integra eventos de clic, eliminación y selección en uno. Nota: Los eventos de clic y selección no pueden coexistir.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Puede aceptar eventos de clic y eliminación", + "desc": [ + "【onPressed】: Evento de clic 【Function()】", + "【onDeleted】: Evento de eliminación 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Puede aceptar eventos de selección", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onSelected】: Evento de selección 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json new file mode 100644 index 00000000..f4ffd569 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_fr_FR.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Puce Intégrée", + "info": "Un style similaire au composant Chip, intégrant les événements de clic, de suppression et de sélection en un seul. Remarque : les événements de clic et de sélection ne peuvent pas coexister.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Peut accepter les événements de clic et de suppression", + "desc": [ + "【onPressed】: Événement de clic 【Function()】", + "【onDeleted】: Événement de suppression 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Peut accepter l'événement de sélection", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【onSelected】: Événement de sélection 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json new file mode 100644 index 00000000..dc95c4e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_it_IT.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrato", + "info": "Stile simile al componente Chip, integrato con eventi di clic, eliminazione e selezione. Nota: gli eventi di clic e selezione non possono coesistere.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Può accettare eventi di clic ed eliminazione", + "desc": [ + "【onPressed】: Evento di clic 【Function()】", + "【onDeleted】: Evento di eliminazione 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Può accettare eventi di selezione", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【onSelected】: Evento di selezione 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json new file mode 100644 index 00000000..31471526 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ja_JP.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "統合チップ", + "info": "Chipコンポーネントと同様のスタイルで、クリック、削除、選択イベントを統合しています。注意: クリックイベントと選択イベントは同時に存在できません。", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "クリック、削除イベントを受け取ることができます", + "desc": [ + "【onPressed】: クリックイベント 【Function()】", + "【onDeleted】: 削除イベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "選択イベントを受け取ることができます", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onSelected】: 選択イベント 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json new file mode 100644 index 00000000..63de89c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ko_KR.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "종합 칩", + "info": "Chip 컴포넌트와 유사한 스타일로, 클릭, 삭제, 선택 이벤트를 하나로 통합했습니다. 주의: 클릭 이벤트와 선택 이벤트는 동시에 존재할 수 없습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "클릭 및 삭제 이벤트를 수신할 수 있음", + "desc": [ + "【onPressed】: 클릭 이벤트 【Function()】", + "【onDeleted】: 삭제 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "선택 이벤트를 수신할 수 있음", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onSelected】: 선택 이벤트 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json new file mode 100644 index 00000000..41eaaf1b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_pt_PT.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Chip Integrado", + "info": "Estilo semelhante ao componente Chip, integra eventos de clique, exclusão e seleção em um só. Nota: os eventos de clique e seleção não podem coexistir.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Pode aceitar eventos de clique e exclusão", + "desc": [ + "【onPressed】: Evento de clique 【Function()】", + "【onDeleted】: Evento de exclusão 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Pode aceitar eventos de seleção", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【onSelected】: Evento de seleção 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json new file mode 100644 index 00000000..d1eb785c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/InputChip/desc_ru_RU.json @@ -0,0 +1,33 @@ +{ + "id": 14, + "name": "InputChip", + "localName": "Комплексный чип", + "info": "Стиль, похожий на компонент Chip, объединяет события нажатия, удаления и выбора в одном элементе. Обратите внимание: события нажатия и выбора не могут существовать одновременно.", + "lever": 4, + "family": 0, + "linkIds": [ + 11, + 12, + 13, + 15, + 153 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Может принимать события нажатия и удаления", + "desc": [ + "【onPressed】: Событие нажатия 【Function()】", + "【onDeleted】: Событие удаления 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Может принимать событие выбора", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onSelected】: Событие выбора 【Function(bool)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json new file mode 100644 index 00000000..483c5b99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_de_DE.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Listenkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, mit einer Struktur von links, Mitte und rechts. An den entsprechenden Positionen können Komponenten eingefügt werden, was es sehr einfach macht, bestimmte Einträge zu verarbeiten.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung von ListTile", + "desc": [ + "【leading】: Linke Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【contentPadding】: Innenabstand 【EdgeInsetsGeometry】", + "【onLongPress】: Klick-Ereignis 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahl-Effekt und Long-Press-Ereignis von ListTile", + "desc": [ + "【selected】: Ist ausgewählt 【bool】", + "【onTap】: Klick-Ereignis 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft von ListTile", + "desc": [ + "【dense】: Ist dicht 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json new file mode 100644 index 00000000..cb894918 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_en_US.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "List Tile", + "info": "A general list item structure provided by Flutter, which has a left-center-right structure. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic representation of ListTile is as follows", + "desc": [ + "【leading】: Left component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【trailing】: Trailing component 【Widget】", + "【contentPadding】: Inner padding 【EdgeInsetsGeometry】", + "【onLongPress】: Click event 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile selection effect and long press event", + "desc": [ + "【selected】: Whether selected 【bool】", + "【onTap】: Click event 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of ListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json new file mode 100644 index 00000000..4437361e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_es_ES.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Lista de fichas", + "info": "Una estructura de elementos de lista común proporcionada por Flutter, con una estructura de izquierda, centro y derecha. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La representación básica de ListTile es la siguiente", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【trailing】: Componente final 【Widget】", + "【contentPadding】: Relleno interno 【EdgeInsetsGeometry】", + "【onLongPress】: Evento de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección y evento de pulsación prolongada de ListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【onTap】: Evento de clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de disposición densa de ListTile", + "desc": [ + "【dense】: Si está en disposición densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json new file mode 100644 index 00000000..dccc7dea --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_fr_FR.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Tuile de liste", + "info": "Une structure d'élément de liste générique fournie par Flutter, avec une structure gauche-centre-droite. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des éléments spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de ListTile est la suivante", + "desc": [ + "【leading】: Composant de gauche 【Widget】", + "【title】: Composant du haut au centre 【Widget】", + "【subtitle】: Composant du bas au centre 【Widget】", + "【trailing】: Composant de fin 【Widget】", + "【contentPadding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onLongPress】: Événement de clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection et événement de pression longue de ListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【onTap】: Événement de clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de ListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json new file mode 100644 index 00000000..282eaca6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_it_IT.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Piastrella della lista", + "info": "Una struttura comune per gli elementi della lista fornita da Flutter, con una struttura sinistra-centro-destra. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile adattarsi a elementi specifici.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di ListTile è la seguente", + "desc": [ + "【leading】: Componente sinistro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【trailing】: Componente finale 【Widget】", + "【contentPadding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onLongPress】: Evento di clic 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione e evento di pressione prolungata di ListTile", + "desc": [ + "【selected】: Selezionato 【bool】", + "【onTap】: Evento di clic 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di disposizione compatta di ListTile", + "desc": [ + "【dense】: Disposizione compatta 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json new file mode 100644 index 00000000..86428b00 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ja_JP.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "リストタイル", + "info": "Flutterが提供する一般的なリスト項目構造で、左中右の構造を持っています。対応する位置にコンポーネントを挿入することができ、特定の項目に簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTileの基本的な表現は以下の通りです", + "desc": [ + "【leading】: 左側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【trailing】: 末尾のコンポーネント 【Widget】", + "【contentPadding】: 内側の余白 【EdgeInsetsGeometry】", + "【onLongPress】: クリックイベント 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTileの選択効果と長押しイベント", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【onTap】: クリックイベント 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json new file mode 100644 index 00000000..3b4aef74 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ko_KR.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "리스트 타일", + "info": "Flutter에서 제공하는 일반적인 리스트 항목 구조로, 왼쪽, 중앙, 오른쪽 구조를 가지고 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있으며, 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListTile의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【contentPadding】: 내부 여백 【EdgeInsetsGeometry】", + "【onLongPress】: 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "ListTile 선택 효과 및 길게 누르기 이벤트", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【onTap】: 클릭 이벤트 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "ListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json new file mode 100644 index 00000000..f73b46a7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_pt_PT.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Azulejo de Lista", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de esquerda, centro e direita. Componentes podem ser inseridos nas posições correspondentes, o que pode lidar facilmente com itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do ListTile é a seguinte", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【trailing】: Componente final 【Widget】", + "【contentPadding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onLongPress】: Evento de clique 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção e evento de pressionamento longo do ListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【onTap】: Evento de clique 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do ListTile", + "desc": [ + "【dense】: Se é denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json new file mode 100644 index 00000000..1ae22bb0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListTile/desc_ru_RU.json @@ -0,0 +1,41 @@ +{ + "id": 16, + "name": "ListTile", + "localName": "Список плиток", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет структуру слева, по центру и справа. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [ + 162, + 334 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление ListTile выглядит следующим образом", + "desc": [ + "【leading】: Левый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【contentPadding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onLongPress】: Событие нажатия 【Function()】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора и событие долгого нажатия ListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【onTap】: Событие нажатия 【Function()】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения ListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json new file mode 100644 index 00000000..0d813b29 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_de_DE.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Listenkomponente", + "info": "Führende Figur bei der Anzeige von Listen, die mehrere Unterkomponenten aufnehmen kann und über Builder, Separated, Custom usw. konstruiert werden kann. Verfügt über Eigenschaften wie Innenabstand, Umkehrung, Scroll-Controller usw.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von ListView", + "desc": [ + "【children】 : Liste der Unterkomponenten 【List】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Horizontales Scrollen mit ListView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Umgekehrtes Scrollen 【bool】", + "【shrinkWrap】 : Bei fehlenden Grenzen einwickeln 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder Konstruktion", + "desc": [ + "【itemCount】 : Anzahl der Elemente 【int】", + "【itemBuilder】 : Elementkonstruktor 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated Konstruktion", + "desc": [ + "【separatorBuilder】 : Elementkonstruktor 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json new file mode 100644 index 00000000..df175a34 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_en_US.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "List Component", + "info": "The leader in list display, accommodating multiple sub-components, can be constructed through builder, separated, custom, etc. It has properties such as padding, whether to reverse, scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of ListView", + "desc": [ + "【children】 : List of child components 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Horizontal Scrolling of ListView", + "desc": [ + "【scrollDirection】 : Scroll direction 【Axis】", + "【reverse】 : Whether to scroll in reverse 【bool】", + "【shrinkWrap】 : Whether to wrap when unbounded 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder Construction", + "desc": [ + "【itemCount】 : Number of items 【int】", + "【itemBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated Construction", + "desc": [ + "【separatorBuilder】 : Item builder 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json new file mode 100644 index 00000000..77fe43fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_es_ES.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente de lista", + "info": "El líder en la visualización de listas, capaz de contener múltiples componentes hijos, puede construirse mediante builder, separated, custom, etc. Tiene propiedades como el relleno interno, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de ListView", + "desc": [ + "【children】 : Lista de componentes hijos 【List】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Desplazamiento horizontal de ListView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si el desplazamiento es inverso 【bool】", + "【shrinkWrap】 : Si se envuelve cuando no hay límites 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construcción de ListView.builder", + "desc": [ + "【itemCount】 : Número de elementos 【int】", + "【itemBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construcción de ListView.separated", + "desc": [ + "【separatorBuilder】 : Constructor de elementos 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json new file mode 100644 index 00000000..c376522b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_fr_FR.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Composant de liste", + "info": "Le leader de l'affichage de listes, contenant plusieurs sous-composants, peut être construit via builder, separated, custom, etc. Possède des attributs tels que le padding, la direction inverse, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de ListView", + "desc": [ + "【children】 : Liste des sous-composants 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Défilement horizontal de ListView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Défilement inverse 【bool】", + "【shrinkWrap】 : Enveloppe sans limite 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construction de ListView.builder", + "desc": [ + "【itemCount】 : Nombre d'éléments 【int】", + "【itemBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construction de ListView.separated", + "desc": [ + "【separatorBuilder】 : Constructeur d'éléments 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json new file mode 100644 index 00000000..2e4d601a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_it_IT.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente Lista", + "info": "Leader nella visualizzazione delle liste, contiene più componenti figli, può essere costruito con builder, separated, custom, ecc. Ha proprietà come padding, reverse, controller di scorrimento, ecc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di ListView", + "desc": [ + "【children】 : Lista dei componenti figli 【List】", + "【padding】 : Padding interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scorrimento orizzontale di ListView", + "desc": [ + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【reverse】 : Scorrimento inverso 【bool】", + "【shrinkWrap】 : Avvolgere quando non ci sono confini 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Costruzione di ListView.builder", + "desc": [ + "【itemCount】 : Numero di elementi 【int】", + "【itemBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Costruzione di ListView.separated", + "desc": [ + "【separatorBuilder】 : Costruttore di elementi 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json new file mode 100644 index 00000000..6b1e00e9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ja_JP.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "リストコンポーネント", + "info": "リスト表示のリーダーであり、複数の子コンポーネントを収容し、builder、separated、customなどを介して構築できます。内側の余白、反転の有無、スクロールコントローラーなどの属性があります。", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListViewの基本使用", + "desc": [ + "【children】 : 子コンポーネントリスト 【List】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListViewの横方向スクロール", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 反転スクロールの有無 【bool】", + "【shrinkWrap】 : 境界がない場合にラップするかどうか 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builderの構築", + "desc": [ + "【itemCount】 : アイテムの数 【int】", + "【itemBuilder】 : アイテムビルダー 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separatedの構築", + "desc": [ + "【separatorBuilder】 : アイテムビルダー 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json new file mode 100644 index 00000000..3eea3377 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ko_KR.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "리스트 컴포넌트", + "info": "리스트 표시의 선두주자로, 여러 하위 컴포넌트를 수용할 수 있으며 builder, separated, custom 등을 통해 구성할 수 있습니다. 내부 여백, 반대 방향 여부, 스크롤 컨트롤러 등의 속성이 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ListView 기본 사용", + "desc": [ + "【children】 : 하위 컴포넌트 리스트 【List】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "ListView 가로 스크롤", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 스크롤 여부 【bool】", + "【shrinkWrap】 : 경계가 없을 때 감싸기 여부 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "ListView.builder 구성", + "desc": [ + "【itemCount】 : 항목 개수 【int】", + "【itemBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "ListView.separated 구성", + "desc": [ + "【separatorBuilder】 : 항목 빌더 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json new file mode 100644 index 00000000..695d7485 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_pt_PT.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Componente de Lista", + "info": "O líder na exibição de listas, acomoda vários subcomponentes, pode ser construído através de builder, separated, custom, etc. Possui atributos como padding, reversão, controlador de deslizamento, etc.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do ListView", + "desc": [ + "【children】 : Lista de subcomponentes 【List】", + "【padding】 : Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Deslizamento horizontal do ListView", + "desc": [ + "【scrollDirection】 : Direção de deslizamento 【Axis】", + "【reverse】 : Deslizamento reverso 【bool】", + "【shrinkWrap】 : Envolver quando sem limites 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Construção do ListView.builder", + "desc": [ + "【itemCount】 : Número de itens 【int】", + "【itemBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Construção do ListView.separated", + "desc": [ + "【separatorBuilder】 : Construtor de itens 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json new file mode 100644 index 00000000..5999aa8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ListView/desc_ru_RU.json @@ -0,0 +1,46 @@ +{ + "id": 162, + "name": "ListView", + "localName": "Компонент списка", + "info": "Лидер в отображении списков, вмещает несколько дочерних компонентов, может быть построен с помощью builder, separated, custom и других. Имеет такие свойства, как внутренние отступы, обратное направление, контроллер прокрутки и другие.", + "lever": 5, + "family": 0, + "linkIds": [ + 16, + 163 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование ListView", + "desc": [ + "【children】 : Список дочерних компонентов 【List】", + "【padding】 : Внутренние отступы 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Горизонтальная прокрутка ListView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление прокрутки 【bool】", + "【shrinkWrap】 : Обернуть ли при отсутствии границ 【bool】" + ] + }, + { + "file": "node3_builder.dart", + "name": "Конструкция ListView.builder", + "desc": [ + "【itemCount】 : Количество элементов 【int】", + "【itemBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + }, + { + "file": "node4_separated.dart", + "name": "Конструкция ListView.separated", + "desc": [ + "【separatorBuilder】 : Конструктор элементов 【IndexedWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json new file mode 100644 index 00000000..2ade155c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ereignis-Listener", + "info": "Der Listener für Komponentenereignisse kann Ereignisse wie Drücken, Loslassen, Bewegen, Abbrechen usw. akzeptieren. Im Vergleich zu GestureDetector ist es primitiver und kann mehr Informationen liefern.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Listener-Ereignisse", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onPointerDown】 : Drücken-Ereignis 【Function(PointerDownEvent)】", + "【onPointerMove】 : Bewegen-Ereignis 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Loslassen-Ereignis 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Abbrechen-Ereignis 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json new file mode 100644 index 00000000..143fa9e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Event Listener", + "info": "A listener for component events, which can accept events such as press, release, move, cancel, etc. It is more primitive compared to GestureDetector and can obtain more information.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Events of Listener", + "desc": [ + "【child】 : Child component 【Widget】", + "【onPointerDown】 : Press event 【Function(PointerDownEvent)】", + "【onPointerMove】 : Move event 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Release event 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Cancel event 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json new file mode 100644 index 00000000..a601b4c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Escuchador de eventos", + "info": "Escuchador de eventos de componentes, puede aceptar eventos como presionar, soltar, mover, cancelar, etc. Es más primitivo en comparación con GestureDetector y puede obtener más información.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos básicos de Listener", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onPointerDown】 : Evento de presionar 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento de mover 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento de soltar 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento de cancelar 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json new file mode 100644 index 00000000..9fc55937 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Écouteur d'événements", + "info": "Un écouteur d'événements pour les composants, capable de recevoir des événements tels que l'appui, le relâchement, le déplacement et l'annulation. Plus primitif que GestureDetector, il permet d'obtenir plus d'informations.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événements de base de Listener", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onPointerDown】 : Événement d'appui 【Function(PointerDownEvent)】", + "【onPointerMove】 : Événement de déplacement 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Événement de relâchement 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Événement d'annulation 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json new file mode 100644 index 00000000..727234e7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ascoltatore di eventi", + "info": "Un ascoltatore di eventi del componente, può accettare eventi come premere, rilasciare, muovere, annullare, ecc. Rispetto a GestureDetector è più primitivo e può ottenere più informazioni.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventi di base di Listener", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onPointerDown】 : Evento di pressione 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento di movimento 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento di rilascio 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento di annullamento 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json new file mode 100644 index 00000000..bed58802 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "イベントリスナー", + "info": "コンポーネントイベントのリスナーで、押下、離す、移動、キャンセルなどのイベントを受け取ることができます。GestureDetectorと比較して原始的で、より多くの情報を取得できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener基本イベント", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onPointerDown】 : 押下イベント 【Function(PointerDownEvent)】", + "【onPointerMove】 : 移動イベント 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 離すイベント 【Function(PointerUpEvent)】", + "【onPointerCancel】 : キャンセルイベント 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json new file mode 100644 index 00000000..51d4280f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "이벤트 리스너", + "info": "컴포넌트 이벤트의 리스너로, 누름, 놓음, 이동, 취소 등의 이벤트를 수신할 수 있습니다. GestureDetector보다 원시적이며, 더 많은 정보를 얻을 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listener 기본 이벤트", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【onPointerDown】 : 누름 이벤트 【Function(PointerDownEvent)】", + "【onPointerMove】 : 이동 이벤트 【Function(PointerMoveEvent)】", + "【onPointerMove】 : 놓음 이벤트 【Function(PointerUpEvent)】", + "【onPointerCancel】 : 취소 이벤트 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json new file mode 100644 index 00000000..9902d216 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Ouvinte de Eventos", + "info": "Ouvinte de eventos do componente, pode aceitar eventos como pressionar, soltar, mover, cancelar, etc. Comparado ao GestureDetector, é mais primitivo e pode obter mais informações.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Eventos Básicos do Listener", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onPointerDown】 : Evento de pressionar 【Function(PointerDownEvent)】", + "【onPointerMove】 : Evento de mover 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Evento de soltar 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Evento de cancelar 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json new file mode 100644 index 00000000..2a43cf61 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Listener/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 147, + "name": "Listener", + "localName": "Слушатель событий", + "info": "Слушатель событий компонента, который может принимать события нажатия, отпускания, перемещения, отмены и т.д. Более примитивен, чем GestureDetector, но предоставляет больше информации.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные события Listener", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onPointerDown】 : Событие нажатия 【Function(PointerDownEvent)】", + "【onPointerMove】 : Событие перемещения 【Function(PointerMoveEvent)】", + "【onPointerMove】 : Событие отпускания 【Function(PointerUpEvent)】", + "【onPointerCancel】 : Событие отмены 【Function(PointerUpEvent)】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json new file mode 100644 index 00000000..30fb3fcb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Banner-Komponente", + "info": "Materialstil Banner-Komponente, unterstützt links-mitte-rechts oder links-mitte-unten Struktur, kann Ränder, Hintergrundfarbe usw. angeben", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Verwendung von MaterialBanner in einer Zeile", + "desc": [ + "【content】 : Mittlere Komponente 【Widget】", + "【leading】: Linke Komponente 【Widget】", + "【actions】: Liste der rechten Komponenten 【List】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Ob die Schaltflächen unten sind 【bool】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Verwendung von MaterialBanner in zwei Zeilen", + "desc": [ + "【contentTextStyle】: Stil der mittleren Position 【TextStyle】", + "【leadingPadding】: Rand der linken Komponente 【EdgeInsetsGeometry】", + "Wenn die Anzahl der Endkomponenten größer als 1 ist, ist die Struktur der Komponente links-mitte-unten." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json new file mode 100644 index 00000000..ceb877a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Banner Component", + "info": "A Material-style banner component that supports left-center-right or left-center-bottom structures, and allows specifying margins, background colors, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Usage of MaterialBanner in a Single Line", + "desc": [ + "【content】: Middle component 【Widget】", + "【leading】: Left component 【Widget】", + "【actions】: List of right components 【List】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Whether buttons are below 【bool】", + "【backgroundColor】: Background color 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Usage of MaterialBanner in Two Lines", + "desc": [ + "【contentTextStyle】: Style for the middle position 【TextStyle】", + "【leadingPadding】: Padding for the left component 【EdgeInsetsGeometry】", + "When the number of trailing components is greater than 1, the component structure is left-center-bottom." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json new file mode 100644 index 00000000..e1743171 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente de banner", + "info": "Componente de banner de estilo Material, compatible con estructuras de izquierda, centro, derecha o izquierda, centro, abajo, y permite especificar márgenes, colores de fondo, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso de MaterialBanner en una fila", + "desc": [ + "【content】 : Componente central 【Widget】", + "【leading】: Componente izquierdo 【Widget】", + "【actions】: Lista de componentes derechos 【List】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Si los botones están abajo 【bool】", + "【backgroundColor】: Color de fondo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso de MaterialBanner en dos filas", + "desc": [ + "【contentTextStyle】: Estilo de la posición central 【TextStyle】", + "【leadingPadding】: Márgenes del componente izquierdo 【EdgeInsetsGeometry】", + "Cuando el número de componentes en la cola es mayor que 1, la estructura del componente es izquierda, centro, abajo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json new file mode 100644 index 00000000..5a3856d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Composant de bannière", + "info": "Composant de bannière de style Material, prenant en charge les structures gauche-centre-droite ou gauche-centre-bas, peut spécifier les marges, la couleur de fond, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Utilisation d'une ligne de MaterialBanner", + "desc": [ + "【content】 : Composant central 【Widget】", + "【leading】: Composant gauche 【Widget】", + "【actions】: Liste des composants droits 【List】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Si les boutons sont en bas 【bool】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Utilisation de deux lignes de MaterialBanner", + "desc": [ + "【contentTextStyle】: Style de la position centrale 【TextStyle】", + "【leadingPadding】: Marge du composant gauche 【EdgeInsetsGeometry】", + "Lorsque le nombre de composants de fin est supérieur à 1, la structure du composant est gauche-centre-bas." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json new file mode 100644 index 00000000..905bb35a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente Banner", + "info": "Componente banner in stile Material, supporta strutture sinistra-centro-destra o sinistra-centro-basso, può specificare margini, colore di sfondo, ecc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso di MaterialBanner su una riga", + "desc": [ + "【content】 : Componente centrale 【Widget】", + "【leading】: Componente sinistro 【Widget】", + "【actions】: Lista dei componenti destri 【List】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Se i pulsanti sono in basso 【bool】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso di MaterialBanner su due righe", + "desc": [ + "【contentTextStyle】: Stile della posizione centrale 【TextStyle】", + "【leadingPadding】: Margine del componente sinistro 【EdgeInsetsGeometry】", + "Quando il numero di componenti di coda è maggiore di 1, la struttura del componente è sinistra-centro-basso." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json new file mode 100644 index 00000000..6757a59d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "バナーコンポーネント", + "info": "Materialスタイルのバナーコンポーネントで、左中右または左中下の構造をサポートし、余白や背景色などを指定できます", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner一行の使用", + "desc": [ + "【content】 : 中間コンポーネント 【Widget】", + "【leading】: 左側コンポーネント 【Widget】", + "【actions】: 右側コンポーネントリスト 【List】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【forceActionsBelow】: ボタンを下に配置するかどうか 【bool】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner二行の使用", + "desc": [ + "【contentTextStyle】: 中間位置のスタイル 【TextStyle】", + "【leadingPadding】: 左側コンポーネントの余白 【EdgeInsetsGeometry】", + "末尾のコンポーネント数が1より多い場合、このコンポーネントの構造は左中下になります。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json new file mode 100644 index 00000000..8451bdd4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "배너 컴포넌트", + "info": "Material 스타일의 배너 컴포넌트, 좌중우 또는 좌중하 구조를 지원하며, 여백 및 배경색 등을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "MaterialBanner 한 줄 사용", + "desc": [ + "【content】 : 중간 컴포넌트 【Widget】", + "【leading】: 왼쪽 컴포넌트 【Widget】", + "【actions】: 오른쪽 컴포넌트 리스트 【List】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【forceActionsBelow】: 버튼이 아래에 있는지 여부 【bool】", + "【backgroundColor】: 배경색 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "MaterialBanner 두 줄 사용", + "desc": [ + "【contentTextStyle】: 중간 위치 스타일 【TextStyle】", + "【leadingPadding】: 왼쪽 컴포넌트 여백 【EdgeInsetsGeometry】", + "꼬리 컴포넌트 수가 1보다 크면, 이 컴포넌트 구조는 좌중하입니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json new file mode 100644 index 00000000..6875665c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Componente de Banner", + "info": "Componente de banner no estilo Material, suporta estruturas esquerda-centro-direita ou esquerda-centro-abaixo, pode especificar margens, cor de fundo, etc.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Uso de uma linha do MaterialBanner", + "desc": [ + "【content】: Componente do meio 【Widget】", + "【leading】: Componente esquerdo 【Widget】", + "【actions】: Lista de componentes direitos 【List】", + "【padding】: Margem interna 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Se os botões estão abaixo 【bool】", + "【backgroundColor】: Cor de fundo 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Uso de duas linhas do MaterialBanner", + "desc": [ + "【contentTextStyle】: Estilo da posição central 【TextStyle】", + "【leadingPadding】: Margem do componente esquerdo 【EdgeInsetsGeometry】", + "Quando o número de componentes finais é maior que 1, a estrutura do componente é esquerda-centro-abaixo." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json new file mode 100644 index 00000000..9c6300b4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialBanner/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 211, + "name": "MaterialBanner", + "localName": "Компонент баннера", + "info": "Компонент баннера в стиле Material, поддерживает структуру слева-в центре-справа или слева-в центре-снизу, можно указать отступы, цвет фона и т.д.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_one_btn.dart", + "name": "Использование MaterialBanner в одну строку", + "desc": [ + "【content】 : Центральный компонент 【Widget】", + "【leading】: Левый компонент 【Widget】", + "【actions】: Список правых компонентов 【List】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【forceActionsBelow】: Кнопки внизу 【bool】", + "【backgroundColor】: Цвет фона 【Color】" + ] + }, + { + "file": "node2_two_btn.dart", + "name": "Использование MaterialBanner в две строки", + "desc": [ + "【contentTextStyle】: Стиль центральной позиции 【TextStyle】", + "【leadingPadding】: Отступ левого компонента 【EdgeInsetsGeometry】", + "Когда количество конечных компонентов больше 1, структура компонента становится слева-в центре-снизу." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json new file mode 100644 index 00000000..01da8b87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_de_DE.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Material-Schaltfläche", + "info": "Eine allgemeine Material-Schaltfläche, die auf RawMaterialButton basiert. Kann ein Unterelement enthalten, kann Farbe, Form usw. definieren und kann Klick- und Long-Press-Ereignisse empfangen.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton Klick-Ereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【height】: Höhe 【double】", + "【elevation】: Schattentiefe 【double】", + "【child】: Unterelement 【Widget】", + "【textColor】: Textfarbe des Unterelements 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klick-Ereignis 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton Long-Press-Ereignis", + "desc": [ + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【onLongPress】: Long-Press-Ereignis 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Benutzerdefinierte Form der MaterialButton", + "desc": [ + "【shape】: Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json new file mode 100644 index 00000000..b9c3470e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_en_US.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Material Button", + "info": "A general Material button implemented based on RawMaterialButton. It can contain a child component, define colors, shapes, etc., and can receive click and long press events.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Ripple Color 【Color】", + "【height】: Height 【double】", + "【elevation】: Elevation 【double】", + "【child】: Child Component 【Widget】", + "【textColor】: Child Component Text Color 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton Long Press Event", + "desc": [ + "【highlightColor】: Long Press Highlight Color 【Color】", + "【onLongPress】: Long Press Event 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton Custom Shape", + "desc": [ + "【shape】: Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json new file mode 100644 index 00000000..afd5833a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_es_ES.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Botón de Material", + "info": "Botón de Material genérico implementado basado en RawMaterialButton. Puede contener un componente hijo, puede definir colores, formas, etc., y puede recibir eventos de clic y pulsación prolongada.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de MaterialButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de efecto de ondas 【Color】", + "【height】: Altura 【double】", + "【elevation】: Profundidad de sombra 【double】", + "【child】: Componente hijo 【Widget】", + "【textColor】: Color del texto del componente hijo 【Color】", + "【highlightColor】: Color de resaltado al pulsar prolongadamente 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento de pulsación prolongada de MaterialButton", + "desc": [ + "【highlightColor】: Color de resaltado al pulsar prolongadamente 【Color】", + "【onLongPress】: Evento de pulsación prolongada 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizada de MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json new file mode 100644 index 00000000..3f348033 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_fr_FR.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Bouton Matériel", + "info": "Bouton Matériel générique basé sur RawMaterialButton. Peut contenir un composant enfant, peut définir des couleurs, des formes, etc., et peut recevoir des événements de clic et de pression longue.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic de MaterialButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【height】: Hauteur 【double】", + "【elevation】: Profondeur de l'ombre 【double】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'une pression longue 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Événement de pression longue de MaterialButton", + "desc": [ + "【highlightColor】: Couleur de surbrillance lors d'une pression longue 【Color】", + "【onLongPress】: Événement de pression longue 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forme personnalisée de MaterialButton", + "desc": [ + "【shape】: Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json new file mode 100644 index 00000000..59809688 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_it_IT.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Pulsante Material", + "info": "Un pulsante Material generico implementato sulla base di RawMaterialButton. Può contenere un componente figlio, può definire colori, forme e altre rappresentazioni, e può ricevere eventi di clic e pressione prolungata.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di MaterialButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore dell'effetto a increspatura 【Color】", + "【height】: Altezza 【double】", + "【elevation】: Profondità dell'ombra 【double】", + "【child】: Componente figlio 【Widget】", + "【textColor】: Colore del testo del componente figlio 【Color】", + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento di clic 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento di pressione prolungata di MaterialButton", + "desc": [ + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【onLongPress】: Evento di pressione prolungata 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizzata di MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json new file mode 100644 index 00000000..2ced6186 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ja_JP.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "マテリアルボタン", + "info": "RawMaterialButtonをベースにした汎用Materialボタンです。子コンポーネントを保持でき、色や形状などの表現を定義でき、クリックや長押しイベントを受け取ることができます。", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋色 【Color】", + "【height】: 高さ 【double】", + "【elevation】: 影の深さ 【double】", + "【child】: 子コンポーネント 【Widget】", + "【textColor】: 子コンポーネントのテキスト色 【Color】", + "【highlightColor】: 長押しハイライト色 【Color】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton長押しイベント", + "desc": [ + "【highlightColor】: 長押しハイライト色 【Color】", + "【onLongPress】: 長押しイベント 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButtonのカスタム形状", + "desc": [ + "【shape】: 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json new file mode 100644 index 00000000..a2ea2918 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ko_KR.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "재료 버튼", + "info": "RawMaterialButton를 기반으로 구현된 일반 Material 버튼입니다. 하나의 자식 위젯을 포함할 수 있으며, 색상, 모양 등을 정의할 수 있고, 클릭 및 길게 누르기 이벤트를 받을 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "MaterialButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【height】: 높이 【double】", + "【elevation】: 그림자 깊이 【double】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "MaterialButton 길게 누르기 이벤트", + "desc": [ + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【onLongPress】: 길게 누르기 이벤트 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "MaterialButton의 사용자 정의 모양", + "desc": [ + "【shape】: 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json new file mode 100644 index 00000000..b6784cc2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_pt_PT.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Botão de Material", + "info": "Botão Material genérico implementado com base no RawMaterialButton. Pode conter um componente filho, permite definir cor, forma e outras aparências, e pode receber eventos de clique e pressão longa.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clique do MaterialButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【height】: Altura 【double】", + "【elevation】: Profundidade da sombra 【double】", + "【child】: Componente filho 【Widget】", + "【textColor】: Cor do texto do componente filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Evento de pressão longa do MaterialButton", + "desc": [ + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【onLongPress】: Evento de pressão longa 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Forma personalizada do MaterialButton", + "desc": [ + "【shape】: Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json new file mode 100644 index 00000000..de0df3d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/MaterialButton/desc_ru_RU.json @@ -0,0 +1,47 @@ +{ + "id": 23, + "name": "MaterialButton", + "localName": "Материальная кнопка", + "info": "Универсальная Material кнопка, реализованная на основе RawMaterialButton. Может содержать дочерний компонент, позволяет определять цвет, форму и другие характеристики, может принимать события нажатия и длительного нажатия.", + "lever": 4, + "family": 0, + "linkIds": [ + 25, + 26, + 27, + 326, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия MaterialButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвет водяного эффекта 【Color】", + "【height】: Высота 【double】", + "【elevation】: Глубина тени 【double】", + "【child】: Дочерний компонент 【Widget】", + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】" + ] + }, + { + "file": "node2_onLongPress.dart", + "name": "Событие длительного нажатия MaterialButton", + "desc": [ + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【onLongPress】: Событие длительного нажатия 【Function】" + ] + }, + { + "file": "node3_shape.dart", + "name": "Пользовательская форма MaterialButton", + "desc": [ + "【shape】: Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json new file mode 100644 index 00000000..68f51a75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barriere Modul", + "info": "Entspricht einer Vorhangschicht, die verhindert, dass der Benutzer mit den dahinter liegenden Widgets interagiert. Es kann durch dismissible festgelegt werden, ob beim Klicken der Rückgabestapel ausgelöst wird. Im Quellcode wird es für Dialog-bezogene Komponenten verwendet.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier Einführung", + "desc": [ + "【dismissible】 : Klicken, um zurückzukehren 【bool】", + "【color】 : Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json new file mode 100644 index 00000000..2a27ad7a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Modal Barrier", + "info": "Equivalent to a curtain layer, preventing users from interacting with the Widget behind it. It can be determined by dismissible whether to trigger the back stack when clicked. Used in the source code for Dialog related components.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ModalBarrier", + "desc": [ + "【dismissible】: Whether to return when clicked 【bool】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json new file mode 100644 index 00000000..9756ab1d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barrera Modal", + "info": "Equivale a una capa de cortina que evita que el usuario interactúe con los Widgets detrás de ella. Se puede decidir si se activa la pila de retorno al hacer clic a través de dismissible. En el código fuente, se utiliza para componentes relacionados con Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ModalBarrier", + "desc": [ + "【dismissible】: Si se retorna al hacer clic 【bool】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json new file mode 100644 index 00000000..c81a6a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barrière modale", + "info": "Équivaut à une couche de rideau, empêchant l'utilisateur d'interagir avec les Widgets derrière. Peut être configuré pour déclencher ou non la pile de retour lors d'un clic via dismissible. Utilisé dans les composants liés à Dialog dans le code source.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ModalBarrier", + "desc": [ + "【dismissible】 : Retour au clic 【bool】", + "【color】 : Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json new file mode 100644 index 00000000..e6ffe765 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barriera Modale", + "info": "Equivale a uno strato di tenda che impedisce all'utente di interagire con i widget dietro di esso. È possibile decidere se attivare lo stack di ritorno al clic tramite dismissible. Nel codice sorgente è utilizzato per i componenti relativi a Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ModalBarrier", + "desc": [ + "【dismissible】 : Ritorna al clic 【bool】", + "【color】 : Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json new file mode 100644 index 00000000..9993ed79 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "バリアモード", + "info": "これは一種のカーテン層に相当し、ユーザーがその背後にあるウィジェットとやり取りするのを防ぎます。dismissibleを介して、クリック時に戻るスタックをトリガーするかどうかを決定できます。ソースコードではDialog関連のコンポーネントに使用されています。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 紹介", + "desc": [ + "【dismissible】 : クリック時に戻るかどうか 【bool】", + "【color】 : 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json new file mode 100644 index 00000000..1ee2365e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "배리어 모드", + "info": "막대기와 같은 역할을 하며, 사용자가 뒤에 있는 위젯과 상호 작용하지 못하도록 합니다. dismissible을 통해 클릭 시 반환 스택을 트리거할지 여부를 결정할 수 있습니다. 소스 코드에서는 Dialog 관련 컴포넌트에 사용됩니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ModalBarrier 소개", + "desc": [ + "【dismissible】 : 클릭 시 반환 여부 【bool】", + "【color】 : 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json new file mode 100644 index 00000000..42c896a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Barreira Modal", + "info": "Equivale a uma camada de cortina, impedindo que o usuário interaja com os Widgets por trás dela. Pode ser decidido através de dismissible se, ao clicar, deve-se acionar a pilha de retorno. No código-fonte, é usado para componentes relacionados ao Dialog.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ModalBarrier", + "desc": [ + "【dismissible】 : Clicar retorna 【bool】", + "【color】 : Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json new file mode 100644 index 00000000..3102cc56 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ModalBarrier/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 212, + "name": "ModalBarrier", + "localName": "Барьер", + "info": "Эквивалентно слою занавеса, который предотвращает взаимодействие пользователя с виджетами за ним. Можно определить, будет ли нажатие вызывать возврат в стек, с помощью dismissible. В исходном коде используется для компонентов, связанных с диалогами.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ModalBarrier", + "desc": [ + "【dismissible】 : Возврат при нажатии 【bool】", + "【color】 : Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json new file mode 100644 index 00000000..3cc6538b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Navigationsleiste", + "info": "Allgemeine Strukturkomponente mit links, mittig und rechts Modus, kann den Abstand der mittleren Komponente zum linken Rand und ob sie zentriert ist, festlegen. Der Quellcode wird in Strukturen wie der AppBar verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung der NavigationToolbar", + "desc": [ + "【leading】 : Linke Komponente 【Widget】", + "【middle】: Mittlere Komponente 【Widget】", + "【trailing】: Rechte Komponente 【Widget】", + "【centerMiddle】: Ob die mittlere Komponente zentriert ist 【bool】", + "【middleSpacing】: Abstand der mittleren Komponente zum linken Rand 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json new file mode 100644 index 00000000..b6475225 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Navigation Toolbar", + "info": "A general structural component with left-center-right mode, which can specify the left margin of the middle component and whether it is centered. The source code is used in the structure of navigation bars such as AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of NavigationToolbar", + "desc": [ + "【leading】: Left component 【Widget】", + "【middle】: Middle component 【Widget】", + "【trailing】: Right component 【Widget】", + "【centerMiddle】: Whether the middle component is centered 【bool】", + "【middleSpacing】: Distance of the middle component from the left 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json new file mode 100644 index 00000000..d168fd87 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra de herramientas de navegación", + "info": "Componente de estructura común en modo izquierdo, central y derecho, se puede especificar el margen izquierdo del componente central y si está centrado. El código fuente lo utiliza en estructuras de barras de navegación como AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de NavigationToolbar", + "desc": [ + "【leading】: Componente izquierdo 【Widget】", + "【middle】: Componente central 【Widget】", + "【trailing】: Componente derecho 【Widget】", + "【centerMiddle】: Si el componente central está centrado 【bool】", + "【middleSpacing】: Distancia del componente central al margen izquierdo 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json new file mode 100644 index 00000000..ef615c10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barre d'outils de navigation", + "info": "Un composant structurel universel avec un modèle gauche-centre-droit, qui permet de spécifier la marge gauche du composant central et s'il est centré. Le code source est utilisé dans des structures de barres de navigation comme AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de NavigationToolbar", + "desc": [ + "【leading】 : Composant gauche 【Widget】", + "【middle】: Composant central 【Widget】", + "【trailing】: Composant droit 【Widget】", + "【centerMiddle】: Si le composant central est centré 【bool】", + "【middleSpacing】: Distance du composant central par rapport à la gauche 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json new file mode 100644 index 00000000..378c4499 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra degli strumenti di navigazione", + "info": "Componente strutturale generico con modalità sinistra, centrale e destra, può specificare la distanza del componente centrale dal margine sinistro e se è centrato. Il codice sorgente viene utilizzato in strutture come AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di NavigationToolbar", + "desc": [ + "【leading】 : Componente sinistro 【Widget】", + "【middle】: Componente centrale 【Widget】", + "【trailing】: Componente destro 【Widget】", + "【centerMiddle】: Se il componente centrale è centrato 【bool】", + "【middleSpacing】: Distanza del componente centrale dal lato sinistro 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json new file mode 100644 index 00000000..ce590eda --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "ナビゲーションツールバー", + "info": "左中右モードの汎用構造コンポーネントで、中央コンポーネントの左側のマージンと中央揃えかどうかを指定できます。ソースコードはAppBarなどのナビゲーションバー構造で使用されています。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbarの基本的な使用", + "desc": [ + "【leading】 : 左側コンポーネント 【Widget】", + "【middle】: 中央コンポーネント 【Widget】", + "【trailing】: 右側コンポーネント 【Widget】", + "【centerMiddle】: 中央コンポーネントを中央揃えにするかどうか 【bool】", + "【middleSpacing】: 中央コンポーネントの左側からの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json new file mode 100644 index 00000000..4c9cd245 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "네비게이션 툴바", + "info": "좌중우 모드의 일반 구조 컴포넌트로, 중간 컴포넌트의 왼쪽 여백 및 중앙 정렬 여부를 지정할 수 있습니다. 소스 코드는 AppBar 등 네비게이션 바 구조에서 이를 사용합니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "NavigationToolbar 기본 사용", + "desc": [ + "【leading】 : 왼쪽 컴포넌트 【Widget】", + "【middle】: 중간 컴포넌트 【Widget】", + "【trailing】: 오른쪽 컴포넌트 【Widget】", + "【centerMiddle】: 중간 컴포넌트 중앙 정렬 여부 【bool】", + "【middleSpacing】: 중간 컴포넌트의 왼쪽 여백 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json new file mode 100644 index 00000000..8dec55ca --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Barra de Ferramentas de Navegação", + "info": "Componente estrutural genérico no modo esquerdo-central-direito, pode especificar a margem esquerda do componente central e se está centralizado. O código-fonte é usado em estruturas de barras de navegação como AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do NavigationToolbar", + "desc": [ + "【leading】: Componente esquerdo 【Widget】", + "【middle】: Componente central 【Widget】", + "【trailing】: Componente direito 【Widget】", + "【centerMiddle】: Se o componente central está centralizado 【bool】", + "【middleSpacing】: Distância do componente central à esquerda 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json new file mode 100644 index 00000000..8a398841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NavigationToolbar/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 214, + "name": "NavigationToolbar", + "localName": "Панель навигации", + "info": "Универсальный структурный компонент с левым, центральным и правым режимами, можно указать отступ центрального компонента от левого края и выравнивание по центру. Исходный код используется в структурах навигационных панелей, таких как AppBar.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование NavigationToolbar", + "desc": [ + "【leading】 : Левый компонент 【Widget】", + "【middle】: Центральный компонент 【Widget】", + "【trailing】: Правый компонент 【Widget】", + "【centerMiddle】: Выравнивание центрального компонента по центру 【bool】", + "【middleSpacing】: Расстояние центрального компонента от левого края 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json new file mode 100644 index 00000000..7ed6f083 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Benachrichtigungs-Listener", + "info": "Sie können den generischen Typ T von Notification angeben, um Änderungen dieses Typs zu überwachen. Flutter bietet viele integrierte Benachrichtigungen für das Scrollen, aber Sie können auch benutzerdefinierte Benachrichtigungen erstellen und überwachen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Überwachung von OverscrollIndicatorNotification", + "desc": [ + "Diese Benachrichtigung wird nur dann zurückgerufen, wenn bis zum obersten oder untersten Rand gescrollt wird. Die Eigenschaft 'leading' bestimmt, ob es sich um den oberen oder unteren Rand handelt. Darüber hinaus kann die blaue Schattierung beim Scrollen am oberen und unteren Rand durch notification#disallowGlow() entfernt werden." + ] + }, + { + "file": "node2_update.dart", + "name": "Überwachung von ScrollUpdateNotification", + "desc": [ + "Während des Scrollvorgangs werden die Scroll-Daten zurückgerufen, sodass Sie eine Vielzahl von Daten für Operationen erhalten können." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json new file mode 100644 index 00000000..798e2267 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Notification Listener", + "info": "You can specify the sub-generic type T of Notification to listen for changes of that type. Flutter has many built-in sliding Notifications, and of course, you can also customize Notifications for listening.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Listen to OverscrollIndicatorNotification", + "desc": [ + "This notification is called back when sliding to the top and bottom, and it is judged whether it is the top or bottom by the leading property. In addition, you can remove the blue shadow at the top and bottom sliding through notification#disallowGlow()." + ] + }, + { + "file": "node2_update.dart", + "name": "Listen to ScrollUpdateNotification", + "desc": [ + "During the sliding process, the sliding data is called back, and you can obtain a large amount of data to operate." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json new file mode 100644 index 00000000..f70e983b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Escuchador de notificaciones", + "info": "Puede especificar el subgenérico T de Notification para escuchar cambios en ese tipo. Flutter tiene muchas notificaciones de desplazamiento integradas, por supuesto, también puedes personalizar las notificaciones para escucharlas.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Escuchar OverscrollIndicatorNotification", + "desc": [ + "Esta notificación se devuelve de llamada después de deslizarse hasta la parte superior e inferior, y se juzga si es la parte superior o la inferior a través de la propiedad leading. Además, a través de notification#disallowGlow(), se puede eliminar la sombra azul de deslizamiento superior e inferior." + ] + }, + { + "file": "node2_update.dart", + "name": "Escuchar ScrollUpdateNotification", + "desc": [ + "Durante el proceso de desplazamiento, se devuelven los datos de desplazamiento, y puedes obtener una gran cantidad de datos para operar." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json new file mode 100644 index 00000000..8ae278a8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Écouteur de notifications", + "info": "Vous pouvez spécifier le sous-générique T de Notification pour écouter les changements de ce type. Flutter intègre de nombreuses notifications de défilement, bien sûr, vous pouvez également personnaliser les notifications pour les écouter.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Écouter OverscrollIndicatorNotification", + "desc": [ + "Cette notification est rappelée uniquement lors du défilement vers le haut ou le bas, en utilisant la propriété leading pour déterminer si c'est le haut ou le bas. De plus, en utilisant notification#disallowGlow(), vous pouvez supprimer l'ombre bleue du défilement en haut et en bas." + ] + }, + { + "file": "node2_update.dart", + "name": "Écouter ScrollUpdateNotification", + "desc": [ + "Pendant le défilement, les données de défilement sont rappelées, vous pouvez obtenir de nombreuses données pour les manipuler." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json new file mode 100644 index 00000000..a9a7e5c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Ascoltatore di Notifiche", + "info": "È possibile specificare il sottotipo generico T di Notification per monitorare i cambiamenti di quel tipo. Flutter include molte notifiche di scorrimento integrate, ma puoi anche creare e monitorare notifiche personalizzate.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Monitorare OverscrollIndicatorNotification", + "desc": [ + "Questa notifica viene richiamata solo quando si scorre fino in cima o in fondo, e si può determinare se si tratta della cima o del fondo tramite la proprietà leading. Inoltre, è possibile rimuovere l'ombra blu dello scorrimento in cima e in fondo utilizzando notification#disallowGlow()." + ] + }, + { + "file": "node2_update.dart", + "name": "Monitorare ScrollUpdateNotification", + "desc": [ + "Durante lo scorrimento, i dati di scorrimento vengono richiamati, permettendoti di ottenere molti dati per operazioni successive." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json new file mode 100644 index 00000000..24341936 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "通知リスナー", + "info": "NotificationのサブジェネリックTを指定して、そのタイプの変更を監視できます。Flutterには多くのスライドNotificationが組み込まれており、もちろん独自のNotificationを監視することもできます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverscrollIndicatorNotificationを監視", + "desc": [ + "この通知は、最上部または最下部にスライドしたときにコールバックされ、leadingプロパティを使用して上部か下部かを判断します。また、notification#disallowGlow()を使用して、上部と下部のスライド時の青色の影を取り除くことができます。" + ] + }, + { + "file": "node2_update.dart", + "name": "ScrollUpdateNotificationを監視", + "desc": [ + "スライド中にスライドデータをコールバックし、大量のデータを取得して操作することができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json new file mode 100644 index 00000000..e514456f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "알림 리스너", + "info": "Notification의 하위 제네릭 T를 지정하여 해당 유형의 변경 사항을 감지할 수 있습니다. Flutter에는 많은 스크롤 Notification이 내장되어 있으며, 물론 사용자 정의 Notification을 감지할 수도 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OverscrollIndicatorNotification 감지", + "desc": [ + "이 알림은 스크롤이 가장 위나 가장 아래에 도달했을 때 콜백되며, leading 속성을 통해 상단인지 하단인지 판단할 수 있습니다. 또한 notification#disallowGlow()를 통해 상하단 스크롤 시 파란색 그림자를 제거할 수 있습니다." + ] + }, + { + "file": "node2_update.dart", + "name": "ScrollUpdateNotification 감지", + "desc": [ + "스크롤 과정에서 스크롤 데이터를 콜백하며, 이를 통해 많은 데이터를 얻어 작업할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json new file mode 100644 index 00000000..debe830e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Ouvinte de Notificação", + "info": "Pode especificar o subgenérico T de Notification para monitorar alterações desse tipo. O Flutter possui muitas Notificações de deslizamento integradas, mas você também pode criar e monitorar suas próprias Notificações personalizadas.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Monitorar OverscrollIndicatorNotification", + "desc": [ + "Esta notificação é chamada de volta apenas quando o deslizamento atinge o topo ou o fundo, e o atributo leading determina se é o topo ou o fundo. Além disso, através de notification#disallowGlow(), é possível remover a sombra azul do deslizamento no topo e no fundo." + ] + }, + { + "file": "node2_update.dart", + "name": "Monitorar ScrollUpdateNotification", + "desc": [ + "Durante o processo de deslizamento, os dados de deslizamento são chamados de volta, permitindo que você obtenha uma grande quantidade de dados para operações." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json new file mode 100644 index 00000000..25132315 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/NotificationListener/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 220, + "name": "NotificationListener", + "localName": "Слушатель уведомлений", + "info": "Можно указать подтип T для Notification, чтобы отслеживать изменения этого типа. В Flutter встроено множество уведомлений о прокрутке, конечно, вы также можете настроить свои собственные уведомления для отслеживания.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Отслеживание OverscrollIndicatorNotification", + "desc": [ + "Это уведомление вызывается только при прокрутке до самого верха или низа, и можно определить, верх это или низ, с помощью свойства leading. Кроме того, с помощью notification#disallowGlow() можно убрать синюю тень при прокрутке вверху и внизу." + ] + }, + { + "file": "node2_update.dart", + "name": "Отслеживание ScrollUpdateNotification", + "desc": [ + "В процессе прокрутки данные о прокрутке передаются обратно, и вы можете получить множество данных для работы." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json new file mode 100644 index 00000000..a5091791 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_de_DE.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Ausrichtungs-Builder", + "info": "Kann zurückmelden, ob das übergeordnete Element horizontal oder vertikal ist, und kann darauf basierend verschiedene untergeordnete Elemente erstellen.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von OrientationBuilder", + "desc": [ + "【builder】 : Ausrichtungskomponenten-Builder 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json new file mode 100644 index 00000000..77d4311f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_en_US.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Orientation Builder", + "info": "Can callback whether the parent component is horizontal or vertical, and can build different child components based on this.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of OrientationBuilder", + "desc": [ + "【builder】: Orientation component builder 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json new file mode 100644 index 00000000..79d4f460 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_es_ES.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Constructor de Orientación", + "info": "Puede devolver una llamada para determinar si el componente padre es horizontal o vertical, y puede construir diferentes componentes secundarios en consecuencia.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de OrientationBuilder", + "desc": [ + "【builder】: Constructor de componentes de orientación 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json new file mode 100644 index 00000000..b026d882 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_fr_FR.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Constructeur d'orientation", + "info": "Capable de rappeler si le composant parent est horizontal ou vertical, et peut construire différents composants enfants en conséquence.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base d'OrientationBuilder", + "desc": [ + "【builder】 : Constructeur de composant d'orientation 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json new file mode 100644 index 00000000..3ee33c71 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_it_IT.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Costruttore di Orientamento", + "info": "Può richiamare se il componente genitore è orizzontale o verticale, e può costruire diversi componenti figli in base a ciò.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di OrientationBuilder", + "desc": [ + "【builder】 : Costruttore del componente di orientamento 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json new file mode 100644 index 00000000..51eafbef --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ja_JP.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "方向ビルダー", + "info": "親コンポーネントが横向きか縦向きかをコールバックでき、それに応じて異なる子コンポーネントを構築できます。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilderの基本的な使用", + "desc": [ + "【builder】 : 方向コンポーネントビルダー 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json new file mode 100644 index 00000000..acd5e42f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ko_KR.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "방향 빌더", + "info": "부모 구성 요소가 가로 방향인지 세로 방향인지 콜백할 수 있으며, 이를 기반으로 다른 자식 구성 요소를 구축할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OrientationBuilder 기본 사용", + "desc": [ + "【builder】 : 방향 구성 요소 빌더 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json new file mode 100644 index 00000000..db124afa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_pt_PT.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Construtor de Orientação", + "info": "Pode retornar se o componente pai é horizontal ou vertical, e pode construir diferentes componentes filhos com base nisso.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do OrientationBuilder", + "desc": [ + "【builder】 : Construtor de componentes de orientação 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json new file mode 100644 index 00000000..060e68fe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OrientationBuilder/desc_ru_RU.json @@ -0,0 +1,18 @@ +{ + "id": 203, + "name": "OrientationBuilder", + "localName": "Ориентация строителя", + "info": "Может обратно вызывать, является ли родительский компонент горизонтальным или вертикальным, и может создавать различные дочерние компоненты на основе этого.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование OrientationBuilder", + "desc": [ + "【builder】 : Строитель компонента ориентации 【OrientationWidgetBuilder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json new file mode 100644 index 00000000..5b472ff8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_de_DE.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Umriss-Schaltfläche", + "info": "Schaltfläche mit Rahmenstil, basierend auf MaterialButton implementiert, alle Eigenschaften ähnlich wie MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton Klickereignis", + "desc": [ + "【textColor】: Textfarbe der Unterkomponente 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【highlightedBorderColor】: Rahmenfarbe bei Hervorhebung 【Color】", + "【child】: Unterkomponente 【Widget】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【borderSide】: Randlinie 【BorderSide】", + "【onPressed】: Klickereignis 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Die OutlineButton-Schaltfläche hat die Bühne in Flutter 3.0 verlassen. Der Ersatz ist die OutlinedButton-Schaltfläche.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Umriss-Schaltfläche", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json new file mode 100644 index 00000000..d8fffcfb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_en_US.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Outline Button", + "info": "A button with a border style, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton Click Event", + "desc": [ + "【textColor】: Text color of child component 【Color】", + "【splashColor】: Ripple color 【Color】", + "【highlightColor】: Long press highlight color 【Color】", + "【highlightedBorderColor】: Border color when highlighted 【Color】", + "【child】: Child component 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【borderSide】: Border side 【BorderSide】", + "【onPressed】: Click event 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'The OutlineButton has been phased out in Flutter 3.0. It is replaced by the OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json new file mode 100644 index 00000000..48c34e9a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_es_ES.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Botón de contorno", + "info": "Botón con estilo de borde, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de OutlineButton", + "desc": [ + "【textColor】: Color del texto del componente hijo 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【highlightedBorderColor】: Color del borde al resaltar 【Color】", + "【child】: Componente hijo 【Widget】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【borderSide】: Línea del borde 【BorderSide】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón OutlineButton dejó de estar disponible en Flutter 3.0. Su reemplazo es el botón OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Botón de contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json new file mode 100644 index 00000000..5dfc0235 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_fr_FR.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Bouton à contour", + "info": "Bouton de style à bordure, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic OutlineButton", + "desc": [ + "【textColor】: Couleur du texte des composants enfants 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【highlightedBorderColor】: Couleur de la bordure en surbrillance 【Color】", + "【child】: Composant enfant 【Widget】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【borderSide】: Bordure 【BorderSide】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton OutlineButton a quitté la scène historique dans Flutter 3.0. Il est remplacé par le bouton OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Bouton à contour", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json new file mode 100644 index 00000000..0b312f10 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_it_IT.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Pulsante a contorno", + "info": "Pulsante con stile bordo, implementato basandosi su MaterialButton, tutte le proprietà sono simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di OutlineButton", + "desc": [ + "【textColor】: Colore del testo del componente figlio 【Color】", + "【splashColor】: Colore dell'effetto ripple 【Color】", + "【highlightColor】: Colore di evidenziazione durante la pressione prolungata 【Color】", + "【highlightedBorderColor】: Colore del bordo durante l'evidenziazione 【Color】", + "【child】: Componente figlio 【Widget】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【borderSide】: Linea del bordo 【BorderSide】", + "【onPressed】: Evento di clic 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante OutlineButton è stato ritirato in Flutter 3.0. Il suo sostituto è il pulsante OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Pulsante a contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json new file mode 100644 index 00000000..6ff6ea27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ja_JP.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "アウトライン ボタン", + "info": "枠線スタイルのボタンで、MaterialButtonをベースに実装されており、すべてのプロパティはMaterialButtonと同様です。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButtonクリックイベント", + "desc": [ + "【textColor】: 子コンポーネントのテキストカラー 【Color】", + "【splashColor】: 波紋カラー 【Color】", + "【highlightColor】: 長押し時のハイライトカラー 【Color】", + "【highlightedBorderColor】: ハイライト時の枠線カラー 【Color】", + "【child】: 子コンポーネント 【Widget】", + "【padding】: 内側の余白 【EdgeInsetsGeometry】", + "【borderSide】: 枠線 【BorderSide】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton ボタンは Flutter3.0 で歴史の舞台から退場しました。代替として OutlinedButton ボタンがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(枠線ボタン", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json new file mode 100644 index 00000000..8105312e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ko_KR.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "아웃라인 버튼", + "info": "테두리 스타일 버튼, MaterialButton을 기반으로 구현되었으며, 모든 속성은 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "OutlineButton 클릭 이벤트", + "desc": [ + "【textColor】: 자식 컴포넌트 텍스트 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【highlightedBorderColor】: 강조 시 테두리 색상 【Color】", + "【child】: 자식 컴포넌트 【Widget】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【borderSide】: 테두리 선 【BorderSide】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'OutlineButton 버튼은 Flutter3.0에서 역사의 무대에서 퇴장했습니다. 대체자는 OutlinedButton 버튼입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(아웃라인 버튼", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json new file mode 100644 index 00000000..dedf8eff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_pt_PT.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Botão de Contorno", + "info": "Botão de estilo de borda, implementado com base no MaterialButton, todas as propriedades são semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do OutlineButton", + "desc": [ + "【textColor】: Cor do texto do componente filho 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【highlightedBorderColor】: Cor da borda ao destacar 【Color】", + "【child】: Componente filho 【Widget】", + "【padding】: Preenchimento interno 【EdgeInsetsGeometry】", + "【borderSide】: Linha da borda 【BorderSide】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão OutlineButton saiu de cena no Flutter 3.0. O substituto é o botão OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Botão de Contorno", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json new file mode 100644 index 00000000..b4a9f8a4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/OutlineButton/desc_ru_RU.json @@ -0,0 +1,60 @@ +{ + "id": 27, + "name": "OutlineButton", + "localName": "Кнопка с контуром", + "info": "Кнопка с рамкой, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 23, + 24, + 25, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия OutlineButton", + "desc": [ + "【textColor】: Цвет текста дочернего компонента 【Color】", + "【splashColor】: Цвет водяного эффекта 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【highlightedBorderColor】: Цвет рамки при подсветке 【Color】", + "【child】: Дочерний компонент 【Widget】", + "【padding】: Внутренний отступ 【EdgeInsetsGeometry】", + "【borderSide】: Линия рамки 【BorderSide】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomOutlineButton extends StatelessWidget {", + " const CustomOutlineButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка OutlineButton ушла в историю с выходом Flutter 3.0. Ее заменила кнопка OutlinedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return OutlineButton(Кнопка с контуром", + " onPressed: () {,", + " child: const Text(\"OutlineButton\"),", + " padding: const EdgeInsets.all(8),", + " splashColor: Colors.green,", + " highlightColor: Colors.orangeAccent,", + " highlightedBorderColor: Colors.grey,", + " textColor: const Color(0xff000000),", + " borderSide: const BorderSide(color: Color(0xff0A66F8), width: 2)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json new file mode 100644 index 00000000..a459a8b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_de_DE.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Seitenspeicher", + "info": "Kann den Seitenstatus speichern und den Status beim Wechseln der Seite beibehalten. Im Quellcode wird es in ScrollView, PageView, ExpansionTile usw. verwendet.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PageStorage", + "desc": [ + "【bucket】 : Speicherbereich 【PageStorageBucket】", + "【child】: Untergeordnete Komponente 【Widget】", + "Beim Initialisieren der Komponente beim Wechseln der Oberfläche wird der Status nicht zurückgesetzt. Wie bei CountWidget muss die untergeordnete Komponente beim Initialisieren den Status aus dem Speicher lesen und beim Ändern des Status den Status in den Speicher schreiben. Außerdem ist PageStorage bereits in MaterialApp integriert, aber Sie können auch ein PageStorage erstellen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json new file mode 100644 index 00000000..dd4ed4b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_en_US.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Page Storage", + "info": "Can store the state of a page, maintaining the state when switching pages. It is used in ScrollView, PageView, ExpansionTile, etc. in the source code.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PageStorage", + "desc": [ + "【bucket】: Storage Area 【PageStorageBucket】", + "【child】: Child Widget 【Widget】", + "When switching interfaces and initializing components, the state will not be reset. As in the CountWidget example, the child component needs to read the state from the storage during initialization and write the state to the storage when changing the state. Additionally, MaterialApp already has PageStorage built-in, but you can also create your own PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json new file mode 100644 index 00000000..ca743ed2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_es_ES.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Almacenamiento de Página", + "info": "Puede almacenar el estado de la página, manteniendo el estado al cambiar de página. En el código fuente, se utiliza en ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PageStorage", + "desc": [ + "【bucket】: Área de almacenamiento 【PageStorageBucket】", + "【child】: Componente hijo 【Widget】", + "Al cambiar de interfaz y inicializar componentes, el estado no se restablecerá. Como en CountWidget, el componente hijo necesita leer el estado del almacenamiento durante la inicialización y escribir el estado en el almacenamiento al cambiar el estado. Además, si usas MaterialApp, ya tiene PageStorage incorporado, pero también puedes crear uno." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json new file mode 100644 index 00000000..5c913143 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_fr_FR.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Stockage de page", + "info": "Permet de stocker l'état de la page, ce qui permet de maintenir l'état lors du changement de page. Il est utilisé dans le code source de ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PageStorage", + "desc": [ + "【bucket】 : Zone de stockage 【PageStorageBucket】", + "【child】: Composant enfant 【Widget】", + "Lors de l'initialisation des composants en changeant d'interface, l'état n'est pas réinitialisé. Comme dans CountWidget, le composant enfant doit lire l'état du stockage lors de l'initialisation et écrire l'état dans le stockage lors du changement d'état. De plus, si vous utilisez MaterialApp, PageStorage est déjà intégré, mais vous pouvez également créer un PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json new file mode 100644 index 00000000..53e06b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_it_IT.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Memoria di pagina", + "info": "Consente di memorizzare lo stato della pagina, mantenendo lo stato durante il cambio di pagina. Nel codice sorgente, viene utilizzato in ScrollView, PageView, ExpansionTile, ecc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di PageStorage", + "desc": [ + "【bucket】 : Area di archiviazione 【PageStorageBucket】", + "【child】: Componente figlio 【Widget】", + "Quando si inizializzano i componenti durante il cambio di interfaccia, lo stato non viene reimpostato. Ad esempio, nel caso di CountWidget, il componente figlio deve leggere lo stato dalla memoria durante l'inizializzazione e scrivere lo stato nella memoria quando lo stato cambia. Inoltre, se si utilizza MaterialApp, PageStorage è già integrato, ma è comunque possibile creare un PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json new file mode 100644 index 00000000..14259a6b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ja_JP.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "ページストレージ", + "info": "ページの状態を保存することができ、ページを切り替える際に状態を保持することができます。ソースコードでは、ScrollView、PageView、ExpansionTileなどに適用されています。", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorageの基本使用", + "desc": [ + "【bucket】 : ストレージエリア 【PageStorageBucket】", + "【child】: 子コンポーネント 【Widget】", + "上記のインターフェースを切り替える際、コンポーネントの初期化時に状態がリセットされることはありません。例えばCountWidgetでは、子コンポーネントは初期化時にストレージから状態を読み取り、状態を変更する際に状態をストレージに書き込む必要があります。また、MaterialAppを使用すると、すでにPageStorageが組み込まれていますが、自分でPageStorageを作成することもできます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json new file mode 100644 index 00000000..77bbbfac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ko_KR.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "페이지 스토리지", + "info": "페이지 상태를 저장할 수 있으며, 페이지 전환 시 상태를 유지할 수 있습니다. 소스 코드에서 ScrollView, PageView, ExpansionTile 등에 적용되어 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PageStorage 기본 사용", + "desc": [ + "【bucket】 : 저장 영역 【PageStorageBucket】", + "【child】: 자식 위젯 【Widget】", + "위에서 인터페이스를 전환할 때 초기화 컴포넌트는 상태를 재설정하지 않습니다. 위의 CountWidget과 같이, 자식 컴포넌트는 초기화 시 스토리지에서 상태를 읽어야 하며, 상태를 변경할 때 상태를 스토리지에 기록해야 합니다. 또한, MaterialApp을 사용하면 이미 내장된 PageStorage가 있지만, PageStorage를 직접 생성할 수도 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json new file mode 100644 index 00000000..e440872a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_pt_PT.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Armazenamento de Página", + "info": "Pode armazenar o estado da página, mantendo o estado ao alternar entre páginas. No código-fonte, é aplicado em ScrollView, PageView, ExpansionTile, etc.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do PageStorage", + "desc": [ + "【bucket】: Área de armazenamento 【PageStorageBucket】", + "【child】: Componente filho 【Widget】", + "Ao alternar a interface e inicializar componentes, o estado não será redefinido. Como no CountWidget, o componente filho precisa ler o estado do armazenamento durante a inicialização e escrever o estado no armazenamento ao alterar o estado. Além disso, se usar o MaterialApp, o PageStorage já está embutido, mas você também pode criar um PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json new file mode 100644 index 00000000..16b638c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PageStorage/desc_ru_RU.json @@ -0,0 +1,23 @@ +{ + "id": 210, + "name": "PageStorage", + "localName": "Хранилище страниц", + "info": "Позволяет сохранять состояние страницы, чтобы оно сохранялось при переключении страниц. Используется в исходном коде в ScrollView, PageView, ExpansionTile и других.", + "lever": 3, + "family": 0, + "linkIds": [ + 52, + 165 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PageStorage", + "desc": [ + "【bucket】 : Область хранения 【PageStorageBucket】", + "【child】: Дочерний компонент 【Widget】", + "При переключении интерфейса инициализация компонентов не сбрасывает состояние. Например, CountWidget, дочерний компонент должен читать состояние из хранилища при инициализации и записывать состояние в хранилище при изменении состояния. Кроме того, если вы используете MaterialApp, PageStorage уже встроен, но вы также можете создать PageStorage." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json new file mode 100644 index 00000000..68fa7dad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Platzhalter-Komponente", + "info": "Eine Platzhalter-Komponente mit einem Rechteck und einem Kreuz, bei der Farbe, Linienstärke, Breite, Höhe usw. angegeben werden können.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Eigenschaften des Platzhalters", + "desc": [ + "【color】: Farbe 【Color】", + "【strokeWidth】: Linienstärke 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Fallback-Eigenschaften des Platzhalters", + "desc": [ + "Wenn der Bereich keine Breiten- und Höhenbeschränkungen hat, die Breite und Höhe der Platzhalter-Komponente.", + "【fallbackHeight】: Höhe 【double】", + "【fallbackWidth】: Breite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json new file mode 100644 index 00000000..2b970383 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Placeholder Component", + "info": "A placeholder component with a rectangle and a cross, which can specify properties such as color, stroke width, width, and height.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder Basic Properties", + "desc": [ + "【color】: Color 【Color】", + "【strokeWidth】: Stroke Width 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder Fallback Properties", + "desc": [ + "When there are no width and height constraints in the area, the width and height of the placeholder component.", + "【fallbackHeight】: Height 【double】", + "【fallbackWidth】: Width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json new file mode 100644 index 00000000..95a7a9a5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente de marcador de posición", + "info": "Un componente de marcador de posición con un rectángulo y una cruz, que puede especificar propiedades como color, grosor de línea, ancho y alto.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propiedades básicas de Placeholder", + "desc": [ + "【color】: Color 【Color】", + "【strokeWidth】: Grosor de línea 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propiedades de fallback de Placeholder", + "desc": [ + "Cuando no hay restricciones de ancho y alto en el área, el ancho y alto del componente de marcador de posición.", + "【fallbackHeight】: Alto 【double】", + "【fallbackWidth】: Ancho 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json new file mode 100644 index 00000000..d9df0a99 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Composant d'espace réservé", + "info": "Un composant d'espace réservé avec un rectangle et une croix, pouvant spécifier des propriétés telles que la couleur, l'épaisseur de la ligne, la largeur et la hauteur.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriétés de base de Placeholder", + "desc": [ + "【color】: Couleur 【Color】", + "【strokeWidth】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propriétés de fallback de Placeholder", + "desc": [ + "Lorsque la zone n'a pas de contraintes de largeur et de hauteur, la largeur et la hauteur du composant d'espace réservé.", + "【fallbackHeight】: Hauteur 【double】", + "【fallbackWidth】: Largeur 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json new file mode 100644 index 00000000..3b343b5d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente segnaposto", + "info": "Un componente segnaposto con un rettangolo e una croce, che può specificare proprietà come colore, larghezza della linea, larghezza e altezza.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Proprietà di base del Placeholder", + "desc": [ + "【color】: Colore 【Color】", + "【strokeWidth】: Larghezza della linea 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Proprietà fallback del Placeholder", + "desc": [ + "Quando non ci sono vincoli di larghezza e altezza nell'area, la larghezza e l'altezza del componente segnaposto.", + "【fallbackHeight】: Altezza 【double】", + "【fallbackWidth】: Larghezza 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json new file mode 100644 index 00000000..295dc30f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "プレースホルダーコンポーネント", + "info": "矩形とバツ印のプレースホルダーコンポーネントで、色、線の太さ、幅と高さなどの属性を指定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholderの基本属性", + "desc": [ + "【color】: 色 【Color】", + "【strokeWidth】: 線の太さ 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholderのfallback属性", + "desc": [ + "エリアに幅と高さの制約がない場合のプレースホルダーコンポーネントの幅と高さ。", + "【fallbackHeight】: 高さ 【double】", + "【fallbackWidth】: 幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json new file mode 100644 index 00000000..fe00fc2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "플레이스홀더 컴포넌트", + "info": "사각형과 엑스 표시가 있는 플레이스홀더 컴포넌트로, 색상, 선 두께, 너비 및 높이 등의 속성을 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Placeholder 기본 속성", + "desc": [ + "【color】: 색상 【Color】", + "【strokeWidth】: 선 두께 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Placeholder의 fallback 속성", + "desc": [ + "해당 영역에 너비와 높이 제약이 없을 때 플레이스홀더 컴포넌트의 너비와 높이.", + "【fallbackHeight】: 높이 【double】", + "【fallbackWidth】: 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json new file mode 100644 index 00000000..a74137ff --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Componente de Espaço Reservado", + "info": "Um componente de espaço reservado com um retângulo e um X, que permite especificar propriedades como cor, largura da linha, altura e largura.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Propriedades Básicas do Placeholder", + "desc": [ + "【color】: Cor 【Color】", + "【strokeWidth】: Espessura da Linha 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Propriedades Fallback do Placeholder", + "desc": [ + "Quando a área não tem restrições de altura e largura, a altura e largura do componente de espaço reservado.", + "【fallbackHeight】: Altura 【double】", + "【fallbackWidth】: Largura 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json new file mode 100644 index 00000000..51a97602 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Placeholder/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 36, + "name": "Placeholder", + "localName": "Компонент-заглушка", + "info": "Прямоугольный компонент-заглушка с крестиком, можно указать цвет, толщину линии, ширину, высоту и другие свойства.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основные свойства Placeholder", + "desc": [ + "【color】: Цвет 【Color】", + "【strokeWidth】: Толщина линии 【double】" + ] + }, + { + "file": "node2_fallback.dart", + "name": "Свойства fallback Placeholder", + "desc": [ + "Ширина и высота компонента-заглушки, если в области нет ограничений по ширине и высоте.\"", + "【fallbackHeight】: Высота 【double】", + "【fallbackWidth】: Ширина 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json new file mode 100644 index 00000000..63de5e98 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Richtungsbasierte Positionierung", + "info": "Funktioniert wie die Positioned-Komponente, aber mit unterschiedlichen Eigenschaftsnamen. Kann nur in einem Stack verwendet werden und ermöglicht die präzise Platzierung einer Komponente durch Angabe der Abstände von oben, links, rechts und unten.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von PositionedDirectional", + "desc": [ + "【child】 : Komponente 【Widget】", + "【top】 : Abstand zum oberen Rand des Elternelements 【double】", + "【end】 : Abstand zum rechten Rand des Elternelements 【double】", + "【start】 : Abstand zum linken Rand des Elternelements 【double】", + "【bottom】 : Abstand zum unteren Rand des Elternelements 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json new file mode 100644 index 00000000..950dd697 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Directional Positioning", + "info": "Same functionality as the Positioned component, but with different property names. It can only be used in a Stack, allowing precise placement of a component by specifying distances from the top, left, right, and bottom.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of PositionedDirectional", + "desc": [ + "【child】 : Component 【Widget】", + "【top】 : Distance to the top of the parent 【double】", + "【end】 : Distance to the right of the parent 【double】", + "【start】 : Distance to the left of the parent 【double】", + "【bottom】 : Distance to the bottom of the parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json new file mode 100644 index 00000000..8796fef0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posicionamiento direccional", + "info": "Funciona igual que el componente Positioned, pero con nombres de propiedades diferentes. Solo se puede usar en Stack, y permite colocar un componente con precisión especificando las distancias desde la parte superior, inferior, izquierda y derecha.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distancia desde la parte superior del padre 【double】", + "【end】 : Distancia desde la derecha del padre 【double】", + "【start】 : Distancia desde la izquierda del padre 【double】", + "【bottom】 : Distancia desde la parte inferior del padre 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json new file mode 100644 index 00000000..cf354b50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Positionnement directionnel", + "info": "Fonctionne comme le composant Positioned, mais avec des noms de propriétés différents. Ne peut être utilisé que dans une Stack, permet de positionner précisément un composant en spécifiant les distances par rapport au haut, à gauche, à droite et au bas.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de PositionedDirectional", + "desc": [ + "【child】 : Composant 【Widget】", + "【top】 : Distance par rapport au haut du parent 【double】", + "【end】 : Distance par rapport à la droite du parent 【double】", + "【start】 : Distance par rapport à la gauche du parent 【double】", + "【bottom】 : Distance par rapport au bas du parent 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json new file mode 100644 index 00000000..6fb07841 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posizionamento Direzionale", + "info": "Funziona come il componente Positioned, ma con nomi di attributi diversi. Può essere utilizzato solo in Stack e consente di posizionare con precisione un componente specificando le distanze da sinistra, destra, alto e basso.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Base di PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distanza dal bordo superiore del genitore 【double】", + "【end】 : Distanza dal bordo destro del genitore 【double】", + "【start】 : Distanza dal bordo sinistro del genitore 【double】", + "【bottom】 : Distanza dal bordo inferiore del genitore 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json new file mode 100644 index 00000000..63112a1e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "方向定位", + "info": "Positionedコンポーネントと同じ機能で、属性名が異なります。Stack内でのみ使用でき、左上右下の距離を指定してコンポーネントを正確に配置できます。", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional基本使用", + "desc": [ + "【child】 : コンポーネント 【Widget】", + "【top】 : 親の上端までの距離 【double】", + "【end】 : 親の右端までの距離 【double】", + "【start】 : 親の左端までの距離 【double】", + "【bottom】 : 親の下端までの距離 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json new file mode 100644 index 00000000..b807c3b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "방향 위치 지정", + "info": "Positioned 컴포넌트와 기능이 동일하며, 속성 이름이 다릅니다. Stack에서만 사용할 수 있으며, 상하좌우 거리를 지정하여 특정 컴포넌트를 정확하게 배치할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PositionedDirectional 기본 사용", + "desc": [ + "【child】 : 컴포넌트 【Widget】", + "【top】 : 부모 상단까지의 거리 【double】", + "【end】 : 부모 오른쪽까지의 거리 【double】", + "【start】 : 부모 왼쪽까지의 거리 【double】", + "【bottom】 : 부모 하단까지의 거리 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json new file mode 100644 index 00000000..b594afb3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Posicionamento Direcional", + "info": "Funciona da mesma forma que o componente Positioned, mas com nomes de propriedades diferentes. Só pode ser usado em Stack, e permite especificar distâncias de cima, esquerda, direita e baixo para posicionar um componente com precisão.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de PositionedDirectional", + "desc": [ + "【child】 : Componente 【Widget】", + "【top】 : Distância até o topo do pai 【double】", + "【end】 : Distância até a direita do pai 【double】", + "【start】 : Distância até a esquerda do pai 【double】", + "【bottom】 : Distância até a base do pai 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json new file mode 100644 index 00000000..e0978368 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PositionedDirectional/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 159, + "name": "PositionedDirectional", + "localName": "Направленное позиционирование", + "info": "Функциональность аналогична компоненту Positioned, но с разными именами свойств. Может использоваться только в Stack, позволяет точно разместить компонент, указав расстояния до верха, низа, левого и правого краев.", + "lever": 3, + "family": 0, + "linkIds": [ + 108, + 122 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование PositionedDirectional", + "desc": [ + "【child】 : Компонент 【Widget】", + "【top】 : Расстояние до верхнего края родителя 【double】", + "【end】 : Расстояние до правого края родителя 【double】", + "【start】 : Расстояние до левого края родителя 【double】", + "【bottom】 : Расстояние до нижнего края родителя 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json new file mode 100644 index 00000000..462a98c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_de_DE.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Bevorzugte Größe", + "info": "Implementiert das PreferredSizeWidget-Interface, kann ein Kind-Widget aufnehmen, bevorzugte Größe festlegen und übt keine Einschränkungen auf sein Kind-Widget aus.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize passt die Höhe der AppBar an", + "desc": [ + "【preferredSize】 : Größe 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Umwandlung und Verwendung von PreferredSize", + "desc": [ + "【PreferredSize wandelt ein normales Widget in ein PreferredSizeWidget um" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json new file mode 100644 index 00000000..9dfdf89e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_en_US.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Preferred Size", + "info": "Implements the PreferredSizeWidget interface, can contain a child component, sets the preferred size, and does not impose any constraints on its child component.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Adjusting AppBar Height with PreferredSize", + "desc": [ + "【preferredSize】 : size 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversion and Usage of PreferredSize", + "desc": [ + "【PreferredSize converts a regular component into a PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json new file mode 100644 index 00000000..eaa44d85 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_es_ES.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Tamaño preferido", + "info": "Implementa la interfaz PreferredSizeWidget, puede contener un componente hijo, establece un tamaño preferido y no impone ninguna restricción a su componente hijo.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajustar la altura de AppBar con PreferredSize", + "desc": [ + "【preferredSize】 : tamaño 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Uso de conversión de PreferredSize", + "desc": [ + "【PreferredSize convierte un componente normal en un PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json new file mode 100644 index 00000000..24b4e2a2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_fr_FR.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Taille préférée", + "info": "Implémente l'interface PreferredSizeWidget, peut contenir un composant enfant, définit une taille préférée et n'impose aucune contrainte à son composant enfant.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajuster la hauteur de l'AppBar avec PreferredSize", + "desc": [ + "【preferredSize】 : taille 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversion et utilisation de PreferredSize", + "desc": [ + "【PreferredSize convertit un composant ordinaire en PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json new file mode 100644 index 00000000..280de33e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_it_IT.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Dimensione Preferita", + "info": "Implementa l'interfaccia PreferredSizeWidget, può contenere un componente figlio, imposta una dimensione preferita e non applica alcun vincolo al suo componente figlio.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Regolazione dell'altezza dell'AppBar con PreferredSize", + "desc": [ + "【preferredSize】 : dimensione 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversione e utilizzo di PreferredSize", + "desc": [ + "【PreferredSize converte un componente comune in un PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json new file mode 100644 index 00000000..7e8a0068 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ja_JP.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "優先サイズ", + "info": "PreferredSizeWidgetインターフェースを実装しており、子コンポーネントを収容し、優先サイズを設定しますが、子コンポーネントに制約を課しません。", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSizeでAppBarの高さを調整", + "desc": [ + "【preferredSize】 : サイズ 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSizeの変換と使用", + "desc": [ + "【PreferredSizeは通常のコンポーネントをPreferredSizeWidgetに変換します" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json new file mode 100644 index 00000000..8d61e15c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ko_KR.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "우선 크기", + "info": "PreferredSizeWidget 인터페이스를 구현하여 하나의 자식 위젯을 수용하고 우선 크기를 설정하며, 자식 위젯에 어떠한 제약도 가하지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "PreferredSize로 AppBar 높이 조정", + "desc": [ + "【preferredSize】 : 크기 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "PreferredSize의 변환 사용", + "desc": [ + "【PreferredSize는 일반 위젯을 PreferredSizeWidget으로 변환합니다" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json new file mode 100644 index 00000000..20c2181b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_pt_PT.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Tamanho Preferido", + "info": "Implementa a interface PreferredSizeWidget, pode acomodar um componente filho, define o tamanho preferido e não impõe quaisquer restrições ao seu componente filho.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Ajustar a altura do AppBar com PreferredSize", + "desc": [ + "【preferredSize】 : tamanho 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Conversão e uso do PreferredSize", + "desc": [ + "【PreferredSize converte um componente comum em PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json new file mode 100644 index 00000000..ded165f2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/PreferredSize/desc_ru_RU.json @@ -0,0 +1,28 @@ +{ + "id": 204, + "name": "PreferredSize", + "localName": "Предпочтительный размер", + "info": "Реализует интерфейс PreferredSizeWidget, может содержать дочерний компонент, устанавливает предпочтительный размер и не накладывает никаких ограничений на свои дочерние компоненты.", + "lever": 2, + "family": 0, + "linkIds": [ + 57, + 64 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Настройка высоты AppBar с помощью PreferredSize", + "desc": [ + "【preferredSize】 : размер 【Size】" + ] + }, + { + "file": "node2_adapter.dart", + "name": "Преобразование и использование PreferredSize", + "desc": [ + "【PreferredSize преобразует обычный компонент в PreferredSizeWidget" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json new file mode 100644 index 00000000..191499f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_de_DE.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Auswahlkachel", + "info": "Eine allgemeine Listenelementstruktur, die von Flutter bereitgestellt wird, mit einer mittel-rechten Struktur und einem Radio am Ende. Komponenten können an den entsprechenden Positionen eingefügt werden, wodurch spezifische Elemente leicht angepasst werden können.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile benötigt einen generischen Typ T", + "desc": [ + "【value】 : Elementobjekt 【T】", + "【groupValue】 : Ausgewähltes Objekt 【T】", + "【selected】: Ob ausgewählt 【bool】", + "【secondary】: Rechte Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【onChanged】: Wechselereignis 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile Auswahlfarbe und dichte Anordnung", + "desc": [ + "【activeColor】 : Farbe bei Auswahl 【Color】", + "【dense】: Ob dichte Anordnung 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json new file mode 100644 index 00000000..5da2c4cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_en_US.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Radio Tile", + "info": "A general list item structure provided by Flutter, with a middle-right structure, and a Radio at the end. Components can be inserted at corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requires a generic type T", + "desc": [ + "【value】 : Item object 【T】", + "【groupValue】 : Selected object 【T】", + "【selected】: Whether selected 【bool】", + "【secondary】: Right component 【Widget】", + "【title】: Middle top component 【Widget】", + "【subtitle】: Middle bottom component 【Widget】", + "【onChanged】: Switch event 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile selection color and dense layout", + "desc": [ + "【activeColor】 : Color when selected 【Color】", + "【dense】: Whether dense layout 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json new file mode 100644 index 00000000..4f1d5592 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_es_ES.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Elemento de lista de radio", + "info": "Una estructura de elemento de lista genérica proporcionada por Flutter, con una estructura de centro-derecha y un Radio al final. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requiere un tipo genérico T", + "desc": [ + "【value】 : Objeto del elemento 【T】", + "【groupValue】 : Objeto seleccionado 【T】", + "【selected】: Si está seleccionado 【bool】", + "【secondary】: Componente derecho 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【onChanged】: Evento de cambio 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Color de selección y disposición densa de RadioListTile", + "desc": [ + "【activeColor】 : Color cuando está seleccionado 【Color】", + "【dense】: Si está en disposición densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json new file mode 100644 index 00000000..80c5b656 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_fr_FR.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Tuile de bouton radio", + "info": "Une structure de liste générique fournie par Flutter, de structure centrale-droite, avec un bouton radio à la fin. Des composants peuvent être insérés aux positions appropriées, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile nécessite un type générique T", + "desc": [ + "【value】 : objet de l'entrée 【T】", + "【groupValue】 : objet sélectionné 【T】", + "【selected】: si sélectionné 【bool】", + "【secondary】: composant droit 【Widget】", + "【title】: composant supérieur central 【Widget】", + "【subtitle】: composant inférieur central 【Widget】", + "【onChanged】: événement de bascule 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Couleur de sélection et alignement serré de RadioListTile", + "desc": [ + "【activeColor】 : couleur lors de la sélection 【Color】", + "【dense】: si alignement serré 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json new file mode 100644 index 00000000..7f1f85e3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_it_IT.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Piastrella Radio", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura centrale-destra, e una Radio alla fine. I componenti possono essere inseriti nelle posizioni corrispondenti, rendendo facile adattarsi a voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile richiede un tipo generico T", + "desc": [ + "【value】 : oggetto voce 【T】", + "【groupValue】 : oggetto selezionato 【T】", + "【selected】: se selezionato 【bool】", + "【secondary】: componente a destra 【Widget】", + "【title】: componente superiore centrale 【Widget】", + "【subtitle】: componente inferiore centrale 【Widget】", + "【onChanged】: evento di cambio 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Colore selezionato e disposizione compatta di RadioListTile", + "desc": [ + "【activeColor】 : colore quando selezionato 【Color】", + "【dense】: se disposto in modo compatto 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json new file mode 100644 index 00000000..e37e7747 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ja_JP.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "ラジオタイル", + "info": "Flutterが提供する一般的なリストアイテム構造で、中央右構造で、末尾にラジオがあります。対応する位置にコンポーネントを挿入でき、特定のアイテムに簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTileはジェネリック型Tを必要とします", + "desc": [ + "【value】 : アイテムオブジェクト 【T】", + "【groupValue】 : 選択オブジェクト 【T】", + "【selected】: 選択されているかどうか 【bool】", + "【secondary】: 右側のコンポーネント 【Widget】", + "【title】: 中央上部のコンポーネント 【Widget】", + "【subtitle】: 中央下部のコンポーネント 【Widget】", + "【onChanged】: 切り替えイベント 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTileの選択色と密排", + "desc": [ + "【activeColor】 : 選択時の色 【Color】", + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json new file mode 100644 index 00000000..1deb0e6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ko_KR.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "라디오 타일", + "info": "Flutter에서 제공하는 일반적인 목록 항목 구조로, 중앙-오른쪽 구조이며 끝에 라디오 버튼이 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile은 제네릭 T가 필요합니다", + "desc": [ + "【value】 : 항목 객체 【T】", + "【groupValue】 : 선택된 객체 【T】", + "【selected】: 선택 여부 【bool】", + "【secondary】: 오른쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【onChanged】: 전환 이벤트 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "RadioListTile 선택 색상 및 밀집 배치", + "desc": [ + "【activeColor】 : 선택 시 색상 【Color】", + "【dense】: 밀집 배치 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json new file mode 100644 index 00000000..708dd9bc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_pt_PT.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Azulejo de Rádio", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de centro-direita, e um Rádio na extremidade. Componentes podem ser inseridos nas posições correspondentes, o que permite lidar facilmente com itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile requer um tipo genérico T", + "desc": [ + "【value】 : objeto do item 【T】", + "【groupValue】 : objeto selecionado 【T】", + "【selected】: está selecionado 【bool】", + "【secondary】: componente à direita 【Widget】", + "【title】: componente superior no centro 【Widget】", + "【subtitle】: componente inferior no centro 【Widget】", + "【onChanged】: evento de alternância 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Cor de seleção e disposição densa do RadioListTile", + "desc": [ + "【activeColor】 : cor quando selecionado 【Color】", + "【dense】: disposição densa 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json new file mode 100644 index 00000000..b4a2d170 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RadioListTile/desc_ru_RU.json @@ -0,0 +1,32 @@ +{ + "id": 19, + "name": "RadioListTile", + "localName": "Плитка с радиокнопкой", + "info": "Универсальная структура элемента списка, предоставляемая Flutter, имеет структуру с центром справа, в конце которой находится радиокнопка. В соответствующие позиции можно вставлять компоненты, что позволяет легко адаптироваться к определенным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RadioListTile требует обобщенный тип T", + "desc": [ + "【value】 : объект элемента 【T】", + "【groupValue】 : выбранный объект 【T】", + "【selected】: выбран ли элемент 【bool】", + "【secondary】: правый компонент 【Widget】", + "【title】: верхний центральный компонент 【Widget】", + "【subtitle】: нижний центральный компонент 【Widget】", + "【onChanged】: событие переключения 【Function(T)】" + ] + }, + { + "file": "node2_dense.dart", + "name": "Цвет выбора и плотное расположение RadioListTile", + "desc": [ + "【activeColor】 : цвет при выборе 【Color】", + "【dense】: плотное расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json new file mode 100644 index 00000000..f18bf993 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_de_DE.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Erhobener Button", + "info": "Ein Button mit Schatten, basierend auf MaterialButton, alle Eigenschaften ähneln MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton Klick-Ereignis", + "desc": [ + "【color】: Farbe 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】", + "【elevation】: Schattentiefe 【double】", + "【child】: Untergeordnete Komponente 【Widget】", + "【textColor】: Textfarbe der Untergeordneten Komponente 【Color】", + "【highlightColor】: Hervorhebungsfarbe bei langem Drücken 【Color】", + "【padding】: Innenabstand 【EdgeInsetsGeometry】", + "【onPressed】: Klick-Ereignis 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton wurde in Flutter 3.3 aus dem Verkehr gezogen. Der Ersatz ist der ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json new file mode 100644 index 00000000..44af003d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_en_US.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Raised Button", + "info": "A raised button with shadow, implemented based on MaterialButton, with all properties similar to MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton Click Event", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Ripple Color 【Color】", + "【elevation】: Shadow Depth 【double】", + "【child】: Child Widget 【Widget】", + "【textColor】: Child Widget Text Color 【Color】", + "【highlightColor】: Long Press Highlight Color 【Color】", + "【padding】: Padding 【EdgeInsetsGeometry】", + "【onPressed】: Click Event 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton button has exited the stage in Flutter 3.3. The replacement is the ElevatedButton button.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json new file mode 100644 index 00000000..ed720d07 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_es_ES.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Botón elevado", + "info": "Un botón elevado con sombra, implementado basado en MaterialButton, todas las propiedades son similares a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de clic de RaisedButton", + "desc": [ + "【color】: Color 【Color】", + "【splashColor】: Color de la onda 【Color】", + "【elevation】: Profundidad de la sombra 【double】", + "【child】: Widget hijo 【Widget】", + "【textColor】: Color del texto del widget hijo 【Color】", + "【highlightColor】: Color de resaltado al mantener presionado 【Color】", + "【padding】: Relleno interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'El botón RaisedButton ha dejado de usarse a partir de Flutter 3.3. Su reemplazo es el botón ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json new file mode 100644 index 00000000..27552483 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_fr_FR.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Bouton surélevé", + "info": "Bouton surélevé avec ombre, basé sur MaterialButton, toutes les propriétés sont similaires à MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Événement de clic sur RaisedButton", + "desc": [ + "【color】: Couleur 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】", + "【elevation】: Profondeur de l'ombre 【double】", + "【child】: Composant enfant 【Widget】", + "【textColor】: Couleur du texte du composant enfant 【Color】", + "【highlightColor】: Couleur de surbrillance lors d'un appui long 【Color】", + "【padding】: Marge intérieure 【EdgeInsetsGeometry】", + "【onPressed】: Événement de clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Le bouton RaisedButton a quitté la scène historique avec Flutter 3.3. Il est remplacé par le bouton ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json new file mode 100644 index 00000000..c2a30a3a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_it_IT.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Pulsante sollevato", + "info": "Un pulsante sollevato con ombre, basato su MaterialButton, con proprietà simili a MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento di clic di RaisedButton", + "desc": [ + "【color】: Colore 【Color】", + "【splashColor】: Colore dell'effetto splash 【Color】", + "【elevation】: Profondità dell'ombra 【double】", + "【child】: Widget figlio 【Widget】", + "【textColor】: Colore del testo del widget figlio 【Color】", + "【highlightColor】: Colore di evidenziazione durante il press lungo 【Color】", + "【padding】: Spaziatura interna 【EdgeInsetsGeometry】", + "【onPressed】: Evento di clic 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Il pulsante RaisedButton è uscito di scena in Flutter 3.3. Il suo sostituto è il pulsante ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json new file mode 100644 index 00000000..9e5f8b39 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ja_JP.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "浮き上がるボタン", + "info": "影付きの浮き上がるボタンで、MaterialButtonを基に実装されています。すべてのプロパティはMaterialButtonと同様です。", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButtonクリックイベント", + "desc": [ + "【color】: 色 【Color】", + "【splashColor】: 波紋の色 【Color】", + "【elevation】: 影の深さ 【double】", + "【child】: 子ウィジェット 【Widget】", + "【textColor】: 子ウィジェットのテキスト色 【Color】", + "【highlightColor】: 長押し時のハイライト色 【Color】", + "【padding】: パディング 【EdgeInsetsGeometry】", + "【onPressed】: クリックイベント 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton ボタンは Flutter3.3 で歴史の舞台から退きました。代替として ElevatedButton ボタンがあります。';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json new file mode 100644 index 00000000..a23105c7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ko_KR.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "떠오르는 버튼", + "info": "그림자가 있는 떠오르는 버튼, MaterialButton을 기반으로 구현되었으며 모든 속성은 MaterialButton과 유사합니다.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RaisedButton 클릭 이벤트", + "desc": [ + "【color】: 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】", + "【elevation】: 그림자 깊이 【double】", + "【child】: 자식 위젯 【Widget】", + "【textColor】: 자식 위젯 텍스트 색상 【Color】", + "【highlightColor】: 길게 누를 때 강조 색상 【Color】", + "【padding】: 안쪽 여백 【EdgeInsetsGeometry】", + "【onPressed】: 클릭 이벤트 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'RaisedButton 버튼은 Flutter3.3에서 역사의 뒤안길로 사라졌습니다. 대체 버튼은 ElevatedButton입니다.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json new file mode 100644 index 00000000..40fb855c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_pt_PT.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Botão Elevado", + "info": "Um botão elevado com sombra, baseado no MaterialButton, com todas as propriedades semelhantes ao MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Evento de Clique do RaisedButton", + "desc": [ + "【color】: Cor 【Color】", + "【splashColor】: Cor do efeito de onda 【Color】", + "【elevation】: Profundidade da sombra 【double】", + "【child】: Widget filho 【Widget】", + "【textColor】: Cor do texto do widget filho 【Color】", + "【highlightColor】: Cor de destaque ao pressionar 【Color】", + "【padding】: Espaçamento interno 【EdgeInsetsGeometry】", + "【onPressed】: Evento de clique 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'O botão RaisedButton foi descontinuado no Flutter 3.3. O substituto é o botão ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json new file mode 100644 index 00000000..fccd3d2e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RaisedButton/desc_ru_RU.json @@ -0,0 +1,60 @@ +{ + "id": 26, + "name": "RaisedButton", + "localName": "Кнопка с тенью", + "info": "Кнопка с тенью, реализованная на основе MaterialButton, все свойства аналогичны MaterialButton.", + "lever": 3, + "family": 0, + "deprecated": -1, + "linkIds": [ + 24, + 25, + 27, + 175 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Событие нажатия RaisedButton", + "desc": [ + "【color】: Цвет 【Color】", + "【splashColor】: Цвол водной ряби 【Color】", + "【elevation】: Глубина тени 【double】", + "【child】: Дочерний виджет 【Widget】", + "【textColor】: Цвет текста дочернего виджета 【Color】", + "【highlightColor】: Цвет подсветки при длительном нажатии 【Color】", + "【padding】: Внутренние отступы 【EdgeInsetsGeometry】", + "【onPressed】: Событие нажатия 【Function】", + " ", + "", + "class CustomRaisedButton extends StatelessWidget {", + " const CustomRaisedButton({Key? key) : super(key: key);", + "", + " final String info =", + " 'Кнопка RaisedButton ушла с исторической сцены в Flutter 3.3. Её заменила кнопка ElevatedButton.';", + "", + " @override", + " Widget build(BuildContext context) {", + " return Container(", + " color: Colors.blue.withOpacity(0.1),", + " padding: const EdgeInsets.all(10),", + " margin: const EdgeInsets.all(10),", + " child: Text(info),", + " );", + " ", + "", + " @override", + " Widget build(BuildContext context) {", + " return RaisedButton(", + " color: Colors.blue,", + " splashColor: Colors.green,", + " onPressed: () {,", + " child: const Text(\"RaisedButton\"),", + " textColor: const Color(0xffFfffff),", + " padding: const EdgeInsets.all(8),", + " elevation: 5,", + " highlightColor: const Color(0xffF88B0A)," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json new file mode 100644 index 00000000..8ebab734 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Originalle Lupe", + "info": "Eine Lupe, die jede Komponente darunter vergrößern kann. Kann Eigenschaften wie Dekorationsform, Größe, Versatz usw. festlegen.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Einfache Verwendung von RawMagnifier", + "desc": [ + "【size】: Größe 【Size】", + "【magnificationScale】: Vergrößerungsmaßstab 【double】", + "【focalPointOffset】: Versatz des vergrößerten Inhalts 【Offset】", + "【decoration】: Dekoration entdecken 【MagnifierDecoration】", + "【child】: Untergeordnete Komponente 【Widget?】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Benutzerdefinierte Dekorationsform für RawMagnifier", + "desc": [ + "Hier wird eine benutzerdefinierte fünfzackige Dekorationsform erstellt" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json new file mode 100644 index 00000000..0000d344 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Original Magnifier", + "info": "A magnifier that can magnify any component below it. Properties such as decoration shape, size, offset, etc., can be set.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Simple use of RawMagnifier", + "desc": [ + "【size】: Size 【Size】", + "【magnificationScale】: Magnification 【double】", + "【focalPointOffset】: Magnification content offset 【Offset】", + "【decoration】: Decoration 【MagnifierDecoration】", + "【child】: Child component 【Widget?】" + ] + }, + { + "file": "node2_shape.dart", + "name": "Custom decoration shape for RawMagnifier", + "desc": [ + "Customize the five-pointed star decoration shape here" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json new file mode 100644 index 00000000..f9ddd7fa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lupa original", + "info": "Una lupa que puede ampliar cualquier componente debajo, permite configurar propiedades como la forma de decoración, tamaño, desplazamiento, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de RawMagnifier", + "desc": [ + "【size】: Tamaño 【Size】", + "【magnificationScale】: Escala de ampliación 【double】", + "【focalPointOffset】: Desplazamiento del contenido ampliado 【Offset】", + "【decoration】: Decoración de la lupa 【MagnifierDecoration】", + "【child】: Componente hijo 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma de decoración personalizada de RawMagnifier", + "desc": [ + "Aquí se personaliza la forma de decoración en estrella de cinco puntas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json new file mode 100644 index 00000000..7238b8f7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Loupe brute", + "info": "Une loupe qui peut agrandir n'importe quel composant en dessous, avec des propriétés réglables telles que la forme de décoration, la taille, le décalage, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation simple de RawMagnifier", + "desc": [ + "【size】 : Taille 【Size】", + "【magnificationScale】 : Échelle de grossissement 【double】", + "【focalPointOffset】: Décalage du point focal 【Offset】", + "【decoration】: Décoration de découverte 【MagnifierDecoration】", + "【child】: Composant enfant 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forme de décoration personnalisée de RawMagnifier", + "desc": [ + "Ici, une forme de décoration en étoile à cinq branches personnalisée" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json new file mode 100644 index 00000000..d8de73b7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lente d'ingrandimento originale", + "info": "Una lente d'ingrandimento che può ingrandire qualsiasi componente sottostante, con proprietà come forma decorativa, dimensioni, offset, ecc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso semplice di RawMagnifier", + "desc": [ + "【size】 : Dimensioni 【Size】", + "【magnificationScale】 : Fattore di ingrandimento 【double】", + "【focalPointOffset】: Offset del contenuto ingrandito 【Offset】", + "【decoration】: Decorazione scoperta 【MagnifierDecoration】", + "【child】: Componente figlio 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma decorativa personalizzata di RawMagnifier", + "desc": [ + "Qui viene personalizzata la forma decorativa a stella a cinque punte" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json new file mode 100644 index 00000000..363187ab --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "原拡大鏡", + "info": "任意のコンポーネントを拡大する拡大鏡で、装飾形状、サイズ、オフセットなどのプロパティを設定できます。", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier の簡単な使用", + "desc": [ + "【size】 : サイズ 【Size】", + "【magnificationScale】 : 倍率 【double】", + "【focalPointOffset】: 拡大内容のオフセット 【Offset】", + "【decoration】: 装飾を発見 【MagnifierDecoration】", + "【child】: 子コンポーネント 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier カスタム装飾形状", + "desc": [ + "ここで五角形の装飾形状をカスタマイズします" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json new file mode 100644 index 00000000..3f6e4036 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "원 확대경", + "info": "아래의 임의의 컴포넌트를 확대할 수 있는 확대경으로, 장식 모양, 크기, 오프셋 등의 속성을 설정할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "RawMagnifier의 간단한 사용", + "desc": [ + "【size】 : 크기 【Size】", + "【magnificationScale】 : 확대 배율 【double】", + "【focalPointOffset】: 확대 내용 오프셋 【Offset】", + "【decoration】: 장식 발견 【MagnifierDecoration】", + "【child】: 자식 컴포넌트 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "RawMagnifier 사용자 정의 장식 모양", + "desc": [ + "여기서 사용자 정의 오각형 장식 모양" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json new file mode 100644 index 00000000..fab2680d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Lupa Original", + "info": "Uma lupa que pode ampliar qualquer componente abaixo, com propriedades configuráveis como forma de decoração, tamanho, deslocamento, etc.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso simples do RawMagnifier", + "desc": [ + "【size】 : Tamanho 【Size】", + "【magnificationScale】 : Escala de ampliação 【double】", + "【focalPointOffset】: Deslocamento do conteúdo ampliado 【Offset】", + "【decoration】: Decoração descoberta 【MagnifierDecoration】", + "【child】: Componente filho 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Forma de decoração personalizada do RawMagnifier", + "desc": [ + "Aqui, personaliza-se a forma de decoração em estrela de cinco pontas" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json new file mode 100644 index 00000000..43de5b17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/RawMagnifier/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 360, + "name": "RawMagnifier", + "localName": "Исходная лупа", + "info": "Лупа, которая может увеличивать любой компонент под ней, можно настроить такие свойства, как форма декора, размер, смещение и т.д.", + "lever": 4, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Простое использование RawMagnifier", + "desc": [ + "【size】 : Размер 【Size】", + "【magnificationScale】 : Увеличение 【double】", + "【focalPointOffset】: Смещение увеличенного содержимого 【Offset】", + "【decoration】: Обнаружение декора 【MagnifierDecoration】", + "【child】: Дочерний компонент 【Widget?】," + ] + }, + { + "file": "node2_shape.dart", + "name": "Пользовательская форма декора RawMagnifier", + "desc": [ + "Здесь пользовательская форма декора в виде пятиконечной звезды" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json new file mode 100644 index 00000000..74eedc96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_de_DE.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Sicherheitsbereich", + "info": "Durch das Hinzufügen von Innenabständen werden Layoutprobleme angepasst, die durch die Besonderheiten einiger Handys (abgerundete Ecken, Notch-Display usw.) verursacht werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea Verwendungstest", + "desc": [ + "【left】 : Ob die linke Seite aktiviert ist 【bool】", + "【top】 : Ob die obere Seite aktiviert ist 【bool】", + "【bottom】 : Ob die untere Seite aktiviert ist 【bool】", + "【right】 : Ob die rechte Seite aktiviert ist 【bool】", + "【child】 : Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json new file mode 100644 index 00000000..e50a9b22 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_en_US.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Safe Area", + "info": "Adapts layout issues caused by some phone-specific features (rounded corners, notches, etc.) by adding padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea Usage Test", + "desc": [ + "【left】: Whether to enable the left side 【bool】", + "【top】: Whether to enable the top 【bool】", + "【bottom】: Whether to enable the bottom 【bool】", + "【right】: Whether to enable the right side 【bool】", + "【child】: Child widget 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json new file mode 100644 index 00000000..0f677038 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_es_ES.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Área segura", + "info": "Adapta los problemas de diseño causados por las características especiales de algunos teléfonos (esquinas redondeadas, muescas, etc.) mediante la adición de relleno.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Prueba de uso de SafeArea", + "desc": [ + "【left】 : Si está habilitado en el lado izquierdo 【bool】", + "【top】 : Si está habilitado en la parte superior 【bool】", + "【bottom】 : Si está habilitado en la parte inferior 【bool】", + "【right】 : Si está habilitado en el lado derecho 【bool】", + "【child】 : Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json new file mode 100644 index 00000000..dff12976 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_fr_FR.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Zone de sécurité", + "info": "Adapte les problèmes de mise en page causés par les particularités de certains téléphones (coins arrondis, encoche, etc.) en ajoutant des marges intérieures.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Test d'utilisation de SafeArea", + "desc": [ + "【left】 : Activer à gauche 【bool】", + "【top】 : Activer en haut 【bool】", + "【bottom】 : Activer en bas 【bool】", + "【right】 : Activer à droite 【bool】", + "【child】 : Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json new file mode 100644 index 00000000..b5327219 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_it_IT.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Area Sicura", + "info": "Adatta i problemi di layout causati da alcune caratteristiche speciali dei telefoni (angoli arrotondati, notch, ecc.) aggiungendo un padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Test di utilizzo di SafeArea", + "desc": [ + "【left】 : Se abilitare il lato sinistro 【bool】", + "【top】 : Se abilitare la parte superiore 【bool】", + "【bottom】 : Se abilitare la parte inferiore 【bool】", + "【right】 : Se abilitare il lato destro 【bool】", + "【child】 : Widget figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json new file mode 100644 index 00000000..f1b2021a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ja_JP.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "セーフエリア", + "info": "パディングを追加することで、一部のスマートフォンの特殊性(角丸、ノッチスクリーンなど)によるレイアウトの問題に対応します。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 使用テスト", + "desc": [ + "【left】 : 左側を有効にするか 【bool】", + "【top】 : 上部を有効にするか 【bool】", + "【bottom】 : 下部を有効にするか 【bool】", + "【right】 : 右側を有効にするか 【bool】", + "【child】 : 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json new file mode 100644 index 00000000..c9cd66af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ko_KR.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "안전 영역", + "info": "일부 휴대폰의 특수성(둥근 모서리, 노치 등)으로 인한 레이아웃 문제를 해결하기 위해 패딩을 추가합니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SafeArea 사용 테스트", + "desc": [ + "【left】 : 왼쪽 활성화 여부 【bool】", + "【top】 : 상단 활성화 여부 【bool】", + "【bottom】 : 하단 활성화 여부 【bool】", + "【right】 : 오른쪽 활성화 여부 【bool】", + "【child】 : 자식 위젯 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json new file mode 100644 index 00000000..40f34ada --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_pt_PT.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Área Segura", + "info": "Adapta problemas de layout causados por características especiais de alguns telemóveis (cantos arredondados, entalhes, etc.) através da adição de padding.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Teste de uso do SafeArea", + "desc": [ + "【left】 : Ativar à esquerda 【bool】", + "【top】 : Ativar no topo 【bool】", + "【bottom】 : Ativar na parte inferior 【bool】", + "【right】 : Ativar à direita 【bool】", + "【child】 : Componente filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json new file mode 100644 index 00000000..3b34bfc8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SafeArea/desc_ru_RU.json @@ -0,0 +1,22 @@ +{ + "id": 207, + "name": "SafeArea", + "localName": "Безопасная зона", + "info": "Путём добавления внутренних отступов адаптирует проблемы макета, вызванные особенностями некоторых телефонов (скруглённые углы, вырез для камеры и т.д.).", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Тестирование использования SafeArea", + "desc": [ + "【left】 : Включено ли слева 【bool】", + "【top】 : Включено ли сверху 【bool】", + "【bottom】 : Включено ли снизу 【bool】", + "【right】 : Включено ли справа 【bool】", + "【child】 : Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json new file mode 100644 index 00000000..360fd9ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Bildlaufansicht", + "info": "Diese Komponente wird zur Unterstützung des Scrollens verwendet. Diese Klasse ist eine abstrakte Klasse und kann daher nicht direkt verwendet werden. Sie hat viele Implementierungsklassen wie CustomScrollView, BoxScrollView, ListView und GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView Einführung", + "desc": [ + "【reverse】 : Ob umgekehrt 【bool】", + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【cacheExtent】 : Cache-Länge 【double】", + "【dragStartBehavior】 : Ziehverhalten 【DragStartBehavior】", + "【clipBehavior】 : Ausschneideverhalten 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json new file mode 100644 index 00000000..ba557c9b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Scroll View", + "info": "This component is used to support scrolling. This class is an abstract class, so it cannot be used directly. It has many implementation classes, such as CustomScrollView, BoxScrollView, ListView, and GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction to ScrollView", + "desc": [ + "【reverse】: Whether to reverse 【bool】", + "【scrollDirection】: Scroll direction 【Axis】", + "【cacheExtent】: Cache length 【double】", + "【dragStartBehavior】: Drag behavior 【DragStartBehavior】", + "【clipBehavior】: Clip behavior 【ClipBehavior】", + "【controller】: Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json new file mode 100644 index 00000000..11607c3f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Vista de desplazamiento", + "info": "Este componente se utiliza para soportar el desplazamiento, esta clase es una clase abstracta, por lo que no se puede usar directamente, tiene muchas clases de implementación, como CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introducción a ScrollView", + "desc": [ + "【reverse】 : Si es inverso 【bool】", + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【cacheExtent】 : Extensión de caché 【double】", + "【dragStartBehavior】 : Comportamiento de arrastre 【DragStartBehavior】", + "【clipBehavior】 : Comportamiento de recorte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json new file mode 100644 index 00000000..555f79b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Vue de défilement", + "info": "Ce composant est utilisé pour prendre en charge le défilement, cette classe est une classe abstraite, donc elle ne peut pas être utilisée directement, elle a de nombreuses classes d'implémentation, telles que CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduction à ScrollView", + "desc": [ + "【reverse】 : Inverser ou non 【bool】", + "【scrollDirection】 : Direction de défilement 【Axis】", + "【cacheExtent】 : Longueur de cache 【double】", + "【dragStartBehavior】 : Comportement de glissement 【DragStartBehavior】", + "【clipBehavior】 : Comportement de découpage 【ClipBehavior】", + "【controller】 : Contrôleur 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json new file mode 100644 index 00000000..8a725f26 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Scorrimento Vista", + "info": "Questo componente è utilizzato per supportare lo scorrimento, questa classe è una classe astratta, quindi non può essere utilizzata direttamente, ha molte classi di implementazione, come CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introduzione a ScrollView", + "desc": [ + "【reverse】 : Se inverso 【bool】", + "【scrollDirection】 : Direzione di scorrimento 【Axis】", + "【cacheExtent】 : Estensione della cache 【double】", + "【dragStartBehavior】 : Comportamento di trascinamento 【DragStartBehavior】", + "【clipBehavior】 : Comportamento di ritaglio 【ClipBehavior】", + "【controller】 : Controller 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json new file mode 100644 index 00000000..cfdd5527 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "スクロールビュー", + "info": "このコンポーネントはスクロールをサポートするために使用されます。このクラスは抽象クラスであるため、直接使用することはできません。CustomScrollView、BoxScrollView、ListView、GridViewなどの多くの実装クラスがあります。", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 紹介", + "desc": [ + "【reverse】 : 逆方向かどうか 【bool】", + "【scrollDirection】 : スクロール方向 【Axis】", + "【cacheExtent】 : キャッシュ長 【double】", + "【dragStartBehavior】 : ドラッグ動作 【DragStartBehavior】", + "【clipBehavior】 : クリップ動作 【ClipBehavior】", + "【controller】 : コントローラー 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json new file mode 100644 index 00000000..b9d21838 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "스크롤 뷰", + "info": "이 컴포넌트는 스크롤을 지원하기 위해 사용됩니다. 이 클래스는 추상 클래스이므로 직접 사용할 수 없으며, CustomScrollView, BoxScrollView, ListView, GridView와 같은 많은 구현 클래스가 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "ScrollView 소개", + "desc": [ + "【reverse】 : 역방향 여부 【bool】", + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【cacheExtent】 : 캐시 길이 【double】", + "【dragStartBehavior】 : 드래그 시작 동작 【DragStartBehavior】", + "【clipBehavior】 : 클리핑 동작 【ClipBehavior】", + "【controller】 : 컨트롤러 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json new file mode 100644 index 00000000..93d6fbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Rolagem de Visualização", + "info": "Este componente é usado para suporte de rolagem, esta classe é uma classe abstrata, portanto, não pode ser usada diretamente, tem muitas classes de implementação, como CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Introdução ao ScrollView", + "desc": [ + "【reverse】 : Se é reverso 【bool】", + "【scrollDirection】 : Direção de rolagem 【Axis】", + "【cacheExtent】 : Extensão do cache 【double】", + "【dragStartBehavior】 : Comportamento de arrasto 【DragStartBehavior】", + "【clipBehavior】 : Comportamento de corte 【ClipBehavior】", + "【controller】 : Controlador 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json new file mode 100644 index 00000000..6b6a0c11 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ScrollView/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 349, + "name": "ScrollView", + "localName": "Прокрутка", + "info": "Этот компонент используется для поддержки прокрутки. Этот класс является абстрактным, поэтому его нельзя использовать напрямую. У него есть много реализаций, таких как CustomScrollView, BoxScrollView, ListView, GridView.", + "lever": 2, + "family": 0, + "linkIds": [ + 183, + 162, + 163, + 253, + 340 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Введение в ScrollView", + "desc": [ + "【reverse】 : Обратный ли 【bool】", + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【cacheExtent】 : Длина кэша 【double】", + "【dragStartBehavior】 : Поведение перетаскивания 【DragStartBehavior】", + "【clipBehavior】 : Поведение обрезки 【ClipBehavior】", + "【controller】 : Контроллер 【ScrollController】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json new file mode 100644 index 00000000..b8fc3b81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Einfacher Dialog", + "info": "Eine einfache Dialogstruktur, die Kopf- und Mittelkomponenten angeben kann. Verfügt über Textstile und Ränder für Titel und Inhalt sowie Eigenschaften wie Schattentiefe und Form. Wird oft mit SimpleDialogOption verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SimpleDialog", + "desc": [ + "【title】 : Oberste Komponente 【Widget】", + "【children】 : Liste der Unterkomponenten 【List】", + "【titlePadding】 : Oberer Innenabstand 【EdgeInsetsGeometry】", + "【contentPadding】 : Innenabstand des Inhalts 【EdgeInsetsGeometry】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json new file mode 100644 index 00000000..7ed1afdf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Simple Dialog", + "info": "A simple dialog structure that allows specifying components for the header and middle sections. It has properties such as text styles and margins for the title and content, as well as shadow depth and shape. Often used in conjunction with SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SimpleDialog", + "desc": [ + "【title】 : Top component 【Widget】", + "【children】 : List of child components 【List】", + "【titlePadding】 : Top padding 【EdgeInsetsGeometry】", + "【contentPadding】 : Content padding 【EdgeInsetsGeometry】", + "【backgroundColor】 : Background color 【Color】", + "【elevation】 : Shadow depth 【double】", + "【shape】 : Shape 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json new file mode 100644 index 00000000..338649a3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Cuadro de diálogo simple", + "info": "Una estructura de cuadro de diálogo simple que permite especificar componentes en la parte superior y central. Tiene estilos de texto y márgenes para el título y el contenido, así como propiedades como profundidad de sombra, forma, etc. A menudo se usa junto con SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SimpleDialog", + "desc": [ + "【title】 : Componente superior 【Widget】", + "【children】 : Lista de componentes hijos 【List】", + "【titlePadding】 : Relleno superior 【EdgeInsetsGeometry】", + "【contentPadding】 : Relleno del contenido 【EdgeInsetsGeometry】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json new file mode 100644 index 00000000..a72754b5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Boîte de dialogue simple", + "info": "Une structure de boîte de dialogue simple qui permet de spécifier des composants pour l'en-tête et le corps. Elle possède des styles de texte pour le titre et le contenu, ainsi que des propriétés telles que les marges, la profondeur d'ombre, la forme, etc. Elle est souvent utilisée avec SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SimpleDialog", + "desc": [ + "【title】 : Composant supérieur 【Widget】", + "【children】 : Liste des composants enfants 【List】", + "【titlePadding】 : Marge intérieure supérieure 【EdgeInsetsGeometry】", + "【contentPadding】 : Marge intérieure du contenu 【EdgeInsetsGeometry】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur d'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json new file mode 100644 index 00000000..773932ec --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Finestra di dialogo semplice", + "info": "Una struttura di finestra di dialogo semplice che consente di specificare i componenti nella parte superiore e centrale. Possiede stili di testo e margini per titoli e contenuti, nonché proprietà come profondità dell'ombra, forma, ecc. Spesso utilizzato in combinazione con SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SimpleDialog", + "desc": [ + "【title】 : Componente superiore 【Widget】", + "【children】 : Lista dei componenti figli 【List】", + "【titlePadding】 : Spaziatura interna superiore 【EdgeInsetsGeometry】", + "【contentPadding】 : Spaziatura interna del contenuto 【EdgeInsetsGeometry】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json new file mode 100644 index 00000000..a75dac7b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "シンプルダイアログ", + "info": "シンプルなダイアログ構造で、ヘッダーと中央のコンポーネントを指定できます。タイトルと内容のテキストスタイルとマージン、影の深さ、形状などの属性を持っています。SimpleDialogOptionと一緒に使用されることが多いです。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogの基本使用", + "desc": [ + "【title】 : トップコンポーネント 【Widget】", + "【children】 : 子コンポーネントリスト 【List】", + "【titlePadding】 : トップパディング 【EdgeInsetsGeometry】", + "【contentPadding】 : コンテンツパディング 【EdgeInsetsGeometry】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json new file mode 100644 index 00000000..ceef0b96 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "간단한 대화 상자", + "info": "간단한 대화 상자 구조로, 상단과 중간의 컴포넌트를 지정할 수 있습니다. 제목, 내용의 텍스트 스타일과 여백, 그림자 깊이, 모양 등의 속성을 가지고 있습니다. 주로 SimpleDialogOption과 함께 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialog 기본 사용법", + "desc": [ + "【title】 : 상단 컴포넌트 【Widget】", + "【children】 : 하위 컴포넌트 리스트 【List】", + "【titlePadding】 : 상단 내부 여백 【EdgeInsetsGeometry】", + "【contentPadding】 : 내용 내부 여백 【EdgeInsetsGeometry】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json new file mode 100644 index 00000000..46bf6ca2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Diálogo Simples", + "info": "Uma estrutura de diálogo simples que permite especificar componentes no topo e no meio. Possui estilos de texto e margens para o título e conteúdo, além de propriedades como sombra, forma, etc. Geralmente usado em conjunto com SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SimpleDialog", + "desc": [ + "【title】 : Componente do topo 【Widget】", + "【children】 : Lista de componentes filhos 【List】", + "【titlePadding】 : Preenchimento interno do topo 【EdgeInsetsGeometry】", + "【contentPadding】 : Preenchimento interno do conteúdo 【EdgeInsetsGeometry】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade da sombra 【double】", + "【shape】 : Forma 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json new file mode 100644 index 00000000..f2e1b7fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialog/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 128, + "name": "SimpleDialog", + "localName": "Простое диалоговое окно", + "info": "Простая структура диалогового окна, которая позволяет указать компоненты в верхней и средней частях. Имеет стили текста и отступы для заголовка и содержимого, а также свойства, такие как глубина тени и форма. Часто используется вместе с SimpleDialogOption.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SimpleDialog", + "desc": [ + "【title】 : Верхний компонент 【Widget】", + "【children】 : Список дочерних компонентов 【List】", + "【titlePadding】 : Верхний отступ 【EdgeInsetsGeometry】", + "【contentPadding】 : Отступ содержимого 【EdgeInsetsGeometry】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json new file mode 100644 index 00000000..7af364aa --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_de_DE.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Einfache Dialogoption", + "info": "Eine Schaltfläche, die selten verwendet wird und normalerweise in SimpleDialog verwendet wird, um Klickereignisse zu empfangen.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SimpleDialogOption", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【onPressed】 : Klickereignis 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json new file mode 100644 index 00000000..b7c0cbbe --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_en_US.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Simple Dialog Option", + "info": "A button with limited use cases, typically used in SimpleDialog to receive click events.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SimpleDialogOption", + "desc": [ + "【child】 : Child widget 【Widget】", + "【onPressed】 : Click event 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json new file mode 100644 index 00000000..b7330359 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_es_ES.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opción de diálogo simple", + "info": "Un botón que se usa en pocas ocasiones, generalmente en SimpleDialog, que recibe eventos de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SimpleDialogOption", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【onPressed】 : Evento de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json new file mode 100644 index 00000000..7c182ece --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_fr_FR.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Option de boîte de dialogue simple", + "info": "Un bouton, rarement utilisé, généralement utilisé dans SimpleDialog, reçoit les événements de clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SimpleDialogOption", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【onPressed】 : Événement de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json new file mode 100644 index 00000000..0bc86c9e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_it_IT.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opzione del Dialogo Semplice", + "info": "Un pulsante, utilizzato raramente, solitamente all'interno di SimpleDialog, che riceve eventi di clic.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SimpleDialogOption", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【onPressed】 : Evento di clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json new file mode 100644 index 00000000..d8778257 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ja_JP.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "シンプルダイアログオプション", + "info": "ボタンで、使用シナリオが少なく、通常はSimpleDialogで使用され、クリックイベントを受け取ります。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOptionの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【onPressed】 : クリックイベント 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json new file mode 100644 index 00000000..09b02aa2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ko_KR.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "간단한 대화 상자 옵션", + "info": "버튼 하나, 사용 시나리오가 적으며 일반적으로 SimpleDialog에서 사용되며 클릭 이벤트를 수신합니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SimpleDialogOption 기본 사용", + "desc": [ + "【child】 : 자식 위젯 【Widget】", + "【onPressed】 : 클릭 이벤트 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json new file mode 100644 index 00000000..2c814d6a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_pt_PT.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Opção de Diálogo Simples", + "info": "Um botão, com poucos cenários de aplicação, geralmente usado em SimpleDialog, recebe eventos de clique.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico de SimpleDialogOption", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【onPressed】 : Evento de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json new file mode 100644 index 00000000..29af1777 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SimpleDialogOption/desc_ru_RU.json @@ -0,0 +1,19 @@ +{ + "id": 133, + "name": "SimpleDialogOption", + "localName": "Простая опция диалога", + "info": "Кнопка, которая редко используется, обычно используется в SimpleDialog, принимает событие нажатия.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SimpleDialogOption", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【onPressed】 : Событие нажатия 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json new file mode 100644 index 00000000..04b6d9d5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Einzelkind-Scrollen", + "info": "Ermöglicht einem Widget einen Scroll-Effekt, kann die Scroll-Richtung, ob umgekehrt, Scroll-Controller und andere Eigenschaften angeben.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SingleChildScrollView", + "desc": [ + "【child】 : Untergeordnetes Widget 【Widget】", + "【padding】 : Innenabstand 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scrollrichtung von SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Scrollrichtung 【Axis】", + "【reverse】 : Ob umgekehrt 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json new file mode 100644 index 00000000..ba8db73e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Single Child Scroll", + "info": "Makes a component scrollable, allowing you to specify properties such as the scroll direction, whether to reverse the direction, the scroll controller, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SingleChildScrollView", + "desc": [ + "【child】: Child widget 【Widget】", + "【padding】: Padding 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Scroll Direction of SingleChildScrollView", + "desc": [ + "【scrollDirection】: Scroll direction 【Axis】", + "【reverse】: Whether to reverse 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json new file mode 100644 index 00000000..3a31ff53 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Desplazamiento de un solo hijo", + "info": "Hace que un componente tenga un efecto de desplazamiento, y se pueden especificar propiedades como la dirección del desplazamiento, si es inverso, el controlador de desplazamiento, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SingleChildScrollView", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【padding】 : Relleno interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Dirección de desplazamiento de SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Dirección de desplazamiento 【Axis】", + "【reverse】 : Si es inverso 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json new file mode 100644 index 00000000..f38f7894 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Défilement à un seul enfant", + "info": "Permet à un composant d'avoir un effet de défilement, avec des propriétés telles que la direction du défilement, l'inversion, le contrôleur de défilement, etc.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SingleChildScrollView", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【padding】 : Marge intérieure 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direction de défilement de SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Direction de défilement 【Axis】", + "【reverse】 : Inversion 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json new file mode 100644 index 00000000..63f3993c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Scorrimento singolo figlio", + "info": "Rende un componente scorrevole, è possibile specificare la direzione di scorrimento, se invertire, il controller di scorrimento e altre proprietà.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SingleChildScrollView", + "desc": [ + "【child】 : componente figlio 【Widget】", + "【padding】 : spaziatura interna 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direzione di scorrimento di SingleChildScrollView", + "desc": [ + "【scrollDirection】 : direzione di scorrimento 【Axis】", + "【reverse】 : invertire 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json new file mode 100644 index 00000000..cd62f691 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "シングルチャイルドスクロール", + "info": "コンポーネントにスクロール効果を持たせ、スクロールの方向、反転、スクロールコントローラーなどのプロパティを指定できます。", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollViewの基本使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【padding】 : 内側の余白 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollViewのスクロール方向", + "desc": [ + "【scrollDirection】 : スクロール方向 【Axis】", + "【reverse】 : 反転するかどうか 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json new file mode 100644 index 00000000..a88236ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "단일 자식 스크롤", + "info": "컴포넌트에 스크롤 효과를 부여하며, 스크롤 방향, 반대 방향 여부, 스크롤 컨트롤러 등의 속성을 지정할 수 있습니다.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SingleChildScrollView 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【padding】 : 내부 여백 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "SingleChildScrollView 스크롤 방향", + "desc": [ + "【scrollDirection】 : 스크롤 방향 【Axis】", + "【reverse】 : 반대 방향 여부 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json new file mode 100644 index 00000000..2a8b62ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Deslizamento de Filho Único", + "info": "Torna um componente com efeito de deslizamento, podendo especificar a direção do deslizamento, se é reverso, controlador de deslizamento, entre outras propriedades.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SingleChildScrollView", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【padding】 : Preenchimento interno 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Direção de Deslizamento do SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Direção de deslizamento 【Axis】", + "【reverse】 : Se é reverso 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json new file mode 100644 index 00000000..04e9dc27 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SingleChildScrollView/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 164, + "name": "SingleChildScrollView", + "localName": "Одиночный скролл", + "info": "Делает компонент прокручиваемым, позволяет указать направление прокрутки, обратное направление, контроллер прокрутки и другие свойства.", + "lever": 5, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SingleChildScrollView", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【padding】 : Внутренний отступ 【EdgeInsetsGeometry】" + ] + }, + { + "file": "node2_direction.dart", + "name": "Направление прокрутки SingleChildScrollView", + "desc": [ + "【scrollDirection】 : Направление прокрутки 【Axis】", + "【reverse】 : Обратное направление 【Axis】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json new file mode 100644 index 00000000..bf007e81 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Informationsleiste", + "info": "Als Komponente handelt es sich um eine einfache Strukturkomponente, die Form, Schattentiefe, Hintergrundfarbe usw. angeben kann. Wird normalerweise über die showSnackBar-Methode von ScaffoldState von unten eingeblendet.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SnackBar", + "desc": [ + "【content】 : Mittleres Inhalts-Widget 【Widget】", + "【action】 : Rechte Schaltfläche 【SnackBarAction】", + "【duration】 : Dauer 【Widget】", + "【backgroundColor】 : Hintergrundfarbe 【Color】", + "【elevation】 : Schattentiefe 【double】", + "【shape】 : Form 【ShapeBorder】", + "【onVisible】 : Callback bei Anzeige 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json new file mode 100644 index 00000000..5b195a35 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "SnackBar", + "info": "As a component, it is a simple structural component that can specify shape, shadow depth, background color, etc. It usually pops up from the bottom through the showSnackBar method of ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SnackBar", + "desc": [ + "【content】: Middle content component 【Widget】", + "【action】: Right side button 【SnackBarAction】", + "【duration】: Duration 【Widget】", + "【backgroundColor】: Background color 【Color】", + "【elevation】: Shadow depth 【double】", + "【shape】: Shape 【ShapeBorder】", + "【onVisible】: Callback when shown 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json new file mode 100644 index 00000000..27dd24e4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra de información", + "info": "Como componente, es una estructura simple que puede especificar forma, profundidad de sombra, color de fondo, etc. Generalmente aparece desde la parte inferior a través del método showSnackBar de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SnackBar", + "desc": [ + "【content】 : Componente de contenido central 【Widget】", + "【action】 : Botón derecho 【SnackBarAction】", + "【duration】 : Duración 【Widget】", + "【backgroundColor】 : Color de fondo 【Color】", + "【elevation】 : Profundidad de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Devolución de llamada al mostrar 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json new file mode 100644 index 00000000..2c375ecd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barre d'information", + "info": "En tant que composant, il s'agit d'une structure simple qui peut spécifier la forme, l'ombre, la couleur de fond, etc. Généralement, il apparaît depuis le bas via la méthode showSnackBar de ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SnackBar", + "desc": [ + "【content】 : Composant de contenu central 【Widget】", + "【action】 : Bouton de droite 【SnackBarAction】", + "【duration】 : Durée 【Widget】", + "【backgroundColor】 : Couleur de fond 【Color】", + "【elevation】 : Profondeur de l'ombre 【double】", + "【shape】 : Forme 【ShapeBorder】", + "【onVisible】 : Rappel lors de l'affichage 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json new file mode 100644 index 00000000..9bb71deb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra di notifica", + "info": "Come componente, è una struttura semplice che può specificare forma, profondità dell'ombra, colore di sfondo, ecc. Generalmente viene visualizzato dal basso tramite il metodo showSnackBar di ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SnackBar", + "desc": [ + "【content】 : Componente del contenuto centrale 【Widget】", + "【action】 : Bottone a destra 【SnackBarAction】", + "【duration】 : Durata 【Widget】", + "【backgroundColor】 : Colore di sfondo 【Color】", + "【elevation】 : Profondità dell'ombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Callback quando viene visualizzato 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json new file mode 100644 index 00000000..8ec32e38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "情報提示バー", + "info": "コンポーネントとして簡単な構造コンポーネントで、形状、影の深さ、背景色などを指定できます。一般的にScaffoldStateのshowSnackBarメソッドを使用して下部から表示されます。", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarの基本使用", + "desc": [ + "【content】 : 中間内容コンポーネント 【Widget】", + "【action】 : 右側ボタン 【SnackBarAction】", + "【duration】 : 持続時間 【Widget】", + "【backgroundColor】 : 背景色 【Color】", + "【elevation】 : 影の深さ 【double】", + "【shape】 : 形状 【ShapeBorder】", + "【onVisible】 : 表示時のコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json new file mode 100644 index 00000000..9d084814 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "정보 알림 바", + "info": "컴포넌트로서는 간단한 구조 컴포넌트로, 모양, 그림자 깊이, 배경색 등을 지정할 수 있습니다. 일반적으로 ScaffoldState의 showSnackBar 메소드를 통해 하단에서 팝업됩니다.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBar 기본 사용", + "desc": [ + "【content】 : 중간 내용 컴포넌트 【Widget】", + "【action】 : 오른쪽 버튼 【SnackBarAction】", + "【duration】 : 지속 시간 【Widget】", + "【backgroundColor】 : 배경색 【Color】", + "【elevation】 : 그림자 깊이 【double】", + "【shape】 : 모양 【ShapeBorder】", + "【onVisible】 : 표시 시 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json new file mode 100644 index 00000000..8a888dd7 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Barra de Informação", + "info": "Como componente, é uma estrutura simples que pode especificar forma, profundidade de sombra, cor de fundo, etc. Geralmente é exibido a partir da parte inferior através do método showSnackBar do ScaffoldState.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SnackBar", + "desc": [ + "【content】 : Componente de conteúdo central 【Widget】", + "【action】 : Botão do lado direito 【SnackBarAction】", + "【duration】 : Duração 【Widget】", + "【backgroundColor】 : Cor de fundo 【Color】", + "【elevation】 : Profundidade de sombra 【double】", + "【shape】 : Forma 【ShapeBorder】", + "【onVisible】 : Callback ao exibir 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json new file mode 100644 index 00000000..cf0b478b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBar/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 140, + "name": "SnackBar", + "localName": "Информационная панель", + "info": "Как компонент, это простая структурная компонента, которая может указывать форму, глубину тени, цвет фона и т.д. Обычно вызывается методом showSnackBar из ScaffoldState, появляясь снизу.", + "lever": 4, + "family": 1, + "linkIds": [ + 141, + 142 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SnackBar", + "desc": [ + "【content】 : Промежуточный компонент содержимого 【Widget】", + "【action】 : Правая кнопка 【SnackBarAction】", + "【duration】 : Продолжительность 【Widget】", + "【backgroundColor】 : Цвет фона 【Color】", + "【elevation】 : Глубина тени 【double】", + "【shape】 : Форма 【ShapeBorder】", + "【onVisible】 : Обратный вызов при отображении 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json new file mode 100644 index 00000000..0d67865b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "SnackBar-Schaltfläche", + "info": "Wird im Allgemeinen nur in SnackBar verwendet, akzeptiert Klick-Ereignisse. Nach einem Klick wird die Schaltfläche deaktiviert, es können Farbe und deaktivierte Farbe angegeben werden.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von SnackBarAction", + "desc": [ + "【label】 : Beschriftung 【String】", + "【textColor】 : Textfarbe 【Color】", + "【disabledTextColor】 : Deaktivierte Textfarbe 【Color】", + "【onPressed】 : Klick-Rückruf 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json new file mode 100644 index 00000000..c5bb4f65 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Snack Bar Button", + "info": "Generally used only in SnackBar, accepts click events. The button will be disabled after one click, and the color and disabled color can be specified.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of SnackBarAction", + "desc": [ + "【label】 : Label 【String】", + "【textColor】 : Text Color 【Color】", + "【disabledTextColor】 : Disabled Text Color 【Color】", + "【onPressed】 : Click Callback 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json new file mode 100644 index 00000000..41e2e6d4 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Botón de barra de información", + "info": "Generalmente se usa solo en SnackBar, acepta eventos de clic. Después de hacer clic una vez, el botón se deshabilitará, se puede especificar el color y el color cuando está deshabilitado.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de SnackBarAction", + "desc": [ + "【label】 : Etiqueta 【String】", + "【textColor】 : Color del texto 【Color】", + "【disabledTextColor】 : Color del texto deshabilitado 【Color】", + "【onPressed】 : Callback de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json new file mode 100644 index 00000000..d87e8739 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Bouton de barre de message", + "info": "Généralement utilisé uniquement dans SnackBar, accepte les événements de clic. Après un clic, le bouton est désactivé, et vous pouvez spécifier la couleur et la couleur désactivée.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de SnackBarAction", + "desc": [ + "【label】 : Étiquette 【String】", + "【textColor】 : Couleur du texte 【Color】", + "【disabledTextColor】 : Couleur du texte désactivé 【Color】", + "【onPressed】 : Rappel de clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json new file mode 100644 index 00000000..1137e347 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Pulsante della barra di notifica", + "info": "Generalmente utilizzato solo in SnackBar, accetta eventi di clic. Dopo un clic, il pulsante viene disabilitato. È possibile specificare il colore e il colore quando è disabilitato.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di SnackBarAction", + "desc": [ + "【label】 : Etichetta 【String】", + "【textColor】 : Colore del testo 【Color】", + "【disabledTextColor】 : Colore del testo disabilitato 【Color】", + "【onPressed】 : Callback del clic 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json new file mode 100644 index 00000000..e36d851c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "スナックバーボタン", + "info": "一般的にSnackBarでのみ使用され、クリックイベントを受け取ります。一度クリックするとボタンは無効化され、色や無効時の色を指定できます。", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarActionの基本使用", + "desc": [ + "【label】 : ラベル 【String】", + "【textColor】 : 文字色 【Color】", + "【disabledTextColor】 : 無効時の文字色 【Color】", + "【onPressed】 : クリックコールバック 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json new file mode 100644 index 00000000..a20a1986 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "스낵바 버튼", + "info": "일반적으로 SnackBar에서만 사용되며, 클릭 이벤트를 수신합니다. 한 번 클릭하면 버튼이 비활성화되며, 색상과 비활성화 시 색상을 지정할 수 있습니다.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SnackBarAction 기본 사용법", + "desc": [ + "【label】 : 라벨 【String】", + "【textColor】 : 텍스트 색상 【Color】", + "【disabledTextColor】 : 텍스트 비활성화 색상 【Color】", + "【onPressed】 : 클릭 콜백 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json new file mode 100644 index 00000000..1c34e086 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Botão da Barra de Informações", + "info": "Geralmente usado apenas em SnackBar, aceita eventos de clique. Após um clique, o botão será desativado, e é possível especificar a cor e a cor quando desativado.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do SnackBarAction", + "desc": [ + "【label】 : Etiqueta 【String】", + "【textColor】 : Cor do texto 【Color】", + "【disabledTextColor】 : Cor do texto desativado 【Color】", + "【onPressed】 : Callback de clique 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json new file mode 100644 index 00000000..74e932e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SnackBarAction/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 141, + "name": "SnackBarAction", + "localName": "Кнопка информационной панели", + "info": "Обычно используется только в SnackBar, принимает события нажатия. После одного нажатия кнопка становится отключенной, можно указать цвет и цвет в отключенном состоянии.", + "lever": 1, + "family": 1, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование SnackBarAction", + "desc": [ + "【label】 : Метка 【String】", + "【textColor】 : Цвет текста 【Color】", + "【disabledTextColor】 : Цвет текста в отключенном состоянии 【Color】", + "【onPressed】 : Обратный вызов при нажатии 【Function()】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json new file mode 100644 index 00000000..0b33068d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_de_DE.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Raumkomponente", + "info": "Kann nur in Row-, Column- und Flex-Layouts verwendet werden. Nutzt den verbleibenden Platz als Platzhalter. Mit der flex-Eigenschaft kann der Platz für mehrere Spacer proportional zugeteilt werden.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Spacer", + "desc": [ + "Ein Spacer nimmt den erweiterbaren Bereich ein" + ] + }, + { + "file": "node2_flex.dart", + "name": "Raumzuweisung für mehrere Spacer", + "desc": [ + "【flex】 : Anteil der verbleibenden Raumzuweisung 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json new file mode 100644 index 00000000..7bee2cc6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_en_US.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Space Component", + "info": "Can only be used in Row, Column, and Flex layouts. It can occupy the remaining space. The flex property can be used to allocate space proportionally among multiple Spacers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Spacer", + "desc": [ + "A Spacer will occupy the extendable area" + ] + }, + { + "file": "node2_flex.dart", + "name": "Space Allocation with Multiple Spacers", + "desc": [ + "【flex】 : Proportion of remaining space allocation 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json new file mode 100644 index 00000000..11078f41 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_es_ES.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente de espacio", + "info": "Solo se puede usar en diseños de Row, Column y Flex. Puede ocupar el espacio restante. La propiedad flex permite distribuir el espacio entre múltiples Spacer en proporción.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Spacer", + "desc": [ + "Un Spacer ocupará el área extensible" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribución de espacio entre múltiples Spacer", + "desc": [ + "【flex】 : Proporción de distribución del espacio restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json new file mode 100644 index 00000000..bc465c76 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_fr_FR.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Composant d'espace", + "info": "Ne peut être utilisé que dans les dispositions Row, Column et Flex, il occupe l'espace restant. La propriété flex permet de distribuer l'espace entre plusieurs Spacer proportionnellement.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Spacer", + "desc": [ + "Un Spacer occupe une zone extensible" + ] + }, + { + "file": "node2_flex.dart", + "name": "Répartition de l'espace entre plusieurs Spacer", + "desc": [ + "【flex】 : Proportion de répartition de l'espace restant 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json new file mode 100644 index 00000000..a0e26430 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_it_IT.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente Spaziatore", + "info": "Può essere utilizzato solo nei layout Row, Column e Flex, occupa lo spazio rimanente e può distribuire lo spazio a più Spacer in proporzione utilizzando la proprietà flex.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Spacer", + "desc": [ + "Un Spacer occuperà l'area estensibile" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribuzione dello spazio con più Spacer", + "desc": [ + "【flex】 : percentuale di distribuzione dello spazio rimanente 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json new file mode 100644 index 00000000..2fc247f6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ja_JP.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "スペーサー", + "info": "Row、Column、Flexレイアウトでのみ使用可能で、残りのスペースを占めるために使用されます。flexプロパティを使用して、複数のSpacerに比例してスペースを分配できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacerの基本使用", + "desc": [ + "1つのSpacerが拡張可能な領域を占めます" + ] + }, + { + "file": "node2_flex.dart", + "name": "複数のSpacerスペース分配", + "desc": [ + "【flex】 : 残りのスペースの分配比率 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json new file mode 100644 index 00000000..a5c2cf17 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ko_KR.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "공간 컴포넌트", + "info": "Row, Column, Flex 레이아웃에서만 사용할 수 있으며, 남은 공간을 차지하는 데 사용됩니다. flex 속성을 사용하여 여러 Spacer에 비례적으로 공간을 배분할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Spacer 기본 사용", + "desc": [ + "하나의 Spacer가 확장 가능한 영역을 차지합니다" + ] + }, + { + "file": "node2_flex.dart", + "name": "여러 Spacer 공간 배분", + "desc": [ + "【flex】 : 남은 공간 배분 비율 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json new file mode 100644 index 00000000..e1bcb082 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_pt_PT.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Componente de Espaço", + "info": "Só pode ser usado em layouts Row, Column e Flex, pode ocupar espaço utilizando o espaço restante, e a propriedade flex pode distribuir espaço proporcionalmente para múltiplos Spacers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Spacer", + "desc": [ + "Um Spacer ocupará a área extensível" + ] + }, + { + "file": "node2_flex.dart", + "name": "Distribuição de Espaço para Múltiplos Spacers", + "desc": [ + "【flex】 : Proporção de distribuição do espaço restante 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json new file mode 100644 index 00000000..c75f90e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Spacer/desc_ru_RU.json @@ -0,0 +1,25 @@ +{ + "id": 107, + "name": "Spacer", + "localName": "Пространственный компонент", + "info": "Может использоваться только в макетах Row, Column и Flex, занимает оставшееся пространство. Свойство flex позволяет распределять пространство между несколькими Spacer пропорционально.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Spacer", + "desc": [ + "Один Spacer занимает расширяемую область" + ] + }, + { + "file": "node2_flex.dart", + "name": "Распределение пространства между несколькими Spacer", + "desc": [ + "【flex】 : Доля распределения оставшегося пространства 【int】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json new file mode 100644 index 00000000..568dbf54 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_de_DE.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Schalterkachel", + "info": "Eine allgemeine Listenstruktur, die von Flutter bereitgestellt wird, mit einer linken und mittleren Struktur und einem Schalter am Ende. Komponenten können an den entsprechenden Positionen eingefügt werden, um spezifische Einträge einfach zu handhaben.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Darstellung von SwitchListTile", + "desc": [ + "【secondary】: Linke Komponente 【Widget】", + "【title】: Obere mittlere Komponente 【Widget】", + "【subtitle】: Untere mittlere Komponente 【Widget】", + "【inactiveThumbColor】: Farbe des Kreises, wenn nicht ausgewählt 【Color】", + "【inactiveTrackColor】: Farbe der Schiene, wenn nicht ausgewählt 【Color】", + "【activeColor】: Farbe des Kreises, wenn ausgewählt 【Color】", + "【activeTrackColor】: Farbe der Schiene, wenn ausgewählt 【Color】", + "【onChanged】: Ereignis bei Auswahl 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Auswahleffekt von SwitchListTile", + "desc": [ + "【selected】: Ob ausgewählt 【bool】", + "【inactiveThumbImage】: Bild des Kreises, wenn nicht ausgewählt 【ImageProvider】", + "【activeThumbImage】: Bild des Kreises, wenn ausgewählt 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dichte Eigenschaft von SwitchListTile", + "desc": [ + "【dense】: Ob dicht 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json new file mode 100644 index 00000000..b0a879fb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_en_US.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Switch Tile", + "info": "A common list item structure provided by Flutter, with a left-center structure and a Switch at the end. Components can be inserted at the corresponding positions, making it easy to handle specific items.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic representation of SwitchListTile", + "desc": [ + "【secondary】: Left component 【Widget】", + "【title】: Top middle component 【Widget】", + "【subtitle】: Bottom middle component 【Widget】", + "【inactiveThumbColor】: Circle color when not selected 【Color】", + "【inactiveTrackColor】: Track color when not selected 【Color】", + "【activeColor】: Circle color when selected 【Color】", + "【activeTrackColor】: Track color when selected 【Color】", + "【onChanged】: Selection event 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Selection effect of SwitchListTile", + "desc": [ + "【selected】: Whether selected 【bool】", + "【inactiveThumbImage】: Circle image when not selected 【ImageProvider】", + "【activeThumbImage】: Circle image when selected 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Dense property of SwitchListTile", + "desc": [ + "【dense】: Whether dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json new file mode 100644 index 00000000..956f9c09 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_es_ES.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Interruptor de Lista", + "info": "Estructura de elemento de lista genérica proporcionada por Flutter, con una estructura de izquierda a centro y un Switch en la cola. Se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar elementos específicos de manera conveniente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "El comportamiento básico de SwitchListTile es el siguiente", + "desc": [ + "【secondary】: Componente izquierdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【inactiveThumbColor】: Color del círculo cuando no está seleccionado 【Color】", + "【inactiveTrackColor】: Color de la pista cuando no está seleccionado 【Color】", + "【activeColor】: Color del círculo cuando está seleccionado 【Color】", + "【activeTrackColor】: Color de la pista cuando está seleccionado 【Color】", + "【onChanged】: Evento de selección 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efecto de selección de SwitchListTile", + "desc": [ + "【selected】: Si está seleccionado 【bool】", + "【inactiveThumbImage】: Imagen del círculo cuando no está seleccionado 【ImageProvider】", + "【activeThumbImage】: Imagen del círculo cuando está seleccionado 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propiedad de densidad de SwitchListTile", + "desc": [ + "【dense】: Si está en modo denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json new file mode 100644 index 00000000..161512fc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_fr_FR.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Bouton de Commutation Tuile", + "info": "Une structure de liste générique fournie par Flutter, de structure gauche-centre, avec un Switch à la fin. Des composants peuvent être insérés aux positions correspondantes, ce qui permet de répondre facilement à des entrées spécifiques.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La performance de base de SwitchListTile est la suivante", + "desc": [ + "【secondary】: Composant gauche 【Widget】", + "【title】: Composant supérieur central 【Widget】", + "【subtitle】: Composant inférieur central 【Widget】", + "【inactiveThumbColor】: Couleur du cercle lorsqu'il n'est pas sélectionné 【Color】", + "【inactiveTrackColor】: Couleur de la piste lorsqu'elle n'est pas sélectionnée 【Color】", + "【activeColor】: Couleur du cercle lorsqu'il est sélectionné 【Color】", + "【activeTrackColor】: Couleur de la piste lorsqu'elle est sélectionnée 【Color】", + "【onChanged】: Événement de sélection 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effet de sélection de SwitchListTile", + "desc": [ + "【selected】: Est sélectionné 【bool】", + "【inactiveThumbImage】: Image du cercle lorsqu'il n'est pas sélectionné 【ImageProvider】", + "【activeThumbImage】: Image du cercle lorsqu'il est sélectionné 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriété de densité de SwitchListTile", + "desc": [ + "【dense】: Est dense 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json new file mode 100644 index 00000000..20b56b70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_it_IT.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Interruttore Piastrella", + "info": "Una struttura di elenco generica fornita da Flutter, con una struttura sinistra-centrale, e un interruttore alla fine. I componenti possono essere inseriti nelle posizioni appropriate, rendendo facile adattarsi a voci specifiche.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di SwitchListTile è la seguente", + "desc": [ + "【secondary】: Componente sinistro 【Widget】", + "【title】: Componente superiore centrale 【Widget】", + "【subtitle】: Componente inferiore centrale 【Widget】", + "【inactiveThumbColor】: Colore del cerchio quando non selezionato 【Color】", + "【inactiveTrackColor】: Colore della scanalatura quando non selezionato 【Color】", + "【activeColor】: Colore del cerchio quando selezionato 【Color】", + "【activeTrackColor】: Colore della scanalatura quando selezionato 【Color】", + "【onChanged】: Evento di selezione 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Effetto di selezione di SwitchListTile", + "desc": [ + "【selected】: Se selezionato 【bool】", + "【inactiveThumbImage】: Immagine del cerchio quando non selezionato 【ImageProvider】", + "【activeThumbImage】: Immagine del cerchio quando selezionato 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Proprietà di densità di SwitchListTile", + "desc": [ + "【dense】: Se denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json new file mode 100644 index 00000000..b7026233 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ja_JP.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "スイッチリストタイル", + "info": "Flutterが提供する汎用リスト項目構造で、左中構造で、末尾にSwitchがあります。対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTileの基本表現は以下の通りです", + "desc": [ + "【secondary】: 左側コンポーネント 【Widget】", + "【title】: 中央上コンポーネント 【Widget】", + "【subtitle】: 中央下コンポーネント 【Widget】", + "【inactiveThumbColor】: 未選択時の円の色 【Color】", + "【inactiveTrackColor】: 未選択時のスロットの色 【Color】", + "【activeColor】: 選択時の円の色 【Color】", + "【activeTrackColor】: 選択時のスロットの色 【Color】", + "【onChanged】: 選択イベント 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTileの選択効果", + "desc": [ + "【selected】: 選択されているかどうか 【bool】", + "【inactiveThumbImage】: 未選択時の円の画像 【ImageProvider】", + "【activeThumbImage】: 選択時の円の画像 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTileの密排属性", + "desc": [ + "【dense】: 密排かどうか 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json new file mode 100644 index 00000000..743c7513 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ko_KR.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "스위치 리스트 타일", + "info": "Flutter에서 제공하는 일반적인 리스트 항목 구조로, 왼쪽과 중앙 구조이며, 끝에는 스위치가 있습니다. 해당 위치에 컴포넌트를 삽입할 수 있어 특정 항목에 쉽게 대응할 수 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "SwitchListTile의 기본 표현은 다음과 같습니다", + "desc": [ + "【secondary】: 왼쪽 컴포넌트 【Widget】", + "【title】: 중앙 상단 컴포넌트 【Widget】", + "【subtitle】: 중앙 하단 컴포넌트 【Widget】", + "【inactiveThumbColor】: 선택되지 않았을 때 원 색상 【Color】", + "【inactiveTrackColor】: 선택되지 않았을 때 트랙 색상 【Color】", + "【activeColor】: 선택되었을 때 원 색상 【Color】", + "【activeTrackColor】: 선택되었을 때 트랙 색상 【Color】", + "【onChanged】: 선택 이벤트 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "SwitchListTile의 선택 효과", + "desc": [ + "【selected】: 선택 여부 【bool】", + "【inactiveThumbImage】: 선택되지 않았을 때 원 이미지 【ImageProvider】", + "【activeThumbImage】: 선택되었을 때 원 이미지 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "SwitchListTile의 밀집 속성", + "desc": [ + "【dense】: 밀집 여부 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json new file mode 100644 index 00000000..6e3af475 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_pt_PT.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Azulejo de Interruptor", + "info": "Uma estrutura de item de lista genérica fornecida pelo Flutter, com uma estrutura de esquerda para o meio, e um Switch no final. Componentes podem ser inseridos nas posições correspondentes, facilitando a adaptação a itens específicos.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A apresentação básica do SwitchListTile é a seguinte", + "desc": [ + "【secondary】: Componente esquerdo 【Widget】", + "【title】: Componente superior central 【Widget】", + "【subtitle】: Componente inferior central 【Widget】", + "【inactiveThumbColor】: Cor do círculo quando não selecionado 【Color】", + "【inactiveTrackColor】: Cor do trilho quando não selecionado 【Color】", + "【activeColor】: Cor do círculo quando selecionado 【Color】", + "【activeTrackColor】: Cor do trilho quando selecionado 【Color】", + "【onChanged】: Evento de seleção 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Efeito de seleção do SwitchListTile", + "desc": [ + "【selected】: Se está selecionado 【bool】", + "【inactiveThumbImage】: Imagem do círculo quando não selecionado 【ImageProvider】", + "【activeThumbImage】: Imagem do círculo quando selecionado 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Propriedade de densidade do SwitchListTile", + "desc": [ + "【dense】: Se é denso 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json new file mode 100644 index 00000000..e4e3d0ce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/SwitchListTile/desc_ru_RU.json @@ -0,0 +1,41 @@ +{ + "id": 18, + "name": "SwitchListTile", + "localName": "Переключатель плитки", + "info": "Общая структура элемента списка, предоставляемая Flutter, имеет лево-центральную структуру, а в конце находится Switch. Компоненты могут быть вставлены в соответствующие позиции, что позволяет легко адаптироваться к конкретным элементам.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное поведение SwitchListTile", + "desc": [ + "【secondary】: Левый компонент 【Widget】", + "【title】: Верхний центральный компонент 【Widget】", + "【subtitle】: Нижний центральный компонент 【Widget】", + "【inactiveThumbColor】: Цвет кружка в невыбранном состоянии 【Color】", + "【inactiveTrackColor】: Цвет дорожки в невыбранном состоянии 【Color】", + "【activeColor】: Цвет кружка в выбранном состоянии 【Color】", + "【activeTrackColor】: Цвет дорожки в выбранном состоянии 【Color】", + "【onChanged】: Событие выбора 【Function(bool)】" + ] + }, + { + "file": "node2_select.dart", + "name": "Эффект выбора SwitchListTile", + "desc": [ + "【selected】: Выбрано ли 【bool】", + "【inactiveThumbImage】: Изображение кружка в невыбранном состоянии 【ImageProvider】", + "【activeThumbImage】: Изображение кружка в выбранном состоянии 【ImageProvider】" + ] + }, + { + "file": "node3_dense.dart", + "name": "Свойство плотного расположения SwitchListTile", + "desc": [ + "【dense】: Плотное ли расположение 【bool】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json new file mode 100644 index 00000000..ee33c758 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_de_DE.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Tab", + "info": "Wird normalerweise für Items in der TabBar verwendet, hat eine obere und untere Struktur und kann ein Symbol und eine Inhaltskomponente angeben.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Tab", + "desc": [ + "【child】 : Untergeordnete Komponente 【Widget】", + "【text】 : Text 【String】", + "【icon】 : Untere Komponente 【Widgit】", + " text und child können nicht gleichzeitig existieren" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json new file mode 100644 index 00000000..f2574060 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_en_US.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Tab", + "info": "Generally used as an item in the TabBar, with a top-bottom structure, allowing the specification of an icon and a content component.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Tab", + "desc": [ + "【child】: Child component 【Widget】", + "【text】: Text 【String】", + "【icon】: Bottom component 【Widget】", + " text and child cannot exist simultaneously" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json new file mode 100644 index 00000000..926b3d31 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_es_ES.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Pestaña", + "info": "Generalmente se utiliza como un ítem en el TabBar, con una estructura de arriba hacia abajo, se puede especificar un ícono y un componente de contenido.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Tab", + "desc": [ + "【child】 : Componente hijo 【Widget】", + "【text】 : Texto 【String】", + "【icon】 : Componente inferior 【Widget】", + " text y child no pueden coexistir" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json new file mode 100644 index 00000000..0b4fde05 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_fr_FR.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Onglet", + "info": "Généralement utilisé comme élément dans une TabBar, structure verticale, peut spécifier une icône et un composant de contenu.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Tab", + "desc": [ + "【child】 : Composant enfant 【Widget】", + "【text】 : Texte 【String】", + "【icon】 : Composant inférieur 【Widgit】", + " text et child ne peuvent pas coexister" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json new file mode 100644 index 00000000..964a9f73 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_it_IT.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Scheda", + "info": "Generalmente utilizzato per gli elementi in TabBar, struttura verticale, può specificare un'icona e un componente di contenuto.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di Tab", + "desc": [ + "【child】 : Componente figlio 【Widget】", + "【text】 : Testo 【String】", + "【icon】 : Componente inferiore 【Widgit】", + " text e child non possono esistere contemporaneamente" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json new file mode 100644 index 00000000..0b432a21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ja_JP.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "タブ", + "info": "一般的にTabBarのアイテムとして使用され、上下構造で、アイコンとコンテンツコンポーネントを指定できます。", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Tabの基本的な使用", + "desc": [ + "【child】 : 子コンポーネント 【Widget】", + "【text】 : テキスト 【String】", + "【icon】 : 下部コンポーネント 【Widgit】", + " textとchildは同時に存在できません" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json new file mode 100644 index 00000000..2a2307ed --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ko_KR.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "탭", + "info": "일반적으로 TabBar의 항목으로 사용되며, 상하 구조로 아이콘과 내용 컴포넌트를 지정할 수 있습니다.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "탭 기본 사용법", + "desc": [ + "【child】 : 자식 컴포넌트 【Widget】", + "【text】 : 텍스트 【String】", + "【icon】 : 하단 컴포넌트 【Widget】", + " text와 child는 동시에 존재할 수 없습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json new file mode 100644 index 00000000..524a2d59 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_pt_PT.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Separador", + "info": "Geralmente utilizado como item na TabBar, com uma estrutura de cima para baixo, pode especificar um ícone e um componente de conteúdo.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico do Tab", + "desc": [ + "【child】 : Componente filho 【Widget】", + "【text】 : Texto 【String】", + "【icon】 : Componente inferior 【Widgit】", + " text e child não podem coexistir" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json new file mode 100644 index 00000000..c5eedc1c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Tab/desc_ru_RU.json @@ -0,0 +1,21 @@ +{ + "id": 148, + "name": "Tab", + "localName": "Вкладка", + "info": "Обычно используется как элемент в TabBar, имеет верхнюю и нижнюю структуру, может содержать иконку и компонент содержимого.", + "lever": 1, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Tab", + "desc": [ + "【child】 : Дочерний компонент 【Widget】", + "【text】 : Текст 【String】", + "【icon】 : Нижний компонент 【Widgit】", + " text и child не могут существовать одновременно" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json new file mode 100644 index 00000000..b6b2c857 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_de_DE.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Tab-Leiste", + "info": "Eine schiebbare und klickbare Tab-Leiste, die normalerweise am unteren Rand der AppBar verwendet wird. Kann mit TabBarView kombiniert werden, um den Effekt des Seitenwechselns zu erzielen.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Indikatorfarbe 【Indikatorfarbe】", + "【indicatorWeight】 : Indikatorhöhe 【double】", + "【indicatorPadding】 : Indikatorrand 【EdgeInsetsGeometry】", + "【labelStyle】 : Textstil der Registerkarte 【TextStyle】", + "【unselectedLabelStyle】 : Textstil der nicht ausgewählten Registerkarte 【TextStyle】", + "【isScrollable】 : Ob scrollbar 【bool】", + "【onTap】 : Rückruf beim Klicken auf die Registerkarte 【Function(int)】", + "【tabs】 : Tab-Komponenten 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Durch das Setzen von Theme kann der Wasserwelleneffekt vermieden werden", + "desc": [ + "Setzen Sie die Farbe der Wasserwelle in Theme auf transparent." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json new file mode 100644 index 00000000..88bd3cce --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_en_US.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Tab Bar", + "info": "A slidable and clickable tab bar, usually used at the bottom of the AppBar, can be used in conjunction with TabBarView to achieve a sliding page effect.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Indicator Color 【Indicator Color】", + "【indicatorWeight】 : Indicator Height 【double】", + "【indicatorPadding】 : Indicator Margin 【EdgeInsetsGeometry】", + "【labelStyle】 : Tab Text Style 【TextStyle】", + "【unselectedLabelStyle】 : Unselected Text Style 【TextStyle】", + "【isScrollable】 : Whether Scrollable 【bool】", + "【onTap】 : Tab Click Callback 【Function(int)】", + "【tabs】 : Tab Components 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Achieve No Ripple Effect by Setting Theme", + "desc": [ + "Set the ripple color in the Theme to transparent." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json new file mode 100644 index 00000000..1844c1b3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_es_ES.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra de pestañas", + "info": "Barra de pestañas deslizante y clicable, generalmente utilizada en la parte inferior de AppBar, se puede usar junto con TabBarView para lograr un efecto de deslizamiento de página.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorColor】 : Color del indicador 【Color del indicador】", + "【indicatorWeight】 : Altura del indicador 【double】", + "【indicatorPadding】 : Márgenes del indicador 【EdgeInsetsGeometry】", + "【labelStyle】 : Estilo del texto de la pestaña 【TextStyle】", + "【unselectedLabelStyle】 : Estilo del texto no seleccionado 【TextStyle】", + "【isScrollable】 : Deslizable 【bool】", + "【onTap】 : Callback al hacer clic en la pestaña 【Function(int)】", + "【tabs】 : Componentes de la pestaña 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Se puede lograr sin efecto de onda configurando Theme", + "desc": [ + "Simplemente configure el color de la onda en Theme como transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json new file mode 100644 index 00000000..330c9071 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_fr_FR.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barre d'onglets", + "info": "Barre d'onglets glissable et cliquable, généralement utilisée en bas de l'AppBar, peut être utilisée avec TabBarView pour réaliser un effet de glissement de page.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabBar", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【indicatorColor】 : Couleur de l'indicateur 【Couleur de l'indicateur】", + "【indicatorWeight】 : Hauteur de l'indicateur 【double】", + "【indicatorPadding】 : Marge de l'indicateur 【EdgeInsetsGeometry】", + "【labelStyle】 : Style de texte de l'onglet 【TextStyle】", + "【unselectedLabelStyle】 : Style de texte non sélectionné 【TextStyle】", + "【isScrollable】 : Peut être glissé 【bool】", + "【onTap】 : Rappel de clic sur l'onglet 【Function(int)】", + "【tabs】 : Composant d'onglet 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Réaliser sans ondulation en définissant Theme", + "desc": [ + "Définissez simplement la couleur de l'ondulation dans Theme comme transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json new file mode 100644 index 00000000..4245686a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_it_IT.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra delle schede", + "info": "Barra delle schede scorrevole e cliccabile, solitamente utilizzata nella parte inferiore dell'AppBar, può essere utilizzata insieme a TabBarView per ottenere l'effetto di scorrimento delle pagine.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TabBar", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorColor】 : Colore dell'indicatore 【Colore dell'indicatore】", + "【indicatorWeight】 : Altezza dell'indicatore 【double】", + "【indicatorPadding】 : Margine dell'indicatore 【EdgeInsetsGeometry】", + "【labelStyle】 : Stile del testo della scheda 【TextStyle】", + "【unselectedLabelStyle】 : Stile del testo non selezionato 【TextStyle】", + "【isScrollable】 : Scorrevole 【bool】", + "【onTap】 : Callback del clic sulla scheda 【Function(int)】", + "【tabs】 : Componenti delle schede 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Impostando il tema è possibile ottenere l'effetto senza ondulazione", + "desc": [ + "Basta impostare il colore dell'ondulazione nel tema su trasparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json new file mode 100644 index 00000000..47debc38 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ja_JP.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "タブバー", + "info": "スワイプやクリックが可能なタブバーで、通常はAppBarの下部に使用され、TabBarViewと連携してページをスワイプする効果を実現できます。", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBarの基本的な使用", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【indicatorColor】 : インジケーターの色 【インジケーターの色】", + "【indicatorWeight】 : インジケーターの高さ 【double】", + "【indicatorPadding】 : インジケーターの余白 【EdgeInsetsGeometry】", + "【labelStyle】 : タブのテキストスタイル 【TextStyle】", + "【unselectedLabelStyle】 : 未選択のテキストスタイル 【TextStyle】", + "【isScrollable】 : スワイプ可能かどうか 【bool】", + "【onTap】 : タブクリックのコールバック 【Function(int)】", + "【tabs】 : タブコンポーネント 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Themeを設定して水波紋を無効にする", + "desc": [ + "Themeの水波紋の色を透明に設定します。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json new file mode 100644 index 00000000..40400db9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ko_KR.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "탭 바", + "info": "탭 바를 스와이프하고 클릭할 수 있으며, 일반적으로 AppBar의 하단에 사용됩니다. TabBarView와 함께 사용하여 페이지 슬라이딩 효과를 구현할 수 있습니다.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabBar 기본 사용", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【indicatorColor】 : 인디케이터 색상 【인디케이터 색상】", + "【indicatorWeight】 : 인디케이터 높이 【double】", + "【indicatorPadding】 : 인디케이터 여백 【EdgeInsetsGeometry】", + "【labelStyle】 : 탭 텍스트 스타일 【TextStyle】", + "【unselectedLabelStyle】 : 선택되지 않은 텍스트 스타일 【TextStyle】", + "【isScrollable】 : 스와이프 가능 여부 【bool】", + "【onTap】 : 탭 클릭 콜백 【Function(int)】", + "【tabs】 : 탭 위젯 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Theme 설정을 통해 물결 효과 없이 구현", + "desc": [ + "Theme에서 물결 효과 색상을 투명으로 설정하면 됩니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json new file mode 100644 index 00000000..7105e793 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_pt_PT.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Barra de Etiquetas", + "info": "Barra de etiquetas deslizável e clicável, geralmente usada na parte inferior do AppBar, pode ser usada em conjunto com o TabBarView para alcançar o efeito de deslizar páginas.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabBar", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorColor】 : Cor do Indicador 【Cor do Indicador】", + "【indicatorWeight】 : Altura do Indicador 【double】", + "【indicatorPadding】 : Margem do Indicador 【EdgeInsetsGeometry】", + "【labelStyle】 : Estilo do Texto da Etiqueta 【TextStyle】", + "【unselectedLabelStyle】 : Estilo do Texto Não Selecionado 【TextStyle】", + "【isScrollable】 : Se é Deslizável 【bool】", + "【onTap】 : Callback de Clique na Etiqueta 【Function(int)】", + "【tabs】 : Componentes das Etiquetas 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Configuração do Theme para Eliminar Ondulações", + "desc": [ + "Defina a cor das ondulações no Theme como transparente." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json new file mode 100644 index 00000000..d0fad287 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabBar/desc_ru_RU.json @@ -0,0 +1,37 @@ +{ + "id": 58, + "name": "TabBar", + "localName": "Панель вкладок", + "info": "Скользящая и кликабельная панель вкладок, обычно используется в нижней части AppBar, может использоваться вместе с TabBarView для создания эффекта скользящих страниц.", + "lever": 3, + "family": 1, + "linkIds": [ + 57, + 59, + 148 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabBar", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【indicatorColor】 : Цвет индикатора 【Цвет индикатора】", + "【indicatorWeight】 : Высота индикатора 【double】", + "【indicatorPadding】 : Отступы индикатора 【EdgeInsetsGeometry】", + "【labelStyle】 : Стиль текста вкладки 【TextStyle】", + "【unselectedLabelStyle】 : Стиль текста невыбранной вкладки 【TextStyle】", + "【isScrollable】 : Возможность прокрутки 【bool】", + "【onTap】 : Обратный вызов при нажатии на вкладку 【Function(int)】", + "【tabs】 : Компоненты вкладок 【List】" + ] + }, + { + "file": "node2_noShadow.dart", + "name": "Реализация без водяных волн через настройку Theme", + "desc": [ + "Просто установите цвет водяных волн в Theme на прозрачный." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json new file mode 100644 index 00000000..96f33fc0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_de_DE.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Tab-Seitenwähler", + "info": "Wird normalerweise als Indikator in Verbindung mit TabBarView verwendet und teilt sich einen gemeinsamen TabController. Farbe, Größe und ausgewählte Farbe können angegeben werden.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Indikatorgröße 【double】", + "【selectedColor】: Ausgewählte Farbe 【Color】", + "【color】: Farbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json new file mode 100644 index 00000000..b56c2747 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_en_US.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Tab Sliding Selector", + "info": "Usually used as an indicator with TabBarView, sharing a common TabController. Can specify color, size, and selected color.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Indicator Size 【double】", + "【selectedColor】: Selected Color 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json new file mode 100644 index 00000000..734482d3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_es_ES.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Selector de pestañas deslizante", + "info": "Normalmente se utiliza como indicador junto con TabBarView, compartiendo un TabController. Se pueden especificar colores, tamaños y colores seleccionados.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabPageSelector", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorSize】: Tamaño del indicador 【double】", + "【selectedColor】: Color seleccionado 【Color】", + "【color】: Color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json new file mode 100644 index 00000000..21bef59b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_fr_FR.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Sélecteur de page à onglets", + "info": "Utilisé généralement comme indicateur avec TabBarView, partageant un TabController commun. Peut spécifier la couleur, la taille, la couleur sélectionnée.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabPageSelector", + "desc": [ + "【controller】 : Contrôleur 【TabController】", + "【indicatorSize】: Taille de l'indicateur 【double】", + "【selectedColor】: Couleur sélectionnée 【Color】", + "【color】: Couleur 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json new file mode 100644 index 00000000..ca2cb929 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_it_IT.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Selettore di scorrimento delle schede", + "info": "Utilizzato solitamente come indicatore insieme a TabBarView, condividendo un TabController. È possibile specificare colore, dimensione e colore selezionato.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso base di TabPageSelector", + "desc": [ + "【controller】 : Controller 【TabController】", + "【indicatorSize】: Dimensione dell'indicatore 【double】", + "【selectedColor】: Colore selezionato 【Color】", + "【color】: Colore 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json new file mode 100644 index 00000000..9457a660 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ja_JP.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "タブページセレクター", + "info": "通常、インジケーターとしてTabBarViewと連携して使用され、同じTabControllerを共有します。色、サイズ、選択色を指定できます。", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorの基本的な使用", + "desc": [ + "【controller】 : コントローラー 【TabController】", + "【indicatorSize】: インジケーターサイズ 【double】", + "【selectedColor】: 選択色 【Color】", + "【color】: 色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json new file mode 100644 index 00000000..0fe8b10b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ko_KR.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "탭 페이지 선택기", + "info": "일반적으로 지시자로 사용되며 TabBarView와 함께 사용되며, 동일한 TabController를 공유합니다. 색상, 크기, 선택된 색상을 지정할 수 있습니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelector 기본 사용", + "desc": [ + "【controller】 : 컨트롤러 【TabController】", + "【indicatorSize】: 지시자 크기 【double】", + "【selectedColor】: 선택된 색상 【Color】", + "【color】: 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json new file mode 100644 index 00000000..bc5a77ae --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_pt_PT.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Seletor de Deslizamento de Abas", + "info": "Geralmente usado como um indicador em conjunto com o TabBarView, compartilhando um TabController. Pode especificar cor, tamanho e cor de seleção.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabPageSelector", + "desc": [ + "【controller】 : Controlador 【TabController】", + "【indicatorSize】: Tamanho do Indicador 【double】", + "【selectedColor】: Cor de Seleção 【Color】", + "【color】: Cor 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json new file mode 100644 index 00000000..41d15336 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelector/desc_ru_RU.json @@ -0,0 +1,24 @@ +{ + "id": 205, + "name": "TabPageSelector", + "localName": "Выбор вкладок с прокруткой", + "info": "Обычно используется как индикатор вместе с TabBarView, используя общий TabController. Можно указать цвет, размер, цвет выбранного элемента.", + "lever": 2, + "family": 0, + "linkIds": [ + 206, + 59 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabPageSelector", + "desc": [ + "【controller】 : Контроллер 【TabController】", + "【indicatorSize】: Размер индикатора 【double】", + "【selectedColor】: Цвет выбранного элемента 【Color】", + "【color】: Цвет 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json new file mode 100644 index 00000000..4dcbc7e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Tab-Indikator", + "info": "Eine runde Komponente mit Randlinie, bei der Größe, Farbe und Randfarbe angegeben werden können. Es ist Teil des TabPageSelector und wird in der Regel nicht allein verwendet.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von TabPageSelectorIndicator", + "desc": [ + "【size】: Größe 【double】", + "【backgroundColor】: Hintergrundfarbe 【Color】", + "【borderColor】: Randfarbe 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json new file mode 100644 index 00000000..5394fb21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Tab Indicator", + "info": "A circular component with a border, which can specify size, color, and border color. It is part of the TabPageSelector and is generally not used alone.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of TabPageSelectorIndicator", + "desc": [ + "【size】: size 【double】", + "【backgroundColor】: background color 【Color】", + "【borderColor】: border color 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json new file mode 100644 index 00000000..66097176 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicador de selección de pestañas", + "info": "Un componente circular con bordes que puede especificar tamaño, color y color del borde. Es parte de TabPageSelector y generalmente no se usa por separado.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de TabPageSelectorIndicator", + "desc": [ + "【size】: Tamaño 【double】", + "【backgroundColor】: Color de fondo 【Color】", + "【borderColor】: Color del borde 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json new file mode 100644 index 00000000..cecf9563 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicateur d'onglet", + "info": "Un composant circulaire avec une bordure, pouvant spécifier la taille, la couleur et la couleur de la bordure. Fait partie du TabPageSelector, généralement non utilisé seul.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de TabPageSelectorIndicator", + "desc": [ + "【size】: Taille 【double】", + "【backgroundColor】: Couleur de fond 【Color】", + "【borderColor】: Couleur de la bordure 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json new file mode 100644 index 00000000..a5f7ce13 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicatore del selettore di pagine", + "info": "Un componente circolare con bordi, che può essere specificato per dimensioni, colore e colore del bordo. Fa parte del TabPageSelector e generalmente non viene utilizzato da solo.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di TabPageSelectorIndicator", + "desc": [ + "【size】: dimensione 【double】", + "【backgroundColor】: colore di sfondo 【Color】", + "【borderColor】: colore del bordo 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json new file mode 100644 index 00000000..df8e573c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "タブインジケーター", + "info": "枠線付きの円形コンポーネントで、サイズ、色、枠線の色を指定できます。TabPageSelectorの一部であり、通常は単独で使用しません。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicatorの基本使用", + "desc": [ + "【size】: サイズ 【double】", + "【backgroundColor】: 背景色 【Color】", + "【borderColor】: 枠線の色 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json new file mode 100644 index 00000000..482e0594 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "탭 페이지 선택기 표시기", + "info": "테두리가 있는 원형 컴포넌트로, 크기, 색상, 테두리 색상을 지정할 수 있습니다. TabPageSelector의 일부이며 일반적으로 단독으로 사용되지 않습니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "TabPageSelectorIndicator 기본 사용법", + "desc": [ + "【size】: 크기 【double】", + "【backgroundColor】: 배경색 【Color】", + "【borderColor】: 테두리 색상 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json new file mode 100644 index 00000000..f35b4ce9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Indicador de Seletor de Página", + "info": "Um componente circular com borda que pode especificar tamanho, cor e cor da borda. Faz parte do TabPageSelector e geralmente não é usado sozinho.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do TabPageSelectorIndicator", + "desc": [ + "【size】: Tamanho 【double】", + "【backgroundColor】: Cor de fundo 【Color】", + "【borderColor】: Cor da borda 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json new file mode 100644 index 00000000..c8ff63b0 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/TabPageSelectorIndicator/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 206, + "name": "TabPageSelectorIndicator", + "localName": "Индикатор вкладки", + "info": "Круглый компонент с границей, который можно настроить по размеру, цвету и цвету границы. Является частью TabPageSelector и обычно не используется отдельно.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование TabPageSelectorIndicator", + "desc": [ + "【size】: Размер 【double】", + "【backgroundColor】: Цвет фона 【Color】", + "【borderColor】: Цвет границы 【Color】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json new file mode 100644 index 00000000..15ee33b2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_de_DE.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Textkomponente", + "info": "Eine Komponente zur Anzeige von Text. Verfügt über eine Vielzahl von Eigenschaften, die Ihren Anforderungen gerecht werden. Der Kernstil wird durch das style-Attribut gesteuert.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Grundlegende Textstile", + "desc": [ + "【Parameter】 : Text 【String】", + "【style】: Textstil 【TextStyle】", + "【color】: Textfarbe 【Color】", + "【fontSize】: Textgröße 【double】", + "【fontWeight】: Schriftstärke 【FontWeight】", + "【fontStyle】: Schriftstil 【fontStyle】", + "【letterSpacing】: Zeichenabstand 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Textschatten", + "desc": [ + "【shadows】 : Text 【List】", + "【backgroundColor】: Hintergrundfarbe 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Textdekoration", + "desc": [ + "【fontFamily】 : Schriftart 【String】", + "【decoration】: Dekorationslinie 【TextDecoration】", + "【decorationColor】: Dekorationslinienfarbe 【Color】", + "【decorationThickness】: Dekorationsliniendicke 【double】", + "【decorationStyle】: Dekorationslinienstil 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Textausrichtung", + "desc": [ + "【textAlign】: Ausrichtung 【TextAlign】", + "Unten sind in der Reihenfolge: left, right, center, justify, start, end." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Textrichtung und maximale Zeilenanzahl", + "desc": [ + "【maxLines】 : Maximale Zeilenanzahl 【int】", + "【textDirection】 : Textrichtung 【TextDirection】", + "Unten sind in der Reihenfolge: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Zeilenumbruch und Überlaufverhalten", + "desc": [ + "【softWrap】 : Zeilenumbruch 【bool】", + "【overflow】 : Überlaufverhalten 【TextOverflow】", + "Unten softWrap=false; overflow in der Reihenfolge: clip, fade, ellipsis, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json new file mode 100644 index 00000000..cdfa6873 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_en_US.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Text Component", + "info": "A component used to display text. It has a wide range of properties to meet your usage needs, with core styles controlled by the style attribute.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Basic Text Styles", + "desc": [ + "【Parameter】 : Text 【String】", + "【style】: Text Style 【TextStyle】", + "【color】: Text Color 【Color】", + "【fontSize】: Font Size 【double】", + "【fontWeight】: Font Weight 【FontWeight】", + "【fontStyle】: Font Style 【fontStyle】", + "【letterSpacing】: Letter Spacing 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Text Shadow", + "desc": [ + "【shadows】 : Text Shadows 【List】", + "【backgroundColor】: Background Color 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Text Decoration", + "desc": [ + "【fontFamily】 : Font Family 【String】", + "【decoration】: Decoration Line 【TextDecoration】", + "【decorationColor】: Decoration Line Color 【Color】", + "【decorationThickness】: Decoration Line Thickness 【double】", + "【decorationStyle】: Decoration Line Style 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Text Alignment", + "desc": [ + "【textAlign】: Alignment 【TextAlign】", + "The following are: left, right, center, justify, start, end." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Text Direction and Maximum Lines", + "desc": [ + "【maxLines】 : Maximum Lines 【int】", + "【textDirection】 : Text Direction 【TextDirection】", + "The following are: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Wrapping and Overflow Effects", + "desc": [ + "【softWrap】 : Whether to Wrap 【bool】", + "【overflow】 : Overflow Effect 【TextOverflow】", + "When softWrap=false; overflow options are: clip, fade, ellipsis, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json new file mode 100644 index 00000000..57bfe77b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_es_ES.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente de texto", + "info": "Componente utilizado para mostrar texto. Tiene una gran cantidad de propiedades, suficientes para satisfacer tus necesidades de uso. El estilo principal está controlado por la propiedad style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Estilo básico del texto", + "desc": [ + "【Parámetro de entrada】 : Texto 【String】", + "【style】: Estilo del texto 【TextStyle】", + "【color】: Color del texto 【Color】", + "【fontSize】: Tamaño del texto 【double】", + "【fontWeight】: Peso de la fuente 【FontWeight】", + "【fontStyle】: Estilo de la fuente 【fontStyle】", + "【letterSpacing】: Espaciado entre letras 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Sombra del texto", + "desc": [ + "【shadows】 : Sombra del texto 【List】", + "【backgroundColor】: Color de fondo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Línea decorativa del texto", + "desc": [ + "【fontFamily】 : Fuente del texto 【String】", + "【decoration】: Línea decorativa 【TextDecoration】", + "【decorationColor】: Color de la línea decorativa 【Color】", + "【decorationThickness】: Grosor de la línea decorativa 【double】", + "【decorationStyle】: Estilo de la línea decorativa 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alineación del texto", + "desc": [ + "【textAlign】: Alineación del texto 【TextAlign】", + "A continuación se muestran en orden: izquierda, derecha, centro, justificado, inicio, final." + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Dirección del texto y número máximo de líneas", + "desc": [ + "【maxLines】 : Número máximo de líneas 【int】", + "【textDirection】 : Dirección del texto 【TextDirection】", + "A continuación se muestran en orden: rtl, ltr." + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Ajuste de línea y efecto de desbordamiento", + "desc": [ + "【softWrap】 : Ajuste de línea 【bool】", + "【overflow】 : Efecto de desbordamiento 【TextOverflow】", + "A continuación softWrap=false; overflow en orden: recortar, desvanecer, puntos suspensivos, visible." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json new file mode 100644 index 00000000..650db5af --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_fr_FR.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Composant de texte", + "info": "Un composant pour afficher du texte. Possède de nombreuses propriétés, suffisantes pour répondre à vos besoins d'utilisation. Les styles de base sont contrôlés par l'attribut style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Style de base du texte", + "desc": [ + "【Paramètre】 : Texte 【String】", + "【style】: Style du texte 【TextStyle】", + "【color】: Couleur du texte 【Color】", + "【fontSize】: Taille du texte 【double】", + "【fontWeight】: Poids de la police 【FontWeight】", + "【fontStyle】: Style de la police 【fontStyle】", + "【letterSpacing】: Espacement des lettres 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Ombre du texte", + "desc": [ + "【shadows】 : Texte 【List】", + "【backgroundColor】: Couleur de fond 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Ligne de décoration du texte", + "desc": [ + "【fontFamily】 : Police du texte 【String】", + "【decoration】: Ligne de décoration 【TextDecoration】", + "【decorationColor】: Couleur de la ligne de décoration 【Color】", + "【decorationThickness】: Épaisseur de la ligne de décoration 【double】", + "【decorationStyle】: Style de la ligne de décoration 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alignement du texte", + "desc": [ + "【textAlign】: Alignement 【TextAlign】", + "Les options suivantes sont : left, right, center, justify, start, end" + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direction du texte et nombre maximum de lignes", + "desc": [ + "【maxLines】 : Nombre maximum de lignes 【int】", + "【textDirection】 : Direction du texte 【TextDirection】", + "Les options suivantes sont : rtl, ltr" + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Retour à la ligne et effet de débordement", + "desc": [ + "【softWrap】 : Retour à la ligne 【bool】", + "【overflow】 : Effet de débordement 【TextOverflow】", + "Si softWrap=false; les options overflow sont : clip, fade, ellipsis, visible" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json new file mode 100644 index 00000000..18a546bb --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_it_IT.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente di testo", + "info": "Componente per visualizzare il testo. Possiede molte proprietà, sufficienti per soddisfare le tue esigenze di utilizzo. Lo stile principale è controllato dalla proprietà style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Stile di base del testo", + "desc": [ + "【Parametro】 : Testo 【String】", + "【style】: Stile del testo 【TextStyle】", + "【color】: Colore del testo 【Color】", + "【fontSize】: Dimensione del testo 【double】", + "【fontWeight】: Peso del carattere 【FontWeight】", + "【fontStyle】: Stile del carattere 【fontStyle】", + "【letterSpacing】: Spaziatura tra i caratteri 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Ombreggiatura del testo", + "desc": [ + "【shadows】 : Ombre del testo 【List】", + "【backgroundColor】: Colore di sfondo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Linea decorativa del testo", + "desc": [ + "【fontFamily】 : Famiglia del carattere 【String】", + "【decoration】: Linea decorativa 【TextDecoration】", + "【decorationColor】: Colore della linea decorativa 【Color】", + "【decorationThickness】: Spessore della linea decorativa 【double】", + "【decorationStyle】: Stile della linea decorativa 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Allineamento del testo", + "desc": [ + "【textAlign】: Allineamento 【TextAlign】", + "Di seguito in ordine: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direzione del testo e numero massimo di righe", + "desc": [ + "【maxLines】 : Numero massimo di righe 【int】", + "【textDirection】 : Direzione del testo 【TextDirection】", + "Di seguito in ordine: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "A capo automatico ed effetto di overflow", + "desc": [ + "【softWrap】 : A capo automatico 【bool】", + "【overflow】 : Effetto di overflow 【TextOverflow】", + "Di seguito softWrap=false; overflow in ordine: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json new file mode 100644 index 00000000..80209a30 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ja_JP.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "テキストコンポーネント", + "info": "テキストを表示するためのコンポーネントです。多くの属性を持っており、あなたの使用ニーズを十分に満たすことができます。コアのスタイルはstyle属性によって制御されます。", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "テキストの基本スタイル", + "desc": [ + "【入参】 : テキスト 【String】", + "【style】: テキストスタイル 【TextStyle】", + "【color】: テキストカラー 【Color】", + "【fontSize】: テキストサイズ 【double】", + "【fontWeight】: フォントの太さ 【FontWeight】", + "【fontStyle】: フォントスタイル 【fontStyle】", + "【letterSpacing】: 文字間隔 【double】" + ] + }, + { + "file": "node2.dart", + "name": "テキストシャドウ", + "desc": [ + "【shadows】 : テキスト 【List】", + "【backgroundColor】: 背景色 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "テキスト装飾線", + "desc": [ + "【fontFamily】 : テキストフォント 【String】", + "【decoration】: 装飾線 【TextDecoration】", + "【decorationColor】: 装飾線の色 【Color】", + "【decorationThickness】: 装飾線の太さ 【double】", + "【decorationStyle】: 装飾線のスタイル 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "テキストの配置", + "desc": [ + "【textAlign】: 配置 【TextAlign】", + "以下は順に:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "テキストの方向と最大行数", + "desc": [ + "【maxLines】 : 最大行数 【int】", + "【textDirection】 : テキストの方向 【TextDirection】", + "以下は順に:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "折り返しとオーバーフロー効果", + "desc": [ + "【softWrap】 : 折り返し 【bool】", + "【overflow】 : オーバーフロー効果 【TextOverflow】", + "以下softWrap=false; overflowは順に:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json new file mode 100644 index 00000000..875691c2 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ko_KR.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "텍스트 컴포넌트", + "info": "텍스트를 표시하는 데 사용되는 컴포넌트. 매우 많은 속성을 가지고 있어 사용자의 요구를 충족시킬 수 있으며, 핵심 스타일은 style 속성에 의해 제어됩니다.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "텍스트의 기본 스타일", + "desc": [ + "【입력 매개변수】 : 텍스트 【String】", + "【style】: 텍스트 스타일 【TextStyle】", + "【color】: 텍스트 색상 【Color】", + "【fontSize】: 텍스트 크기 【double】", + "【fontWeight】: 글자 두께 【FontWeight】", + "【fontStyle】: 글자 스타일 【fontStyle】", + "【letterSpacing】: 글자 간격 【double】" + ] + }, + { + "file": "node2.dart", + "name": "텍스트 그림자", + "desc": [ + "【shadows】 : 텍스트 【List】", + "【backgroundColor】: 배경 색상 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "텍스트 장식선", + "desc": [ + "【fontFamily】 : 텍스트 글꼴 【String】", + "【decoration】: 장식선 【TextDecoration】", + "【decorationColor】: 장식선 색상 【Color】", + "【decorationThickness】: 장식선 두께 【double】", + "【decorationStyle】: 장식선 스타일 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "텍스트 정렬 방식", + "desc": [ + "【textAlign】: 정렬 방식 【TextAlign】", + "아래는 순서대로:left、right、center、justify、start、end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "텍스트 방향과 최대 줄 수", + "desc": [ + "【maxLines】 : 최대 줄 수 【int】", + "【textDirection】 : 텍스트 방향 【TextDirection】", + "아래는 순서대로:rtl、ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "줄바꿈 여부와 넘침 효과", + "desc": [ + "【softWrap】 : 줄바꿈 여부 【bool】", + "【overflow】 : 넘침 효과 【TextOverflow】", + "아래 softWrap=false; overflow는 순서대로:clip、fade、ellipsis、visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json new file mode 100644 index 00000000..4a9489c8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_pt_PT.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Componente de Texto", + "info": "Componente utilizado para exibir texto. Possui uma grande quantidade de atributos, suficientes para atender às suas necessidades de uso. O estilo principal é controlado pelo atributo style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Estilo Básico do Texto", + "desc": [ + "【Parâmetro de Entrada】 : Texto 【String】", + "【style】: Estilo do Texto 【TextStyle】", + "【color】: Cor do Texto 【Color】", + "【fontSize】: Tamanho do Texto 【double】", + "【fontWeight】: Peso da Fonte 【FontWeight】", + "【fontStyle】: Estilo da Fonte 【fontStyle】", + "【letterSpacing】: Espaçamento entre Letras 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Sombra do Texto", + "desc": [ + "【shadows】 : Sombra do Texto 【List】", + "【backgroundColor】: Cor de Fundo 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Linha de Decoração do Texto", + "desc": [ + "【fontFamily】 : Fonte do Texto 【String】", + "【decoration】: Linha de Decoração 【TextDecoration】", + "【decorationColor】: Cor da Linha de Decoração 【Color】", + "【decorationThickness】: Espessura da Linha de Decoração 【double】", + "【decorationStyle】: Estilo da Linha de Decoração 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Alinhamento do Texto", + "desc": [ + "【textAlign】: Alinhamento 【TextAlign】", + "A seguir estão: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Direção do Texto e Número Máximo de Linhas", + "desc": [ + "【maxLines】 : Número Máximo de Linhas 【int】", + "【textDirection】 : Direção do Texto 【TextDirection】", + "A seguir estão: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Quebra de Linha e Efeito de Transbordamento", + "desc": [ + "【softWrap】 : Quebra de Linha 【bool】", + "【overflow】 : Efeito de Transbordamento 【TextOverflow】", + "A seguir, softWrap=false; overflow são: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json new file mode 100644 index 00000000..49244210 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Text/desc_ru_RU.json @@ -0,0 +1,72 @@ +{ + "id": 2, + "name": "Text", + "localName": "Текстовый компонент", + "info": "Компонент для отображения текста. Имеет множество свойств, достаточных для удовлетворения ваших потребностей. Основные стили управляются свойством style.", + "lever": 5, + "family": 0, + "linkIds": [ + 101, + 324 + ], + "nodes": [ + { + "file": "node1.dart", + "name": "Основные стили текста", + "desc": [ + "【Входные параметры】 : текст 【String】", + "【style】: стиль текста 【TextStyle】", + "【color】: цвет текста 【Color】", + "【fontSize】: размер текста 【double】", + "【fontWeight】: толщина шрифта 【FontWeight】", + "【fontStyle】: стиль шрифта 【fontStyle】", + "【letterSpacing】: межбуквенный интервал 【double】" + ] + }, + { + "file": "node2.dart", + "name": "Тень текста", + "desc": [ + "【shadows】 : тень текста 【List】", + "【backgroundColor】: цвет фона 【Color】" + ] + }, + { + "file": "node3_decoration.dart", + "name": "Декоративные линии текста", + "desc": [ + "【fontFamily】 : шрифт текста 【String】", + "【decoration】: декоративная линия 【TextDecoration】", + "【decorationColor】: цвет декоративной линии 【Color】", + "【decorationThickness】: толщина декоративной линии 【double】", + "【decorationStyle】: стиль декоративной линии 【TextDecorationStyle】" + ] + }, + { + "file": "node4_textAlign.dart", + "name": "Выравнивание текста", + "desc": [ + "【textAlign】: выравнивание 【TextAlign】", + "Ниже приведены: left, right, center, justify, start, end," + ] + }, + { + "file": "node5_textDirection.dart", + "name": "Направление текста и максимальное количество строк", + "desc": [ + "【maxLines】 : максимальное количество строк 【int】", + "【textDirection】 : направление текста 【TextDirection】", + "Ниже приведены: rtl, ltr," + ] + }, + { + "file": "node6_softWrap.dart", + "name": "Перенос строк и эффект переполнения", + "desc": [ + "【softWrap】 : перенос строк 【bool】", + "【overflow】 : эффект переполнения 【TextOverflow】", + "Ниже softWrap=false; overflow: clip, fade, ellipsis, visible," + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json new file mode 100644 index 00000000..20ae58b1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_de_DE.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Thema", + "info": "Sie können das ThemeData-Objekt über Theme.of abrufen. Sie können auch ein Thema angeben, das auf die Nachkommenkomponenten von Theme angewendet wird.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Textstil-ThemeData#TextTheme", + "desc": [ + "Untergeordnete Komponenten können die Daten des Themas über ThemeData.of abrufen und verwenden." + ] + }, + { + "file": "node2_use.dart", + "name": "Verwendung von Theme", + "desc": [ + "Mit Theme können Sie sehr viele Attribute als Thema angeben, die auf alle Nachkommenkomponenten angewendet werden, wie z. B. Schriftarten, Schieberegler, Karten, Text, Trennlinien, Schaltflächen usw." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json new file mode 100644 index 00000000..f3fe2ebd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_en_US.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Theme", + "info": "You can obtain the ThemeData object through Theme.of. You can also specify a theme to be applied to the descendant components of Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Text Style-ThemeData#TextTheme", + "desc": [ + "Child components can use the theme data obtained through ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Usage of Theme", + "desc": [ + "Using Theme, you can specify a wide range of properties as themes, which will be applied to all descendant components, such as specifying properties for fonts, sliders, cards, text, dividers, buttons, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json new file mode 100644 index 00000000..98494e70 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_es_ES.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Puedes obtener el objeto ThemeData a través de Theme.of. También puedes especificar un tema para aplicarlo a los componentes descendientes de Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-ThemeData#TextTheme", + "desc": [ + "Los componentes secundarios pueden obtener y utilizar los datos del tema a través de ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso de Theme", + "desc": [ + "Usando Theme, puedes especificar una gran cantidad de atributos como tema, que se aplicarán a todos los componentes descendientes, como la fuente, el control deslizante, la tarjeta, el texto, el divisor, el botón, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json new file mode 100644 index 00000000..251f1696 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_fr_FR.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Thème", + "info": "Vous pouvez obtenir l'objet ThemeData via Theme.of. Vous pouvez également spécifier un thème à appliquer aux composants descendants de Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Style de texte-ThemeData#TextTheme", + "desc": [ + "Les composants enfants peuvent obtenir les données du thème via ThemeData.of pour les utiliser." + ] + }, + { + "file": "node2_use.dart", + "name": "Utilisation de Theme", + "desc": [ + "En utilisant Theme, vous pouvez spécifier de nombreuses propriétés comme thème, ces propriétés seront appliquées à tous les composants descendants, comme la police, le curseur, la carte, le texte, la ligne de séparation, le bouton, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json new file mode 100644 index 00000000..6d2dc6e5 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_it_IT.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Puoi ottenere l'oggetto ThemeData tramite Theme.of. Puoi anche specificare un tema da applicare ai componenti discendenti di Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Stile del testo-ThemeData#TextTheme", + "desc": [ + "I componenti figli possono ottenere i dati del tema tramite ThemeData.of e utilizzarli." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso di Theme", + "desc": [ + "Utilizzando Theme, puoi specificare molte proprietà come tema, che verranno applicate a tutti i componenti discendenti, come font, slider, card, testo, linee divisorie, pulsanti, ecc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json new file mode 100644 index 00000000..07b34e75 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ja_JP.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "テーマ", + "info": "Theme.ofを使用してThemeDataオブジェクトを取得できます。また、テーマをThemeの子孫コンポーネントに適用することもできます。", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "テキストスタイル-ThemeData#TextTheme", + "desc": [ + "子コンポーネントはThemeData.ofを使用してテーマのデータを取得して使用できます。" + ] + }, + { + "file": "node2_use.dart", + "name": "Themeの使い方", + "desc": [ + "Themeを使用すると、フォント、スライダー、カード、テキスト、分割線、ボタンなどの属性をテーマとして指定でき、これらの属性はすべての子孫コンポーネントに適用されます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json new file mode 100644 index 00000000..37621065 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ko_KR.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "테마", + "info": "Theme.of를 통해 ThemeData 객체를 얻을 수 있습니다. 또한 테마를 지정하여 Theme의 하위 구성 요소에 적용할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "텍스트 스타일-ThemeData#TextTheme", + "desc": [ + "하위 구성 요소는 ThemeData.of를 통해 테마 데이터를 얻어 사용할 수 있습니다." + ] + }, + { + "file": "node2_use.dart", + "name": "Theme 사용법", + "desc": [ + "Theme를 사용하면 매우 많은 속성을 테마로 지정할 수 있으며, 이러한 속성은 모든 하위 구성 요소에 적용됩니다. 예를 들어 글꼴, 슬라이더, 카드, 텍스트, 구분선, 버튼 등의 속성을 지정할 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json new file mode 100644 index 00000000..60fcfb4a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_pt_PT.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Tema", + "info": "Pode obter o objeto ThemeData através de Theme.of. Também pode especificar um tema para ser aplicado aos componentes descendentes do Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Estilo de texto-ThemeData#TextTheme", + "desc": [ + "Os componentes filhos podem obter e usar os dados do tema através de ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Uso do Theme", + "desc": [ + "Ao usar Theme, pode especificar uma grande variedade de propriedades como tema, que serão aplicadas a todos os componentes descendentes, como fonte, slider, cartão, texto, divisor, botão, etc." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json new file mode 100644 index 00000000..188d286f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Theme/desc_ru_RU.json @@ -0,0 +1,29 @@ +{ + "id": 168, + "name": "Theme", + "localName": "Тема", + "info": "Можно получить объект ThemeData через Theme.of. Также можно указать тему для применения к дочерним компонентам Theme.", + "lever": 4, + "family": 0, + "linkIds": [ + 65, + 169, + 224 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Текстовые стили - ThemeData#TextTheme", + "desc": [ + "Дочерние компоненты могут использовать данные темы, полученные через ThemeData.of." + ] + }, + { + "file": "node2_use.dart", + "name": "Использование Theme", + "desc": [ + "Используя Theme, можно указать множество свойств в качестве темы, которые будут применены ко всем дочерним компонентам, таким как шрифты, ползунки, карточки, текст, разделители, кнопки и т.д." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json new file mode 100644 index 00000000..6f58c0b6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_de_DE.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Anwendungsname", + "info": "Diese Komponente wird verwendet, um den Namen der App im Betriebssystem zu beschreiben. Die Auswirkungen können in der Anwendungsleiste gesehen werden. Die Quelle des Effekts des title-Felds in MaterialApp ist diese Komponente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Grundlegende Verwendung von Title", + "desc": [ + "【title】 : Name 【int】", + "【color】: Farbe 【Color】", + "【child】: Untergeordnete Komponente 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json new file mode 100644 index 00000000..4ffca745 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_en_US.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Application Title", + "info": "This component is used to describe the name of the app in the operating system, and the effect can be seen in the app bar list. The root of the title field effect in MaterialApp is this component.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Basic Usage of Title", + "desc": [ + "【title】: Name 【int】", + "【color】: Color 【Color】", + "【child】: Child Component 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json new file mode 100644 index 00000000..4804913b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_es_ES.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Título de la aplicación", + "info": "Este componente se utiliza para describir el nombre de la aplicación en el sistema operativo, y se puede ver el efecto en la lista de la barra de aplicaciones. El origen del efecto del campo title en MaterialApp es este componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso básico de Title", + "desc": [ + "【title】 : Nombre 【int】", + "【color】: Color 【Color】", + "【child】: Componente hijo 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json new file mode 100644 index 00000000..1507f62a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_fr_FR.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Titre de l'application", + "info": "Ce composant est utilisé pour décrire le nom de l'application dans le système d'exploitation, et son effet peut être vu dans la liste de la barre d'applications. La source de l'effet du champ title dans MaterialApp est ce composant.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Utilisation de base de Title", + "desc": [ + "【title】 : Nom 【int】", + "【color】: Couleur 【Color】", + "【child】: Composant enfant 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json new file mode 100644 index 00000000..a7c3efba --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_it_IT.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Titolo dell'applicazione", + "info": "Questo componente è utilizzato per descrivere il nome dell'app nel sistema operativo, e l'effetto può essere visto nella lista della barra delle applicazioni. L'origine dell'effetto del campo title in MaterialApp è questo componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso di base di Title", + "desc": [ + "【title】 : Nome 【int】", + "【color】: Colore 【Color】", + "【child】: Componente figlio 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json new file mode 100644 index 00000000..742a027d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ja_JP.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "アプリタイトル", + "info": "このコンポーネントは、アプリのオペレーティングシステムでの名前を記述するために使用され、アプリケーションバーのリストで効果を確認できます。MaterialAppのtitleフィールドの効果の根源はこのコンポーネントです。", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title基本使用", + "desc": [ + "【title】 : 名称 【int】", + "【color】: 色 【Color】", + "【child】: 子コンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json new file mode 100644 index 00000000..ce0edf1f --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ko_KR.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "앱 제목", + "info": "이 컴포넌트는 앱이 운영 체제에서의 이름을 설명하는 데 사용되며, 앱 바 목록에서 효과를 볼 수 있습니다. MaterialApp의 title 필드 효과의 근원은 이 컴포넌트입니다.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Title 기본 사용", + "desc": [ + "【title】 : 이름 【int】", + "【color】: 색상 【Color】", + "【child】: 자식 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json new file mode 100644 index 00000000..de353c50 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_pt_PT.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Título da Aplicação", + "info": "Este componente é usado para descrever o nome da aplicação no sistema operativo, e o efeito pode ser visto na lista da barra de aplicações. A origem do efeito do campo 'title' no MaterialApp é este componente.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Uso Básico do Title", + "desc": [ + "【title】 : Nome 【int】", + "【color】: Cor 【Color】", + "【child】: Componente Filho 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json new file mode 100644 index 00000000..56b3fb15 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Title/desc_ru_RU.json @@ -0,0 +1,20 @@ +{ + "id": 208, + "name": "Title", + "localName": "Заголовок приложения", + "info": "Этот компонент используется для описания имени приложения в операционной системе, эффект можно увидеть в списке приложений. Источником эффекта поля title в MaterialApp является этот компонент.", + "lever": 2, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное использование Title", + "desc": [ + "【title】 : Название 【int】", + "【color】: Цвет 【Color】", + "【child】: Дочерний компонент 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json new file mode 100644 index 00000000..0e621b8e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_de_DE.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Schaltflächengruppe umschalten", + "info": "Empfängt eine Liste von Komponenten und kann Eigenschaften wie Randlinie, abgerundete Ecken, Farbe usw. angeben. Basierend auf der spezifischen Logik kann es die Anforderungen für die Einzel- oder Mehrfachauswahl mehrerer Schaltflächen erfüllen.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons Einzelauswahl umschalten", + "desc": [ + "【children】: Untergeordnete Komponentensammlung 【List】", + "【borderWidth】: Randlinienbreite 【double】", + "【borderRadius】: Abgerundete Ecken 【BorderRadius】", + "【isSelected】: Auswahlstatus 【List】", + "【onPressed】: Klickereignis 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons Farbeigenschaften", + "desc": [ + "【borderColor】: Randlinienfarbe 【Color】", + "【selectedBorderColor】: Ausgewählte Randlinienfarbe 【Color】", + "【selectedColor】: Farbe der ausgewählten Komponente 【Color】", + "【fillColor】: Füllfarbe bei Auswahl 【Color】", + "【splashColor】: Wasserwellenfarbe 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons Mehrfachauswahl umschalten", + "desc": [ + "Kann die Logik der Zustandsänderung steuern, um unterschiedliche Effekte zu erzielen." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json new file mode 100644 index 00000000..75e2c4cd --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_en_US.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Toggle Buttons Group", + "info": "Receives a list of components, and can specify properties such as border, rounded corners, color, etc. According to specific logic, it can achieve the requirements of single or multiple selection of buttons.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons Single Selection", + "desc": [ + "【children】: Children components 【List】", + "【borderWidth】: Border width 【double】", + "【borderRadius】: Rounded corners 【BorderRadius】", + "【isSelected】: Selection status set 【List】", + "【onPressed】: Click event 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons Color Properties", + "desc": [ + "【borderColor】: Border color 【Color】", + "【selectedBorderColor】: Selected border color 【Color】", + "【selectedColor】: Component color when selected 【Color】", + "【fillColor】: Fill color when selected 【Color】", + "【splashColor】: Ripple color 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons Multiple Selection", + "desc": [ + "The logic of state transformation can be controlled to create different effects." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json new file mode 100644 index 00000000..17d5fb3c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_es_ES.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Grupo de botones de conmutación", + "info": "Recibe una lista de componentes y permite especificar propiedades como el borde, el radio de las esquinas, el color, etc. Según la lógica específica, se puede implementar la necesidad de selección única o múltiple de varios botones.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Conmutación única de ToggleButtons", + "desc": [ + "【children】: Conjunto de componentes hijos 【List】", + "【borderWidth】: Ancho del borde 【double】", + "【borderRadius】: Radio de las esquinas 【BorderRadius】", + "【isSelected】: Conjunto de selección 【List】", + "【onPressed】: Evento de clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Propiedades de color de ToggleButtons", + "desc": [ + "【borderColor】: Color del borde 【Color】", + "【selectedBorderColor】: Color del borde seleccionado 【Color】", + "【selectedColor】: Color del componente cuando está seleccionado 【Color】", + "【fillColor】: Color de relleno cuando está seleccionado 【Color】", + "【splashColor】: Color de la onda 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Conmutación múltiple de ToggleButtons", + "desc": [ + "Puede controlar la lógica de transformación de estado para crear diferentes efectos." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json new file mode 100644 index 00000000..1c28ef4d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_fr_FR.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Groupe de boutons de bascule", + "info": "Reçoit une liste de composants, peut spécifier des propriétés telles que la bordure, le rayon, la couleur, etc. Selon la logique spécifique, il peut répondre à la demande de sélection unique ou multiple de plusieurs boutons.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Basculement unique de ToggleButtons", + "desc": [ + "【children】: Ensemble de composants enfants 【List】", + "【borderWidth】: Largeur de la bordure 【double】", + "【borderRadius】: Rayon 【BorderRadius】", + "【isSelected】: Ensemble de sélection 【List】", + "【onPressed】: Événement de clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Propriétés de couleur de ToggleButtons", + "desc": [ + "【borderColor】: Couleur de la bordure 【Color】", + "【selectedBorderColor】: Couleur de la bordure sélectionnée 【Color】", + "【selectedColor】: Couleur du composant sélectionné 【Color】", + "【fillColor】: Couleur de remplissage sélectionnée 【Color】", + "【splashColor】: Couleur de l'effet de vague 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Basculement multiple de ToggleButtons", + "desc": [ + "Peut contrôler la logique de transformation d'état pour créer différents effets." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json new file mode 100644 index 00000000..8bed8122 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_it_IT.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Gruppo di pulsanti di commutazione", + "info": "Riceve un elenco di componenti e può specificare proprietà come bordi, angoli arrotondati, colori, ecc. In base alla logica specifica, è possibile implementare la selezione singola o multipla di più pulsanti.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons selezione singola", + "desc": [ + "【children】: Insieme di componenti figli 【List】", + "【borderWidth】: Larghezza del bordo 【double】", + "【borderRadius】: Angoli arrotondati 【BorderRadius】", + "【isSelected】: Insieme di selezione 【List】", + "【onPressed】: Evento di clic 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Proprietà del colore di ToggleButtons", + "desc": [ + "【borderColor】: Colore del bordo 【Color】", + "【selectedBorderColor】: Colore del bordo selezionato 【Color】", + "【selectedColor】: Colore del componente selezionato 【Color】", + "【fillColor】: Colore di riempimento selezionato 【Color】", + "【splashColor】: Colore dell'effetto ondulazione 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons selezione multipla", + "desc": [ + "È possibile controllare la logica di trasformazione dello stato per creare effetti diversi." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json new file mode 100644 index 00000000..084ac4a6 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ja_JP.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "トグルボタングループ", + "info": "コンポーネントリストを受け取り、境界線、角丸、色などの属性を指定できます。特定のロジックに基づいて、複数のボタンの単一選択または複数選択の要件を実現できます。", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons単一選択トグル", + "desc": [ + "【children】: 子コンポーネントセット 【List】", + "【borderWidth】: 境界線の幅 【double】", + "【borderRadius】: 角丸 【BorderRadius】", + "【isSelected】: 選択状態セット 【List】", + "【onPressed】: クリックイベント 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtonsカラープロパティ", + "desc": [ + "【borderColor】: 境界線の色 【Color】", + "【selectedBorderColor】: 選択時の境界線の色 【Color】", + "【selectedColor】: 選択時のコンポーネントの色 【Color】", + "【fillColor】: 選択時の塗りつぶし色 【Color】", + "【splashColor】: 波紋の色 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons複数選択トグル", + "desc": [ + "状態変換のロジックを制御して、異なる効果を生み出すことができます。" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json new file mode 100644 index 00000000..c424bb2d --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ko_KR.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "토글 버튼 그룹", + "info": "컴포넌트 리스트를 받아 테두리, 모서리 둥글기, 색상 등 속성을 지정할 수 있습니다. 특정 로직에 따라 여러 버튼의 단일 선택 또는 다중 선택 요구를 구현할 수 있습니다.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "ToggleButtons 단일 선택 토글", + "desc": [ + "【children】: 자식 컴포넌트 집합 【List】", + "【borderWidth】: 테두리 두께 【double】", + "【borderRadius】: 모서리 둥글기 【BorderRadius】", + "【isSelected】: 선택 여부 집합 【List】", + "【onPressed】: 클릭 이벤트 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "ToggleButtons 색상 속성", + "desc": [ + "【borderColor】: 테두리 색상 【Color】", + "【selectedBorderColor】: 선택된 테두리 색상 【Color】", + "【selectedColor】: 선택된 컴포넌트 색상 【Color】", + "【fillColor】: 선택된 채우기 색상 【Color】", + "【splashColor】: 물결 효과 색상 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "ToggleButtons 다중 선택 토글", + "desc": [ + "상태 변환 로직을 제어하여 다양한 효과를 만들 수 있습니다." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json new file mode 100644 index 00000000..507252ee --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_pt_PT.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Grupo de Botões de Alternância", + "info": "Recebe uma lista de componentes, pode especificar atributos como borda, raio, cor, etc. De acordo com a lógica específica, pode atender à necessidade de seleção única ou múltipla de vários botões.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Alternância Única de ToggleButtons", + "desc": [ + "【children】: Conjunto de componentes filhos 【List】", + "【borderWidth】: Largura da borda 【double】", + "【borderRadius】: Raio da borda 【BorderRadius】", + "【isSelected】: Conjunto de seleção 【List】", + "【onPressed】: Evento de clique 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Atributos de Cor de ToggleButtons", + "desc": [ + "【borderColor】: Cor da borda 【Color】", + "【selectedBorderColor】: Cor da borda selecionada 【Color】", + "【selectedColor】: Cor do componente quando selecionado 【Color】", + "【fillColor】: Cor de preenchimento quando selecionado 【Color】", + "【splashColor】: Cor do efeito de ondulação 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Alternância Múltipla de ToggleButtons", + "desc": [ + "Pode controlar a lógica de transformação de estado para criar diferentes efeitos." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json new file mode 100644 index 00000000..3534d10a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/ToggleButtons/desc_ru_RU.json @@ -0,0 +1,43 @@ +{ + "id": 33, + "name": "ToggleButtons", + "localName": "Группа переключателей", + "info": "Принимает список компонентов, можно указать свойства границы, радиуса, цвета и т.д. В зависимости от конкретной логики, можно реализовать требования для одного или нескольких кнопок.", + "lever": 4, + "family": 0, + "linkIds": [ + 332, + 262 + ], + "nodes": [ + { + "file": "node1_single.dart", + "name": "Одиночный переключатель ToggleButtons", + "desc": [ + "【children】: Набор дочерних компонентов 【List】", + "【borderWidth】: Ширина границы 【double】", + "【borderRadius】: Радиус угла 【BorderRadius】", + "【isSelected】: Набор выбранных 【List】", + "【onPressed】: Событие нажатия 【Function(int)】" + ] + }, + { + "file": "node2_color.dart", + "name": "Цветовые свойства ToggleButtons", + "desc": [ + "【borderColor】: Цвет границы 【Color】", + "【selectedBorderColor】: Цвет выбранной границы 【Color】", + "【selectedColor】: Цвет компонента при выборе 【Color】", + "【fillColor】: Цвет заполнения при выборе 【Color】", + "【splashColor】: Цвет водяного знака 【Color】" + ] + }, + { + "file": "node3_multi.dart", + "name": "Множественный переключатель ToggleButtons", + "desc": [ + "Можно управлять логикой преобразования состояния для создания различных эффектов." + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json new file mode 100644 index 00000000..42b7931b --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Anzeigekopf", + "info": "Eine allgemeine Anzeigestruktur, die von Flutter bereitgestellt wird. Komponenten können an entsprechenden Positionen eingefügt werden, um spezifische Einträge einfach zu handhaben. Wird häufig in Drawern verwendet.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Die grundlegende Darstellung dieser Komponente ist wie folgt", + "desc": [ + "【currentAccountPicture】: Obere Komponente 【Widget】", + "【accountName】: Mittlere Komponente 【Widget】", + "【accountEmail】: Untere Komponente 【Widget】", + "【decoration】: Dekoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Obere rechte Ecke und Unterseite", + "desc": [ + "【otherAccountsPictures】: Obere rechte Komponente 【List】", + "【onDetailsPressed】: Klickereignis in der unteren rechten Ecke 【Function()】", + "【arrowColor】: Farbe der Schaltfläche in der unteren rechten Ecke 【Color】", + "【margin】: Außenabstand 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json new file mode 100644 index 00000000..93b0d2be --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Display Header", + "info": "A common display structure provided by Flutter, where components can be inserted in corresponding positions, making it easy to handle specific items, commonly used in Drawers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "The basic performance of this component is as follows", + "desc": [ + "【currentAccountPicture】: Top component 【Widget】", + "【accountName】: Middle component 【Widget】", + "【accountEmail】: Bottom component 【Widget】", + "【decoration】: Decoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Top right corner and bottom", + "desc": [ + "【otherAccountsPictures】: Top right component 【List】", + "【onDetailsPressed】: Bottom right click event 【Function()】", + "【arrowColor】: Bottom right button color 【Color】", + "【margin】: Margin 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json new file mode 100644 index 00000000..5a180edc --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Encabezado de exhibición", + "info": "Una estructura de exhibición genérica proporcionada por Flutter, donde se pueden insertar componentes en las posiciones correspondientes, lo que permite manejar fácilmente elementos específicos, comúnmente utilizado en Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La presentación básica de este componente es la siguiente", + "desc": [ + "【currentAccountPicture】: componente superior 【Widget】", + "【accountName】: componente central 【Widget】", + "【accountEmail】: componente inferior 【Widget】", + "【decoration】: decoración 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Esquina superior derecha y parte inferior", + "desc": [ + "【otherAccountsPictures】: componente superior derecho 【List】", + "【onDetailsPressed】: evento de clic en la esquina inferior derecha 【Function()】", + "【arrowColor】: color del botón en la esquina inferior derecha 【Color】", + "【margin】: margen exterior 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json new file mode 100644 index 00000000..3382b735 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "En-tête d'affichage", + "info": "Une structure d'affichage générique fournie par Flutter, où des composants peuvent être insérés à des positions spécifiques, permettant de répondre facilement à des éléments spécifiques, souvent utilisé dans les Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La présentation de base de ce composant est la suivante", + "desc": [ + "【currentAccountPicture】: Composant supérieur 【Widget】", + "【accountName】: Composant central 【Widget】", + "【accountEmail】: Composant inférieur 【Widget】", + "【decoration】: Décoration 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Coin supérieur droit et bas", + "desc": [ + "【otherAccountsPictures】: Composant supérieur droit 【List】", + "【onDetailsPressed】: Événement de clic en bas à droite 【Function()】", + "【arrowColor】: Couleur du bouton en bas à droite 【Color】", + "【margin】: Marge extérieure 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json new file mode 100644 index 00000000..4f0b3b4c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Intestazione del cassetto degli account utente", + "info": "Una struttura di visualizzazione generica fornita da Flutter, in cui è possibile inserire componenti nelle posizioni corrispondenti, utile per gestire voci specifiche, comunemente utilizzata nei cassetti.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "La rappresentazione di base di questo componente è la seguente", + "desc": [ + "【currentAccountPicture】: componente superiore 【Widget】", + "【accountName】: componente centrale 【Widget】", + "【accountEmail】: componente inferiore 【Widget】", + "【decoration】: decorazione 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Angolo superiore destro e parte inferiore", + "desc": [ + "【otherAccountsPictures】: componente superiore destro 【List】", + "【onDetailsPressed】: evento di clic nell'angolo inferiore destro 【Function()】", + "【arrowColor】: colore del pulsante nell'angolo inferiore destro 【Color】", + "【margin】: margine esterno 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json new file mode 100644 index 00000000..fc71dfa3 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "ヘッダーを表示", + "info": "Flutterが提供する汎用的な表示構造で、対応する位置にコンポーネントを挿入でき、特定の項目に簡単に対応できます。Drawerでよく使用されます。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "このコンポーネントの基本的な表現は以下の通りです", + "desc": [ + "【currentAccountPicture】: 上部コンポーネント 【Widget】", + "【accountName】: 中部コンポーネント 【Widget】", + "【accountEmail】: 下部コンポーネント 【Widget】", + "【decoration】: 装飾 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "右上と下部", + "desc": [ + "【otherAccountsPictures】: 右上コンポーネント 【List】", + "【onDetailsPressed】: 右下クリックイベント 【Function()】", + "【arrowColor】: 右下ボタンの色 【Color】", + "【margin】: マージン 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json new file mode 100644 index 00000000..50fa9754 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "디스플레이 헤더", + "info": "Flutter에서 제공하는 일반적인 디스플레이 구조로, 해당 위치에 컴포넌트를 삽입할 수 있으며 특정 항목에 쉽게 대응할 수 있습니다. 주로 Drawer에서 사용됩니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "이 컴포넌트의 기본적인 표현은 다음과 같습니다", + "desc": [ + "【currentAccountPicture】: 상단 컴포넌트 【Widget】", + "【accountName】: 중간 컴포넌트 【Widget】", + "【accountEmail】: 하단 컴포넌트 【Widget】", + "【decoration】: 장식 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "오른쪽 상단과 하단", + "desc": [ + "【otherAccountsPictures】: 오른쪽 상단 컴포넌트 【List】", + "【onDetailsPressed】: 오른쪽 하단 클릭 이벤트 【Function()】", + "【arrowColor】: 오른쪽 하단 버튼 색상 【Color】", + "【margin】: 외부 여백 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json new file mode 100644 index 00000000..261f41ad --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Cabeçalho de Exibição", + "info": "Uma estrutura de exibição genérica fornecida pelo Flutter, onde componentes podem ser inseridos nas posições correspondentes, facilitando a adaptação a itens específicos, comumente usado em Drawers.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "A representação básica deste componente é a seguinte", + "desc": [ + "【currentAccountPicture】: Componente superior 【Widget】", + "【accountName】: Componente do meio 【Widget】", + "【accountEmail】: Componente inferior 【Widget】", + "【decoration】: Decoração 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Canto superior direito e inferior", + "desc": [ + "【otherAccountsPictures】: Componente superior direito 【List】", + "【onDetailsPressed】: Evento de clique no canto inferior direito 【Function()】", + "【arrowColor】: Cor do botão no canto inferior direito 【Color】", + "【margin】: Margem externa 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json new file mode 100644 index 00000000..f4512b44 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/UserAccountsDrawerHeader/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 22, + "name": "UserAccountsDrawerHeader", + "localName": "Заголовок отображения", + "info": "Универсальная структура отображения, предоставляемая Flutter, в которую можно вставлять компоненты в соответствующие места, что позволяет легко адаптироваться к конкретным элементам, часто используется в Drawer.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Основное представление компонента", + "desc": [ + "【currentAccountPicture】: Верхний компонент 【Widget】", + "【accountName】: Средний компонент 【Widget】", + "【accountEmail】: Нижний компонент 【Widget】", + "【decoration】: Декорация 【Decoration】" + ] + }, + { + "file": "node2_pro.dart", + "name": "Верхний правый угол и нижняя часть", + "desc": [ + "【otherAccountsPictures】: Верхний правый компонент 【List】", + "【onDetailsPressed】: Событие нажатия в нижнем правом углу 【Function()】", + "【arrowColor】: Цвет кнопки в нижнем правом углу 【Color】", + "【margin】: Внешний отступ 【EdgeInsetsGeometry】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json new file mode 100644 index 00000000..746f6a94 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_de_DE.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Vertikale Trennlinie", + "info": "Vertikale Trennlinie, kann Farbe, Breite, Dicke und Abstände oben und unten angeben, wird häufig als Trennlinie für Listenelemente verwendet.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider Farbe und Dicke", + "desc": [ + "【color】: Farbe 【Color】", + "【thickness】: Linienstärke 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider Breite und Abstand", + "desc": [ + "【indent】: Abstand vorne 【double】", + "【endIndent】: Abstand hinten 【double】", + "【width】: Platzhalterbreite 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json new file mode 100644 index 00000000..77b48689 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_en_US.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Vertical Divider", + "info": "Vertical divider, which can specify color, width, thickness, top and bottom margin information, commonly used as the divider between list items.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider Color and Thickness", + "desc": [ + "【color】: Color 【Color】", + "【thickness】: Line thickness 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider Width and Indent", + "desc": [ + "【indent】: Front indent length 【double】", + "【endIndent】: Back indent length 【double】", + "【width】: Placeholder width 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json new file mode 100644 index 00000000..d8fe8485 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_es_ES.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisor vertical", + "info": "Divisor vertical, se puede especificar el color, el ancho, el grosor, el margen superior e inferior, comúnmente utilizado como divisor de elementos en una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Color y grosor del VerticalDivider", + "desc": [ + "【color】: color 【Color】", + "【thickness】: grosor de la línea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Ancho y espacio del VerticalDivider", + "desc": [ + "【indent】: longitud del espacio frontal 【double】", + "【endIndent】: longitud del espacio posterior 【double】", + "【width】: ancho de ocupación 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json new file mode 100644 index 00000000..9ce751ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_fr_FR.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Ligne de séparation verticale", + "info": "Ligne de séparation verticale, peut spécifier la couleur, la largeur, l'épaisseur, les marges supérieure et inférieure, couramment utilisée pour les lignes de séparation des éléments de liste.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Couleur et épaisseur de VerticalDivider", + "desc": [ + "【color】: Couleur 【Color】", + "【thickness】: Épaisseur de la ligne 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Largeur et espacement de VerticalDivider", + "desc": [ + "【indent】: Longueur de l'espacement avant 【double】", + "【endIndent】: Longueur de l'espacement arrière 【double】", + "【width】: Largeur occupée 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json new file mode 100644 index 00000000..af0d6378 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_it_IT.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisore Verticale", + "info": "Divisore verticale, può specificare colore, larghezza, spessore, margini superiore e inferiore, comunemente usato come divisore per gli elementi di una lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Colore e Spessore del VerticalDivider", + "desc": [ + "【color】: Colore 【Color】", + "【thickness】: Spessore della linea 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Larghezza e Spaziature del VerticalDivider", + "desc": [ + "【indent】: Lunghezza dello spazio anteriore 【double】", + "【endIndent】: Lunghezza dello spazio posteriore 【double】", + "【width】: Larghezza occupata 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json new file mode 100644 index 00000000..e1d4653e --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ja_JP.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "垂直分割線", + "info": "垂直分割線、色、幅、太さ、上下の余白情報を指定でき、リストのアイテム分割線としてよく使われます。", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDividerの色と太さ", + "desc": [ + "【color】: 色 【Color】", + "【thickness】: 線の太さ 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDividerの幅と空白", + "desc": [ + "【indent】: 前の空白の長さ 【double】", + "【endIndent】: 後の空白の長さ 【double】", + "【width】: 占める幅 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json new file mode 100644 index 00000000..ad155b5a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ko_KR.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "수직 구분선", + "info": "수직 구분선, 색상, 너비, 두께, 상하 여백 정보를 지정할 수 있으며, 주로 리스트의 항목 구분선으로 사용됩니다.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "VerticalDivider 색상 및 두께", + "desc": [ + "【color】: 색상 【Color】", + "【thickness】: 선 두께 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "VerticalDivider 너비 및 여백", + "desc": [ + "【indent】: 앞쪽 여백 길이 【double】", + "【endIndent】: 뒤쪽 여백 길이 【double】", + "【width】: 차지하는 너비 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json new file mode 100644 index 00000000..dafc51e1 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_pt_PT.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Divisor Vertical", + "info": "Divisor vertical, pode especificar cor, largura, espessura, margens superior e inferior, comumente usado como divisor de itens de lista.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Cor e Espessura do VerticalDivider", + "desc": [ + "【color】: cor 【Color】", + "【thickness】: espessura da linha 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Largura e Espaço do VerticalDivider", + "desc": [ + "【indent】: comprimento do espaço frontal 【double】", + "【endIndent】: comprimento do espaço traseiro 【double】", + "【width】: largura ocupada 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json new file mode 100644 index 00000000..39c05222 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/VerticalDivider/desc_ru_RU.json @@ -0,0 +1,31 @@ +{ + "id": 35, + "name": "VerticalDivider", + "localName": "Вертикальный разделитель", + "info": "Вертикальный разделитель, можно указать цвет, ширину, толщину, отступы сверху и снизу, часто используется для разделения элементов списка.", + "lever": 2, + "family": 0, + "linkIds": [ + 34, + 329 + ], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Цвет и толщина VerticalDivider", + "desc": [ + "【color】: цвет 【Color】", + "【thickness】: толщина линии 【double】" + ] + }, + { + "file": "node2_height.dart", + "name": "Ширина и отступы VerticalDivider", + "desc": [ + "【indent】: длина отступа спереди 【double】", + "【endIndent】: длина отступа сзади 【double】", + "【width】: ширина занимаемого места 【double】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json new file mode 100644 index 00000000..d4836b21 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_de_DE.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Sichtbarkeitskomponente", + "info": "Steuert die Anzeige oder Ausblendung einer Komponente und ermöglicht die Festlegung eines Platzhalterkomponente nach dem Ausblenden. Eine ähnliche Funktion bietet die OffStage-Komponente.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Steuert die Sichtbarkeit der internen Unterkomponenten basierend auf visible", + "desc": [ + "【visible】 : Gibt an, ob angezeigt wird 【bool】", + "【child】: Kind 【Widget】", + "Standardmäßig geht der ursprüngliche Bereich verloren, wenn das Kind ausgeblendet wird." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement kann beim Ausblenden als Platzhalter verwendet werden", + "desc": [ + "【replacement】 : Platzhalterkomponente beim Ausblenden 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json new file mode 100644 index 00000000..857330ac --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_en_US.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Visibility Component", + "info": "Controls the display or hiding of a component, and can set a placeholder component when hidden. A similar function is provided by the OffStage component.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Control the visibility of internal child components based on visible", + "desc": [ + "【visible】: Whether to display 【bool】", + "【child】: Child 【Widget】", + "By default, the child will lose its original area when hidden." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement can be used as a placeholder when hidden", + "desc": [ + "【replacement】: Placeholder component when hidden 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json new file mode 100644 index 00000000..ace7d1b8 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_es_ES.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente de Visibilidad", + "info": "Controla si un componente se muestra o se oculta, y permite configurar un componente de marcador de posición cuando está oculto. Un componente similar en funcionalidad es el componente OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controla la visibilidad de los componentes hijos internos según visible", + "desc": [ + "【visible】 : Si se muestra o no 【bool】", + "【child】: Hijo 【Widget】", + "Por defecto, cuando el hijo está oculto, pierde el área original donde estaba." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement puede ocupar el lugar cuando está oculto", + "desc": [ + "【replacement】 : Componente de marcador de posición cuando está oculto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json new file mode 100644 index 00000000..c6f8bc0c --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_fr_FR.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Composant de visibilité", + "info": "Contrôle l'affichage ou la dissimulation d'un composant, peut définir un composant de remplacement lorsqu'il est caché. Le composant OffStage a une fonction similaire.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Contrôle l'affichage ou la dissimulation des composants enfants en fonction de visible", + "desc": [ + "【visible】 : Afficher ou non 【bool】", + "【child】: Enfant 【Widget】", + "Par défaut, l'enfant perd sa zone d'origine lorsqu'il est caché." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement peut être utilisé comme espace réservé lors de la dissimulation", + "desc": [ + "【replacement】 : Composant de remplacement lors de la dissimulation 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json new file mode 100644 index 00000000..5e05510a --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_it_IT.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente di Visibilità", + "info": "Controlla la visualizzazione o l'occultamento di un componente, con la possibilità di impostare un componente segnaposto quando è nascosto. Una funzionalità simile è offerta dal componente OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controlla la visibilità dei componenti figli interni in base a visible", + "desc": [ + "【visible】: Se visualizzare o meno 【bool】", + "【child】: Figlio 【Widget】", + "Per impostazione predefinita, quando il figlio è nascosto, perde l'area originale in cui si trovava." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement può essere utilizzato come segnaposto quando è nascosto", + "desc": [ + "【replacement】: Componente segnaposto quando è nascosto 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json new file mode 100644 index 00000000..9a43e083 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ja_JP.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "表示/非表示コンポーネント", + "info": "コンポーネントの表示または非表示を制御し、非表示時のプレースホルダーコンポーネントを設定できます。類似の機能を持つコンポーネントとしてOffStageコンポーネントがあります。", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "visibleに基づいて内部の子コンポーネントの表示/非表示を制御", + "desc": [ + "【visible】 : 表示するかどうか 【bool】", + "【child】: 子コンポーネント 【Widget】", + "デフォルトでは、子コンポーネントが非表示になると元の領域を失います。" + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacementを使用して非表示時のプレースホルダーを設定", + "desc": [ + "【replacement】 : 非表示時のプレースホルダーコンポーネント 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json new file mode 100644 index 00000000..4cac94c9 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ko_KR.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "표시/숨김 컴포넌트", + "info": "컴포넌트의 표시 또는 숨김을 제어하며, 숨김 후의 자리 표시 컴포넌트를 설정할 수 있습니다. 이와 유사한 기능을 가진 OffStage 컴포넌트가 있습니다.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "visible에 따라 내부 자식 컴포넌트의 표시/숨김 상태를 제어", + "desc": [ + "【visible】 : 표시 여부 【bool】", + "【child】: 자식 【Widget】", + "기본적으로 자식이 숨겨지면 원래 영역을 잃습니다." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement는 숨김 시 자리 표시를 할 수 있습니다", + "desc": [ + "【replacement】 : 숨김 시의 자리 표시 컴포넌트 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json new file mode 100644 index 00000000..18e4cbaf --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_pt_PT.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Componente de Visibilidade", + "info": "Controla a exibição ou ocultação de um componente, podendo definir um componente de espaço reservado após a ocultação. Um componente com funcionalidade semelhante é o OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Controla a visibilidade dos componentes internos com base no visível", + "desc": [ + "【visible】 : Se deve ser exibido 【bool】", + "【child】: Filho 【Widget】", + "Por padrão, o filho perde a área original quando oculto." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement pode ser usado como espaço reservado ao ocultar", + "desc": [ + "【replacement】 : Componente de espaço reservado ao ocultar 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json new file mode 100644 index 00000000..52e8b516 --- /dev/null +++ b/modules/widget_system/widgets/lib/StatelessWidget/Visibility/desc_ru_RU.json @@ -0,0 +1,27 @@ +{ + "id": 10, + "name": "Visibility", + "localName": "Компонент видимости", + "info": "Управляет отображением или скрытием компонента, можно установить компонент-заполнитель при скрытии. Похожую функциональность имеет компонент OffStage.", + "lever": 3, + "family": 0, + "linkIds": [], + "nodes": [ + { + "file": "node1_base.dart", + "name": "Управление видимостью внутренних дочерних компонентов с помощью visible", + "desc": [ + "【visible】 : Отображать ли 【bool】", + "【child】: Дочерний элемент 【Widget】", + "По умолчанию при скрытии дочернего элемента он теряет свою исходную область." + ] + }, + { + "file": "node2_replacement.dart", + "name": "replacement может использоваться для заполнения при скрытии", + "desc": [ + "【replacement】 : Компонент-заполнитель при скрытии 【Widget】" + ] + } + ] +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 00840c14..768b46b2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.3.0" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev/" + source: hosted + version: "1.4.0" clock: dependency: transitive description: @@ -113,6 +121,14 @@ packages: url: "https://pub.dev/" source: hosted version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev/" + source: hosted + version: "1.0.2" cupertino_icons: dependency: "direct main" description: @@ -121,6 +137,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.0.8" + dart_quill_delta: + dependency: transitive + description: + name: dart_quill_delta + sha256: bddb0b2948bd5b5a328f1651764486d162c59a8ccffd4c63e8b2c5e44be1dac4 + url: "https://pub.dev/" + source: hosted + version: "10.8.3" dash_painter: dependency: "direct main" description: @@ -145,6 +169,14 @@ packages: url: "https://pub.dev/" source: hosted version: "1.1.1+7" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev/" + source: hosted + version: "0.4.1" dio: dependency: "direct main" description: @@ -201,6 +233,30 @@ packages: url: "https://pub.dev/" source: hosted version: "8.1.7" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev/" + source: hosted + version: "0.9.3+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev/" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" + url: "https://pub.dev/" + source: hosted + version: "0.9.3+3" fixnum: dependency: transitive description: @@ -222,6 +278,54 @@ packages: url: "https://pub.dev/" source: hosted version: "8.1.6" + flutter_colorpicker: + dependency: transitive + description: + name: flutter_colorpicker + sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" + url: "https://pub.dev/" + source: hosted + version: "1.1.0" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev/" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev/" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev/" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_temp_fork: + dependency: transitive + description: + name: flutter_keyboard_visibility_temp_fork + sha256: cecc44a350a8a369efbc960bb2126386af53cb0597ca6789607cbfb88081b9f4 + url: "https://pub.dev/" + source: hosted + version: "0.1.4" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev/" + source: hosted + version: "1.0.0" flutter_lints: dependency: "direct dev" description: @@ -251,6 +355,22 @@ packages: url: "https://pub.dev/" source: hosted version: "2.0.24" + flutter_quill: + dependency: transitive + description: + name: flutter_quill + sha256: "0acca7cf646eb2feba5333338d046514c17159741ab5744c7c4290778656fa4a" + url: "https://pub.dev/" + source: hosted + version: "11.0.0-dev.21" + flutter_quill_delta_from_html: + dependency: transitive + description: + name: flutter_quill_delta_from_html + sha256: "79405765612016de9de2361be86383360b0b43a6bf88b818c079a953583f1849" + url: "https://pub.dev/" + source: hosted + version: "1.5.0" flutter_spinkit: dependency: "direct main" description: @@ -341,6 +461,14 @@ packages: url: "https://pub.dev/" source: hosted version: "14.6.3" + html: + dependency: transitive + description: + name: html + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + url: "https://pub.dev/" + source: hosted + version: "0.15.5" http: dependency: transitive description: @@ -693,6 +821,78 @@ packages: url: "https://pub.dev/" source: hosted version: "2.1.5" + quill_native_bridge: + dependency: transitive + description: + name: quill_native_bridge + sha256: bda0f0ad9bc160dcdd4bd2b378a7ae8bdb55c3d4b7301bf739d5e3b065ee5e82 + url: "https://pub.dev/" + source: hosted + version: "11.0.0" + quill_native_bridge_android: + dependency: transitive + description: + name: quill_native_bridge_android + sha256: b75c7e6ede362a7007f545118e756b1f19053994144ec9eda932ce5e54a57569 + url: "https://pub.dev/" + source: hosted + version: "0.0.1+2" + quill_native_bridge_ios: + dependency: transitive + description: + name: quill_native_bridge_ios + sha256: d23de3cd7724d482fe2b514617f8eedc8f296e120fb297368917ac3b59d8099f + url: "https://pub.dev/" + source: hosted + version: "0.0.1" + quill_native_bridge_linux: + dependency: transitive + description: + name: quill_native_bridge_linux + sha256: "5fcc60cab2ab9079e0746941f05c5ca5fec85cc050b738c8c8b9da7c09da17eb" + url: "https://pub.dev/" + source: hosted + version: "0.0.1" + quill_native_bridge_macos: + dependency: transitive + description: + name: quill_native_bridge_macos + sha256: "1c0631bd1e2eee765a8b06017c5286a4e829778f4585736e048eb67c97af8a77" + url: "https://pub.dev/" + source: hosted + version: "0.0.1" + quill_native_bridge_platform_interface: + dependency: transitive + description: + name: quill_native_bridge_platform_interface + sha256: ea48bd12bf426741747ec8a575b122350971f338a75049099b349c63447582a2 + url: "https://pub.dev/" + source: hosted + version: "0.0.1+1" + quill_native_bridge_web: + dependency: transitive + description: + name: quill_native_bridge_web + sha256: e7e55047d68f1a88574c26dbe3f12988f49d07740590d8fc6280028bbde5b908 + url: "https://pub.dev/" + source: hosted + version: "0.0.1" + quill_native_bridge_windows: + dependency: transitive + description: + name: quill_native_bridge_windows + sha256: "60e50d74238f22ceb43113d9a42b6627451dab9fc27f527b979a32051cf1da45" + url: "https://pub.dev/" + source: hosted + version: "0.0.1" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev/" + source: hosted + version: "3.2.2" r_upgrade: dependency: transitive description: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 6ce2ee62..7bc0d57c 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include #include @@ -15,6 +16,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 710ab798..18cfe7e6 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST connectivity_plus + file_selector_windows screen_retriever_windows share_plus url_launcher_windows From 6eddeecb33a9b8b93863a31c762d6b9f6a3990af Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 12 Feb 2025 09:38:08 +0800 Subject: [PATCH 132/149] feature:locale*10 --- assets/flutter.db | Bin 1548288 -> 3702784 bytes assets/images/widgets/GridView.svg | 70 +++++------------ lib/src/flutter_unit.dart | 50 ++++++------ lib/src/l10n/arb/app_de.arb | 12 +++ lib/src/l10n/arb/app_es.arb | 12 +++ lib/src/l10n/arb/app_fr.arb | 12 +++ lib/src/l10n/arb/app_it.arb | 12 +++ lib/src/l10n/arb/app_ja.arb | 12 +++ lib/src/l10n/arb/app_ko.arb | 12 +++ lib/src/l10n/arb/app_pt.arb | 12 +++ lib/src/l10n/arb/app_ru.arb | 12 +++ lib/src/l10n/gen/app_l10n.dart | 26 ++++++- lib/src/l10n/gen/app_l10n_de.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_es.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_fr.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_it.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_ja.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_ko.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_pt.dart | 38 ++++++++++ lib/src/l10n/gen/app_l10n_ru.dart | 38 ++++++++++ lib/src/navigation/model/app_tab.dart | 2 +- .../desktop/flutter_unit_desk_navigation.dart | 2 +- .../view/desktop/locale_change_menu.dart | 71 ++++++++++++++++++ .../view/desktop/menu_bar_tail.dart | 3 + .../view/desktop/toly_unit_menu_cell.dart | 20 +++-- .../view/mobile/unit_navigation.dart | 33 ++++---- .../basic_system/l10n/lib/enum/language.dart | 11 ++- .../widget_detail_bloc.dart | 15 +++- .../lib/blocs/widgets_bloc/widgets_bloc.dart | 10 ++- .../lib/blocs/widgets_bloc/widgets_event.dart | 3 +- .../widget_detail/widget_detail_page.dart | 27 +++++-- .../widget_panel/desk_widget_model_item.dart | 13 ++-- .../lib/src/database/dao/node_dao.dart | 22 ++++-- .../lib/src/database/dao/widget_dao.dart | 35 +++++++-- .../database/db_impl/node_db_repository.dart | 4 +- .../db_impl/widget_db_repository.dart | 7 +- .../src/memory/memory_node_repository.dart | 2 +- .../lib/src/model/widget_filter.dart | 5 ++ .../lib/src/repository/node_repository.dart | 2 +- 39 files changed, 698 insertions(+), 135 deletions(-) create mode 100644 lib/src/l10n/arb/app_de.arb create mode 100644 lib/src/l10n/arb/app_es.arb create mode 100644 lib/src/l10n/arb/app_fr.arb create mode 100644 lib/src/l10n/arb/app_it.arb create mode 100644 lib/src/l10n/arb/app_ja.arb create mode 100644 lib/src/l10n/arb/app_ko.arb create mode 100644 lib/src/l10n/arb/app_pt.arb create mode 100644 lib/src/l10n/arb/app_ru.arb create mode 100644 lib/src/l10n/gen/app_l10n_de.dart create mode 100644 lib/src/l10n/gen/app_l10n_es.dart create mode 100644 lib/src/l10n/gen/app_l10n_fr.dart create mode 100644 lib/src/l10n/gen/app_l10n_it.dart create mode 100644 lib/src/l10n/gen/app_l10n_ja.dart create mode 100644 lib/src/l10n/gen/app_l10n_ko.dart create mode 100644 lib/src/l10n/gen/app_l10n_pt.dart create mode 100644 lib/src/l10n/gen/app_l10n_ru.dart create mode 100644 lib/src/navigation/view/desktop/locale_change_menu.dart diff --git a/assets/flutter.db b/assets/flutter.db index 2cdf63a5a86b6a84d2f547128d49023193fa0be7..b09da0bccec3be6cfabc41e40243f6864f74face 100644 GIT binary patch literal 3702784 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%0AnJoY%xwz{*Ao(PhL(##syXP*xUqHgK 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